summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore14
-rwxr-xr-xbin/createpackage.pl29
-rwxr-xr-xbin/elf2e32_qtwrapper.pl46
-rwxr-xr-xbin/patch_capabilities.pl229
-rw-r--r--config.profiles/symbian/bld.inf87
-rw-r--r--config.profiles/symbian/confml/qt.confml16
-rw-r--r--config.profiles/symbian/data_caging_paths.prf71
-rw-r--r--config.profiles/symbian/environment.prf9
-rw-r--r--config.profiles/symbian/headerexport1138
-rw-r--r--config.profiles/symbian/implml/qt_copy.implml10
-rw-r--r--config.profiles/symbian/layers.sysdef.xml41
-rw-r--r--config.profiles/symbian/loc.prf25
-rw-r--r--config.profiles/symbian/non_foundation_paths.prf115
-rw-r--r--config.profiles/symbian/package_definition.xml54
-rw-r--r--config.profiles/symbian/package_map.xml1
-rw-r--r--config.profiles/symbian/platform_paths.prf251
-rw-r--r--config.profiles/symbian/qt.conf6
-rw-r--r--config.profiles/symbian/qt.iby118
-rw-r--r--config.profiles/symbian/qtconfig.flm88
-rw-r--r--config.profiles/symbian/qtconfig.xml17
-rw-r--r--config.profiles/symbian/sysdef_1_5_1.dtd88
-rw-r--r--config.profiles/symbian/translations/qt_ar.ts7821
-rw-r--r--config.profiles/symbian/translations/qt_fa.ts8507
-rw-r--r--config.profiles/symbian/translations/qt_fr_symbian.ts8519
-rw-r--r--config.profiles/symbian/translations/qt_he.ts7781
-rw-r--r--config.profiles/symbian/translations/qt_pl_symbian.ts8525
-rw-r--r--config.profiles/symbian/translations/qt_ru_symbian.ts8522
-rw-r--r--config.profiles/symbian/translations/qt_ur.ts8507
-rw-r--r--config.profiles/symbian/translations/qt_zh_cn_symbian.ts8517
-rw-r--r--config.profiles/symbian/translations/qt_zh_tw_symbian.ts8505
-rw-r--r--config.profiles/symbian/translations_symbian/translations.pro16
-rwxr-xr-xconfigure78
-rwxr-xr-xconfigure.exebin1325568 -> 1325568 bytes
-rw-r--r--demos/declarative/minehunt/minehunt.pro2
-rw-r--r--demos/textedit/textedit.cpp6
-rw-r--r--doc/src/declarative/anchor-layout.qdoc66
-rw-r--r--doc/src/declarative/basictypes.qdoc99
-rw-r--r--doc/src/declarative/codingconventions.qdoc18
-rw-r--r--doc/src/declarative/declarativeui.qdoc6
-rw-r--r--doc/src/declarative/dynamicobjects.qdoc3
-rw-r--r--doc/src/declarative/extending-tutorial.qdoc4
-rw-r--r--doc/src/declarative/extending.qdoc627
-rw-r--r--doc/src/declarative/focus.qdoc339
-rw-r--r--doc/src/declarative/javascriptblocks.qdoc53
-rw-r--r--doc/src/declarative/modules.qdoc66
-rw-r--r--doc/src/declarative/pics/qml-extending-types.pngbin0 -> 738 bytes
-rw-r--r--doc/src/declarative/qdeclarativeintro.qdoc6
-rw-r--r--doc/src/declarative/qdeclarativereference.qdoc81
-rw-r--r--doc/src/declarative/qmlinuse.qdoc10
-rw-r--r--doc/src/declarative/qtbinding.qdoc36
-rw-r--r--doc/src/declarative/qtdeclarative.qdoc16
-rw-r--r--doc/src/declarative/tutorial.qdoc4
-rw-r--r--doc/src/development/qtestlib.qdoc29
-rw-r--r--doc/src/examples/diagramscene.qdoc2
-rw-r--r--doc/src/examples/multicastreceiver.qdoc10
-rw-r--r--doc/src/examples/multicastsender.qdoc10
-rw-r--r--doc/src/examples/qml-examples.qdoc3
-rw-r--r--doc/src/examples/wheel.qdoc109
-rw-r--r--doc/src/external-resources.qdoc5
-rw-r--r--doc/src/frameworks-technologies/threads.qdoc20
-rw-r--r--doc/src/getting-started/gettingstartedqml.qdoc2
-rw-r--r--doc/src/getting-started/installation.qdoc2
-rw-r--r--doc/src/images/declarative-qmlfocus1.pngbin0 -> 1890 bytes
-rw-r--r--doc/src/images/declarative-qmlfocus2.pngbin0 -> 2756 bytes
-rw-r--r--doc/src/images/declarative-qmlfocus3.pngbin0 -> 2743 bytes
-rw-r--r--doc/src/images/declarative-qmlfocus4.pngbin0 -> 4137 bytes
-rw-r--r--doc/src/images/declarative-qmlfocus5.pngbin0 -> 1376 bytes
-rw-r--r--doc/src/legal/3rdparty.qdoc81
-rw-r--r--doc/src/network-programming/bearermanagement.qdoc8
-rw-r--r--doc/src/platforms/emb-envvars.qdoc2
-rw-r--r--doc/src/platforms/platform-notes.qdoc16
-rw-r--r--doc/src/platforms/symbian-introduction.qdoc10
-rw-r--r--doc/src/qt-webpages.qdoc15
-rw-r--r--doc/src/qt4-intro.qdoc62
-rw-r--r--doc/src/snippets/declarative/codingconventions/private.qml49
-rw-r--r--doc/src/snippets/declarative/comments.qml1
-rw-r--r--doc/src/snippets/declarative/focus/advancedFocus.qml67
-rw-r--r--doc/src/snippets/declarative/focus/basicwidget.qml59
-rw-r--r--doc/src/snippets/declarative/focus/clickablewidget.qml61
-rw-r--r--doc/src/snippets/declarative/focus/focusColumn.qml64
-rw-r--r--doc/src/snippets/declarative/focus/focusscopewidget.qml61
-rw-r--r--doc/src/snippets/declarative/focus/myclickablewidget.qml69
-rw-r--r--doc/src/snippets/declarative/focus/myfocusscopewidget.qml66
-rw-r--r--doc/src/snippets/declarative/focus/mywidget.qml58
-rw-r--r--doc/src/snippets/declarative/focus/qmldir4
-rw-r--r--doc/src/snippets/declarative/focus/rectangle.qml62
-rw-r--r--doc/src/snippets/declarative/focus/widget.qml61
-rw-r--r--doc/src/snippets/declarative/gridview/gridview.qml26
-rw-r--r--doc/src/snippets/declarative/integrating-javascript/connectjs.qml57
-rw-r--r--doc/src/snippets/declarative/integrating-javascript/includejs/app.qml56
-rw-r--r--doc/src/snippets/declarative/integrating-javascript/includejs/factorial.js49
-rw-r--r--doc/src/snippets/declarative/integrating-javascript/includejs/script.js48
-rw-r--r--doc/src/snippets/declarative/integrating-javascript/script.js47
-rw-r--r--doc/src/snippets/declarative/keynavigation.qml84
-rw-r--r--doc/src/snippets/declarative/listview/listview.qml14
-rw-r--r--doc/src/snippets/declarative/pathview/pathattributes.qml4
-rw-r--r--doc/src/snippets/declarative/pathview/pathview.qml14
-rw-r--r--doc/src/snippets/declarative/qml-extending-types/components/Button.qml53
-rw-r--r--doc/src/snippets/declarative/qml-extending-types/components/application.qml49
-rw-r--r--doc/src/snippets/declarative/qml-extending-types/methods/app.qml55
-rw-r--r--doc/src/snippets/declarative/qml-extending-types/properties/ImageViewer.qml52
-rw-r--r--doc/src/snippets/declarative/qml-extending-types/properties/alias-override.qml48
-rw-r--r--doc/src/snippets/declarative/qml-extending-types/properties/alias.qml51
-rw-r--r--doc/src/snippets/declarative/qml-extending-types/properties/alias/ImageViewer.qml52
-rw-r--r--doc/src/snippets/declarative/qml-extending-types/properties/alias/application.qml54
-rw-r--r--doc/src/snippets/declarative/qml-extending-types/properties/application.qml50
-rw-r--r--doc/src/snippets/declarative/qml-extending-types/properties/property-signals.qml49
-rw-r--r--doc/src/snippets/declarative/qml-extending-types/signals/Button.qml55
-rw-r--r--doc/src/snippets/declarative/qml-extending-types/signals/basic.qml55
-rw-r--r--doc/src/snippets/declarative/qml-extending-types/signals/connectdynamic.qml61
-rw-r--r--doc/src/snippets/declarative/qml-extending-types/signals/connectslots.qml56
-rw-r--r--doc/src/snippets/declarative/qml-extending-types/signals/no-parameters.qml49
-rw-r--r--doc/src/snippets/declarative/qml-extending-types/signals/parameters.qml50
-rw-r--r--doc/src/snippets/declarative/qtbinding/newelements/imageviewer.h2
-rw-r--r--doc/src/snippets/declarative/qtbinding/variantlistmap/MyItem.qml54
-rw-r--r--doc/src/snippets/declarative/qtbinding/variantlistmap/main.cpp67
-rw-r--r--doc/src/snippets/declarative/qtbinding/variantlistmap/variantlistmap.pro2
-rw-r--r--doc/src/widgets-and-layouts/gallery-cde.qdoc427
-rw-r--r--doc/src/widgets-and-layouts/gallery-cleanlooks.qdoc432
-rw-r--r--doc/src/widgets-and-layouts/gallery-gtk.qdoc436
-rw-r--r--doc/src/widgets-and-layouts/gallery-macintosh.qdoc432
-rw-r--r--doc/src/widgets-and-layouts/gallery-motif.qdoc432
-rw-r--r--doc/src/widgets-and-layouts/gallery-plastique.qdoc432
-rw-r--r--doc/src/widgets-and-layouts/gallery-windows.qdoc432
-rw-r--r--doc/src/widgets-and-layouts/gallery-windowsvista.qdoc432
-rw-r--r--doc/src/widgets-and-layouts/gallery-windowsxp.qdoc432
-rw-r--r--doc/src/widgets-and-layouts/gallery.qdoc112
-rw-r--r--examples/declarative/cppextensions/imageprovider/imageprovider.pro2
-rw-r--r--examples/declarative/cppextensions/qwidgets/qwidgets.pro2
-rw-r--r--examples/declarative/modelviews/visualitemmodel/visualitemmodel.qml7
-rw-r--r--examples/declarative/ui-components/tabwidget/TabWidget.qml4
-rw-r--r--examples/examples.pro1
-rw-r--r--examples/network/bearermonitor/bearermonitor.cpp2
-rw-r--r--examples/script/customclass/main.cpp2
-rw-r--r--examples/script/helloscript/main.cpp3
-rw-r--r--examples/scroller/graphicsview/graphicsview.pro8
-rw-r--r--examples/scroller/graphicsview/main.cpp292
-rw-r--r--examples/scroller/plot/main.cpp223
-rw-r--r--examples/scroller/plot/plot.pro18
-rw-r--r--examples/scroller/plot/plotwidget.cpp205
-rw-r--r--examples/scroller/plot/plotwidget.h89
-rw-r--r--examples/scroller/plot/settingswidget.cpp690
-rw-r--r--examples/scroller/plot/settingswidget.h109
-rw-r--r--examples/scroller/scroller.pro11
-rw-r--r--examples/scroller/wheel/main.cpp119
-rw-r--r--examples/scroller/wheel/wheel.pro16
-rw-r--r--examples/scroller/wheel/wheelwidget.cpp276
-rw-r--r--examples/scroller/wheel/wheelwidget.h104
-rw-r--r--examples/tools/echoplugin/echowindow/echowindow.pro4
-rw-r--r--examples/tools/styleplugin/plugin/plugin.pro4
-rw-r--r--mkspecs/common/symbian/symbian.conf18
-rw-r--r--mkspecs/cygwin-g++/qmake.conf3
-rw-r--r--mkspecs/features/qt_functions.prf15
-rw-r--r--mkspecs/features/symbian/default_post.prf38
-rw-r--r--mkspecs/features/symbian/localize_deployment.prf29
-rw-r--r--mkspecs/features/symbian/prepend_includepath.prf14
-rw-r--r--mkspecs/features/symbian/qt.prf47
-rw-r--r--mkspecs/features/symbian/sis_targets.prf84
-rw-r--r--mkspecs/linux-icc/qmake.conf2
-rw-r--r--mkspecs/win32-msvc2005/qmake.conf6
-rw-r--r--mkspecs/win32-msvc2008/qmake.conf6
-rw-r--r--mkspecs/win32-msvc2010/qmake.conf6
-rw-r--r--qmake/Makefile.unix32
-rw-r--r--qmake/Makefile.win326
-rw-r--r--qmake/Makefile.win32-g++24
-rw-r--r--qmake/Makefile.win32-g++-sh24
-rw-r--r--qmake/generators/symbian/symbiancommon.cpp6
-rw-r--r--qmake/generators/symbian/symmake_sbsv2.cpp1
-rw-r--r--qmake/generators/win32/msbuild_objectmodel.cpp32
-rw-r--r--qmake/project.cpp9
-rw-r--r--qmake/qmake.pri10
-rw-r--r--src/3rdparty/phonon/ds9/videorenderer_evr.cpp12
-rw-r--r--src/3rdparty/phonon/mmf/abstractaudioeffect.h2
-rw-r--r--src/3rdparty/phonon/mmf/audioequalizer.cpp2
-rw-r--r--src/3rdparty/phonon/mmf/bassboost.cpp2
-rw-r--r--src/3rdparty/phonon/mmf/environmentalreverb.cpp2
-rw-r--r--src/3rdparty/phonon/mmf/loudness.cpp2
-rw-r--r--src/3rdparty/phonon/mmf/stereowidening.cpp2
-rw-r--r--src/3rdparty/phonon/phonon/effectwidget.cpp2
-rw-r--r--src/3rdparty/phonon/phonon/globalconfig.cpp2
-rw-r--r--src/3rdparty/phonon/phonon/mediacontroller.cpp4
-rw-r--r--src/3rdparty/phonon/phonon/pulsesupport.cpp146
-rw-r--r--src/corelib/global/qendian.h5
-rw-r--r--src/corelib/io/io.pri27
-rw-r--r--src/corelib/io/qabstractfileengine.cpp85
-rw-r--r--src/corelib/io/qabstractfileengine_p.h2
-rw-r--r--src/corelib/io/qdatastream.cpp59
-rw-r--r--src/corelib/io/qdatastream.h3
-rw-r--r--src/corelib/io/qdir.cpp388
-rw-r--r--src/corelib/io/qdir_p.h98
-rw-r--r--src/corelib/io/qdiriterator.cpp150
-rw-r--r--src/corelib/io/qfile.cpp22
-rw-r--r--src/corelib/io/qfileinfo.cpp234
-rw-r--r--src/corelib/io/qfileinfo.h4
-rw-r--r--src/corelib/io/qfileinfo_p.h31
-rw-r--r--src/corelib/io/qfilesystemengine.cpp385
-rw-r--r--src/corelib/io/qfilesystemengine_mac.cpp48
-rw-r--r--src/corelib/io/qfilesystemengine_p.h133
-rw-r--r--src/corelib/io/qfilesystemengine_symbian.cpp408
-rw-r--r--src/corelib/io/qfilesystemengine_unix.cpp655
-rw-r--r--src/corelib/io/qfilesystemengine_win.cpp1218
-rw-r--r--src/corelib/io/qfilesystementry.cpp383
-rw-r--r--src/corelib/io/qfilesystementry_p.h126
-rw-r--r--src/corelib/io/qfilesystemiterator_p.h115
-rw-r--r--src/corelib/io/qfilesystemiterator_symbian.cpp129
-rw-r--r--src/corelib/io/qfilesystemiterator_unix.cpp113
-rw-r--r--src/corelib/io/qfilesystemiterator_win.cpp148
-rw-r--r--src/corelib/io/qfilesystemmetadata_p.h400
-rw-r--r--src/corelib/io/qfsfileengine.cpp181
-rw-r--r--src/corelib/io/qfsfileengine_iterator.cpp33
-rw-r--r--src/corelib/io/qfsfileengine_iterator_p.h13
-rw-r--r--src/corelib/io/qfsfileengine_iterator_unix.cpp140
-rw-r--r--src/corelib/io/qfsfileengine_iterator_win.cpp161
-rw-r--r--src/corelib/io/qfsfileengine_p.h60
-rw-r--r--src/corelib/io/qfsfileengine_unix.cpp1127
-rw-r--r--src/corelib/io/qfsfileengine_win.cpp1314
-rw-r--r--src/corelib/io/qprocess_symbian.cpp1
-rw-r--r--src/corelib/io/qprocess_unix.cpp30
-rw-r--r--src/corelib/io/qresource.cpp2
-rw-r--r--src/corelib/io/qtemporaryfile.cpp22
-rw-r--r--src/corelib/io/qtextstream.cpp48
-rw-r--r--src/corelib/io/qtextstream.h3
-rw-r--r--src/corelib/kernel/kernel.pri118
-rw-r--r--src/corelib/kernel/qabstracteventdispatcher.cpp52
-rw-r--r--src/corelib/kernel/qcoreapplication.cpp25
-rw-r--r--src/corelib/kernel/qcoreapplication.h1
-rw-r--r--src/corelib/kernel/qcoreapplication_p.h2
-rw-r--r--src/corelib/kernel/qcoreevent.cpp2
-rw-r--r--src/corelib/kernel/qcoreevent.h3
-rw-r--r--src/corelib/kernel/qeventdispatcher_unix.cpp1
-rw-r--r--src/corelib/kernel/qeventdispatcher_win.cpp2
-rw-r--r--src/corelib/kernel/qobject.cpp2
-rw-r--r--src/corelib/kernel/qsystemerror.cpp220
-rw-r--r--src/corelib/kernel/qsystemerror_p.h107
-rw-r--r--src/corelib/thread/qmutex.cpp107
-rw-r--r--src/corelib/thread/qmutex_p.h14
-rw-r--r--src/corelib/thread/qmutex_unix.cpp91
-rw-r--r--src/corelib/thread/qmutex_win.cpp10
-rw-r--r--src/corelib/tools/qalgorithms.qdoc2
-rw-r--r--src/corelib/tools/qdatetime.cpp35
-rw-r--r--src/corelib/tools/qdatetime_p.h6
-rw-r--r--src/corelib/tools/qelapsedtimer.h1
-rw-r--r--src/corelib/tools/qelapsedtimer_generic.cpp16
-rw-r--r--src/corelib/tools/qelapsedtimer_mac.cpp6
-rw-r--r--src/corelib/tools/qelapsedtimer_symbian.cpp22
-rw-r--r--src/corelib/tools/qelapsedtimer_unix.cpp11
-rw-r--r--src/corelib/tools/qelapsedtimer_win.cpp20
-rw-r--r--src/corelib/tools/qlocale.cpp2
-rw-r--r--src/corelib/tools/qpoint.cpp63
-rw-r--r--src/corelib/tools/qpoint.h38
-rw-r--r--src/corelib/tools/qsimd.cpp14
-rw-r--r--src/corelib/xml/qxmlstream.cpp76
-rw-r--r--src/corelib/xml/qxmlstream.h2
-rw-r--r--src/dbus/qdbusconnection_p.h13
-rw-r--r--src/dbus/qdbusintegrator.cpp35
-rw-r--r--src/declarative/debugger/qdeclarativedebugservice.cpp8
-rw-r--r--src/declarative/declarative.pro6
-rw-r--r--src/declarative/graphicsitems/qdeclarativeborderimage.cpp20
-rw-r--r--src/declarative/graphicsitems/qdeclarativeevents.cpp30
-rw-r--r--src/declarative/graphicsitems/qdeclarativeflickable.cpp10
-rw-r--r--src/declarative/graphicsitems/qdeclarativegridview.cpp76
-rw-r--r--src/declarative/graphicsitems/qdeclarativeimage.cpp2
-rw-r--r--src/declarative/graphicsitems/qdeclarativeitem.cpp102
-rw-r--r--src/declarative/graphicsitems/qdeclarativeitem_p.h12
-rw-r--r--src/declarative/graphicsitems/qdeclarativelistview.cpp85
-rw-r--r--src/declarative/graphicsitems/qdeclarativepathview.cpp15
-rw-r--r--src/declarative/graphicsitems/qdeclarativerectangle.cpp16
-rw-r--r--src/declarative/graphicsitems/qdeclarativetext.cpp11
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextedit.cpp2
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextinput.cpp5
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextlayout.cpp8
-rw-r--r--src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp8
-rw-r--r--src/declarative/qml/qdeclarativebinding.cpp337
-rw-r--r--src/declarative/qml/qdeclarativebinding_p.h12
-rw-r--r--src/declarative/qml/qdeclarativecompiledbindings.cpp14
-rw-r--r--src/declarative/qml/qdeclarativecompiler.cpp119
-rw-r--r--src/declarative/qml/qdeclarativecompiler_p.h1
-rw-r--r--src/declarative/qml/qdeclarativecomponent.cpp44
-rw-r--r--src/declarative/qml/qdeclarativecomponent_p.h1
-rw-r--r--src/declarative/qml/qdeclarativedata_p.h13
-rw-r--r--src/declarative/qml/qdeclarativeengine.cpp102
-rw-r--r--src/declarative/qml/qdeclarativeenginedebug.cpp5
-rw-r--r--src/declarative/qml/qdeclarativeglobal_p.h2
-rw-r--r--src/declarative/qml/qdeclarativeimageprovider.cpp16
-rw-r--r--src/declarative/qml/qdeclarativeimport.cpp38
-rw-r--r--src/declarative/qml/qdeclarativeinclude.cpp24
-rw-r--r--src/declarative/qml/qdeclarativeinstruction.cpp7
-rw-r--r--src/declarative/qml/qdeclarativeinstruction_p.h2
-rw-r--r--src/declarative/qml/qdeclarativenetworkaccessmanagerfactory.cpp53
-rw-r--r--src/declarative/qml/qdeclarativeobjectscriptclass.cpp11
-rw-r--r--src/declarative/qml/qdeclarativeparser.cpp4
-rw-r--r--src/declarative/qml/qdeclarativeparser_p.h3
-rw-r--r--src/declarative/qml/qdeclarativeproperty.cpp228
-rw-r--r--src/declarative/qml/qdeclarativeproperty_p.h8
-rw-r--r--src/declarative/qml/qdeclarativepropertycache.cpp1
-rw-r--r--src/declarative/qml/qdeclarativepropertycache_p.h1
-rw-r--r--src/declarative/qml/qdeclarativesqldatabase.cpp26
-rw-r--r--src/declarative/qml/qdeclarativevaluetype.cpp46
-rw-r--r--src/declarative/qml/qdeclarativevme.cpp38
-rw-r--r--src/declarative/qml/qdeclarativevmemetaobject.cpp47
-rw-r--r--src/declarative/qml/qdeclarativevmemetaobject_p.h2
-rw-r--r--src/declarative/qml/qdeclarativeworkerscript.cpp2
-rw-r--r--src/declarative/util/qdeclarativeanimation.cpp8
-rw-r--r--src/declarative/util/qdeclarativepixmapcache.cpp2
-rw-r--r--src/declarative/util/qdeclarativeview.cpp7
-rw-r--r--src/declarative/util/qdeclarativexmllistmodel.cpp5
-rw-r--r--src/gui/dialogs/qdialog.cpp35
-rw-r--r--src/gui/dialogs/qfiledialog_mac.mm8
-rw-r--r--src/gui/dialogs/qfiledialog_symbian.cpp73
-rw-r--r--src/gui/dialogs/qfilesystemmodel.cpp2
-rw-r--r--src/gui/dialogs/qinputdialog.cpp2
-rw-r--r--src/gui/dialogs/qmessagebox.cpp2
-rw-r--r--src/gui/egl/qegl_x11.cpp4
-rw-r--r--src/gui/graphicsview/qgraphicsitem.cpp18
-rw-r--r--src/gui/graphicsview/qgraphicsitem_p.h4
-rw-r--r--src/gui/graphicsview/qgraphicslayout.cpp5
-rw-r--r--src/gui/graphicsview/qgraphicslayoutitem.cpp5
-rw-r--r--src/gui/graphicsview/qgraphicsscene.cpp4
-rw-r--r--src/gui/graphicsview/qgraphicsview.cpp2
-rw-r--r--src/gui/graphicsview/qgridlayoutengine_p.h2
-rw-r--r--src/gui/image/qimage.cpp71
-rw-r--r--src/gui/image/qimage_p.h36
-rw-r--r--src/gui/image/qmovie.cpp6
-rw-r--r--src/gui/image/qpixmap.cpp4
-rw-r--r--src/gui/image/qpixmap_raster.cpp19
-rw-r--r--src/gui/image/qpnghandler.cpp84
-rw-r--r--src/gui/inputmethod/qcoefepinputcontext_s60.cpp10
-rw-r--r--src/gui/itemviews/qabstractitemview.cpp45
-rw-r--r--src/gui/itemviews/qabstractitemview.h1
-rw-r--r--src/gui/itemviews/qabstractitemview_p.h7
-rw-r--r--src/gui/itemviews/qfileiconprovider.cpp2
-rw-r--r--src/gui/itemviews/qsortfilterproxymodel.cpp4
-rw-r--r--src/gui/itemviews/qstandarditemmodel.cpp2
-rw-r--r--src/gui/kernel/qapplication.cpp7
-rw-r--r--src/gui/kernel/qapplication_s60.cpp30
-rw-r--r--src/gui/kernel/qapplication_x11.cpp3
-rw-r--r--src/gui/kernel/qcocoasharedwindowmethods_mac_p.h2
-rw-r--r--src/gui/kernel/qevent.cpp219
-rw-r--r--src/gui/kernel/qevent.h46
-rw-r--r--src/gui/kernel/qevent_p.h28
-rw-r--r--src/gui/kernel/qeventdispatcher_mac.mm3
-rw-r--r--src/gui/kernel/qeventdispatcher_s60_p.h7
-rw-r--r--src/gui/kernel/qplatformwindow_qpa.h4
-rw-r--r--src/gui/kernel/qt_x11_p.h2
-rw-r--r--src/gui/kernel/qwidget_mac.mm16
-rw-r--r--src/gui/kernel/qwidget_s60.cpp4
-rw-r--r--src/gui/kernel/qwidget_x11.cpp11
-rw-r--r--src/gui/kernel/qx11embed_x11.cpp12
-rw-r--r--src/gui/painting/painting.pri2
-rw-r--r--src/gui/painting/qdrawhelper.cpp181
-rw-r--r--src/gui/painting/qdrawhelper_p.h4
-rw-r--r--src/gui/painting/qemulationpaintengine.cpp9
-rw-r--r--src/gui/painting/qemulationpaintengine_p.h3
-rw-r--r--src/gui/painting/qgrayraster.c36
-rw-r--r--src/gui/painting/qpaintengine_raster.cpp70
-rw-r--r--src/gui/painting/qpaintengine_raster_p.h2
-rw-r--r--src/gui/painting/qpainter.cpp25
-rw-r--r--src/gui/painting/qpathclipper.cpp14
-rw-r--r--src/gui/painting/qpdf.cpp4
-rw-r--r--src/gui/painting/qprinterinfo.cpp (renamed from src/gui/painting/qprinterinfo.qdoc)82
-rw-r--r--src/gui/painting/qprinterinfo.h15
-rw-r--r--src/gui/painting/qprinterinfo_mac.cpp185
-rw-r--r--src/gui/painting/qprinterinfo_p.h107
-rw-r--r--src/gui/painting/qprinterinfo_unix.cpp411
-rw-r--r--src/gui/painting/qprinterinfo_win.cpp193
-rw-r--r--src/gui/painting/qtextureglyphcache.cpp4
-rw-r--r--src/gui/painting/qunifiedtoolbarsurface_mac.cpp8
-rw-r--r--src/gui/styles/qcommonstyle.cpp7
-rw-r--r--src/gui/styles/qgtkstyle.cpp48
-rw-r--r--src/gui/styles/qgtkstyle_p.cpp8
-rw-r--r--src/gui/styles/qgtkstyle_p.h8
-rw-r--r--src/gui/styles/qs60style.cpp38
-rw-r--r--src/gui/styles/qs60style_s60.cpp5
-rw-r--r--src/gui/styles/qwindowsstyle.cpp5
-rw-r--r--src/gui/text/qfontdatabase_s60.cpp130
-rw-r--r--src/gui/text/qfontengine_coretext.mm13
-rw-r--r--src/gui/text/qfontengine_s60.cpp184
-rw-r--r--src/gui/text/qfontengine_s60_p.h16
-rw-r--r--src/gui/text/qtextcursor.cpp3
-rw-r--r--src/gui/text/qtextdocument.cpp6
-rw-r--r--src/gui/text/qtextengine.cpp5
-rw-r--r--src/gui/text/qtextformat.cpp10
-rw-r--r--src/gui/util/qflickgesture.cpp677
-rw-r--r--src/gui/util/qflickgesture_p.h113
-rw-r--r--src/gui/util/qscroller.cpp1999
-rw-r--r--src/gui/util/qscroller.h149
-rw-r--r--src/gui/util/qscroller_mac.mm69
-rw-r--r--src/gui/util/qscroller_p.h205
-rw-r--r--src/gui/util/qscrollerproperties.cpp397
-rw-r--r--src/gui/util/qscrollerproperties.h140
-rw-r--r--src/gui/util/qscrollerproperties_p.h94
-rw-r--r--src/gui/util/util.pri12
-rw-r--r--src/gui/widgets/qabstractscrollarea.cpp105
-rw-r--r--src/gui/widgets/qabstractscrollarea_p.h2
-rw-r--r--src/gui/widgets/qcombobox.cpp2
-rw-r--r--src/gui/widgets/qdockwidget.cpp17
-rw-r--r--src/gui/widgets/qlabel.cpp2
-rw-r--r--src/gui/widgets/qlinecontrol.cpp9
-rw-r--r--src/gui/widgets/qlinecontrol_p.h1
-rw-r--r--src/gui/widgets/qmenu.cpp5
-rw-r--r--src/gui/widgets/qvalidator.h6
-rw-r--r--src/imports/folderlistmodel/qdeclarativefolderlistmodel.cpp35
-rw-r--r--src/network/access/qhttpnetworkconnection.cpp7
-rw-r--r--src/network/access/qhttpnetworkconnection_p.h4
-rw-r--r--src/network/access/qhttpnetworkconnectionchannel.cpp2
-rw-r--r--src/network/access/qhttpnetworkconnectionchannel_p.h2
-rw-r--r--src/network/access/qhttpnetworkreply.cpp6
-rw-r--r--src/network/access/qhttpnetworkreply_p.h1
-rw-r--r--src/network/access/qnetworkaccessbackend.cpp1
-rw-r--r--src/network/access/qnetworkaccessbackend_p.h6
-rw-r--r--src/network/access/qnetworkaccessdatabackend_p.h2
-rw-r--r--src/network/access/qnetworkaccesshttpbackend.cpp140
-rw-r--r--src/network/access/qnetworkaccesshttpbackend_p.h4
-rw-r--r--src/network/access/qnetworkaccessmanager.cpp16
-rw-r--r--src/network/access/qnetworkreplyimpl.cpp52
-rw-r--r--src/network/access/qnetworkrequest.h3
-rw-r--r--src/network/bearer/bearer.pri1
-rw-r--r--src/network/bearer/qbearerengine.cpp14
-rw-r--r--src/network/bearer/qbearerengine_p.h5
-rw-r--r--src/network/bearer/qbearerplugin.cpp4
-rw-r--r--src/network/bearer/qbearerplugin_p.h6
-rw-r--r--src/network/bearer/qnetworkconfigmanager.cpp16
-rw-r--r--src/network/bearer/qnetworkconfigmanager.h22
-rw-r--r--src/network/bearer/qnetworkconfigmanager_p.cpp102
-rw-r--r--src/network/bearer/qnetworkconfigmanager_p.h48
-rw-r--r--src/network/bearer/qnetworkconfiguration.cpp30
-rw-r--r--src/network/bearer/qnetworkconfiguration.h11
-rw-r--r--src/network/bearer/qnetworkconfiguration_p.h17
-rw-r--r--src/network/bearer/qnetworksession.cpp109
-rw-r--r--src/network/bearer/qnetworksession.h17
-rw-r--r--src/network/bearer/qnetworksession_p.h20
-rw-r--r--src/network/socket/qlocalsocket_win.cpp4
-rw-r--r--src/network/socket/qnativesocketengine_unix.cpp13
-rw-r--r--src/network/ssl/qsslcertificate.cpp2
-rw-r--r--src/opengl/gl2paintengineex/qglengineshadermanager.cpp294
-rw-r--r--src/opengl/gl2paintengineex/qglshadercache_meego_p.h457
-rw-r--r--src/opengl/gl2paintengineex/qglshadercache_p.h98
-rw-r--r--src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp116
-rw-r--r--src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h4
-rw-r--r--src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp22
-rw-r--r--src/opengl/opengl.pro4
-rw-r--r--src/opengl/qgl.cpp17
-rw-r--r--src/opengl/qgl_egl.cpp2
-rw-r--r--src/opengl/qgl_p.h2
-rw-r--r--src/opengl/qgl_x11egl.cpp2
-rw-r--r--src/opengl/qglpixelbuffer_egl.cpp1
-rw-r--r--src/opengl/qglshaderprogram.cpp21
-rw-r--r--src/opengl/qwindowsurface_gl.cpp26
-rw-r--r--src/opengl/util/meego/main.cpp89
-rw-r--r--src/opengl/util/meego/shader-cache-introspector.pro7
-rw-r--r--src/openvg/qpaintengine_vg.cpp3
-rw-r--r--src/plugins/bearer/connman/qconnmanengine.cpp1
-rw-r--r--src/plugins/bearer/connman/qconnmanservice_linux.cpp2
-rw-r--r--src/plugins/bearer/icd/proxyconf.cpp22
-rw-r--r--src/plugins/bearer/icd/proxyconf.h1
-rw-r--r--src/plugins/bearer/icd/qicdengine.cpp96
-rw-r--r--src/plugins/bearer/icd/qicdengine.h6
-rw-r--r--src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp8
-rw-r--r--src/plugins/bearer/platformdefs_win.h2
-rw-r--r--src/plugins/bearer/qbearerengine_impl.h7
-rw-r--r--src/plugins/bearer/qnetworksession_impl.cpp67
-rw-r--r--src/plugins/bearer/qnetworksession_impl.h23
-rw-r--r--src/plugins/graphicssystems/meego/dithering.cpp11
-rw-r--r--src/plugins/graphicssystems/meego/qmeegographicssystem.cpp9
-rw-r--r--src/plugins/phonon/mmf/mmf.pro4
-rw-r--r--src/s60installs/bwins/QtCoreu.def7
-rw-r--r--src/s60installs/eabi/QtCoreu.def4
-rw-r--r--src/s60installs/eabi/QtDeclarativeu.def6
-rw-r--r--src/s60installs/eabi/QtGuiu.def2
-rw-r--r--src/s60installs/s60installs.pro4
-rw-r--r--src/s60main/qts60main_mcrt0.cpp8
-rw-r--r--src/sql/drivers/psql/qsql_psql.cpp116
-rw-r--r--src/sql/drivers/psql/qsql_psql.h6
-rw-r--r--src/tools/bootstrap/bootstrap.pro16
-rw-r--r--src/xmlpatterns/data/qatomicvalue.cpp2
-rw-r--r--tests/.gitignore6
-rw-r--r--tests/arthur/baselineserver/src/baselineserver.cpp122
-rw-r--r--tests/arthur/baselineserver/src/baselineserver.h13
-rw-r--r--tests/arthur/baselineserver/src/baselineserver.pro7
-rw-r--r--tests/arthur/baselineserver/src/baselineserver.qrc5
-rw-r--r--tests/arthur/baselineserver/src/htmlpage.cpp239
-rw-r--r--tests/arthur/baselineserver/src/main.cpp2
-rw-r--r--tests/arthur/baselineserver/src/report.cpp296
-rw-r--r--tests/arthur/baselineserver/src/report.h (renamed from tests/arthur/baselineserver/src/htmlpage.h)45
-rw-r--r--tests/arthur/baselineserver/src/templates/view.html79
-rw-r--r--tests/arthur/common/baselineprotocol.cpp33
-rw-r--r--tests/arthur/common/baselineprotocol.h43
-rw-r--r--tests/arthur/common/baselineprotocol.pri1
-rw-r--r--tests/arthur/common/qbaselinetest.cpp124
-rw-r--r--tests/arthur/common/qbaselinetest.h64
-rw-r--r--tests/arthur/common/qbaselinetest.pri13
-rw-r--r--tests/auto/baselineexample/baselineexample.pro18
-rw-r--r--tests/auto/baselineexample/tst_baselineexample.cpp158
-rw-r--r--tests/auto/collections/tst_collections.cpp2
-rw-r--r--tests/auto/corelib.pro2
-rw-r--r--tests/auto/declarative/declarative.pro44
-rw-r--r--tests/auto/declarative/examples/examples.pro4
-rw-r--r--tests/auto/declarative/moduleqt47/moduleqt47.pro2
-rw-r--r--tests/auto/declarative/parserstress/parserstress.pro2
-rw-r--r--tests/auto/declarative/qdeclarativeanchors/qdeclarativeanchors.pro2
-rw-r--r--tests/auto/declarative/qdeclarativeanimatedimage/qdeclarativeanimatedimage.pro2
-rw-r--r--tests/auto/declarative/qdeclarativeanimations/qdeclarativeanimations.pro2
-rw-r--r--tests/auto/declarative/qdeclarativebehaviors/qdeclarativebehaviors.pro2
-rw-r--r--tests/auto/declarative/qdeclarativebinding/qdeclarativebinding.pro2
-rw-r--r--tests/auto/declarative/qdeclarativeborderimage/qdeclarativeborderimage.pro2
-rw-r--r--tests/auto/declarative/qdeclarativecomponent/tst_qdeclarativecomponent.cpp15
-rw-r--r--tests/auto/declarative/qdeclarativeconnection/qdeclarativeconnection.pro2
-rw-r--r--tests/auto/declarative/qdeclarativedom/qdeclarativedom.pro2
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/data/AliasBindingsAssignCorrectlyType.qml9
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/data/AliasBindingsOverrideTargetType.qml14
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/data/AliasBindingsOverrideTargetType3.qml9
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsAssignCorrectly.qml59
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsOverrideTarget.2.qml29
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsOverrideTarget.3.qml24
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsOverrideTarget.qml28
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/data/aliasWritesOverrideBindings.2.qml29
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/data/aliasWritesOverrideBindings.3.qml23
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/data/aliasWritesOverrideBindings.qml23
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/data/writeRemovesBinding.qml46
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/qdeclarativeecmascript.pro2
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp180
-rw-r--r--tests/auto/declarative/qdeclarativeflickable/qdeclarativeflickable.pro2
-rw-r--r--tests/auto/declarative/qdeclarativeflipable/qdeclarativeflipable.pro2
-rw-r--r--tests/auto/declarative/qdeclarativefocusscope/data/forceActiveFocus.qml26
-rw-r--r--tests/auto/declarative/qdeclarativefocusscope/qdeclarativefocusscope.pro2
-rw-r--r--tests/auto/declarative/qdeclarativefocusscope/tst_qdeclarativefocusscope.cpp109
-rw-r--r--tests/auto/declarative/qdeclarativefolderlistmodel/qdeclarativefolderlistmodel.pro2
-rw-r--r--tests/auto/declarative/qdeclarativefontloader/qdeclarativefontloader.pro2
-rw-r--r--tests/auto/declarative/qdeclarativegridview/data/manual-highlight.qml4
-rw-r--r--tests/auto/declarative/qdeclarativegridview/qdeclarativegridview.pro2
-rw-r--r--tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp54
-rw-r--r--tests/auto/declarative/qdeclarativeimage/data/heart-win32.pngbin12457 -> 12621 bytes
-rw-r--r--tests/auto/declarative/qdeclarativeimage/data/heart.pngbin12424 -> 12577 bytes
-rw-r--r--tests/auto/declarative/qdeclarativeimage/data/heart200-win32.pngbin7939 -> 8062 bytes
-rw-r--r--tests/auto/declarative/qdeclarativeimage/data/heart200.pngbin7943 -> 8063 bytes
-rw-r--r--tests/auto/declarative/qdeclarativeimage/qdeclarativeimage.pro2
-rw-r--r--tests/auto/declarative/qdeclarativeimage/tst_qdeclarativeimage.cpp30
-rw-r--r--tests/auto/declarative/qdeclarativeimageprovider/tst_qdeclarativeimageprovider.cpp46
-rw-r--r--tests/auto/declarative/qdeclarativeinfo/qdeclarativeinfo.pro2
-rw-r--r--tests/auto/declarative/qdeclarativeinstruction/tst_qdeclarativeinstruction.cpp5
-rw-r--r--tests/auto/declarative/qdeclarativeitem/data/keynavigationtest.qml40
-rw-r--r--tests/auto/declarative/qdeclarativeitem/qdeclarativeitem.pro2
-rw-r--r--tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp5
-rw-r--r--tests/auto/declarative/qdeclarativelanguage/qdeclarativelanguage.pro2
-rw-r--r--tests/auto/declarative/qdeclarativelayoutitem/qdeclarativelayoutitem.pro2
-rw-r--r--tests/auto/declarative/qdeclarativelistmodel/qdeclarativelistmodel.pro2
-rw-r--r--tests/auto/declarative/qdeclarativelistview/data/displaylist.qml9
-rw-r--r--tests/auto/declarative/qdeclarativelistview/data/header.qml31
-rw-r--r--tests/auto/declarative/qdeclarativelistview/data/header1.qml33
-rw-r--r--tests/auto/declarative/qdeclarativelistview/data/manual-highlight.qml2
-rw-r--r--tests/auto/declarative/qdeclarativelistview/data/qtbug16037.qml37
-rw-r--r--tests/auto/declarative/qdeclarativelistview/incrementalmodel.cpp89
-rw-r--r--tests/auto/declarative/qdeclarativelistview/incrementalmodel.h68
-rw-r--r--tests/auto/declarative/qdeclarativelistview/qdeclarativelistview.pro5
-rw-r--r--tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp243
-rw-r--r--tests/auto/declarative/qdeclarativeloader/qdeclarativeloader.pro2
-rw-r--r--tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.pro2
-rw-r--r--tests/auto/declarative/qdeclarativemousearea/qdeclarativemousearea.pro2
-rw-r--r--tests/auto/declarative/qdeclarativeparticles/qdeclarativeparticles.pro2
-rw-r--r--tests/auto/declarative/qdeclarativepathview/qdeclarativepathview.pro2
-rw-r--r--tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp4
-rw-r--r--tests/auto/declarative/qdeclarativepixmapcache/qdeclarativepixmapcache.pro2
-rw-r--r--tests/auto/declarative/qdeclarativepixmapcache/tst_qdeclarativepixmapcache.cpp4
-rw-r--r--tests/auto/declarative/qdeclarativepositioners/qdeclarativepositioners.pro2
-rw-r--r--tests/auto/declarative/qdeclarativeproperty/data/aliasPropertyBindings.qml19
-rw-r--r--tests/auto/declarative/qdeclarativeproperty/qdeclarativeproperty.pro2
-rw-r--r--tests/auto/declarative/qdeclarativeproperty/tst_qdeclarativeproperty.cpp131
-rw-r--r--tests/auto/declarative/qdeclarativeqt/qdeclarativeqt.pro2
-rw-r--r--tests/auto/declarative/qdeclarativerepeater/qdeclarativerepeater.pro2
-rw-r--r--tests/auto/declarative/qdeclarativescriptdebugging/qdeclarativescriptdebugging.pro2
-rw-r--r--tests/auto/declarative/qdeclarativesmoothedanimation/qdeclarativesmoothedanimation.pro2
-rw-r--r--tests/auto/declarative/qdeclarativespringanimation/qdeclarativespringanimation.pro2
-rw-r--r--tests/auto/declarative/qdeclarativesqldatabase/qdeclarativesqldatabase.pro2
-rw-r--r--tests/auto/declarative/qdeclarativestates/data/image.pngbin0 -> 173 bytes
-rw-r--r--tests/auto/declarative/qdeclarativestates/data/reset.qml9
-rw-r--r--tests/auto/declarative/qdeclarativestates/qdeclarativestates.pro2
-rw-r--r--tests/auto/declarative/qdeclarativestates/tst_qdeclarativestates.cpp13
-rw-r--r--tests/auto/declarative/qdeclarativetext/qdeclarativetext.pro2
-rw-r--r--tests/auto/declarative/qdeclarativetextedit/qdeclarativetextedit.pro2
-rw-r--r--tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp13
-rw-r--r--tests/auto/declarative/qdeclarativetextinput/qdeclarativetextinput.pro2
-rw-r--r--tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp13
-rw-r--r--tests/auto/declarative/qdeclarativevaluetypes/data/BindingsSpliceCorrectlyType.qml7
-rw-r--r--tests/auto/declarative/qdeclarativevaluetypes/data/BindingsSpliceCorrectlyType4.qml7
-rw-r--r--tests/auto/declarative/qdeclarativevaluetypes/data/BindingsSpliceCorrectlyType5.qml7
-rw-r--r--tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.1.qml29
-rw-r--r--tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.2.qml31
-rw-r--r--tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.3.qml36
-rw-r--r--tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.4.qml27
-rw-r--r--tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.5.qml27
-rw-r--r--tests/auto/declarative/qdeclarativevaluetypes/qdeclarativevaluetypes.pro2
-rw-r--r--tests/auto/declarative/qdeclarativevaluetypes/tst_qdeclarativevaluetypes.cpp56
-rw-r--r--tests/auto/declarative/qdeclarativeview/qdeclarativeview.pro2
-rw-r--r--tests/auto/declarative/qdeclarativeviewer/qdeclarativeviewer.pro4
-rw-r--r--tests/auto/declarative/qdeclarativeviewer/tst_qdeclarativeviewer.cpp12
-rw-r--r--tests/auto/declarative/qdeclarativevisualdatamodel/qdeclarativevisualdatamodel.pro2
-rw-r--r--tests/auto/declarative/qdeclarativewebview/qdeclarativewebview.pro2
-rw-r--r--tests/auto/declarative/qdeclarativeworkerscript/qdeclarativeworkerscript.pro2
-rw-r--r--tests/auto/declarative/qdeclarativexmlhttprequest/qdeclarativexmlhttprequest.pro2
-rw-r--r--tests/auto/declarative/qdeclarativexmllistmodel/qdeclarativexmllistmodel.pro4
-rw-r--r--tests/auto/declarative/qdeclarativexmllistmodel/tst_qdeclarativexmllistmodel.cpp69
-rw-r--r--tests/auto/declarative/qmlvisual/ListView/data/listview.5.pngbin1663 -> 1661 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/ListView/data/listview.6.pngbin1666 -> 1674 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/ListView/data/listview.qml234
-rw-r--r--tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.0.pngbin0 -> 622 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.1.pngbin0 -> 627 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.2.pngbin0 -> 626 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.3.pngbin0 -> 625 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.qml951
-rw-r--r--tests/auto/declarative/qmlvisual/focusscope/data/test2.0.pngbin305 -> 439 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/focusscope/data/test2.1.pngbin305 -> 439 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/focusscope/data/test2.qml154
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.0.pngbin0 -> 1439 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.1.pngbin0 -> 1424 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.2.pngbin0 -> 1428 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.3.pngbin0 -> 1396 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.4.pngbin0 -> 1454 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.qml1575
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.qml2
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.0.pngbin0 -> 1710 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.1.pngbin0 -> 1710 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.2.pngbin0 -> 1727 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.3.pngbin0 -> 1727 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.4.pngbin0 -> 1727 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.5.pngbin0 -> 1731 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.qml2159
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.qml4
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativeflickable/flickable-nested.qml50
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.0.pngbin1114 -> 1114 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.1.pngbin1105 -> 1119 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.2.pngbin1088 -> 1102 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.3.pngbin1096 -> 1092 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.4.pngbin1143 -> 1143 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.5.pngbin1143 -> 1143 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.qml366
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.0.pngbin1169 -> 1169 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.1.pngbin1182 -> 1172 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.2.pngbin1211 -> 1201 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.3.pngbin1184 -> 1164 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.4.pngbin1152 -> 1226 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.5.pngbin1141 -> 1192 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.6.pngbin1189 -> 1188 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.qml672
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/test-pathview.qml2
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/usingRepeater.0.pngbin1199 -> 1747 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/usingRepeater.qml62
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.0.pngbin0 -> 941 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.1.pngbin0 -> 975 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.2.pngbin0 -> 1235 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.3.pngbin0 -> 1225 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.4.pngbin0 -> 1247 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.5.pngbin0 -> 1243 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.6.pngbin0 -> 1234 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.7.pngbin0 -> 1242 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.qml1763
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.0.pngbin941 -> 950 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.1.pngbin975 -> 983 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.2.pngbin1235 -> 1243 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.3.pngbin1225 -> 1235 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.4.pngbin1247 -> 1253 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.5.pngbin1243 -> 1249 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.6.pngbin1234 -> 1241 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.7.pngbin1242 -> 1251 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.qml852
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.0.pngbin2569 -> 801 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.qml118
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-X11/multilineAlign.0.pngbin762 -> 791 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-X11/multilineAlign.qml118
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.0.pngbin5648 -> 1392 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.qml60
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-X11/parentanchor.0.pngbin1313 -> 1313 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-X11/parentanchor.qml60
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.0.pngbin0 -> 210 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.1.pngbin0 -> 270 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.qml475
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.0.pngbin1083 -> 322 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.1.pngbin1083 -> 322 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.qml122
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.0.pngbin303 -> 465 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.1.pngbin303 -> 465 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.qml216
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.0.pngbin1353 -> 491 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.1.pngbin1353 -> 491 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.qml130
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.0.pngbin3572 -> 1240 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.1.pngbin3320 -> 1106 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.2.pngbin2953 -> 999 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.3.pngbin2386 -> 864 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.4.pngbin1650 -> 703 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.qml480
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.0.pngbin2748 -> 791 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.1.pngbin3064 -> 854 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.qml144
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.0.pngbin483 -> 581 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.1.pngbin483 -> 581 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.qml130
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.0.pngbin1189 -> 1187 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.1.pngbin1068 -> 1066 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.qml194
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.0.pngbin747 -> 903 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.1.pngbin814 -> 967 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.2.pngbin809 -> 962 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.3.pngbin527 -> 678 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.4.pngbin526 -> 676 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.5.pngbin399 -> 542 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.qml646
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext.0.pngbin60155 -> 14238 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.0.pngbin3805 -> 1563 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext3.0.pngbin21056 -> 6348 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext.0.pngbin62489 -> 9321 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext2.0.pngbin29962 -> 10663 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext.0.pngbin13140 -> 13194 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext2.0.pngbin1503 -> 1510 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext.0.pngbin9297 -> 9415 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext2.0.pngbin10626 -> 10671 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.0.pngbin688 -> 855 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.1.pngbin693 -> 863 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.2.pngbin695 -> 865 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.3.pngbin694 -> 862 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.4.pngbin688 -> 855 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.qml528
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.0.pngbin3493 -> 3481 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.1.pngbin3617 -> 3606 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.2.pngbin3688 -> 3676 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.3.pngbin3766 -> 3754 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.4.pngbin3839 -> 3828 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.5.pngbin3940 -> 3927 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.6.pngbin3943 -> 3930 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.7.pngbin3943 -> 3930 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.qml842
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.1.pngbin715 -> 343 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.2.pngbin1295 -> 461 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.3.pngbin1922 -> 539 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.qml332
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.qml12
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.0.pngbin256 -> 358 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.1.pngbin339 -> 446 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.2.pngbin446 -> 553 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.3.pngbin510 -> 622 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.qml374
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/hAlign.0.pngbin3661 -> 3685 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/hAlign.qml48
-rw-r--r--tests/auto/declarative/qmlvisual/qmlvisual.pro3
-rw-r--r--tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp21
-rw-r--r--tests/auto/declarative/symbianlibs.pri9
-rw-r--r--tests/auto/gui.pro1
-rw-r--r--tests/auto/guiapplauncher/tst_guiapplauncher.cpp2
-rw-r--r--tests/auto/lancelot/lancelot.pro5
-rw-r--r--tests/auto/lancelot/tst_lancelot.cpp67
-rw-r--r--tests/auto/macnativeevents/tst_macnativeevents.cpp2
-rw-r--r--tests/auto/networkselftest/networkselftest.pro4
-rw-r--r--tests/auto/networkselftest/tst_networkselftest.cpp2
-rw-r--r--tests/auto/other.pro1
-rw-r--r--tests/auto/qabstractfileengine/qabstractfileengine.pro6
-rw-r--r--tests/auto/qabstractfileengine/qabstractfileengine.qrc5
-rw-r--r--tests/auto/qabstractfileengine/resources/file.txt1
-rw-r--r--tests/auto/qabstractfileengine/tst_qabstractfileengine.cpp765
-rw-r--r--tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp111
-rw-r--r--tests/auto/qapplication/modal/main.cpp1
-rw-r--r--tests/auto/qapplication/test/test.pro4
-rw-r--r--tests/auto/qaudioinput/qaudioinput.pro2
-rw-r--r--tests/auto/qaudiooutput/qaudiooutput.pro2
-rw-r--r--tests/auto/qchar/qchar.pro2
-rw-r--r--tests/auto/qclipboard/test/test.pro2
-rw-r--r--tests/auto/qcompleter/tst_qcompleter.cpp27
-rw-r--r--tests/auto/qdatastream/tst_qdatastream.cpp51
-rw-r--r--tests/auto/qdbusconnection/tst_qdbusconnection.cpp69
-rw-r--r--tests/auto/qdir/qdir.pro3
-rw-r--r--tests/auto/qdir/tst_qdir.cpp355
-rw-r--r--tests/auto/qdiriterator/qdiriterator.pro5
-rw-r--r--tests/auto/qdiriterator/tst_qdiriterator.cpp48
-rw-r--r--tests/auto/qdirmodel/tst_qdirmodel.cpp22
-rw-r--r--tests/auto/qelapsedtimer/tst_qelapsedtimer.cpp7
-rw-r--r--tests/auto/qfile/largefile/largefile.pro2
-rw-r--r--tests/auto/qfile/qfile.pro1
-rw-r--r--tests/auto/qfile/test/test.pro2
-rw-r--r--tests/auto/qfile/tst_qfile.cpp206
-rw-r--r--tests/auto/qfiledialog/resources/file.txt1
-rw-r--r--tests/auto/qfiledialog/tst_qfiledialog.cpp18
-rw-r--r--tests/auto/qfileinfo/qfileinfo.pro7
-rw-r--r--tests/auto/qfileinfo/tst_qfileinfo.cpp257
-rw-r--r--tests/auto/qfilesystementry/qfilesystementry.pro8
-rw-r--r--tests/auto/qfilesystementry/tst_qfilesystementry.cpp387
-rw-r--r--tests/auto/qfilesystemmodel/tst_qfilesystemmodel.cpp9
-rw-r--r--tests/auto/qfilesystemwatcher/qfilesystemwatcher.pro2
-rw-r--r--tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp23
-rw-r--r--tests/auto/qgraphicsview/tst_qgraphicsview.cpp39
-rw-r--r--tests/auto/qhttp/qhttp.pro4
-rw-r--r--tests/auto/qimage/tst_qimage.cpp16
-rw-r--r--tests/auto/qimagereader/tst_qimagereader.cpp10
-rw-r--r--tests/auto/qinputcontext/qinputcontext.pro2
-rw-r--r--tests/auto/qinputcontext/tst_qinputcontext.cpp141
-rw-r--r--tests/auto/qlocalsocket/test/test.pro2
-rw-r--r--tests/auto/qmessagebox/tst_qmessagebox.cpp138
-rw-r--r--tests/auto/qmovie/animations/corrupt.gifbin0 -> 847 bytes
-rw-r--r--tests/auto/qmovie/qmovie.pro1
-rw-r--r--tests/auto/qmovie/resources.qrc5
-rw-r--r--tests/auto/qmovie/tst_qmovie.cpp13
-rw-r--r--tests/auto/qnetworkreply/tst_qnetworkreply.cpp506
-rw-r--r--tests/auto/qpixmap/tst_qpixmap.cpp27
-rw-r--r--tests/auto/qpointer/tst_qpointer.cpp32
-rw-r--r--tests/auto/qprinterinfo/tst_qprinterinfo.cpp2
-rw-r--r--tests/auto/qprocess/tst_qprocess.cpp16
-rw-r--r--tests/auto/qprogressbar/tst_qprogressbar.cpp7
-rw-r--r--tests/auto/qresourceengine/qresourceengine.pro2
-rw-r--r--tests/auto/qscriptjstestsuite/tst_qscriptjstestsuite.cpp10
-rw-r--r--tests/auto/qscriptv8testsuite/qscriptv8testsuite.pro8
-rw-r--r--tests/auto/qscriptv8testsuite/qscriptv8testsuite.qrc5
-rw-r--r--tests/auto/qscriptv8testsuite/tst_qscriptv8testsuite.cpp12
-rw-r--r--tests/auto/qscriptvalue/tst_qscriptvalue.cpp60
-rw-r--r--tests/auto/qscriptvalue/tst_qscriptvalue.h5
-rw-r--r--tests/auto/qscroller/qscroller.pro3
-rw-r--r--tests/auto/qscroller/tst_qscroller.cpp537
-rw-r--r--tests/auto/qsettings/qsettings.pro2
-rw-r--r--tests/auto/qsharedpointer/tst_qsharedpointer.cpp4
-rw-r--r--tests/auto/qsortfilterproxymodel/qsortfilterproxymodel.pro5
-rw-r--r--tests/auto/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp37
-rw-r--r--tests/auto/qsound/qsound.pro2
-rw-r--r--tests/auto/qsqldatabase/tst_databases.h2
-rw-r--r--tests/auto/qstyle/tst_qstyle.cpp7
-rw-r--r--tests/auto/qtemporaryfile/qtemporaryfile.pro2
-rw-r--r--tests/auto/qtextlayout/tst_qtextlayout.cpp19
-rw-r--r--tests/auto/qtextstream/tst_qtextstream.cpp37
-rw-r--r--tests/auto/qwidget/tst_qwidget.cpp10
-rw-r--r--tests/auto/qxmlstream/qxmlstream.pro2
-rw-r--r--tests/auto/qxmlstream/tst_qxmlstream.cpp86
-rw-r--r--tests/auto/symbian/orientationchange/orientationchange.pro1
-rw-r--r--tests/auto/symbian/orientationchange/tst_orientationchange.cpp43
-rw-r--r--tests/benchmarks/corelib/io/qdir/tree/bench_qdir_tree.cpp69
-rw-r--r--tests/benchmarks/corelib/thread/qmutex/qmutex.pro2
-rw-r--r--tests/benchmarks/corelib/thread/qmutex/tst_qmutex.cpp326
-rw-r--r--tests/benchmarks/declarative/binding/binding.pro2
-rw-r--r--tests/benchmarks/declarative/qdeclarativeimage/qdeclarativeimage.pro2
-rw-r--r--tests/benchmarks/declarative/script/script.pro2
-rw-r--r--tests/benchmarks/script/sunspider/sunspider.pro10
-rw-r--r--tests/benchmarks/script/sunspider/sunspider.qrc5
-rw-r--r--tests/benchmarks/script/sunspider/tst_sunspider.cpp9
-rw-r--r--tests/benchmarks/script/v8/tst_v8.cpp9
-rw-r--r--tests/benchmarks/script/v8/v8.pro10
-rw-r--r--tests/benchmarks/script/v8/v8.qrc5
-rwxr-xr-xtests/manual/mkspecs/test.sh41
-rw-r--r--tests/shared/filesystem.h13
-rw-r--r--tools/assistant/lib/fulltextsearch/qanalyzer.cpp10
-rw-r--r--tools/assistant/tools/assistant/main.cpp3
-rw-r--r--tools/configure/configure.pro12
-rw-r--r--tools/configure/configureapp.cpp45
-rw-r--r--tools/configure/configureapp.h2
-rw-r--r--tools/designer/src/lib/shared/qtresourcemodel.cpp50
-rw-r--r--tools/designer/src/lib/shared/widgetdatabase.cpp10
-rw-r--r--tools/linguist/linguist/messagemodel.cpp7
-rw-r--r--tools/macdeployqt/shared/shared.cpp8
-rw-r--r--tools/qmeegographicssystemhelper/qmeegographicssystemhelper.h3
-rw-r--r--tools/qml/browser/Browser.qml6
-rw-r--r--tools/qml/deviceorientation.h4
-rw-r--r--tools/qml/main.cpp56
-rw-r--r--tools/qml/qdeclarativetester.cpp25
-rw-r--r--tools/qml/qdeclarativetester.h4
-rw-r--r--tools/qml/qml.pro4
-rw-r--r--tools/qml/qmlruntime.cpp6
-rw-r--r--tools/qml/startup/startup.qml6
-rw-r--r--tools/qml/texteditautoresizer_maemo5.h12
-rw-r--r--tools/qtestlib/wince/cetest/bootstrapped.pri5
-rw-r--r--tools/runonphone/serenum_unix.cpp29
-rw-r--r--tools/shared/windows/registry.cpp3
864 files changed, 117023 insertions, 14002 deletions
diff --git a/.gitignore b/.gitignore
index f9a4454..d446680 100644
--- a/.gitignore
+++ b/.gitignore
@@ -119,6 +119,14 @@ translations/*.qm
translations/*_untranslated.ts
qrc_*.cpp
+# Test generated files
+QObject.log
+tst_*
+!tst_*.*
+tst_*.log
+tst_*.debug
+tst_*~
+
# xemacs temporary files
*.flc
@@ -203,7 +211,7 @@ doc-build
# ---------------------
ABLD.BAT
-bld.inf
+bld.inf*
*.mmp
*.mk
*.rss
@@ -221,6 +229,10 @@ plugin_commonu.def
*.sym
*.lib
+# runonphone crash dumps
+d_exc_*.txt
+d_exc_*.stk
+
# Generated by abldfast.bat from devtools.
.abldsteps.*
diff --git a/bin/createpackage.pl b/bin/createpackage.pl
index 522d1fb..87ed29e 100755
--- a/bin/createpackage.pl
+++ b/bin/createpackage.pl
@@ -82,6 +82,8 @@ Where supported options are as follows:
[-s|stub] = Generates stub sis for ROM.
[-n|sisname <name>] = Specifies the final sis name.
[-g|gcce-is-armv5] = Convert gcce platform to armv5.
+ [-d|dont-patch] = Skip automatic patching of capabilities and pkg file if default certificate
+ is used. Instead non-self-signable capabilities just cause warnings.
Where parameters are as follows:
templatepkg = Name of .pkg file template
target = Either debug or release
@@ -127,6 +129,7 @@ my $stub = "";
my $signed_sis_name = "";
my $onlyUnsigned = "";
my $convertGcce = "";
+my $dontPatchCaps = "";
unless (GetOptions('i|install' => \$install,
'p|preprocess' => \$preprocessonly,
@@ -135,16 +138,19 @@ unless (GetOptions('i|install' => \$install,
'o|only-unsigned' => \$onlyUnsigned,
's|stub' => \$stub,
'n|sisname=s' => \$signed_sis_name,
- 'g|gcce-is-armv5' => \$convertGcce,)) {
+ 'g|gcce-is-armv5' => \$convertGcce,
+ 'd|dont-patch' => \$dontPatchCaps,)) {
Usage();
}
my $epocroot = $ENV{EPOCROOT};
+my $epocToolsDir = "";
if ($epocroot ne "") {
$epocroot =~ s,\\,/,g;
if ($epocroot =~ m,[^/]$,) {
$epocroot = $epocroot."/";
}
+ $epocToolsDir = "${epocroot}epoc32/tools/";
}
my $certfilepath = abs_path(dirname($certfile));
@@ -337,24 +343,25 @@ if($stub) {
mkpath($systeminstall);
my $stub_sis_name = $systeminstall."/".$stub_sis_name;
# Create stub SIS.
- system ("${epocroot}epoc32/tools/makesis -s $pkgoutput $stub_sis_name");
+ system ("${epocToolsDir}makesis -s $pkgoutput $stub_sis_name");
} else {
if ($certtext eq "Self Signed"
&& !@certificates
&& $templatepkg !~ m/_installer\.pkg$/i
&& !$onlyUnsigned) {
- print("Auto-patching capabilities for self signed package.\n");
my $patch_capabilities = File::Spec->catfile(dirname($0), "patch_capabilities");
- system ("$patch_capabilities $pkgoutput") and die ("ERROR: Automatic patching failed");
+ if ($dontPatchCaps) {
+ system ("$patch_capabilities -c $pkgoutput") and print ("Warning: Package check for self-signing viability failed. Installing the package on a device will most likely fail!\n\n");
+ } else {
+ print("Auto-patching self-signed package.\n");
+ system ("$patch_capabilities $pkgoutput") and die ("ERROR: Automatic patching failed");
+ }
}
# Create SIS.
# The 'and' is because system uses 0 to indicate success.
- if($epocroot) {
- system ("${epocroot}epoc32/tools/makesis $pkgoutput $unsigned_sis_name") and die ("ERROR: makesis failed");
- } else {
- system ("makesis $pkgoutput $unsigned_sis_name") and die ("ERROR: makesis failed");
- }
+ system ("${epocToolsDir}makesis $pkgoutput $unsigned_sis_name") and die ("ERROR: makesis failed");
+
print("\n");
my $targetInsert = "";
@@ -381,7 +388,7 @@ if($stub) {
my $relcert = File::Spec->abs2rel($certificate);
my $relkey = File::Spec->abs2rel($key);
# The 'and' is because system uses 0 to indicate success.
- system ("signsis $unsigned_sis_name $signed_sis_name $relcert $relkey $passphrase") and die ("ERROR: signsis failed");
+ system ("${epocToolsDir}signsis $unsigned_sis_name $signed_sis_name $relcert $relkey $passphrase") and die ("ERROR: signsis failed");
# Check if creating signed SIS Succeeded
stat($signed_sis_name);
@@ -394,7 +401,7 @@ if($stub) {
my $relcert = File::Spec->abs2rel(File::Spec->rel2abs( $row->[0], $certfilepath));
my $relkey = File::Spec->abs2rel(File::Spec->rel2abs( $row->[1], $certfilepath));
- system ("signsis $signed_sis_name $signed_sis_name $relcert $relkey $row->[2]");
+ system ("${epocToolsDir}signsis $signed_sis_name $signed_sis_name $relcert $relkey $row->[2]");
print ("\tAdditionally signed the SIS with certificate: $row->[0]!\n");
}
diff --git a/bin/elf2e32_qtwrapper.pl b/bin/elf2e32_qtwrapper.pl
index 4eeb098..a90877e 100755
--- a/bin/elf2e32_qtwrapper.pl
+++ b/bin/elf2e32_qtwrapper.pl
@@ -1,4 +1,44 @@
#!/usr/bin/perl -w
+#############################################################################
+##
+## 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 utilities 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$
+##
+#############################################################################
# A script to get around some shortcomings in elf2e32, namely:
# - Returning 0 even when there are errors.
@@ -106,7 +146,7 @@ while (1) {
$origDefLine = <$origDefFile>;
if (defined($origDefLine)) {
$origDefLine =~ s/[\n\r]//;
- if ($origDefLine =~ /([a-z0-9_]+) +\@ ([0-9]+) (.*)/i) {
+ if ($origDefLine =~ /([a-z0-9_]+) +\@ *([0-9]+) (.*)/i) {
$origSym = $1;
$origOrdinal = $2;
$origExtraData = $3;
@@ -121,7 +161,7 @@ while (1) {
if ($savedNewDefFileLine) {
# This happens if the new def file was missing an entry.
$newDefLine = $savedNewDefFileLine;
- $newDefLine =~ /([a-z0-9_]+) +\@ ([0-9]+) (.*)/i or die("$0: Shouldn't happen");
+ $newDefLine =~ /([a-z0-9_]+) +\@ *([0-9]+) (.*)/i or die("$0: Shouldn't happen");
$newSym = $1;
$newOrdinal = $2;
$newExtraData = $3;
@@ -131,7 +171,7 @@ while (1) {
$newDefLine = <$newDefFile>;
if (defined($newDefLine)) {
$newDefLine =~ s/[\n\r]//;
- if ($newDefLine =~ /([a-z0-9_]+) +\@ ([0-9]+) (.*)/i) {
+ if ($newDefLine =~ /([a-z0-9_]+) +\@ *([0-9]+) (.*)/i) {
$newSym = $1;
$newOrdinal = $2;
$newExtraData = $3;
diff --git a/bin/patch_capabilities.pl b/bin/patch_capabilities.pl
index 994d493..c3fb89f 100755
--- a/bin/patch_capabilities.pl
+++ b/bin/patch_capabilities.pl
@@ -63,8 +63,11 @@ sub Usage() {
print(" symbian-sbsv2 platform, 'target-platform' is REQUIRED. ***\n\n");
print(" *** NOTE2: When patching gcce binaries built with symbian-sbsv2 toolchain,\n");
print(" armv5 must be specified as platform.\n");
- print("\nUsage: patch_capabilities.pl pkg_filename [target-platform [capability list]]\n");
+ print("\nUsage: patch_capabilities.pl [-c] pkg_filename [target-platform [capability list]]\n");
print("\nE.g. patch_capabilities.pl myapp_template.pkg release-armv5 \"All -TCB\"\n");
+ print("\nThe parameter -c can be used to just check if package is compatible with self-signing\n");
+ print("without actually doing any patching.\n");
+ print("Explicit capability list cannot be used with -c parameter.\n");
exit();
}
@@ -75,6 +78,16 @@ sub trim($) {
return $string;
}
+my $epocroot = $ENV{EPOCROOT};
+my $epocToolsDir = "";
+if ($epocroot ne "") {
+ $epocroot =~ s,\\,/,g;
+ if ($epocroot =~ m,[^/]$,) {
+ $epocroot = $epocroot."/";
+ }
+ $epocToolsDir = "${epocroot}epoc32/tools/";
+}
+
my $nullDevice = "/dev/null";
$nullDevice = "NUL" if ($^O =~ /MSWin/);
@@ -86,6 +99,14 @@ if (@ARGV)
{
# Parse the first given script argument as a ".pkg" file name.
my $pkgFileName = shift(@ARGV);
+ my $justCheck = "";
+ my $msgPrefix = "Patching:";
+
+ if ($pkgFileName eq "-c") {
+ $pkgFileName = shift(@ARGV);
+ $justCheck = true;
+ $msgPrefix = "Warning:";
+ }
# These variables will only be set for template .pkg files.
my $target;
@@ -123,15 +144,22 @@ if (@ARGV)
if (($pkgFileName =~ m|\.pkg$|i) && -r($pkgFileName))
{
print ("\n");
- print ("Patching package file and relevant binaries...\n");
+ if ($justCheck) {
+ print ("Checking");
+ } else {
+ print ("Patching");
+ }
+ print (" package file and relevant binaries...\n");
- # If there are more arguments given, parse them as capabilities.
- if (@ARGV)
- {
- @capabilitiesSpecified = ();
- while (@ARGV)
+ if (!$justCheck) {
+ # If there are more arguments given, parse them as capabilities.
+ if (@ARGV)
{
- push (@capabilitiesSpecified, pop(@ARGV));
+ @capabilitiesSpecified = ();
+ while (@ARGV)
+ {
+ push (@capabilitiesSpecified, pop(@ARGV));
+ }
}
}
@@ -139,11 +167,15 @@ if (@ARGV)
my @binaries = ();
my $tempPkgFileName = $pkgFileName."_@@TEMP@@";
- unlink($tempPkgFileName);
- open (NEW_PKG, ">>".$tempPkgFileName);
+
+ if (!$justCheck) {
+ unlink($tempPkgFileName);
+ open (NEW_PKG, ">>".$tempPkgFileName);
+ }
open (PKG, "<".$pkgFileName);
- my $manufacturerElseBlock = 0;
+ my $checkFailed = "";
+ my $somethingPatched = "";
# Parse each line.
while (<PKG>)
@@ -155,66 +187,19 @@ if (@ARGV)
if ($line =~ m/^\#.*\((0x[0-7][0-9a-fA-F]*)\).*$/)
{
my $oldUID = $1;
- my $newUID = $oldUID;
- $newUID =~ s/0x./0xE/i;
- $newLine =~ s/$oldUID/$newUID/;
- print ("Patching: UID $oldUID is not compatible with self-signing! Changed to: $newUID.\n");
- }
-
- # Patch embedded sis name and UID if UID is in protected range
- if ($line =~ m/^@\"*(.*\.sis).*\((0x[0-7][0-9a-fA-F]*)\).*$/)
- {
- my $oldSisName = $1;
- my $oldUID = $2;
- my $newUID = $oldUID;
- $newUID =~ s/0x./0xE/i;
- $newLine =~ s/$oldUID/$newUID/;
- print ("Patching: Embedded sis $oldSisName UID $oldUID changed to: $newUID.\n");
-
- if ($oldSisName !~ m/^.*_selfsigned.sis$/i)
- {
- my $newSisName = $oldSisName;
- $newSisName =~ s/\.sis$/_selfsigned\.sis/i;
- $newLine =~ s/$oldSisName/$newSisName/i;
- print ("Patching: Embedded sis $oldSisName name changed to: $newSisName.\n");
+ print ("$msgPrefix UID $oldUID is not compatible with self-signing!\n");
+
+ if ($justCheck) {
+ $checkFailed = true;
+ } else {
+ my $newUID = $oldUID;
+ $newUID =~ s/0x./0xE/i;
+ $newLine =~ s/$oldUID/$newUID/;
+ print ("$msgPrefix Package UID changed to: $newUID.\n");
+ $somethingPatched = true;
}
}
- # Remove dependencies to known problem packages (i.e. packages that are likely to be patched, too)
- # to reduce unnecessary error messages.
- if ($line =~ m/^\((0x2002af5f)\).*\{.*\}$/)
- {
- $newLine = "\n";
- print ("Patching: Removed dependency to sqlite3.sis ($1) to avoid installation issues in case sqlite3.sis is also patched.\n");
- }
- if ($line =~ m/^\((0x2001E61C)\).*\{.*\}$/)
- {
- $newLine = "\n";
- print ("Patching: Removed dependency to qt.sis ($1) to avoid installation issues in case qt.sis is also patched.\n");
- }
-
- # Remove manufacturer ifdef
- if ($line =~ m/^.*\(MANUFACTURER\)\=\(.*\).*$/)
- {
- $newLine = "\n";
- print ("Patching: Removed manufacturer check as it is usually not desirable in self-signed packages.\n");
- }
-
- if ($line =~ m/^ELSEIF.*MANUFACTURER$/)
- {
- $manufacturerElseBlock = 1;
- }
-
- if ($manufacturerElseBlock eq 1)
- {
- $newLine = "\n";
- }
-
- if ($line =~ m/^ENDIF.*MANUFACTURER$/)
- {
- $manufacturerElseBlock = 0;
- }
-
# If the line specifies a file, parse the source and destination locations.
if ($line =~ m|^ *\"([^\"]+)\"\s*\-\s*\"([^\"]+)\"|)
{
@@ -231,16 +216,20 @@ if (@ARGV)
$sourcePath =~ s/\$\(TARGET\)/$target/gm;
}
- # Change the source file name (but only if not already patched)
- my $patchedSourcePath = $sourcePath;
- if ($patchedSourcePath !~ m/_patched_caps/)
- {
- $newLine =~ s/(^.*)(\.dll|\.exe)(.*)(\.dll|\.exe)/$1_patched_caps$2$3$4/i;
- $patchedSourcePath =~ s/(^.*)(\.dll|\.exe)/$1_patched_caps$2/i;
-
- copy($sourcePath, $patchedSourcePath) or die "$sourcePath cannot be copied for patching.";
+ if ($justCheck) {
+ push (@binaries, $sourcePath);
+ } else {
+ # Change the source file name (but only if not already patched)
+ my $patchedSourcePath = $sourcePath;
+ if ($patchedSourcePath !~ m/_patched_caps/)
+ {
+ $newLine =~ s/(^.*)(\.dll|\.exe)(.*)(\.dll|\.exe)/$1_patched_caps$2$3$4/i;
+ $patchedSourcePath =~ s/(^.*)(\.dll|\.exe)/$1_patched_caps$2/i;
+
+ copy($sourcePath, $patchedSourcePath) or die "$sourcePath cannot be copied for patching.";
+ }
+ push (@binaries, $patchedSourcePath);
}
- push (@binaries, $patchedSourcePath);
}
}
@@ -250,14 +239,15 @@ if (@ARGV)
}
close (PKG);
- close (NEW_PKG);
-
- unlink($pkgFileName);
- rename($tempPkgFileName, $pkgFileName);
+ if (!$justCheck) {
+ close (NEW_PKG);
+ unlink($pkgFileName);
+ rename($tempPkgFileName, $pkgFileName);
+ }
print ("\n");
- my $baseCommandToExecute = "elftran -vid 0x0 -capability \"%s\" ";
+ my $baseCommandToExecute = "${epocToolsDir}elftran -vid 0x0 -capability \"%s\" ";
# Actually set the capabilities of the listed binaries.
foreach my $binaryPath(@binaries)
@@ -265,18 +255,18 @@ if (@ARGV)
# Create the command line for setting the capabilities.
my ($binaryVolume, $binaryDirs, $binaryBaseName) = File::Spec->splitpath($binaryPath);
my $commandToExecute = $baseCommandToExecute;
- my $executeNeeded = 0;
+ my $executeNeeded = "";
if (@capabilitiesSpecified)
{
$commandToExecute = sprintf($baseCommandToExecute, join(" ", @capabilitiesSpecified));
- $executeNeeded = 1;
+ $executeNeeded = true;
my $capString = join(" ", @capabilitiesSpecified);
- print ("Patching: Patching the the Vendor ID to 0 and the capabilities used to: \"$capString\" in \"$binaryBaseName\".\n");
+ print ("$msgPrefix Patching the the Vendor ID to 0 and the capabilities used to: \"$capString\" in \"$binaryBaseName\".\n");
} else {
# Test which capabilities are present and then restrict them to the allowed set.
# This avoid raising the capabilities of apps that already have none.
my $dllCaps;
- open($dllCaps, "elftran -dump s $binaryPath |") or die ("Could not execute elftran");
+ open($dllCaps, "${epocToolsDir}elftran -dump s $binaryPath |") or die ("ERROR: Could not execute elftran");
my $capsFound = 0;
my $originalVid;
my @capabilitiesToSet;
@@ -288,8 +278,8 @@ if (@ARGV)
if ($binaryBaseName =~ /\.exe$/) {
# Installer refuses to install protected executables in a self signed package, so abort if one is detected.
# We can't simply just patch the executable SID, as any registration resources executable uses will be linked to it via SID.
- print ("Patching: Executable with SID in the protected range (0x$exeSid) detected: \"$binaryBaseName\". A self-signed sis with protected executables is not supported.\n");
- exit(1);
+ print ("$msgPrefix Executable with SID in the protected range (0x$exeSid) detected: \"$binaryBaseName\". A self-signed sis with protected executables is not supported.\n\n");
+ $checkFailed = true;
}
}
if (/^Vendor ID: ([0-9a-fA-F]*)$/) {
@@ -302,7 +292,7 @@ if (@ARGV)
if ($capabilitiesToAllow =~ /$_/) {
push(@capabilitiesToSet, $_);
if (Location =~ /$_/i) {
- print ("Patching: Warning - \"Location\" capability detected for binary: \"$binaryBaseName\". This capability is not self-signable for S60 3rd edition feature pack 1 devices, so installing this package on those devices will most likely not work.\n");
+ print ("$msgPrefix \"Location\" capability detected for binary: \"$binaryBaseName\". This capability is not self-signable for S60 3rd edition feature pack 1 devices, so installing this package on those devices will most likely not work.\n\n");
}
} else {
push(@capabilitiesToDrop, $_);
@@ -311,22 +301,32 @@ if (@ARGV)
}
close($dllCaps);
if ($originalVid !~ "00000000") {
- print ("Patching: Vendor ID (0x$originalVid) incompatible with self-signed packages, setting it to zero for \"$binaryBaseName\".\n");
- $executeNeeded = 1;
+ print ("$msgPrefix Non-zero vendor ID (0x$originalVid) is incompatible with self-signed packages in \"$binaryBaseName\"");
+ if ($justCheck) {
+ print (".\n\n");
+ $checkFailed = true;
+ } else {
+ print (", setting it to zero.\n\n");
+ $executeNeeded = true;
+ }
}
if ($#capabilitiesToDrop) {
my $capsToDropStr = join("\", \"", @capabilitiesToDrop);
$capsToDropStr =~ s/\", \"$//;
- if ($binaryBaseName =~ /\.exe$/) {
- # While libraries often have capabilities they do not themselves need just to enable them to be loaded by wider variety of processes,
- # executables are more likely to need every capability they have been assigned or they won't function correctly.
- print ("Patching: Executable with capabilities incompatible with self-signing detected: \"$binaryBaseName\". (Incompatible capabilities: \"$capsToDropStr\".) Reducing capabilities is only supported for libraries.\n");
- print ("Patching: Please use a proper developer certificate for signing this package.\n");
- exit(1);
+ if ($justCheck) {
+ print ("$msgPrefix The following capabilities used in \"$binaryBaseName\" are not compatible with a self-signed package: \"$capsToDropStr\".\n\n");
+ $checkFailed = true;
} else {
- print ("Patching: The following capabilities used in \"$binaryBaseName\" are not compatible with a self-signed package and will be removed: \"$capsToDropStr\".\n");
- $executeNeeded = 1;
+ if ($binaryBaseName =~ /\.exe$/) {
+ # While libraries often have capabilities they do not themselves need just to enable them to be loaded by wider variety of processes,
+ # executables are more likely to need every capability they have been assigned or they won't function correctly.
+ print ("$msgPrefix Executable with capabilities incompatible with self-signing detected: \"$binaryBaseName\". (Incompatible capabilities: \"$capsToDropStr\".) Reducing capabilities is only supported for libraries.\n");
+ $checkFailed = true;
+ } else {
+ print ("$msgPrefix The following capabilities used in \"$binaryBaseName\" are not compatible with a self-signed package and will be removed: \"$capsToDropStr\".\n");
+ $executeNeeded = true;
+ }
}
}
$commandToExecute = sprintf($baseCommandToExecute, join(" ", @capabilitiesToSet));
@@ -337,16 +337,35 @@ if (@ARGV)
# Actually execute the elftran command to set the capabilities.
print ("\n");
system ("$commandToExecute > $nullDevice");
+ $somethingPatched = true;
}
- ## Create another command line to check that the set capabilities are correct.
- #$commandToExecute = "elftran -dump s ".$binaryPath;
}
+ if ($checkFailed) {
+ print ("\n");
+ if ($justCheck) {
+ print ("$msgPrefix The package is not compatible with self-signing.\n");
+ } else {
+ print ("$msgPrefix Unable to patch the package for self-singing.\n");
+ }
+ print ("Use a proper developer certificate for signing this package.\n\n");
+ exit(1);
+ }
+
+ if ($justCheck) {
+ print ("Package is compatible with self-signing.\n");
+ } else {
+ if ($somethingPatched) {
+ print ("NOTE: A patched package may not work as expected due to reduced capabilities and other modifications,\n");
+ print (" so it should not be used for any kind of Symbian signing or distribution!\n");
+ print (" Use a proper certificate to avoid the need to patch the package.\n");
+ } else {
+ print ("No patching was required!\n");
+ }
+ }
print ("\n");
- print ("NOTE: A patched package may not work as expected due to reduced capabilities and other modifications,\n");
- print (" so it should not be used for any kind of Symbian signing or distribution!\n");
- print (" Use a proper certificate to avoid the need to patch the package.\n");
- print ("\n");
+ } else {
+ Usage();
}
}
else
diff --git a/config.profiles/symbian/bld.inf b/config.profiles/symbian/bld.inf
new file mode 100644
index 0000000..d3958dd
--- /dev/null
+++ b/config.profiles/symbian/bld.inf
@@ -0,0 +1,87 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+*
+* Description: Build information file for Qt configuration
+*
+*/
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+TOOLS2
+
+PRJ_EXPORTS
+qtconfig.xml /epoc32/tools/makefile_templates/qt/qtconfig.xml
+qtconfig.flm /epoc32/tools/makefile_templates/qt/qtconfig.flm
+
+../../mkspecs/symbian-sbsv2/flm/qt/qmake_emulator_deployment.flm /epoc32/tools/makefile_templates/qt/
+../../mkspecs/symbian-sbsv2/flm/qt/qmake_extra_pre_targetdep.flm /epoc32/tools/makefile_templates/qt/
+../../mkspecs/symbian-sbsv2/flm/qt/qmake_post_link.flm /epoc32/tools/makefile_templates/qt/
+../../mkspecs/symbian-sbsv2/flm/qt/qmake_store_build.flm /epoc32/tools/makefile_templates/qt/
+../../mkspecs/symbian-sbsv2/flm/qt/qt.xml /epoc32/tools/makefile_templates/qt/
+
+qt.conf /epoc32/tools/qt.conf
+
+/* export platform specific configuration */
+
+platform_paths.prf /epoc32/include/
+data_caging_paths.prf /epoc32/include/
+non_foundation_paths.prf /epoc32/include/
+
+environment.prf /epoc32/tools/qt/mkspecs/features/environment.prf
+
+//for loc
+loc.prf /epoc32/tools/qt/mkspecs/features/loc.prf
+
+//For UDA image
+confml/qt.confml CONFML_EXPORT_PATH(qt.confml,uda_content)
+implml/qt_copy.implml CRML_EXPORT_PATH(qt_copy.implml,uda_content)
+content/apps/qt.sisx CRML_EXPORT_PATH(../content/sis/,uda_content)
+content/apps/qt_stub.sis /epoc32/data/z/system/install/qt_stub.sis
+
+//tools
+../../bin/createpackage.bat /epoc32/tools/createpackage.bat
+../../bin/createpackage.pl /epoc32/tools/createpackage.pl
+../../bin/patch_capabilities.bat /epoc32/tools/patch_capabilities.bat
+../../bin/patch_capabilities.pl /epoc32/tools/patch_capabilities.pl
+
+
+/* export localization *.ts files */
+translations/qt_ur.ts /epoc32/include/platform/qt/translations/
+translations/qt_fa.ts /epoc32/include/platform/qt/translations/
+translations/qt_ar.ts /epoc32/include/platform/qt/translations/
+translations/qt_he.ts /epoc32/include/platform/qt/translations/
+
+translations/qt_fr_symbian.ts /epoc32/include/platform/qt/translations/qt_fr.ts
+translations/qt_pl_symbian.ts /epoc32/include/platform/qt/translations/qt_pl.ts
+translations/qt_ru_symbian.ts /epoc32/include/platform/qt/translations/qt_ru.ts
+translations/qt_zh_cn_symbian.ts /epoc32/include/platform/qt/translations/qt_zh_cn.ts
+translations/qt_zh_tw_symbian.ts /epoc32/include/platform/qt/translations/qt_zh_tw.ts
+
+../../translations/qt_ar.ts /epoc32/include/platform/qt/translations/
+../../translations/qt_cs.ts /epoc32/include/platform/qt/translations/
+../../translations/qt_da.ts /epoc32/include/platform/qt/translations/
+../../translations/qt_de.ts /epoc32/include/platform/qt/translations/
+../../translations/qt_es.ts /epoc32/include/platform/qt/translations/
+../../translations/qt_gl.ts /epoc32/include/platform/qt/translations/
+../../translations/qt_hu.ts /epoc32/include/platform/qt/translations/
+../../translations/qt_ja.ts /epoc32/include/platform/qt/translations/
+../../translations/qt_pt.ts /epoc32/include/platform/qt/translations/
+../../translations/qt_sk.ts /epoc32/include/platform/qt/translations/
+../../translations/qt_sl.ts /epoc32/include/platform/qt/translations/
+../../translations/qt_sv.ts /epoc32/include/platform/qt/translations/
+../../translations/qt_uk.ts /epoc32/include/platform/qt/translations/
+
+
+PRJ_MMPFILES
+
+
+PRJ_TESTMMPFILES
+
+
+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
+END \ No newline at end of file
diff --git a/config.profiles/symbian/confml/qt.confml b/config.profiles/symbian/confml/qt.confml
new file mode 100644
index 0000000..f5e9a49
--- /dev/null
+++ b/config.profiles/symbian/confml/qt.confml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2">
+ <confml:feature name="QT" ref="qt">
+ <confml:desc>QT settings</confml:desc>
+ <confml:setting name="QT enabled"
+ ref="Enabled"
+ type="boolean">
+ <confml:desc>To enable QT usage</confml:desc>
+ </confml:setting>
+ </confml:feature>
+ <confml:data>
+ <confml:qt>
+ <confml:Enabled>true</confml:Enabled>
+ </confml:qt>
+ </confml:data>
+</confml:configuration> \ No newline at end of file
diff --git a/config.profiles/symbian/data_caging_paths.prf b/config.profiles/symbian/data_caging_paths.prf
new file mode 100644
index 0000000..8bb0f79
--- /dev/null
+++ b/config.profiles/symbian/data_caging_paths.prf
@@ -0,0 +1,71 @@
+#
+# ==============================================================================
+# Name : data_caging_paths.prf
+# Part of :
+# Interface : Data Caging Path Definitions API for Qt/S60
+# Description : Paths specific to Symbian^3 and later
+#
+# Usage examples:
+#
+# # Load these definitions on pro-file if needed:
+# load(data_caging_paths)
+#
+# # These variables are mostly useful when specifying deployment
+#
+# myLib.sources = myLib.dll
+# myLib.path = $$SHARED_LIB_DIR
+# DEPLOYMENT += myLib
+#
+# # Note: Do not use $$PLUGINS_DIR or $$PLUGINS_1_DIR to deploy Qt plugins.
+# # $$QT_PUBLIC_PLUGINS_BASE specifies the public base directory for Qt
+# # plugin stubs:
+#
+# myPublicImageFormatPlugin.sources = myImageFormat.dll
+# myPublicImageFormatPlugin.path = $$QT_PLUGINS_BASE_DIR/imageformats
+# DEPLOYMENT += myPublicImageFormatPlugin
+#
+# ==============================================================================
+
+APPARC_RECOGNISER_RESOURCES_DIR = /resource/apps/registrationresourcefiles
+APP_BITMAP_DIR = /resource/apps
+APP_RESOURCE_DIR = /resource/apps
+BITMAP_DIR = /resource/apps
+BIOFILE_DIR = /resource/messaging/bif
+CHARCONV_PLUGIN_DIR = /resource/charconv
+CONTACTS_RESOURCE_DIR = /resource/cntmodel
+CTRL_PANEL_RESOURCE_DIR = /resource/controls
+CONVERTER_PLUGIN_RESOURCE_DIR = /resource/convert
+ECOM_RESOURCE_DIR = /resource/plugins
+ERROR_RESOURCE_DIR = /resource/errors
+PROGRAMS_DIR = /sys/bin
+FEP_RESOURCES_DIR = /resource/fep
+HELP_FILE_DIR = /resource/help
+LOG_ENGINE_RESOURCE_DIR = /resource/logengine
+MTM_RESOURCE_DIR = /resource/messaging
+MTM_INFO_FILE_DIR = /resource/messaging/mtm
+PRINTER_DRIVER_DIR = /resource/printers
+SHARED_LIB_DIR = /sys/bin
+UIKLAF_RESOURCE_DIR = /resource/uiklaf
+WAPPUSH_PLUGIN_RESOURCE_DIR = /resource/messaging/wappush
+WATCHER_PLUGIN_RESOURCE_DIR = /resource/messaging/watchers
+RECOGNISERS_DIR = /sys/bin
+PARSERS_DIR = /sys/bin
+NOTIFIERS_DIR = /sys/bin
+PLUGINS_DIR = /sys/bin
+PLUGINS_1_DIR = /sys/bin
+RESOURCE_FILES_DIR = /resource
+
+CA_CERTIFICATES_DIR = /private/101f72a6
+COMMDB_DIR = /private/100012a5
+SS_CONFIG_FILE_DIR = /private/101f7989/esock
+TRUSTED_FONTS_DIR = /private/10003a16/fonts
+UNTRUSTED_FONT_DIR = /private/10003a16/import/fonts
+WINDOW_SERVER_INI_DIR = /private/10003b20
+SKINS_DIR = /private/10207114
+BOOTDATA_DIR = /resource/bootdata
+
+isEmpty(QT_PLUGINS_BASE_DIR): QT_PLUGINS_BASE_DIR = $$RESOURCE_FILES_DIR/qt$${QT_LIBINFIX}/plugins
+isEmpty(QT_IMPORTS_BASE_DIR): QT_IMPORTS_BASE_DIR = $$RESOURCE_FILES_DIR/qt/imports
+isEmpty(HW_ZDIR): HW_ZDIR = epoc32/data/z
+isEmpty(REG_RESOURCE_DIR): REG_RESOURCE_DIR = /private/10003a3f/apps
+isEmpty(REG_RESOURCE_IMPORT_DIR): REG_RESOURCE_IMPORT_DIR = /private/10003a3f/import/apps
diff --git a/config.profiles/symbian/environment.prf b/config.profiles/symbian/environment.prf
new file mode 100644
index 0000000..09ba90d
--- /dev/null
+++ b/config.profiles/symbian/environment.prf
@@ -0,0 +1,9 @@
+# don't export SQLite on Symbian^3 onwards since it is already in the environment
+CONFIG *= symbian_no_export_sqlite
+
+# STL autodetection in clean builds not working, specify it explicitly
+CONFIG *= stl
+
+
+S60_VERSION = 5.2
+SYMBIAN_VERSION = Symbian3 \ No newline at end of file
diff --git a/config.profiles/symbian/headerexport b/config.profiles/symbian/headerexport
new file mode 100644
index 0000000..e9e6f3b
--- /dev/null
+++ b/config.profiles/symbian/headerexport
@@ -0,0 +1,1138 @@
+#!/usr/bin/perl -w
+######################################################################
+#
+# Synchronizes Qt header files - internal development tool.
+#
+# Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+# Contact: Nokia Corporation (qt-info@nokia.com)
+#
+######################################################################
+
+# use packages -------------------------------------------------------
+use File::Basename;
+use File::Path;
+use Cwd;
+use Config;
+use strict;
+
+for (my $i = 0; $i < $#ARGV; $i++) {
+ if ($ARGV[$i] eq "-base-dir" && $i < $#ARGV - 1) {
+ $ENV{"QTDIR"} = $ARGV[$i + 1];
+ last;
+ }
+}
+
+die "syncqt: QTDIR not defined" if ! $ENV{"QTDIR"}; # sanity check
+
+# global variables
+my $isunix = 0;
+my $basedir = $ENV{"QTDIR"};
+$basedir =~ s=\\=/=g;
+my %modules = ( # path to module name map
+ "QtGui" => "$basedir/src/gui",
+ "QtOpenGL" => "$basedir/src/opengl",
+ "QtOpenVG" => "$basedir/src/openvg",
+ "QtCore" => "$basedir/src/corelib",
+ "QtXml" => "$basedir/src/xml",
+ "QtXmlPatterns" => "$basedir/src/xmlpatterns",
+ "QtSql" => "$basedir/src/sql",
+ "QtNetwork" => "$basedir/src/network",
+ "QtSvg" => "$basedir/src/svg",
+ "QtDeclarative" => "$basedir/src/declarative",
+ "QtScript" => "$basedir/src/script",
+ "QtScriptTools" => "$basedir/src/scripttools",
+ "Qt3Support" => "$basedir/src/qt3support",
+ "ActiveQt" => "$basedir/src/activeqt",
+ "QtTest" => "$basedir/src/testlib",
+ "QtHelp" => "$basedir/tools/assistant/lib",
+ "QtDesigner" => "$basedir/tools/designer/src/lib",
+ "QtUiTools" => "$basedir/tools/designer/src/uitools",
+ "QtDBus" => "$basedir/src/dbus",
+# "QtWebKit" => "$basedir/src/3rdparty/webkit/WebCore", // :TODO:disabled since QtWebKit built separately, better logic needed here.
+ "phonon" => "$basedir/src/phonon",
+ "QtMultimedia" => "$basedir/src/multimedia",
+ "QtMeeGoGraphicsSystemHelper" => "$basedir/tools/qmeegographicssystemhelper",
+);
+my %moduleheaders = ( # restrict the module headers to those found in relative path
+ "QtWebKit" => "../WebKit/qt/Api",
+ "phonon" => "../3rdparty/phonon/phonon",
+);
+
+#$modules{"QtCore"} .= ";$basedir/mkspecs/" . $ENV{"MKSPEC"} if defined $ENV{"MKSPEC"};
+
+# global variables (modified by options)
+my $module = 0;
+my $showonly = 0;
+my $quiet = 0;
+my $remove_stale = 1;
+my $force_win = 0;
+my $force_relative = 0;
+my $check_includes = 0;
+my $copy_headers = 0;
+my $create_uic_class_map = 1;
+my $create_private_headers = 1;
+my $oneway = 0;
+my @modules_to_sync ;
+$force_relative = 1 if ( -d "/System/Library/Frameworks" );
+my $out_basedir = $basedir;
+$out_basedir =~ s=\\=/=g;
+my $out_subdir = 'include';
+
+# functions ----------------------------------------------------------
+
+######################################################################
+# Syntax: showUsage()
+# Params: -none-
+#
+# Purpose: Show the usage of the script.
+# Returns: -none-
+######################################################################
+sub showUsage
+{
+ print "$0 usage:\n";
+ print " -copy Copy headers instead of include-fwd(default: " . ($copy_headers ? "yes" : "no") . ")\n";
+ print " -remove-stale Removes stale headers (default: " . ($remove_stale ? "yes" : "no") . ")\n";
+ print " -relative Force relative symlinks (default: " . ($force_relative ? "yes" : "no") . ")\n";
+ print " -windows Force platform to Windows (default: " . ($force_win ? "yes" : "no") . ")\n";
+ print " -showonly Show action but not perform (default: " . ($showonly ? "yes" : "no") . ")\n";
+ print " -outdir <PATH> Specify output directory for sync (default: $out_basedir)\n";
+ print " -outsubdir <DIR> Target subdir under outdir (default: $out_subdir)\n";
+ print " -public Create only public headers (default: " . ($create_private_headers ? "no" : "yes") . ")\n";
+ print " -oneway Don't sync back from outdir (default: " . ($oneway ? "yes" : "no") . ")\n";
+ print " -quiet Only report problems, not activity (default: " . ($quiet ? "yes" : "no") . ")\n";
+ print " -separate-module <NAME>:<PROFILEDIR>:<HEADERDIR> Create headers for <NAME> with original headers in <HEADERDIR> relative to <PROFILEDIR> \n";
+ print " -help This help\n";
+ exit 0;
+}
+
+######################################################################
+# Syntax: checkUnix()
+# Params: -none-
+#
+# Purpose: Check if script runs on a Unix system or not. Cygwin
+# systems are _not_ detected as Unix systems.
+# Returns: 1 if a unix system, else 0.
+######################################################################
+sub checkUnix {
+ my ($r) = 0;
+ if ( $force_win != 0) {
+ return 0;
+ } elsif ( -f "/bin/uname" ) {
+ $r = 1;
+ (-f "\\bin\\uname") && ($r = 0);
+ } elsif ( -f "/usr/bin/uname" ) {
+ $r = 1;
+ (-f "\\usr\\bin\\uname") && ($r = 0);
+ }
+ if($r) {
+ $_ = $Config{'osname'};
+ $r = 0 if( /(ms)|(cyg)win/i );
+ }
+ return $r;
+}
+
+sub checkRelative {
+ my ($dir) = @_;
+ return 0 if($dir =~ /^\//);
+ return 0 if(!checkUnix() && $dir =~ /[a-zA-Z]:[\/\\]/);
+ return 1;
+}
+
+######################################################################
+# Syntax: shouldMasterInclude(iheader)
+# Params: iheader, string, filename to verify inclusion
+#
+# Purpose: Determines if header should be in the master include file.
+# Returns: 0 if file contains "#pragma qt_no_master_include" or not
+# able to open, else 1.
+######################################################################
+sub shouldMasterInclude {
+ my ($iheader) = @_;
+ return 0 if(basename($iheader) =~ /_/);
+ return 0 if(basename($iheader) =~ /qconfig/);
+ if(open(F, "<$iheader")) {
+ while(<F>) {
+ chomp;
+ return 0 if(/^\#pragma qt_no_master_include$/);
+ }
+ close(F);
+ } else {
+ return 0;
+ }
+ return 1;
+}
+
+######################################################################
+# Syntax: classNames(iheader)
+# Params: iheader, string, filename to parse for classname "symlinks"
+#
+# Purpose: Scans through iheader to find all classnames that should be
+# synced into library's include structure.
+# Returns: List of all class names in a file.
+######################################################################
+sub classNames {
+ my @ret;
+ my ($iheader) = @_;
+ if(basename($iheader) eq "qglobal.h") {
+ push @ret, "QtGlobal";
+ } elsif(basename($iheader) eq "qendian.h") {
+ push @ret, "QtEndian";
+ } elsif(basename($iheader) eq "qconfig.h") {
+ push @ret, "QtConfig";
+ } elsif(basename($iheader) eq "qplugin.h") {
+ push @ret, "QtPlugin";
+ } elsif(basename($iheader) eq "qalgorithms.h") {
+ push @ret, "QtAlgorithms";
+ } elsif(basename($iheader) eq "qcontainerfwd.h") {
+ push @ret, "QtContainerFwd";
+ } elsif(basename($iheader) eq "qdebug.h") {
+ push @ret, "QtDebug";
+ } elsif(basename($iheader) eq "qevent.h") {
+ push @ret, "QtEvents";
+ } elsif(basename($iheader) eq "qnamespace.h") {
+ push @ret, "Qt"
+ } elsif(basename($iheader) eq "qssl.h") {
+ push @ret, "QSsl";
+ } elsif(basename($iheader) eq "qtest.h") {
+ push @ret, "QTest"
+ } elsif(basename($iheader) eq "qtconcurrentmap.h") {
+ push @ret, "QtConcurrentMap"
+ } elsif(basename($iheader) eq "qtconcurrentfilter.h") {
+ push @ret, "QtConcurrentFilter"
+ } elsif(basename($iheader) eq "qtconcurrentrun.h") {
+ push @ret, "QtConcurrentRun"
+ } elsif(basename($iheader) eq "qaudio.h") {
+ push @ret, "QAudio"
+ }
+
+ my $parsable = "";
+ if(open(F, "<$iheader")) {
+ while(<F>) {
+ my $line = $_;
+ chomp $line;
+ chop $line if ($line =~ /\r$/);
+ if($line =~ /^\#/) {
+ if($line =~ /\\$/) {
+ while($line = <F>) {
+ chomp $line;
+ last unless($line =~ /\\$/);
+ }
+ }
+ return @ret if($line =~ m/^#pragma qt_sync_stop_processing/);
+ push(@ret, $1) if($line =~ m/^#pragma qt_class\(([^)]*)\)[\r\n]*$/);
+ $line = 0;
+ }
+ if($line) {
+ $line =~ s,//.*$,,; #remove c++ comments
+ $line .= ";" if($line =~ m/^Q_[A-Z_]*\(.*\)[\r\n]*$/); #qt macro
+ $line .= ";" if($line =~ m/^QT_(BEGIN|END)_HEADER[\r\n]*$/); #qt macro
+ $line .= ";" if($line =~ m/^QT_(BEGIN|END)_NAMESPACE[\r\n]*$/); #qt macro
+ $line .= ";" if($line =~ m/^QT_MODULE\(.*\)[\r\n]*$/); # QT_MODULE macro
+ $parsable .= " " . $line;
+ }
+ }
+ close(F);
+ }
+
+ my $last_definition = 0;
+ my @namespaces;
+ for(my $i = 0; $i < length($parsable); $i++) {
+ my $definition = 0;
+ my $character = substr($parsable, $i, 1);
+ if($character eq "/" && substr($parsable, $i+1, 1) eq "*") { #I parse like this for greedy reasons
+ for($i+=2; $i < length($parsable); $i++) {
+ my $end = substr($parsable, $i, 2);
+ if($end eq "*/") {
+ $last_definition = $i+2;
+ $i++;
+ last;
+ }
+ }
+ } elsif($character eq "{") {
+ my $brace_depth = 1;
+ my $block_start = $i + 1;
+ BLOCK: for($i+=1; $i < length($parsable); $i++) {
+ my $ignore = substr($parsable, $i, 1);
+ if($ignore eq "{") {
+ $brace_depth++;
+ } elsif($ignore eq "}") {
+ $brace_depth--;
+ unless($brace_depth) {
+ for(my $i2 = $i+1; $i2 < length($parsable); $i2++) {
+ my $end = substr($parsable, $i2, 1);
+ if($end eq ";" || $end ne " ") {
+ $definition = substr($parsable, $last_definition, $block_start - $last_definition) . "}";
+ $i = $i2 if($end eq ";");
+ $last_definition = $i + 1;
+ last BLOCK;
+ }
+ }
+ }
+ }
+ }
+ } elsif($character eq ";") {
+ $definition = substr($parsable, $last_definition, $i - $last_definition + 1);
+ $last_definition = $i + 1;
+ } elsif($character eq "}") {
+ # a naked } must be a namespace ending
+ # if it's not a namespace, it's eaten by the loop above
+ pop @namespaces;
+ $last_definition = $i + 1;
+ }
+
+ if (substr($parsable, $last_definition, $i - $last_definition + 1) =~ m/ namespace ([^ ]*) /
+ && substr($parsable, $i+1, 1) eq "{") {
+ push @namespaces, $1;
+
+ # Eat the opening { so that the condensing loop above doesn't see it
+ $i++;
+ $last_definition = $i + 1;
+ }
+
+ if($definition) {
+ $definition =~ s=[\n\r]==g;
+ my @symbols;
+ if($definition =~ m/^ *typedef *.*\(\*([^\)]*)\)\(.*\);$/) {
+ push @symbols, $1;
+ } elsif($definition =~ m/^ *typedef +(.*) +([^ ]*);$/) {
+ push @symbols, $2;
+ } elsif($definition =~ m/^ *(template *<.*> *)?(class|struct) +([^ ]* +)?([^<\s]+) ?(<[^>]*> ?)?\s*((,|:)\s*(public|protected|private) *.*)? *\{\}$/) {
+ push @symbols, $4;
+ } elsif($definition =~ m/^ *Q_DECLARE_.*ITERATOR\((.*)\);$/) {
+ push @symbols, "Q" . $1 . "Iterator";
+ push @symbols, "QMutable" . $1 . "Iterator";
+ }
+
+ foreach my $symbol (@symbols) {
+ $symbol = (join("::", @namespaces) . "::" . $symbol) if (scalar @namespaces);
+ push @ret, $symbol
+ if ($symbol =~ /^Q[^:]*$/ # no-namespace, starting with Q
+ || $symbol =~ /^Phonon::/); # or in the Phonon namespace
+ }
+ }
+ }
+ return @ret;
+}
+
+######################################################################
+# Syntax: syncHeader(header, iheader, copy, timestamp)
+# 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) = @_;
+ $iheader =~ s=\\=/=g;
+ $header =~ s=\\=/=g;
+ return copyFile($iheader, $header) if($copy);
+
+ unless(-e $header) {
+ my $header_dir = dirname($header);
+ mkpath $header_dir, !$quiet;
+
+ #write it
+ my $iheader_out = fixPaths($iheader, $header_dir);
+ 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;
+}
+
+######################################################################
+# Syntax: fixPaths(file, dir)
+# Params: file, string, filepath to be made relative to dir
+# dir, string, dirpath for point of origin
+#
+# Purpose: file is made relative (if possible) of dir.
+# Returns: String with the above applied conversion.
+######################################################################
+sub fixPaths {
+ my ($file, $dir) = @_;
+ $dir =~ s=^$basedir/=$out_basedir/= if(!($basedir eq $out_basedir));
+ $file =~ s=\\=/=g;
+ $file =~ s/\+/\\+/g;
+ $dir =~ s=\\=/=g;
+ $dir =~ s/\+/\\+/g;
+
+ #setup
+ my $ret = $file;
+ $ret =~ s,/cygdrive/([a-zA-Z])/,$1:/,g;
+ my $file_dir = dirname($file);
+ if($file_dir eq ".") {
+ $file_dir = getcwd();
+ $file_dir =~ s=\\=/=g;
+ }
+ $file_dir =~ s,/cygdrive/([a-zA-Z])/,$1:/,g;
+ if($dir eq ".") {
+ $dir = getcwd();
+ $dir =~ s=\\=/=g;
+ }
+ $dir =~ s,/cygdrive/([a-zA-Z])/,$1:/,g;
+ return basename($file) if($file_dir eq $dir);
+
+ #guts
+ my $match_dir = 0;
+ for(my $i = 1; $i < length($file_dir); $i++) {
+ my $slash = index($file_dir, "/", $i);
+ last if($slash == -1);
+ my $tmp = substr($file_dir, 0, $slash);
+ last unless($dir =~ m,^$tmp/,);
+ $match_dir = $tmp;
+ $i = $slash;
+ }
+ if($match_dir) {
+ my $after = substr($dir, length($match_dir));
+ my $count = ($after =~ tr,/,,);
+ my $dots = "";
+ for(my $i = 0; $i < $count; $i++) {
+ $dots .= "../";
+ }
+ $ret =~ s,^$match_dir,$dots,;
+ }
+ $ret =~ s,/+,/,g;
+ return $ret;
+}
+
+######################################################################
+# Syntax: fileContents(filename)
+# Params: filename, string, filename of file to return contents
+#
+# Purpose: Get the contents of a file.
+# Returns: String with contents of the file, or empty string if file
+# doens't exist.
+# Warning: Dies if it does exist but script cannot get read access.
+######################################################################
+sub fileContents {
+ my ($filename) = @_;
+ my $filecontents = "";
+ if (-e $filename) {
+ open(I, "< $filename") || die "Could not open $filename for reading, read block?";
+ local $/;
+ binmode I;
+ $filecontents = <I>;
+ close I;
+ }
+ return $filecontents;
+}
+
+######################################################################
+# Syntax: fileCompare(file1, file2)
+# Params: file1, string, filename of first file
+# file2, string, filename of second file
+#
+# Purpose: Determines if files are equal, and which one is newer.
+# Returns: 0 if files are equal no matter the timestamp, -1 if file1
+# is newer, 1 if file2 is newer.
+######################################################################
+sub fileCompare {
+ my ($file1, $file2) = @_;
+ my $file1contents = fileContents($file1);
+ my $file2contents = fileContents($file2);
+ if (! -e $file1) { return 1; }
+ if (! -e $file2) { return -1; }
+ return $file1contents ne $file2contents ? (stat($file2))[9] <=> (stat($file1))[9] : 0;
+}
+
+######################################################################
+# Syntax: copyFile(file, ifile)
+# Params: file, string, filename to create duplicate for
+# ifile, string, destination name of duplicate
+#
+# Purpose: Keeps files in sync so changes in the newer file will be
+# written to the other.
+# Returns: 1 if files were synced, else 0.
+# Warning: Dies if script cannot get write access.
+######################################################################
+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;
+}
+
+######################################################################
+# Syntax: symlinkFile(file, ifile)
+# Params: file, string, filename to create "symlink" for
+# ifile, string, destination name of symlink
+#
+# Purpose: File is symlinked to ifile (or copied if filesystem doesn't
+# support symlink).
+# Returns: 1 on success, else 0.
+######################################################################
+sub symlinkFile
+{
+ my ($file,$ifile) = @_;
+
+ if ($isunix) {
+ print "symlink created for $file " unless $quiet;
+ if ( $force_relative && ($ifile =~ /^$basedir/)) {
+ my $t = getcwd();
+ my $c = -1;
+ my $p = "../";
+ $t =~ s-^$basedir/--;
+ $p .= "../" while( ($c = index( $t, "/", $c + 1)) != -1 );
+ $file =~ s-^$basedir/-$p-;
+ print " ($file)\n" unless $quiet;
+ }
+ print "\n" unless $quiet;
+ return symlink($file, $ifile);
+ }
+ return copyFile($file, $ifile);
+}
+
+######################################################################
+# Syntax: findFiles(dir, match, descend)
+# Params: dir, string, directory to search for name
+# match, string, regular expression to match in dir
+# descend, integer, 0 = non-recursive search
+# 1 = recurse search into subdirectories
+#
+# Purpose: Finds files matching a regular expression.
+# Returns: List of matching files.
+#
+# Examples:
+# findFiles("/usr","\.cpp$",1) - finds .cpp files in /usr and below
+# findFiles("/tmp","^#",0) - finds #* files in /tmp
+######################################################################
+sub findFiles {
+ my ($dir,$match,$descend) = @_;
+ my ($file,$p,@files);
+ local(*D);
+ $dir =~ s=\\=/=g;
+ ($dir eq "") && ($dir = ".");
+ if ( opendir(D,$dir) ) {
+ if ( $dir eq "." ) {
+ $dir = "";
+ } else {
+ ($dir =~ /\/$/) || ($dir .= "/");
+ }
+ foreach $file ( sort readdir(D) ) {
+ next if ( $file =~ /^\.\.?$/ );
+ $p = $file;
+ ($file =~ /$match/) && (push @files, $p);
+ if ( $descend && -d $p && ! -l $p ) {
+ push @files, &findFiles($p,$match,$descend);
+ }
+ }
+ closedir(D);
+ }
+ return @files;
+}
+
+# --------------------------------------------------------------------
+# "main" function
+# --------------------------------------------------------------------
+
+while ( @ARGV ) {
+ my $var = 0;
+ my $val = 0;
+
+ #parse
+ my $arg = shift @ARGV;
+ if ($arg eq "-h" || $arg eq "-help" || $arg eq "?") {
+ $var = "show_help";
+ $val = "yes";
+ } elsif($arg eq "-copy") {
+ $var = "copy";
+ $val = "yes";
+ } elsif($arg eq "-o" || $arg eq "-outdir") {
+ $var = "output";
+ $val = shift @ARGV;
+ } elsif($arg eq "-showonly" || $arg eq "-remove-stale" || $arg eq "-windows" ||
+ $arg eq "-relative" || $arg eq "-check-includes") {
+ $var = substr($arg, 1);
+ $val = "yes";
+ } elsif($arg =~ /^-no-(.*)$/) {
+ $var = $1;
+ $val = "no";
+ #these are for commandline compat
+ } elsif($arg eq "-inc") {
+ $var = "output";
+ $val = shift @ARGV;
+ } elsif($arg eq "-module") {
+ $var = "module";
+ $val = shift @ARGV;
+ } elsif($arg eq "-separate-module") {
+ $var = "separate-module";
+ $val = shift @ARGV;
+ } elsif($arg eq "-show") {
+ $var = "showonly";
+ $val = "yes";
+ } elsif($arg eq "-quiet") {
+ $var = "quiet";
+ $val = "yes";
+ } elsif($arg eq "-base-dir") {
+ # skip, it's been dealt with at the top of the file
+ shift @ARGV;
+ next;
+ } elsif("$arg" eq "-outsubdir") {
+ $var = "outsubdir";
+ $val = shift @ARGV;
+ } elsif("$arg" eq "-public") {
+ $var = "public";
+ $val = "yes";
+ } elsif("$arg" eq "-oneway") {
+ $var = "oneway";
+ $val = "yes";
+ }
+
+ #do something
+ if(!$var || $var eq "show_help") {
+ print "Unknown option: $arg\n\n" if(!$var);
+ showUsage();
+ } elsif ($var eq "copy") {
+ if($val eq "yes") {
+ $copy_headers++;
+ } elsif($showonly) {
+ $copy_headers--;
+ }
+ } elsif ($var eq "showonly") {
+ if($val eq "yes") {
+ $showonly++;
+ } elsif($showonly) {
+ $showonly--;
+ }
+ } elsif ($var eq "quiet") {
+ if($val eq "yes") {
+ $quiet++;
+ } elsif($quiet) {
+ $quiet--;
+ }
+ } elsif ($var eq "check-includes") {
+ if($val eq "yes") {
+ $check_includes++;
+ } elsif($check_includes) {
+ $check_includes--;
+ }
+ } elsif ($var eq "remove-stale") {
+ if($val eq "yes") {
+ $remove_stale++;
+ } elsif($remove_stale) {
+ $remove_stale--;
+ }
+ } elsif ($var eq "windows") {
+ if($val eq "yes") {
+ $force_win++;
+ } elsif($force_win) {
+ $force_win--;
+ }
+ } elsif ($var eq "relative") {
+ if($val eq "yes") {
+ $force_relative++;
+ } elsif($force_relative) {
+ $force_relative--;
+ }
+ } elsif ("$var" eq "public") {
+ $create_private_headers = ("$val" eq "yes" ? 0 : 1);
+ } elsif ("$var" eq "oneway") {
+ $oneway = ("$val" eq "yes" ? 1 : 0);
+ } elsif ("$var" eq "outsubdir") {
+ $out_subdir = $val;
+ } elsif ($var eq "module") {
+ print "module :$val:\n" unless $quiet;
+ die "No such module: $val" unless(defined $modules{$val});
+ push @modules_to_sync, $val;
+ } elsif ($var eq "separate-module") {
+ my ($module, $prodir, $headerdir) = split(/:/, $val);
+ $modules{$module} = $prodir;
+ push @modules_to_sync, $module;
+ $moduleheaders{$module} = $headerdir;
+ $create_uic_class_map = 0;
+ $create_private_headers = 0;
+ } elsif ($var eq "output") {
+ my $outdir = $val;
+ if(checkRelative($outdir)) {
+ $out_basedir = getcwd();
+ chomp $out_basedir;
+ $out_basedir .= "/" . $outdir;
+ } else {
+ $out_basedir = $outdir;
+ }
+ # \ -> /
+ $out_basedir =~ s=\\=/=g;
+ }
+}
+@modules_to_sync = keys(%modules) if($#modules_to_sync == -1);
+
+$isunix = checkUnix; #cache checkUnix
+
+# create path
+mkpath "$out_basedir/include", !$quiet;
+mkpath "$out_basedir/$out_subdir/Qt", !$quiet;
+
+my @ignore_headers = ();
+my $class_lib_map_contents = "";
+my @ignore_for_master_contents = ( "qt.h", "qpaintdevicedefs.h" );
+my @ignore_for_include_check = ( "qatomic.h" );
+my @ignore_for_qt_begin_header_check = ( "qiconset.h", "qconfig.h", "qconfig-dist.h", "qconfig-large.h", "qconfig-medium.h", "qconfig-minimal.h", "qconfig-small.h", "qfeatures.h", "qt_windows.h" );
+my @ignore_for_qt_begin_namespace_check = ( "qconfig.h", "qconfig-dist.h", "qconfig-large.h", "qconfig-medium.h", "qconfig-minimal.h", "qconfig-small.h", "qfeatures.h", "qatomic_arch.h", "qatomic_windowsce.h", "qt_windows.h", "qatomic_macosx.h" );
+my @ignore_for_qt_module_check = ( "$modules{QtCore}/arch", "$modules{QtCore}/global", "$modules{QtSql}/drivers", "$modules{QtTest}", "$modules{QtDesigner}", "$modules{QtUiTools}", "$modules{QtDBus}", "$modules{phonon}" );
+my %colliding_headers = ();
+my %inject_headers;
+# Force generation of forwarding header for qconfig.h if (and only if) we can't
+# find the header by normal means.
+%inject_headers = ( "$basedir/src/corelib/global" => ( "*qconfig.h" ) ) unless (-e "$basedir/src/corelib/global/qconfig.h");
+
+foreach my $lib (@modules_to_sync) {
+ #iteration info
+ my $dir = $modules{$lib};
+ my $pathtoheaders = "";
+ $pathtoheaders = $moduleheaders{$lib} if ($moduleheaders{$lib});
+
+ #information used after the syncing
+ my $pri_install_classes = "";
+ my $pri_install_files = "";
+ my $pri_install_pfiles = "";
+
+ my $libcapitals = $lib;
+ $libcapitals =~ y/a-z/A-Z/;
+ my $master_contents = "#ifndef QT_".$libcapitals."_MODULE_H\n#define QT_".$libcapitals."_MODULE_H\n";
+
+ #get dependencies
+ if(-e "$dir/" . basename($dir) . ".pro") {
+ if(open(F, "<$dir/" . basename($dir) . ".pro")) {
+ while(my $line = <F>) {
+ chomp $line;
+ if($line =~ /^ *QT *\+?= *([^\r\n]*)/) {
+ foreach(split(/ /, $1)) {
+ $master_contents .= "#include <QtCore/QtCore>\n" if($_ eq "core");
+ $master_contents .= "#include <QtGui/QtGui>\n" if($_ eq "gui");
+ $master_contents .= "#include <QtNetwork/QtNetwork>\n" if($_ eq "network");
+ $master_contents .= "#include <QtSvg/QtSvg>\n" if($_ eq "svg");
+ $master_contents .= "#include <QtDeclarative/QtDeclarative>\n" if($_ eq "declarative");
+ $master_contents .= "#include <QtScript/QtScript>\n" if($_ eq "script");
+ $master_contents .= "#include <QtScriptTools/QtScriptTools>\n" if($_ eq "scripttools");
+ $master_contents .= "#include <Qt3Support/Qt3Support>\n" if($_ eq "qt3support");
+ $master_contents .= "#include <QtSql/QtSql>\n" if($_ eq "sql");
+ $master_contents .= "#include <QtXml/QtXml>\n" if($_ eq "xml");
+ $master_contents .= "#include <QtXmlPatterns/QtXmlPatterns>\n" if($_ eq "xmlpatterns");
+ $master_contents .= "#include <QtOpenGL/QtOpenGL>\n" if($_ eq "opengl");
+ $master_contents .= "#include <QtOpenVG/QtOpenVG>\n" if($_ eq "openvg");
+ }
+ }
+ }
+ close(F);
+ }
+ }
+
+ #remove the old files
+ if($remove_stale) {
+ my @subdirs = ("$out_basedir/$out_subdir/$lib");
+ foreach my $subdir (@subdirs) {
+ if (opendir DIR, $subdir) {
+ while(my $t = readdir(DIR)) {
+ my $file = "$subdir/$t";
+ if(-d $file) {
+ push @subdirs, $file unless($t eq "." || $t eq "..");
+ } else {
+ my @files = ($file);
+ #push @files, "$out_basedir/$out_subdir/Qt/$t" if(-e "$out_basedir/$out_subdir/Qt/$t");
+ foreach my $file (@files) {
+ my $remove_file = 0;
+ if(open(F, "<$file")) {
+ while(my $line = <F>) {
+ chomp $line;
+ if($line =~ /^\#include \"([^\"]*)\"$/) {
+ my $include = $1;
+ $include = $subdir . "/" . $include unless(substr($include, 0, 1) eq "/");
+ $remove_file = 1 unless(-e $include);
+ } else {
+ $remove_file = 0;
+ last;
+ }
+ }
+ close(F);
+ unlink $file if($remove_file);
+ }
+ }
+ }
+ }
+ closedir DIR;
+ }
+
+ }
+ }
+
+ #create the new ones
+ foreach my $current_dir (split(/;/, $dir)) {
+ my $headers_dir = $current_dir;
+ $headers_dir .= "/$pathtoheaders" if ($pathtoheaders);
+ #calc subdirs
+ my @subdirs = ($headers_dir);
+ foreach my $subdir (@subdirs) {
+ opendir DIR, $subdir or next;
+ while(my $t = readdir(DIR)) {
+ push @subdirs, "$subdir/$t" if(-d "$subdir/$t" && !($t eq ".") &&
+ !($t eq "..") && !($t eq ".obj") &&
+ !($t eq ".moc") && !($t eq ".rcc") &&
+ !($t eq ".uic") && !($t eq "build"));
+ }
+ closedir DIR;
+ }
+
+ #calc files and "copy" them
+ foreach my $subdir (@subdirs) {
+ my @headers = findFiles($subdir, "^[-a-z0-9_]*\\.h\$" , 0);
+ push @headers, $inject_headers{$subdir} if (defined $inject_headers{$subdir});
+ foreach my $header (@headers) {
+ my $shadow = ($header =~ s/^\*//);
+ $header = 0 if($header =~ /^ui_.*.h/);
+ foreach (@ignore_headers) {
+ $header = 0 if($header eq $_);
+ }
+ if($header) {
+ my $header_copies = 0;
+ #figure out if it is a public header
+ my $public_header = $header;
+ if($public_header =~ /_p.h$/ || $public_header =~ /_pch.h$/) {
+ $public_header = 0;
+ } else {
+ foreach (@ignore_for_master_contents) {
+ $public_header = 0 if($header eq $_);
+ }
+ }
+
+ my $iheader = $subdir . "/" . $header;
+ $iheader =~ s/^\Q$basedir\E/$out_basedir/ if ($shadow);
+ my @classes = $public_header ? classNames($iheader) : ();
+ if($showonly) {
+ print "$header [$lib]\n";
+ foreach(@classes) {
+ print "SYMBOL: $_\n";
+ }
+ } else {
+ my $ts = (stat($iheader))[9];
+ #find out all the places it goes..
+ my @headers;
+ if ($public_header) {
+ @headers = ( "$out_basedir/$out_subdir/$lib/$header" );
+
+ # write forwarding headers to include/Qt
+ if ($lib ne "phonon" && $subdir =~ /^$basedir\/src/) {
+ my $file_name = "$out_basedir/$out_subdir/Qt/$header";
+ my $file_op = '>';
+ my $header_content = '';
+ if (exists $colliding_headers{$file_name}) {
+ $file_op = '>>';
+ } else {
+ $colliding_headers{$file_name} = 1;
+ my $warning_msg = 'Inclusion of header files from include/Qt is deprecated.';
+ $header_content = "#ifndef QT_NO_QT_INCLUDE_WARN\n" .
+ " #if defined(__GNUC__)\n" .
+ " #warning \"$warning_msg\"\n" .
+ " #elif defined(_MSC_VER)\n" .
+ " #pragma message(\"WARNING: $warning_msg\")\n" .
+ " #endif\n".
+ "#endif\n\n";
+ }
+ $header_content .= '#include "' . "../$lib/$header" . "\"\n";
+ open HEADERFILE, $file_op, $file_name or die "unable to open '$file_name' : $!\n";
+ print HEADERFILE $header_content;
+ close HEADERFILE;
+ }
+
+ foreach my $full_class (@classes) {
+ my $header_base = basename($header);
+ # Strip namespaces:
+ my $class = $full_class;
+ $class =~ s/^.*:://;
+# if ($class =~ m/::/) {
+# 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));
+
+ # 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));
+ }
+ }
+ } elsif ($create_private_headers) {
+ @headers = ( "$out_basedir/$out_subdir/$lib/private/$header" );
+ }
+ foreach(@headers) { #sync them
+ $header_copies++ if(syncHeader($_, $iheader, $copy_headers, $ts));
+ }
+
+ if($public_header) {
+ #put it into the master file
+ $master_contents .= "#include \"$public_header\"\n" if(shouldMasterInclude($iheader));
+
+ #deal with the install directives
+ if($public_header) {
+ my $pri_install_iheader = fixPaths($iheader, $current_dir);
+ foreach my $class (@classes) {
+ # Strip namespaces:
+ $class =~ s/^.*:://;
+# if ($class =~ m/::/) {
+# $class =~ s,::,/,g;
+# }
+ my $class_header = fixPaths("$out_basedir/$out_subdir/$lib/$class",
+ $current_dir) . " ";
+ $pri_install_classes .= $class_header
+ unless($pri_install_classes =~ $class_header);
+ }
+ $pri_install_files.= "$pri_install_iheader ";;
+ }
+ }
+ else {
+ my $pri_install_iheader = fixPaths($iheader, $current_dir);
+ $pri_install_pfiles.= "$pri_install_iheader ";;
+ }
+ }
+ print "header created for $iheader ($header_copies)\n" if($header_copies > 0 && !$quiet);
+ }
+ }
+ }
+ }
+
+ # close the master include:
+ $master_contents .= "#endif\n";
+
+ unless($showonly) {
+ my @master_includes;
+ push @master_includes, "$out_basedir/$out_subdir/$lib/$lib";
+ push @master_includes, "$out_basedir/$out_subdir/phonon_compat/Phonon/Phonon" if ($lib eq "phonon");
+ foreach my $master_include (@master_includes) {
+ #generate the "master" include file
+ my @tmp = split(/;/,$modules{$lib});
+ $pri_install_files .= fixPaths($master_include, $tmp[0]) . " "; #get the master file installed too
+ if($master_include && -e $master_include) {
+ open MASTERINCLUDE, "<$master_include";
+ local $/;
+ binmode MASTERINCLUDE;
+ my $oldmaster = <MASTERINCLUDE>;
+ close MASTERINCLUDE;
+ $oldmaster =~ s/\r//g; # remove \r's , so comparison is ok on all platforms
+ $master_include = 0 if($oldmaster eq $master_contents);
+ }
+ if($master_include && $master_contents) {
+ my $master_dir = dirname($master_include);
+ mkpath $master_dir, !$quiet;
+ print "header (master) created for $lib\n" unless $quiet;
+ open MASTERINCLUDE, ">$master_include";
+ print MASTERINCLUDE $master_contents;
+ close MASTERINCLUDE;
+ }
+ }
+
+ #handle the headers.pri for each module
+ my $headers_pri_contents = "";
+ $headers_pri_contents .= "SYNCQT.HEADER_FILES = $pri_install_files\n";
+ $headers_pri_contents .= "SYNCQT.HEADER_CLASSES = $pri_install_classes\n";
+ $headers_pri_contents .= "SYNCQT.PRIVATE_HEADER_FILES = $pri_install_pfiles\n";
+ my $headers_pri_file = "$out_basedir/$out_subdir/$lib/headers.pri";
+ if(-e $headers_pri_file) {
+ open HEADERS_PRI_FILE, "<$headers_pri_file";
+ local $/;
+ binmode HEADERS_PRI_FILE;
+ my $old_headers_pri_contents = <HEADERS_PRI_FILE>;
+ close HEADERS_PRI_FILE;
+ $old_headers_pri_contents =~ s/\r//g; # remove \r's , so comparison is ok on all platforms
+ $headers_pri_file = 0 if($old_headers_pri_contents eq $headers_pri_contents);
+ }
+ if($headers_pri_file && $master_contents) {
+ my $headers_pri_dir = dirname($headers_pri_file);
+ mkpath $headers_pri_dir, !$quiet;
+ print "headers.pri file created for $lib\n" unless $quiet;
+ open HEADERS_PRI_FILE, ">$headers_pri_file";
+ print HEADERS_PRI_FILE $headers_pri_contents;
+ close HEADERS_PRI_FILE;
+ }
+ }
+}
+unless($showonly || !$create_uic_class_map) {
+ my $class_lib_map = "$out_basedir/src/tools/uic/qclass_lib_map.h";
+ if(-e $class_lib_map) {
+ open CLASS_LIB_MAP, "<$class_lib_map";
+ local $/;
+ binmode CLASS_LIB_MAP;
+ my $old_class_lib_map_contents = <CLASS_LIB_MAP>;
+ close CLASS_LIB_MAP;
+ $old_class_lib_map_contents =~ s/\r//g; # remove \r's , so comparison is ok on all platforms
+ $class_lib_map = 0 if($old_class_lib_map_contents eq $class_lib_map_contents);
+ }
+ if($class_lib_map) {
+ my $class_lib_map_dir = dirname($class_lib_map);
+ mkpath $class_lib_map_dir, !$quiet;
+ open CLASS_LIB_MAP, ">$class_lib_map";
+ print CLASS_LIB_MAP $class_lib_map_contents;
+ close CLASS_LIB_MAP;
+ }
+}
+
+if($check_includes) {
+ for my $lib (keys(%modules)) {
+ #calc subdirs
+ my @subdirs = ($modules{$lib});
+ foreach my $subdir (@subdirs) {
+ opendir DIR, $subdir or die "Huh, directory ".$subdir." cannot be opened.";
+ while(my $t = readdir(DIR)) {
+ push @subdirs, "$subdir/$t" if(-d "$subdir/$t" && !($t eq ".") &&
+ !($t eq "..") && !($t eq ".obj") &&
+ !($t eq ".moc") && !($t eq ".rcc") &&
+ !($t eq ".uic") && !($t eq "build"));
+ }
+ closedir DIR;
+ }
+
+ foreach my $subdir (@subdirs) {
+ my $header_skip_qt_module_test = 0;
+ foreach(@ignore_for_qt_module_check) {
+ foreach (split(/;/, $_)) {
+ $header_skip_qt_module_test = 1 if ($subdir =~ /^$_/);
+ }
+ }
+ my @headers = findFiles($subdir, "^[-a-z0-9_]*\\.h\$" , 0);
+ foreach my $header (@headers) {
+ my $header_skip_qt_begin_header_test = 0;
+ my $header_skip_qt_begin_namespace_test = 0;
+ $header = 0 if($header =~ /^ui_.*.h/);
+ foreach (@ignore_headers) {
+ $header = 0 if($header eq $_);
+ }
+ if($header) {
+ my $public_header = $header;
+ if($public_header =~ /_p.h$/ || $public_header =~ /_pch.h$/) {
+ $public_header = 0;
+ } else {
+ foreach (@ignore_for_master_contents) {
+ $public_header = 0 if($header eq $_);
+ }
+ if($public_header) {
+ foreach (@ignore_for_include_check) {
+ $public_header = 0 if($header eq $_);
+ }
+ foreach(@ignore_for_qt_begin_header_check) {
+ $header_skip_qt_begin_header_test = 1 if ($header eq $_);
+ }
+ foreach(@ignore_for_qt_begin_namespace_check) {
+ $header_skip_qt_begin_namespace_test = 1 if ($header eq $_);
+ }
+ }
+ }
+
+ my $iheader = $subdir . "/" . $header;
+ if($public_header) {
+ if(open(F, "<$iheader")) {
+ my $qt_module_found = 0;
+ my $qt_begin_header_found = 0;
+ my $qt_end_header_found = 0;
+ my $qt_begin_namespace_found = 0;
+ my $qt_end_namespace_found = 0;
+ my $line;
+ while($line = <F>) {
+ chomp $line;
+ my $output_line = 1;
+ if($line =~ /^ *\# *pragma (qt_no_included_check|qt_sync_stop_processing)/) {
+ last;
+ } elsif($line =~ /^ *\# *include/) {
+ my $include = $line;
+ if($line =~ /<.*>/) {
+ $include =~ s,.*<(.*)>.*,$1,;
+ } elsif($line =~ /".*"/) {
+ $include =~ s,.*"(.*)".*,$1,;
+ } else {
+ $include = 0;
+ }
+ if($include) {
+ for my $trylib (keys(%modules)) {
+ if(-e "$out_basedir/$out_subdir/$trylib/$include") {
+ print "WARNING: $iheader includes $include when it should include $trylib/$include\n";
+ }
+ }
+ }
+ } elsif ($header_skip_qt_begin_header_test == 0 and $line =~ /^QT_BEGIN_HEADER\s*$/) {
+ $qt_begin_header_found = 1;
+ } elsif ($header_skip_qt_begin_header_test == 0 and $line =~ /^QT_END_HEADER\s*$/) {
+ $qt_end_header_found = 1;
+ } elsif ($header_skip_qt_begin_namespace_test == 0 and $line =~ /^QT_BEGIN_NAMESPACE\s*$/) {
+ $qt_begin_namespace_found = 1;
+ } elsif ($header_skip_qt_begin_namespace_test == 0 and $line =~ /^QT_END_NAMESPACE\s*$/) {
+ $qt_end_namespace_found = 1;
+ } elsif ($header_skip_qt_module_test == 0 and $line =~ /^QT_MODULE\(.*\)\s*$/) {
+ $qt_module_found = 1;
+ }
+ }
+ if ($header_skip_qt_begin_header_test == 0) {
+ if ($qt_begin_header_found == 0) {
+ print "WARNING: $iheader does not include QT_BEGIN_HEADER\n";
+ }
+
+ if ($qt_begin_header_found && $qt_end_header_found == 0) {
+ print "WARNING: $iheader has QT_BEGIN_HEADER but no QT_END_HEADER\n";
+ }
+ }
+
+ if ($header_skip_qt_begin_namespace_test == 0) {
+ if ($qt_begin_namespace_found == 0) {
+ print "WARNING: $iheader does not include QT_BEGIN_NAMESPACE\n";
+ }
+
+ if ($qt_begin_namespace_found && $qt_end_namespace_found == 0) {
+ print "WARNING: $iheader has QT_BEGIN_NAMESPACE but no QT_END_NAMESPACE\n";
+ }
+ }
+
+ if ($header_skip_qt_module_test == 0) {
+ if ($qt_module_found == 0) {
+ print "WARNING: $iheader does not include QT_MODULE\n";
+ }
+ }
+ close(F);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+exit 0;
diff --git a/config.profiles/symbian/implml/qt_copy.implml b/config.profiles/symbian/implml/qt_copy.implml
new file mode 100644
index 0000000..53d600e
--- /dev/null
+++ b/config.profiles/symbian/implml/qt_copy.implml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<container xmlns="http://www.symbianfoundation.org/xml/implml/1"
+ condition="${qt.Enabled}">
+ <tag name="target" value="uda" />
+ <content xmlns="http://www.s60.com/xml/content/2">
+ <output dir="sis" flatten="true">
+ <input file="sis/qt.sisx" />
+ </output>
+ </content>
+</container>
diff --git a/config.profiles/symbian/layers.sysdef.xml b/config.profiles/symbian/layers.sysdef.xml
new file mode 100644
index 0000000..4c1b6f9
--- /dev/null
+++ b/config.profiles/symbian/layers.sysdef.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0"?>
+<!DOCTYPE SystemDefinition SYSTEM "sysdef_1_5_1.dtd" [
+ <!-- location of Qt in the platform source tree -->
+ <!ENTITY layer_real_source_path "sf/mw/qt" >
+
+ <!-- location of our configuration files -->
+ <!ENTITY config_path "config.profiles/symbian" >
+]>
+
+<SystemDefinition name="qt" schema="1.5.1">
+ <systemModel>
+ <layer name="tools_layer">
+ <module name="qtconf">
+ <unit unitID="qtdo.qt.qtconf" mrp="" bldFile="&layer_real_source_path;/&config_path;" name="qtconf" />
+ </module>
+ </layer>
+ <layer name="mw_layer">
+ <module name="qt">
+ <unit unitID="qtdo.qt" mrp="" bldFile="&layer_real_source_path;" name="qt" proFile="projects.pro" qmakeArgs="-r"/>
+ </module>
+
+ <module name="qtlocalization">
+ <unit unitID="qtdo.qt.localization" mrp="" bldFile="&layer_real_source_path;/&config_path;/translations_symbian" name="qtlocalization" proFile="translations.pro" qmakeArgs="-r"/>
+ </module>
+ </layer>
+ <layer name="app_layer">
+ <module name="qtdemos">
+ <unit unitID="qtdo.qt.demos" mrp="" bldFile="&layer_real_source_path;/demos" name="qtdemos" proFile="demos.pro" qmakeArgs="-r" filter="qtdemos"/>
+ </module>
+ <module name="qtexamples">
+ <unit unitID="qtdo.qt.examples" mrp="" bldFile="&layer_real_source_path;/examples" name="qtexamples" proFile="examples.pro" qmakeArgs="-r" filter="qtexamples"/>
+ </module>
+ <module name="qttestsauto">
+ <unit unitID="qtdo.qt.testsauto" mrp="" bldFile="&layer_real_source_path;/tests/auto" name="qttestsauto" proFile="qtpauto.pro" qmakeArgs="-r" filter="qttestsauto"/>
+ </module>
+ <module name="qttestsbenchmarks">
+ <unit unitID="qtdo.qt.testsbenchmarks" mrp="" bldFile="&layer_real_source_path;/tests/benchmarks" name="qttestsbenchmarks" proFile="benchmarks.pro" qmakeArgs="-r" filter="qttestsbenchmarks"/>
+ </module>
+ </layer>
+ </systemModel>
+</SystemDefinition>
diff --git a/config.profiles/symbian/loc.prf b/config.profiles/symbian/loc.prf
new file mode 100644
index 0000000..9973903
--- /dev/null
+++ b/config.profiles/symbian/loc.prf
@@ -0,0 +1,25 @@
+
+qtPrepareTool(LRELEASE, lrelease)
+
+loc.CONFIG = no_link
+loc.commands = $$LRELEASE ${QMAKE_FILE_IN} -qm ${QMAKE_FILE_OUT}
+loc.output = $${EPOCROOT}epoc32/data/z/resource/qt/translations/${QMAKE_FILE_BASE}.qm
+loc.input = TRANSLATIONS
+loc.variable_out = PRE_TARGETDEPS
+
+loc_winscwudeb.CONFIG = no_link
+loc_winscwudeb.commands = $$LRELEASE ${QMAKE_FILE_IN} -qm ${QMAKE_FILE_OUT}
+loc_winscwudeb.output = $${EPOCROOT}epoc32/release/winscw/udeb/z/resource/qt/translations/${QMAKE_FILE_BASE}.qm
+loc_winscwudeb.input = TRANSLATIONS
+loc_winscwudeb.variable_out = PRE_TARGETDEPS
+
+loc_winscwurel.CONFIG = no_link
+loc_winscwurel.commands = $$LRELEASE ${QMAKE_FILE_IN} -qm ${QMAKE_FILE_OUT}
+loc_winscwurel.output = $${EPOCROOT}epoc32/release/winscw/urel/z/resource/qt/translations/${QMAKE_FILE_BASE}.qm
+loc_winscwurel.input = TRANSLATIONS
+loc_winscwurel.variable_out = PRE_TARGETDEPS
+
+QMAKE_EXTRA_COMPILERS += loc
+QMAKE_EXTRA_COMPILERS += loc_winscwudeb
+QMAKE_EXTRA_COMPILERS += loc_winscwurel
+
diff --git a/config.profiles/symbian/non_foundation_paths.prf b/config.profiles/symbian/non_foundation_paths.prf
new file mode 100644
index 0000000..8074ff7
--- /dev/null
+++ b/config.profiles/symbian/non_foundation_paths.prf
@@ -0,0 +1,115 @@
+#
+# ==============================================================================
+# Name : non_foundation_paths.prf
+# Part of :
+# Interface : None foundation code Path Definitions API for Qt/S60
+# Description : Symbian^3 and onwards specific platform paths
+#
+# Usage examples:
+#
+# Note: this file will not added automatically. It needs to be included
+# when needed.
+#
+# Variable usages to add the system include paths
+#
+# The include paths has to be related to the layer in which your SW
+# resides. Thus as an example: a component residing in middleware
+# layer should use the MW specific macro.
+#
+# INCLUDEPATH += $$NON_FOUNDATION_APP_LAYER_SYSTEMINCLUDE
+# INCLUDEPATH += $$NON_FOUNDATION_MW_LAYER_SYSTEMINCLUDE
+# INCLUDEPATH += $$NON_FOUNDATION_OS_LAYER_SYSTEMINCLUDE
+# INCLUDEPATH += $$NON_FOUNDATION_ADAPT_LAYER_SYSTEMINCLUDE
+#
+# Macros related to exporting non-foundation headers into
+# correct place in the new system.
+# NON_FOUNDATION_APP_LAYER_EXPORT_PATH
+# NON_FOUNDATION_MW_LAYER_EXPORT_PATH
+# NON_FOUNDATION_OS_LAYER_EXPORT_PATH
+# NON_FOUNDATION_ADAPT_LAYER_EXPORT_PATH
+#
+# ==============================================================================
+
+# ---------------------------------------
+# Location, where the non-foundation app code should export its headers.
+# These are specific to app layer to which the non-foundation code belongs to.
+# ---------------------------------------
+defineReplace(NON_FOUNDATION_APP_LAYER_EXPORT_PATH) {
+ return (/epoc32/include/ext/app/$$1)
+}
+
+# ---------------------------------------
+# Location, where the non-foundation mw code should export its headers.
+# These are specific to mw layer to which the non-foundation code belongs to.
+# ---------------------------------------
+defineReplace(NON_FOUNDATION_MW_LAYER_EXPORT_PATH) {
+ return (/epoc32/include/ext/mw/$$1)
+}
+
+# ---------------------------------------
+# Location, where the non-foundation os code should export its headers.
+# These are specific to os layer to which the non-foundation code belongs to.
+# ---------------------------------------
+defineReplace(NON_FOUNDATION_OS_LAYER_EXPORT_PATH) {
+ return (/epoc32/include/ext/os/$$1)
+}
+
+# ---------------------------------------
+# Location, where the non-foundation adapt code should export its headers.
+# These are specific to adapt layer to which the non-foundation code belongs to.
+# ---------------------------------------
+# Temporarily commented out to help adaptation side migration
+# defineReplace(NON_FOUNDATION_ADAPT_LAYER_EXPORT_PATH) {
+# return (/epoc32/include/ext/adapt/$$1)
+# }
+
+# **************************************************************************
+# General comments about the 3 define statements related to include paths.
+# It should be enough only to have one of the below macros and one of the include macros
+# from platform_paths.hrh.
+# No other systemincludes to epoc32/include or subdirectories.
+# **************************************************************************
+
+# This define statements defines the SYSTEMINCLUDE-line, which is intended to be
+# used in the mmp-files that are part of the applications-layer.
+#
+# Applications layer is the last one in the list, since most likely the most of
+# the headers come from middleware or os-layer => thus they are first.
+
+NON_FOUNDATION_APP_LAYER_SYSTEMINCLUDE = \
+ /epoc32/include/ext/app \
+ /epoc32/include/ext/mw \
+ /epoc32/include/ext/os
+
+# This define statements defines the SYSTEMINCLUDE-line, which is intended to be
+# used in the mmp-files that are part of the middleware-layer.
+
+NON_FOUNDATION_MW_LAYER_SYSTEMINCLUDE = \
+ /epoc32/include/ext/mw \
+ /epoc32/include/ext/os
+
+# This define statements defines the SYSTEMINCLUDE-line, which is intended to be
+# used in the mmp-files that are part of the os-layer.
+
+NON_FOUNDATION_OS_LAYER_SYSTEMINCLUDE = \
+ /epoc32/include/ext/os
+
+# This define statements defines the SYSTEMINCLUDE-line, which is intended to be
+# used in the mmp-files that are part of the adapt-layer.
+# Temporarily commented out to help adaptation side migration
+# NON_FOUNDATION_ADAPT_LAYER_SYSTEMINCLUDE = \
+# /epoc32/include/ext/os \
+# /epoc32/include/ext/adapt
+
+
+# ****************************************************************************
+# Definitions to export IBY files to different folders where they will be taken
+# to ROM image
+# ****************************************************************************
+
+# Following three definitions are used for exporting IBY files to
+# Core image (ROM+ROFS1). IBY files are exported according to their layer.
+
+defineReplace(NON_FOUNDATION_CORE_ADAPT_LAYER_IBY_EXPORT_PATH) {
+ return (/epoc32/rom/include/$$1)
+}
diff --git a/config.profiles/symbian/package_definition.xml b/config.profiles/symbian/package_definition.xml
new file mode 100644
index 0000000..f0c6652
--- /dev/null
+++ b/config.profiles/symbian/package_definition.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<SystemDefinition schema="3.0.0" xmlns:qt="http://www.nokia.com/qt">
+ <!-- qt:qmakeArgs attribute is an unsupported extension used as temporary hack to get this to work with abld.
+ This will be removed when sbsv2 builds are working -->
+ <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"/>
+ </component>
+ </collection>
+ <collection id="qt_info" name="Qt Info" level="mw">
+ <component id="qt_build" name="Qt Build" introduced="^2" filter="s60">
+ <unit bldFile="." qt:proFile="projects.pro"/>
+ </component>
+ </collection>
+
+ <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"/>
+ </component>
+ </collection>
+
+ <collection id="qtdemos" name="Qt Demos" level="app">
+ <component id="qtdemos_build" name="Qt Demos Build" introduced="^2" filter="s60,test,qtdemos,build_as_app">
+ <meta rel="testbuild">
+ <group name="qtdemos"/>
+ </meta>
+ <unit bldFile="demos" qt:proFile="demos.pro"/>
+ </component>
+ </collection>
+ <collection id="qtexamples" name="Qt Examples" level="app">
+ <meta rel="qtexamples">
+ <group name="qtdemos"/>
+ </meta>
+ <component id="qtexamples_build" name="Qt Examples Build" introduced="^2" filter="s60,test,qtexamples,build_as_app">
+ <unit bldFile="examples" qt:proFile="examples.pro"/>
+ </component>
+ </collection>
+ <collection id="qt_tests" name="Qt Tests" level="app">
+ <component id="qttestsauto" name="Qt Automated Tests" introduced="^2" filter="s60,qttestsauto,test,build_as_app">
+ <meta rel="qttestsauto">
+ <group name="qtdemos"/>
+ </meta>
+ <unit bldFile="tests/auto" qt:proFile="qtpauto.pro"/>
+ </component>
+ <component id="qttestsbenchmarks" name="Qt Benchmarks Tests" introduced="^2" filter="s60,qttestsbenchmarks,test,build_as_app">
+ <meta rel="testbuild">
+ <group name="qttestsbenchmarks"/>
+ </meta>
+ <unit bldFile="tests/benchmarks" qt:proFile="benchmarks.pro"/>
+ </component>
+ </collection>
+ </package>
+</SystemDefinition>
diff --git a/config.profiles/symbian/package_map.xml b/config.profiles/symbian/package_map.xml
new file mode 100644
index 0000000..6233095
--- /dev/null
+++ b/config.profiles/symbian/package_map.xml
@@ -0,0 +1 @@
+<PackageMap root="sf" layer="mw"/>
diff --git a/config.profiles/symbian/platform_paths.prf b/config.profiles/symbian/platform_paths.prf
new file mode 100644
index 0000000..0e2131f
--- /dev/null
+++ b/config.profiles/symbian/platform_paths.prf
@@ -0,0 +1,251 @@
+#
+# ==============================================================================
+# Name : platform_paths.prf
+# Part of :
+# Interface : Platform Path Definitions API for Qt/S60
+# Description : Symbian^3 and onwards specific platform paths
+#
+# Usage examples:
+#
+# Note: this file gets automatically added to all Qt/S60 projects
+#
+# Variable usages to add the system include paths
+#
+# The include paths has to be related to the layer in which your SW
+# resides. Thus as an example: a component residing in middleware
+# layer should use the MW specific macro.
+#
+# INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
+# INCLUDEPATH += $$MW_LAYER_SYSTEMINCLUDE
+# INCLUDEPATH += $$OS_LAYER_SYSTEMINCLUDE
+#
+# If there is a need to include public headers of some S60 component,
+# various *_EXPORT_PATH macros can be utilized:
+#
+# INCLUDEPATH += $$OS_LAYER_PUBLIC_EXPORT_PATH(somecomponent)
+#
+# Variables related to using various parts of stdapis:
+#
+# To use STLLIB you need to have this in your pro-file:
+#
+# QMAKE_CXXFLAGS.CW *= $$STLLIB_USAGE_CW_FLAGS
+# DEFINES *= $$STLLIB_USAGE_DEFINES
+#
+# Depending on what module you are using from stdapis you need to have
+# one or more of the following variables in your pro-file.
+#
+# INCLUDEPATH += $$OS_LAYER_LIBC_SYSTEMINCLUDE
+# INCLUDEPATH += $$OS_LAYER_GLIB_SYSTEMINCLUDE
+# INCLUDEPATH += $$OS_LAYER_SSL_SYSTEMINCLUDE
+# INCLUDEPATH += $$OS_LAYER_STDCPP_SYSTEMINCLUDE
+# INCLUDEPATH += $$OS_LAYER_BOOST_SYSTEMINCLUDE
+# INCLUDEPATH += $$OS_LAYER_DBUS_SYSTEMINCLUDE
+# INCLUDEPATH += $$OS_LAYER_LIBUTILITY_SYSTEMINCLUDE
+#
+#
+#
+#
+# ==============================================================================
+
+# ---------------------------------------
+# Location, where the applications layer specific public headers are exported
+# ---------------------------------------
+
+defineReplace(APP_LAYER_SDK_EXPORT_PATH) {
+ return (/epoc32/include/app/$$1)
+}
+defineReplace(APP_LAYER_PUBLIC_EXPORT_PATH) {
+ return (/epoc32/include/app/$$1)
+}
+
+# ---------------------------------------
+# Location, where the applications layer specific platform headers are exported
+# ---------------------------------------
+
+defineReplace(APP_LAYER_DOMAIN_EXPORT_PATH) {
+ return (/epoc32/include/platform/app/$$1)
+}
+defineReplace(APP_LAYER_PLATFORM_EXPORT_PATH) {
+ return (/epoc32/include/platform/app/$$1)
+}
+
+# ---------------------------------------
+# Location, where the middleware layer specific public headers are exported
+# ---------------------------------------
+
+defineReplace(MW_LAYER_SDK_EXPORT_PATH) {
+ return (/epoc32/include/mw/$$1)
+}
+defineReplace(MW_LAYER_PUBLIC_EXPORT_PATH) {
+ return (/epoc32/include/mw/$$1)
+}
+
+# ---------------------------------------
+# Location, where the middleware layer specific platform headers are exported
+# ---------------------------------------
+
+defineReplace(MW_LAYER_DOMAIN_EXPORT_PATH) {
+ return (/epoc32/include/platform/mw/$$1)
+}
+defineReplace(MW_LAYER_PLATFORM_EXPORT_PATH) {
+ return (/epoc32/include/platform/mw/$$1)
+}
+
+# ---------------------------------------
+# Location, where the os layer specific public headers are exported
+# ---------------------------------------
+
+defineReplace(OSEXT_LAYER_SDK_EXPORT_PATH) {
+ return (/epoc32/include/$$1)
+}
+# WARNING: If the following path changes see the exists() function around line 219
+defineReplace(OS_LAYER_PUBLIC_EXPORT_PATH) {
+ return (/epoc32/include/$$1)
+}
+
+# ---------------------------------------
+# Location, where the os specific platform headers are exported
+# ---------------------------------------
+
+defineReplace(OSEXT_LAYER_DOMAIN_EXPORT_PATH) {
+ return (/epoc32/include/platform/$$1)
+}
+defineReplace(OS_LAYER_PLATFORM_EXPORT_PATH) {
+ return (/epoc32/include/platform/$$1)
+}
+
+# ---------------------------------------
+# General comments about the 3 define statements related to include paths:
+# 1) the /epoc32/include/oem is now defined there for backward compability.
+# Once the directory is empty, the directory will be removed. However this
+# enables us to ensure that if you use these define statements => you do
+# not have to remove the statements later on, when the directory no longer
+# exists.
+# 2) These statements should be enough in normal cases. For certain specific
+# cases you might need to add some specific directory from /epoc32/include
+# (for instance /epoc32/include/ecom).
+# In normal cases the include staments in code should be relative to one of
+# the system include paths, but in certain cases, the included files requires
+# that the subdirectory is also part of the system include paths.
+# ---------------------------------------
+
+# This variable defines the include paths, which are intended to be
+# used in the pro-files that are part of the applications-layer. It includes all
+# the needed directories from the /epoc32/include, that are valid ones for the
+# application-layer components.
+#
+# Applications layer is the last one in the list, since most likely the most of
+# the headers come from middleware or os-layer => thus they are first.
+
+APP_LAYER_SYSTEMINCLUDE = \
+ /epoc32/include \
+ /epoc32/include/mw \
+ /epoc32/include/platform/mw \
+ /epoc32/include/platform \
+ /epoc32/include/app \
+ /epoc32/include/platform/app \
+ /epoc32/include/platform/loc \
+ /epoc32/include/platform/mw/loc \
+ /epoc32/include/platform/app/loc \
+ /epoc32/include/platform/loc/sc \
+ /epoc32/include/platform/mw/loc/sc \
+ /epoc32/include/platform/app/loc/sc
+
+# This define statements defines the include paths, which are intended to be
+# used in the pro-files that are part of the middleware-layer. It includes all
+# the needed directories from the /epoc32/include, that are valid ones for the
+# middleware-layer components.
+
+MW_LAYER_SYSTEMINCLUDE = \
+ /epoc32/include \
+ /epoc32/include/mw \
+ /epoc32/include/platform/mw \
+ /epoc32/include/platform \
+ /epoc32/include/platform/loc \
+ /epoc32/include/platform/mw/loc \
+ /epoc32/include/platform/loc/sc \
+ /epoc32/include/platform/mw/loc/sc
+
+# This define statements defines the include paths, which are intended to be
+# used in the pro-files that are part of the osextensions-layer. It includes all
+# the needed directories from the /epoc32/include, that are valid ones for the
+# os-layer components.
+
+OS_LAYER_SYSTEMINCLUDE = \
+ /epoc32/include \
+ /epoc32/include/platform \
+ /epoc32/include/platform/loc \
+ /epoc32/include/platform/loc/sc
+
+# This define statements defines the include paths, which are intended to be
+# used in the pro-files that are part of the os-layer. This is intended
+# to be only used by those components which need to use in their mmp-file either
+# kern_ext.mmh or nkern_ext.mmh. Reason is that those
+# 2 files already contain the /epoc32/include as system include path.
+
+OS_LAYER_KERNEL_SYSTEMINCLUDE = \
+ /epoc32/include/platform
+
+
+# ---------------------------------------
+# Definitions that also define the systeminclude paths for various
+# part of stdapis. Append to INCLUDEPATH in pro-file.
+# ---------------------------------------
+
+OS_LAYER_LIBC_SYSTEMINCLUDE = $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis) \
+ $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/sys)
+
+OS_LAYER_GLIB_SYSTEMINCLUDE = $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/glib-2.0) \
+ $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/glib-2.0/glib) \
+ $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/glib-2.0/gObject)
+
+OS_LAYER_SSL_SYSTEMINCLUDE = $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/openssl)
+
+# stlportv5 is preferred over stlport as it has the throwing version of operator new
+exists($${EPOCROOT}epoc32/include/stdapis/stlport) \
+:!exists($${EPOCROOT}epoc32/include/stdapis/stlportv5) {
+ OS_LAYER_STDCPP_SYSTEMINCLUDE = $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/stlport)
+} else {
+ OS_LAYER_STDCPP_SYSTEMINCLUDE = $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/stlportv5)
+}
+
+OS_LAYER_BOOST_SYSTEMINCLUDE = $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/boost)
+
+OS_LAYER_DBUS_SYSTEMINCLUDE = $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/dbus-1.0) \
+ $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/dbus-1.0/dbus)
+
+OS_LAYER_LIBUTILITY_SYSTEMINCLUDE = $$OS_LAYER_PLATFORM_EXPORT_PATH(stdapis/utility)
+
+# ---------------------------------------
+# Definitions to export IBY files to different folders where they will be taken
+# to ROM image
+# ---------------------------------------
+
+defineReplace(CORE_APP_LAYER_IBY_EXPORT_PATH) {
+ return(/epoc32/rom/include/core/app/$$1)
+}
+defineReplace(CORE_MW_LAYER_IBY_EXPORT_PATH) {
+ return(/epoc32/rom/include/core/mw/$$1)
+}
+defineReplace(CORE_OSEXT_LAYER_IBY_EXPORT_PATH) {
+ return(/epoc32/rom/include/core/os/$$1)
+}
+defineReplace(CORE_OS_LAYER_IBY_EXPORT_PATH) {
+ return(/epoc32/rom/include/core/os/$$1)
+}
+defineReplace(CORE_TOOLS_LAYER_IBY_EXPORT_PATH) {
+ return(/epoc32/rom/include/core/tools/$$1)
+}
+defineReplace(CORE_ADAPT_LAYER_IBY_EXPORT_PATH) {
+ return(/epoc32/rom/include/$$1)
+}
+defineReplace(CUSTOMER_VARIANT_APP_LAYER_IBY_EXPORT_PATH) {
+ return(/epoc32/rom/include/customervariant/app/$$1)
+}
+
+# You need to define the following in pro-file, if you are using the stllib:
+# QMAKE_CXXFLAGS.CW *= $$STLLIB_USAGE_CW_FLAGS
+# DEFINES *= $$STLLIB_USAGE_DEFINES
+STLLIB_USAGE_CW_FLAGS = "-wchar_t on"
+STLLIB_USAGE_DEFINES = _WCHAR_T_DECLARED
+
diff --git a/config.profiles/symbian/qt.conf b/config.profiles/symbian/qt.conf
new file mode 100644
index 0000000..29dfa88
--- /dev/null
+++ b/config.profiles/symbian/qt.conf
@@ -0,0 +1,6 @@
+[Paths]
+Data = $(EPOCROOT)epoc32/tools/qt
+Headers = $(EPOCROOT)epoc32/include/mw
+Binaries = $(EPOCROOT)epoc32/tools
+Prefix = $(EPOCROOT)sf/mw/qt
+
diff --git a/config.profiles/symbian/qt.iby b/config.profiles/symbian/qt.iby
new file mode 100644
index 0000000..2b3be0a
--- /dev/null
+++ b/config.profiles/symbian/qt.iby
@@ -0,0 +1,118 @@
+#ifndef QT_IBY
+#define QT_IBY
+
+#include <bldvariant.hrh>
+
+#warning("qt.iby: hack - BINARY_SELECTION_ORDER really needs to be at the baseport/device level as it depends on the device type");
+BINARY_SELECTION_ORDER ARMV6,ARMV5 // hack - this really needs to be at the baseport/device level as it depends on the device type
+
+file=ABI_DIR\BUILD_DIR\QtCore.dll SHARED_LIB_DIR\QtCore.dll
+file=ABI_DIR\BUILD_DIR\QtGui.dll SHARED_LIB_DIR\QtGui.dll
+file=ABI_DIR\BUILD_DIR\QtOpenVG.dll SHARED_LIB_DIR\QtOpenVG.dll
+file=ABI_DIR\BUILD_DIR\QtSvg.dll SHARED_LIB_DIR\QtSvg.dll
+file=ABI_DIR\BUILD_DIR\QtSql.dll SHARED_LIB_DIR\QtSql.dll
+file=ABI_DIR\BUILD_DIR\QtXml.dll SHARED_LIB_DIR\QtXml.dll
+file=ABI_DIR\BUILD_DIR\QtNetwork.dll SHARED_LIB_DIR\QtNetwork.dll
+file=ABI_DIR\BUILD_DIR\QtScript.dll SHARED_LIB_DIR\QtScript.dll
+file=ABI_DIR\BUILD_DIR\QtTest.dll SHARED_LIB_DIR\QtTest.dll
+file=ABI_DIR\BUILD_DIR\QtWebKit.dll SHARED_LIB_DIR\QtWebKit.dll
+file=ABI_DIR\BUILD_DIR\phonon.dll SHARED_LIB_DIR\phonon.dll
+file=ABI_DIR\BUILD_DIR\QtMultimedia.dll SHARED_LIB_DIR\QtMultimedia.dll
+file=ABI_DIR\BUILD_DIR\QtXmlPatterns.dll SHARED_LIB_DIR\QtXmlPatterns.dll
+file=ABI_DIR\BUILD_DIR\QtDeclarative.dll SHARED_LIB_DIR\QtDeclarative.dll
+file=ABI_DIR\BUILD_DIR\QtOpenGL.dll SHARED_LIB_DIR\QtOpenGL.dll
+
+// imageformats
+file=ABI_DIR\BUILD_DIR\qgif.dll SHARED_LIB_DIR\qgif.dll
+file=ABI_DIR\BUILD_DIR\qico.dll SHARED_LIB_DIR\qico.dll
+file=ABI_DIR\BUILD_DIR\qjpeg.dll SHARED_LIB_DIR\qjpeg.dll
+file=ABI_DIR\BUILD_DIR\qmng.dll SHARED_LIB_DIR\qmng.dll
+file=ABI_DIR\BUILD_DIR\qsvg.dll SHARED_LIB_DIR\qsvg.dll
+file=ABI_DIR\BUILD_DIR\qtiff.dll SHARED_LIB_DIR\qtiff.dll
+
+// codecs
+file=ABI_DIR\BUILD_DIR\qcncodecs.dll SHARED_LIB_DIR\qcncodecs.dll
+file=ABI_DIR\BUILD_DIR\qjpcodecs.dll SHARED_LIB_DIR\qjpcodecs.dll
+file=ABI_DIR\BUILD_DIR\qkrcodecs.dll SHARED_LIB_DIR\qkrcodecs.dll
+file=ABI_DIR\BUILD_DIR\qtwcodecs.dll SHARED_LIB_DIR\qtwcodecs.dll
+
+// iconengines
+file=ABI_DIR\BUILD_DIR\qsvgicon.dll SHARED_LIB_DIR\qsvgicon.dll
+
+// Phonon MMF backend
+// 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
+
+// QtMultimedia audio backend
+file=ABI_DIR\BUILD_DIR\qaudio.dll SHARED_LIB_DIR\qaudio.dll
+
+// graphicssystems
+file=ABI_DIR\BUILD_DIR\qvggraphicssystem.dll SHARED_LIB_DIR\qvggraphicssystem.dll
+file=ABI_DIR\BUILD_DIR\qglgraphicssystem.dll SHARED_LIB_DIR\qglgraphicssystem.dll
+
+// bearer
+file=ABI_DIR\BUILD_DIR\qsymbianbearer.dll SHARED_LIB_DIR\qsymbianbearer.dll
+
+// S60 version compatibility plugins for 5.0 (3.1 and 3.2 devices are never likely to have this in ROM,
+// so don't bother including those plugins
+file=ABI_DIR\BUILD_DIR\qts60plugin_5_0.dll SHARED_LIB_DIR\qts60plugin_5_0.dll
+
+file=ABI_DIR\BUILD_DIR\qtactilefeedback.dll SHARED_LIB_DIR\qtactilefeedback.dll
+
+S60_APP_RESOURCE(s60main)
+
+// imageformats stubs
+data=\epoc32\data\z\resource\qt\plugins\imageformats\qgif.qtplugin resource\qt\plugins\imageformats\qgif.qtplugin
+data=\epoc32\data\z\resource\qt\plugins\imageformats\qico.qtplugin resource\qt\plugins\imageformats\qico.qtplugin
+data=\epoc32\data\z\resource\qt\plugins\imageformats\qjpeg.qtplugin resource\qt\plugins\imageformats\qjpeg.qtplugin
+data=\epoc32\data\z\resource\qt\plugins\imageformats\qmng.qtplugin resource\qt\plugins\imageformats\qmng.qtplugin
+data=\epoc32\data\z\resource\qt\plugins\imageformats\qsvg.qtplugin resource\qt\plugins\imageformats\qsvg.qtplugin
+data=\epoc32\data\z\resource\qt\plugins\imageformats\qtiff.qtplugin resource\qt\plugins\imageformats\qtiff.qtplugin
+
+// codecs stubs
+data=\epoc32\data\z\resource\qt\plugins\codecs\qcncodecs.qtplugin resource\qt\plugins\codecs\qcncodecs.qtplugin
+data=\epoc32\data\z\resource\qt\plugins\codecs\qjpcodecs.qtplugin resource\qt\plugins\codecs\qjpcodecs.qtplugin
+data=\epoc32\data\z\resource\qt\plugins\codecs\qkrcodecs.qtplugin resource\qt\plugins\codecs\qkrcodecs.qtplugin
+data=\epoc32\data\z\resource\qt\plugins\codecs\qtwcodecs.qtplugin resource\qt\plugins\codecs\qtwcodecs.qtplugin
+
+// iconengines stubs
+data=\epoc32\data\z\resource\qt\plugins\iconengines\qsvgicon.qtplugin resource\qt\plugins\iconengines\qsvgicon.qtplugin
+
+// qml import plugins
+file=ABI_DIR\BUILD_DIR\qmlwebkitplugin.dll SHARED_LIB_DIR\qmlwebkitplugin.dll
+file=ABI_DIR\BUILD_DIR\qmlfolderlistmodelplugin.dll SHARED_LIB_DIR\qmlfolderlistmodelplugin.dll
+file=ABI_DIR\BUILD_DIR\qmlgesturesplugin.dll SHARED_LIB_DIR\qmlgesturesplugin.dll
+file=ABI_DIR\BUILD_DIR\qmlparticlesplugin.dll SHARED_LIB_DIR\qmlparticlesplugin.dll
+
+data=\epoc32\data\z\resource\qt\imports\QtWebKit\qmlwebkitplugin.qtplugin resource\qt\imports\QtWebKit\qmlwebkitplugin.qtplugin
+data=\epoc32\data\z\resource\qt\imports\Qt\labs\folderlistmodel\qmlfolderlistmodelplugin.qtplugin resource\qt\imports\Qt\labs\folderlistmodel\qmlfolderlistmodelplugin.qtplugin
+data=\epoc32\data\z\resource\qt\imports\Qt\labs\gestures\qmlgesturesplugin.qtplugin resource\qt\imports\Qt\labs\gestures\qmlgesturesplugin.qtplugin
+data=\epoc32\data\z\resource\qt\imports\Qt\labs\particles\qmlparticlesplugin.qtplugin resource\qt\imports\Qt\labs\particles\qmlparticlesplugin.qtplugin
+
+data=\epoc32\data\z\resource\qt\imports\QtWebKit\qmldir resource\qt\imports\QtWebKit\qmldir
+data=\epoc32\data\z\resource\qt\imports\Qt\labs\folderlistmodel\qmldir resource\qt\imports\Qt\labs\folderlistmodel\qmldir
+data=\epoc32\data\z\resource\qt\imports\Qt\labs\gestures\qmldir resource\qt\imports\Qt\labs\gestures\qmldir
+data=\epoc32\data\z\resource\qt\imports\Qt\labs\particles\qmldir resource\qt\imports\Qt\labs\particles\qmldir
+
+// QtMultimedia audio backend
+data=\epoc32\data\qt\qtlibspluginstubs\qaudio.qtplugin resource\qt\plugins\audio\qaudio.qtplugin
+
+// graphicssystems
+data=\epoc32\data\z\resource\qt\plugins\graphicssystems\qvggraphicssystem.qtplugin resource\qt\plugins\graphicssystems\qvggraphicssystem.qtplugin
+data=\epoc32\data\z\resource\qt\plugins\graphicssystems\qglgraphicssystem.qtplugin resource\qt\plugins\graphicssystems\qglgraphicssystem.qtplugin
+
+// bearer stub
+data=\epoc32\data\z\resource\qt\plugins\bearer\qsymbianbearer.qtplugin resource\qt\plugins\bearer\qsymbianbearer.qtplugin
+
+// feedback
+data=\epoc32\data\z\resource\qt\plugins\feedback\qtactilefeedback.qtplugin resource\qt\plugins\feedback\qtactilefeedback.qtplugin
+
+// Stub sis file
+data=ZSYSTEM\install\qt_stub.sis System\Install\qt_stub.sis
+data=ZSYSTEM\install\qtwebkit_stub.sis System\Install\qtwebkit_stub.sis
+
+#endif // __QT_IBY__
+
diff --git a/config.profiles/symbian/qtconfig.flm b/config.profiles/symbian/qtconfig.flm
new file mode 100644
index 0000000..61ee6e6
--- /dev/null
+++ b/config.profiles/symbian/qtconfig.flm
@@ -0,0 +1,88 @@
+# /****************************************************************************
+# **
+# ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# ** Contact:
+# **
+# ****************************************************************************/
+
+# FLM to build Qt tools.
+
+QT_ROOT:= ../..
+TARGETDIR:=$(EPOCROOT)/$(INSTALLPATH)
+MKSPECDIR:=$(EPOCROOT)/$(INSTALLPATH)/qt
+SOURCEDIR:=$(EXTENSION_ROOT)/$(QT_ROOT)/bin
+TOOLSSRCDIR:=$(EXTENSION_ROOT)/$(QT_ROOT)/src/tools
+LANGUAGETOOLDIR:=$(EXTENSION_ROOT)/$(QT_ROOT)/tools/linguist
+CONFIGURE_APP:=configure$(DOTEXE)
+
+$(call makepath,$(TARGETDIR))
+
+ifneq ($(filter linux,$(HOSTPLATFORM)),)
+PLATFORM:=$(PLATFORM.LINUX)
+else
+PLATFORM:=$(PLATFORM.WIN32)
+endif
+
+TARGET_TOOLS:=$(TARGETDIR)/qmake$(DOTEXE) $(TARGETDIR)/moc$(DOTEXE) $(TARGETDIR)/rcc$(DOTEXE) $(TARGETDIR)/uic$(DOTEXE) $(TARGETDIR)/lrelease$(DOTEXE)
+QT_TOOLS:= $(TOOLSSRCDIR)/uic $(TOOLSSRCDIR)/moc $(TOOLSSRCDIR)/rcc $(LANGUAGETOOLDIR)/lrelease
+SOURCE_TOOLS:=$(SOURCEDIR)/qmake$(DOTEXE) $(SOURCEDIR)/moc$(DOTEXE) $(SOURCEDIR)/rcc$(DOTEXE) $(SOURCEDIR)/uic$(DOTEXE) $(SOURCEDIR)/lrelease$(DOTEXE)
+
+define QtConfiguration
+ifneq ($(filter linux,$(HOSTPLATFORM)),)
+$(TARGET_TOOLS): $(QT_TOOLS)
+else
+$(TARGET_TOOLS): $(SOURCEDIR)/qmake$(DOTEXE)
+endif
+ $(call startrule,qtconf_deploy) \
+ $(GNUCP) $(SOURCEDIR)/$$(notdir $$@) $$@ \
+ $(call endrule,qtconf_deploy)
+
+ifneq ($(filter linux,$(HOSTPLATFORM)),)
+$(QT_TOOLS): $(TOOLSSRCDIR)/bootstrap
+ $(call startrule,qtconf_tools_build) \
+ cd $$@; \
+ $(GNUMAKE38); \
+ cd .. \
+ $(call endrule,qtconf_tools_build)
+
+$(TOOLSSRCDIR)/bootstrap:$(SOURCEDIR)/qmake$(DOTEXE)
+ $(call startrule,qtconf_bootstrap_build) \
+ cd $(TOOLSSRCDIR)/bootstrap; \
+ $(GNUMAKE38); \
+ cd .. \
+ $(call endrule,qtconf_bootstrap_build)
+endif
+
+
+$(SOURCEDIR)/qmake$(DOTEXE): $(EXTENSION_ROOT)/$(QT_ROOT)/$(CONFIGURE_APP)
+ $(call startrule,qtconf) \
+ cd $(EXTENSION_ROOT)/$(QT_ROOT) && unset INCLUDE && unset LIB && $(EXTENSION_ROOT)/$(QT_ROOT)/$(CONFIGURE_APP) -platform $(PLATFORM) -xplatform $(XPLATFORM) $(OPTIONS) \
+ $(call endrule,qtconf)
+ $(call startrule,headerexport) \
+ cd $(EXTENSION_ROOT)/$(QT_ROOT)/config.profiles/symbian && \
+ perl headerexport -base-dir $(EXTENSION_ROOT)/$(QT_ROOT) -copy -oneway -outdir $(EPOCROOT)/epoc32/include/ -outsubdir mw
+ $(call endrule,headerexport)
+ $(call startrule,mkspecexport) \
+ $(GNUCP) -R $(EXTENSION_ROOT)/$(QT_ROOT)/mkspecs $(MKSPECDIR)
+ $(call endrule,mkspecexport)
+endef
+
+# Here a variable named "done_<sanitised $SISFILE>" gets created
+GUARD:=done_$(call sanitise,$(TARGETDIR)/qmake$(DOTEXE))
+# If variable "done_..." not set, set it to 1, so that
+# UREL and UDEB do not execute makesis twice on the same target
+ifeq ($($(GUARD)),)
+$(GUARD):=1
+ifneq ($(filter linux,$(HOSTPLATFORM)),)
+EXPORT:: $(QT_TOOLS) $(TARGET_TOOLS)
+else
+EXPORT:: $(TARGET_TOOLS)
+endif
+$(eval $(call QtConfiguration))
+$(eval $(call whatmacro,$(TARGET_TOOLS)))
+ifeq ($(OSTYPE),unix)
+$(eval $(call GenerateStandardCleanTarget,$(QT_TOOLS) $(TARGET_TOOLS) $(SOURCE_TOOLS),$(TARGETDIR)))
+else
+$(eval $(call GenerateStandardCleanTarget,$(TARGET_TOOLS) $(SOURCE_TOOLS),$(TARGETDIR)))
+endif
+endif
diff --git a/config.profiles/symbian/qtconfig.xml b/config.profiles/symbian/qtconfig.xml
new file mode 100644
index 0000000..c2244d6
--- /dev/null
+++ b/config.profiles/symbian/qtconfig.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<build xmlns="http://symbian.com/xml/build"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symbian.com/xml/build http://symbian.com/xml/build/2_0.xsd">
+
+ <!-- Tools interfaces -->
+
+ <interface name="qt.qtconfig" extends="Symbian.UserFLM" flm="qtconfig.flm">
+ <param name='QT_ROOT' default='../..'/>
+ <param name='INSTALLPATH' default='epoc32/tools'/>
+ <param name='XPLATFORM' default='symbian-sbsv2'/>
+ <param name='PLATFORM.WIN32' default='win32-g++' />
+ <param name='PLATFORM.LINUX' default='linux-g++-32' />
+ <param name='OPTIONS' default='' />
+ </interface>
+
+</build>
diff --git a/config.profiles/symbian/sysdef_1_5_1.dtd b/config.profiles/symbian/sysdef_1_5_1.dtd
new file mode 100644
index 0000000..2defd21
--- /dev/null
+++ b/config.profiles/symbian/sysdef_1_5_1.dtd
@@ -0,0 +1,88 @@
+ <!ELEMENT SystemDefinition (systemModel?, build?)>
+ <!ATTLIST SystemDefinition
+ name CDATA #REQUIRED
+ schema CDATA #REQUIRED>
+ <!ELEMENT systemModel (layer+)>
+ <!ELEMENT layer (logicalset* | module*)*>
+ <!ATTLIST layer
+ name CDATA #REQUIRED
+ levels CDATA #IMPLIED
+ span CDATA #IMPLIED>
+ <!ELEMENT logicalset (logicalsubset* | module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalset name CDATA #REQUIRED>
+ <!ELEMENT logicalsubset (module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalsubset name CDATA #REQUIRED>
+ <!ELEMENT module (component* | unit* | package* | prebuilt*)*>
+ <!ATTLIST module
+ name CDATA #REQUIRED
+ level CDATA #IMPLIED>
+ <!ELEMENT component (unit* | package* | prebuilt*)*>
+ <!ATTLIST component name CDATA #REQUIRED>
+ <!ELEMENT unit EMPTY>
+ <!ATTLIST unit
+ unitID ID #REQUIRED
+ name CDATA #REQUIRED
+ mrp CDATA #REQUIRED
+ filter CDATA #IMPLIED
+ bldFile CDATA #REQUIRED
+ priority CDATA #IMPLIED
+ contract CDATA #IMPLIED
+ proFile CDATA #IMPLIED
+ qmakeArgs CDATA #IMPLIED>
+ <!ELEMENT package EMPTY>
+ <!ATTLIST package
+ name CDATA #REQUIRED
+ mrp CDATA #REQUIRED
+ filter CDATA #IMPLIED
+ contract CDATA #IMPLIED>
+ <!ELEMENT prebuilt EMPTY>
+ <!ATTLIST prebuilt
+ name CDATA #REQUIRED
+ version CDATA #REQUIRED
+ late (Y|N) #IMPLIED
+ filter CDATA #IMPLIED
+ contract CDATA #IMPLIED>
+ <!ELEMENT build (option* | target+ | targetList+ | unitList+ | configuration+)*>
+ <!ELEMENT unitList (unitRef+)>
+ <!ATTLIST unitList
+ name ID #REQUIRED
+ description CDATA #REQUIRED>
+ <!ELEMENT unitRef EMPTY>
+ <!ATTLIST unitRef unit IDREF #REQUIRED>
+ <!ELEMENT targetList EMPTY>
+ <!ATTLIST targetList
+ name ID #REQUIRED
+ description CDATA #REQUIRED
+ target IDREFS #REQUIRED>
+ <!ELEMENT target EMPTY>
+ <!ATTLIST target
+ name ID #REQUIRED
+ abldTarget CDATA #REQUIRED
+ description CDATA #REQUIRED>
+ <!ELEMENT option EMPTY>
+ <!ATTLIST option
+ name ID #REQUIRED
+ abldOption CDATA #REQUIRED
+ description CDATA #REQUIRED
+ enable (Y | N | y | n) #REQUIRED>
+ <!ELEMENT configuration (unitListRef+ | layerRef+ | task+)*>
+ <!ATTLIST configuration
+ name ID #REQUIRED
+ description CDATA #REQUIRED
+ filter CDATA #REQUIRED>
+ <!ELEMENT task ( unitListRef* , (buildLayer | specialInstructions))>
+ <!ELEMENT unitListRef EMPTY>
+ <!ATTLIST unitListRef unitList IDREF #REQUIRED>
+ <!ELEMENT layerRef EMPTY>
+ <!ATTLIST layerRef layerName CDATA #REQUIRED>
+ <!ELEMENT buildLayer EMPTY>
+ <!ATTLIST buildLayer
+ command CDATA #REQUIRED
+ targetList IDREFS #IMPLIED
+ unitParallel (Y | N | y | n) #REQUIRED
+ targetParallel (Y | N | y | n) #IMPLIED>
+ <!ELEMENT specialInstructions EMPTY>
+ <!ATTLIST specialInstructions
+ name CDATA #REQUIRED
+ cwd CDATA #REQUIRED
+ command CDATA #REQUIRED>
diff --git a/config.profiles/symbian/translations/qt_ar.ts b/config.profiles/symbian/translations/qt_ar.ts
new file mode 100644
index 0000000..f44dc98
--- /dev/null
+++ b/config.profiles/symbian/translations/qt_ar.ts
@@ -0,0 +1,7821 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!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
new file mode 100644
index 0000000..d876a9d
--- /dev/null
+++ b/config.profiles/symbian/translations/qt_fa.ts
@@ -0,0 +1,8507 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!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>
+</TS>
diff --git a/config.profiles/symbian/translations/qt_fr_symbian.ts b/config.profiles/symbian/translations/qt_fr_symbian.ts
new file mode 100644
index 0000000..c0b0699
--- /dev/null
+++ b/config.profiles/symbian/translations/qt_fr_symbian.ts
@@ -0,0 +1,8519 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE TS>
+
+<TS version="2.0" language="fr">
+ <context>
+ <name>CloseButton</name>
+ <message>
+ <source>Close Tab</source>
+ <translation>Fermer l&apos;onglet</translation>
+ </message>
+ </context>
+ <context>
+ <name>FakeReply</name>
+ <message>
+ <source>Fake error !</source>
+ <translation>Fausse erreur!</translation>
+ </message>
+ <message>
+ <source>Invalid URL</source>
+ <translation>URL non valide</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::</name>
+ <message>
+ <source>Notifications</source>
+ <translation>Notifications</translation>
+ </message>
+ <message>
+ <source>Music</source>
+ <translation>Musique</translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation>Vidéo</translation>
+ </message>
+ <message>
+ <source>Communication</source>
+ <translation>Communication</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation>Jeux</translation>
+ </message>
+ <message>
+ <source>Accessibility</source>
+ <translation>Accessibilité</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>&lt;html&gt;L&apos;appareil de lecture audio &lt;b&gt;%1&lt;/b&gt; ne fonctionne pas.&lt;br/&gt;Retour à &lt;b&gt;%2&lt;/b&gt;.&lt;/html&gt;</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>&lt;html&gt;Basculement vers l&apos;appareil de lecture audio &lt;b&gt;%1&lt;/b&gt;&lt;br/&gt;qui vient juste d&apos;être disponible et dont le niveau de préférence est plus élevé.&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>Revert back to device &apos;%1&apos;</source>
+ <translation>Revenir à l&apos;appareil &apos;%1&apos;</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>Attention: Vous n&apos;avez apparemment pas installé le paquet gstreamer0.10-plugins-good.
+Des fonctionnalités vidéo ont été desactivées.</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>Attention: Vous n&apos;avez apparemment pas installées les plugins de base de GStreamer.
+Le support audio et vidéo est désactivé</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>Un codec requis est manquant. Vous devez installer le codec suivant pour jouer le contenu: %0</translation>
+ </message>
+ <message>
+ <source>Could not open media source.</source>
+ <translation>Impossible d&apos;ouvrir le média source.</translation>
+ </message>
+ <message>
+ <source>Invalid source type.</source>
+ <translation>Type de source invalide.</translation>
+ </message>
+ <message>
+ <source>Could not locate media source.</source>
+ <translation>Impossible de localiser le média source.</translation>
+ </message>
+ <message>
+ <source>Could not open audio device. The device is already in use.</source>
+ <translation>Impossible d&apos;ouvrir le périphérique audio. Celui-ci est déjà en cours d&apos;utilisation.</translation>
+ </message>
+ <message>
+ <source>Could not decode media source.</source>
+ <translation>Impossible de décoder le média source.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF</name>
+ <message>
+ <source>Audio Output</source>
+ <translation>Sortie audio</translation>
+ </message>
+ <message>
+ <source>The audio output device</source>
+ <translation>Appareil de sortie audio</translation>
+ </message>
+ <message>
+ <source>No error</source>
+ <translation>Aucune erreur</translation>
+ </message>
+ <message>
+ <source>Not found</source>
+ <translation>Introuvable</translation>
+ </message>
+ <message>
+ <source>Out of memory</source>
+ <translation>Mémoire insuffisante</translation>
+ </message>
+ <message>
+ <source>Not supported</source>
+ <translation>Non supporté</translation>
+ </message>
+ <message>
+ <source>Overflow</source>
+ <translation>Dépassement</translation>
+ </message>
+ <message>
+ <source>Underflow</source>
+ <translation>Soupassement</translation>
+ </message>
+ <message>
+ <source>Already exists</source>
+ <translation>Existe déjà</translation>
+ </message>
+ <message>
+ <source>Path not found</source>
+ <translation>Chemin introuvable</translation>
+ </message>
+ <message>
+ <source>In use</source>
+ <translation>Utilisé</translation>
+ </message>
+ <message>
+ <source>Not ready</source>
+ <translation>Pas prêt</translation>
+ </message>
+ <message>
+ <source>Access denied</source>
+ <translation>Accès refusé</translation>
+ </message>
+ <message>
+ <source>Could not connect</source>
+ <translation>Connexion impossible</translation>
+ </message>
+ <message>
+ <source>Disconnected</source>
+ <translation>Déconnecté</translation>
+ </message>
+ <message>
+ <source>Permission denied</source>
+ <translation>Autorisation refusée</translation>
+ </message>
+ <message>
+ <source>Insufficient bandwidth</source>
+ <translation>Bande passante insuffisante</translation>
+ </message>
+ <message>
+ <source>Network unavailable</source>
+ <translation>Réseau non disponible</translation>
+ </message>
+ <message>
+ <source>Network communication error</source>
+ <translation>Erreur de communication réseau</translation>
+ </message>
+ <message>
+ <source>Streaming not supported</source>
+ <translation>Streaming non supporté</translation>
+ </message>
+ <message>
+ <source>Server alert</source>
+ <translation>Alerte serveur</translation>
+ </message>
+ <message>
+ <source>Invalid protocol</source>
+ <translation>Protocole non valide</translation>
+ </message>
+ <message>
+ <source>Invalid URL</source>
+ <translation>URL non valide</translation>
+ </message>
+ <message>
+ <source>Multicast error</source>
+ <translation>Erreur multicast</translation>
+ </message>
+ <message>
+ <source>Proxy server error</source>
+ <translation>Erreur du serveur proxy</translation>
+ </message>
+ <message>
+ <source>Proxy server not supported</source>
+ <translation>Serveur proxy non supporté</translation>
+ </message>
+ <message>
+ <source>Audio output error</source>
+ <translation>Erreur de sortie audio</translation>
+ </message>
+ <message>
+ <source>Video output error</source>
+ <translation>Erreur de sortie vidéo</translation>
+ </message>
+ <message>
+ <source>Decoder error</source>
+ <translation>Erreur du décodeur</translation>
+ </message>
+ <message>
+ <source>Audio or video components could not be played</source>
+ <translation>Les composants audio ou vidéo n&apos;ont pas pu être lus</translation>
+ </message>
+ <message>
+ <source>DRM error</source>
+ <translation>Erreur GDN</translation>
+ </message>
+ <message>
+ <source>Unknown error (%1)</source>
+ <translation>Erreur inconnue (%1)</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::AbstractMediaPlayer</name>
+ <message>
+ <source>Not ready to play</source>
+ <translation>Pas prêt pour lecture</translation>
+ </message>
+ <message>
+ <source>Error opening file</source>
+ <translation>Erreur lors de l&apos;ouverture du fichier</translation>
+ </message>
+ <message>
+ <source>Error opening URL</source>
+ <translation>Erreur lors de l&apos;ouverture de l&apos;URL</translation>
+ </message>
+ <message>
+ <source>Setting volume failed</source>
+ <translation>Le réglage du volume a échoué</translation>
+ </message>
+ <message>
+ <source>Playback complete</source>
+ <translation>Lecture terminée</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::AudioEqualizer</name>
+ <message>
+ <source>%1 Hz</source>
+ <translation>%1 Hz</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::AudioPlayer</name>
+ <message>
+ <source>Getting position failed</source>
+ <translation>L&apos;obtention de la position a échoué</translation>
+ </message>
+ <message>
+ <source>Opening clip failed</source>
+ <translation>L&apos;ouverture du clip a échoué</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::EffectFactory</name>
+ <message>
+ <source>Enabled</source>
+ <translation>Activé</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::EnvironmentalReverb</name>
+ <message>
+ <source>Decay HF ratio (%)</source>
+ <translation>Ratio HF du déclin (%)</translation>
+ </message>
+ <message>
+ <source>Decay time (ms)</source>
+ <translation>Temps de déclin (ms)</translation>
+ </message>
+ <message>
+ <source>Density (%)</source>
+ <translation>Densité (%)</translation>
+ </message>
+ <message>
+ <source>Diffusion (%)</source>
+ <translation>Diffusion (%)</translation>
+ </message>
+ <message>
+ <source>Reflections delay (ms)</source>
+ <translation>Délai réflexions (ms)</translation>
+ </message>
+ <message>
+ <source>Reflections level (mB)</source>
+ <translation>Niveau réflexions (mB)</translation>
+ </message>
+ <message>
+ <source>Reverb delay (ms)</source>
+ <translation>Délai de réverbération (ms)</translation>
+ </message>
+ <message>
+ <source>Reverb level (mB)</source>
+ <translation>Niveau de réverbération (mB)</translation>
+ </message>
+ <message>
+ <source>Room HF level</source>
+ <translation>Niveau HF pièce</translation>
+ </message>
+ <message>
+ <source>Room level (mB)</source>
+ <translation>Niveau pièce (mB)</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::MediaObject</name>
+ <message>
+ <source>Error opening source: type not supported</source>
+ <translation>Erreur lors de l&apos;ouverture de la source: type non supporté</translation>
+ </message>
+ <message>
+ <source>Error opening source: media type could not be determined</source>
+ <translation>Erreur lors de l&apos;ouverture de la source: type de média non déterminé</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::StereoWidening</name>
+ <message>
+ <source>Level (%)</source>
+ <translation>Niveau (%)</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::VideoPlayer</name>
+ <message>
+ <source>Pause failed</source>
+ <translation>La mise en pause a échoué</translation>
+ </message>
+ <message>
+ <source>Seek failed</source>
+ <translation>La recherche a échoué</translation>
+ </message>
+ <message>
+ <source>Getting position failed</source>
+ <translation>L&apos;obtention de la position a échoué</translation>
+ </message>
+ <message>
+ <source>Opening clip failed</source>
+ <translation>L&apos;ouverture du clip a échoué</translation>
+ </message>
+ <message>
+ <source>Buffering clip failed</source>
+ <translation>La mise en mémoire tampon du clip a échoué</translation>
+ </message>
+ <message>
+ <source>Video display error</source>
+ <translation>Erreur de l&apos;affichage vidéo</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::VolumeSlider</name>
+ <message>
+ <source>Volume: %1%</source>
+ <translation>Volume: %1%</translation>
+ </message>
+ <message>
+ <source>Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%</source>
+ <translation>Utilisez le slider pour ajuster le volume. La position la plus à gauche est 0%, la plus à droite est %1%</translation>
+ </message>
+ <message>
+ <source>Muted</source>
+ <translation>Son coupé</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3Accel</name>
+ <message>
+ <source>%1, %2 not defined</source>
+ <translation>La séquence %1, %2 n&apos;est pas définie</translation>
+ </message>
+ <message>
+ <source>Ambiguous %1 not handled</source>
+ <translation>Séquence ambiguë %1 non traitée</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3DataTable</name>
+ <message>
+ <source>True</source>
+ <translation>Vrai</translation>
+ </message>
+ <message>
+ <source>False</source>
+ <translation>Faux</translation>
+ </message>
+ <message>
+ <source>Insert</source>
+ <translation>Insérer</translation>
+ </message>
+ <message>
+ <source>Update</source>
+ <translation>Actualiser</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>Supprimer</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3FileDialog</name>
+ <message>
+ <source>Copy or Move a File</source>
+ <translation>Copie ou déplace un fichier</translation>
+ </message>
+ <message>
+ <source>Read: %1</source>
+ <translation>Lecture : %1</translation>
+ </message>
+ <message>
+ <source>Write: %1</source>
+ <translation>Écriture : %1</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>All Files (*)</source>
+ <translation>Tous les fichiers (*)</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Nom</translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation>Taille</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>Type</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation>Date</translation>
+ </message>
+ <message>
+ <source>Attributes</source>
+ <translation>Attributs</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Look &amp;in:</source>
+ <translation>Chercher &amp;dans :</translation>
+ </message>
+ <message>
+ <source>File &amp;name:</source>
+ <translation>&amp;Nom de fichier :</translation>
+ </message>
+ <message>
+ <source>File &amp;type:</source>
+ <translation>&amp;Type de fichier :</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation>Précédent (historique)</translation>
+ </message>
+ <message>
+ <source>One directory up</source>
+ <translation>Aller au dossier parent</translation>
+ </message>
+ <message>
+ <source>Create New Folder</source>
+ <translation>Créer un nouveau dossier</translation>
+ </message>
+ <message>
+ <source>List View</source>
+ <translation>Affichage liste</translation>
+ </message>
+ <message>
+ <source>Detail View</source>
+ <translation>Affichage détaillé</translation>
+ </message>
+ <message>
+ <source>Preview File Info</source>
+ <translation>Informations du fichier prévisualisé</translation>
+ </message>
+ <message>
+ <source>Preview File Contents</source>
+ <translation>Contenu du fichier prévisualisé</translation>
+ </message>
+ <message>
+ <source>Read-write</source>
+ <translation>Lecture-écriture</translation>
+ </message>
+ <message>
+ <source>Read-only</source>
+ <translation>Lecture seule</translation>
+ </message>
+ <message>
+ <source>Write-only</source>
+ <translation>Écriture seule</translation>
+ </message>
+ <message>
+ <source>Inaccessible</source>
+ <translation>Inaccessible</translation>
+ </message>
+ <message>
+ <source>Symlink to File</source>
+ <translation>Lien symbolique vers un fichier</translation>
+ </message>
+ <message>
+ <source>Symlink to Directory</source>
+ <translation>Lien symbolique vers un dossier</translation>
+ </message>
+ <message>
+ <source>Symlink to Special</source>
+ <translation>Lien symbolique vers un fichier spécial</translation>
+ </message>
+ <message>
+ <source>File</source>
+ <translation>Fichier</translation>
+ </message>
+ <message>
+ <source>Dir</source>
+ <translation>Dossier</translation>
+ </message>
+ <message>
+ <source>Special</source>
+ <translation>Fichier spécial</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>Ouvrir</translation>
+ </message>
+ <message>
+ <source>Save As</source>
+ <translation>Enregistrer sous</translation>
+ </message>
+ <message>
+ <source>&amp;Open</source>
+ <translation>&amp;Ouvrir</translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation>&amp;Enregistrer</translation>
+ </message>
+ <message>
+ <source>&amp;Rename</source>
+ <translation>&amp;Renommer</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>Suppri&amp;mer</translation>
+ </message>
+ <message>
+ <source>R&amp;eload</source>
+ <translation>R&amp;echarger</translation>
+ </message>
+ <message>
+ <source>Sort by &amp;Name</source>
+ <translation>Trier par &amp;nom</translation>
+ </message>
+ <message>
+ <source>Sort by &amp;Size</source>
+ <translation>Trier par ta&amp;ille</translation>
+ </message>
+ <message>
+ <source>Sort by &amp;Date</source>
+ <translation>Trier par &amp;date</translation>
+ </message>
+ <message>
+ <source>&amp;Unsorted</source>
+ <translation>&amp;Non trié</translation>
+ </message>
+ <message>
+ <source>Sort</source>
+ <translation>Tri</translation>
+ </message>
+ <message>
+ <source>Show &amp;hidden files</source>
+ <translation>Afficher les fic&amp;hiers cachés</translation>
+ </message>
+ <message>
+ <source>the file</source>
+ <translation>le fichier</translation>
+ </message>
+ <message>
+ <source>the directory</source>
+ <translation>le dossier</translation>
+ </message>
+ <message>
+ <source>the symlink</source>
+ <translation>le lien symbolique</translation>
+ </message>
+ <message>
+ <source>Delete %1</source>
+ <translation>Supprimer %1</translation>
+ </message>
+ <message>
+ <source>&lt;qt&gt;Are you sure you wish to delete %1 &quot;%2&quot;?&lt;/qt&gt;</source>
+ <translation>&lt;qt&gt;Voulez-vous vraiment supprimer %1 &quot;%2&quot; ?&lt;/qt&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Yes</source>
+ <translation>&amp;Oui</translation>
+ </message>
+ <message>
+ <source>&amp;No</source>
+ <translation>&amp;Non</translation>
+ </message>
+ <message>
+ <source>New Folder 1</source>
+ <translation>Nouveau dossier 1</translation>
+ </message>
+ <message>
+ <source>New Folder</source>
+ <translation>Nouveau dossier</translation>
+ </message>
+ <message>
+ <source>New Folder %1</source>
+ <translation>Nouveau dossier %1</translation>
+ </message>
+ <message>
+ <source>Find Directory</source>
+ <translation>Chercher dans le dossier</translation>
+ </message>
+ <message>
+ <source>Directories</source>
+ <translation>Dossiers</translation>
+ </message>
+ <message>
+ <source>Directory:</source>
+ <translation>Dossier :</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Erreur</translation>
+ </message>
+ <message>
+ <source>%1
+File not found.
+Check path and filename.</source>
+ <translation>%1
+Impossible de trouver le fichier.
+Vérifier le chemin et le nom du fichier.</translation>
+ </message>
+ <message>
+ <source>All Files (*.*)</source>
+ <translation>Tous les fichiers (*.*)</translation>
+ </message>
+ <message>
+ <source>Open </source>
+ <translation>Ouvrir</translation>
+ </message>
+ <message>
+ <source>Select a Directory</source>
+ <translation>Sélectionner un dossier</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3LocalFs</name>
+ <message>
+ <source>Could not read directory
+%1</source>
+ <translation>Impossible de lire le dossier
+%1</translation>
+ </message>
+ <message>
+ <source>Could not create directory
+%1</source>
+ <translation>Impossible de créer le dossier
+%1</translation>
+ </message>
+ <message>
+ <source>Could not remove file or directory
+%1</source>
+ <translation>Impossible de supprimer le fichier ou dossier
+%1</translation>
+ </message>
+ <message>
+ <source>Could not rename
+%1
+to
+%2</source>
+ <translation>Impossible de renommer
+%1
+en
+%2</translation>
+ </message>
+ <message>
+ <source>Could not open
+%1</source>
+ <translation>Impossible d&apos;ouvrir
+%1</translation>
+ </message>
+ <message>
+ <source>Could not write
+%1</source>
+ <translation>Impossible d&apos;écrire
+%1</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3MainWindow</name>
+ <message>
+ <source>Line up</source>
+ <translation>Aligner</translation>
+ </message>
+ <message>
+ <source>Customize...</source>
+ <translation>Personnaliser...</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3NetworkProtocol</name>
+ <message>
+ <source>Operation stopped by the user</source>
+ <translation>Opération interrompue par l&apos;utilisateur</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3ProgressDialog</name>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3TabDialog</name>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Apply</source>
+ <translation>Appliquer</translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation>Aide</translation>
+ </message>
+ <message>
+ <source>Defaults</source>
+ <translation>Par défaut</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3TextEdit</name>
+ <message>
+ <source>&amp;Undo</source>
+ <translation>&amp;Annuler</translation>
+ </message>
+ <message>
+ <source>&amp;Redo</source>
+ <translation>&amp;Rétablir</translation>
+ </message>
+ <message>
+ <source>Cu&amp;t</source>
+ <translation>Co&amp;uper</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>Cop&amp;ier</translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation>Co&amp;ller</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Effacer</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation>Tout sélectionner</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3TitleBar</name>
+ <message>
+ <source>System</source>
+ <translation>Système</translation>
+ </message>
+ <message>
+ <source>Restore up</source>
+ <translation>Restaurer en haut</translation>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation>Réduire</translation>
+ </message>
+ <message>
+ <source>Restore down</source>
+ <translation>Restaurer en bas</translation>
+ </message>
+ <message>
+ <source>Maximize</source>
+ <translation>Maximiser</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fermer</translation>
+ </message>
+ <message>
+ <source>Contains commands to manipulate the window</source>
+ <translation>Contient des commandes pour manipuler la fenêtre</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>Déplace la fenêtre à l&apos;écart</translation>
+ </message>
+ <message>
+ <source>Puts a maximized window back to normal</source>
+ <translation>Rend à une fenêtre minimisée son aspect normal</translation>
+ </message>
+ <message>
+ <source>Makes the window full screen</source>
+ <translation>Affiche la fenêtre en plein écran</translation>
+ </message>
+ <message>
+ <source>Closes the window</source>
+ <translation>Ferme la fenêtre</translation>
+ </message>
+ <message>
+ <source>Displays the name of the window and contains controls to manipulate it</source>
+ <translation>Affiche le nom de la fenêtre et contient des contrôles pour la manipuler</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3ToolBar</name>
+ <message>
+ <source>More...</source>
+ <translation>Reste...</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3UrlOperator</name>
+ <message>
+ <source>The protocol `%1&apos; is not supported</source>
+ <translation>Le protocole &apos;%1&apos; n&apos;est pas géré</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support listing directories</source>
+ <translation>Le protocole `%1&apos; ne permet pas de lister les fichiers d&apos;un dossier</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support creating new directories</source>
+ <translation>Le protocole `%1&apos; ne permet pas de créer de nouveaux dossiers</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support removing files or directories</source>
+ <translation>Le protocole `%1&apos; ne permet pas de supprimer des fichiers ou des dossiers</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support renaming files or directories</source>
+ <translation>Le protocole `%1&apos; ne permet pas de renommer des fichiers ou des dossiers</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support getting files</source>
+ <translation>Le protocole `%1&apos; ne permet pas de recevoir des fichiers</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support putting files</source>
+ <translation>Le protocole `%1&apos; ne permet pas d&apos;envoyer des fichiers</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support copying or moving files or directories</source>
+ <translation>Le protocole `%1&apos; ne permet pas de copier ou de déplacer des fichiers</translation>
+ </message>
+ <message>
+ <source>(unknown)</source>
+ <translation>(inconnu)</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3Wizard</name>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Annuler</translation>
+ </message>
+ <message>
+ <source>&lt; &amp;Back</source>
+ <translation>&lt; &amp;Précédent</translation>
+ </message>
+ <message>
+ <source>&amp;Next &gt;</source>
+ <translation>&amp;Suivant &gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Finish</source>
+ <translation>&amp;Terminer</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>&amp;Aide</translation>
+ </message>
+ </context>
+ <context>
+ <name>QAbstractSocket</name>
+ <message>
+ <source>Host not found</source>
+ <translation>Hôte introuvable</translation>
+ </message>
+ <message>
+ <source>Connection refused</source>
+ <translation>Connexion refusée</translation>
+ </message>
+ <message>
+ <source>Connection timed out</source>
+ <translation>Connexion expirée</translation>
+ </message>
+ <message>
+ <source>Operation on socket is not supported</source>
+ <translation>Opération sur socket non supportée</translation>
+ </message>
+ <message>
+ <source>Socket operation timed out</source>
+ <translation>Opération socket expirée</translation>
+ </message>
+ <message>
+ <source>Socket is not connected</source>
+ <translation>Le socket n&apos;est pas connecté</translation>
+ </message>
+ <message>
+ <source>Network unreachable</source>
+ <translation>Réseau impossible à rejoindre</translation>
+ </message>
+ </context>
+ <context>
+ <name>QAbstractSpinBox</name>
+ <message>
+ <source>&amp;Step up</source>
+ <translation>&amp;Augmenter</translation>
+ </message>
+ <message>
+ <source>Step &amp;down</source>
+ <translation>&amp;Diminuer</translation>
+ </message>
+ <message>
+ <source>&amp;Select All</source>
+ <translation>Tout &amp;sélectionner</translation>
+ </message>
+ </context>
+ <context>
+ <name>QAccessibleButton</name>
+ <message>
+ <source>Press</source>
+ <translation>Appuyer</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>LTR</translation>
+ </message>
+ <message>
+ <source>Executable &apos;%1&apos; requires Qt %2, found Qt %3.</source>
+ <translation>L&apos;exécutable &apos;%1&apos; requiert Qt %2 (Qt %3 présent).</translation>
+ </message>
+ <message>
+ <source>Incompatible Qt Library Error</source>
+ <translation>Erreur : bibliothèque Qt incompatible</translation>
+ </message>
+ <message>
+ <source>Activate</source>
+ <translation>Activer</translation>
+ </message>
+ <message>
+ <source>Activates the program&apos;s main window</source>
+ <translation>Active la fenêtre principale du programme</translation>
+ </message>
+ </context>
+ <context>
+ <name>QAxSelect</name>
+ <message>
+ <source>Select ActiveX Control</source>
+ <translation>Sélectionner un contrôle ActiveX</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Annuler</translation>
+ </message>
+ <message>
+ <source>COM &amp;Object:</source>
+ <translation>&amp;Objet COM :</translation>
+ </message>
+ </context>
+ <context>
+ <name>QCheckBox</name>
+ <message>
+ <source>Uncheck</source>
+ <translation>Décocher</translation>
+ </message>
+ <message>
+ <source>Check</source>
+ <translation>Cocher</translation>
+ </message>
+ <message>
+ <source>Toggle</source>
+ <translation>Changer</translation>
+ </message>
+ </context>
+ <context>
+ <name>QColorDialog</name>
+ <message>
+ <source>Hu&amp;e:</source>
+ <translation>&amp;Teinte :</translation>
+ </message>
+ <message>
+ <source>&amp;Sat:</source>
+ <translation>&amp;Saturation :</translation>
+ </message>
+ <message>
+ <source>&amp;Val:</source>
+ <translation>&amp;Valeur :</translation>
+ </message>
+ <message>
+ <source>&amp;Red:</source>
+ <translation>&amp;Rouge :</translation>
+ </message>
+ <message>
+ <source>&amp;Green:</source>
+ <translation>&amp;Vert :</translation>
+ </message>
+ <message>
+ <source>Bl&amp;ue:</source>
+ <translation>Ble&amp;u :</translation>
+ </message>
+ <message>
+ <source>A&amp;lpha channel:</source>
+ <translation>Canal a&amp;lpha :</translation>
+ </message>
+ <message>
+ <source>Select Color</source>
+ <translation>Sélectionner une couleur</translation>
+ </message>
+ <message>
+ <source>&amp;Basic colors</source>
+ <translation>Couleurs de &amp;base</translation>
+ </message>
+ <message>
+ <source>&amp;Custom colors</source>
+ <translation>&amp;Couleurs personnalisées</translation>
+ </message>
+ <message>
+ <source>&amp;Add to Custom Colors</source>
+ <translation>&amp;Ajouter aux couleurs personnalisées</translation>
+ </message>
+ </context>
+ <context>
+ <name>QComboBox</name>
+ <message>
+ <source>Open</source>
+ <translation>Ouvrir</translation>
+ </message>
+ <message>
+ <source>False</source>
+ <translation>Faux</translation>
+ </message>
+ <message>
+ <source>True</source>
+ <translation>Vrai</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fermer</translation>
+ </message>
+ </context>
+ <context>
+ <name>QCoreApplication</name>
+ <message>
+ <source>%1: key is empty</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1: clé vide</translation>
+ </message>
+ <message>
+ <source>%1: unable to make key</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1: impossible de créer la clé</translation>
+ </message>
+ <message>
+ <source>%1: ftok failed</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1: ftok a échoué</translation>
+ </message>
+ <message>
+ <source>%1: already exists</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1: existe déjà</translation>
+ </message>
+ <message>
+ <source>%1: does not exist</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1: n&apos;existe pas</translation>
+ </message>
+ <message>
+ <source>%1: out of resources</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1: plus de ressources disponibles</translation>
+ </message>
+ <message>
+ <source>%1: unknown error %2</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1: erreur inconnue %2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QDB2Driver</name>
+ <message>
+ <source>Unable to connect</source>
+ <translation>Incapable d&apos;établir une connexion</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>Incapable de soumettre la transaction</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>Incapable d&apos;annuler la transaction</translation>
+ </message>
+ <message>
+ <source>Unable to set autocommit</source>
+ <translation>Impossible d&apos;activer l&apos;auto-soumission</translation>
+ </message>
+ </context>
+ <context>
+ <name>QDB2Result</name>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>Impossible d&apos;exécuter la requête</translation>
+ </message>
+ <message>
+ <source>Unable to prepare statement</source>
+ <translation>Impossible de prépare la requête</translation>
+ </message>
+ <message>
+ <source>Unable to bind variable</source>
+ <translation>Impossible d&apos;attacher la variable</translation>
+ </message>
+ <message>
+ <source>Unable to fetch record %1</source>
+ <translation>Impossible de récupérer l&apos;enregistrement %1</translation>
+ </message>
+ <message>
+ <source>Unable to fetch next</source>
+ <translation>Impossible de récupérer le suivant</translation>
+ </message>
+ <message>
+ <source>Unable to fetch first</source>
+ <translation>Impossible de récupérer le premier</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>Tachymètre</translation>
+ </message>
+ <message>
+ <source>SliderHandle</source>
+ <translation>Poignée</translation>
+ </message>
+ </context>
+ <context>
+ <name>QDialog</name>
+ <message>
+ <source>What&apos;s This?</source>
+ <translation>Qu&apos;est-ce que c&apos;est ?</translation>
+ </message>
+ <message>
+ <source>Done</source>
+ <translation>Terminer</translation>
+ </message>
+ </context>
+ <context>
+ <name>QDialogButtonBox</name>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation>Enregistrer</translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation>Enregi&amp;strer</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>Ouvrir</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Annuler</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fermer</translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation>&amp;Fermer</translation>
+ </message>
+ <message>
+ <source>Apply</source>
+ <translation>Appliquer</translation>
+ </message>
+ <message>
+ <source>Reset</source>
+ <translation>Réinitialiser</translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation>Aide</translation>
+ </message>
+ <message>
+ <source>Don&apos;t Save</source>
+ <translation>Ne pas enregistrer</translation>
+ </message>
+ <message>
+ <source>Discard</source>
+ <translation>Ne pas enregistrer</translation>
+ </message>
+ <message>
+ <source>&amp;Yes</source>
+ <translation>&amp;Oui</translation>
+ </message>
+ <message>
+ <source>Yes to &amp;All</source>
+ <translation>Oui à &amp;tout</translation>
+ </message>
+ <message>
+ <source>&amp;No</source>
+ <translation>&amp;Non</translation>
+ </message>
+ <message>
+ <source>N&amp;o to All</source>
+ <translation>Non à to&amp;ut</translation>
+ </message>
+ <message>
+ <source>Save All</source>
+ <translation>Tout Enregistrer</translation>
+ </message>
+ <message>
+ <source>Abort</source>
+ <translation>Abandonner</translation>
+ </message>
+ <message>
+ <source>Retry</source>
+ <translation>Réessayer</translation>
+ </message>
+ <message>
+ <source>Ignore</source>
+ <translation>Ignorer</translation>
+ </message>
+ <message>
+ <source>Restore Defaults</source>
+ <translation>Restaurer les valeurs par défaut</translation>
+ </message>
+ <message>
+ <source>Close without Saving</source>
+ <translation>Fermer sans sauvegarder</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ </context>
+ <context>
+ <name>QDirModel</name>
+ <message>
+ <source>Name</source>
+ <translation>Nom</translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation>Taille</translation>
+ </message>
+ <message>
+ <source>Kind</source>
+ <comment>Match OS X Finder</comment>
+ <translation>Type</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <comment>All other platforms</comment>
+ <translation>Type</translation>
+ </message>
+ <message>
+ <source>Date Modified</source>
+ <translation>Dernière Modification</translation>
+ </message>
+ </context>
+ <context>
+ <name>QDockWidget</name>
+ <message>
+ <source>Close</source>
+ <translation>Fermer</translation>
+ </message>
+ <message>
+ <source>Dock</source>
+ <translation>Attacher</translation>
+ </message>
+ <message>
+ <source>Float</source>
+ <translation>Détacher</translation>
+ </message>
+ </context>
+ <context>
+ <name>QDoubleSpinBox</name>
+ <message>
+ <source>More</source>
+ <translation>Plus</translation>
+ </message>
+ <message>
+ <source>Less</source>
+ <translation>Moins</translation>
+ </message>
+ </context>
+ <context>
+ <name>QErrorMessage</name>
+ <message>
+ <source>&amp;Show this message again</source>
+ <translation>&amp;Afficher ce message de nouveau</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Debug Message:</source>
+ <translation>Message de débogage:</translation>
+ </message>
+ <message>
+ <source>Warning:</source>
+ <translation>Avertissement:</translation>
+ </message>
+ <message>
+ <source>Fatal Error:</source>
+ <translation>Erreur fatale:</translation>
+ </message>
+ </context>
+ <context>
+ <name>QFile</name>
+ <message>
+ <source>Destination file exists</source>
+ <translation>Le fichier destination existe</translation>
+ </message>
+ <message>
+ <source>Will not rename sequential file using block copy</source>
+ <translation>Ne renommera pas le fichier séquentiel avec la copie bloc</translation>
+ </message>
+ <message>
+ <source>Cannot remove source file</source>
+ <translation>Impossible de supprimer le fichier source</translation>
+ </message>
+ <message>
+ <source>Cannot open %1 for input</source>
+ <translation>Impossible d&apos;ouvrir %1 pour lecture</translation>
+ </message>
+ <message>
+ <source>Cannot open for output</source>
+ <translation>Impossible d&apos;ouvrir pour écriture</translation>
+ </message>
+ <message>
+ <source>Failure to write block</source>
+ <translation>Impossible d&apos;écrire un bloc</translation>
+ </message>
+ <message>
+ <source>Cannot create %1 for output</source>
+ <translation>Impossible de créer %1 pour écriture</translation>
+ </message>
+ </context>
+ <context>
+ <name>QFileDialog</name>
+ <message>
+ <source>All Files (*)</source>
+ <translation>Tous les fichiers (*)</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation>Précédent (historique)</translation>
+ </message>
+ <message>
+ <source>List View</source>
+ <translation>Affichage liste</translation>
+ </message>
+ <message>
+ <source>Detail View</source>
+ <translation>Affichage détaillé</translation>
+ </message>
+ <message>
+ <source>File</source>
+ <translation>Fichier</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>Ouvrir</translation>
+ </message>
+ <message>
+ <source>Save As</source>
+ <translation>Enregistrer sous</translation>
+ </message>
+ <message>
+ <source>&amp;Open</source>
+ <translation>&amp;Ouvrir</translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation>&amp;Enregistrer</translation>
+ </message>
+ <message>
+ <source>Recent Places</source>
+ <translation>Emplacements récents</translation>
+ </message>
+ <message>
+ <source>&amp;Rename</source>
+ <translation>&amp;Renommer</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>Suppri&amp;mer</translation>
+ </message>
+ <message>
+ <source>Show &amp;hidden files</source>
+ <translation>Afficher les fic&amp;hiers cachés</translation>
+ </message>
+ <message>
+ <source>New Folder</source>
+ <translation>Nouveau dossier</translation>
+ </message>
+ <message>
+ <source>Find Directory</source>
+ <translation>Chercher dans le dossier</translation>
+ </message>
+ <message>
+ <source>Directories</source>
+ <translation>Dossiers</translation>
+ </message>
+ <message>
+ <source>All Files (*.*)</source>
+ <translation>Tous les fichiers (*.*)</translation>
+ </message>
+ <message>
+ <source>Directory:</source>
+ <translation>Dossier :</translation>
+ </message>
+ <message>
+ <source>%1 already exists.
+Do you want to replace it?</source>
+ <translation>Le fichier %1 existe déjà. Voulez-vous l&apos;écraser ?</translation>
+ </message>
+ <message>
+ <source>%1
+File not found.
+Please verify the correct file name was given.</source>
+ <translation>%1
+Fichier introuvable.
+Veuillez vérifier que le nom du fichier est correct.</translation>
+ </message>
+ <message>
+ <source>My Computer</source>
+ <translation>Poste de travail</translation>
+ </message>
+ <message>
+ <source>Parent Directory</source>
+ <translation>Dossier parent</translation>
+ </message>
+ <message>
+ <source>Files of type:</source>
+ <translation>Fichiers de type :</translation>
+ </message>
+ <message>
+ <source>%1
+Directory not found.
+Please verify the correct directory name was given.</source>
+ <translation>%1
+Dossier introuvable.
+Veuillez vérifier que le nom du dossier est correct.</translation>
+ </message>
+ <message>
+ <source>&apos;%1&apos; is write protected.
+Do you want to delete it anyway?</source>
+ <translation>&apos;%1&apos; est protégé en écriture.
+Voulez-vous quand même le supprimer ?</translation>
+ </message>
+ <message>
+ <source>Are sure you want to delete &apos;%1&apos;?</source>
+ <translation>Etes-vous sûr de vouloir supprimer &apos;%1&apos; ?</translation>
+ </message>
+ <message>
+ <source>Could not delete directory.</source>
+ <translation>Impossible de supprimer le dossier.</translation>
+ </message>
+ <message>
+ <source>Drive</source>
+ <translation>Unité</translation>
+ </message>
+ <message>
+ <source>File Folder</source>
+ <comment>Match Windows Explorer</comment>
+ <translation>Fichier Dossier</translation>
+ </message>
+ <message>
+ <source>Folder</source>
+ <comment>All other platforms</comment>
+ <translation>Dossier</translation>
+ </message>
+ <message>
+ <source>Alias</source>
+ <comment>Mac OS X Finder</comment>
+ <translation>Pseudo</translation>
+ </message>
+ <message>
+ <source>Shortcut</source>
+ <comment>All other platforms</comment>
+ <translation>Raccourci</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation>Inconnu</translation>
+ </message>
+ <message>
+ <source>Show </source>
+ <translation>Montrer </translation>
+ </message>
+ <message>
+ <source>Forward</source>
+ <translation>Successeur</translation>
+ </message>
+ <message>
+ <source>&amp;New Folder</source>
+ <translation>&amp;Nouveau dossier</translation>
+ </message>
+ <message>
+ <source>&amp;Choose</source>
+ <translation>&amp;Choisir</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Supprimer</translation>
+ </message>
+ <message>
+ <source>File &amp;name:</source>
+ <translation>&amp;Nom de fichier :</translation>
+ </message>
+ <message>
+ <source>Look in:</source>
+ <translation>Voir dans:</translation>
+ </message>
+ <message>
+ <source>Create New Folder</source>
+ <translation>Créer un nouveau dossier</translation>
+ </message>
+ </context>
+ <context>
+ <name>QFileSystemModel</name>
+ <message>
+ <source>%1 TB</source>
+ <translation>%1 To</translation>
+ </message>
+ <message>
+ <source>%1 GB</source>
+ <translation>%1 Go</translation>
+ </message>
+ <message>
+ <source>%1 MB</source>
+ <translation>%1 Mo</translation>
+ </message>
+ <message>
+ <source>%1 KB</source>
+ <translation>%1 Ko</translation>
+ </message>
+ <message>
+ <source>%1 bytes</source>
+ <translation>%1 octets</translation>
+ </message>
+ <message>
+ <source>Invalid filename</source>
+ <translation>Nom de fichier invalide</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;Le nom &quot;%1&quot; ne peut pas être utilisé.&lt;/b&gt;&lt;p&gt;Essayez un autre nom avec moins de caractères ou sans ponctuation.</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Nom</translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation>Taille</translation>
+ </message>
+ <message>
+ <source>Kind</source>
+ <comment>Match OS X Finder</comment>
+ <translation>Type</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <comment>All other platforms</comment>
+ <translation>Type</translation>
+ </message>
+ <message>
+ <source>Date Modified</source>
+ <translation>Dernière modification</translation>
+ </message>
+ <message>
+ <source>My Computer</source>
+ <translation>Mon ordinateur</translation>
+ </message>
+ <message>
+ <source>Computer</source>
+ <translation>Ordinateur</translation>
+ </message>
+ <message>
+ <source>%1 byte(s)</source>
+ <translation>%1 octet(s)</translation>
+ </message>
+ </context>
+ <context>
+ <name>QFontDatabase</name>
+ <message>
+ <source>Normal</source>
+ <translation>Normal</translation>
+ </message>
+ <message>
+ <source>Bold</source>
+ <translation>Gras</translation>
+ </message>
+ <message>
+ <source>Demi Bold</source>
+ <translation>Semi Gras</translation>
+ </message>
+ <message>
+ <source>Black</source>
+ <translation>Noir</translation>
+ </message>
+ <message>
+ <source>Demi</source>
+ <translation>Demi</translation>
+ </message>
+ <message>
+ <source>Light</source>
+ <translation>Léger</translation>
+ </message>
+ <message>
+ <source>Italic</source>
+ <translation>Italique</translation>
+ </message>
+ <message>
+ <source>Oblique</source>
+ <translation>Oblique</translation>
+ </message>
+ <message>
+ <source>Any</source>
+ <translation>Tous</translation>
+ </message>
+ <message>
+ <source>Latin</source>
+ <translation>Latin</translation>
+ </message>
+ <message>
+ <source>Greek</source>
+ <translation>Grec</translation>
+ </message>
+ <message>
+ <source>Cyrillic</source>
+ <translation>Cyrillique</translation>
+ </message>
+ <message>
+ <source>Armenian</source>
+ <translation>Arménien</translation>
+ </message>
+ <message>
+ <source>Hebrew</source>
+ <translation>Hébreu</translation>
+ </message>
+ <message>
+ <source>Arabic</source>
+ <translation>Arabe</translation>
+ </message>
+ <message>
+ <source>Syriac</source>
+ <translation>Syriaque</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>Thaï</translation>
+ </message>
+ <message>
+ <source>Lao</source>
+ <translation>Lao</translation>
+ </message>
+ <message>
+ <source>Tibetan</source>
+ <translation>Tibétain</translation>
+ </message>
+ <message>
+ <source>Myanmar</source>
+ <translation>Myanmar</translation>
+ </message>
+ <message>
+ <source>Georgian</source>
+ <translation>Géorgien</translation>
+ </message>
+ <message>
+ <source>Khmer</source>
+ <translation>Khmer</translation>
+ </message>
+ <message>
+ <source>Simplified Chinese</source>
+ <translation>Chinois Simplifié</translation>
+ </message>
+ <message>
+ <source>Traditional Chinese</source>
+ <translation>Chinois Traditionnel</translation>
+ </message>
+ <message>
+ <source>Japanese</source>
+ <translation>Japonais</translation>
+ </message>
+ <message>
+ <source>Korean</source>
+ <translation>Coréen</translation>
+ </message>
+ <message>
+ <source>Vietnamese</source>
+ <translation>Vietnamien</translation>
+ </message>
+ <message>
+ <source>Symbol</source>
+ <translation>Symbole</translation>
+ </message>
+ <message>
+ <source>Ogham</source>
+ <translation>Ogham</translation>
+ </message>
+ <message>
+ <source>Runic</source>
+ <translation>Runique</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;Police</translation>
+ </message>
+ <message>
+ <source>Font st&amp;yle</source>
+ <translation>St&amp;yle de police</translation>
+ </message>
+ <message>
+ <source>&amp;Size</source>
+ <translation>&amp;Taille</translation>
+ </message>
+ <message>
+ <source>Effects</source>
+ <translation>Effets</translation>
+ </message>
+ <message>
+ <source>Stri&amp;keout</source>
+ <translation>&amp;Barré</translation>
+ </message>
+ <message>
+ <source>&amp;Underline</source>
+ <translation>&amp;Souligné</translation>
+ </message>
+ <message>
+ <source>Sample</source>
+ <translation>Exemple</translation>
+ </message>
+ <message>
+ <source>Select Font</source>
+ <translation>Choisir une police</translation>
+ </message>
+ <message>
+ <source>Wr&amp;iting System</source>
+ <translation>&amp;Système d&apos;écriture</translation>
+ </message>
+ </context>
+ <context>
+ <name>QFtp</name>
+ <message>
+ <source>Host %1 found</source>
+ <translation>Hôte %1 trouvé</translation>
+ </message>
+ <message>
+ <source>Host found</source>
+ <translation>Hôte trouvé</translation>
+ </message>
+ <message>
+ <source>Connected to host %1</source>
+ <translation>Connecté à l&apos;hôte %1</translation>
+ </message>
+ <message>
+ <source>Connected to host</source>
+ <translation>Connecté à l&apos;hôte</translation>
+ </message>
+ <message>
+ <source>Connection to %1 closed</source>
+ <translation>Connexion à %1 arrêtée</translation>
+ </message>
+ <message>
+ <source>Connection closed</source>
+ <translation>Connexion arrêtée</translation>
+ </message>
+ <message>
+ <source>Host %1 not found</source>
+ <translation>Hôte %1 introuvable</translation>
+ </message>
+ <message>
+ <source>Connection refused to host %1</source>
+ <translation>Connexion à l&apos;hôte %1 refusée</translation>
+ </message>
+ <message>
+ <source>Connection timed out to host %1</source>
+ <translation>Connexion expirée vers l&apos;hôte %1</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>Erreur inconnue</translation>
+ </message>
+ <message>
+ <source>Connecting to host failed:
+%1</source>
+ <translation>Échec de la connexion à l&apos;hôte
+%1</translation>
+ </message>
+ <message>
+ <source>Login failed:
+%1</source>
+ <translation>Échec du login:
+%1</translation>
+ </message>
+ <message>
+ <source>Listing directory failed:
+%1</source>
+ <translation>Échec du listage du dossier :
+%1</translation>
+ </message>
+ <message>
+ <source>Changing directory failed:
+%1</source>
+ <translation>Échec du changement de dossier :
+%1</translation>
+ </message>
+ <message>
+ <source>Downloading file failed:
+%1</source>
+ <translation>Échec du téléchargement du fichier :
+%1</translation>
+ </message>
+ <message>
+ <source>Uploading file failed:
+%1</source>
+ <translation>Échec du télédéchargement :
+%1</translation>
+ </message>
+ <message>
+ <source>Removing file failed:
+%1</source>
+ <translation>Échec de la suppression d&apos;un fichier :
+%1</translation>
+ </message>
+ <message>
+ <source>Creating directory failed:
+%1</source>
+ <translation>Échec de la création d&apos;un dossier :
+%1</translation>
+ </message>
+ <message>
+ <source>Removing directory failed:
+%1</source>
+ <translation>Échec de la suppression d&apos;un dossier :
+%1</translation>
+ </message>
+ <message>
+ <source>Not connected</source>
+ <translation>Non connecté</translation>
+ </message>
+ <message>
+ <source>Connection refused for data connection</source>
+ <translation>Connexion donnée refusée</translation>
+ </message>
+ </context>
+ <context>
+ <name>QHostInfo</name>
+ <message>
+ <source>Unknown error</source>
+ <translation>Erreur inconnue</translation>
+ </message>
+ </context>
+ <context>
+ <name>QHostInfoAgent</name>
+ <message>
+ <source>Host not found</source>
+ <translation>Hôte introuvable</translation>
+ </message>
+ <message>
+ <source>Unknown address type</source>
+ <translation>Adresse de type inconnu</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>Erreur inconnue</translation>
+ </message>
+ <message>
+ <source>No host name given</source>
+ <translation>Aucun nom d&apos;hôte n&apos;a été donné</translation>
+ </message>
+ <message>
+ <source>Invalid hostname</source>
+ <translation>Nom d&apos;hôte non valide</translation>
+ </message>
+ </context>
+ <context>
+ <name>QHttp</name>
+ <message>
+ <source>Connection refused</source>
+ <translation>Connexion refusée</translation>
+ </message>
+ <message>
+ <source>Host %1 not found</source>
+ <translation>Hôte %1 introuvable</translation>
+ </message>
+ <message>
+ <source>Wrong content length</source>
+ <translation>Longueur du contenu invalide</translation>
+ </message>
+ <message>
+ <source>HTTP request failed</source>
+ <translation>Échec de la requête HTTP</translation>
+ </message>
+ <message>
+ <source>Host %1 found</source>
+ <translation>Hôte %1 trouvé</translation>
+ </message>
+ <message>
+ <source>Host found</source>
+ <translation>Hôte trouvé</translation>
+ </message>
+ <message>
+ <source>Connected to host %1</source>
+ <translation>Connecté à l&apos;hôte %1</translation>
+ </message>
+ <message>
+ <source>Connected to host</source>
+ <translation>Connecté à l&apos;hôte</translation>
+ </message>
+ <message>
+ <source>Connection to %1 closed</source>
+ <translation>Connexion à %1 arrêtée</translation>
+ </message>
+ <message>
+ <source>Connection closed</source>
+ <translation>Connexion arrêtée</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>Erreur inconnue</translation>
+ </message>
+ <message>
+ <source>Request aborted</source>
+ <translation>Requête interrompue</translation>
+ </message>
+ <message>
+ <source>No server set to connect to</source>
+ <translation>Aucun serveur spécifié</translation>
+ </message>
+ <message>
+ <source>Server closed connection unexpectedly</source>
+ <translation>Connexion interrompue par le serveur</translation>
+ </message>
+ <message>
+ <source>Invalid HTTP response header</source>
+ <translation>Entête de réponse HTTP invalide</translation>
+ </message>
+ <message>
+ <source>Unknown authentication method</source>
+ <translation>Méthode d&apos;authentification inconnue</translation>
+ </message>
+ <message>
+ <source>Invalid HTTP chunked body</source>
+ <translation>Fragment HTTP invalide</translation>
+ </message>
+ <message>
+ <source>Error writing response to device</source>
+ <translation>Erreur lors de l&apos;écriture de la réponse</translation>
+ </message>
+ <message>
+ <source>Proxy authentication required</source>
+ <translation>Le proxy requiert une authentification</translation>
+ </message>
+ <message>
+ <source>Authentication required</source>
+ <translation>Authentification requise</translation>
+ </message>
+ <message>
+ <source>Proxy requires authentication</source>
+ <translation>Le proxy requiert une authentification</translation>
+ </message>
+ <message>
+ <source>Host requires authentication</source>
+ <translation>L&apos;hôte requiert une authentification</translation>
+ </message>
+ <message>
+ <source>Data corrupted</source>
+ <translation>Données corrompues</translation>
+ </message>
+ <message>
+ <source>SSL handshake failed</source>
+ <translation>le handshake SSL a échoué</translation>
+ </message>
+ <message>
+ <source>Unknown protocol specified</source>
+ <translation>Protocole spécifié inconnu</translation>
+ </message>
+ <message>
+ <source>Connection refused (or timed out)</source>
+ <translation>Connexion refusée (ou délai expiré)</translation>
+ </message>
+ <message>
+ <source>HTTPS connection requested but SSL support not compiled in</source>
+ <translation>Connexion HTTPS requise mais le support SSL n&apos;est pas compilé</translation>
+ </message>
+ </context>
+ <context>
+ <name>QHttpSocketEngine</name>
+ <message>
+ <source>Did not receive HTTP response from proxy</source>
+ <translation>Pas de réponse HTTP de la part du proxy</translation>
+ </message>
+ <message>
+ <source>Error parsing authentication request from proxy</source>
+ <translation>Erreur dans le reqête d&apos;authentification reçue du proxy</translation>
+ </message>
+ <message>
+ <source>Authentication required</source>
+ <translation>Authentification requise</translation>
+ </message>
+ <message>
+ <source>Proxy denied connection</source>
+ <translation>Le Proxy a rejeté la connexion</translation>
+ </message>
+ <message>
+ <source>Error communicating with HTTP proxy</source>
+ <translation>Erreur de communication avec le proxy HTTP</translation>
+ </message>
+ <message>
+ <source>Proxy server not found</source>
+ <translation>Serveur proxy introuvable</translation>
+ </message>
+ <message>
+ <source>Proxy connection refused</source>
+ <translation>Connexion au proxy refusée</translation>
+ </message>
+ <message>
+ <source>Proxy server connection timed out</source>
+ <translation>La connexion au serveur proxy a expiré</translation>
+ </message>
+ <message>
+ <source>Proxy connection closed prematurely</source>
+ <translation>La connexion au serveur proxy a été fermée prématurément</translation>
+ </message>
+ </context>
+ <context>
+ <name>QIBaseDriver</name>
+ <message>
+ <source>Error opening database</source>
+ <translation>Erreur d&apos;ouverture de la base de données</translation>
+ </message>
+ <message>
+ <source>Could not start transaction</source>
+ <translation>La transaction n&apos;a pas pu être démarrée</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>Incapable de soumettre la transaction</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>Incapable d&apos;annuler la transaction</translation>
+ </message>
+ </context>
+ <context>
+ <name>QIBaseResult</name>
+ <message>
+ <source>Unable to create BLOB</source>
+ <translation>Impossible de créer un BLOB</translation>
+ </message>
+ <message>
+ <source>Unable to write BLOB</source>
+ <translation>Impossible d&apos;écrire le BLOB</translation>
+ </message>
+ <message>
+ <source>Unable to open BLOB</source>
+ <translation>Impossible d&apos;ouvrir le BLOB</translation>
+ </message>
+ <message>
+ <source>Unable to read BLOB</source>
+ <translation>Impossible de lire le BLOB</translation>
+ </message>
+ <message>
+ <source>Could not find array</source>
+ <translation>Impossible de trouver le tableau</translation>
+ </message>
+ <message>
+ <source>Could not get array data</source>
+ <translation>Impossible de trouver le tableau de données</translation>
+ </message>
+ <message>
+ <source>Could not get query info</source>
+ <translation>Impossible d&apos;avoir les informations sur la requête</translation>
+ </message>
+ <message>
+ <source>Could not start transaction</source>
+ <translation>Impossible de démarrer la transaction</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>Incapable de soumettre la transaction</translation>
+ </message>
+ <message>
+ <source>Could not allocate statement</source>
+ <translation>Impossible d&apos;allouer la requête</translation>
+ </message>
+ <message>
+ <source>Could not prepare statement</source>
+ <translation>Impossible de préparer la requête</translation>
+ </message>
+ <message>
+ <source>Could not describe input statement</source>
+ <translation>Impossible de décrire la requête</translation>
+ </message>
+ <message>
+ <source>Could not describe statement</source>
+ <translation>Impossible de décrire la requête</translation>
+ </message>
+ <message>
+ <source>Unable to close statement</source>
+ <translation>Impossible de fermer la requête</translation>
+ </message>
+ <message>
+ <source>Unable to execute query</source>
+ <translation>Impossible d&apos;exécuter la requête</translation>
+ </message>
+ <message>
+ <source>Could not fetch next item</source>
+ <translation>Impossible de récuperer l&apos;élément suivant</translation>
+ </message>
+ <message>
+ <source>Could not get statement info</source>
+ <translation>Impossible d&apos;avoir les informations sur la requête</translation>
+ </message>
+ </context>
+ <context>
+ <name>QIODevice</name>
+ <message>
+ <source>Permission denied</source>
+ <translation>Accès refusé</translation>
+ </message>
+ <message>
+ <source>Too many open files</source>
+ <translation>Trop de fichiers ouverts simultanément</translation>
+ </message>
+ <message>
+ <source>No such file or directory</source>
+ <translation>Aucun fichier ou dossier de ce nom</translation>
+ </message>
+ <message>
+ <source>No space left on device</source>
+ <translation>Aucun espace disponible sur le périphérique</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>Erreur inconnue</translation>
+ </message>
+ </context>
+ <context>
+ <name>QInputContext</name>
+ <message>
+ <source>XIM</source>
+ <translation>XIM</translation>
+ </message>
+ <message>
+ <source>FEP</source>
+ <translation>Processeur frontal</translation>
+ </message>
+ <message>
+ <source>XIM input method</source>
+ <translation>Méthode d&apos;entrée XIM</translation>
+ </message>
+ <message>
+ <source>Windows input method</source>
+ <translation>Méthode d&apos;entrée Windows</translation>
+ </message>
+ <message>
+ <source>Mac OS X input method</source>
+ <translation>Méthode d&apos;entrée Mac OS X</translation>
+ </message>
+ <message>
+ <source>S60 FEP input method</source>
+ <translation>Méthode de saisie processeur frontal S60</translation>
+ </message>
+ </context>
+ <context>
+ <name>QInputDialog</name>
+ <message>
+ <source>Enter a value:</source>
+ <translation>Entrer une valeur :</translation>
+ </message>
+ </context>
+ <context>
+ <name>QLibrary</name>
+ <message>
+ <source>Could not mmap &apos;%1&apos;: %2</source>
+ <translation>Impossible d&apos;établir la projection en mémoire de &apos;%1&apos; : %2</translation>
+ </message>
+ <message>
+ <source>Plugin verification data mismatch in &apos;%1&apos;</source>
+ <translation>Données de vérification du plugin différente dans &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <source>Could not unmap &apos;%1&apos;: %2</source>
+ <translation>Impossible de supprimer la projection en mémoire de &apos;%1&apos; : %2</translation>
+ </message>
+ <message>
+ <source>The plugin &apos;%1&apos; uses incompatible Qt library. (%2.%3.%4) [%5]</source>
+ <translation>Le plugin &apos;%1&apos; utilise une bibliothèque Qt incompatible. (%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>Le plugin &apos;%1&apos; utilise une bibliothèque Qt incompatible. Clé attendue &quot;%2&quot;, reçue &quot;%3&quot;</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>Erreur inconnue</translation>
+ </message>
+ <message>
+ <source>The shared library was not found.</source>
+ <translation>La bibliothèque partagée est introuvable.</translation>
+ </message>
+ <message>
+ <source>The file &apos;%1&apos; is not a valid Qt plugin.</source>
+ <translation>Le fichier &apos;%1&apos; n&apos;est pas un plugin Qt valide.</translation>
+ </message>
+ <message>
+ <source>The plugin &apos;%1&apos; uses incompatible Qt library. (Cannot mix debug and release libraries.)</source>
+ <translation>Le plugin &apos;%1&apos; utilise une bibliothèque Qt incompatible. (Il est impossible de mélanger des bibliothèques &apos;debug&apos; et &apos;release&apos;.)</translation>
+ </message>
+ <message>
+ <source>Cannot load library %1: %2</source>
+ <translation>Impossible de charger la bibliothèque %1 : %2</translation>
+ </message>
+ <message>
+ <source>Cannot unload library %1: %2</source>
+ <translation>Impossible de décharger la bibliothèque %1 : %2</translation>
+ </message>
+ <message>
+ <source>Cannot resolve symbol &quot;%1&quot; in %2: %3</source>
+ <translation>Impossible de résoudre le symbole &quot;%1&quot; dans %2 : %3</translation>
+ </message>
+ </context>
+ <context>
+ <name>QLineEdit</name>
+ <message>
+ <source>Select All</source>
+ <translation>Tout sélectionner</translation>
+ </message>
+ <message>
+ <source>&amp;Undo</source>
+ <translation>&amp;Annuler</translation>
+ </message>
+ <message>
+ <source>&amp;Redo</source>
+ <translation>&amp;Rétablir</translation>
+ </message>
+ <message>
+ <source>Cu&amp;t</source>
+ <translation>Co&amp;uper</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>Cop&amp;ier</translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation>Co&amp;ller</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>Supprimer</translation>
+ </message>
+ </context>
+ <context>
+ <name>QLocalServer</name>
+ <message>
+ <source>%1: Name error</source>
+ <translation>%1: Erreur de nom</translation>
+ </message>
+ <message>
+ <source>%1: Permission denied</source>
+ <translation>%1: Permission refusée</translation>
+ </message>
+ <message>
+ <source>%1: Address in use</source>
+ <translation>%1: Address déjà utilisée</translation>
+ </message>
+ <message>
+ <source>%1: Unknown error %2</source>
+ <translation>%1: Erreur inconnue %2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QLocalSocket</name>
+ <message>
+ <source>%1: Connection refused</source>
+ <translation>%1: Connexion refusée</translation>
+ </message>
+ <message>
+ <source>%1: Remote closed</source>
+ <translation>%1: Connexion fermée</translation>
+ </message>
+ <message>
+ <source>%1: Invalid name</source>
+ <translation>%1: Nom invalide</translation>
+ </message>
+ <message>
+ <source>%1: Socket access error</source>
+ <translation>%1: Erreur d&apos;accès au socket</translation>
+ </message>
+ <message>
+ <source>%1: Socket resource error</source>
+ <translation>%1: Erreur de ressource du socket</translation>
+ </message>
+ <message>
+ <source>%1: Socket operation timed out</source>
+ <translation>%1: L&apos;opération socket a expiré</translation>
+ </message>
+ <message>
+ <source>%1: Datagram too large</source>
+ <translation>%1: Datagramme trop grand</translation>
+ </message>
+ <message>
+ <source>%1: Connection error</source>
+ <translation>%1: Erreur de connexion</translation>
+ </message>
+ <message>
+ <source>%1: The socket operation is not supported</source>
+ <translation>%1: L&apos;opération n&apos;est pas supportée</translation>
+ </message>
+ <message>
+ <source>%1: Unknown error</source>
+ <translation>%1 : erreur inconnue</translation>
+ </message>
+ <message>
+ <source>%1: Unknown error %2</source>
+ <translation>%1: Erreur inconnue %2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMYSQLDriver</name>
+ <message>
+ <source>Unable to open database &apos;</source>
+ <translation>Impossible d&apos;ouvrir la base de données &apos;</translation>
+ </message>
+ <message>
+ <source>Unable to connect</source>
+ <translation>Impossible d&apos;établir une connexion</translation>
+ </message>
+ <message>
+ <source>Unable to begin transaction</source>
+ <translation>Impossible de démarrer la transaction</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>Impossible de soumettre la transaction</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>Impossible d&apos;annuler la transaction</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMYSQLResult</name>
+ <message>
+ <source>Unable to fetch data</source>
+ <translation>Impossible de récuperer des données</translation>
+ </message>
+ <message>
+ <source>Unable to execute query</source>
+ <translation>Impossible d&apos;exécuter la requête</translation>
+ </message>
+ <message>
+ <source>Unable to store result</source>
+ <translation>Impossible de stocker le résultat</translation>
+ </message>
+ <message>
+ <source>Unable to prepare statement</source>
+ <translation>Impossible de préparer l&apos;instruction</translation>
+ </message>
+ <message>
+ <source>Unable to reset statement</source>
+ <translation>Impossible de réinitialiser l&apos;instruction</translation>
+ </message>
+ <message>
+ <source>Unable to bind value</source>
+ <translation>Impossible d&apos;attacher la valeur</translation>
+ </message>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>Impossible d&apos;exécuter la requête</translation>
+ </message>
+ <message>
+ <source>Unable to bind outvalues</source>
+ <translation>Impossible d&apos;attacher les valeurs de sortie</translation>
+ </message>
+ <message>
+ <source>Unable to store statement results</source>
+ <translation>Impossible de stocker les résultats de la requête</translation>
+ </message>
+ <message>
+ <source>Unable to execute next query</source>
+ <translation>Impossible d&apos;exécuterla prochaine requête</translation>
+ </message>
+ <message>
+ <source>Unable to store next result</source>
+ <translation>Impossible de stocker le prochain résultat</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMdiArea</name>
+ <message>
+ <source>(Untitled)</source>
+ <translation>(Sans titre)</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMdiSubWindow</name>
+ <message>
+ <source>%1 - [%2]</source>
+ <translation>%1 - [%2]</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fermer</translation>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation>Réduire</translation>
+ </message>
+ <message>
+ <source>Restore Down</source>
+ <translation>Restaurer en bas</translation>
+ </message>
+ <message>
+ <source>&amp;Restore</source>
+ <translation>&amp;Restaurer</translation>
+ </message>
+ <message>
+ <source>&amp;Move</source>
+ <translation>&amp;Déplacer</translation>
+ </message>
+ <message>
+ <source>&amp;Size</source>
+ <translation>&amp;Taille</translation>
+ </message>
+ <message>
+ <source>Mi&amp;nimize</source>
+ <translation>Réd&amp;uire</translation>
+ </message>
+ <message>
+ <source>Ma&amp;ximize</source>
+ <translation>Ma&amp;ximiser</translation>
+ </message>
+ <message>
+ <source>Stay on &amp;Top</source>
+ <translation>&amp;Rester au premier plan</translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation>&amp;Fermer</translation>
+ </message>
+ <message>
+ <source>Maximize</source>
+ <translation>Maximiser</translation>
+ </message>
+ <message>
+ <source>Unshade</source>
+ <translation>Restaurer</translation>
+ </message>
+ <message>
+ <source>Shade</source>
+ <translation>Ombrer</translation>
+ </message>
+ <message>
+ <source>Restore</source>
+ <translation>Restaurer</translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation>Aide</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>Fermer</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>Ouvrir</translation>
+ </message>
+ <message>
+ <source>Execute</source>
+ <translation>Exécuter</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;Présentation de Qt&lt;/h3&gt;&lt;p&gt;Ce programme utilise 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 est une boîte à outils C++ pour le développement d’applications multiplateformes.&lt;/p&gt;&lt;p&gt;Qt fournit une portabilité source unique pour MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux et les principales variantes commerciales d’Unix. Qt est également disponible pour appareils intégrés tels que Qt pour Embedded Linux et Qt pour Windows CE.&lt;/p&gt;&lt;p&gt;Il existe trois options de licence différentes conçues pour s’adapter aux besoins d’utilisateurs variés.&lt;/p&gt;&lt;p&gt;Qt concédée sous notre contrat de licence commerciale est destinée au développement de logiciels propriétaires/commerciaux dont vous ne souhaitez pas partager le code source avec des tiers ou qui ne peuvent se conformer aux termes de la LGPL GNU version 2.1 ou GPL GNU version 3.0.&lt;/p&gt;&lt;p&gt;Qt concédée sous la LGPL GNU version 2.1 est destinée au développement d’applications Qt (propriétaires ou source libre) à condition que vous vous conformiez aux conditions générales de la LGPL GNU version 2.1.&lt;/p&gt;&lt;p&gt;Qt concédée sous la licence publique générale GNU version 3.0 est destinée au développement d’applications Qt lorsque vous souhaitez utiliser ces applications avec d’autres logiciels soumis aux termes de la GPL GNU version 3.0 ou lorsque vous acceptez les termes de la GPL GNU version 3.0.&lt;/p&gt;&lt;p&gt;Veuillez consulter&lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; pour un aperçu des concessions de licences Qt.&lt;/p&gt;&lt;p&gt;Copyright (C) 2010 Nokia Corporation et/ou ses filiales.&lt;/p&gt;&lt;p&gt;Qt est un produit Nokia. Voir &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; pour de plus amples informations.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>About Qt</source>
+ <translation>À propos de Qt</translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation>Aide</translation>
+ </message>
+ <message>
+ <source>Show Details...</source>
+ <translation>Montrer les détails...</translation>
+ </message>
+ <message>
+ <source>Hide Details...</source>
+ <translation>Cacher les détails...</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMultiInputContext</name>
+ <message>
+ <source>Select IM</source>
+ <translation>Sélectionner IM</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMultiInputContextPlugin</name>
+ <message>
+ <source>Multiple input method switcher</source>
+ <translation>Sélectionneur de méthode de saisie</translation>
+ </message>
+ <message>
+ <source>Multiple input method switcher that uses the context menu of the text widgets</source>
+ <translation>Sélectionneur de méthode de saisie qui utilise le menu contextuel des widgets de texte</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNativeSocketEngine</name>
+ <message>
+ <source>The remote host closed the connection</source>
+ <translation>L&apos;hôte distant a fermé la connexion</translation>
+ </message>
+ <message>
+ <source>Network operation timed out</source>
+ <translation>L&apos;opération réseau a expiré</translation>
+ </message>
+ <message>
+ <source>Out of resources</source>
+ <translation>Manque de ressources</translation>
+ </message>
+ <message>
+ <source>Unsupported socket operation</source>
+ <translation>Opération socket non supportée</translation>
+ </message>
+ <message>
+ <source>Protocol type not supported</source>
+ <translation>Protocol non géré</translation>
+ </message>
+ <message>
+ <source>Invalid socket descriptor</source>
+ <translation>Descripteur de socket invalide</translation>
+ </message>
+ <message>
+ <source>Network unreachable</source>
+ <translation>Réseau impossible à rejoindre</translation>
+ </message>
+ <message>
+ <source>Permission denied</source>
+ <translation>Accès refusé</translation>
+ </message>
+ <message>
+ <source>Connection timed out</source>
+ <translation>Connexion expirée</translation>
+ </message>
+ <message>
+ <source>Connection refused</source>
+ <translation>Connexion refusée</translation>
+ </message>
+ <message>
+ <source>The bound address is already in use</source>
+ <translation>L&apos;adresse liée est déjà en usage</translation>
+ </message>
+ <message>
+ <source>The address is not available</source>
+ <translation>L&apos;adresse n&apos;est pas disponible</translation>
+ </message>
+ <message>
+ <source>The address is protected</source>
+ <translation>L&apos;adresse est protégée</translation>
+ </message>
+ <message>
+ <source>Unable to send a message</source>
+ <translation>Impossible d&apos;envoyer un message</translation>
+ </message>
+ <message>
+ <source>Unable to receive a message</source>
+ <translation>Impossible de recevoir un message</translation>
+ </message>
+ <message>
+ <source>Unable to write</source>
+ <translation>Impossible d&apos;écrire</translation>
+ </message>
+ <message>
+ <source>Network error</source>
+ <translation>Erreur réseau</translation>
+ </message>
+ <message>
+ <source>Another socket is already listening on the same port</source>
+ <translation>Un autre socket écoute déjà sur le même port</translation>
+ </message>
+ <message>
+ <source>Unable to initialize non-blocking socket</source>
+ <translation>Impossible d&apos;initialiser le socket asynchrone</translation>
+ </message>
+ <message>
+ <source>Unable to initialize broadcast socket</source>
+ <translation>Impossible d&apos;initialiser le socket broadcast</translation>
+ </message>
+ <message>
+ <source>Attempt to use IPv6 socket on a platform with no IPv6 support</source>
+ <translation>Tentative d&apos;utiliser un socket IPv6 sur une plateforme qui ne supporte pas IPv6</translation>
+ </message>
+ <message>
+ <source>Host unreachable</source>
+ <translation>Hôte inaccessible</translation>
+ </message>
+ <message>
+ <source>Datagram was too large to send</source>
+ <translation>Le datagramme était trop grand pour être envoyé</translation>
+ </message>
+ <message>
+ <source>Operation on non-socket</source>
+ <translation>Operation sur non-socket</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>Erreur inconnue</translation>
+ </message>
+ <message>
+ <source>The proxy type is invalid for this operation</source>
+ <translation>Le type de proxy est invalide pour cette opération</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkAccessCacheBackend</name>
+ <message>
+ <source>Error opening %1</source>
+ <translation>Erreur lors de l&apos;ouverture de %1</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkAccessDebugPipeBackend</name>
+ <message>
+ <source>Write error writing to %1: %2</source>
+ <translation>Erreur lors de l&apos;écriture dans %1: %2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkAccessFileBackend</name>
+ <message>
+ <source>Request for opening non-local file %1</source>
+ <translation>Requête d&apos;ouverture de fichier distant %1</translation>
+ </message>
+ <message>
+ <source>Error opening %1: %2</source>
+ <translation>Erreur lors de l&apos;ouverture de %1 : %2</translation>
+ </message>
+ <message>
+ <source>Write error writing to %1: %2</source>
+ <translation>Erreur d&apos;écriture de %1 : %2</translation>
+ </message>
+ <message>
+ <source>Cannot open %1: Path is a directory</source>
+ <translation>Impossible d&apos;ouvrir %1 : le chemin est un dossier</translation>
+ </message>
+ <message>
+ <source>Read error reading from %1: %2</source>
+ <translation>Erreur de lecture de %1 : %2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkAccessFtpBackend</name>
+ <message>
+ <source>No suitable proxy found</source>
+ <translation>Aucun proxy trouvé</translation>
+ </message>
+ <message>
+ <source>Cannot open %1: is a directory</source>
+ <translation>Impossible d&apos;ouvrir %1 : le chemin est un dossier</translation>
+ </message>
+ <message>
+ <source>Logging in to %1 failed: authentication required</source>
+ <translation>Connexion à %1 a échoué : authentification requise</translation>
+ </message>
+ <message>
+ <source>Error while downloading %1: %2</source>
+ <translation>Erreur lors du téléchargement de %1 : %2</translation>
+ </message>
+ <message>
+ <source>Error while uploading %1: %2</source>
+ <translation>Erreur lors de l&apos;envoi de %1 : %2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkAccessHttpBackend</name>
+ <message>
+ <source>No suitable proxy found</source>
+ <translation>Aucun proxy trouvé</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkReply</name>
+ <message>
+ <source>Error downloading %1 - server replied: %2</source>
+ <translation>Erreur lors du téléchargement de %1 - le serveur a répondu: %2</translation>
+ </message>
+ <message>
+ <source>Protocol &quot;%1&quot; is unknown</source>
+ <translation>Le protocole &quot;%1&quot; est inconnu</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkReplyImpl</name>
+ <message>
+ <source>Operation canceled</source>
+ <translation>Opération annulée</translation>
+ </message>
+ </context>
+ <context>
+ <name>QOCIDriver</name>
+ <message>
+ <source>Unable to logon</source>
+ <translation>Impossible d&apos;ouvrir une session</translation>
+ </message>
+ <message>
+ <source>Unable to initialize</source>
+ <comment>QOCIDriver</comment>
+ <translation>L&apos;initialisation a échouée</translation>
+ </message>
+ <message>
+ <source>Unable to begin transaction</source>
+ <translation>Impossible de démarrer la transaction</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>Impossible d&apos;enregistrer la transaction</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>Impossible d&apos;annuler la transaction</translation>
+ </message>
+ </context>
+ <context>
+ <name>QOCIResult</name>
+ <message>
+ <source>Unable to bind column for batch execute</source>
+ <translation>Impossible d&apos;attacher la colonne pour une execution batch</translation>
+ </message>
+ <message>
+ <source>Unable to execute batch statement</source>
+ <translation>Impossible d&apos;exécuter l&apos;instruction batch</translation>
+ </message>
+ <message>
+ <source>Unable to goto next</source>
+ <translation>Impossible de passer au suivant</translation>
+ </message>
+ <message>
+ <source>Unable to alloc statement</source>
+ <translation>Impossible d&apos;allouer la requête</translation>
+ </message>
+ <message>
+ <source>Unable to prepare statement</source>
+ <translation>Impossible de préparer la requête</translation>
+ </message>
+ <message>
+ <source>Unable to get statement type</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to bind value</source>
+ <translation>Impossible d&apos;attacher la valeur</translation>
+ </message>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>Impossible d&apos;exéctuer la requête</translation>
+ </message>
+ </context>
+ <context>
+ <name>QODBCDriver</name>
+ <message>
+ <source>Unable to connect</source>
+ <translation>Incapable d&apos;établir une connexion</translation>
+ </message>
+ <message>
+ <source>Unable to disable autocommit</source>
+ <translation>Impossible de désactiver l&apos;autocommit</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>Incapable de soumettre la transaction</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>Incapable d&apos;annuler la transaction</translation>
+ </message>
+ <message>
+ <source>Unable to enable autocommit</source>
+ <translation>Impossible d&apos;active l&apos;autocommit</translation>
+ </message>
+ <message>
+ <source>Unable to connect - Driver doesn&apos;t support all functionality required</source>
+ <translation type="unfinished"></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: Impossible d&apos;utiliser &apos;SQL_CURSOR_STATIC&apos; comme attribut de requête. Veuillez vérifier la configuration de votre pilote ODBC</translation>
+ </message>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>Impossible d&apos;exéctuer la requête</translation>
+ </message>
+ <message>
+ <source>Unable to fetch next</source>
+ <translation>Impossible de récupérer le suivant</translation>
+ </message>
+ <message>
+ <source>Unable to prepare statement</source>
+ <translation>Impossible de préparer la requête</translation>
+ </message>
+ <message>
+ <source>Unable to bind variable</source>
+ <translation>Impossible d&apos;attacher la variable</translation>
+ </message>
+ <message>
+ <source>Unable to fetch last</source>
+ <translation>Impossible de récupérer le dernier</translation>
+ </message>
+ <message>
+ <source>Unable to fetch</source>
+ <translation>Impossible de récupérer</translation>
+ </message>
+ <message>
+ <source>Unable to fetch first</source>
+ <translation>Impossible de récupérer le premier</translation>
+ </message>
+ <message>
+ <source>Unable to fetch previous</source>
+ <translation>Impossible de récupérer le précedent</translation>
+ </message>
+ </context>
+ <context>
+ <name>QObject</name>
+ <message>
+ <source>Invalid hostname</source>
+ <translation>Nom d&apos;hôte non valide</translation>
+ </message>
+ <message>
+ <source>Operation not supported on %1</source>
+ <translation>Opération non supportée sur %1</translation>
+ </message>
+ <message>
+ <source>Invalid URI: %1</source>
+ <translation>URI invalide : %1</translation>
+ </message>
+ <message>
+ <source>Socket error on %1: %2</source>
+ <translation>Erreur de socket sur %1 : %2</translation>
+ </message>
+ <message>
+ <source>Remote host closed the connection prematurely on %1</source>
+ <translation>L&apos;hôte distant a fermé sa connexion de façon prématurée sur %1</translation>
+ </message>
+ <message>
+ <source>No host name given</source>
+ <translation>Nom d&apos;hôte manquant</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPPDOptionsModel</name>
+ <message>
+ <source>Name</source>
+ <translation>Nom</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Valeur</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPSQLDriver</name>
+ <message>
+ <source>Unable to connect</source>
+ <translation>Impossible d&apos;établir une connexion</translation>
+ </message>
+ <message>
+ <source>Could not begin transaction</source>
+ <translation>Impossible de démarrer la transaction</translation>
+ </message>
+ <message>
+ <source>Could not commit transaction</source>
+ <translation>Impossible de soumettre la transaction</translation>
+ </message>
+ <message>
+ <source>Could not rollback transaction</source>
+ <translation>Impossible d&apos;annuler la transaction</translation>
+ </message>
+ <message>
+ <source>Unable to subscribe</source>
+ <translation>Impossible de s&apos;inscrire</translation>
+ </message>
+ <message>
+ <source>Unable to unsubscribe</source>
+ <translation>Impossible de se désinscrire</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPSQLResult</name>
+ <message>
+ <source>Unable to create query</source>
+ <translation>Impossible de créer la requête</translation>
+ </message>
+ <message>
+ <source>Unable to prepare statement</source>
+ <translation>Impossible de préparer la requête</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPageSetupWidget</name>
+ <message>
+ <source>Centimeters (cm)</source>
+ <translation>Centimètres (cm)</translation>
+ </message>
+ <message>
+ <source>Millimeters (mm)</source>
+ <translation>Millimètres (mm)</translation>
+ </message>
+ <message>
+ <source>Inches (in)</source>
+ <translation>Pouces (in)</translation>
+ </message>
+ <message>
+ <source>Points (pt)</source>
+ <translation>Points (pts)</translation>
+ </message>
+ <message>
+ <source>Form</source>
+ <translation>Formulaire</translation>
+ </message>
+ <message>
+ <source>Paper</source>
+ <translation>Papier</translation>
+ </message>
+ <message>
+ <source>Page size:</source>
+ <translation>Dimensions :</translation>
+ </message>
+ <message>
+ <source>Width:</source>
+ <translation>Largeur :</translation>
+ </message>
+ <message>
+ <source>Height:</source>
+ <translation>Hauteur :</translation>
+ </message>
+ <message>
+ <source>Paper source:</source>
+ <translation>Source du papier :</translation>
+ </message>
+ <message>
+ <source>Orientation</source>
+ <translation>Orientation</translation>
+ </message>
+ <message>
+ <source>Portrait</source>
+ <translation>Portrait</translation>
+ </message>
+ <message>
+ <source>Landscape</source>
+ <translation>Paysage</translation>
+ </message>
+ <message>
+ <source>Reverse landscape</source>
+ <translation>Paysage inversé</translation>
+ </message>
+ <message>
+ <source>Reverse portrait</source>
+ <translation>Portrait inversé</translation>
+ </message>
+ <message>
+ <source>Margins</source>
+ <translation>Marges</translation>
+ </message>
+ <message>
+ <source>top margin</source>
+ <translation>marge haute</translation>
+ </message>
+ <message>
+ <source>left margin</source>
+ <translation>marge gauche</translation>
+ </message>
+ <message>
+ <source>right margin</source>
+ <translation>marge droite</translation>
+ </message>
+ <message>
+ <source>bottom margin</source>
+ <translation>marge basse</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPluginLoader</name>
+ <message>
+ <source>Unknown error</source>
+ <translation>Erreur inconnue</translation>
+ </message>
+ <message>
+ <source>The plugin was not loaded.</source>
+ <translation>Le plugin n&apos;a pas été chargé.</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPrintDialog</name>
+ <message>
+ <source>locally connected</source>
+ <translation>connecté en local</translation>
+ </message>
+ <message>
+ <source>Aliases: %1</source>
+ <translation>Alias : %1</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation>inconnu</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Print all</source>
+ <translation>Imprimer tout</translation>
+ </message>
+ <message>
+ <source>Print range</source>
+ <translation>Imprimer la sélection</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>Tabloïde (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)</translation>
+ </message>
+ <message>
+ <source>B5 (176 x 250 mm, 6.93 x 9.84 inches)</source>
+ <translation>B5 (176 x 250 mm)</translation>
+ </message>
+ <message>
+ <source>Executive (7.5 x 10 inches, 191 x 254 mm)</source>
+ <translation>Executive (7,5 x 10 pouces, 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 pouces, 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 pouces, 216 x 279 mm)</translation>
+ </message>
+ <message>
+ <source>Print selection</source>
+ <translation>Imprimer la sélection</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation>Impr écran</translation>
+ </message>
+ <message>
+ <source>Print To File ...</source>
+ <translation>Imprimer dans un fichier...</translation>
+ </message>
+ <message>
+ <source>File %1 is not writable.
+Please choose a different file name.</source>
+ <translation>Impossible d&apos;écrire dans le fichier %1.
+Veuillez choisir un nom de fichier différent.</translation>
+ </message>
+ <message>
+ <source>%1 already exists.
+Do you want to overwrite it?</source>
+ <translation>%1 existe.
+Voulez-vous l&apos;écraser ?</translation>
+ </message>
+ <message>
+ <source>File exists</source>
+ <translation>Le fichier existe</translation>
+ </message>
+ <message>
+ <source>&lt;qt&gt;Do you want to overwrite it?&lt;/qt&gt;</source>
+ <translation>&lt;qt&gt;voulez-vous l&apos;écraser ?&lt;/qt&gt;</translation>
+ </message>
+ <message>
+ <source>%1 is a directory.
+Please choose a different file name.</source>
+ <translation>%1 est un dossier.
+Veuillez choisir un nom de fichier différent.</translation>
+ </message>
+ <message>
+ <source>The &apos;From&apos; value cannot be greater than the &apos;To&apos; value.</source>
+ <translation>La valeur &apos;de&apos; ne peut pas être plus grande que la valeur &apos;à&apos;.</translation>
+ </message>
+ <message>
+ <source>A0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A5</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A6</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A7</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A9</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>B0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>B1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>B2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>B3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>B4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>B5</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>B6</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>B7</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>B8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>B9</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>B10</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C5E</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DLE</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Executive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Folio</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ledger</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Legal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Letter</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tabloid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>US Common #10 Envelope</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Custom</source>
+ <translation>Personnalisé</translation>
+ </message>
+ <message>
+ <source>&amp;Options &gt;&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Options &lt;&lt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Print to File (PDF)</source>
+ <translation>Imprimer dans un fichier (PDF)</translation>
+ </message>
+ <message>
+ <source>Print to File (Postscript)</source>
+ <translation>Imprimer dans un fichier (PostScript)</translation>
+ </message>
+ <message>
+ <source>Local file</source>
+ <translation>Fichier local</translation>
+ </message>
+ <message>
+ <source>Write %1 file</source>
+ <translation>Ecriture du fichier %1</translation>
+ </message>
+ <message>
+ <source>&amp;Print</source>
+ <translation>Im&amp;primer</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPrintPreviewDialog</name>
+ <message>
+ <source>%1%</source>
+ <translation>%1%</translation>
+ </message>
+ <message>
+ <source>Print Preview</source>
+ <translation>Aperçu avant impression</translation>
+ </message>
+ <message>
+ <source>Next page</source>
+ <translation>Page suivante</translation>
+ </message>
+ <message>
+ <source>Previous page</source>
+ <translation>Page précédente</translation>
+ </message>
+ <message>
+ <source>First page</source>
+ <translation>Première page</translation>
+ </message>
+ <message>
+ <source>Last page</source>
+ <translation>Dernière page</translation>
+ </message>
+ <message>
+ <source>Fit width</source>
+ <translation>Ajuster la largeur</translation>
+ </message>
+ <message>
+ <source>Fit page</source>
+ <translation>Ajuster la page</translation>
+ </message>
+ <message>
+ <source>Zoom in</source>
+ <translation>Zoom avant</translation>
+ </message>
+ <message>
+ <source>Zoom out</source>
+ <translation>Zoom arrière</translation>
+ </message>
+ <message>
+ <source>Portrait</source>
+ <translation>Portrait</translation>
+ </message>
+ <message>
+ <source>Landscape</source>
+ <translation>Paysage</translation>
+ </message>
+ <message>
+ <source>Show single page</source>
+ <translation>Afficher une seule page</translation>
+ </message>
+ <message>
+ <source>Show facing pages</source>
+ <translation>Afficher deux pages</translation>
+ </message>
+ <message>
+ <source>Show overview of all pages</source>
+ <translation>Afficher un aperçu de toutes les pages</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation>Impr écran</translation>
+ </message>
+ <message>
+ <source>Page setup</source>
+ <translation>Configuration de la page</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fermer</translation>
+ </message>
+ <message>
+ <source>Export to PDF</source>
+ <translation>Exporter vers PDF</translation>
+ </message>
+ <message>
+ <source>Export to PostScript</source>
+ <translation>Exporter vers PostScript</translation>
+ </message>
+ <message>
+ <source>Page Setup</source>
+ <translation>Configuration de la page</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPrintPropertiesWidget</name>
+ <message>
+ <source>Form</source>
+ <translation>Formulaire</translation>
+ </message>
+ <message>
+ <source>Page</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Avancé</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPrintSettingsOutput</name>
+ <message>
+ <source>Form</source>
+ <translation>Formulaire</translation>
+ </message>
+ <message>
+ <source>Copies</source>
+ <translation>Copies</translation>
+ </message>
+ <message>
+ <source>Print range</source>
+ <translation>Imprimer la sélection</translation>
+ </message>
+ <message>
+ <source>Print all</source>
+ <translation>Imprimer tout</translation>
+ </message>
+ <message>
+ <source>Pages from</source>
+ <translation>Pages</translation>
+ </message>
+ <message>
+ <source>to</source>
+ <translation>à</translation>
+ </message>
+ <message>
+ <source>Selection</source>
+ <translation>Sélection</translation>
+ </message>
+ <message>
+ <source>Output Settings</source>
+ <translation>Paramètres de sortie</translation>
+ </message>
+ <message>
+ <source>Copies:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Collate</source>
+ <translation>Assembler</translation>
+ </message>
+ <message>
+ <source>Reverse</source>
+ <translation>Inverse</translation>
+ </message>
+ <message>
+ <source>Options</source>
+ <translation>Options</translation>
+ </message>
+ <message>
+ <source>Color Mode</source>
+ <translation>Mode de couleur</translation>
+ </message>
+ <message>
+ <source>Color</source>
+ <translation>Couleur</translation>
+ </message>
+ <message>
+ <source>Grayscale</source>
+ <translation>Dégradé de gris</translation>
+ </message>
+ <message>
+ <source>Duplex Printing</source>
+ <translation>Impression en duplex</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Aucun</translation>
+ </message>
+ <message>
+ <source>Long side</source>
+ <translation>Côté long</translation>
+ </message>
+ <message>
+ <source>Short side</source>
+ <translation>Côté court</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPrintWidget</name>
+ <message>
+ <source>Form</source>
+ <translation>Formulaire</translation>
+ </message>
+ <message>
+ <source>Printer</source>
+ <translation>Imprimante</translation>
+ </message>
+ <message>
+ <source>&amp;Name:</source>
+ <translation>&amp;Nom :</translation>
+ </message>
+ <message>
+ <source>P&amp;roperties</source>
+ <translation>P&amp;ropriétés</translation>
+ </message>
+ <message>
+ <source>Location:</source>
+ <translation>Emplacement :</translation>
+ </message>
+ <message>
+ <source>Preview</source>
+ <translation>Prévisualisation</translation>
+ </message>
+ <message>
+ <source>Type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Output &amp;file:</source>
+ <translation>&amp;Fichier de sortie:</translation>
+ </message>
+ <message>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QProcess</name>
+ <message>
+ <source>Could not open input redirection for reading</source>
+ <translation>Impossible d&apos;ouvrir la redirection d&apos;entrée en lecture</translation>
+ </message>
+ <message>
+ <source>Could not open output redirection for writing</source>
+ <translation>Impossible d&apos;ouvrir la redirection de sortie pour écriture</translation>
+ </message>
+ <message>
+ <source>Resource error (fork failure): %1</source>
+ <translation>Erreur de ressouce (fork) : %1</translation>
+ </message>
+ <message>
+ <source>Process operation timed out</source>
+ <translation>Operation de processus a expiré</translation>
+ </message>
+ <message>
+ <source>Error reading from process</source>
+ <translation>Erreur de lecture du processus</translation>
+ </message>
+ <message>
+ <source>Error writing to process</source>
+ <translation>Erreur d&quot;écriture vers le processus</translation>
+ </message>
+ <message>
+ <source>Process crashed</source>
+ <translation>Le processus à planté</translation>
+ </message>
+ <message>
+ <source>No program defined</source>
+ <translation>Aucun programme défini</translation>
+ </message>
+ <message>
+ <source>Process failed to start: %1</source>
+ <translation>Le démarrage du processus a échoué: %1</translation>
+ </message>
+ </context>
+ <context>
+ <name>QProgressDialog</name>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPushButton</name>
+ <message>
+ <source>Open</source>
+ <translation>Ouvrir</translation>
+ </message>
+ </context>
+ <context>
+ <name>QRadioButton</name>
+ <message>
+ <source>Check</source>
+ <translation>Cocher</translation>
+ </message>
+ </context>
+ <context>
+ <name>QRegExp</name>
+ <message>
+ <source>no error occurred</source>
+ <translation>aucune erreur ne s&apos;est produite</translation>
+ </message>
+ <message>
+ <source>disabled feature used</source>
+ <translation>option désactivée</translation>
+ </message>
+ <message>
+ <source>bad char class syntax</source>
+ <translation>syntaxe invalide pour classe de caractère</translation>
+ </message>
+ <message>
+ <source>bad lookahead syntax</source>
+ <translation>syntaxe invalide pour lookahead</translation>
+ </message>
+ <message>
+ <source>bad repetition syntax</source>
+ <translation>syntaxe invalide pour répétition</translation>
+ </message>
+ <message>
+ <source>invalid octal value</source>
+ <translation>valeur octale invalide</translation>
+ </message>
+ <message>
+ <source>missing left delim</source>
+ <translation>délémiteur gauche manquant</translation>
+ </message>
+ <message>
+ <source>unexpected end</source>
+ <translation>fin impromptue</translation>
+ </message>
+ <message>
+ <source>met internal limit</source>
+ <translation>rencontré limite interne</translation>
+ </message>
+ <message>
+ <source>invalid interval</source>
+ <translation>intervalle non valide</translation>
+ </message>
+ <message>
+ <source>invalid category</source>
+ <translation>catégorie non valide</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSQLite2Driver</name>
+ <message>
+ <source>Error opening database</source>
+ <translation>Erreur lors de l&apos;ouverture de la base de données</translation>
+ </message>
+ <message>
+ <source>Unable to begin transaction</source>
+ <translation>Impossible de démarrer la transaction</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>Impossible de soumettre la transaction</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>Impossible de répéter la transaction</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSQLite2Result</name>
+ <message>
+ <source>Unable to fetch results</source>
+ <translation>Impossible de récupérer les résultats</translation>
+ </message>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>Impossible d&apos;exécuter la requête</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSQLiteDriver</name>
+ <message>
+ <source>Error opening database</source>
+ <translation>Erreur lors de l&apos;ouverture de la base de données</translation>
+ </message>
+ <message>
+ <source>Error closing database</source>
+ <translation>Erreur lors de la fermeture de la base de données</translation>
+ </message>
+ <message>
+ <source>Unable to begin transaction</source>
+ <translation>Impossible de démarrer la transaction</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>Incapable de soumettre la transaction</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>Impossible d&apos;annuler la transaction</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSQLiteResult</name>
+ <message>
+ <source>Unable to fetch row</source>
+ <translation>Impossible de récupérer la rangée</translation>
+ </message>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>Impossible d&apos;exécuter la requête</translation>
+ </message>
+ <message>
+ <source>Unable to reset statement</source>
+ <translation>Impossible de réinitialiser la requête</translation>
+ </message>
+ <message>
+ <source>Unable to bind parameters</source>
+ <translation>Impossible d&apos;attacher les paramètres</translation>
+ </message>
+ <message>
+ <source>Parameter count mismatch</source>
+ <translation>Nombre de paramètres incorrect</translation>
+ </message>
+ <message>
+ <source>No query</source>
+ <translation>Pas de requête</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptBreakpointsModel</name>
+ <message>
+ <source>ID</source>
+ <translation>Identifiant</translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation>Lieu</translation>
+ </message>
+ <message>
+ <source>Condition</source>
+ <translation>Condition</translation>
+ </message>
+ <message>
+ <source>Ignore-count</source>
+ <translation>Comptes d&apos;ignorés</translation>
+ </message>
+ <message>
+ <source>Single-shot</source>
+ <translation>Un seul tir</translation>
+ </message>
+ <message>
+ <source>Hit-count</source>
+ <translation>Compte de coups</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptBreakpointsWidget</name>
+ <message>
+ <source>New</source>
+ <translation>Créer</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>Supprimer</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptDebugger</name>
+ <message>
+ <source>Go to Line</source>
+ <translation>Aller à la ligne</translation>
+ </message>
+ <message>
+ <source>Line:</source>
+ <translation>Ligne:</translation>
+ </message>
+ <message>
+ <source>Interrupt</source>
+ <translation>Interrompre</translation>
+ </message>
+ <message>
+ <source>Shift+F5</source>
+ <translation>Shift+F5</translation>
+ </message>
+ <message>
+ <source>Continue</source>
+ <translation>Continuer</translation>
+ </message>
+ <message>
+ <source>F5</source>
+ <translation>F5</translation>
+ </message>
+ <message>
+ <source>Step Into</source>
+ <translation>Pas à pas détaillé</translation>
+ </message>
+ <message>
+ <source>F11</source>
+ <translation>F11</translation>
+ </message>
+ <message>
+ <source>Step Over</source>
+ <translation>Pas à pas principal</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation>F10</translation>
+ </message>
+ <message>
+ <source>Step Out</source>
+ <translation>Pas à pas sortant</translation>
+ </message>
+ <message>
+ <source>Shift+F11</source>
+ <translation>Shift+F11</translation>
+ </message>
+ <message>
+ <source>Run to Cursor</source>
+ <translation>Exécuter au curseur</translation>
+ </message>
+ <message>
+ <source>Ctrl+F10</source>
+ <translation>Ctrl+F10</translation>
+ </message>
+ <message>
+ <source>Run to New Script</source>
+ <translation>Exécuter au nouveau script</translation>
+ </message>
+ <message>
+ <source>Toggle Breakpoint</source>
+ <translation>Basculer le point d&apos;arrêt</translation>
+ </message>
+ <message>
+ <source>F9</source>
+ <translation>F9</translation>
+ </message>
+ <message>
+ <source>Clear Debug Output</source>
+ <translation>Effacer les résultats du débogage</translation>
+ </message>
+ <message>
+ <source>Clear Error Log</source>
+ <translation>Effacer le journal d&apos;erreurs</translation>
+ </message>
+ <message>
+ <source>Clear Console</source>
+ <translation>Effacer la console</translation>
+ </message>
+ <message>
+ <source>&amp;Find in Script...</source>
+ <translation>&amp;Chercher dans le script...</translation>
+ </message>
+ <message>
+ <source>Ctrl+F</source>
+ <translation>Ctrl+F</translation>
+ </message>
+ <message>
+ <source>Find &amp;Next</source>
+ <translation>Résultat &amp;suivant</translation>
+ </message>
+ <message>
+ <source>F3</source>
+ <translation>F3</translation>
+ </message>
+ <message>
+ <source>Find &amp;Previous</source>
+ <translation>Chercher &amp;précédent</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>Déboguer</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptDebuggerCodeFinderWidget</name>
+ <message>
+ <source>Close</source>
+ <translation>Fermer</translation>
+ </message>
+ <message>
+ <source>Previous</source>
+ <translation>Précédent</translation>
+ </message>
+ <message>
+ <source>Next</source>
+ <translation>Suivant</translation>
+ </message>
+ <message>
+ <source>Case Sensitive</source>
+ <translation>Sensible à la casse</translation>
+ </message>
+ <message>
+ <source>Whole words</source>
+ <translation>Mots entiers</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;La recherche est revenue au début</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptDebuggerLocalsModel</name>
+ <message>
+ <source>Name</source>
+ <translation>Nom</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Valeur</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptDebuggerStackModel</name>
+ <message>
+ <source>Level</source>
+ <translation>Niveau</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Nom</translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation>Lieu</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptEdit</name>
+ <message>
+ <source>Toggle Breakpoint</source>
+ <translation>Basculer le point d&apos;arrêt</translation>
+ </message>
+ <message>
+ <source>Disable Breakpoint</source>
+ <translation>Désactiver le point d&apos;arrêt</translation>
+ </message>
+ <message>
+ <source>Enable Breakpoint</source>
+ <translation>Activer le point d&apos;arrêt</translation>
+ </message>
+ <message>
+ <source>Breakpoint Condition:</source>
+ <translation>Condition du point d&apos;arrêt:</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptEngineDebugger</name>
+ <message>
+ <source>Loaded Scripts</source>
+ <translation>Scripts chargés</translation>
+ </message>
+ <message>
+ <source>Breakpoints</source>
+ <translation>Points d&apos;arrêt</translation>
+ </message>
+ <message>
+ <source>Stack</source>
+ <translation>Empiler</translation>
+ </message>
+ <message>
+ <source>Locals</source>
+ <translation>Locaux</translation>
+ </message>
+ <message>
+ <source>Console</source>
+ <translation>Console</translation>
+ </message>
+ <message>
+ <source>Debug Output</source>
+ <translation>Résultats du débogage</translation>
+ </message>
+ <message>
+ <source>Error Log</source>
+ <translation>Journal d&apos;erreurs</translation>
+ </message>
+ <message>
+ <source>Search</source>
+ <translation>Chercher</translation>
+ </message>
+ <message>
+ <source>View</source>
+ <translation>Afficher</translation>
+ </message>
+ <message>
+ <source>Qt Script Debugger</source>
+ <translation>Débogueur de script Qt</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptNewBreakpointWidget</name>
+ <message>
+ <source>Close</source>
+ <translation>Fermer</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScrollBar</name>
+ <message>
+ <source>Scroll here</source>
+ <translation>Défiler jusqu&apos;ici</translation>
+ </message>
+ <message>
+ <source>Left edge</source>
+ <translation>Extrême gauche</translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <translation>En haut</translation>
+ </message>
+ <message>
+ <source>Right edge</source>
+ <translation>Extrême droite</translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <translation>En bas</translation>
+ </message>
+ <message>
+ <source>Page left</source>
+ <translation>Page précédente</translation>
+ </message>
+ <message>
+ <source>Page up</source>
+ <translation>Page précédente</translation>
+ </message>
+ <message>
+ <source>Page right</source>
+ <translation>Page suivante</translation>
+ </message>
+ <message>
+ <source>Page down</source>
+ <translation>Page suivante</translation>
+ </message>
+ <message>
+ <source>Scroll left</source>
+ <translation>Défiler vers la gauche</translation>
+ </message>
+ <message>
+ <source>Scroll up</source>
+ <translation>Défiler vers le haut</translation>
+ </message>
+ <message>
+ <source>Scroll right</source>
+ <translation>Défiler vers la droite</translation>
+ </message>
+ <message>
+ <source>Scroll down</source>
+ <translation>Défiler vers le bas</translation>
+ </message>
+ <message>
+ <source>Line up</source>
+ <translation>Aligner</translation>
+ </message>
+ <message>
+ <source>Position</source>
+ <translation>Position</translation>
+ </message>
+ <message>
+ <source>Line down</source>
+ <translation>Aligner en-bas</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSharedMemory</name>
+ <message>
+ <source>%1: create size is less then 0</source>
+ <translation>%1 : taille de création est inférieur à 0</translation>
+ </message>
+ <message>
+ <source>%1: unable to lock</source>
+ <translation>%1 : impossible de vérrouiller</translation>
+ </message>
+ <message>
+ <source>%1: unable to unlock</source>
+ <translation>%1 : impossible de déverrouiller</translation>
+ </message>
+ <message>
+ <source>%1: permission denied</source>
+ <translation>%1 : permission refusée</translation>
+ </message>
+ <message>
+ <source>%1: already exists</source>
+ <translation>%1 : existe déjà</translation>
+ </message>
+ <message>
+ <source>%1: doesn&apos;t exists</source>
+ <translation>%1 : n&apos;existe pas</translation>
+ </message>
+ <message>
+ <source>%1: out of resources</source>
+ <translation>%1 : plus de ressources disponibles</translation>
+ </message>
+ <message>
+ <source>%1: unknown error %2</source>
+ <translation>%1 : erreur inconnue %2</translation>
+ </message>
+ <message>
+ <source>%1: key is empty</source>
+ <translation>%1 : clé vide</translation>
+ </message>
+ <message>
+ <source>%1: ftok failed</source>
+ <translation>%1 : ftok a échoué</translation>
+ </message>
+ <message>
+ <source>%1: unable to make key</source>
+ <translation>%1 : impossible de créer la clé</translation>
+ </message>
+ <message>
+ <source>%1: doesn&apos;t exist</source>
+ <translation>%1: n&apos;existe pas</translation>
+ </message>
+ <message>
+ <source>%1: UNIX key file doesn&apos;t exist</source>
+ <translation>%1: le fichier de clés UNIX n&apos;existe pas</translation>
+ </message>
+ <message>
+ <source>%1: system-imposed size restrictions</source>
+ <translation>%1 : le système impose des restrictions sur la taille</translation>
+ </message>
+ <message>
+ <source>%1: not attached</source>
+ <translation>%1 : non attaché</translation>
+ </message>
+ <message>
+ <source>%1: invalid size</source>
+ <translation>%1 : taille invalide</translation>
+ </message>
+ <message>
+ <source>%1: key error</source>
+ <translation>%1 : erreur de clé</translation>
+ </message>
+ <message>
+ <source>%1: size query failed</source>
+ <translation>%1 : la requête de taille a échoué</translation>
+ </message>
+ <message>
+ <source>%1: unable to set key on lock</source>
+ <translation>%1 : impossible d&apos;affecter la clé au verrou</translation>
+ </message>
+ </context>
+ <context>
+ <name>QShortcut</name>
+ <message>
+ <source>Space</source>
+ <translation>Espace</translation>
+ </message>
+ <message>
+ <source>Esc</source>
+ <translation>Échap</translation>
+ </message>
+ <message>
+ <source>Tab</source>
+ <translation>Tab</translation>
+ </message>
+ <message>
+ <source>Backtab</source>
+ <translation>Tab arr</translation>
+ </message>
+ <message>
+ <source>Backspace</source>
+ <translation>Effacement</translation>
+ </message>
+ <message>
+ <source>Return</source>
+ <translation>Retour</translation>
+ </message>
+ <message>
+ <source>Enter</source>
+ <translation>Entrée</translation>
+ </message>
+ <message>
+ <source>Ins</source>
+ <translation>Inser</translation>
+ </message>
+ <message>
+ <source>Del</source>
+ <translation>Suppr</translation>
+ </message>
+ <message>
+ <source>Pause</source>
+ <translation>Pause</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation>Impr écran</translation>
+ </message>
+ <message>
+ <source>SysReq</source>
+ <translation>Syst</translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation>Début</translation>
+ </message>
+ <message>
+ <source>End</source>
+ <translation>Fin</translation>
+ </message>
+ <message>
+ <source>Left</source>
+ <translation>Gauche</translation>
+ </message>
+ <message>
+ <source>Up</source>
+ <translation>Haut</translation>
+ </message>
+ <message>
+ <source>Right</source>
+ <translation>Droite</translation>
+ </message>
+ <message>
+ <source>Down</source>
+ <translation>Bas</translation>
+ </message>
+ <message>
+ <source>PgUp</source>
+ <translation>Page préc</translation>
+ </message>
+ <message>
+ <source>PgDown</source>
+ <translation>Page suiv</translation>
+ </message>
+ <message>
+ <source>CapsLock</source>
+ <translation>Verr maj</translation>
+ </message>
+ <message>
+ <source>NumLock</source>
+ <translation>Verr num</translation>
+ </message>
+ <message>
+ <source>ScrollLock</source>
+ <translation>Arrêt défil</translation>
+ </message>
+ <message>
+ <source>Menu</source>
+ <translation>Menu</translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation>Aide</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation>Précédent (historique)</translation>
+ </message>
+ <message>
+ <source>Forward</source>
+ <translation>Successeur (historique)</translation>
+ </message>
+ <message>
+ <source>Stop</source>
+ <translation>Stop</translation>
+ </message>
+ <message>
+ <source>Refresh</source>
+ <translation>Rafraîchir</translation>
+ </message>
+ <message>
+ <source>Volume Down</source>
+ <translation>Volume bas</translation>
+ </message>
+ <message>
+ <source>Volume Mute</source>
+ <translation>Volume muet</translation>
+ </message>
+ <message>
+ <source>Volume Up</source>
+ <translation>Volume haut
+</translation>
+ </message>
+ <message>
+ <source>Bass Boost</source>
+ <translation>Graves fort</translation>
+ </message>
+ <message>
+ <source>Bass Up</source>
+ <translation>Graves haut</translation>
+ </message>
+ <message>
+ <source>Bass Down</source>
+ <translation>Graves bas</translation>
+ </message>
+ <message>
+ <source>Treble Up</source>
+ <translation>Aigus haut</translation>
+ </message>
+ <message>
+ <source>Treble Down</source>
+ <translation>Aigus bas</translation>
+ </message>
+ <message>
+ <source>Media Play</source>
+ <translation>Média démarrer</translation>
+ </message>
+ <message>
+ <source>Media Stop</source>
+ <translation>Média arrêt</translation>
+ </message>
+ <message>
+ <source>Media Previous</source>
+ <translation>Média précédent</translation>
+ </message>
+ <message>
+ <source>Media Next</source>
+ <translation>Média suivant</translation>
+ </message>
+ <message>
+ <source>Media Record</source>
+ <translation>Média enregistrer</translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation>Préférés</translation>
+ </message>
+ <message>
+ <source>Search</source>
+ <translation>Recherche</translation>
+ </message>
+ <message>
+ <source>Standby</source>
+ <translation>Attente</translation>
+ </message>
+ <message>
+ <source>Open URL</source>
+ <translation>Ouvrir URL</translation>
+ </message>
+ <message>
+ <source>Launch Mail</source>
+ <translation>Lancer courrier</translation>
+ </message>
+ <message>
+ <source>Launch Media</source>
+ <translation>Lancer média</translation>
+ </message>
+ <message>
+ <source>Launch (0)</source>
+ <translation>Lancer (0)</translation>
+ </message>
+ <message>
+ <source>Launch (1)</source>
+ <translation>Lancer (1)</translation>
+ </message>
+ <message>
+ <source>Launch (2)</source>
+ <translation>Lancer (2)</translation>
+ </message>
+ <message>
+ <source>Launch (3)</source>
+ <translation>Lancer (3)</translation>
+ </message>
+ <message>
+ <source>Launch (4)</source>
+ <translation>Lancer (4)</translation>
+ </message>
+ <message>
+ <source>Launch (5)</source>
+ <translation>Lancer (5)</translation>
+ </message>
+ <message>
+ <source>Launch (6)</source>
+ <translation>Lancer (6)</translation>
+ </message>
+ <message>
+ <source>Launch (7)</source>
+ <translation>Lancer (7)</translation>
+ </message>
+ <message>
+ <source>Launch (8)</source>
+ <translation>Lancer (8)</translation>
+ </message>
+ <message>
+ <source>Launch (9)</source>
+ <translation>Lancer (9)</translation>
+ </message>
+ <message>
+ <source>Launch (A)</source>
+ <translation>Lancer (A)</translation>
+ </message>
+ <message>
+ <source>Launch (B)</source>
+ <translation>Lancer (B)</translation>
+ </message>
+ <message>
+ <source>Launch (C)</source>
+ <translation>Lancer (C)</translation>
+ </message>
+ <message>
+ <source>Launch (D)</source>
+ <translation>Lancer (D)</translation>
+ </message>
+ <message>
+ <source>Launch (E)</source>
+ <translation>Lancer (E)</translation>
+ </message>
+ <message>
+ <source>Launch (F)</source>
+ <translation>Lancer (F)</translation>
+ </message>
+ <message>
+ <source>Monitor Brightness Up</source>
+ <translation>Augmenter la luminosité du moniteur</translation>
+ </message>
+ <message>
+ <source>Monitor Brightness Down</source>
+ <translation>Baisser la luminosité du moniteur</translation>
+ </message>
+ <message>
+ <source>Keyboard Light On/Off</source>
+ <translation>Avec/sans lumière clavier</translation>
+ </message>
+ <message>
+ <source>Keyboard Brightness Up</source>
+ <translation>Augmenter la luminosité du clavier</translation>
+ </message>
+ <message>
+ <source>Keyboard Brightness Down</source>
+ <translation>Baisser la luminosité du clavier</translation>
+ </message>
+ <message>
+ <source>Power Off</source>
+ <translation>Couper l&apos;alimentation</translation>
+ </message>
+ <message>
+ <source>Wake Up</source>
+ <translation>Réveiller</translation>
+ </message>
+ <message>
+ <source>Eject</source>
+ <translation>Éjecter</translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation>Économiseur d&apos;écran</translation>
+ </message>
+ <message>
+ <source>WWW</source>
+ <translation>WWW</translation>
+ </message>
+ <message>
+ <source>Sleep</source>
+ <translation>Dormir</translation>
+ </message>
+ <message>
+ <source>LightBulb</source>
+ <translation>Ampoule</translation>
+ </message>
+ <message>
+ <source>Shop</source>
+ <translation>Magasin</translation>
+ </message>
+ <message>
+ <source>History</source>
+ <translation>Historique</translation>
+ </message>
+ <message>
+ <source>Add Favorite</source>
+ <translation>Ajouter favori</translation>
+ </message>
+ <message>
+ <source>Hot Links</source>
+ <translation>Liens chauds</translation>
+ </message>
+ <message>
+ <source>Adjust Brightness</source>
+ <translation>Régler la luminosité</translation>
+ </message>
+ <message>
+ <source>Finance</source>
+ <translation>Finances</translation>
+ </message>
+ <message>
+ <source>Community</source>
+ <translation>Communauté</translation>
+ </message>
+ <message>
+ <source>Audio Rewind</source>
+ <translation>Audio arrière</translation>
+ </message>
+ <message>
+ <source>Back Forward</source>
+ <translation>Retour avant</translation>
+ </message>
+ <message>
+ <source>Application Left</source>
+ <translation>Application gauche</translation>
+ </message>
+ <message>
+ <source>Application Right</source>
+ <translation>Application droite</translation>
+ </message>
+ <message>
+ <source>Book</source>
+ <translation>Livre</translation>
+ </message>
+ <message>
+ <source>CD</source>
+ <translation>CD</translation>
+ </message>
+ <message>
+ <source>Calculator</source>
+ <translation>Calculatrice</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Effacer</translation>
+ </message>
+ <message>
+ <source>Clear Grab</source>
+ <translation>Effacer la prise</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Fermer</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation>Copier</translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation>Couper</translation>
+ </message>
+ <message>
+ <source>Display</source>
+ <translation>Affichage</translation>
+ </message>
+ <message>
+ <source>DOS</source>
+ <translation>DOS</translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation>Documents</translation>
+ </message>
+ <message>
+ <source>Spreadsheet</source>
+ <translation>Feuille de calcul</translation>
+ </message>
+ <message>
+ <source>Browser</source>
+ <translation>Navigateur</translation>
+ </message>
+ <message>
+ <source>Game</source>
+ <translation>Jeu</translation>
+ </message>
+ <message>
+ <source>Go</source>
+ <translation>Aller</translation>
+ </message>
+ <message>
+ <source>iTouch</source>
+ <translation>iTouch</translation>
+ </message>
+ <message>
+ <source>Logoff</source>
+ <translation>Fermer une session</translation>
+ </message>
+ <message>
+ <source>Market</source>
+ <translation>Marché</translation>
+ </message>
+ <message>
+ <source>Meeting</source>
+ <translation>Réunion</translation>
+ </message>
+ <message>
+ <source>Keyboard Menu</source>
+ <translation>Menu du clavier</translation>
+ </message>
+ <message>
+ <source>Menu PB</source>
+ <translation>Menu PB</translation>
+ </message>
+ <message>
+ <source>My Sites</source>
+ <translation>Mes sites</translation>
+ </message>
+ <message>
+ <source>News</source>
+ <translation>Actualités</translation>
+ </message>
+ <message>
+ <source>Home Office</source>
+ <translation>Bureau à domicile</translation>
+ </message>
+ <message>
+ <source>Option</source>
+ <translation>Option</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation>Coller</translation>
+ </message>
+ <message>
+ <source>Phone</source>
+ <translation>Téléphone</translation>
+ </message>
+ <message>
+ <source>Reply</source>
+ <translation>Répondre</translation>
+ </message>
+ <message>
+ <source>Reload</source>
+ <translation>Recharger</translation>
+ </message>
+ <message>
+ <source>Rotate Windows</source>
+ <translation>Faire tourner la fenêtre</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>Enregistrer</translation>
+ </message>
+ <message>
+ <source>Send</source>
+ <translation>Envoyer</translation>
+ </message>
+ <message>
+ <source>Spellchecker</source>
+ <translation>Correcteur orthographique</translation>
+ </message>
+ <message>
+ <source>Split Screen</source>
+ <translation>Partager l&apos;écran</translation>
+ </message>
+ <message>
+ <source>Support</source>
+ <translation>Supporter</translation>
+ </message>
+ <message>
+ <source>Task Panel</source>
+ <translation>Panneau de tâches</translation>
+ </message>
+ <message>
+ <source>Terminal</source>
+ <translation>Terminal</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation>Outils</translation>
+ </message>
+ <message>
+ <source>Travel</source>
+ <translation>Voyager</translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation>Vidéo</translation>
+ </message>
+ <message>
+ <source>Word Processor</source>
+ <translation>Traitement de texte</translation>
+ </message>
+ <message>
+ <source>XFer</source>
+ <translation>XFer</translation>
+ </message>
+ <message>
+ <source>Zoom In</source>
+ <translation>Agrandir</translation>
+ </message>
+ <message>
+ <source>Zoom Out</source>
+ <translation>Rétrécir</translation>
+ </message>
+ <message>
+ <source>Away</source>
+ <translation>Absent</translation>
+ </message>
+ <message>
+ <source>Messenger</source>
+ <translation>Messenger</translation>
+ </message>
+ <message>
+ <source>WebCam</source>
+ <translation>Webcaméra</translation>
+ </message>
+ <message>
+ <source>Mail Forward</source>
+ <translation>Faire suivre l&apos;e-mail</translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation>Images</translation>
+ </message>
+ <message>
+ <source>Music</source>
+ <translation>Musique</translation>
+ </message>
+ <message>
+ <source>Battery</source>
+ <translation>Batterie</translation>
+ </message>
+ <message>
+ <source>Bluetooth</source>
+ <translation>Bluetooth</translation>
+ </message>
+ <message>
+ <source>Wireless</source>
+ <translation>Sans fil</translation>
+ </message>
+ <message>
+ <source>Ultra Wide Band</source>
+ <translation>Bande ultralarge</translation>
+ </message>
+ <message>
+ <source>Audio Forward</source>
+ <translation>Audio avant</translation>
+ </message>
+ <message>
+ <source>Audio Repeat</source>
+ <translation>Audio répéter</translation>
+ </message>
+ <message>
+ <source>Audio Random Play</source>
+ <translation>Audio lecture aléatoire</translation>
+ </message>
+ <message>
+ <source>Subtitle</source>
+ <translation>Sous-titre</translation>
+ </message>
+ <message>
+ <source>Audio Cycle Track</source>
+ <translation>Piste du cycle audio</translation>
+ </message>
+ <message>
+ <source>Time</source>
+ <translation>Heure</translation>
+ </message>
+ <message>
+ <source>View</source>
+ <translation>Afficher</translation>
+ </message>
+ <message>
+ <source>Top Menu</source>
+ <translation>Haut du menu</translation>
+ </message>
+ <message>
+ <source>Suspend</source>
+ <translation>Suspendre</translation>
+ </message>
+ <message>
+ <source>Hibernate</source>
+ <translation>Hiberner</translation>
+ </message>
+ <message>
+ <source>Print Screen</source>
+ <translation>Capture d&apos;écran</translation>
+ </message>
+ <message>
+ <source>Page Up</source>
+ <translation>Page haut</translation>
+ </message>
+ <message>
+ <source>Page Down</source>
+ <translation>Page bas</translation>
+ </message>
+ <message>
+ <source>Caps Lock</source>
+ <translation>Verrou maj.</translation>
+ </message>
+ <message>
+ <source>Num Lock</source>
+ <translation>Verrou num.</translation>
+ </message>
+ <message>
+ <source>Number Lock</source>
+ <translation>Verrou numéro</translation>
+ </message>
+ <message>
+ <source>Scroll Lock</source>
+ <translation>Arrêt défilement</translation>
+ </message>
+ <message>
+ <source>Insert</source>
+ <translation>Insérer</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>Supprimer</translation>
+ </message>
+ <message>
+ <source>Escape</source>
+ <translation>Échapement</translation>
+ </message>
+ <message>
+ <source>System Request</source>
+ <translation>Système</translation>
+ </message>
+ <message>
+ <source>Select</source>
+ <translation>Sélectionner</translation>
+ </message>
+ <message>
+ <source>Yes</source>
+ <translation>Oui</translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation>Non</translation>
+ </message>
+ <message>
+ <source>Context1</source>
+ <translation>Contexte1</translation>
+ </message>
+ <message>
+ <source>Context2</source>
+ <translation>Contexte2</translation>
+ </message>
+ <message>
+ <source>Context3</source>
+ <translation>Contexte3</translation>
+ </message>
+ <message>
+ <source>Context4</source>
+ <translation>Contexte4</translation>
+ </message>
+ <message>
+ <source>Call</source>
+ <translation>Appeler</translation>
+ </message>
+ <message>
+ <source>Hangup</source>
+ <translation>Raccrocher</translation>
+ </message>
+ <message>
+ <source>Flip</source>
+ <translation>Retourner</translation>
+ </message>
+ <message>
+ <source>Ctrl</source>
+ <translation>Ctrl</translation>
+ </message>
+ <message>
+ <source>Shift</source>
+ <translation>Maj</translation>
+ </message>
+ <message>
+ <source>Alt</source>
+ <translation>Alt</translation>
+ </message>
+ <message>
+ <source>Meta</source>
+ <translation>Méta</translation>
+ </message>
+ <message>
+ <source>+</source>
+ <translation>+</translation>
+ </message>
+ <message>
+ <source>F%1</source>
+ <translation>F%1</translation>
+ </message>
+ <message>
+ <source>Home Page</source>
+ <translation>Page d&apos;accueil</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSlider</name>
+ <message>
+ <source>Page left</source>
+ <translation>Page précédente</translation>
+ </message>
+ <message>
+ <source>Page up</source>
+ <translation>Page précédente</translation>
+ </message>
+ <message>
+ <source>Position</source>
+ <translation>Position</translation>
+ </message>
+ <message>
+ <source>Page right</source>
+ <translation>Page suivante</translation>
+ </message>
+ <message>
+ <source>Page down</source>
+ <translation>Page suivante</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSocks5SocketEngine</name>
+ <message>
+ <source>Connection to proxy refused</source>
+ <translation>Connexion au proxy refusée</translation>
+ </message>
+ <message>
+ <source>Connection to proxy closed prematurely</source>
+ <translation>connexion au proxy fermée prématurément</translation>
+ </message>
+ <message>
+ <source>Proxy host not found</source>
+ <translation>Hôte proxy introuvable</translation>
+ </message>
+ <message>
+ <source>Connection to proxy timed out</source>
+ <translation>Connexion au proxy expirée</translation>
+ </message>
+ <message>
+ <source>Proxy authentication failed</source>
+ <translation>L&apos;authentification proxy a échoué</translation>
+ </message>
+ <message>
+ <source>Proxy authentication failed: %1</source>
+ <translation>L&apos;authentification proxy a échoué : %1</translation>
+ </message>
+ <message>
+ <source>SOCKS version 5 protocol error</source>
+ <translation>Erreur de protocole SOCKS version 5</translation>
+ </message>
+ <message>
+ <source>General SOCKSv5 server failure</source>
+ <translation>Erreur générale du serveur SOCKSv5</translation>
+ </message>
+ <message>
+ <source>Connection not allowed by SOCKSv5 server</source>
+ <translation>Connexion refusée par le serveur SOCKSv5</translation>
+ </message>
+ <message>
+ <source>TTL expired</source>
+ <translation>TTL expiré</translation>
+ </message>
+ <message>
+ <source>SOCKSv5 command not supported</source>
+ <translation>Commande SOCKSv5 non supportée</translation>
+ </message>
+ <message>
+ <source>Address type not supported</source>
+ <translation>Type d&apos;adresse non supporté</translation>
+ </message>
+ <message>
+ <source>Unknown SOCKSv5 proxy error code 0x%1</source>
+ <translation>Erreur proxy SOCKSv5 inconnue : 0x%1</translation>
+ </message>
+ <message>
+ <source>Network operation timed out</source>
+ <translation>L&apos;opération réseau a expiré</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSoftKeyManager</name>
+ <message>
+ <source>Ok</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Select</source>
+ <translation>Sélectionner</translation>
+ </message>
+ <message>
+ <source>Done</source>
+ <translation>Terminer</translation>
+ </message>
+ <message>
+ <source>Options</source>
+ <translation>Options</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation>Quitter</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSpinBox</name>
+ <message>
+ <source>More</source>
+ <translation>Plus</translation>
+ </message>
+ <message>
+ <source>Less</source>
+ <translation>Moins</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSql</name>
+ <message>
+ <source>Delete</source>
+ <translation>Supprimer</translation>
+ </message>
+ <message>
+ <source>Delete this record?</source>
+ <translation>Supprimer cet enregistrement ?</translation>
+ </message>
+ <message>
+ <source>Yes</source>
+ <translation>Oui</translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation>Non</translation>
+ </message>
+ <message>
+ <source>Insert</source>
+ <translation>Insérer</translation>
+ </message>
+ <message>
+ <source>Update</source>
+ <translation>Actualiser</translation>
+ </message>
+ <message>
+ <source>Save edits?</source>
+ <translation>Enregistrer les modifications ?</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>Confirm</source>
+ <translation>Confirmer</translation>
+ </message>
+ <message>
+ <source>Cancel your edits?</source>
+ <translation>Annuler vos modifications ?</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSslSocket</name>
+ <message>
+ <source>Unable to write data: %1</source>
+ <translation>Impossible d&apos;écrire les données : %1</translation>
+ </message>
+ <message>
+ <source>Unable to decrypt data: %1</source>
+ <translation>Impossible de décrypter les données: %1</translation>
+ </message>
+ <message>
+ <source>Error while reading: %1</source>
+ <translation>Erreur lors de la lecture : %1</translation>
+ </message>
+ <message>
+ <source>Error during SSL handshake: %1</source>
+ <translation>Erreur lors de la poignée de main SSL : %1</translation>
+ </message>
+ <message>
+ <source>Error creating SSL context (%1)</source>
+ <translation>Erreur lors de la création du contexte SSL (%1)</translation>
+ </message>
+ <message>
+ <source>Invalid or empty cipher list (%1)</source>
+ <translation>La list de chiffrements est invalide ou vide (%1)</translation>
+ </message>
+ <message>
+ <source>Private key does not certify public key, %1</source>
+ <translation>La clé privée ne certifie pas la clé publique, %1</translation>
+ </message>
+ <message>
+ <source>Error creating SSL session, %1</source>
+ <translation>Erreur lors de la création de la session SSL, %1</translation>
+ </message>
+ <message>
+ <source>Error creating SSL session: %1</source>
+ <translation>Erreur lors de la création de la session SSL : %1</translation>
+ </message>
+ <message>
+ <source>Cannot provide a certificate with no key, %1</source>
+ <translation>Impossible de fournir un certificat sans clé, %1</translation>
+ </message>
+ <message>
+ <source>Error loading local certificate, %1</source>
+ <translation>Erreur lors du chargement du certificat local, %1</translation>
+ </message>
+ <message>
+ <source>Error loading private key, %1</source>
+ <translation>Erreur lors du chargement de la clé privée, %1</translation>
+ </message>
+ <message>
+ <source>No error</source>
+ <translation>Aucune erreur</translation>
+ </message>
+ <message>
+ <source>The issuer certificate could not be found</source>
+ <translation>Le certificat de l&apos;émetteur est introuvable</translation>
+ </message>
+ <message>
+ <source>The certificate signature could not be decrypted</source>
+ <translation>La signature du certificat n&apos;a pas pu être vérifiée</translation>
+ </message>
+ <message>
+ <source>The public key in the certificate could not be read</source>
+ <translation>La clé publique du certificat n&apos;a pas pu être lue</translation>
+ </message>
+ <message>
+ <source>The signature of the certificate is invalid</source>
+ <translation>La signature du certificat n&apos;est pas valide</translation>
+ </message>
+ <message>
+ <source>The certificate is not yet valid</source>
+ <translation>Le certificat n&apos;est pas encore valide</translation>
+ </message>
+ <message>
+ <source>The certificate has expired</source>
+ <translation>Le certificat a expiré</translation>
+ </message>
+ <message>
+ <source>The certificate&apos;s notBefore field contains an invalid time</source>
+ <translation>Le champ pasAvant du certificat inclut une heure non valide</translation>
+ </message>
+ <message>
+ <source>The certificate&apos;s notAfter field contains an invalid time</source>
+ <translation>Le champ pasAprès du certificat inclut une heure non valide</translation>
+ </message>
+ <message>
+ <source>The certificate is self-signed, and untrusted</source>
+ <translation>Le certificat n&apos;est pas sécurisé car signé automatiquement</translation>
+ </message>
+ <message>
+ <source>The root certificate of the certificate chain is self-signed, and untrusted</source>
+ <translation>Le certificat racine de la chaîne de certificats n&apos;est pas sécurisé car signé automatiquement</translation>
+ </message>
+ <message>
+ <source>The issuer certificate of a locally looked up certificate could not be found</source>
+ <translation>Le certificat de l&apos;émetteur d&apos;un certificat converti localement est introuvable</translation>
+ </message>
+ <message>
+ <source>No certificates could be verified</source>
+ <translation>Aucun certificat n&apos;a pu être vérifié</translation>
+ </message>
+ <message>
+ <source>One of the CA certificates is invalid</source>
+ <translation>L&apos;un des certificats CA n&apos;est pas valide</translation>
+ </message>
+ <message>
+ <source>The basicConstraints path length parameter has been exceeded</source>
+ <translation>Le paramètre de longueur du chemin basicConstraints a été dépassé</translation>
+ </message>
+ <message>
+ <source>The supplied certificate is unsuitable for this purpose</source>
+ <translation>Le certificat fourni ne convient pas pour cet objectif</translation>
+ </message>
+ <message>
+ <source>The root CA certificate is not trusted for this purpose</source>
+ <translation>Le certificat CA racine n&apos;est pas sécurisé pour cet objectif</translation>
+ </message>
+ <message>
+ <source>The root CA certificate is marked to reject the specified purpose</source>
+ <translation>Le certificat CA racine est marqué pour rejeter l&apos;objectif spécifié</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>Le certificat de l&apos;émetteur candidat actuel a été rejeté car le nom de son sujet ne correspondait pas au nom de l&apos;émetteur du certificat actuel</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>Le certificat de l&apos;émetteur candidat actuel a été rejeté car le nom de son sujet et son numéro de série étaient présents et ne correspondaient pas à l&apos;identifiant de la clé d&apos;autorité du certificat actuel</translation>
+ </message>
+ <message>
+ <source>The peer did not present any certificate</source>
+ <translation>Le poste ne contient aucun certificat</translation>
+ </message>
+ <message>
+ <source>The host name did not match any of the valid hosts for this certificate</source>
+ <translation>Le nom d&apos;hôte ne correspondait à aucun des hôtes valides pour ce certificat</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>Erreur inconnue</translation>
+ </message>
+ </context>
+ <context>
+ <name>QStateMachine</name>
+ <message>
+ <source>Missing initial state in compound state &apos;%1&apos;</source>
+ <translation>État initial manquant dans l&apos;état composé &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <source>Missing default state in history state &apos;%1&apos;</source>
+ <translation>État par défaut manquant dans l&apos;état de l&apos;historique &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <source>No common ancestor for targets and source of transition from state &apos;%1&apos;</source>
+ <translation>Aucun ancêtre commun pour les cibles et la source de transition de l&apos;état &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>Erreur inconnue</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSystemSemaphore</name>
+ <message>
+ <source>%1: does not exist</source>
+ <translation>%1 : n&apos;existe pas</translation>
+ </message>
+ <message>
+ <source>%1: out of resources</source>
+ <translation>%1: plus de ressources disponibles</translation>
+ </message>
+ <message>
+ <source>%1: permission denied</source>
+ <translation>%1: permission refusée</translation>
+ </message>
+ <message>
+ <source>%1: already exists</source>
+ <translation>%1 : existe déjà</translation>
+ </message>
+ <message>
+ <source>%1: unknown error %2</source>
+ <translation>%1: erreur inconnue %2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QTDSDriver</name>
+ <message>
+ <source>Unable to open connection</source>
+ <translation>Impossible d&apos;ouvrir la connexion</translation>
+ </message>
+ <message>
+ <source>Unable to use database</source>
+ <translation>Impossible d&apos;utiliser la base de données</translation>
+ </message>
+ </context>
+ <context>
+ <name>QTabBar</name>
+ <message>
+ <source>Scroll Left</source>
+ <translation>Défiler vers la gauche</translation>
+ </message>
+ <message>
+ <source>Scroll Right</source>
+ <translation>Défiler vers la droite</translation>
+ </message>
+ </context>
+ <context>
+ <name>QTcpServer</name>
+ <message>
+ <source>Operation on socket is not supported</source>
+ <translation>Opération sur le socket non supportée</translation>
+ </message>
+ </context>
+ <context>
+ <name>QTextControl</name>
+ <message>
+ <source>&amp;Undo</source>
+ <translation>&amp;Annuler</translation>
+ </message>
+ <message>
+ <source>&amp;Redo</source>
+ <translation>&amp;Répéter</translation>
+ </message>
+ <message>
+ <source>Cu&amp;t</source>
+ <translation>Co&amp;uper</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>Cop&amp;ier</translation>
+ </message>
+ <message>
+ <source>Copy &amp;Link Location</source>
+ <translation>Copier l&apos;adresse du &amp;lien</translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation>Co&amp;ller</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>Supprimer</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation>Tout sélectionner</translation>
+ </message>
+ </context>
+ <context>
+ <name>QToolButton</name>
+ <message>
+ <source>Press</source>
+ <translation>Presser</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>Ouvrir</translation>
+ </message>
+ </context>
+ <context>
+ <name>QUdpSocket</name>
+ <message>
+ <source>This platform does not support IPv6</source>
+ <translation>Cette plateforme ne supporte pas IPv6</translation>
+ </message>
+ </context>
+ <context>
+ <name>QUndoGroup</name>
+ <message>
+ <source>Undo</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>Redo</source>
+ <translation>Répéter</translation>
+ </message>
+ </context>
+ <context>
+ <name>QUndoModel</name>
+ <message>
+ <source>&lt;empty&gt;</source>
+ <translation>&lt;vide&gt;</translation>
+ </message>
+ </context>
+ <context>
+ <name>QUndoStack</name>
+ <message>
+ <source>Undo</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>Redo</source>
+ <translation>Répéter</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>Insérer caractère de contrôle Unicode</translation>
+ </message>
+ </context>
+ <context>
+ <name>QWebFrame</name>
+ <message>
+ <source>Request cancelled</source>
+ <translation>Requête annulée</translation>
+ </message>
+ <message>
+ <source>Request blocked</source>
+ <translation>Requête bloquée</translation>
+ </message>
+ <message>
+ <source>Cannot show URL</source>
+ <translation>Impossible d&apos;afficher l&apos;URL</translation>
+ </message>
+ <message>
+ <source>Frame load interrupted by policy change</source>
+ <translation>Charge du cadre interrompue par le changement de politique</translation>
+ </message>
+ <message>
+ <source>Cannot show mimetype</source>
+ <translation>Impossible d&apos;afficher le mimetype</translation>
+ </message>
+ <message>
+ <source>File does not exist</source>
+ <translation>Le fichier n&apos;existe pas</translation>
+ </message>
+ </context>
+ <context>
+ <name>QWebPage</name>
+ <message>
+ <source>Submit</source>
+ <comment>default label for Submit buttons in forms on web pages</comment>
+ <translation type="unfinished"></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 type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reset</source>
+ <comment>default label for Reset buttons in forms on web pages</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose File</source>
+ <comment>title for file button used in HTML forms</comment>
+ <translation>Choisir le fichier</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 type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open in New Window</source>
+ <comment>Open in New Window context menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save Link...</source>
+ <comment>Download Linked File context menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copy Link</source>
+ <comment>Copy Link context menu item</comment>
+ <translation>Copier le lien</translation>
+ </message>
+ <message>
+ <source>Open Image</source>
+ <comment>Open Image in New Window context menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save Image</source>
+ <comment>Download Image context menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copy Image</source>
+ <comment>Copy Link context menu item</comment>
+ <translation>Copier l&apos;image</translation>
+ </message>
+ <message>
+ <source>Open Frame</source>
+ <comment>Open Frame in New Window context menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <comment>Copy context menu item</comment>
+ <translation>Copier</translation>
+ </message>
+ <message>
+ <source>Go Back</source>
+ <comment>Back context menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Go Forward</source>
+ <comment>Forward context menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Stop</source>
+ <comment>Stop context menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reload</source>
+ <comment>Reload context menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <comment>Cut context menu item</comment>
+ <translation>Couper</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <comment>Paste context menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No Guesses Found</source>
+ <comment>No Guesses Found context menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ignore</source>
+ <comment>Ignore Spelling context menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add To Dictionary</source>
+ <comment>Learn Spelling context menu item</comment>
+ <translation>Ajouter au dictionnaire</translation>
+ </message>
+ <message>
+ <source>Search The Web</source>
+ <comment>Search The Web context menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Look Up In Dictionary</source>
+ <comment>Look Up in Dictionary context menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open Link</source>
+ <comment>Open Link context menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ignore</source>
+ <comment>Ignore Grammar context menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Spelling</source>
+ <comment>Spelling and Grammar context sub-menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show Spelling and Grammar</source>
+ <comment>menu item title</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hide Spelling and Grammar</source>
+ <comment>menu item title</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Check Spelling</source>
+ <comment>Check spelling context menu item</comment>
+ <translation>Vérifier l&apos;orthographe</translation>
+ </message>
+ <message>
+ <source>Check Spelling While Typing</source>
+ <comment>Check spelling while typing context menu item</comment>
+ <translation>Vérifier l&apos;orthographe pendant la saisie</translation>
+ </message>
+ <message>
+ <source>Check Grammar With Spelling</source>
+ <comment>Check grammar with spelling context menu item</comment>
+ <translation>Vérifier la grammaire en même temps que l&apos;orthographe</translation>
+ </message>
+ <message>
+ <source>Fonts</source>
+ <comment>Font context sub-menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bold</source>
+ <comment>Bold context menu item</comment>
+ <translation>Gras</translation>
+ </message>
+ <message>
+ <source>Italic</source>
+ <comment>Italic context menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Underline</source>
+ <comment>Underline context menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Outline</source>
+ <comment>Outline context menu item</comment>
+ <translation type="unfinished"></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 type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Default</source>
+ <comment>Default writing direction context menu item</comment>
+ <translation>Défaut</translation>
+ </message>
+ <message>
+ <source>Left to Right</source>
+ <comment>Left to Right context menu item</comment>
+ <translation>Gauche à droite</translation>
+ </message>
+ <message>
+ <source>Right to Left</source>
+ <comment>Right to Left context menu item</comment>
+ <translation>Droite à gauche</translation>
+ </message>
+ <message>
+ <source>Loading...</source>
+ <comment>Media controller status message when the media is loading</comment>
+ <translation>Chargement...</translation>
+ </message>
+ <message>
+ <source>Live Broadcast</source>
+ <comment>Media controller status message when watching a live broadcast</comment>
+ <translation>Diffusion en direct</translation>
+ </message>
+ <message>
+ <source>Audio Element</source>
+ <comment>Media controller element</comment>
+ <translation>Élément audio</translation>
+ </message>
+ <message>
+ <source>Video Element</source>
+ <comment>Media controller element</comment>
+ <translation>Élément vidéo</translation>
+ </message>
+ <message>
+ <source>Mute Button</source>
+ <comment>Media controller element</comment>
+ <translation>Bouton de désactivation du son</translation>
+ </message>
+ <message>
+ <source>Unmute Button</source>
+ <comment>Media controller element</comment>
+ <translation>Bouton de réactivation du son</translation>
+ </message>
+ <message>
+ <source>Play Button</source>
+ <comment>Media controller element</comment>
+ <translation>Bouton de lecture</translation>
+ </message>
+ <message>
+ <source>Pause Button</source>
+ <comment>Media controller element</comment>
+ <translation>Bouton de pause</translation>
+ </message>
+ <message>
+ <source>Slider</source>
+ <comment>Media controller element</comment>
+ <translation>Barre de défilement</translation>
+ </message>
+ <message>
+ <source>Slider Thumb</source>
+ <comment>Media controller element</comment>
+ <translation>Curseur de la barre de défilement</translation>
+ </message>
+ <message>
+ <source>Rewind Button</source>
+ <comment>Media controller element</comment>
+ <translation>Bouton de retour en arrière</translation>
+ </message>
+ <message>
+ <source>Return to Real-time Button</source>
+ <comment>Media controller element</comment>
+ <translation>Bouton de retour au temps réel</translation>
+ </message>
+ <message>
+ <source>Elapsed Time</source>
+ <comment>Media controller element</comment>
+ <translation>Temps écoulé</translation>
+ </message>
+ <message>
+ <source>Remaining Time</source>
+ <comment>Media controller element</comment>
+ <translation>Durée restante</translation>
+ </message>
+ <message>
+ <source>Status Display</source>
+ <comment>Media controller element</comment>
+ <translation>Affichage de l&apos;état</translation>
+ </message>
+ <message>
+ <source>Fullscreen Button</source>
+ <comment>Media controller element</comment>
+ <translation>Bouton de plein écran</translation>
+ </message>
+ <message>
+ <source>Seek Forward Button</source>
+ <comment>Media controller element</comment>
+ <translation>Bouton de recherche avant</translation>
+ </message>
+ <message>
+ <source>Seek Back Button</source>
+ <comment>Media controller element</comment>
+ <translation>Bouton de recherche arrière</translation>
+ </message>
+ <message>
+ <source>Audio element playback controls and status display</source>
+ <comment>Media controller element</comment>
+ <translation>Commandes de lecture et affichage de l&apos;état de l&apos;élément audio</translation>
+ </message>
+ <message>
+ <source>Video element playback controls and status display</source>
+ <comment>Media controller element</comment>
+ <translation>Commandes de lecture et affichage de l&apos;état de l&apos;élément vidéo</translation>
+ </message>
+ <message>
+ <source>Mute audio tracks</source>
+ <comment>Media controller element</comment>
+ <translation>Couper le son des pistes audio</translation>
+ </message>
+ <message>
+ <source>Unmute audio tracks</source>
+ <comment>Media controller element</comment>
+ <translation>Réactiver le son des pistes audio</translation>
+ </message>
+ <message>
+ <source>Begin playback</source>
+ <comment>Media controller element</comment>
+ <translation>Commencer la lecture</translation>
+ </message>
+ <message>
+ <source>Pause playback</source>
+ <comment>Media controller element</comment>
+ <translation>Pause lecture</translation>
+ </message>
+ <message>
+ <source>Movie time scrubber</source>
+ <comment>Media controller element</comment>
+ <translation>Épurateur de la durée du film</translation>
+ </message>
+ <message>
+ <source>Movie time scrubber thumb</source>
+ <comment>Media controller element</comment>
+ <translation>Case de défilement de l&apos;épurateur de la durée du film</translation>
+ </message>
+ <message>
+ <source>Rewind movie</source>
+ <comment>Media controller element</comment>
+ <translation>Rembobiner le film</translation>
+ </message>
+ <message>
+ <source>Return streaming movie to real-time</source>
+ <comment>Media controller element</comment>
+ <translation>Ramener le film en streaming en temps réel</translation>
+ </message>
+ <message>
+ <source>Current movie time</source>
+ <comment>Media controller element</comment>
+ <translation>Durée du film actuel</translation>
+ </message>
+ <message>
+ <source>Remaining movie time</source>
+ <comment>Media controller element</comment>
+ <translation>Durée de film restante</translation>
+ </message>
+ <message>
+ <source>Current movie status</source>
+ <comment>Media controller element</comment>
+ <translation>État du film actuel</translation>
+ </message>
+ <message>
+ <source>Play movie in full-screen mode</source>
+ <comment>Media controller element</comment>
+ <translation>Regarder le film en mode plein écran</translation>
+ </message>
+ <message>
+ <source>Seek quickly back</source>
+ <comment>Media controller element</comment>
+ <translation>Recherche rapide arrière</translation>
+ </message>
+ <message>
+ <source>Seek quickly forward</source>
+ <comment>Media controller element</comment>
+ <translation>Recherche rapide avant</translation>
+ </message>
+ <message>
+ <source>Indefinite time</source>
+ <comment>Media time description</comment>
+ <translation>Durée indéfinie</translation>
+ </message>
+ <message>
+ <source>%1 days %2 hours %3 minutes %4 seconds</source>
+ <comment>Media time description</comment>
+ <translation>%1 jours %2 heures %3 minutes %4 secondes</translation>
+ </message>
+ <message>
+ <source>%1 hours %2 minutes %3 seconds</source>
+ <comment>Media time description</comment>
+ <translation>%1 heures %2 minutes %3 secondes</translation>
+ </message>
+ <message>
+ <source>%1 minutes %2 seconds</source>
+ <comment>Media time description</comment>
+ <translation>%1 minutes %2 secondes</translation>
+ </message>
+ <message>
+ <source>%1 seconds</source>
+ <comment>Media time description</comment>
+ <translation>%1 secondes</translation>
+ </message>
+ <message>
+ <source>Inspect</source>
+ <comment>Inspect Element context menu item</comment>
+ <translation type="unfinished"></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 type="unfinished"></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 type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear recent searches</source>
+ <comment>menu item in Recent Searches menu that empties menu&apos;s contents</comment>
+ <translation>Effacer les recherches récentes</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <comment>Unknown filesize FTP directory listing item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Web Inspector - %2</source>
+ <translation type="unfinished"></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>Requête HTTP erronée</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 type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scroll here</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Left edge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Right edge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <translation>En bas</translation>
+ </message>
+ <message>
+ <source>Page left</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Page up</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Page right</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Page down</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scroll left</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scroll up</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scroll right</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scroll down</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>%n file(s)</source>
+ <comment>number of chosen file</comment>
+ <translation>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>JavaScript Alert - %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>JavaScript Confirm - %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>JavaScript Prompt - %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>JavaScript Problem - %1</source>
+ <translation>Problème de JavaScript - %1</translation>
+ </message>
+ <message>
+ <source>The script on this page appears to have a problem. Do you want to stop the script?</source>
+ <translation>Le script de cette page semble avoir un problème. Souhaitez-vous arrêter le script?</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the next character</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move the cursor to the previous character</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move the cursor to the next word</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move the cursor to the previous word</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move the cursor to the next line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move the cursor to the previous line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move the cursor to the start of the line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move the cursor to the end of the line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move the cursor to the start of the block</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move the cursor to the end of the block</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move the cursor to the start of the document</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move the cursor to the end of the document</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the next character</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the previous character</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the next word</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the previous word</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the next line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the previous line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the start of the line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the end of the line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the start of the block</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the end of the block</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the start of the document</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the end of the document</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete to the start of the word</source>
+ <translation>Supprimer jusqu&apos;au début du mot</translation>
+ </message>
+ <message>
+ <source>Delete to the end of the word</source>
+ <translation>Supprimer jusqu&apos;à la fin du mot</translation>
+ </message>
+ <message>
+ <source>Insert a new paragraph</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert a new line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Paste and Match Style</source>
+ <translation>Coller et suivre le style</translation>
+ </message>
+ <message>
+ <source>Remove formatting</source>
+ <translation>Retirer la mise en forme</translation>
+ </message>
+ <message>
+ <source>Strikethrough</source>
+ <translation>Barré</translation>
+ </message>
+ <message>
+ <source>Subscript</source>
+ <translation>Indice</translation>
+ </message>
+ <message>
+ <source>Superscript</source>
+ <translation>Exposant</translation>
+ </message>
+ <message>
+ <source>Insert Bulleted List</source>
+ <translation>Insérer une liste à puces</translation>
+ </message>
+ <message>
+ <source>Insert Numbered List</source>
+ <translation>Insérer une liste numérotée</translation>
+ </message>
+ <message>
+ <source>Indent</source>
+ <translation>Retrait</translation>
+ </message>
+ <message>
+ <source>Outdent</source>
+ <translation>Retrait négatif</translation>
+ </message>
+ <message>
+ <source>Center</source>
+ <translation>Centré</translation>
+ </message>
+ <message>
+ <source>Justify</source>
+ <translation>Justifié</translation>
+ </message>
+ <message>
+ <source>Align Left</source>
+ <translation>Aligner à gauche</translation>
+ </message>
+ <message>
+ <source>Align Right</source>
+ <translation>Aligner à droite</translation>
+ </message>
+ </context>
+ <context>
+ <name>QWhatsThisAction</name>
+ <message>
+ <source>What&apos;s This?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QWidget</name>
+ <message>
+ <source>*</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QWizard</name>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt; &amp;Back</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>
+ <message>
+ <source>Go Back</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Commit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Done</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Next &gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QWorkspace</name>
+ <message>
+ <source>&amp;Restore</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mi&amp;nimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ma&amp;ximize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Stay on &amp;Top</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>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sh&amp;ade</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 - [%2]</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Unshade</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QXml</name>
+ <message>
+ <source>no error occurred</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error triggered by consumer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>unexpected end of file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>more than one document type definition</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error occurred while parsing element</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>tag mismatch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error occurred while parsing content</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>unexpected character</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>invalid name for processing instruction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>version expected while reading the XML declaration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>wrong value for standalone declaration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error occurred while parsing document type definition</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>letter is expected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error occurred while parsing comment</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error occurred while parsing reference</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>internal general entity reference not allowed in DTD</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>external parsed general entity reference not allowed in attribute value</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>external parsed general entity reference not allowed in DTD</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>unparsed entity reference in wrong context</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>recursive entities</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error in the text declaration of an external entity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>encoding declaration or standalone declaration expected while reading the XML declaration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>standalone declaration expected while reading the XML declaration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QXmlPatternistCLI</name>
+ <message>
+ <source>Warning in %1, at line %2, column %3: %4</source>
+ <translation>Avertissement dans %1, à la ligne %2, colonne %3: %4</translation>
+ </message>
+ <message>
+ <source>Warning in %1: %2</source>
+ <translation>Avertissement dans %1: %2</translation>
+ </message>
+ <message>
+ <source>Unknown location</source>
+ <translation>Lieu inconnu</translation>
+ </message>
+ <message>
+ <source>Error %1 in %2, at line %3, column %4: %5</source>
+ <translation>Erreur %1 dans %2, à la ligne %3, colonne %4: %5</translation>
+ </message>
+ <message>
+ <source>Error %1 in %2: %3</source>
+ <translation>Erreur %1 dans %2: %3</translation>
+ </message>
+ </context>
+ <context>
+ <name>QXmlStream</name>
+ <message>
+ <source>Extra content at end of document.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid entity value.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid XML character.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sequence &apos;]]&gt;&apos; not allowed in content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Namespace prefix &apos;%1&apos; not declared</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute redefined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unexpected character &apos;%1&apos; in public id literal.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid XML version string.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsupported XML version.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 is an invalid encoding name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encoding %1 is unsupported</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Standalone accepts only yes or no.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid attribute in XML declaration.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Premature end of document.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid document.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Expected </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>, but got &apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unexpected &apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Expected character data.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Recursive entity detected.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start tag expected.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>XML declaration not at start of document.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>NDATA in parameter entity declaration.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 is an invalid processing instruction name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid processing instruction name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Illegal namespace declaration.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid XML name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opening and ending tag mismatch.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reference to unparsed entity &apos;%1&apos;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Entity &apos;%1&apos; not declared.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reference to external entity &apos;%1&apos; in attribute value.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid character reference.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encountered incorrectly encoded content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The standalone pseudo attribute must appear after the encoding.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 is an invalid PUBLIC identifier.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QtXmlPatterns</name>
+ <message>
+ <source>At least one component must be present.</source>
+ <translation>Au moins un composant doit être présent.</translation>
+ </message>
+ <message>
+ <source>%1 is not a valid value of type %2.</source>
+ <translation>%1 n&apos;est pas une valeur valide du type %2.</translation>
+ </message>
+ <message>
+ <source>When casting to %1 from %2, the source value cannot be %3.</source>
+ <translation>En castant de %2 vers %1, la valeur source ne peut pas être %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 ne peut être calculée pour une séquence contenant deux ou plus valeurs atomiques.</translation>
+ </message>
+ <message>
+ <source>The data of a processing instruction cannot contain the string %1</source>
+ <translation>Les données d&apos;une instruction de traitement ne peut contenir la chaîne %1</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid %2</source>
+ <translation>%1 est un ivalide %2</translation>
+ </message>
+ <message>
+ <source>%1 is not a valid XML 1.0 character.</source>
+ <translation>%1 n&apos;est pas un caractère XML 1.0 valide.</translation>
+ </message>
+ <message>
+ <source>%1 was called.</source>
+ <translation>%1 a été appelé.</translation>
+ </message>
+ <message>
+ <source>In the replacement string, %1 must be followed by at least one digit when not escaped.</source>
+ <translation>Dans la chaîne de remplacement, %1 doit être suivi par au moins un chiffre s&apos;il n&apos;est pas échappé.</translation>
+ </message>
+ <message>
+ <source>In the replacement string, %1 can only be used to escape itself or %2, not %3</source>
+ <translation>Dans la chaîne de remplacement, %1 peut seulement être utilisé pour échapper lui-même ou %2 mais pas %3</translation>
+ </message>
+ <message>
+ <source>%1 matches newline characters</source>
+ <translation>%1 correspond à des caractères de saut de ligne</translation>
+ </message>
+ <message>
+ <source>Matches are case insensitive</source>
+ <translation>Les correspondances ne sont pas sensibles à la casse</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid regular expression pattern: %2</source>
+ <translation>%1 est un modèle d&apos;expression régulière invalide: %2</translation>
+ </message>
+ <message>
+ <source>It will not be possible to retrieve %1.</source>
+ <translation>Il sera impossible de récupérer %1.</translation>
+ </message>
+ <message>
+ <source>The default collection is undefined</source>
+ <translation>I&apos;l n&apos;y a pas de collection par défaut</translation>
+ </message>
+ <message>
+ <source>%1 cannot be retrieved</source>
+ <translation>%1 ne peut pas être récupéré</translation>
+ </message>
+ <message>
+ <source>The item %1 did not match the required type %2.</source>
+ <translation>L&apos;item %1 ne correspond pas au type requis %2.</translation>
+ </message>
+ <message>
+ <source>%1 is an unknown schema type.</source>
+ <translation>%1 est un type de schema inconnu.</translation>
+ </message>
+ <message>
+ <source>A template with name %1 has already been declared.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Only one %1 declaration can occur in the query prolog.</source>
+ <translation>Seulement une déclaration %1 peut intervenir lors du prologue de la requête.</translation>
+ </message>
+ <message>
+ <source>The initialization of variable %1 depends on itself</source>
+ <translation>L&apos;initialisation de la variable %1 dépend d&apos;elle-même</translation>
+ </message>
+ <message>
+ <source>The variable %1 is unused</source>
+ <translation>La variable %1 est inutilisée</translation>
+ </message>
+ <message>
+ <source>Version %1 is not supported. The supported XQuery version is 1.0.</source>
+ <translation>La version %1 n&apos;est pas supportée. La version de XQuery supportée est 1.0.</translation>
+ </message>
+ <message>
+ <source>No function with signature %1 is available</source>
+ <translation>Aucune fonction avec la signature %1 n&apos;est disponible</translation>
+ </message>
+ <message>
+ <source>It is not possible to redeclare prefix %1.</source>
+ <translation>Il est impossible de redéclarer le préfixe %1.</translation>
+ </message>
+ <message>
+ <source>Prefix %1 is already declared in the prolog.</source>
+ <translation>Le préfixe %1 est déjà déclaré dans le prologue.</translation>
+ </message>
+ <message>
+ <source>The name of an option must have a prefix. There is no default namespace for options.</source>
+ <translation>Le nom d&apos;une option doit avoir un préfixe. Il n&apos;y a pas de namespace par défaut pour les options.</translation>
+ </message>
+ <message>
+ <source>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</source>
+ <translation>La fonctionnalité &quot;Schema Import&quot; n&apos;est pas supportée et les déclarations %1 ne peuvent donc intervenir.</translation>
+ </message>
+ <message>
+ <source>The target namespace of a %1 cannot be empty.</source>
+ <translation>Le namespace cible d&apos;un %1 ne peut être vide.</translation>
+ </message>
+ <message>
+ <source>The module import feature is not supported</source>
+ <translation>La fonctionnalité &quot;module import&quot; n&apos;est pas supportée</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>Le namespace d&apos;une fonction utilisateur dans un module de bibliothèque doit être équivalent au namespace du module. En d&apos;autres mots, il devrait être %1 au lieu de %2</translation>
+ </message>
+ <message>
+ <source>A function already exists with the signature %1.</source>
+ <translation>Une fonction avec la signature %1 existe déjà.</translation>
+ </message>
+ <message>
+ <source>No external functions are supported. All supported functions can be used directly, without first declaring them as external</source>
+ <translation>Les fonctions externes ne sont pas supportées. Toutes les fonctions supportées peuvent êter utilisées directement sans les déclarer préalablement comme externes</translation>
+ </message>
+ <message>
+ <source>The %1-axis is unsupported in XQuery</source>
+ <translation>L&apos;axe %1 n&apos;est pas supporté dans XQuery</translation>
+ </message>
+ <message>
+ <source>The namespace URI cannot be the empty string when binding to a prefix, %1.</source>
+ <translation>L&apos;URI de namespace ne peut être une chaîne vide quand on le lie à un préfixe, %1.</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid namespace URI.</source>
+ <translation>%1 est un URI de namespace invalide.</translation>
+ </message>
+ <message>
+ <source>It is not possible to bind to the prefix %1</source>
+ <translation>Il est impossible de se lier au préfixe %1</translation>
+ </message>
+ <message>
+ <source>Two namespace declaration attributes have the same name: %1.</source>
+ <translation>Deux attributs de déclarations de namespace ont le même nom : %1.</translation>
+ </message>
+ <message>
+ <source>The namespace URI must be a constant and cannot use enclosed expressions.</source>
+ <translation>L&apos;URI de namespace doit être une constante et ne peut contenir d&apos;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 n&apos;est pas dans les déclaration d&apos;attribut in-scope. La fonctionnalité d&apos;inport de schéma n&apos;est pas supportée.</translation>
+ </message>
+ <message>
+ <source>empty</source>
+ <translation>vide</translation>
+ </message>
+ <message>
+ <source>zero or one</source>
+ <translation>zéro ou un</translation>
+ </message>
+ <message>
+ <source>exactly one</source>
+ <translation>exactement un</translation>
+ </message>
+ <message>
+ <source>one or more</source>
+ <translation>un ou plus</translation>
+ </message>
+ <message>
+ <source>zero or more</source>
+ <translation>zéro ou plus</translation>
+ </message>
+ <message>
+ <source>The focus is undefined.</source>
+ <translation>Le focus est indéfini.</translation>
+ </message>
+ <message>
+ <source>An attribute by name %1 has already been created.</source>
+ <translation>Un attribute de nom %1 a déjà été créé.</translation>
+ </message>
+ <message>
+ <source>Network timeout.</source>
+ <translation>Le réseau ne répond pas.</translation>
+ </message>
+ <message>
+ <source>Element %1 can&apos;t be serialized because it appears outside the document element.</source>
+ <translation>L&apos;élément %1 ne peut pas être sérialisé parce qu&apos;il est hors de l&apos;élément document.</translation>
+ </message>
+ <message>
+ <source>Year %1 is invalid because it begins with %2.</source>
+ <translation>L&apos;année %1 est invalide parce qu&apos;elle commence par %2.</translation>
+ </message>
+ <message>
+ <source>Day %1 is outside the range %2..%3.</source>
+ <translation>Le jour %1 est hors de l&apos;intervalle %2..%3.</translation>
+ </message>
+ <message>
+ <source>Month %1 is outside the range %2..%3.</source>
+ <translation>Le mois %1 est hors de l&apos;intervalle %2..%3.</translation>
+ </message>
+ <message>
+ <source>Overflow: Can&apos;t represent date %1.</source>
+ <translation>Overflow: ne peut pas représenter la date %1.</translation>
+ </message>
+ <message>
+ <source>Day %1 is invalid for month %2.</source>
+ <translation>Jour %1 est invalide pour le mois %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>L&apos;heure 24:%1:%2.%3 est invalide. L&apos;heure est 24 mais les minutes, seconndes et millisecondes ne sont pas à 0;</translation>
+ </message>
+ <message>
+ <source>Time %1:%2:%3.%4 is invalid.</source>
+ <translation>L&apos;heure %1:%2:%3.%4 est invalide.</translation>
+ </message>
+ <message>
+ <source>Overflow: Date can&apos;t be represented.</source>
+ <translation>Overflow : la date ne peut pas être représentée.</translation>
+ </message>
+ <message>
+ <source>At least one time component must appear after the %1-delimiter.</source>
+ <translation>Au moins un composant doit apparaître après le délimiteur %1.</translation>
+ </message>
+ <message>
+ <source>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</source>
+ <translation>Diviser une valeur du type %1 par %2 (not-a-number) est interdit.</translation>
+ </message>
+ <message>
+ <source>Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed.</source>
+ <translation>Diviser une valeur de type %1 par %2 ou %3 (plus ou moins zéro) est interdit.</translation>
+ </message>
+ <message>
+ <source>Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed.</source>
+ <translation>La multiplication d&apos;une valeur du type %1 par %2 ou %3 (plus ou moins infini) est interdite.</translation>
+ </message>
+ <message>
+ <source>A value of type %1 cannot have an Effective Boolean Value.</source>
+ <translation>Une valeur de type %1 ne peut pas avoir une Effective Boolean Value.</translation>
+ </message>
+ <message>
+ <source>Value %1 of type %2 exceeds maximum (%3).</source>
+ <translation>La valeur %1 de type %2 excède le maximum (%3).</translation>
+ </message>
+ <message>
+ <source>Value %1 of type %2 is below minimum (%3).</source>
+ <translation>La valeur %1 de type %2 est inférieur au 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>Une valeur de type %1 doit contenir un nombre pair de chiffre. La valeur %2 n&apos;est pas conforme.</translation>
+ </message>
+ <message>
+ <source>%1 is not valid as a value of type %2.</source>
+ <translation>%1 n&apos;est pas une valeur valide de type %2.</translation>
+ </message>
+ <message>
+ <source>Operator %1 cannot be used on type %2.</source>
+ <translation>L&apos;opérateur %1 ne peut pas être utilisé pour le type %2.</translation>
+ </message>
+ <message>
+ <source>Operator %1 cannot be used on atomic values of type %2 and %3.</source>
+ <translation>L&apos;opérateur %1 ne peut pas être utilisé pour des valeurs atomiques de type %2 ou %3.</translation>
+ </message>
+ <message>
+ <source>The namespace URI in the name for a computed attribute cannot be %1.</source>
+ <translation>L&apos;URI de namespace dans le nom d&apos;un attribut calculé ne peut pas être %1.</translation>
+ </message>
+ <message>
+ <source>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</source>
+ <translation>Le nom d&apos;un attribut calculé ne peut pas avoir l&apos;URI de namespace %1 avec le nom local %2.</translation>
+ </message>
+ <message>
+ <source>Type error in cast, expected %1, received %2.</source>
+ <translation>Erreur de type lors du cast, attendu %1 mais reçu %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>En castant vers %1 ou des types dérivés, la valeur source doit être du même type ou une chaîne. Le type %2 n&apos;est pas autorisé.</translation>
+ </message>
+ <message>
+ <source>A comment cannot contain %1</source>
+ <translation>Un commentaire ne peut pas contenir %1</translation>
+ </message>
+ <message>
+ <source>A comment cannot end with a %1.</source>
+ <translation>Un commentaire ne peut pas finir par %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>Un noeuds attribut ne peut être un fils d&apos;un noeuds document. C&apos;est pourquoi l&apos;attribut %1 est mal placé.</translation>
+ </message>
+ <message>
+ <source>A library module cannot be evaluated directly. It must be imported from a main module.</source>
+ <translation>Un module de bibliothèque ne peut pas être évalué directement. Il doit être importé d&apos;un module principal.</translation>
+ </message>
+ <message>
+ <source>No template by name %1 exists.</source>
+ <translation>Aucun template nommé %1 n&apos;existe.</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>Une valeur de type %1 ne peut être un prédicat. Un prédicat doit être de type numérique ou un Effective Boolean Value.</translation>
+ </message>
+ <message>
+ <source>A positional predicate must evaluate to a single numeric value.</source>
+ <translation>Un prédicat de position doit être évalué en une unique valeur numérique.</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>Le nom de destination dans une instruction de traitement ne peut être %1. %2 est invalide.</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 n&apos;est pas un nom de destination valide dans une instruction de traitement. Ce doit être une valeur %2, par 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>La dernière étape dans un chemin doit contenir soit des noeuds soit des valeurs atomiques. Cela ne peut pas être un mélange des deux.</translation>
+ </message>
+ <message>
+ <source>No namespace binding exists for the prefix %1</source>
+ <translation>Aucun lien de namespace n&apos;existe pour le préfixe %1</translation>
+ </message>
+ <message>
+ <source>No namespace binding exists for the prefix %1 in %2</source>
+ <translation>Aucun lien de namespace n&apos;existe pour le préfixe %1 dans %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>Le premier argument de %1 ne peut être du type %2. Il doit être de type numérique, xs:yearMonthDuration ou 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>Le premier argument de %1 ne peut être du type %2. Il doit être de type %3, %4 ou %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>Le deuxième argument de %1 ne peut être du type %2. Il doit être de type %3, %4 ou %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>Si les deux valeurs ont des décalages de zone, elle doivent avoir le même. %1 et %2 sont différents.</translation>
+ </message>
+ <message>
+ <source>%1 must be followed by %2 or %3, not at the end of the replacement string.</source>
+ <translation>%1 doit être suivi par %2 ou %3, et non à la fin de la chaîne de remplacement.</translation>
+ </message>
+ <message>
+ <source>%1 and %2 match the start and end of a line.</source>
+ <translation>%1 et %2 correspondent au début et à la fin d&apos;une ligne.</translation>
+ </message>
+ <message>
+ <source>Whitespace characters are removed, except when they appear in character classes</source>
+ <translation>Les blancs sont supprimés excepté quand ils apparaissent dans les classes de caractère</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid flag for regular expressions. Valid flags are:</source>
+ <translation>%1 est un flag invalide pour des expressions régulières. Les flags valides sont :</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>Si le premier argument est une sequence vide ou un chaîne vide (sans namespace), un préfixe ne peut être spécifié. Le préfixe %1 a été spécifié.</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>Le forme de normalisation %1 n&apos;est pas supportée. Les formes supportées sont %2, %3, %4 et %5, et aucun, ie. une chaîne vide (pas de normalisation).</translation>
+ </message>
+ <message>
+ <source>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</source>
+ <translation>Un décalage de zone doit être dans l&apos;intervalle %1..%2 inclus. %3 est hors de l&apos;intervalle.</translation>
+ </message>
+ <message>
+ <source>Required cardinality is %1; got cardinality %2.</source>
+ <translation>La cardinalité requise est %1; reçu %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>L&apos;encodage %1 est invalide. Il doit contenir uniquement des caractères latins, sans blanc et doit être conforme à l&apos;expression régulière %2.</translation>
+ </message>
+ <message>
+ <source>The keyword %1 cannot occur with any other mode name.</source>
+ <translation>Le mot-clé %1 ne peut pas apparaître avec un autre nom de mode.</translation>
+ </message>
+ <message>
+ <source>No variable with name %1 exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The value of attribute %1 must be of type %2, which %3 isn&apos;t.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The prefix %1 cannot be bound. By default, it is already bound to the namespace %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A variable with name %1 has already been declared.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No value is available for the external variable with name %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A stylesheet function must have a prefixed name.</source>
+ <translation>Une fonction de feuille de style doit avoir un nom préfixé.</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>Le namespace %1 est réservé; c&apos;est pourquoi les fonctions définies par l&apos;utilisateur ne peuvent l&apos;utiliser. Essayez le préfixe prédéfini %2 qui existe pour ces cas.</translation>
+ </message>
+ <message>
+ <source>An argument with name %1 has already been declared. Every argument name must be unique.</source>
+ <translation type="unfinished"></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>Quand la fonction %1 est utilisée pour vérifier la correspondance dans un pattern, l&apos;argument doit être une référence de variable ou une chaîne de caractères.</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>Dans un pattern XSL-T, le premier argument à la fonction %1 doit être une chaîne de caractères quand utilisé pour correspondance.</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>Dans un pattern XSL-T, le premier argument à la fonction %1 doit être un litéral ou une référence de variable.</translation>
+ </message>
+ <message>
+ <source>In an XSL-T pattern, function %1 cannot have a third argument.</source>
+ <translation>Dans un pattern XSL-T, la fonction %1 ne peut pas avoir de 3e argument.</translation>
+ </message>
+ <message>
+ <source>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</source>
+ <translation>Dans un pattern XSL-T, seules les fonctions %1 et %2 (pas %3) peuvent être utilisées pour le matching.</translation>
+ </message>
+ <message>
+ <source>In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can.</source>
+ <translation>Dans un pattern XSL-T, l&apos;axe %1 ne peut pas être utilisé, seulement %2 ou %3 le peuvent.</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid template mode name.</source>
+ <translation>%1 est un nom de mode de template invalide.</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>Le nom d&apos;une variable liée dans un expression for doit être different de la variable positionnelle. Les deux variables appelées %1 sont en conflit.</translation>
+ </message>
+ <message>
+ <source>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</source>
+ <translation>La fonctionnalité &quot;Schema Validation&quot; n&apos;est pas supportée. Les expressions %1 ne seront pas utilisées.</translation>
+ </message>
+ <message>
+ <source>None of the pragma expressions are supported. Therefore, a fallback expression must be present</source>
+ <translation>Aucune des expressions pragma n&apos;est supportée. Une expression par défault doit être présente</translation>
+ </message>
+ <message>
+ <source>Each name of a template parameter must be unique; %1 is duplicated.</source>
+ <translation>Chaque nom d&apos;un paramètre ede template doit être unique; %1 est dupliqué.</translation>
+ </message>
+ <message>
+ <source>No function with name %1 is available.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 is not a valid numeric literal.</source>
+ <translation>%1 n&apos;est pas une valeur numérique valide.</translation>
+ </message>
+ <message>
+ <source>W3C XML Schema identity constraint selector</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>W3C XML Schema identity constraint field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A construct was encountered which is disallowed in the current language(%1).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
+ <translation>Le namespace %1 peut seulement être lié à %2 (et doit être pré-déclaré).</translation>
+ </message>
+ <message>
+ <source>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
+ <translation>Le préfixe %1 peut seulement être lié à %2 (et doit être prédéclaré).</translation>
+ </message>
+ <message>
+ <source>An attribute with name %1 has already appeared on this element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A direct element constructor is not well-formed. %1 is ended with %2.</source>
+ <translation>Un constructeur direct d&apos;élément est mal-formé. %1 est terminé par %2.</translation>
+ </message>
+ <message>
+ <source>The name %1 does not refer to any schema type.</source>
+ <translation>Le nom %1 ne se réfère à aucun type de schema.</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 est une type complexe. Caster vers des types complexes n&apos;est pas possible. Cependant, caster vers des types atomiques comme %2 marche.</translation>
+ </message>
+ <message>
+ <source>%1 is not an atomic type. Casting is only possible to atomic types.</source>
+ <translation>%1 n&apos;est pas un type atomique. Il est uniquement possible de caster vers des types atomiques.</translation>
+ </message>
+ <message>
+ <source>%1 is not a valid name for a processing-instruction.</source>
+ <translation>%1 n&apos;est pas un nom valide pour une instruction de traitement.</translation>
+ </message>
+ <message>
+ <source>The name of an extension expression must be in a namespace.</source>
+ <translation>Le nom d&apos;une expression d&apos;extension doit être dans un namespace.</translation>
+ </message>
+ <message>
+ <source>Required type is %1, but %2 was found.</source>
+ <translation>Le type requis est %1, mais %2 a été reçu.</translation>
+ </message>
+ <message>
+ <source>Promoting %1 to %2 may cause loss of precision.</source>
+ <translation>La Promotion de %1 vers %2 peut causer un perte de précision.</translation>
+ </message>
+ <message>
+ <source>It&apos;s not possible to add attributes after any other kind of node.</source>
+ <translation>Il est impossible d&apos;ajouter des attributs après un autre type de noeuds.</translation>
+ </message>
+ <message>
+ <source>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</source>
+ <translation>Seule le Unicode CodepointCollation est supporté (%1), %2 n&apos;est pas supporté.</translation>
+ </message>
+ <message>
+ <source>Integer division (%1) by zero (%2) is undefined.</source>
+ <translation>Division entière (%1) par zéro (%2) indéfinie.</translation>
+ </message>
+ <message>
+ <source>Division (%1) by zero (%2) is undefined.</source>
+ <translation>Division (%1) par zéro (%2) indéfinie.</translation>
+ </message>
+ <message>
+ <source>Modulus division (%1) by zero (%2) is undefined.</source>
+ <translation>Module division (%1) par zéro (%2) indéfinie.</translation>
+ </message>
+ <message numerus="yes">
+ <source>%1 takes at most %n argument(s). %2 is therefore invalid.</source>
+ <translation>
+ <numerusform>%1 prend au maximum %n argument. %2 est donc invalide.</numerusform>
+ <numerusform>%1 prend au maximum %n arguments. %2 est donc invalide.</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%1 requires at least %n argument(s). %2 is therefore invalid.</source>
+ <translation>
+ <numerusform>%1 requiert au moins %n argument. %2 est donc invalide.</numerusform>
+ <numerusform>%1 requiert au moins %n arguments. %2 est donc invalide.</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>Le noeuds racine du deuxième argument à la fonction %1 doit être un noeuds document. %2 n&apos;est pas un document.</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>Le namespace d&apos;une fonction utilisateur ne peut pas être vide (essayez le préfixe prédéfini %1 qui existe pour ce genre de cas)</translation>
+ </message>
+ <message>
+ <source>A default namespace declaration must occur before function, variable, and option declarations.</source>
+ <translation>Un déclaration de namespace par défaut doit être placée avant toute fonction, variable ou declaration d&apos;option.</translation>
+ </message>
+ <message>
+ <source>Namespace declarations must occur before function, variable, and option declarations.</source>
+ <translation>Les declarations de namespace doivent être placées avant tout fonction, variable ou déclaration d&apos;option.</translation>
+ </message>
+ <message>
+ <source>Module imports must occur before function, variable, and option declarations.</source>
+ <translation>Les imports de module doivent être placés avant tout fonction, variable ou déclaration d&apos;option.</translation>
+ </message>
+ <message>
+ <source>%1 is not a whole number of minutes.</source>
+ <translation>%1 n&apos;est pas un nombre entier de minutes.</translation>
+ </message>
+ <message>
+ <source>Attribute %1 can&apos;t be serialized because it appears at the top level.</source>
+ <translation>L&apos;attribut %1 ne peut pas être sérialisé car il apparaît à la racine.</translation>
+ </message>
+ <message>
+ <source>%1 is an unsupported encoding.</source>
+ <translation>%1 est un encodage non supporté.</translation>
+ </message>
+ <message>
+ <source>%1 contains octets which are disallowed in the requested encoding %2.</source>
+ <translation>%1 contient &apos;octets&apos;, qui n&apos;est pas autorisé pour l&apos;encodage %2.</translation>
+ </message>
+ <message>
+ <source>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</source>
+ <translation>Le codepoint %1 dans %2 et utilisant l&apos;encodage %3 est un caractère XML invalide.</translation>
+ </message>
+ <message>
+ <source>Ambiguous rule match.</source>
+ <translation>Corresonpdance aux règles ambigüe.</translation>
+ </message>
+ <message>
+ <source>In a namespace constructor, the value for a namespace cannot be an empty string.</source>
+ <translation>Dans un constructeur d&apos;espace de noms, la valeur pour un espace de noms ne peut pas être une chaîne vide.</translation>
+ </message>
+ <message>
+ <source>The prefix must be a valid %1, which %2 is not.</source>
+ <translation>Le préfixe doit être un valide %1; %2 n&apos;e l&apos;est pas.</translation>
+ </message>
+ <message>
+ <source>The prefix %1 cannot be bound.</source>
+ <translation>Le préfixe %1 ne peut être lié.</translation>
+ </message>
+ <message>
+ <source>Only the prefix %1 can be bound to %2 and vice versa.</source>
+ <translation>Seul le préfixe %1 peut être lié à %2, et vice versa.</translation>
+ </message>
+ <message>
+ <source>The parameter %1 is required, but no corresponding %2 is supplied.</source>
+ <translation>Le paramètre %1 est requis, mais aucun %2 correspondant n&apos;est fourni.</translation>
+ </message>
+ <message>
+ <source>The parameter %1 is passed, but no corresponding %2 exists.</source>
+ <translation>Le paramètre %1 est passé mais aucun %2 correspondant n&apos;existe.</translation>
+ </message>
+ <message>
+ <source>The URI cannot have a fragment</source>
+ <translation>L&apos;URI ne peut pas avoir de fragments</translation>
+ </message>
+ <message>
+ <source>Element %1 is not allowed at this location.</source>
+ <translation>L&apos;élément %1 n&apos;est pas autorisé à cet emplacement.</translation>
+ </message>
+ <message>
+ <source>Text nodes are not allowed at this location.</source>
+ <translation>Les noeuds de texte ne sont pas autorisés à cet emplacement.</translation>
+ </message>
+ <message>
+ <source>Parse error: %1</source>
+ <translation>Erreur: %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>La valeur de l&apos;attribut de version XSL-T doit être du type %1, et non %2.</translation>
+ </message>
+ <message>
+ <source>Running an XSL-T 1.0 stylesheet with a 2.0 processor.</source>
+ <translation>Lancement d&apos;une feuille de style XSL-T 1.0 avec un processeur 2.0.</translation>
+ </message>
+ <message>
+ <source>Unknown XSL-T attribute %1.</source>
+ <translation>Attribut XSL-T inconnu : %1.</translation>
+ </message>
+ <message>
+ <source>Attribute %1 and %2 are mutually exclusive.</source>
+ <translation>Les attributs %1 et %2 sont mutuellement exclusifs.</translation>
+ </message>
+ <message>
+ <source>In a simplified stylesheet module, attribute %1 must be present.</source>
+ <translation>Dans un module de feuille de style simplifié, l&apos;attribut %1 doit être présent.</translation>
+ </message>
+ <message>
+ <source>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</source>
+ <translation>Si l&apos;élément %1 n&apos;a pas d&apos;attribut %2, il ne peut pas avoir d&apos;attribut %3 ou %4.</translation>
+ </message>
+ <message>
+ <source>Element %1 must have at least one of the attributes %2 or %3.</source>
+ <translation>L&apos;élement %1 doit avoir au moins un des attributs %2 ou %3.</translation>
+ </message>
+ <message>
+ <source>At least one mode must be specified in the %1-attribute on element %2.</source>
+ <translation>Au moins un mode doit être spécifié dans l&apos;attribut %1 sur l&apos;élément %2.</translation>
+ </message>
+ <message>
+ <source>Element %1 must come last.</source>
+ <translation>L&apos;élément %1 doit être le dernier.</translation>
+ </message>
+ <message>
+ <source>At least one %1-element must occur before %2.</source>
+ <translation>Au moins un élément %1 doit être placé avant %2.</translation>
+ </message>
+ <message>
+ <source>Only one %1-element can appear.</source>
+ <translation>Seulement un élément %1 peut apparaître.</translation>
+ </message>
+ <message>
+ <source>At least one %1-element must occur inside %2.</source>
+ <translation>Au moins un élément %1 doit apparaître dans %2.</translation>
+ </message>
+ <message>
+ <source>When attribute %1 is present on %2, a sequence constructor cannot be used.</source>
+ <translation>Quand l&apos;attribut %1 est présent sur %2, un constructeur de séquence ne peut pas être utilisé.</translation>
+ </message>
+ <message>
+ <source>Element %1 must have either a %2-attribute or a sequence constructor.</source>
+ <translation>L&apos;élément %1 doit avoir un attribut %2 ou un constructeur de séquence.</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>Quand un paramètre est requis, un valeur par défault ne peut pas être fournie par un attribute %1 ou un constructeur de séquence.</translation>
+ </message>
+ <message>
+ <source>Element %1 cannot have children.</source>
+ <translation>L&apos;élément %1 ne peut pas avoir de fils.</translation>
+ </message>
+ <message>
+ <source>Element %1 cannot have a sequence constructor.</source>
+ <translation>L&apos;élément %1 ne peut pas avoir un constructuer de séquence.</translation>
+ </message>
+ <message>
+ <source>The attribute %1 cannot appear on %2, when it is a child of %3.</source>
+ <translation>L&apos;attribut %1 ne peut pas apparaître sur %2 quand il est fils de %3.</translation>
+ </message>
+ <message>
+ <source>A parameter in a function cannot be declared to be a tunnel.</source>
+ <translation>Un paramètre de fonction ne peut pas être déclaré comme un tunnel.</translation>
+ </message>
+ <message>
+ <source>This processor is not Schema-aware and therefore %1 cannot be used.</source>
+ <translation>Ce processeur ne comprend pas les Schemas. C&apos;est pourquoi %1 ne peut pas être utilisé.</translation>
+ </message>
+ <message>
+ <source>Top level stylesheet elements must be in a non-null namespace, which %1 isn&apos;t.</source>
+ <translation>Les élément d&apos;une feuille de style de haut niveau doivent être dans un namespace non nul; %1 ne l&apos;est pas.</translation>
+ </message>
+ <message>
+ <source>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</source>
+ <translation>La valeur de l&apos;attribut %1 de l&apos;élement %2 doit être %3 ou %4, et pas %5.</translation>
+ </message>
+ <message>
+ <source>Attribute %1 cannot have the value %2.</source>
+ <translation>L&apos;attribut %1 ne peut avoir la valeur %2.</translation>
+ </message>
+ <message>
+ <source>The attribute %1 can only appear on the first %2 element.</source>
+ <translation>L&apos;attribute %1 peut seulement apparaître sur le premier élément %2.</translation>
+ </message>
+ <message>
+ <source>At least one %1 element must appear as child of %2.</source>
+ <translation>Au moins un élément %1 doit apparaître comme fils de %2.</translation>
+ </message>
+ <message>
+ <source>%1 has inheritance loop in its base type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Circular inheritance of base type %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Circular inheritance of union %1.</source>
+ <translation type="unfinished"></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"></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"></translation>
+ </message>
+ <message>
+ <source>Base type of simple type %1 cannot be complex type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type %1 cannot have direct base type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type %1 is not allowed to have base type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type %1 can only have simple atomic type as base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type %1 cannot derive from %2 as the latter defines restriction as final.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Variety of item type of %1 must be either atomic or union.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Variety of member types of %1 must be atomic.</source>
+ <translation type="unfinished"></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"></translation>
+ </message>
+ <message>
+ <source>Simple type %1 is only allowed to have %2 facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base type of simple type %1 must have variety of type list.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base type of simple type %1 has defined derivation by restriction as final.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Item type of base type does not match item type of %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type %1 contains not allowed facet type %2.</source>
+ <translation type="unfinished"></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"></translation>
+ </message>
+ <message>
+ <source>%1 is not allowed to have any facets.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base type %1 of simple type %2 must have variety of union.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base type %1 of simple type %2 is not allowed to have restriction in %3 attribute.</source>
+ <translation type="unfinished"></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"></translation>
+ </message>
+ <message>
+ <source>Derivation method of %1 must be extension because the base type %2 is a simple type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 has duplicated element %2 in its content model.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 has non-deterministic content.</source>
+ <translation type="unfinished"></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"></translation>
+ </message>
+ <message>
+ <source>Content model of complex type %1 is not a valid extension of content model of %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 must have simple content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 must have the same simple type as its base class %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 cannot be derived from base type %2%3.</source>
+ <translation type="unfinished"></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"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 with simple content cannot be derived from complex base type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Item type of simple type %1 cannot be a complex type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Member type of simple type %1 cannot be a complex type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 is not allowed to have a member type with the same name as itself.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet collides with %2 facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must have the same value as %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be equal or greater than %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be less than or equal to %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet contains invalid regular expression</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unknown notation %1 used in %2 facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet contains invalid value %2: %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet cannot be %2 or %3 if %4 facet of base type is %5.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet cannot be %2 if %3 facet of base type is %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be less than or equal to %2 facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be less than %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet and %2 facet cannot appear together.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be greater than %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be less than %2 facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be greater than or equal to %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type contains not allowed facet %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1, %2, %3, %4, %5 and %6 facets are not allowed when derived by list.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Only %1 and %2 facets are allowed when derived by union.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 contains %2 facet with invalid data: %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute group %1 contains attribute %2 twice.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute group %1 contains two different attributes that both have types derived from %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute group %1 contains attribute %2 that has value constraint but type that inherits from %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 contains attribute %2 twice.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 contains two different attributes that both have types derived from %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 contains attribute %2 that has value constraint but type that inherits from %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is not allowed to have a value constraint if its base type is complex.</source>
+ <translation type="unfinished"></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"></translation>
+ </message>
+ <message>
+ <source>Value constraint of element %1 is not of elements type: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is not allowed to have substitution group affiliation as it is no global element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type of element %1 cannot be derived from type of substitution group affiliation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Value constraint of attribute %1 is not of attributes type: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 has value constraint but has type derived from %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute in derived complex type must be %2 like in base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 in derived complex type must have %2 value constraint like in base type.</source>
+ <translation type="unfinished"></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>
+ </message>
+ <message>
+ <source>Attribute %1 in derived complex type must have %2 value constraint.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>processContent of base wildcard must be weaker than derived wildcard.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 exists twice with different types.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Particle contains non-deterministic wildcards.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base attribute %1 is required but derived attribute is not.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type of derived attribute %1 cannot be validly derived from type of base attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Value constraint of derived attribute %1 does not match value constraint of base attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived attribute %1 does not exist in the base definition.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived attribute %1 does not match the wildcard in the base definition.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base attribute %1 is required but missing in derived definition.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived definition contains an %1 element that does not exists in the base definition</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived wildcard is not a subset of the base wildcard.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 of derived wildcard is not a valid restriction of %2 of base wildcard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 from base type is missing in derived type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type of derived attribute %1 differs from type of base attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base definition contains an %1 element that is missing in the derived definition</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 references unknown %2 or %3 element %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 references identity constraint %2 that is no %3 or %4 element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 has a different number of fields from the identity constraint %2 that it references.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base type %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Item type %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Member type %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base type %1 of complex type cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 cannot have complex base type that has a %2.</source>
+ <translation type="unfinished"></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>
+ </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>
+ </message>
+ <message>
+ <source>Type of %1 element must be a simple type, %2 is not.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Substitution group %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Substitution group %1 has circular definition.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duplicated element names %1 in %2 element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reference %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Circular group reference for %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element is not allowed in this scope</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element cannot have %2 attribute with value other than %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element cannot have %2 attribute with value other than %3 or %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 or %2 attribute of reference %3 does not match with the attribute declaration %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute group %1 has circular reference.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute in %2 must have %3 use like in base type %4.</source>
+ <translation type="unfinished"></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>
+ </message>
+ <message>
+ <source>%1 has attribute wildcard but its base type %2 has not.</source>
+ <translation type="unfinished"></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>
+ </message>
+ <message>
+ <source>Enumeration facet contains invalid content: {%1} is not a value of type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Namespace prefix of qualified name %1 is not defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element %2 is not a valid restriction of the %3 element it redefines: %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Empty particle cannot be derived from non-empty particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived particle is missing element %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived element %1 is missing value constraint as defined in base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived element %1 has weaker value constraint than base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fixed value constraint of element %1 differs from value constraint in base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived element %1 cannot be nillable as base element is not nillable.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Block constraints of derived element %1 must not be more weaker than in the base element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type of derived element %1 cannot be validly derived from base element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type of derived element %1 cannot be validly derived from base element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is missing in derived particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 does not match namespace constraint of wildcard in base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wildcard in derived particle is not a valid subset of wildcard in base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>processContent of wildcard in derived particle is weaker than wildcard in base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived particle allows content that is not allowed in the base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Can not process unknown element %1, expected elements are: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is not allowed in this scope, possible elements are: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Child element is missing in that scope, possible child elements are: %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Document is not a XML schema.</source>
+ <translation type="unfinished"></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>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element contains invalid content: {%3}.</source>
+ <translation type="unfinished"></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>
+ </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>
+ </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>
+ </message>
+ <message>
+ <source>%1 element without %2 attribute is not allowed inside schema without target namespace.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element is not allowed inside %2 element if %3 attribute is present.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element has neither %2 attribute nor %3 child element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element with %2 child element must not have a %3 attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must be %3 or %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must have a value of %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must have a value of %3 or %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element must not have %2 and %3 attribute together.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Content of %1 attribute of %2 element must not be from namespace %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must not be %3.</source>
+ <translation type="unfinished"></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>
+ </message>
+ <message>
+ <source>Specifying use=&apos;prohibited&apos; inside an attribute group has no effect.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element must have either %2 or %3 attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element must have either %2 attribute or %3 or %4 as child element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element requires either %2 or %3 attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Text or entity references not allowed inside %1 element</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must contain %3, %4 or a list of URIs.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element is not allowed in this context.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element has larger value than %3 attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Prefix of qualified name %1 is not defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must either contain %3 or the other values.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Component with ID %1 has been defined previously.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute group %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element group %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Notation %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Identity constraint %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duplicated facets in simple type %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 is not valid according to %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>String content does not match the length facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>String content does not match the minLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>String content does not match the maxLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>String content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>String content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match the maxInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match the maxExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match the minInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match the minExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match in the totalDigits facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match the maxInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match the maxExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match the minInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match the minExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match in the totalDigits facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Double content does not match the maxInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Double content does not match the maxExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Double content does not match the minInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Double content does not match the minExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Double content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Double content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Decimal content does not match in the fractionDigits facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Decimal content does not match in the totalDigits facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Date time content does not match the maxInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Date time content does not match the maxExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Date time content does not match the minInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Date time content does not match the minExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Date time content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Date time content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duration content does not match the maxInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duration content does not match the maxExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duration content does not match the minInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duration content does not match the minExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duration content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duration content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Boolean content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Binary content does not match the length facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Binary content does not match the minLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Binary content does not match the maxLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Binary content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid QName content: %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>QName content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>QName content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Notation content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List content does not match length facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List content does not match minLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List content does not match maxLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Union content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Union content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Data of type %1 are not allowed to be empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is missing child element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>There is one IDREF value with no corresponding ID: %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Loaded schema file is invalid.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 contains invalid data.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xsi:schemaLocation namespace %1 has already appeared earlier in the instance document.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xsi:noNamespaceSchemaLocation cannot appear after the first no-namespace element or attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No schema defined for validation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No definition for element %1 available.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Specified type %1 is not known to the schema.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is not defined in this scope.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Declaration for element %1 does not exist.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains invalid content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is declared as abstract.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is not nillable.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 contains invalid data: %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element contains content although it is nillable.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fixed value constraint not allowed if element is nillable.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 cannot contain other elements, as it has a fixed content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Specified type %1 is not validly substitutable with element type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 is not allowed to be abstract.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains not allowed attributes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains not allowed child element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Content of element %1 does not match its type definition: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Content of element %1 does not match defined value constraint.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains not allowed child content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains not allowed text content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is missing required attribute %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 does not match the attribute wildcard.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Declaration for attribute %1 does not exist.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains two attributes of type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 contains invalid content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains unknown attribute %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Content of attribute %1 does not match its type definition: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Content of attribute %1 does not match defined value constraint.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Non-unique value found for constraint %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Key constraint %1 contains absent fields.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Key constraint %1 contains references nillable element %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No referenced value found for key reference %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>More than one value found for field %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Field %1 has no simple type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID value &apos;%1&apos; is not unique.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&apos;%1&apos; attribute contains invalid QName content: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+</TS>
diff --git a/config.profiles/symbian/translations/qt_he.ts b/config.profiles/symbian/translations/qt_he.ts
new file mode 100644
index 0000000..72a6df9
--- /dev/null
+++ b/config.profiles/symbian/translations/qt_he.ts
@@ -0,0 +1,7781 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!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_pl_symbian.ts b/config.profiles/symbian/translations/qt_pl_symbian.ts
new file mode 100644
index 0000000..4208c55
--- /dev/null
+++ b/config.profiles/symbian/translations/qt_pl_symbian.ts
@@ -0,0 +1,8525 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE TS>
+
+<TS version="2.0" language="pl">
+ <context>
+ <name>CloseButton</name>
+ <message>
+ <source>Close Tab</source>
+ <translation>Zamknij kartę</translation>
+ </message>
+ </context>
+ <context>
+ <name>FakeReply</name>
+ <message>
+ <source>Fake error !</source>
+ <translation>Fałszywy błąd!</translation>
+ </message>
+ <message>
+ <source>Invalid URL</source>
+ <translation>Niepoprawny URL</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::</name>
+ <message>
+ <source>Notifications</source>
+ <translation>Powiadomienia</translation>
+ </message>
+ <message>
+ <source>Music</source>
+ <translation>Muzyka</translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation>Wideo</translation>
+ </message>
+ <message>
+ <source>Communication</source>
+ <translation>Komunikacja</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation>Gry</translation>
+ </message>
+ <message>
+ <source>Accessibility</source>
+ <translation>Dostępność</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>&lt;html&gt;Urządzenie dźwiękowe &lt;b&gt;%1&lt;/b&gt; nie działa.&lt;br/&gt;Przywracanie do &lt;b&gt;%2&lt;/b&gt;.&lt;/html&gt;</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>&lt;html&gt;Przełączanie na urządzenie dźwiękowe &lt;b&gt;%1&lt;/b&gt;&lt;br/&gt;które właśnie stało się dostępne i ma wyższy priorytet.&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>Revert back to device &apos;%1&apos;</source>
+ <translation>Przywróć do urządzenia &apos;%1&apos;</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>Ostrzeżenie: Wygląda na to, że pakiet gstreamer0.10-plugins-good nie jest zainstalowany w tym systemie.
+Niektóre możliwości wideo zostały wyłączone.</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>Ostrzeżenie: Wygląda na to, że podstawowe wtyczki GStreamer nie są zainstalowane w tym systemie.
+Obsługa dźwięku i wideo została wyłączona</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>Nie można rozpocząć odtwarzania.
+
+Sprawdź instalację Gstreamer i upewnij się że
+zainstalowałeś libgstreamer-plugins-base.</translation>
+ </message>
+ <message>
+ <source>A required codec is missing. You need to install the following codec(s) to play this content: %0</source>
+ <translation>Brak wymaganego kodeka. Aby odtworzyć zawartość musisz zainstalować poniższy kodek: %0</translation>
+ </message>
+ <message>
+ <source>Could not open media source.</source>
+ <translation>Nie można otworzyć źródła mediów.</translation>
+ </message>
+ <message>
+ <source>Invalid source type.</source>
+ <translation>Niepoprawny typ źródła.</translation>
+ </message>
+ <message>
+ <source>Could not locate media source.</source>
+ <translation>Nie można znaleźć źródła mediów.</translation>
+ </message>
+ <message>
+ <source>Could not open audio device. The device is already in use.</source>
+ <translation>Nie można otworzyć urządzenia dźwiękowego. Urządzenie jest już używane.</translation>
+ </message>
+ <message>
+ <source>Could not decode media source.</source>
+ <translation>Nie można zdekodować źródła mediów.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF</name>
+ <message>
+ <source>Audio Output</source>
+ <translation>Wyjście dźwięku</translation>
+ </message>
+ <message>
+ <source>The audio output device</source>
+ <translation>Wyjściowe urządzenie dźwiękowe</translation>
+ </message>
+ <message>
+ <source>No error</source>
+ <translation>Brak błędu</translation>
+ </message>
+ <message>
+ <source>Not found</source>
+ <translation>Nie znaleziono</translation>
+ </message>
+ <message>
+ <source>Out of memory</source>
+ <translation>Brak pamięci</translation>
+ </message>
+ <message>
+ <source>Not supported</source>
+ <translation>Nieobsługiwane</translation>
+ </message>
+ <message>
+ <source>Overflow</source>
+ <translation>Przepełnienie</translation>
+ </message>
+ <message>
+ <source>Underflow</source>
+ <translation>Niedopełnienie</translation>
+ </message>
+ <message>
+ <source>Already exists</source>
+ <translation>Już istnieje</translation>
+ </message>
+ <message>
+ <source>Path not found</source>
+ <translation>Nie znaleziono ścieżki</translation>
+ </message>
+ <message>
+ <source>In use</source>
+ <translation>W użyciu</translation>
+ </message>
+ <message>
+ <source>Not ready</source>
+ <translation>Brak gotowości</translation>
+ </message>
+ <message>
+ <source>Access denied</source>
+ <translation>Odmowa dostępu</translation>
+ </message>
+ <message>
+ <source>Could not connect</source>
+ <translation>Nie można połączyć</translation>
+ </message>
+ <message>
+ <source>Disconnected</source>
+ <translation>Rozłączono</translation>
+ </message>
+ <message>
+ <source>Permission denied</source>
+ <translation>Odmowa uprawnień</translation>
+ </message>
+ <message>
+ <source>Insufficient bandwidth</source>
+ <translation>Niewystarczająca szerokość pasma</translation>
+ </message>
+ <message>
+ <source>Network unavailable</source>
+ <translation>Sieć niedostępna</translation>
+ </message>
+ <message>
+ <source>Network communication error</source>
+ <translation>Błąd komunikacji sieciowej</translation>
+ </message>
+ <message>
+ <source>Streaming not supported</source>
+ <translation>Transmisje strumieniowe nieobsługiwane</translation>
+ </message>
+ <message>
+ <source>Server alert</source>
+ <translation>Sygnał serwera</translation>
+ </message>
+ <message>
+ <source>Invalid protocol</source>
+ <translation>Nieprawidłowy protokół</translation>
+ </message>
+ <message>
+ <source>Invalid URL</source>
+ <translation>Nieprawidłowy adres URL</translation>
+ </message>
+ <message>
+ <source>Multicast error</source>
+ <translation>Błąd multiemisji</translation>
+ </message>
+ <message>
+ <source>Proxy server error</source>
+ <translation>Błąd serwera proxy</translation>
+ </message>
+ <message>
+ <source>Proxy server not supported</source>
+ <translation>Serwer proxy nieobsługiwany</translation>
+ </message>
+ <message>
+ <source>Audio output error</source>
+ <translation>Błąd sygnału audio</translation>
+ </message>
+ <message>
+ <source>Video output error</source>
+ <translation>Błąd wyjścia wideo</translation>
+ </message>
+ <message>
+ <source>Decoder error</source>
+ <translation>Błąd dekodera</translation>
+ </message>
+ <message>
+ <source>Audio or video components could not be played</source>
+ <translation>Nie można odtworzyć składników dźwiękowych lub wideo</translation>
+ </message>
+ <message>
+ <source>DRM error</source>
+ <translation>Błąd DRM</translation>
+ </message>
+ <message>
+ <source>Unknown error (%1)</source>
+ <translation>Nieznany błąd (%1)</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::AbstractMediaPlayer</name>
+ <message>
+ <source>Not ready to play</source>
+ <translation>Brak gotowości do odtworzenia</translation>
+ </message>
+ <message>
+ <source>Error opening file</source>
+ <translation>Błąd podczas otwierania pliku</translation>
+ </message>
+ <message>
+ <source>Error opening URL</source>
+ <translation>Błąd podczas otwierania adresu URL</translation>
+ </message>
+ <message>
+ <source>Setting volume failed</source>
+ <translation>Ustawienie głośności nie powiodło się</translation>
+ </message>
+ <message>
+ <source>Playback complete</source>
+ <translation>Zakończono odtwarzanie</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::AudioEqualizer</name>
+ <message>
+ <source>%1 Hz</source>
+ <translation>%1 Hz</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::AudioPlayer</name>
+ <message>
+ <source>Getting position failed</source>
+ <translation>Ustalenie pozycji nie powiodło się</translation>
+ </message>
+ <message>
+ <source>Opening clip failed</source>
+ <translation>Otwieranie pliku nie powiodło się</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::EffectFactory</name>
+ <message>
+ <source>Enabled</source>
+ <translation>Włączono</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::EnvironmentalReverb</name>
+ <message>
+ <source>Decay HF ratio (%)</source>
+ <translation>Współczynnik HF zanikania (%)</translation>
+ </message>
+ <message>
+ <source>Decay time (ms)</source>
+ <translation>Czas zanikania (ms)</translation>
+ </message>
+ <message>
+ <source>Density (%)</source>
+ <translation>Gęstość (%)</translation>
+ </message>
+ <message>
+ <source>Diffusion (%)</source>
+ <translation>Rozpraszanie (%)</translation>
+ </message>
+ <message>
+ <source>Reflections delay (ms)</source>
+ <translation>Opóźnienie odbić (ms)</translation>
+ </message>
+ <message>
+ <source>Reflections level (mB)</source>
+ <translation>Poziom odbić (MB)</translation>
+ </message>
+ <message>
+ <source>Reverb delay (ms)</source>
+ <translation>Opóźnienie pogłosu (ms)</translation>
+ </message>
+ <message>
+ <source>Reverb level (mB)</source>
+ <translation>Poziom pogłosu (MB)</translation>
+ </message>
+ <message>
+ <source>Room HF level</source>
+ <translation>Poziom HF pomieszczenia</translation>
+ </message>
+ <message>
+ <source>Room level (mB)</source>
+ <translation>Poziom pomieszczenia (MB)</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::MediaObject</name>
+ <message>
+ <source>Error opening source: type not supported</source>
+ <translation>Błąd podczas otwierania źródła: nieobsługiwany typ</translation>
+ </message>
+ <message>
+ <source>Error opening source: media type could not be determined</source>
+ <translation>Błąd podczas otwierania źródła: nie można określić typu multimediów</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::StereoWidening</name>
+ <message>
+ <source>Level (%)</source>
+ <translation>Poziom (%)</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::VideoPlayer</name>
+ <message>
+ <source>Pause failed</source>
+ <translation>Wstrzymanie nie powiodło się</translation>
+ </message>
+ <message>
+ <source>Seek failed</source>
+ <translation>Wyszukiwanie nie powiodło się</translation>
+ </message>
+ <message>
+ <source>Getting position failed</source>
+ <translation>Ustalenie pozycji nie powiodło się</translation>
+ </message>
+ <message>
+ <source>Opening clip failed</source>
+ <translation>Otwieranie pliku nie powiodło się</translation>
+ </message>
+ <message>
+ <source>Buffering clip failed</source>
+ <translation>Buforowanie pliku nie powiodło się</translation>
+ </message>
+ <message>
+ <source>Video display error</source>
+ <translation>Błąd wyświetlacza wideo</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::VolumeSlider</name>
+ <message>
+ <source>Volume: %1%</source>
+ <translation>Głośność: %1%</translation>
+ </message>
+ <message>
+ <source>Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%</source>
+ <translation>Użyj tego suwaka aby zmienić głośność. Skrajnie lewa pozycja to 0%, skrajnie prawa to %1%</translation>
+ </message>
+ <message>
+ <source>Muted</source>
+ <translation>Wyciszony</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3Accel</name>
+ <message>
+ <source>%1, %2 not defined</source>
+ <translation>%1, %2 nie określone</translation>
+ </message>
+ <message>
+ <source>Ambiguous %1 not handled</source>
+ <translation>Niejednoznaczne %1, nie obsłużone</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3DataTable</name>
+ <message>
+ <source>True</source>
+ <translation>Prawda</translation>
+ </message>
+ <message>
+ <source>False</source>
+ <translation>Fałsz</translation>
+ </message>
+ <message>
+ <source>Insert</source>
+ <translation>Wstaw</translation>
+ </message>
+ <message>
+ <source>Update</source>
+ <translation>Uaktualnij</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>Skasuj</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3FileDialog</name>
+ <message>
+ <source>Copy or Move a File</source>
+ <translation>Skopiuj lub przenieś plik</translation>
+ </message>
+ <message>
+ <source>Read: %1</source>
+ <translation>Czytaj: %1</translation>
+ </message>
+ <message>
+ <source>Write: %1</source>
+ <translation>Pisz: %1</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Anuluj</translation>
+ </message>
+ <message>
+ <source>All Files (*)</source>
+ <translation>Wszystkie pliki (*)</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Nazwa</translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation>Rozmiar</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>Rodzaj</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation>Data</translation>
+ </message>
+ <message>
+ <source>Attributes</source>
+ <translation>Atrybuty</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Look &amp;in:</source>
+ <translation>Sprawdź &amp;w:</translation>
+ </message>
+ <message>
+ <source>File &amp;name:</source>
+ <translation>Nazwa &amp;pliku:</translation>
+ </message>
+ <message>
+ <source>File &amp;type:</source>
+ <translation>&amp;Rodzaj pliku:</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation>Powrót</translation>
+ </message>
+ <message>
+ <source>One directory up</source>
+ <translation>Katalog wyżej</translation>
+ </message>
+ <message>
+ <source>Create New Folder</source>
+ <translation>Utwórz nowy katalog</translation>
+ </message>
+ <message>
+ <source>List View</source>
+ <translation>Lista</translation>
+ </message>
+ <message>
+ <source>Detail View</source>
+ <translation>Szczegóły</translation>
+ </message>
+ <message>
+ <source>Preview File Info</source>
+ <translation>Podgląd informacji o pliku</translation>
+ </message>
+ <message>
+ <source>Preview File Contents</source>
+ <translation>Podgląd zawartości pliku</translation>
+ </message>
+ <message>
+ <source>Read-write</source>
+ <translation>Do zapisu i odczytu</translation>
+ </message>
+ <message>
+ <source>Read-only</source>
+ <translation>Tylko do odczytu</translation>
+ </message>
+ <message>
+ <source>Write-only</source>
+ <translation>Tylko do zapisu</translation>
+ </message>
+ <message>
+ <source>Inaccessible</source>
+ <translation>Niedostępny</translation>
+ </message>
+ <message>
+ <source>Symlink to File</source>
+ <translation>Dowiązanie symboliczne do pliku</translation>
+ </message>
+ <message>
+ <source>Symlink to Directory</source>
+ <translation>Dowiązanie symboliczne do katalogu</translation>
+ </message>
+ <message>
+ <source>Symlink to Special</source>
+ <translation>Specjalny dowiązanie symboliczne</translation>
+ </message>
+ <message>
+ <source>File</source>
+ <translation>Plik</translation>
+ </message>
+ <message>
+ <source>Dir</source>
+ <translation>Katalog</translation>
+ </message>
+ <message>
+ <source>Special</source>
+ <translation>Specjalny </translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>Otwórz</translation>
+ </message>
+ <message>
+ <source>Save As</source>
+ <translation>Zachowaj jako</translation>
+ </message>
+ <message>
+ <source>&amp;Open</source>
+ <translation>&amp;Otwórz</translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation>&amp;Zachowaj</translation>
+ </message>
+ <message>
+ <source>&amp;Rename</source>
+ <translation>&amp;Zmień nazwę</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Skasuj</translation>
+ </message>
+ <message>
+ <source>R&amp;eload</source>
+ <translation>&amp;Odśwież</translation>
+ </message>
+ <message>
+ <source>Sort by &amp;Name</source>
+ <translation>Sortuj &amp;po nazwie</translation>
+ </message>
+ <message>
+ <source>Sort by &amp;Size</source>
+ <translation>Sortuj po &amp;rozmiarze</translation>
+ </message>
+ <message>
+ <source>Sort by &amp;Date</source>
+ <translation>Sortuj po &amp;dacie</translation>
+ </message>
+ <message>
+ <source>&amp;Unsorted</source>
+ <translation>&amp;Bez sortowania</translation>
+ </message>
+ <message>
+ <source>Sort</source>
+ <translation>Sortuj</translation>
+ </message>
+ <message>
+ <source>Show &amp;hidden files</source>
+ <translation>Pokaż &amp;ukryte pliki</translation>
+ </message>
+ <message>
+ <source>the file</source>
+ <translation>plik</translation>
+ </message>
+ <message>
+ <source>the directory</source>
+ <translation>katalog</translation>
+ </message>
+ <message>
+ <source>the symlink</source>
+ <translation>dowiązanie symboliczne</translation>
+ </message>
+ <message>
+ <source>Delete %1</source>
+ <translation>Skasuj %1</translation>
+ </message>
+ <message>
+ <source>&lt;qt&gt;Are you sure you wish to delete %1 &quot;%2&quot;?&lt;/qt&gt;</source>
+ <translation>&lt;qt&gt;Na pewno chcesz skasować %1 &quot;%2&quot;?&lt;/qt&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Yes</source>
+ <translation>&amp;Tak</translation>
+ </message>
+ <message>
+ <source>&amp;No</source>
+ <translation>&amp;Nie</translation>
+ </message>
+ <message>
+ <source>New Folder 1</source>
+ <translation>Nowy katalog 1</translation>
+ </message>
+ <message>
+ <source>New Folder</source>
+ <translation>Nowy katalog</translation>
+ </message>
+ <message>
+ <source>New Folder %1</source>
+ <translation>Nowy katalog %1</translation>
+ </message>
+ <message>
+ <source>Find Directory</source>
+ <translation>Znajdź katalog</translation>
+ </message>
+ <message>
+ <source>Directories</source>
+ <translation>Katalogi</translation>
+ </message>
+ <message>
+ <source>Directory:</source>
+ <translation>Katalog:</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Błąd</translation>
+ </message>
+ <message>
+ <source>%1
+File not found.
+Check path and filename.</source>
+ <translation>%1
+Plik nie znaleziony.
+Sprawdź ścieżkę i nazwę pliku.</translation>
+ </message>
+ <message>
+ <source>All Files (*.*)</source>
+ <translation>Wszystkie pliki (*.*)</translation>
+ </message>
+ <message>
+ <source>Open </source>
+ <translation>Otwórz </translation>
+ </message>
+ <message>
+ <source>Select a Directory</source>
+ <translation>Wybierz katalog</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3LocalFs</name>
+ <message>
+ <source>Could not read directory
+%1</source>
+ <translation>Nie można czytać katalogu
+%1</translation>
+ </message>
+ <message>
+ <source>Could not create directory
+%1</source>
+ <translation>Nie można utworzyć katalogu
+%1</translation>
+ </message>
+ <message>
+ <source>Could not remove file or directory
+%1</source>
+ <translation>Nie można usunąć pliku lub katalogu
+%1</translation>
+ </message>
+ <message>
+ <source>Could not rename
+%1
+to
+%2</source>
+ <translation>Nie można zmienić nazwy
+%1
+na
+%2</translation>
+ </message>
+ <message>
+ <source>Could not open
+%1</source>
+ <translation>Nie można otworzyć
+%1</translation>
+ </message>
+ <message>
+ <source>Could not write
+%1</source>
+ <translation>Nie można zapisać
+%1</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3MainWindow</name>
+ <message>
+ <source>Line up</source>
+ <translation>Wyrównaj położenie</translation>
+ </message>
+ <message>
+ <source>Customize...</source>
+ <translation>Ustawienia użytkownika...</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3NetworkProtocol</name>
+ <message>
+ <source>Operation stopped by the user</source>
+ <translation>Operacja zatrzymana przez użytkownika</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3ProgressDialog</name>
+ <message>
+ <source>Cancel</source>
+ <translation>Anuluj</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3TabDialog</name>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Apply</source>
+ <translation>Zatwierdź</translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation>Pomoc</translation>
+ </message>
+ <message>
+ <source>Defaults</source>
+ <translation>Domyślne</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Anuluj</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3TextEdit</name>
+ <message>
+ <source>&amp;Undo</source>
+ <translation>&amp;Cofnij</translation>
+ </message>
+ <message>
+ <source>&amp;Redo</source>
+ <translation>&amp;Przywróć</translation>
+ </message>
+ <message>
+ <source>Cu&amp;t</source>
+ <translation>W&amp;ytnij</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>S&amp;kopiuj</translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation>&amp;Wklej</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Wyczyść</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation>Zaznacz wszystko</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3TitleBar</name>
+ <message>
+ <source>System</source>
+ <translation>System</translation>
+ </message>
+ <message>
+ <source>Restore up</source>
+ <translation>Przywróć na wierzch</translation>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation>Zminimalizuj</translation>
+ </message>
+ <message>
+ <source>Restore down</source>
+ <translation>Przywróć pod spód</translation>
+ </message>
+ <message>
+ <source>Maximize</source>
+ <translation>Zmaksymalizuj</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Zamknij okno</translation>
+ </message>
+ <message>
+ <source>Contains commands to manipulate the window</source>
+ <translation>Zawiera polecenia zarządzające oknem</translation>
+ </message>
+ <message>
+ <source>Puts a minimized window back to normal</source>
+ <translation>Przywraca normalny rozmiar uprzednio zminimalizowanego okna</translation>
+ </message>
+ <message>
+ <source>Moves the window out of the way</source>
+ <translation>Przenosi okno w inne położenie</translation>
+ </message>
+ <message>
+ <source>Puts a maximized window back to normal</source>
+ <translation>Przywraca normalny rozmiar uprzednio zmaksymalizowanego okna</translation>
+ </message>
+ <message>
+ <source>Makes the window full screen</source>
+ <translation>Powiększa maksymalnie okno</translation>
+ </message>
+ <message>
+ <source>Closes the window</source>
+ <translation>Zamyka okno</translation>
+ </message>
+ <message>
+ <source>Displays the name of the window and contains controls to manipulate it</source>
+ <translation>Wyświetla nazwę okna i zawiera elementy do zarządzania nim</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3ToolBar</name>
+ <message>
+ <source>More...</source>
+ <translation>Więcej...</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3UrlOperator</name>
+ <message>
+ <source>The protocol `%1&apos; is not supported</source>
+ <translation>Protokół &apos;%1&apos; nie jest obsługiwany</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support listing directories</source>
+ <translation>Protokół &apos;%1&apos; nie obsługuje pokazywania katalogów</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support creating new directories</source>
+ <translation>Protokół &apos;%1&apos; nie obsługuje tworzenia nowych katalogów</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support removing files or directories</source>
+ <translation>Protokół &apos;%1&apos; nie obsługuje usuwania plików lub katalogów</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support renaming files or directories</source>
+ <translation>Protokół &apos;%1&apos; nie obsługuje zmiany nazwy plików lub katalogów</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support getting files</source>
+ <translation>Protokół &apos;%1&apos; nie obsługuje pobierania plików</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support putting files</source>
+ <translation>Protokół &apos;%1&apos; nie obsługuje wysyłania plików</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support copying or moving files or directories</source>
+ <translation>Protokół &apos;%1&apos; nie obsługuje kopiowania lub przenoszenia plików lub katalogów</translation>
+ </message>
+ <message>
+ <source>(unknown)</source>
+ <translation>(nieznany)</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3Wizard</name>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Anuluj</translation>
+ </message>
+ <message>
+ <source>&lt; &amp;Back</source>
+ <translation>&lt; &amp;Wstecz</translation>
+ </message>
+ <message>
+ <source>&amp;Next &gt;</source>
+ <translation>&amp;Dalej &gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Finish</source>
+ <translation>&amp;Zakończ</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>&amp;Pomoc</translation>
+ </message>
+ </context>
+ <context>
+ <name>QAbstractSocket</name>
+ <message>
+ <source>Host not found</source>
+ <translation>Host nie znaleziony</translation>
+ </message>
+ <message>
+ <source>Connection refused</source>
+ <translation>Połączenie odrzucone</translation>
+ </message>
+ <message>
+ <source>Connection timed out</source>
+ <translation>Przekroczony czas połączenia</translation>
+ </message>
+ <message>
+ <source>Operation on socket is not supported</source>
+ <translation>Operacja na gnieździe nieobsługiwana</translation>
+ </message>
+ <message>
+ <source>Socket operation timed out</source>
+ <translation>Przekroczony czas operacji gniazda</translation>
+ </message>
+ <message>
+ <source>Socket is not connected</source>
+ <translation>Gniazdo nie jest podłączone</translation>
+ </message>
+ <message>
+ <source>Network unreachable</source>
+ <translation>Sieć niedostępna</translation>
+ </message>
+ </context>
+ <context>
+ <name>QAbstractSpinBox</name>
+ <message>
+ <source>&amp;Step up</source>
+ <translation>Krok do &amp;góry</translation>
+ </message>
+ <message>
+ <source>Step &amp;down</source>
+ <translation>Krok w &amp;dół</translation>
+ </message>
+ <message>
+ <source>&amp;Select All</source>
+ <translation>&amp;Zaznacz wszystko</translation>
+ </message>
+ </context>
+ <context>
+ <name>QAccessibleButton</name>
+ <message>
+ <source>Press</source>
+ <translation>Wciśnij</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>LTR</translation>
+ </message>
+ <message>
+ <source>Executable &apos;%1&apos; requires Qt %2, found Qt %3.</source>
+ <translation>Program &apos;%1&apos; wymaga do uruchomienia Qt %2, znaleziono Qt %3.</translation>
+ </message>
+ <message>
+ <source>Incompatible Qt Library Error</source>
+ <translation>Niekompatybilność biblioteki Qt</translation>
+ </message>
+ <message>
+ <source>Activate</source>
+ <translation>Uaktywnij</translation>
+ </message>
+ <message>
+ <source>Activates the program&apos;s main window</source>
+ <translation>Uaktywnia główne okno programu</translation>
+ </message>
+ </context>
+ <context>
+ <name>QAxSelect</name>
+ <message>
+ <source>Select ActiveX Control</source>
+ <translation>Wybierz kontrolkę ActiveX</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Anuluj</translation>
+ </message>
+ <message>
+ <source>COM &amp;Object:</source>
+ <translation>&amp;Obiekt COM:</translation>
+ </message>
+ </context>
+ <context>
+ <name>QCheckBox</name>
+ <message>
+ <source>Uncheck</source>
+ <translation>Odznacz</translation>
+ </message>
+ <message>
+ <source>Check</source>
+ <translation>Zaznacz</translation>
+ </message>
+ <message>
+ <source>Toggle</source>
+ <translation>Przełącz</translation>
+ </message>
+ </context>
+ <context>
+ <name>QColorDialog</name>
+ <message>
+ <source>Hu&amp;e:</source>
+ <translation>&amp;Barwa:</translation>
+ </message>
+ <message>
+ <source>&amp;Sat:</source>
+ <translation>&amp;Nasycenie:</translation>
+ </message>
+ <message>
+ <source>&amp;Val:</source>
+ <translation>&amp;Wartość:</translation>
+ </message>
+ <message>
+ <source>&amp;Red:</source>
+ <translation>&amp;Czerwień:</translation>
+ </message>
+ <message>
+ <source>&amp;Green:</source>
+ <translation>&amp;Zieleń:</translation>
+ </message>
+ <message>
+ <source>Bl&amp;ue:</source>
+ <translation>Błęki&amp;t:</translation>
+ </message>
+ <message>
+ <source>A&amp;lpha channel:</source>
+ <translation>Kanał &amp;alfa:</translation>
+ </message>
+ <message>
+ <source>Select Color</source>
+ <translation>Wybierz kolor</translation>
+ </message>
+ <message>
+ <source>&amp;Basic colors</source>
+ <translation>&amp;Kolory podstawowe</translation>
+ </message>
+ <message>
+ <source>&amp;Custom colors</source>
+ <translation>Wła&amp;sne kolory</translation>
+ </message>
+ <message>
+ <source>&amp;Add to Custom Colors</source>
+ <translation>&amp;Dodaj do własnych kolorów</translation>
+ </message>
+ </context>
+ <context>
+ <name>QComboBox</name>
+ <message>
+ <source>Open</source>
+ <translation>Otwórz</translation>
+ </message>
+ <message>
+ <source>False</source>
+ <translation>Fałsz</translation>
+ </message>
+ <message>
+ <source>True</source>
+ <translation>Prawda</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Zamknij</translation>
+ </message>
+ </context>
+ <context>
+ <name>QCoreApplication</name>
+ <message>
+ <source>%1: key is empty</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1: klucz jest pusty</translation>
+ </message>
+ <message>
+ <source>%1: unable to make key</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1: nie można utworzyć klucza</translation>
+ </message>
+ <message>
+ <source>%1: ftok failed</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1: wystąpił błąd w funkcji ftok()</translation>
+ </message>
+ <message>
+ <source>%1: already exists</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1: już istnieje</translation>
+ </message>
+ <message>
+ <source>%1: does not exist</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1: nie istnieje</translation>
+ </message>
+ <message>
+ <source>%1: out of resources</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1: zasoby wyczerpane</translation>
+ </message>
+ <message>
+ <source>%1: unknown error %2</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1: nieznany błąd %2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QDB2Driver</name>
+ <message>
+ <source>Unable to connect</source>
+ <translation>Nie można nawiązać połączenia</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>Nie można dokonać transakcji</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>Nie można wycofać transakcji</translation>
+ </message>
+ <message>
+ <source>Unable to set autocommit</source>
+ <translation>Nie można ustawić trybu automatycznego dokonywania transakcji</translation>
+ </message>
+ </context>
+ <context>
+ <name>QDB2Result</name>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>Nie można wykonać polecenia</translation>
+ </message>
+ <message>
+ <source>Unable to prepare statement</source>
+ <translation>Nie można przygotować polecenia</translation>
+ </message>
+ <message>
+ <source>Unable to bind variable</source>
+ <translation>Nie można powiązać zmiennej</translation>
+ </message>
+ <message>
+ <source>Unable to fetch record %1</source>
+ <translation>Nie można pobrać rekordu %1</translation>
+ </message>
+ <message>
+ <source>Unable to fetch next</source>
+ <translation>Nie można pobrać kolejnego wiersza danych</translation>
+ </message>
+ <message>
+ <source>Unable to fetch first</source>
+ <translation>Nie można pobrać pierwszego wiersza danych</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>Miernik prędkości</translation>
+ </message>
+ <message>
+ <source>SliderHandle</source>
+ <translation>Uchwyt suwaka</translation>
+ </message>
+ </context>
+ <context>
+ <name>QDialog</name>
+ <message>
+ <source>What&apos;s This?</source>
+ <translation>Co to jest?</translation>
+ </message>
+ <message>
+ <source>Done</source>
+ <translation>Wykonano</translation>
+ </message>
+ </context>
+ <context>
+ <name>QDialogButtonBox</name>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation>Zachowaj</translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation>&amp;Zachowaj</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>Otwórz</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Anuluj</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Anuluj</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Zamknij</translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation>&amp;Zamknij</translation>
+ </message>
+ <message>
+ <source>Apply</source>
+ <translation>Zastosuj</translation>
+ </message>
+ <message>
+ <source>Reset</source>
+ <translation>Resetuj</translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation>Pomoc</translation>
+ </message>
+ <message>
+ <source>Don&apos;t Save</source>
+ <translation>Nie zachowuj</translation>
+ </message>
+ <message>
+ <source>Discard</source>
+ <translation>Odrzuć</translation>
+ </message>
+ <message>
+ <source>&amp;Yes</source>
+ <translation>&amp;Tak</translation>
+ </message>
+ <message>
+ <source>Yes to &amp;All</source>
+ <translation>Ta&amp;k dla wszystkich</translation>
+ </message>
+ <message>
+ <source>&amp;No</source>
+ <translation>&amp;Nie</translation>
+ </message>
+ <message>
+ <source>N&amp;o to All</source>
+ <translation>Ni&amp;e dla wszystkich</translation>
+ </message>
+ <message>
+ <source>Save All</source>
+ <translation>Zachowaj wszystko</translation>
+ </message>
+ <message>
+ <source>Abort</source>
+ <translation>Przerwij</translation>
+ </message>
+ <message>
+ <source>Retry</source>
+ <translation>Ponów</translation>
+ </message>
+ <message>
+ <source>Ignore</source>
+ <translation>Zignoruj</translation>
+ </message>
+ <message>
+ <source>Restore Defaults</source>
+ <translation>Przywróć ustawienia</translation>
+ </message>
+ <message>
+ <source>Close without Saving</source>
+ <translation>Zamknij bez zapisywania</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ </context>
+ <context>
+ <name>QDirModel</name>
+ <message>
+ <source>Name</source>
+ <translation>Nazwa</translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation>Rozmiar</translation>
+ </message>
+ <message>
+ <source>Kind</source>
+ <comment>Match OS X Finder</comment>
+ <translation>Typ</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <comment>All other platforms</comment>
+ <translation>Rodzaj</translation>
+ </message>
+ <message>
+ <source>Date Modified</source>
+ <translation>Data modyfikacji</translation>
+ </message>
+ </context>
+ <context>
+ <name>QDockWidget</name>
+ <message>
+ <source>Close</source>
+ <translation>Zamknij</translation>
+ </message>
+ <message>
+ <source>Dock</source>
+ <translation>Zadokuj</translation>
+ </message>
+ <message>
+ <source>Float</source>
+ <translation>Uwolnij</translation>
+ </message>
+ </context>
+ <context>
+ <name>QDoubleSpinBox</name>
+ <message>
+ <source>More</source>
+ <translation>Więcej</translation>
+ </message>
+ <message>
+ <source>Less</source>
+ <translation>Mniej</translation>
+ </message>
+ </context>
+ <context>
+ <name>QErrorMessage</name>
+ <message>
+ <source>&amp;Show this message again</source>
+ <translation>&amp;Pokaż ten komunikat ponownie</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Debug Message:</source>
+ <translation>Komunikat dla programisty:</translation>
+ </message>
+ <message>
+ <source>Warning:</source>
+ <translation>Ostrzeżenie:</translation>
+ </message>
+ <message>
+ <source>Fatal Error:</source>
+ <translation>Błąd krytyczny:</translation>
+ </message>
+ </context>
+ <context>
+ <name>QFile</name>
+ <message>
+ <source>Destination file exists</source>
+ <translation>Plik wyjściowy już istnieje</translation>
+ </message>
+ <message>
+ <source>Will not rename sequential file using block copy</source>
+ <translation>Nie można zmienić nazwy pliku sekwencyjnego używając kopiowania blokowego</translation>
+ </message>
+ <message>
+ <source>Cannot remove source file</source>
+ <translation>Nie można usunąć oryginalnego pliku</translation>
+ </message>
+ <message>
+ <source>Cannot open %1 for input</source>
+ <translation>Nie można otworzyć pliku wejściowego %1</translation>
+ </message>
+ <message>
+ <source>Cannot open for output</source>
+ <translation>Nie można otworzyć pliku wyjściowego</translation>
+ </message>
+ <message>
+ <source>Failure to write block</source>
+ <translation>Nie można zapisać bloku</translation>
+ </message>
+ <message>
+ <source>Cannot create %1 for output</source>
+ <translation>Nie można utworzyć pliku wyjściowego %1</translation>
+ </message>
+ </context>
+ <context>
+ <name>QFileDialog</name>
+ <message>
+ <source>All Files (*)</source>
+ <translation>Wszystkie pliki (*)</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation>Powrót</translation>
+ </message>
+ <message>
+ <source>List View</source>
+ <translation>Lista</translation>
+ </message>
+ <message>
+ <source>Detail View</source>
+ <translation>Szczegóły</translation>
+ </message>
+ <message>
+ <source>File</source>
+ <translation>Plik</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>Otwórz</translation>
+ </message>
+ <message>
+ <source>Save As</source>
+ <translation>Zachowaj jako</translation>
+ </message>
+ <message>
+ <source>&amp;Open</source>
+ <translation>&amp;Otwórz</translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation>&amp;Zachowaj</translation>
+ </message>
+ <message>
+ <source>Recent Places</source>
+ <translation>Ostatnie miejsca</translation>
+ </message>
+ <message>
+ <source>&amp;Rename</source>
+ <translation>&amp;Zmień nazwę</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Skasuj</translation>
+ </message>
+ <message>
+ <source>Show &amp;hidden files</source>
+ <translation>Pokaż &amp;ukryte pliki</translation>
+ </message>
+ <message>
+ <source>New Folder</source>
+ <translation>Nowy katalog</translation>
+ </message>
+ <message>
+ <source>Find Directory</source>
+ <translation>Znajdź katalog</translation>
+ </message>
+ <message>
+ <source>Directories</source>
+ <translation>Katalogi</translation>
+ </message>
+ <message>
+ <source>All Files (*.*)</source>
+ <translation>Wszystkie pliki (*.*)</translation>
+ </message>
+ <message>
+ <source>Directory:</source>
+ <translation>Katalog:</translation>
+ </message>
+ <message>
+ <source>%1 already exists.
+Do you want to replace it?</source>
+ <translation>%1 już istnieje.
+Czy chcesz zamienić?</translation>
+ </message>
+ <message>
+ <source>%1
+File not found.
+Please verify the correct file name was given.</source>
+ <translation>%1
+Plik nie znaleziony.
+Proszę o sprawdzenie podanej nazwy pliku.</translation>
+ </message>
+ <message>
+ <source>My Computer</source>
+ <translation>Mój komputer</translation>
+ </message>
+ <message>
+ <source>Parent Directory</source>
+ <translation>Katalog wyżej</translation>
+ </message>
+ <message>
+ <source>Files of type:</source>
+ <translation>Pliki rodzaju:</translation>
+ </message>
+ <message>
+ <source>%1
+Directory not found.
+Please verify the correct directory name was given.</source>
+ <translation>%1
+Katalog nie znaleziony.
+Sprawdź podaną nazwę katalogu.</translation>
+ </message>
+ <message>
+ <source>&apos;%1&apos; is write protected.
+Do you want to delete it anyway?</source>
+ <translation>&apos;%1&apos; jest zabezpieczony przed zapisem.
+Czy na pewno chcesz go skasować?</translation>
+ </message>
+ <message>
+ <source>Are sure you want to delete &apos;%1&apos;?</source>
+ <translation>Czy na pewno chcesz skasować &apos;%1&apos;?</translation>
+ </message>
+ <message>
+ <source>Could not delete directory.</source>
+ <translation>Nie można skasować katalogu.</translation>
+ </message>
+ <message>
+ <source>Drive</source>
+ <translation>Urządzenie</translation>
+ </message>
+ <message>
+ <source>File Folder</source>
+ <comment>Match Windows Explorer</comment>
+ <translation>Katalog</translation>
+ </message>
+ <message>
+ <source>Folder</source>
+ <comment>All other platforms</comment>
+ <translation>Katalog</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>Skrót</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation>Nieznany</translation>
+ </message>
+ <message>
+ <source>Show </source>
+ <translation>Pokaż </translation>
+ </message>
+ <message>
+ <source>Forward</source>
+ <translation>Do przodu</translation>
+ </message>
+ <message>
+ <source>&amp;New Folder</source>
+ <translation>&amp;Nowy katalog</translation>
+ </message>
+ <message>
+ <source>&amp;Choose</source>
+ <translation>&amp;Wybierz</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Usuń</translation>
+ </message>
+ <message>
+ <source>File &amp;name:</source>
+ <translation>Nazwa &amp;pliku:</translation>
+ </message>
+ <message>
+ <source>Look in:</source>
+ <translation>Szukaj w:</translation>
+ </message>
+ <message>
+ <source>Create New Folder</source>
+ <translation>Utwórz nowy katalog</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 bajtów</translation>
+ </message>
+ <message>
+ <source>Invalid filename</source>
+ <translation>Niepoprawna nazwa pliku</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;Nazwa &quot;%1&quot; nie może zostać użyta.&lt;/b&gt;&lt;p&gt;Spróbuj użyć nowej nazwy z mniejszą liczbą znaków lub bez znaków przystankowych.</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Nazwa</translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation>Rozmiar</translation>
+ </message>
+ <message>
+ <source>Kind</source>
+ <comment>Match OS X Finder</comment>
+ <translation>Typ</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <comment>All other platforms</comment>
+ <translation>Rodzaj</translation>
+ </message>
+ <message>
+ <source>Date Modified</source>
+ <translation>Data modyfikacji</translation>
+ </message>
+ <message>
+ <source>My Computer</source>
+ <translation>Mój komputer</translation>
+ </message>
+ <message>
+ <source>Computer</source>
+ <translation>Komputer</translation>
+ </message>
+ <message>
+ <source>%1 byte(s)</source>
+ <translation>%1 bajt(ów)</translation>
+ </message>
+ </context>
+ <context>
+ <name>QFontDatabase</name>
+ <message>
+ <source>Normal</source>
+ <translation>Normalny</translation>
+ </message>
+ <message>
+ <source>Bold</source>
+ <translation>Pogrubiony</translation>
+ </message>
+ <message>
+ <source>Demi Bold</source>
+ <translation>Na wpół pogrubiony</translation>
+ </message>
+ <message>
+ <source>Black</source>
+ <translation>Bardzo gruby</translation>
+ </message>
+ <message>
+ <source>Demi</source>
+ <translation>Na wpół</translation>
+ </message>
+ <message>
+ <source>Light</source>
+ <translation>Cienki</translation>
+ </message>
+ <message>
+ <source>Italic</source>
+ <translation>Kursywa</translation>
+ </message>
+ <message>
+ <source>Oblique</source>
+ <translation>Pochyły</translation>
+ </message>
+ <message>
+ <source>Any</source>
+ <translation>Każdy</translation>
+ </message>
+ <message>
+ <source>Latin</source>
+ <translation>Łaciński</translation>
+ </message>
+ <message>
+ <source>Greek</source>
+ <translation>Grecki</translation>
+ </message>
+ <message>
+ <source>Cyrillic</source>
+ <translation>Cyrylica</translation>
+ </message>
+ <message>
+ <source>Armenian</source>
+ <translation>Ormiański</translation>
+ </message>
+ <message>
+ <source>Hebrew</source>
+ <translation>Hebrajski</translation>
+ </message>
+ <message>
+ <source>Arabic</source>
+ <translation>Arabski</translation>
+ </message>
+ <message>
+ <source>Syriac</source>
+ <translation>Syryjski</translation>
+ </message>
+ <message>
+ <source>Thaana</source>
+ <translation>Thaana</translation>
+ </message>
+ <message>
+ <source>Devanagari</source>
+ <translation>Devanagari</translation>
+ </message>
+ <message>
+ <source>Bengali</source>
+ <translation>Bengalski</translation>
+ </message>
+ <message>
+ <source>Gurmukhi</source>
+ <translation>Gurmukhi</translation>
+ </message>
+ <message>
+ <source>Gujarati</source>
+ <translation>Gudżaracki</translation>
+ </message>
+ <message>
+ <source>Oriya</source>
+ <translation>Orija</translation>
+ </message>
+ <message>
+ <source>Tamil</source>
+ <translation>Tamilski</translation>
+ </message>
+ <message>
+ <source>Telugu</source>
+ <translation>Telugu</translation>
+ </message>
+ <message>
+ <source>Kannada</source>
+ <translation>Kannada</translation>
+ </message>
+ <message>
+ <source>Malayalam</source>
+ <translation>Malajalam</translation>
+ </message>
+ <message>
+ <source>Sinhala</source>
+ <translation>Syngaleski</translation>
+ </message>
+ <message>
+ <source>Thai</source>
+ <translation>Tajski</translation>
+ </message>
+ <message>
+ <source>Lao</source>
+ <translation>Laotański</translation>
+ </message>
+ <message>
+ <source>Tibetan</source>
+ <translation>Tybetański</translation>
+ </message>
+ <message>
+ <source>Myanmar</source>
+ <translation>Birmański</translation>
+ </message>
+ <message>
+ <source>Georgian</source>
+ <translation>Gruziński</translation>
+ </message>
+ <message>
+ <source>Khmer</source>
+ <translation>Khmerski</translation>
+ </message>
+ <message>
+ <source>Simplified Chinese</source>
+ <translation>Uproszczony chiński</translation>
+ </message>
+ <message>
+ <source>Traditional Chinese</source>
+ <translation>Tradycyjny chiński</translation>
+ </message>
+ <message>
+ <source>Japanese</source>
+ <translation>Japoński</translation>
+ </message>
+ <message>
+ <source>Korean</source>
+ <translation>Koreański</translation>
+ </message>
+ <message>
+ <source>Vietnamese</source>
+ <translation>Wietnamski</translation>
+ </message>
+ <message>
+ <source>Symbol</source>
+ <translation>Symboliczny</translation>
+ </message>
+ <message>
+ <source>Ogham</source>
+ <translation>Ogamiczny</translation>
+ </message>
+ <message>
+ <source>Runic</source>
+ <translation>Runiczny</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;Czcionka</translation>
+ </message>
+ <message>
+ <source>Font st&amp;yle</source>
+ <translation>St&amp;yl czcionki</translation>
+ </message>
+ <message>
+ <source>&amp;Size</source>
+ <translation>&amp;Rozmiar</translation>
+ </message>
+ <message>
+ <source>Effects</source>
+ <translation>Efekty</translation>
+ </message>
+ <message>
+ <source>Stri&amp;keout</source>
+ <translation>Pr&amp;zekreślenie</translation>
+ </message>
+ <message>
+ <source>&amp;Underline</source>
+ <translation>&amp;Podkreślenie</translation>
+ </message>
+ <message>
+ <source>Sample</source>
+ <translation>Przykład</translation>
+ </message>
+ <message>
+ <source>Select Font</source>
+ <translation>Wybierz czcionkę</translation>
+ </message>
+ <message>
+ <source>Wr&amp;iting System</source>
+ <translation>Sys&amp;tem pisania</translation>
+ </message>
+ </context>
+ <context>
+ <name>QFtp</name>
+ <message>
+ <source>Host %1 found</source>
+ <translation>Host %1 znaleziony</translation>
+ </message>
+ <message>
+ <source>Host found</source>
+ <translation>Host znaleziony</translation>
+ </message>
+ <message>
+ <source>Connected to host %1</source>
+ <translation>Podłączony do hosta %1</translation>
+ </message>
+ <message>
+ <source>Connected to host</source>
+ <translation>Podłączony do hosta</translation>
+ </message>
+ <message>
+ <source>Connection to %1 closed</source>
+ <translation>Połączenie do %1 zakończone</translation>
+ </message>
+ <message>
+ <source>Connection closed</source>
+ <translation>Połączenie zamknięte</translation>
+ </message>
+ <message>
+ <source>Host %1 not found</source>
+ <translation>Host %1 nie znaleziony</translation>
+ </message>
+ <message>
+ <source>Connection refused to host %1</source>
+ <translation>Połączenie do hosta %1 odrzucone</translation>
+ </message>
+ <message>
+ <source>Connection timed out to host %1</source>
+ <translation>Przekroczony czas połączenia do hosta %1</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>Nieznany błąd</translation>
+ </message>
+ <message>
+ <source>Connecting to host failed:
+%1</source>
+ <translation>Podłączanie do hosta zakończone błędem:
+%1</translation>
+ </message>
+ <message>
+ <source>Login failed:
+%1</source>
+ <translation>Logowanie nie powiodło się:
+%1</translation>
+ </message>
+ <message>
+ <source>Listing directory failed:
+%1</source>
+ <translation>Listowanie katalogu zakończone błędem:
+%1</translation>
+ </message>
+ <message>
+ <source>Changing directory failed:
+%1</source>
+ <translation>Zmiana katalogu zakończona błędem:
+%1</translation>
+ </message>
+ <message>
+ <source>Downloading file failed:
+%1</source>
+ <translation>Pobieranie pliku zakończone błędem:
+%1</translation>
+ </message>
+ <message>
+ <source>Uploading file failed:
+%1</source>
+ <translation>Wysyłanie pliku zakończone błędem:
+%1</translation>
+ </message>
+ <message>
+ <source>Removing file failed:
+%1</source>
+ <translation>Usuwanie pliku zakończone błędem:
+%1</translation>
+ </message>
+ <message>
+ <source>Creating directory failed:
+%1</source>
+ <translation>Tworzenie katalogu zakończone błędem:
+%1</translation>
+ </message>
+ <message>
+ <source>Removing directory failed:
+%1</source>
+ <translation>Usuwanie katalogu zakończone błędem:
+%1</translation>
+ </message>
+ <message>
+ <source>Not connected</source>
+ <translation>Nie podłączony</translation>
+ </message>
+ <message>
+ <source>Connection refused for data connection</source>
+ <translation>Połączenie do przesyłu danych odrzucone</translation>
+ </message>
+ </context>
+ <context>
+ <name>QHostInfo</name>
+ <message>
+ <source>Unknown error</source>
+ <translation>Nieznany błąd</translation>
+ </message>
+ </context>
+ <context>
+ <name>QHostInfoAgent</name>
+ <message>
+ <source>Host not found</source>
+ <translation>Host nie znaleziony</translation>
+ </message>
+ <message>
+ <source>Unknown address type</source>
+ <translation>Nieznany typ adresu</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>Nieznany błąd</translation>
+ </message>
+ <message>
+ <source>No host name given</source>
+ <translation>Nie podano nazwy hosta</translation>
+ </message>
+ <message>
+ <source>Invalid hostname</source>
+ <translation>Niepoprawna nazwa hosta</translation>
+ </message>
+ </context>
+ <context>
+ <name>QHttp</name>
+ <message>
+ <source>Connection refused</source>
+ <translation>Połączenie odrzucone</translation>
+ </message>
+ <message>
+ <source>Host %1 not found</source>
+ <translation>Host %1 nie znaleziony</translation>
+ </message>
+ <message>
+ <source>Wrong content length</source>
+ <translation>Błędna długość zawartości</translation>
+ </message>
+ <message>
+ <source>HTTP request failed</source>
+ <translation>Komenda HTTP zakończona błędem</translation>
+ </message>
+ <message>
+ <source>Host %1 found</source>
+ <translation>Host %1 znaleziony</translation>
+ </message>
+ <message>
+ <source>Host found</source>
+ <translation>Host znaleziony</translation>
+ </message>
+ <message>
+ <source>Connected to host %1</source>
+ <translation>Podłączony do hosta %1</translation>
+ </message>
+ <message>
+ <source>Connected to host</source>
+ <translation>Podłączony do hosta</translation>
+ </message>
+ <message>
+ <source>Connection to %1 closed</source>
+ <translation>Połączenie do %1 zamknięte</translation>
+ </message>
+ <message>
+ <source>Connection closed</source>
+ <translation>Połączenie zakończone</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>Nieznany błąd</translation>
+ </message>
+ <message>
+ <source>Request aborted</source>
+ <translation>Komenda przerwana</translation>
+ </message>
+ <message>
+ <source>No server set to connect to</source>
+ <translation>Brak serwera do podłączenia</translation>
+ </message>
+ <message>
+ <source>Server closed connection unexpectedly</source>
+ <translation>Serwer niespodziewanie zakończył połączenie</translation>
+ </message>
+ <message>
+ <source>Invalid HTTP response header</source>
+ <translation>Niepoprawny nagłówek odpowiedzi HTTP</translation>
+ </message>
+ <message>
+ <source>Unknown authentication method</source>
+ <translation>Nieznana metoda autoryzacji</translation>
+ </message>
+ <message>
+ <source>Invalid HTTP chunked body</source>
+ <translation>Niepoprawne ciało HTTP</translation>
+ </message>
+ <message>
+ <source>Error writing response to device</source>
+ <translation>Błąd zapisywania odpowiedzi do urządzenia</translation>
+ </message>
+ <message>
+ <source>Proxy authentication required</source>
+ <translation>Wymagana autoryzacja pośrednika</translation>
+ </message>
+ <message>
+ <source>Authentication required</source>
+ <translation>Wymagana autoryzacja</translation>
+ </message>
+ <message>
+ <source>Proxy requires authentication</source>
+ <translation>Pośrednik wymaga autoryzacji</translation>
+ </message>
+ <message>
+ <source>Host requires authentication</source>
+ <translation>Host wymaga autoryzacji</translation>
+ </message>
+ <message>
+ <source>Data corrupted</source>
+ <translation>Dane uszkodzone</translation>
+ </message>
+ <message>
+ <source>SSL handshake failed</source>
+ <translation>Nawiązanie sesji SSL nie powiodło się</translation>
+ </message>
+ <message>
+ <source>Unknown protocol specified</source>
+ <translation>Podano nieznany protokół</translation>
+ </message>
+ <message>
+ <source>Connection refused (or timed out)</source>
+ <translation>Połączenie odrzucone (przekroczony czas połączenia)</translation>
+ </message>
+ <message>
+ <source>HTTPS connection requested but SSL support not compiled in</source>
+ <translation>Zażądano połączenia HTTPS lecz obsługa SSL nie jest wkompilowana</translation>
+ </message>
+ </context>
+ <context>
+ <name>QHttpSocketEngine</name>
+ <message>
+ <source>Did not receive HTTP response from proxy</source>
+ <translation>Nie odebrano odpowiedzi HTTP od pośrednika</translation>
+ </message>
+ <message>
+ <source>Error parsing authentication request from proxy</source>
+ <translation>Błąd parsowania żądania autoryzacji od pośrednika</translation>
+ </message>
+ <message>
+ <source>Authentication required</source>
+ <translation>Wymagana autoryzacja</translation>
+ </message>
+ <message>
+ <source>Proxy denied connection</source>
+ <translation>Pośrednik odmówił połączenia</translation>
+ </message>
+ <message>
+ <source>Error communicating with HTTP proxy</source>
+ <translation>Błąd podczas komunikacji z pośrednikiem HTTP</translation>
+ </message>
+ <message>
+ <source>Proxy server not found</source>
+ <translation>Nie znaleziono serwera pośredniczącego</translation>
+ </message>
+ <message>
+ <source>Proxy connection refused</source>
+ <translation>Odmowa połączenia z pośrednikiem</translation>
+ </message>
+ <message>
+ <source>Proxy server connection timed out</source>
+ <translation>Przekroczony czas połączenia do serwera pośredniczącego</translation>
+ </message>
+ <message>
+ <source>Proxy connection closed prematurely</source>
+ <translation>Przedwczesne zakończenie połączenia z pośrednikiem</translation>
+ </message>
+ </context>
+ <context>
+ <name>QIBaseDriver</name>
+ <message>
+ <source>Error opening database</source>
+ <translation>Błąd otwierania bazy danych</translation>
+ </message>
+ <message>
+ <source>Could not start transaction</source>
+ <translation>Nie można rozpocząć transakcji</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>Nie można dokonać transakcji</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>Nie można wycofać transakcji</translation>
+ </message>
+ </context>
+ <context>
+ <name>QIBaseResult</name>
+ <message>
+ <source>Unable to create BLOB</source>
+ <translation>Nie można utworzyć obiektu typu BLOB</translation>
+ </message>
+ <message>
+ <source>Unable to write BLOB</source>
+ <translation>Nie można zapisać obiektu typu BLOB</translation>
+ </message>
+ <message>
+ <source>Unable to open BLOB</source>
+ <translation>Nie można otworzyć obiektu typu BLOB</translation>
+ </message>
+ <message>
+ <source>Unable to read BLOB</source>
+ <translation>Nie można odczytać obiektu typu BLOB</translation>
+ </message>
+ <message>
+ <source>Could not find array</source>
+ <translation>Nie można odnaleźć tablicy</translation>
+ </message>
+ <message>
+ <source>Could not get array data</source>
+ <translation>Nie można pobrać danych z tablicy</translation>
+ </message>
+ <message>
+ <source>Could not get query info</source>
+ <translation>Nie można pobrać informacji o zapytaniu</translation>
+ </message>
+ <message>
+ <source>Could not start transaction</source>
+ <translation>Nie można rozpocząć transakcji</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>Nie można dokonać transakcji</translation>
+ </message>
+ <message>
+ <source>Could not allocate statement</source>
+ <translation>Nie można zaallokować polecenia</translation>
+ </message>
+ <message>
+ <source>Could not prepare statement</source>
+ <translation>Nie można przygotować polecenia</translation>
+ </message>
+ <message>
+ <source>Could not describe input statement</source>
+ <translation>Nie można opisać polecenia wejściowego</translation>
+ </message>
+ <message>
+ <source>Could not describe statement</source>
+ <translation>Nie można opisać polecenia</translation>
+ </message>
+ <message>
+ <source>Unable to close statement</source>
+ <translation>Nie można zamknąć polecenia</translation>
+ </message>
+ <message>
+ <source>Unable to execute query</source>
+ <translation>Nie można wykonać zapytania</translation>
+ </message>
+ <message>
+ <source>Could not fetch next item</source>
+ <translation>Nie można pobrać kolejnego elementu</translation>
+ </message>
+ <message>
+ <source>Could not get statement info</source>
+ <translation>Nie można pobrać informacji o poleceniu</translation>
+ </message>
+ </context>
+ <context>
+ <name>QIODevice</name>
+ <message>
+ <source>Permission denied</source>
+ <translation>Brak dostępu</translation>
+ </message>
+ <message>
+ <source>Too many open files</source>
+ <translation>Zbyt wiele otwartych plików</translation>
+ </message>
+ <message>
+ <source>No such file or directory</source>
+ <translation>Brak pliku lub katalogu</translation>
+ </message>
+ <message>
+ <source>No space left on device</source>
+ <translation>Brak wolnego miejsca na urządzeniu</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>Nieznany błąd</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>Metoda wprowadzania XIM</translation>
+ </message>
+ <message>
+ <source>Windows input method</source>
+ <translation>Metoda wprowadzania Windows</translation>
+ </message>
+ <message>
+ <source>Mac OS X input method</source>
+ <translation>Metoda wprowadzania Mac OS X</translation>
+ </message>
+ <message>
+ <source>S60 FEP input method</source>
+ <translation>Metoda wprowadzania S60 FEP</translation>
+ </message>
+ </context>
+ <context>
+ <name>QInputDialog</name>
+ <message>
+ <source>Enter a value:</source>
+ <translation>Podaj wartość:</translation>
+ </message>
+ </context>
+ <context>
+ <name>QLibrary</name>
+ <message>
+ <source>Could not mmap &apos;%1&apos;: %2</source>
+ <translation>Nie można wykonać przypisania &apos;%1&apos;: %2</translation>
+ </message>
+ <message>
+ <source>Plugin verification data mismatch in &apos;%1&apos;</source>
+ <translation>Błąd podczas weryfikacji danych we wtyczce &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <source>Could not unmap &apos;%1&apos;: %2</source>
+ <translation>Nie można usunąć przypisania &apos;%1&apos;: %2</translation>
+ </message>
+ <message>
+ <source>The plugin &apos;%1&apos; uses incompatible Qt library. (%2.%3.%4) [%5]</source>
+ <translation>Wtyczka &apos;%1&apos; używa niepoprawnej wersji biblioteki QT. (%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>Wtyczka &apos;%1&apos; używa niepoprawnej wersji biblioteki QT. Oczekiwano klucza &quot;%2&quot;, uzyskano &quot;%3&quot;</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>Nieznany błąd</translation>
+ </message>
+ <message>
+ <source>The shared library was not found.</source>
+ <translation>Biblioteka współdzielona niedostępna.</translation>
+ </message>
+ <message>
+ <source>The file &apos;%1&apos; is not a valid Qt plugin.</source>
+ <translation>Plik &quot;%1&quot; nie jest poprawną wtyczką Qt.</translation>
+ </message>
+ <message>
+ <source>The plugin &apos;%1&apos; uses incompatible Qt library. (Cannot mix debug and release libraries.)</source>
+ <translation>Wtyczka &quot;%1&quot; używa innej wersji biblioteki Qt. (Nie można łączyć bibliotek zwykłych i debugowych.)</translation>
+ </message>
+ <message>
+ <source>Cannot load library %1: %2</source>
+ <translation>Nie można załadować biblioteki %1: %2</translation>
+ </message>
+ <message>
+ <source>Cannot unload library %1: %2</source>
+ <translation>Nie można zwolnić biblioteki %1: %2</translation>
+ </message>
+ <message>
+ <source>Cannot resolve symbol &quot;%1&quot; in %2: %3</source>
+ <translation>Nie można zidentyfikować symbolu &quot;%1&quot; w %2: %3</translation>
+ </message>
+ </context>
+ <context>
+ <name>QLineEdit</name>
+ <message>
+ <source>Select All</source>
+ <translation>Zaznacz wszystko</translation>
+ </message>
+ <message>
+ <source>&amp;Undo</source>
+ <translation>&amp;Cofnij</translation>
+ </message>
+ <message>
+ <source>&amp;Redo</source>
+ <translation>&amp;Przywróć</translation>
+ </message>
+ <message>
+ <source>Cu&amp;t</source>
+ <translation>W&amp;ytnij</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>S&amp;kopiuj</translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation>&amp;Wklej</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>Skasuj</translation>
+ </message>
+ </context>
+ <context>
+ <name>QLocalServer</name>
+ <message>
+ <source>%1: Name error</source>
+ <translation>%1: Błąd nazwy</translation>
+ </message>
+ <message>
+ <source>%1: Permission denied</source>
+ <translation>%1: Brak dostępu</translation>
+ </message>
+ <message>
+ <source>%1: Address in use</source>
+ <translation>%1: Adres użyty</translation>
+ </message>
+ <message>
+ <source>%1: Unknown error %2</source>
+ <translation>%1: Nieznany błąd %2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QLocalSocket</name>
+ <message>
+ <source>%1: Connection refused</source>
+ <translation>%1: Odmowa połączenia</translation>
+ </message>
+ <message>
+ <source>%1: Remote closed</source>
+ <translation>%1: Drugi koniec odłączony</translation>
+ </message>
+ <message>
+ <source>%1: Invalid name</source>
+ <translation>%1: Niepoprawna nazwa</translation>
+ </message>
+ <message>
+ <source>%1: Socket access error</source>
+ <translation>%1: Błąd dostępu do gniazda</translation>
+ </message>
+ <message>
+ <source>%1: Socket resource error</source>
+ <translation>%1: Błąd zasobów gniazda</translation>
+ </message>
+ <message>
+ <source>%1: Socket operation timed out</source>
+ <translation>%1: Przekroczony czas operacji gniazda</translation>
+ </message>
+ <message>
+ <source>%1: Datagram too large</source>
+ <translation>%1: Za duży datagram</translation>
+ </message>
+ <message>
+ <source>%1: Connection error</source>
+ <translation>%1: Błąd połączenia</translation>
+ </message>
+ <message>
+ <source>%1: The socket operation is not supported</source>
+ <translation>%1: Operacja nie jest obsługiwana przez gniazdo</translation>
+ </message>
+ <message>
+ <source>%1: Unknown error</source>
+ <translation>%1: Nieznany błąd</translation>
+ </message>
+ <message>
+ <source>%1: Unknown error %2</source>
+ <translation>%1: Nieznany błąd %2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMYSQLDriver</name>
+ <message>
+ <source>Unable to open database &apos;</source>
+ <translation>Nie można otworzyć bazy danych &apos;</translation>
+ </message>
+ <message>
+ <source>Unable to connect</source>
+ <translation>Nie można nawiązać połączenia</translation>
+ </message>
+ <message>
+ <source>Unable to begin transaction</source>
+ <translation>Nie można rozpocząć transakcji</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>Nie można potwierdzić transakcji</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>Nie można wycofać transakcji</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMYSQLResult</name>
+ <message>
+ <source>Unable to fetch data</source>
+ <translation>Nie można pobrać danych</translation>
+ </message>
+ <message>
+ <source>Unable to execute query</source>
+ <translation>Nie można wykonać zapytania</translation>
+ </message>
+ <message>
+ <source>Unable to store result</source>
+ <translation>Nie można zachować wyników</translation>
+ </message>
+ <message>
+ <source>Unable to prepare statement</source>
+ <translation>Nie można przygotować polecenia</translation>
+ </message>
+ <message>
+ <source>Unable to reset statement</source>
+ <translation>Nie można skasować polecenia</translation>
+ </message>
+ <message>
+ <source>Unable to bind value</source>
+ <translation>Nie można powiązać wartości</translation>
+ </message>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>Nie można wykonać polecenia</translation>
+ </message>
+ <message>
+ <source>Unable to bind outvalues</source>
+ <translation>Nie można powiązać wartości zewnętrznych</translation>
+ </message>
+ <message>
+ <source>Unable to store statement results</source>
+ <translation>Nie można zachować wyników polecenia</translation>
+ </message>
+ <message>
+ <source>Unable to execute next query</source>
+ <translation>Nie można wykonać następnego zapytania</translation>
+ </message>
+ <message>
+ <source>Unable to store next result</source>
+ <translation>Nie można zachować następnego wyniku</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMdiArea</name>
+ <message>
+ <source>(Untitled)</source>
+ <translation>(Nienazwany)</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMdiSubWindow</name>
+ <message>
+ <source>%1 - [%2]</source>
+ <translation>%1 - [%2]</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Zamknij</translation>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation>Zminimalizuj</translation>
+ </message>
+ <message>
+ <source>Restore Down</source>
+ <translation>Przywróć pod spód</translation>
+ </message>
+ <message>
+ <source>&amp;Restore</source>
+ <translation>&amp;Przywróć</translation>
+ </message>
+ <message>
+ <source>&amp;Move</source>
+ <translation>Prze&amp;nieś</translation>
+ </message>
+ <message>
+ <source>&amp;Size</source>
+ <translation>&amp;Rozmiar</translation>
+ </message>
+ <message>
+ <source>Mi&amp;nimize</source>
+ <translation>Zmi&amp;nimalizuj</translation>
+ </message>
+ <message>
+ <source>Ma&amp;ximize</source>
+ <translation>Zma&amp;ksymalizuj</translation>
+ </message>
+ <message>
+ <source>Stay on &amp;Top</source>
+ <translation>Pozostaw na &amp;wierzchu</translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation>&amp;Zamknij</translation>
+ </message>
+ <message>
+ <source>Maximize</source>
+ <translation>Zmaksymalizuj</translation>
+ </message>
+ <message>
+ <source>Unshade</source>
+ <translation>Rozwiń</translation>
+ </message>
+ <message>
+ <source>Shade</source>
+ <translation>Zwiń</translation>
+ </message>
+ <message>
+ <source>Restore</source>
+ <translation>Przywróć</translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation>Pomoc</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>Zamknij</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>Otwórz</translation>
+ </message>
+ <message>
+ <source>Execute</source>
+ <translation>Wykonaj</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMenuBar</name>
+ <message>
+ <source>Actions</source>
+ <translation>Akcje</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;Informacje o Qt&lt;/h3&gt;&lt;p&gt; Ten program używa Qt w wersji %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 jest zestawem narzędzi programistycznych dedykowanym dla języka C++. Służy on do opracowywania aplikacji międzyplatformowych.&lt;/p&gt;&lt;p&gt;Qt umożliwia jednoźródłowe przenoszenie między systemami MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux i wszystkimi głównymi wersjami komercyjnymi systemu Unix. Środowisko Qt jest dostępne dla urządzeń wbudowanych opartych na systemie Linux ( Qt dla wbudowanego systemu Linux) oraz Windows CE.&lt;/p&gt;&lt;p&gt;Zestaw Qt jest dostępny w trzech różnych opcjach licencjonowania stworzonych w celu zadowolenia naszych różnych użytkowników.&lt;/p&gt;&lt;p&gt;Qt podlegający licencji zgodnie z naszą komercyjną umową licencyjną jest odpowiedni do opracowywania oprogramowań własnościowych/komercyjnych, dzięki czemu kod źródłowy nie jest udostępniany osobom trzecim. W przeciwnym razie zestaw Qt jest niezgodny z warunkami licencji GNU LGPL w wersji 2.1 lub GNU GPL w wersji 3.0.&lt;/p&gt;&lt;p&gt;Środowisko Qt objęte licencją GNU LGPL w wersji 2.1 nadaje się do tworzenia aplikacji Qt (własnościowych lub oprogramowań otwartych) tylko wtedy, gdy przestrzegane są warunki licencji GNU LGPL w wersji 2.1.&lt;/p&gt;&lt;p&gt;Qt objęty Powszechną Licencją Publiczną GNU w wersji 3.0 jest odpowiedni do opracowywania aplikacji QT, aby móc korzystać z aplikacji w połączeniu z oprogramowaniem podlegającym warunkom licencji GNU GPL w wersji 3.0 lub aby przestrzegać warunków licencji GNU GPL w wersji 3.0.&lt;/p&gt;&lt;p&gt;Więcej informacji na temat licencji Qt można znaleźć na stronie &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Copyright (C) 2010 Nokia Corporation i/lub oddziały firmy.&lt;/p&gt;&lt;p&gt;Qt jest produktem firmy Nokia. Dodatkowe informacje znajdują się na stronie &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; &lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>About Qt</source>
+ <translation>Informacje o Qt</translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation>Pomoc</translation>
+ </message>
+ <message>
+ <source>Show Details...</source>
+ <translation>Pokaż szczegóły...</translation>
+ </message>
+ <message>
+ <source>Hide Details...</source>
+ <translation>Ukryj szczegóły...</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMultiInputContext</name>
+ <message>
+ <source>Select IM</source>
+ <translation>Wybierz metodę wprowadzania</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMultiInputContextPlugin</name>
+ <message>
+ <source>Multiple input method switcher</source>
+ <translation>Przełącznik metody wprowadzania</translation>
+ </message>
+ <message>
+ <source>Multiple input method switcher that uses the context menu of the text widgets</source>
+ <translation>Przełącznik metody wprowadzania, który w widżetach tekstowych używa podręcznego menu</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNativeSocketEngine</name>
+ <message>
+ <source>The remote host closed the connection</source>
+ <translation>Zdalny host zakończył połączenie</translation>
+ </message>
+ <message>
+ <source>Network operation timed out</source>
+ <translation>Przekroczony czas operacji sieciowej</translation>
+ </message>
+ <message>
+ <source>Out of resources</source>
+ <translation>Zasoby wyczerpane</translation>
+ </message>
+ <message>
+ <source>Unsupported socket operation</source>
+ <translation>Nieobsługiwana operacja gniazda</translation>
+ </message>
+ <message>
+ <source>Protocol type not supported</source>
+ <translation>Nieobsługiwany typ protokołu</translation>
+ </message>
+ <message>
+ <source>Invalid socket descriptor</source>
+ <translation>Niepoprawny opis gniazda</translation>
+ </message>
+ <message>
+ <source>Network unreachable</source>
+ <translation>Sieć niedostępna</translation>
+ </message>
+ <message>
+ <source>Permission denied</source>
+ <translation>Brak dostępu</translation>
+ </message>
+ <message>
+ <source>Connection timed out</source>
+ <translation>Przekroczony czas połączenia</translation>
+ </message>
+ <message>
+ <source>Connection refused</source>
+ <translation>Połączenie odrzucone</translation>
+ </message>
+ <message>
+ <source>The bound address is already in use</source>
+ <translation>Adres jest aktualnie w użyciu</translation>
+ </message>
+ <message>
+ <source>The address is not available</source>
+ <translation>Adres nie jest dostępny</translation>
+ </message>
+ <message>
+ <source>The address is protected</source>
+ <translation>Adres jest zabezpieczony</translation>
+ </message>
+ <message>
+ <source>Unable to send a message</source>
+ <translation>Nie można wysłać wiadomości</translation>
+ </message>
+ <message>
+ <source>Unable to receive a message</source>
+ <translation>Nie można odebrać wiadomości</translation>
+ </message>
+ <message>
+ <source>Unable to write</source>
+ <translation>Nie można zapisać</translation>
+ </message>
+ <message>
+ <source>Network error</source>
+ <translation>Błąd sieci</translation>
+ </message>
+ <message>
+ <source>Another socket is already listening on the same port</source>
+ <translation>Inne gniazdo nasłuchuje już na tym porcie</translation>
+ </message>
+ <message>
+ <source>Unable to initialize non-blocking socket</source>
+ <translation>Nie można uruchomić gniazda w nieblokującym trybie</translation>
+ </message>
+ <message>
+ <source>Unable to initialize broadcast socket</source>
+ <translation>Nie można uruchomić gniazda rozsyłającego</translation>
+ </message>
+ <message>
+ <source>Attempt to use IPv6 socket on a platform with no IPv6 support</source>
+ <translation>Próba użycia IPv6 na platformie bez obsługi IPv6</translation>
+ </message>
+ <message>
+ <source>Host unreachable</source>
+ <translation>Komputer niedostępny</translation>
+ </message>
+ <message>
+ <source>Datagram was too large to send</source>
+ <translation>Datagram za długi do wysłania</translation>
+ </message>
+ <message>
+ <source>Operation on non-socket</source>
+ <translation>Nieprawidłowa operacja na gnieździe</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>Nieznany błąd</translation>
+ </message>
+ <message>
+ <source>The proxy type is invalid for this operation</source>
+ <translation>Typ pośrednika nie jest poprawny dla tej operacji</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkAccessCacheBackend</name>
+ <message>
+ <source>Error opening %1</source>
+ <translation>Błąd otwierania %1</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkAccessDebugPipeBackend</name>
+ <message>
+ <source>Write error writing to %1: %2</source>
+ <translation>Błąd w trakcie zapisywania do %1: %2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkAccessFileBackend</name>
+ <message>
+ <source>Request for opening non-local file %1</source>
+ <translation>Żądanie otwarcia zdalnego pliku %1</translation>
+ </message>
+ <message>
+ <source>Error opening %1: %2</source>
+ <translation>Błąd otwierania %1: %2</translation>
+ </message>
+ <message>
+ <source>Write error writing to %1: %2</source>
+ <translation>Błąd w trakcie zapisywania do %1: %2</translation>
+ </message>
+ <message>
+ <source>Cannot open %1: Path is a directory</source>
+ <translation>Nie można otworzyć %1: Ścieżka jest katalogiem</translation>
+ </message>
+ <message>
+ <source>Read error reading from %1: %2</source>
+ <translation>Błąd w trakcie czytania z %1: %2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkAccessFtpBackend</name>
+ <message>
+ <source>No suitable proxy found</source>
+ <translation>Nie odnaleziono odpowiedniego pośrednika</translation>
+ </message>
+ <message>
+ <source>Cannot open %1: is a directory</source>
+ <translation>Nie można otworzyć %1: jest to katalog</translation>
+ </message>
+ <message>
+ <source>Logging in to %1 failed: authentication required</source>
+ <translation>Błąd podczas logowania do %1: wymagana autoryzacja</translation>
+ </message>
+ <message>
+ <source>Error while downloading %1: %2</source>
+ <translation>Błąd podczas pobierania %1: %2</translation>
+ </message>
+ <message>
+ <source>Error while uploading %1: %2</source>
+ <translation>Błąd podczas wysyłania %1: %2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkAccessHttpBackend</name>
+ <message>
+ <source>No suitable proxy found</source>
+ <translation>Nie odnaleziono odpowiedniego pośrednika</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkReply</name>
+ <message>
+ <source>Error downloading %1 - server replied: %2</source>
+ <translation>Błąd podczas pobierania %1 - odpowiedź serwera: %2</translation>
+ </message>
+ <message>
+ <source>Protocol &quot;%1&quot; is unknown</source>
+ <translation>Protokół &quot;%1&quot; nie jest znany</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkReplyImpl</name>
+ <message>
+ <source>Operation canceled</source>
+ <translation>Operacja anulowana</translation>
+ </message>
+ </context>
+ <context>
+ <name>QOCIDriver</name>
+ <message>
+ <source>Unable to logon</source>
+ <translation>Nie można się zalogować</translation>
+ </message>
+ <message>
+ <source>Unable to initialize</source>
+ <comment>QOCIDriver</comment>
+ <translation>Nie można dokonać inicjalizacji</translation>
+ </message>
+ <message>
+ <source>Unable to begin transaction</source>
+ <translation>Nie można rozpocząć transakcji</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>Nie można dokonać transakcji</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>Nie można wycofać transakcji</translation>
+ </message>
+ </context>
+ <context>
+ <name>QOCIResult</name>
+ <message>
+ <source>Unable to bind column for batch execute</source>
+ <translation>Nie można powiązać kolumny dla wykonania zestawu poleceń</translation>
+ </message>
+ <message>
+ <source>Unable to execute batch statement</source>
+ <translation>Nie można wykonać polecenia wsadowego</translation>
+ </message>
+ <message>
+ <source>Unable to goto next</source>
+ <translation>Nie można przejść do kolejnego wiersza danych</translation>
+ </message>
+ <message>
+ <source>Unable to alloc statement</source>
+ <translation>Nie można przydzielić miejsca na polecenie</translation>
+ </message>
+ <message>
+ <source>Unable to prepare statement</source>
+ <translation>Nie można przygotować polecenia</translation>
+ </message>
+ <message>
+ <source>Unable to get statement type</source>
+ <translation>Nie można pobrać typu polecenia</translation>
+ </message>
+ <message>
+ <source>Unable to bind value</source>
+ <translation>Nie można powiązać wartości</translation>
+ </message>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>Nie można wykonać polecenia</translation>
+ </message>
+ </context>
+ <context>
+ <name>QODBCDriver</name>
+ <message>
+ <source>Unable to connect</source>
+ <translation>Nie można nawiązać połączenia</translation>
+ </message>
+ <message>
+ <source>Unable to disable autocommit</source>
+ <translation>Nie można wyłączyć trybu automatycznego dokonywania transakcji</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>Nie można potwierdzić transakcji</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>Nie można wycofać transakcji</translation>
+ </message>
+ <message>
+ <source>Unable to enable autocommit</source>
+ <translation>Nie można włączyć trybu automatycznego dokonywania transakcji</translation>
+ </message>
+ <message>
+ <source>Unable to connect - Driver doesn&apos;t support all functionality required</source>
+ <translation>Nie można nawiązać połączenia - sterownik nie obsługuje całej potrzebnej funkcjonalności</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: Nie można ustawić &apos;SQL_CURSOR_STATIC&apos; jako atrybutu polecenia. Proszę sprawdzić konfiguracje sterownika ODBC</translation>
+ </message>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>Nie można wykonać polecenia</translation>
+ </message>
+ <message>
+ <source>Unable to fetch next</source>
+ <translation>Nie można pobrać kolejnych danych</translation>
+ </message>
+ <message>
+ <source>Unable to prepare statement</source>
+ <translation>Nie można przygotować polecenia</translation>
+ </message>
+ <message>
+ <source>Unable to bind variable</source>
+ <translation>Nie można powiązać zmiennej</translation>
+ </message>
+ <message>
+ <source>Unable to fetch last</source>
+ <translation>Nie można pobrać ostatnich danych</translation>
+ </message>
+ <message>
+ <source>Unable to fetch</source>
+ <translation>Nie można pobrać</translation>
+ </message>
+ <message>
+ <source>Unable to fetch first</source>
+ <translation>Nie można pobrać pierwszych danych</translation>
+ </message>
+ <message>
+ <source>Unable to fetch previous</source>
+ <translation>Nie można pobrać poprzednich danych</translation>
+ </message>
+ </context>
+ <context>
+ <name>QObject</name>
+ <message>
+ <source>Invalid hostname</source>
+ <translation>Niepoprawna nazwa hosta</translation>
+ </message>
+ <message>
+ <source>Operation not supported on %1</source>
+ <translation>Operacja nieobsługiwana na %1</translation>
+ </message>
+ <message>
+ <source>Invalid URI: %1</source>
+ <translation>Niepoprawny URI: %1</translation>
+ </message>
+ <message>
+ <source>Socket error on %1: %2</source>
+ <translation>Błąd gniazda na %1: %2</translation>
+ </message>
+ <message>
+ <source>Remote host closed the connection prematurely on %1</source>
+ <translation>Zdalny host przedwcześnie zakończył połączenie na %1</translation>
+ </message>
+ <message>
+ <source>No host name given</source>
+ <translation>Nie podano nazwy hosta</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPPDOptionsModel</name>
+ <message>
+ <source>Name</source>
+ <translation>Nazwa</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Wartość</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPSQLDriver</name>
+ <message>
+ <source>Unable to connect</source>
+ <translation>Nie można nawiązać połączenia</translation>
+ </message>
+ <message>
+ <source>Could not begin transaction</source>
+ <translation>Nie można rozpocząć transakcji</translation>
+ </message>
+ <message>
+ <source>Could not commit transaction</source>
+ <translation>Nie można potwierdzić transakcji</translation>
+ </message>
+ <message>
+ <source>Could not rollback transaction</source>
+ <translation>Nie można wycofać transakcji</translation>
+ </message>
+ <message>
+ <source>Unable to subscribe</source>
+ <translation>Nie można wykonać subskrypcji</translation>
+ </message>
+ <message>
+ <source>Unable to unsubscribe</source>
+ <translation>Nie można zrezygnować z subskrypcji</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPSQLResult</name>
+ <message>
+ <source>Unable to create query</source>
+ <translation>Nie można utworzyć zapytania</translation>
+ </message>
+ <message>
+ <source>Unable to prepare statement</source>
+ <translation>Nie można przygotować polecenia</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPageSetupWidget</name>
+ <message>
+ <source>Centimeters (cm)</source>
+ <translation>Centymetry (cm)</translation>
+ </message>
+ <message>
+ <source>Millimeters (mm)</source>
+ <translation>Milimetry (mm)</translation>
+ </message>
+ <message>
+ <source>Inches (in)</source>
+ <translation>Cale (in)</translation>
+ </message>
+ <message>
+ <source>Points (pt)</source>
+ <translation>Punkty (pt)</translation>
+ </message>
+ <message>
+ <source>Form</source>
+ <translation>Formularz</translation>
+ </message>
+ <message>
+ <source>Paper</source>
+ <translation>Papier</translation>
+ </message>
+ <message>
+ <source>Page size:</source>
+ <translation>Rozmiar strony:</translation>
+ </message>
+ <message>
+ <source>Width:</source>
+ <translation>Szerokość:</translation>
+ </message>
+ <message>
+ <source>Height:</source>
+ <translation>Wysokość:</translation>
+ </message>
+ <message>
+ <source>Paper source:</source>
+ <translation>Źródło papieru:</translation>
+ </message>
+ <message>
+ <source>Orientation</source>
+ <translation>Położenie</translation>
+ </message>
+ <message>
+ <source>Portrait</source>
+ <translation>Portret</translation>
+ </message>
+ <message>
+ <source>Landscape</source>
+ <translation>Pejzaż</translation>
+ </message>
+ <message>
+ <source>Reverse landscape</source>
+ <translation>Odwrócony pejzaż</translation>
+ </message>
+ <message>
+ <source>Reverse portrait</source>
+ <translation>Odwrócony portret</translation>
+ </message>
+ <message>
+ <source>Margins</source>
+ <translation>Marginesy</translation>
+ </message>
+ <message>
+ <source>top margin</source>
+ <translation>Górny margines</translation>
+ </message>
+ <message>
+ <source>left margin</source>
+ <translation>Lewy margines</translation>
+ </message>
+ <message>
+ <source>right margin</source>
+ <translation>Prawy margines</translation>
+ </message>
+ <message>
+ <source>bottom margin</source>
+ <translation>Dolny margines</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPluginLoader</name>
+ <message>
+ <source>Unknown error</source>
+ <translation>Nieznany błąd</translation>
+ </message>
+ <message>
+ <source>The plugin was not loaded.</source>
+ <translation>Wtyczka nie została załadowana.</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPrintDialog</name>
+ <message>
+ <source>locally connected</source>
+ <translation>podłączony lokalnie</translation>
+ </message>
+ <message>
+ <source>Aliases: %1</source>
+ <translation>Aliasy: %1</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation>nieznany</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Print all</source>
+ <translation>Drukuj wszystko</translation>
+ </message>
+ <message>
+ <source>Print range</source>
+ <translation>Drukuj zakres</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 cali)</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 cali)</translation>
+ </message>
+ <message>
+ <source>Executive (7.5 x 10 inches, 191 x 254 mm)</source>
+ <translation>Executive (7.5 x 10 cali, 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 cali, 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 cali, 216 x 279 mm)</translation>
+ </message>
+ <message>
+ <source>Print selection</source>
+ <translation>Drukuj zaznaczone</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation>Drukowanie</translation>
+ </message>
+ <message>
+ <source>Print To File ...</source>
+ <translation>Drukuj do pliku ...</translation>
+ </message>
+ <message>
+ <source>File %1 is not writable.
+Please choose a different file name.</source>
+ <translation>Plik %1 jest plikiem tylko do odczytu.
+Proszę wybrać inną nazwę pliku.</translation>
+ </message>
+ <message>
+ <source>%1 already exists.
+Do you want to overwrite it?</source>
+ <translation>%1 już istnieje.
+Czy chcesz nadpisać?</translation>
+ </message>
+ <message>
+ <source>File exists</source>
+ <translation>Plik istnieje</translation>
+ </message>
+ <message>
+ <source>&lt;qt&gt;Do you want to overwrite it?&lt;/qt&gt;</source>
+ <translation>&lt;qt&gt;Czy chcesz nadpisać?&lt;/qt&gt;</translation>
+ </message>
+ <message>
+ <source>%1 is a directory.
+Please choose a different file name.</source>
+ <translation>%1 jest katalogiem.
+Proszę wybrać inną nazwę pliku.</translation>
+ </message>
+ <message>
+ <source>The &apos;From&apos; value cannot be greater than the &apos;To&apos; value.</source>
+ <translation>Wartość &quot;od&quot; nie może być większa od wartości &quot;do&quot;.</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>Niestandardowy</translation>
+ </message>
+ <message>
+ <source>&amp;Options &gt;&gt;</source>
+ <translation>&amp;Opcje &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Options &lt;&lt;</source>
+ <translation>&amp;Opcje &lt;&lt;</translation>
+ </message>
+ <message>
+ <source>Print to File (PDF)</source>
+ <translation>Drukuj do pliku (PDF)</translation>
+ </message>
+ <message>
+ <source>Print to File (Postscript)</source>
+ <translation>Drukuj do pliku (Postscript)</translation>
+ </message>
+ <message>
+ <source>Local file</source>
+ <translation>Plik lokalny</translation>
+ </message>
+ <message>
+ <source>Write %1 file</source>
+ <translation>Zapisz %1 plik</translation>
+ </message>
+ <message>
+ <source>&amp;Print</source>
+ <translation>Wy&amp;drukuj</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPrintPreviewDialog</name>
+ <message>
+ <source>%1%</source>
+ <translation>%1%</translation>
+ </message>
+ <message>
+ <source>Print Preview</source>
+ <translation>Podgląd wydruku</translation>
+ </message>
+ <message>
+ <source>Next page</source>
+ <translation>Następna strona</translation>
+ </message>
+ <message>
+ <source>Previous page</source>
+ <translation>Poprzednia strona</translation>
+ </message>
+ <message>
+ <source>First page</source>
+ <translation>Pierwsza strona</translation>
+ </message>
+ <message>
+ <source>Last page</source>
+ <translation>Ostatnia strona</translation>
+ </message>
+ <message>
+ <source>Fit width</source>
+ <translation>Dopasuj szerokość</translation>
+ </message>
+ <message>
+ <source>Fit page</source>
+ <translation>Dopasuj stronę</translation>
+ </message>
+ <message>
+ <source>Zoom in</source>
+ <translation>Powiększ</translation>
+ </message>
+ <message>
+ <source>Zoom out</source>
+ <translation>Pomniejsz</translation>
+ </message>
+ <message>
+ <source>Portrait</source>
+ <translation>Portret</translation>
+ </message>
+ <message>
+ <source>Landscape</source>
+ <translation>Pejzaż</translation>
+ </message>
+ <message>
+ <source>Show single page</source>
+ <translation>Pokaż pojedynczą stronę</translation>
+ </message>
+ <message>
+ <source>Show facing pages</source>
+ <translation>Pokaż sąsiednie strony</translation>
+ </message>
+ <message>
+ <source>Show overview of all pages</source>
+ <translation>Pokaż wszystkie strony</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation>Wydrukuj</translation>
+ </message>
+ <message>
+ <source>Page setup</source>
+ <translation>Ustawienia strony</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Export to PDF</source>
+ <translation>Wyeksportuj do PDF</translation>
+ </message>
+ <message>
+ <source>Export to PostScript</source>
+ <translation>Wyeksportuj do PostScript</translation>
+ </message>
+ <message>
+ <source>Page Setup</source>
+ <translation>Ustawienia strony</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPrintPropertiesWidget</name>
+ <message>
+ <source>Form</source>
+ <translation>Forma</translation>
+ </message>
+ <message>
+ <source>Page</source>
+ <translation>Strona</translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Zaawansowane</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPrintSettingsOutput</name>
+ <message>
+ <source>Form</source>
+ <translation>Forma</translation>
+ </message>
+ <message>
+ <source>Copies</source>
+ <translation>Liczba kopii</translation>
+ </message>
+ <message>
+ <source>Print range</source>
+ <translation>Zakres wydruku</translation>
+ </message>
+ <message>
+ <source>Print all</source>
+ <translation>Drukuj wszystko</translation>
+ </message>
+ <message>
+ <source>Pages from</source>
+ <translation>Strony od</translation>
+ </message>
+ <message>
+ <source>to</source>
+ <translation>do</translation>
+ </message>
+ <message>
+ <source>Selection</source>
+ <translation>Wybrane strony</translation>
+ </message>
+ <message>
+ <source>Output Settings</source>
+ <translation>Ustawienia wyjściowe</translation>
+ </message>
+ <message>
+ <source>Copies:</source>
+ <translation>Kopie:</translation>
+ </message>
+ <message>
+ <source>Collate</source>
+ <translation>Parami</translation>
+ </message>
+ <message>
+ <source>Reverse</source>
+ <translation>Odwróć</translation>
+ </message>
+ <message>
+ <source>Options</source>
+ <translation>Opcje</translation>
+ </message>
+ <message>
+ <source>Color Mode</source>
+ <translation>Tryb koloru</translation>
+ </message>
+ <message>
+ <source>Color</source>
+ <translation>Kolor</translation>
+ </message>
+ <message>
+ <source>Grayscale</source>
+ <translation>Skala szarości</translation>
+ </message>
+ <message>
+ <source>Duplex Printing</source>
+ <translation>Drukowanie dupleksowe</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Brak</translation>
+ </message>
+ <message>
+ <source>Long side</source>
+ <translation>Długa strona</translation>
+ </message>
+ <message>
+ <source>Short side</source>
+ <translation>Krótka strona</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPrintWidget</name>
+ <message>
+ <source>Form</source>
+ <translation>Forma</translation>
+ </message>
+ <message>
+ <source>Printer</source>
+ <translation>Drukarka</translation>
+ </message>
+ <message>
+ <source>&amp;Name:</source>
+ <translation>&amp;Nazwa:</translation>
+ </message>
+ <message>
+ <source>P&amp;roperties</source>
+ <translation>&amp;Właściwości</translation>
+ </message>
+ <message>
+ <source>Location:</source>
+ <translation>Położenie:</translation>
+ </message>
+ <message>
+ <source>Preview</source>
+ <translation>Podgląd</translation>
+ </message>
+ <message>
+ <source>Type:</source>
+ <translation>Typ:</translation>
+ </message>
+ <message>
+ <source>Output &amp;file:</source>
+ <translation>&amp;Plik wyjściowy:</translation>
+ </message>
+ <message>
+ <source>...</source>
+ <translation>...</translation>
+ </message>
+ </context>
+ <context>
+ <name>QProcess</name>
+ <message>
+ <source>Could not open input redirection for reading</source>
+ <translation>Nie można otworzyć wejściowego przekierowania do odczytu</translation>
+ </message>
+ <message>
+ <source>Could not open output redirection for writing</source>
+ <translation>Nie można otworzyć wyjściowego przekierowania do zapisu</translation>
+ </message>
+ <message>
+ <source>Resource error (fork failure): %1</source>
+ <translation>Błąd zasobów (błąd forkowania): %1</translation>
+ </message>
+ <message>
+ <source>Process operation timed out</source>
+ <translation>Przekroczony czas operacji procesu</translation>
+ </message>
+ <message>
+ <source>Error reading from process</source>
+ <translation>Błąd odczytywania z procesu</translation>
+ </message>
+ <message>
+ <source>Error writing to process</source>
+ <translation>Błąd zapisywania do procesu</translation>
+ </message>
+ <message>
+ <source>Process crashed</source>
+ <translation>Wystąpił błąd w procesie - proces zakończony</translation>
+ </message>
+ <message>
+ <source>No program defined</source>
+ <translation>Nie zdefiniowano programu</translation>
+ </message>
+ <message>
+ <source>Process failed to start: %1</source>
+ <translation>Nie można rozpocząć procesu: %1</translation>
+ </message>
+ </context>
+ <context>
+ <name>QProgressDialog</name>
+ <message>
+ <source>Cancel</source>
+ <translation>Anuluj</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPushButton</name>
+ <message>
+ <source>Open</source>
+ <translation>Otwórz</translation>
+ </message>
+ </context>
+ <context>
+ <name>QRadioButton</name>
+ <message>
+ <source>Check</source>
+ <translation>Zaznacz</translation>
+ </message>
+ </context>
+ <context>
+ <name>QRegExp</name>
+ <message>
+ <source>no error occurred</source>
+ <translation>nie pojawił się żaden błąd</translation>
+ </message>
+ <message>
+ <source>disabled feature used</source>
+ <translation>użyta funkcja została wyłączona</translation>
+ </message>
+ <message>
+ <source>bad char class syntax</source>
+ <translation>niepoprawna składnia klasy znakowej</translation>
+ </message>
+ <message>
+ <source>bad lookahead syntax</source>
+ <translation>niepoprawna składnia &quot;lookahead&quot;</translation>
+ </message>
+ <message>
+ <source>bad repetition syntax</source>
+ <translation>niepoprawna składnia powtórzenia</translation>
+ </message>
+ <message>
+ <source>invalid octal value</source>
+ <translation>niepoprawna wartość ósemkowa</translation>
+ </message>
+ <message>
+ <source>missing left delim</source>
+ <translation>brakujący lewy separator</translation>
+ </message>
+ <message>
+ <source>unexpected end</source>
+ <translation>nieoczekiwany koniec</translation>
+ </message>
+ <message>
+ <source>met internal limit</source>
+ <translation>napotkano wewnętrzne ograniczenie</translation>
+ </message>
+ <message>
+ <source>invalid interval</source>
+ <translation>Niepoprawny interwał</translation>
+ </message>
+ <message>
+ <source>invalid category</source>
+ <translation>Niepoprawna kategoria</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSQLite2Driver</name>
+ <message>
+ <source>Error opening database</source>
+ <translation>Błąd otwierania bazy danych</translation>
+ </message>
+ <message>
+ <source>Unable to begin transaction</source>
+ <translation>Nie można rozpocząć transakcji</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>Nie można dokonać transakcji</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>Nie można wycofać transakcji</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSQLite2Result</name>
+ <message>
+ <source>Unable to fetch results</source>
+ <translation>Nie można pobrać wyników</translation>
+ </message>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>Nie można wykonać polecenia</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSQLiteDriver</name>
+ <message>
+ <source>Error opening database</source>
+ <translation>Błąd otwierania bazy danych</translation>
+ </message>
+ <message>
+ <source>Error closing database</source>
+ <translation>Błąd zamykania bazy danych</translation>
+ </message>
+ <message>
+ <source>Unable to begin transaction</source>
+ <translation>Nie można rozpocząć transakcji</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>Nie można dokonać transakcji</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>Nie można wycofać transakcji</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSQLiteResult</name>
+ <message>
+ <source>Unable to fetch row</source>
+ <translation>Nie można pobrać wiersza danych</translation>
+ </message>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>Nie można wykonać polecenia</translation>
+ </message>
+ <message>
+ <source>Unable to reset statement</source>
+ <translation>Nie można skasować polecenia</translation>
+ </message>
+ <message>
+ <source>Unable to bind parameters</source>
+ <translation>Nie można powiązać parametrów</translation>
+ </message>
+ <message>
+ <source>Parameter count mismatch</source>
+ <translation>Niezgodna liczba parametrów</translation>
+ </message>
+ <message>
+ <source>No query</source>
+ <translation>Brak zapytania</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptBreakpointsModel</name>
+ <message>
+ <source>ID</source>
+ <translation>Identyfikator</translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation>Położenie</translation>
+ </message>
+ <message>
+ <source>Condition</source>
+ <translation>Warunek</translation>
+ </message>
+ <message>
+ <source>Ignore-count</source>
+ <translation>Licznik pominięć</translation>
+ </message>
+ <message>
+ <source>Single-shot</source>
+ <translation>##</translation>
+ </message>
+ <message>
+ <source>Hit-count</source>
+ <translation>Licznik trafień</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptBreakpointsWidget</name>
+ <message>
+ <source>New</source>
+ <translation>Nowy</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>Skasuj</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptDebugger</name>
+ <message>
+ <source>Go to Line</source>
+ <translation>Przejdź do linii</translation>
+ </message>
+ <message>
+ <source>Line:</source>
+ <translation>Linia:</translation>
+ </message>
+ <message>
+ <source>Interrupt</source>
+ <translation>Przerwij</translation>
+ </message>
+ <message>
+ <source>Shift+F5</source>
+ <translation>Shift+F5</translation>
+ </message>
+ <message>
+ <source>Continue</source>
+ <translation>Kontynuuj</translation>
+ </message>
+ <message>
+ <source>F5</source>
+ <translation>F5</translation>
+ </message>
+ <message>
+ <source>Step Into</source>
+ <translation>Wskocz do wnętrza</translation>
+ </message>
+ <message>
+ <source>F11</source>
+ <translation>F11</translation>
+ </message>
+ <message>
+ <source>Step Over</source>
+ <translation>Przeskocz</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation>F10</translation>
+ </message>
+ <message>
+ <source>Step Out</source>
+ <translation>Wyskocz na zewnątrz</translation>
+ </message>
+ <message>
+ <source>Shift+F11</source>
+ <translation>Shift+F11</translation>
+ </message>
+ <message>
+ <source>Run to Cursor</source>
+ <translation>Uruchom do kursora</translation>
+ </message>
+ <message>
+ <source>Ctrl+F10</source>
+ <translation>Ctrl+F10</translation>
+ </message>
+ <message>
+ <source>Run to New Script</source>
+ <translation>Uruchom do nowego skryptu</translation>
+ </message>
+ <message>
+ <source>Toggle Breakpoint</source>
+ <translation>Przełącz ustawienie pułapki</translation>
+ </message>
+ <message>
+ <source>F9</source>
+ <translation>F9</translation>
+ </message>
+ <message>
+ <source>Clear Debug Output</source>
+ <translation>Wyczyść wyjście debuggera</translation>
+ </message>
+ <message>
+ <source>Clear Error Log</source>
+ <translation>Wyczyść log z błędami</translation>
+ </message>
+ <message>
+ <source>Clear Console</source>
+ <translation>Wyczyść konsolę</translation>
+ </message>
+ <message>
+ <source>&amp;Find in Script...</source>
+ <translation>&amp;Znajdź w skrypcie...</translation>
+ </message>
+ <message>
+ <source>Ctrl+F</source>
+ <translation>Ctrl+F</translation>
+ </message>
+ <message>
+ <source>Find &amp;Next</source>
+ <translation>Znajdź &amp;następne</translation>
+ </message>
+ <message>
+ <source>F3</source>
+ <translation>F3</translation>
+ </message>
+ <message>
+ <source>Find &amp;Previous</source>
+ <translation>Znajdź &amp;poprzednie</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>Debuguj</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptDebuggerCodeFinderWidget</name>
+ <message>
+ <source>Close</source>
+ <translation>Zamknij</translation>
+ </message>
+ <message>
+ <source>Previous</source>
+ <translation>Poprzednie</translation>
+ </message>
+ <message>
+ <source>Next</source>
+ <translation>Następne</translation>
+ </message>
+ <message>
+ <source>Case Sensitive</source>
+ <translation>Uwzględniaj wielkość liter</translation>
+ </message>
+ <message>
+ <source>Whole words</source>
+ <translation>Całe słowa</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;Przeszukano od początku</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptDebuggerLocalsModel</name>
+ <message>
+ <source>Name</source>
+ <translation>Nazwa</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Wartość</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptDebuggerStackModel</name>
+ <message>
+ <source>Level</source>
+ <translation>Poziom</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Nazwa</translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation>Położenie</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptEdit</name>
+ <message>
+ <source>Toggle Breakpoint</source>
+ <translation>Przełącz ustawienie pułapki</translation>
+ </message>
+ <message>
+ <source>Disable Breakpoint</source>
+ <translation>Wyłącz pułapkę</translation>
+ </message>
+ <message>
+ <source>Enable Breakpoint</source>
+ <translation>Włącz pułapkę</translation>
+ </message>
+ <message>
+ <source>Breakpoint Condition:</source>
+ <translation>Warunek dla pułapki:</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptEngineDebugger</name>
+ <message>
+ <source>Loaded Scripts</source>
+ <translation>Załadowane skrypty</translation>
+ </message>
+ <message>
+ <source>Breakpoints</source>
+ <translation>Pułapki</translation>
+ </message>
+ <message>
+ <source>Stack</source>
+ <translation>Stos</translation>
+ </message>
+ <message>
+ <source>Locals</source>
+ <translation>Zmienne lokalne</translation>
+ </message>
+ <message>
+ <source>Console</source>
+ <translation>Konsola</translation>
+ </message>
+ <message>
+ <source>Debug Output</source>
+ <translation>Wyjście debuggera</translation>
+ </message>
+ <message>
+ <source>Error Log</source>
+ <translation>Log z błędami</translation>
+ </message>
+ <message>
+ <source>Search</source>
+ <translation>Szukaj</translation>
+ </message>
+ <message>
+ <source>View</source>
+ <translation>Widok</translation>
+ </message>
+ <message>
+ <source>Qt Script Debugger</source>
+ <translation>Debugger Qt Script</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptNewBreakpointWidget</name>
+ <message>
+ <source>Close</source>
+ <translation>Zamknij</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScrollBar</name>
+ <message>
+ <source>Scroll here</source>
+ <translation>Przewiń tutaj</translation>
+ </message>
+ <message>
+ <source>Left edge</source>
+ <translation>Lewa krawędź</translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <translation>Do góry</translation>
+ </message>
+ <message>
+ <source>Right edge</source>
+ <translation>Prawa krawędź</translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <translation>W dół</translation>
+ </message>
+ <message>
+ <source>Page left</source>
+ <translation>Strona w lewo</translation>
+ </message>
+ <message>
+ <source>Page up</source>
+ <translation>Strona do góry</translation>
+ </message>
+ <message>
+ <source>Page right</source>
+ <translation>Strona w prawo</translation>
+ </message>
+ <message>
+ <source>Page down</source>
+ <translation>Strona w dół</translation>
+ </message>
+ <message>
+ <source>Scroll left</source>
+ <translation>Przewiń w lewo</translation>
+ </message>
+ <message>
+ <source>Scroll up</source>
+ <translation>Przewiń do góry</translation>
+ </message>
+ <message>
+ <source>Scroll right</source>
+ <translation>Przewiń w prawo</translation>
+ </message>
+ <message>
+ <source>Scroll down</source>
+ <translation>Przewiń w dół</translation>
+ </message>
+ <message>
+ <source>Line up</source>
+ <translation>Linia w górę</translation>
+ </message>
+ <message>
+ <source>Position</source>
+ <translation>Pozycja</translation>
+ </message>
+ <message>
+ <source>Line down</source>
+ <translation>Linia w dół</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSharedMemory</name>
+ <message>
+ <source>%1: create size is less then 0</source>
+ <translation>%1: rozmiar przy tworzeniu mniejszy od 0</translation>
+ </message>
+ <message>
+ <source>%1: unable to lock</source>
+ <translation>%1: nie można zablokować</translation>
+ </message>
+ <message>
+ <source>%1: unable to unlock</source>
+ <translation>%1: nie można odblokować</translation>
+ </message>
+ <message>
+ <source>%1: permission denied</source>
+ <translation>%1: brak dostępu</translation>
+ </message>
+ <message>
+ <source>%1: already exists</source>
+ <translation>%1: już istnieje</translation>
+ </message>
+ <message>
+ <source>%1: doesn&apos;t exists</source>
+ <translation>%1: nie istnieje</translation>
+ </message>
+ <message>
+ <source>%1: out of resources</source>
+ <translation>%1: zasoby wyczerpane</translation>
+ </message>
+ <message>
+ <source>%1: unknown error %2</source>
+ <translation>%1: nieznany błąd %2</translation>
+ </message>
+ <message>
+ <source>%1: key is empty</source>
+ <translation>%1: klucz jest pusty</translation>
+ </message>
+ <message>
+ <source>%1: ftok failed</source>
+ <translation>%1: wystąpił błąd w funkcji ftok()</translation>
+ </message>
+ <message>
+ <source>%1: unable to make key</source>
+ <translation>%1: nie można utworzyć klucza</translation>
+ </message>
+ <message>
+ <source>%1: doesn&apos;t exist</source>
+ <translation>%1: nie istnieje</translation>
+ </message>
+ <message>
+ <source>%1: UNIX key file doesn&apos;t exist</source>
+ <translation>%1: unixowy plik z kluczem nie istnieje</translation>
+ </message>
+ <message>
+ <source>%1: system-imposed size restrictions</source>
+ <translation>%1: ograniczenia rozmiarów narzucone przez system</translation>
+ </message>
+ <message>
+ <source>%1: not attached</source>
+ <translation>%1: niedołączony</translation>
+ </message>
+ <message>
+ <source>%1: invalid size</source>
+ <translation>%1: niepoprawny rozmiar</translation>
+ </message>
+ <message>
+ <source>%1: key error</source>
+ <translation>%1: błąd klucza</translation>
+ </message>
+ <message>
+ <source>%1: size query failed</source>
+ <translation>%1: zapytanie o rozmiar nie powiodło się</translation>
+ </message>
+ <message>
+ <source>%1: unable to set key on lock</source>
+ <translation>%1: nie można ustawić klucza na zablokowanym segmencie pamięci współdzielonej</translation>
+ </message>
+ </context>
+ <context>
+ <name>QShortcut</name>
+ <message>
+ <source>Space</source>
+ <translation>Spacja</translation>
+ </message>
+ <message>
+ <source>Esc</source>
+ <translation>Esc</translation>
+ </message>
+ <message>
+ <source>Tab</source>
+ <translation>Tabulator</translation>
+ </message>
+ <message>
+ <source>Backtab</source>
+ <translation>Backtab</translation>
+ </message>
+ <message>
+ <source>Backspace</source>
+ <translation>Backspace</translation>
+ </message>
+ <message>
+ <source>Return</source>
+ <translation>Powrót</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>Pauza</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation>Wydrukuj</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>Lewo</translation>
+ </message>
+ <message>
+ <source>Up</source>
+ <translation>Góra</translation>
+ </message>
+ <message>
+ <source>Right</source>
+ <translation>Prawo</translation>
+ </message>
+ <message>
+ <source>Down</source>
+ <translation>Dół</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>Pomoc</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation>Back</translation>
+ </message>
+ <message>
+ <source>Forward</source>
+ <translation>Do przodu</translation>
+ </message>
+ <message>
+ <source>Stop</source>
+ <translation>Zatrzymaj</translation>
+ </message>
+ <message>
+ <source>Refresh</source>
+ <translation>Odśwież</translation>
+ </message>
+ <message>
+ <source>Volume Down</source>
+ <translation>Przycisz</translation>
+ </message>
+ <message>
+ <source>Volume Mute</source>
+ <translation>Wycisz</translation>
+ </message>
+ <message>
+ <source>Volume Up</source>
+ <translation>Zrób głośniej</translation>
+ </message>
+ <message>
+ <source>Bass Boost</source>
+ <translation>Wzmocnienie basów</translation>
+ </message>
+ <message>
+ <source>Bass Up</source>
+ <translation>Basy w górę</translation>
+ </message>
+ <message>
+ <source>Bass Down</source>
+ <translation>Basy w dół</translation>
+ </message>
+ <message>
+ <source>Treble Up</source>
+ <translation>Soprany w górę</translation>
+ </message>
+ <message>
+ <source>Treble Down</source>
+ <translation>Soprany w dół</translation>
+ </message>
+ <message>
+ <source>Media Play</source>
+ <translation>Odtwarzaj</translation>
+ </message>
+ <message>
+ <source>Media Stop</source>
+ <translation>Zatrzymaj</translation>
+ </message>
+ <message>
+ <source>Media Previous</source>
+ <translation>Poprzednia ścieżka</translation>
+ </message>
+ <message>
+ <source>Media Next</source>
+ <translation>Następna ścieżka</translation>
+ </message>
+ <message>
+ <source>Media Record</source>
+ <translation>Nagrywaj</translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation>Ulubione</translation>
+ </message>
+ <message>
+ <source>Search</source>
+ <translation>Szukaj</translation>
+ </message>
+ <message>
+ <source>Standby</source>
+ <translation>Tryb oczekiwania</translation>
+ </message>
+ <message>
+ <source>Open URL</source>
+ <translation>Otwórz adres</translation>
+ </message>
+ <message>
+ <source>Launch Mail</source>
+ <translation>Uruchom program pocztowy</translation>
+ </message>
+ <message>
+ <source>Launch Media</source>
+ <translation>Uruchom przeglądarkę mediów</translation>
+ </message>
+ <message>
+ <source>Launch (0)</source>
+ <translation>Uruchom (0)</translation>
+ </message>
+ <message>
+ <source>Launch (1)</source>
+ <translation>Uruchom (1)</translation>
+ </message>
+ <message>
+ <source>Launch (2)</source>
+ <translation>Uruchom (2)</translation>
+ </message>
+ <message>
+ <source>Launch (3)</source>
+ <translation>Uruchom (3)</translation>
+ </message>
+ <message>
+ <source>Launch (4)</source>
+ <translation>Uruchom (4)</translation>
+ </message>
+ <message>
+ <source>Launch (5)</source>
+ <translation>Uruchom (5)</translation>
+ </message>
+ <message>
+ <source>Launch (6)</source>
+ <translation>Uruchom (6)</translation>
+ </message>
+ <message>
+ <source>Launch (7)</source>
+ <translation>Uruchom (7)</translation>
+ </message>
+ <message>
+ <source>Launch (8)</source>
+ <translation>Uruchom (8)</translation>
+ </message>
+ <message>
+ <source>Launch (9)</source>
+ <translation>Uruchom (9)</translation>
+ </message>
+ <message>
+ <source>Launch (A)</source>
+ <translation>Uruchom (A)</translation>
+ </message>
+ <message>
+ <source>Launch (B)</source>
+ <translation>Uruchom (B)</translation>
+ </message>
+ <message>
+ <source>Launch (C)</source>
+ <translation>Uruchom (C)</translation>
+ </message>
+ <message>
+ <source>Launch (D)</source>
+ <translation>Uruchom (D)</translation>
+ </message>
+ <message>
+ <source>Launch (E)</source>
+ <translation>Uruchom (E)</translation>
+ </message>
+ <message>
+ <source>Launch (F)</source>
+ <translation>Uruchom (F)</translation>
+ </message>
+ <message>
+ <source>Monitor Brightness Up</source>
+ <translation>Zwiększ jasność monitora</translation>
+ </message>
+ <message>
+ <source>Monitor Brightness Down</source>
+ <translation>Zmniejsz jasność monitora</translation>
+ </message>
+ <message>
+ <source>Keyboard Light On/Off</source>
+ <translation>Włącz/wyłącz podświetlenie klawiatury</translation>
+ </message>
+ <message>
+ <source>Keyboard Brightness Up</source>
+ <translation>Zwiększ jasność klawiatury</translation>
+ </message>
+ <message>
+ <source>Keyboard Brightness Down</source>
+ <translation>Zmniejsz jasność klawiatury</translation>
+ </message>
+ <message>
+ <source>Power Off</source>
+ <translation>Wyłączenie zasilania</translation>
+ </message>
+ <message>
+ <source>Wake Up</source>
+ <translation>##</translation>
+ </message>
+ <message>
+ <source>Eject</source>
+ <translation>Wysuń</translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation>Wygaszacz ekranu</translation>
+ </message>
+ <message>
+ <source>WWW</source>
+ <translation>WWW</translation>
+ </message>
+ <message>
+ <source>Sleep</source>
+ <translation>##</translation>
+ </message>
+ <message>
+ <source>LightBulb</source>
+ <translation>Żarówka</translation>
+ </message>
+ <message>
+ <source>Shop</source>
+ <translation>Sklep</translation>
+ </message>
+ <message>
+ <source>History</source>
+ <translation>Historia</translation>
+ </message>
+ <message>
+ <source>Add Favorite</source>
+ <translation>Dodaj do ulubionych</translation>
+ </message>
+ <message>
+ <source>Hot Links</source>
+ <translation>Popularne łącza</translation>
+ </message>
+ <message>
+ <source>Adjust Brightness</source>
+ <translation>Ustaw jasność</translation>
+ </message>
+ <message>
+ <source>Finance</source>
+ <translation>Finanse</translation>
+ </message>
+ <message>
+ <source>Community</source>
+ <translation>Społeczność</translation>
+ </message>
+ <message>
+ <source>Audio Rewind</source>
+ <translation>Przewijanie do tyłu</translation>
+ </message>
+ <message>
+ <source>Back Forward</source>
+ <translation>##</translation>
+ </message>
+ <message>
+ <source>Application Left</source>
+ <translation>##</translation>
+ </message>
+ <message>
+ <source>Application Right</source>
+ <translation>##</translation>
+ </message>
+ <message>
+ <source>Book</source>
+ <translation>Książka</translation>
+ </message>
+ <message>
+ <source>CD</source>
+ <translation>CD</translation>
+ </message>
+ <message>
+ <source>Calculator</source>
+ <translation>Kalkulator</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Wyczyść</translation>
+ </message>
+ <message>
+ <source>Clear Grab</source>
+ <translation>##</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Zamknij</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation>Skopiuj</translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation>Wytnij</translation>
+ </message>
+ <message>
+ <source>Display</source>
+ <translation>Wyświetlacz</translation>
+ </message>
+ <message>
+ <source>DOS</source>
+ <translation>DOS</translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation>Dokumenty</translation>
+ </message>
+ <message>
+ <source>Spreadsheet</source>
+ <translation>Arkusz kalkulacyjny</translation>
+ </message>
+ <message>
+ <source>Browser</source>
+ <translation>Przeglądarka</translation>
+ </message>
+ <message>
+ <source>Game</source>
+ <translation>Gra</translation>
+ </message>
+ <message>
+ <source>Go</source>
+ <translation>Przejdź</translation>
+ </message>
+ <message>
+ <source>iTouch</source>
+ <translation>iTouch</translation>
+ </message>
+ <message>
+ <source>Logoff</source>
+ <translation>Wyloguj</translation>
+ </message>
+ <message>
+ <source>Market</source>
+ <translation>Rynek</translation>
+ </message>
+ <message>
+ <source>Meeting</source>
+ <translation>Spotkanie</translation>
+ </message>
+ <message>
+ <source>Keyboard Menu</source>
+ <translation>Menu klawiatury</translation>
+ </message>
+ <message>
+ <source>Menu PB</source>
+ <translation>Menu PG</translation>
+ </message>
+ <message>
+ <source>My Sites</source>
+ <translation>Moje strony</translation>
+ </message>
+ <message>
+ <source>News</source>
+ <translation>Wiadomości</translation>
+ </message>
+ <message>
+ <source>Home Office</source>
+ <translation>##</translation>
+ </message>
+ <message>
+ <source>Option</source>
+ <translation>Opcje</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation>Wklej</translation>
+ </message>
+ <message>
+ <source>Phone</source>
+ <translation>Telefon</translation>
+ </message>
+ <message>
+ <source>Reply</source>
+ <translation>Odpowiedz</translation>
+ </message>
+ <message>
+ <source>Reload</source>
+ <translation>Przeładuj</translation>
+ </message>
+ <message>
+ <source>Rotate Windows</source>
+ <translation>Obróć okna</translation>
+ </message>
+ <message>
+ <source>Rotation PB</source>
+ <translation>Obrót PB</translation>
+ </message>
+ <message>
+ <source>Rotation KB</source>
+ <translation>Obrót KB</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation>Zachowaj</translation>
+ </message>
+ <message>
+ <source>Send</source>
+ <translation>Wyślij</translation>
+ </message>
+ <message>
+ <source>Spellchecker</source>
+ <translation>Funkcja sprawdzania pisowni</translation>
+ </message>
+ <message>
+ <source>Split Screen</source>
+ <translation>Podziel ekran</translation>
+ </message>
+ <message>
+ <source>Support</source>
+ <translation>Pomoc techniczna</translation>
+ </message>
+ <message>
+ <source>Task Panel</source>
+ <translation>Panel zadań</translation>
+ </message>
+ <message>
+ <source>Terminal</source>
+ <translation>Terminal</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation>Narzędzia</translation>
+ </message>
+ <message>
+ <source>Travel</source>
+ <translation>Podróże</translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation>Wideo</translation>
+ </message>
+ <message>
+ <source>Word Processor</source>
+ <translation>Edytor tekstów</translation>
+ </message>
+ <message>
+ <source>XFer</source>
+ <translation>XFer</translation>
+ </message>
+ <message>
+ <source>Zoom In</source>
+ <translation>Powiększ</translation>
+ </message>
+ <message>
+ <source>Zoom Out</source>
+ <translation>Pomniejsz</translation>
+ </message>
+ <message>
+ <source>Away</source>
+ <translation>##</translation>
+ </message>
+ <message>
+ <source>Messenger</source>
+ <translation>Messenger</translation>
+ </message>
+ <message>
+ <source>WebCam</source>
+ <translation>WebCam</translation>
+ </message>
+ <message>
+ <source>Mail Forward</source>
+ <translation>Przesyłanie wiadomości</translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation>Zdjęcia</translation>
+ </message>
+ <message>
+ <source>Music</source>
+ <translation>Muzyka</translation>
+ </message>
+ <message>
+ <source>Battery</source>
+ <translation>Bateria</translation>
+ </message>
+ <message>
+ <source>Bluetooth</source>
+ <translation>Bluetooth</translation>
+ </message>
+ <message>
+ <source>Wireless</source>
+ <translation>Bezprzewodowy</translation>
+ </message>
+ <message>
+ <source>Ultra Wide Band</source>
+ <translation>Ultraszerokie pasmo</translation>
+ </message>
+ <message>
+ <source>Audio Forward</source>
+ <translation>Przewijanie do przodu</translation>
+ </message>
+ <message>
+ <source>Audio Repeat</source>
+ <translation>Powtarzanie</translation>
+ </message>
+ <message>
+ <source>Audio Random Play</source>
+ <translation>Odtwarzanie losowe</translation>
+ </message>
+ <message>
+ <source>Subtitle</source>
+ <translation>Napisy</translation>
+ </message>
+ <message>
+ <source>Audio Cycle Track</source>
+ <translation>##</translation>
+ </message>
+ <message>
+ <source>Time</source>
+ <translation>Czas</translation>
+ </message>
+ <message>
+ <source>View</source>
+ <translation>Widok</translation>
+ </message>
+ <message>
+ <source>Top Menu</source>
+ <translation>Menu główne</translation>
+ </message>
+ <message>
+ <source>Suspend</source>
+ <translation>Wstrzymaj</translation>
+ </message>
+ <message>
+ <source>Hibernate</source>
+ <translation>Hibernuj</translation>
+ </message>
+ <message>
+ <source>Print Screen</source>
+ <translation>Wydrukuj zawartość ekranu</translation>
+ </message>
+ <message>
+ <source>Page Up</source>
+ <translation>Strona w dół</translation>
+ </message>
+ <message>
+ <source>Page Down</source>
+ <translation>Strona do góry</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>Żądanie systemu</translation>
+ </message>
+ <message>
+ <source>Select</source>
+ <translation>Wybierz</translation>
+ </message>
+ <message>
+ <source>Yes</source>
+ <translation>Tak</translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation>Nie</translation>
+ </message>
+ <message>
+ <source>Context1</source>
+ <translation>Kontekst1</translation>
+ </message>
+ <message>
+ <source>Context2</source>
+ <translation>Kontekst2</translation>
+ </message>
+ <message>
+ <source>Context3</source>
+ <translation>Kontekst3</translation>
+ </message>
+ <message>
+ <source>Context4</source>
+ <translation>Kontekst4</translation>
+ </message>
+ <message>
+ <source>Call</source>
+ <translation>Wywołaj</translation>
+ </message>
+ <message>
+ <source>Hangup</source>
+ <translation>Zawieś</translation>
+ </message>
+ <message>
+ <source>Flip</source>
+ <translation>Odwróć</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>Strona startowa</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSlider</name>
+ <message>
+ <source>Page left</source>
+ <translation>Strona w lewo</translation>
+ </message>
+ <message>
+ <source>Page up</source>
+ <translation>Strona do góry</translation>
+ </message>
+ <message>
+ <source>Position</source>
+ <translation>Położenie</translation>
+ </message>
+ <message>
+ <source>Page right</source>
+ <translation>Strona w prawo</translation>
+ </message>
+ <message>
+ <source>Page down</source>
+ <translation>Strona w dół</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSocks5SocketEngine</name>
+ <message>
+ <source>Connection to proxy refused</source>
+ <translation>Odmowa połączenia z pośrednikiem</translation>
+ </message>
+ <message>
+ <source>Connection to proxy closed prematurely</source>
+ <translation>Przedwczesne zakończenie połączenia z pośrednikiem</translation>
+ </message>
+ <message>
+ <source>Proxy host not found</source>
+ <translation>Nie odnaleziono hosta pośredniczącego</translation>
+ </message>
+ <message>
+ <source>Connection to proxy timed out</source>
+ <translation>Przekroczony czas połączenia do pośrednika</translation>
+ </message>
+ <message>
+ <source>Proxy authentication failed</source>
+ <translation>Autoryzacja pośrednika zakończona błędem</translation>
+ </message>
+ <message>
+ <source>Proxy authentication failed: %1</source>
+ <translation>Autoryzacja pośrednika zakończona błędem: %1</translation>
+ </message>
+ <message>
+ <source>SOCKS version 5 protocol error</source>
+ <translation>Błąd protokołu SOCKS wersji 5</translation>
+ </message>
+ <message>
+ <source>General SOCKSv5 server failure</source>
+ <translation>Generalny błąd serwera SOCKS wersji 5</translation>
+ </message>
+ <message>
+ <source>Connection not allowed by SOCKSv5 server</source>
+ <translation>Połączenie niedozwolone przez serwer SOCKS wersji 5</translation>
+ </message>
+ <message>
+ <source>TTL expired</source>
+ <translation>TTL stracił ważność</translation>
+ </message>
+ <message>
+ <source>SOCKSv5 command not supported</source>
+ <translation>Nieobsługiwana komenda SOCKS wersji 5</translation>
+ </message>
+ <message>
+ <source>Address type not supported</source>
+ <translation>Nieobsługiwany typ adresu</translation>
+ </message>
+ <message>
+ <source>Unknown SOCKSv5 proxy error code 0x%1</source>
+ <translation>Nieznany kod błędu (0x%1) pośrednika SOCKS wersji 5</translation>
+ </message>
+ <message>
+ <source>Network operation timed out</source>
+ <translation>Przekroczony czas operacji sieciowej</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSoftKeyManager</name>
+ <message>
+ <source>Ok</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Select</source>
+ <translation>Wybierz</translation>
+ </message>
+ <message>
+ <source>Done</source>
+ <translation>Zrobione</translation>
+ </message>
+ <message>
+ <source>Options</source>
+ <translation>Opcje</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Anuluj</translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation>Wyjście</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSpinBox</name>
+ <message>
+ <source>More</source>
+ <translation>Więcej</translation>
+ </message>
+ <message>
+ <source>Less</source>
+ <translation>Mniej</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSql</name>
+ <message>
+ <source>Delete</source>
+ <translation>Skasuj</translation>
+ </message>
+ <message>
+ <source>Delete this record?</source>
+ <translation>Skasować ten rekord?</translation>
+ </message>
+ <message>
+ <source>Yes</source>
+ <translation>Tak</translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation>Nie</translation>
+ </message>
+ <message>
+ <source>Insert</source>
+ <translation>Wstaw</translation>
+ </message>
+ <message>
+ <source>Update</source>
+ <translation>Uaktualnij</translation>
+ </message>
+ <message>
+ <source>Save edits?</source>
+ <translation>Zachować zmiany?</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Anuluj</translation>
+ </message>
+ <message>
+ <source>Confirm</source>
+ <translation>Potwierdź</translation>
+ </message>
+ <message>
+ <source>Cancel your edits?</source>
+ <translation>Anulować zmiany?</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSslSocket</name>
+ <message>
+ <source>Unable to write data: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to decrypt data: %1</source>
+ <translation>Nie można odszyfrować danych: %1</translation>
+ </message>
+ <message>
+ <source>Error while reading: %1</source>
+ <translation>Błąd podczas czytania: %1</translation>
+ </message>
+ <message>
+ <source>Error during SSL handshake: %1</source>
+ <translation>Błąd podczas nawiązania sesji SSL: %1</translation>
+ </message>
+ <message>
+ <source>Error creating SSL context (%1)</source>
+ <translation>Błąd tworzenia kontekstu (%1)</translation>
+ </message>
+ <message>
+ <source>Invalid or empty cipher list (%1)</source>
+ <translation>Niepoprawna lub pusta lista szyfrów (%1)</translation>
+ </message>
+ <message>
+ <source>Private key does not certify public key, %1</source>
+ <translation>Prywatny klucz nie uwiarygodnia publicznego, %1</translation>
+ </message>
+ <message>
+ <source>Error creating SSL session, %1</source>
+ <translation>Błąd tworzenia sesji SSL, %1</translation>
+ </message>
+ <message>
+ <source>Error creating SSL session: %1</source>
+ <translation>Błąd tworzenia sesji SSL: %1</translation>
+ </message>
+ <message>
+ <source>Cannot provide a certificate with no key, %1</source>
+ <translation>Nie można dostarczyć certyfikatu bez klucza, %1</translation>
+ </message>
+ <message>
+ <source>Error loading local certificate, %1</source>
+ <translation>Błąd ładowania lokalnego certyfikatu, %1</translation>
+ </message>
+ <message>
+ <source>Error loading private key, %1</source>
+ <translation>Błąd ładowania prywatnego klucza, %1</translation>
+ </message>
+ <message>
+ <source>No error</source>
+ <translation>Brak błędu</translation>
+ </message>
+ <message>
+ <source>The issuer certificate could not be found</source>
+ <translation>Nie można odnaleźć wydawcy certyfikatu</translation>
+ </message>
+ <message>
+ <source>The certificate signature could not be decrypted</source>
+ <translation>Nie można odszyfrować podpisu certyfikatu</translation>
+ </message>
+ <message>
+ <source>The public key in the certificate could not be read</source>
+ <translation>Nie można odczytać publicznego klucza w certyfikacie</translation>
+ </message>
+ <message>
+ <source>The signature of the certificate is invalid</source>
+ <translation>Niepoprawny podpis certyfikatu</translation>
+ </message>
+ <message>
+ <source>The certificate is not yet valid</source>
+ <translation>Certyfikat nie jest jeszcze ważny</translation>
+ </message>
+ <message>
+ <source>The certificate has expired</source>
+ <translation>Certyfikat utracił ważność</translation>
+ </message>
+ <message>
+ <source>The certificate&apos;s notBefore field contains an invalid time</source>
+ <translation>Pole &quot;notBefore&quot; certyfikatu zawiera niepoprawną datę</translation>
+ </message>
+ <message>
+ <source>The certificate&apos;s notAfter field contains an invalid time</source>
+ <translation>Pole &quot;notAfter&quot; certyfikatu zawiera niepoprawną datę</translation>
+ </message>
+ <message>
+ <source>The certificate is self-signed, and untrusted</source>
+ <translation>Certyfikat z podpisem własnym, niezaufany</translation>
+ </message>
+ <message>
+ <source>The root certificate of the certificate chain is self-signed, and untrusted</source>
+ <translation>Główny certyfikat łańcucha certyfikatów ma własny podpis i jest niezaufany</translation>
+ </message>
+ <message>
+ <source>The issuer certificate of a locally looked up certificate could not be found</source>
+ <translation>Nie można znaleźć certyfikatu wydawcy wyszukanego lokalnie</translation>
+ </message>
+ <message>
+ <source>No certificates could be verified</source>
+ <translation>Nie można zweryfikować certyfikatów</translation>
+ </message>
+ <message>
+ <source>One of the CA certificates is invalid</source>
+ <translation>Jeden z certyfikatów urzędu certyfikacji jest nieprawidłowy</translation>
+ </message>
+ <message>
+ <source>The basicConstraints path length parameter has been exceeded</source>
+ <translation>Długość ścieżki określona w podstawowych warunkach ograniczających została przekroczona</translation>
+ </message>
+ <message>
+ <source>The supplied certificate is unsuitable for this purpose</source>
+ <translation>Dostarczony certyfikat jest nieodpowiedni do tego celu</translation>
+ </message>
+ <message>
+ <source>The root CA certificate is not trusted for this purpose</source>
+ <translation>Główny certyfikat urzędu certyfikacji nie jest zaufany do tego celu</translation>
+ </message>
+ <message>
+ <source>The root CA certificate is marked to reject the specified purpose</source>
+ <translation>Główny certyfikat urzędu certyfikacji jest wyznaczony do odrzucania określonego celu</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>Certyfikat wydawcy obecnego kandydata został odrzucony, ponieważ nazwa podmiotu nie odpowiadała nazwie wydawcy obecnego certyfikatu</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>Certyfikat wydawcy obecnego kandydata został odrzucony, ponieważ nazwa wydawcy i przedstawiony numer seryjny nie odpowiadały identyfikatorowi klucza urzędu certyfikacji obecnego certyfikatu</translation>
+ </message>
+ <message>
+ <source>The peer did not present any certificate</source>
+ <translation>Element równorzędny nie przedstawił żadnego certyfikatu</translation>
+ </message>
+ <message>
+ <source>The host name did not match any of the valid hosts for this certificate</source>
+ <translation>Nazwa hosta nie odpowiadała żadnemu z prawidłowych hostów tego certyfikatu</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QStateMachine</name>
+ <message>
+ <source>Missing initial state in compound state &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Missing default state in history state &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No common ancestor for targets and source of transition from state &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QSystemSemaphore</name>
+ <message>
+ <source>%1: does not exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1: out of resources</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1: permission denied</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1: already exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1: unknown error %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QTDSDriver</name>
+ <message>
+ <source>Unable to open connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to use database</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QTabBar</name>
+ <message>
+ <source>Scroll Left</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scroll Right</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QTcpServer</name>
+ <message>
+ <source>Operation on socket is not supported</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QTextControl</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>Copy &amp;Link Location</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QToolButton</name>
+ <message>
+ <source>Press</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QUdpSocket</name>
+ <message>
+ <source>This platform does not support IPv6</source>
+ <translation>Ta platforma nie obsługuje IPv6</translation>
+ </message>
+ </context>
+ <context>
+ <name>QUndoGroup</name>
+ <message>
+ <source>Undo</source>
+ <translation>Cofnij</translation>
+ </message>
+ <message>
+ <source>Redo</source>
+ <translation>Przywróć</translation>
+ </message>
+ </context>
+ <context>
+ <name>QUndoModel</name>
+ <message>
+ <source>&lt;empty&gt;</source>
+ <translation>&lt;pusty&gt;</translation>
+ </message>
+ </context>
+ <context>
+ <name>QUndoStack</name>
+ <message>
+ <source>Undo</source>
+ <translation>Cofnij</translation>
+ </message>
+ <message>
+ <source>Redo</source>
+ <translation>Przywróć</translation>
+ </message>
+ </context>
+ <context>
+ <name>QUnicodeControlCharacterMenu</name>
+ <message>
+ <source>LRM Left-to-right mark</source>
+ <translation>LRM znacznik od prawej do lewej </translation>
+ </message>
+ <message>
+ <source>RLM Right-to-left mark</source>
+ <translation>RLM Znacznik od prawej do lewej</translation>
+ </message>
+ <message>
+ <source>ZWJ Zero width joiner</source>
+ <translation>ZWJ Łącznik zerowej długości</translation>
+ </message>
+ <message>
+ <source>ZWNJ Zero width non-joiner</source>
+ <translation>ZWNJ Rozdzielnik zerowej długości</translation>
+ </message>
+ <message>
+ <source>ZWSP Zero width space</source>
+ <translation>ZWSP Przerwa zerowej długości</translation>
+ </message>
+ <message>
+ <source>LRE Start of left-to-right embedding</source>
+ <translation>LRE Początek osadzania od lewej do prawej</translation>
+ </message>
+ <message>
+ <source>RLE Start of right-to-left embedding</source>
+ <translation>RLE Początek osadzania od prawej do lewej</translation>
+ </message>
+ <message>
+ <source>LRO Start of left-to-right override</source>
+ <translation>LRO Początek nadpisania od lewej do prawej</translation>
+ </message>
+ <message>
+ <source>RLO Start of right-to-left override</source>
+ <translation>RLO Początek nadpisania od prawej do lewej</translation>
+ </message>
+ <message>
+ <source>PDF Pop directional formatting</source>
+ <translation>PDF Formatowanie kierunkowe pop</translation>
+ </message>
+ <message>
+ <source>Insert Unicode control character</source>
+ <translation>Wstaw znak kontroli Unicode</translation>
+ </message>
+ </context>
+ <context>
+ <name>QWebFrame</name>
+ <message>
+ <source>Request cancelled</source>
+ <translation>Prośba anulowana</translation>
+ </message>
+ <message>
+ <source>Request blocked</source>
+ <translation>Prośba zablokowana</translation>
+ </message>
+ <message>
+ <source>Cannot show URL</source>
+ <translation>Nie można pokazać URL</translation>
+ </message>
+ <message>
+ <source>Frame load interrupted by policy change</source>
+ <translation>Ładowanie ramki przerwane przez zmianę strategii</translation>
+ </message>
+ <message>
+ <source>Cannot show mimetype</source>
+ <translation>Nie można pokazać typu MIME</translation>
+ </message>
+ <message>
+ <source>File does not exist</source>
+ <translation>Plik nie istnieje</translation>
+ </message>
+ </context>
+ <context>
+ <name>QWebPage</name>
+ <message>
+ <source>Submit</source>
+ <comment>default label for Submit buttons in forms on web pages</comment>
+ <translation>Wyślij</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>Wyślij</translation>
+ </message>
+ <message>
+ <source>Reset</source>
+ <comment>default label for Reset buttons in forms on web pages</comment>
+ <translation>Wyczyść</translation>
+ </message>
+ <message>
+ <source>Choose File</source>
+ <comment>title for file button used in HTML forms</comment>
+ <translation>Wybierz plik</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>Nie zaznaczono pliku</translation>
+ </message>
+ <message>
+ <source>Open in New Window</source>
+ <comment>Open in New Window context menu item</comment>
+ <translation>Otwórz w nowym oknie</translation>
+ </message>
+ <message>
+ <source>Save Link...</source>
+ <comment>Download Linked File context menu item</comment>
+ <translation>Zachowaj odsyłacz...</translation>
+ </message>
+ <message>
+ <source>Copy Link</source>
+ <comment>Copy Link context menu item</comment>
+ <translation>Skopiuj odsyłacz</translation>
+ </message>
+ <message>
+ <source>Open Image</source>
+ <comment>Open Image in New Window context menu item</comment>
+ <translation>Otwórz obrazek</translation>
+ </message>
+ <message>
+ <source>Save Image</source>
+ <comment>Download Image context menu item</comment>
+ <translation>Zachowaj obrazek</translation>
+ </message>
+ <message>
+ <source>Copy Image</source>
+ <comment>Copy Link context menu item</comment>
+ <translation>Skopiuj obrazek</translation>
+ </message>
+ <message>
+ <source>Open Frame</source>
+ <comment>Open Frame in New Window context menu item</comment>
+ <translation>Otwórz ramkę</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <comment>Copy context menu item</comment>
+ <translation>Skopiuj</translation>
+ </message>
+ <message>
+ <source>Go Back</source>
+ <comment>Back context menu item</comment>
+ <translation>Wróć</translation>
+ </message>
+ <message>
+ <source>Go Forward</source>
+ <comment>Forward context menu item</comment>
+ <translation>Idź dalej</translation>
+ </message>
+ <message>
+ <source>Stop</source>
+ <comment>Stop context menu item</comment>
+ <translation>Zatrzymaj</translation>
+ </message>
+ <message>
+ <source>Reload</source>
+ <comment>Reload context menu item</comment>
+ <translation>Przeładuj</translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <comment>Cut context menu item</comment>
+ <translation>Wytnij</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <comment>Paste context menu item</comment>
+ <translation>Wklej</translation>
+ </message>
+ <message>
+ <source>No Guesses Found</source>
+ <comment>No Guesses Found context menu item</comment>
+ <translation>Nie odnaleziono podpowiedzi</translation>
+ </message>
+ <message>
+ <source>Ignore</source>
+ <comment>Ignore Spelling context menu item</comment>
+ <translation>Zignoruj</translation>
+ </message>
+ <message>
+ <source>Add To Dictionary</source>
+ <comment>Learn Spelling context menu item</comment>
+ <translation>Dodaj do słownika</translation>
+ </message>
+ <message>
+ <source>Search The Web</source>
+ <comment>Search The Web context menu item</comment>
+ <translation>Wyszukaj w sieci</translation>
+ </message>
+ <message>
+ <source>Look Up In Dictionary</source>
+ <comment>Look Up in Dictionary context menu item</comment>
+ <translation>Poszukaj w słowniku</translation>
+ </message>
+ <message>
+ <source>Open Link</source>
+ <comment>Open Link context menu item</comment>
+ <translation>Otwórz odsyłacz</translation>
+ </message>
+ <message>
+ <source>Ignore</source>
+ <comment>Ignore Grammar context menu item</comment>
+ <translation>Zignoruj</translation>
+ </message>
+ <message>
+ <source>Spelling</source>
+ <comment>Spelling and Grammar context sub-menu item</comment>
+ <translation>Pisownia</translation>
+ </message>
+ <message>
+ <source>Show Spelling and Grammar</source>
+ <comment>menu item title</comment>
+ <translation>Pokaż pisownię i gramatykę</translation>
+ </message>
+ <message>
+ <source>Hide Spelling and Grammar</source>
+ <comment>menu item title</comment>
+ <translation>Schowaj pisownię i gramatykę</translation>
+ </message>
+ <message>
+ <source>Check Spelling</source>
+ <comment>Check spelling context menu item</comment>
+ <translation>Sprawdź pisownię</translation>
+ </message>
+ <message>
+ <source>Check Spelling While Typing</source>
+ <comment>Check spelling while typing context menu item</comment>
+ <translation>Sprawdzaj pisownię podczas pisania</translation>
+ </message>
+ <message>
+ <source>Check Grammar With Spelling</source>
+ <comment>Check grammar with spelling context menu item</comment>
+ <translation>Sprawdzaj gramatykę wraz z pisownią</translation>
+ </message>
+ <message>
+ <source>Fonts</source>
+ <comment>Font context sub-menu item</comment>
+ <translation>Czcionki</translation>
+ </message>
+ <message>
+ <source>Bold</source>
+ <comment>Bold context menu item</comment>
+ <translation>Pogrubiony</translation>
+ </message>
+ <message>
+ <source>Italic</source>
+ <comment>Italic context menu item</comment>
+ <translation>Kursywa</translation>
+ </message>
+ <message>
+ <source>Underline</source>
+ <comment>Underline context menu item</comment>
+ <translation>Podkreślenie</translation>
+ </message>
+ <message>
+ <source>Outline</source>
+ <comment>Outline context menu item</comment>
+ <translation>Kontur</translation>
+ </message>
+ <message>
+ <source>Direction</source>
+ <comment>Writing direction context sub-menu item</comment>
+ <translation>Kierunek</translation>
+ </message>
+ <message>
+ <source>Text Direction</source>
+ <comment>Text direction context sub-menu item</comment>
+ <translation>Kierunek tekstu</translation>
+ </message>
+ <message>
+ <source>Default</source>
+ <comment>Default writing direction context menu item</comment>
+ <translation>Domyślny</translation>
+ </message>
+ <message>
+ <source>Left to Right</source>
+ <comment>Left to Right context menu item</comment>
+ <translation>Z lewej na prawą</translation>
+ </message>
+ <message>
+ <source>Right to Left</source>
+ <comment>Right to Left context menu item</comment>
+ <translation>Z prawej na lewą</translation>
+ </message>
+ <message>
+ <source>Loading...</source>
+ <comment>Media controller status message when the media is loading</comment>
+ <translation>Ładowanie...</translation>
+ </message>
+ <message>
+ <source>Live Broadcast</source>
+ <comment>Media controller status message when watching a live broadcast</comment>
+ <translation>Transmisja na żywo</translation>
+ </message>
+ <message>
+ <source>Audio Element</source>
+ <comment>Media controller element</comment>
+ <translation>Element dźwiękowy</translation>
+ </message>
+ <message>
+ <source>Video Element</source>
+ <comment>Media controller element</comment>
+ <translation>Element wideo</translation>
+ </message>
+ <message>
+ <source>Mute Button</source>
+ <comment>Media controller element</comment>
+ <translation>Przycisk wyłączania głosu</translation>
+ </message>
+ <message>
+ <source>Unmute Button</source>
+ <comment>Media controller element</comment>
+ <translation>Przycisk włączania głosu</translation>
+ </message>
+ <message>
+ <source>Play Button</source>
+ <comment>Media controller element</comment>
+ <translation>Przycisk odtwarzania</translation>
+ </message>
+ <message>
+ <source>Pause Button</source>
+ <comment>Media controller element</comment>
+ <translation>Przycisk pauzy</translation>
+ </message>
+ <message>
+ <source>Slider</source>
+ <comment>Media controller element</comment>
+ <translation>Suwak</translation>
+ </message>
+ <message>
+ <source>Slider Thumb</source>
+ <comment>Media controller element</comment>
+ <translation>Uchwyt suwaka</translation>
+ </message>
+ <message>
+ <source>Rewind Button</source>
+ <comment>Media controller element</comment>
+ <translation>Przycisk przewijania</translation>
+ </message>
+ <message>
+ <source>Return to Real-time Button</source>
+ <comment>Media controller element</comment>
+ <translation>Przycisk powrotu do czasu rzeczywistego</translation>
+ </message>
+ <message>
+ <source>Elapsed Time</source>
+ <comment>Media controller element</comment>
+ <translation>Czas który upłynął</translation>
+ </message>
+ <message>
+ <source>Remaining Time</source>
+ <comment>Media controller element</comment>
+ <translation>Czas który pozostał</translation>
+ </message>
+ <message>
+ <source>Status Display</source>
+ <comment>Media controller element</comment>
+ <translation>Wyświetlacz stanu</translation>
+ </message>
+ <message>
+ <source>Fullscreen Button</source>
+ <comment>Media controller element</comment>
+ <translation>Przycisk trybu pełnoekranowego</translation>
+ </message>
+ <message>
+ <source>Seek Forward Button</source>
+ <comment>Media controller element</comment>
+ <translation>Przycisk przeszukiwania do przodu</translation>
+ </message>
+ <message>
+ <source>Seek Back Button</source>
+ <comment>Media controller element</comment>
+ <translation>Przycisk przeszukiwania do tyłu</translation>
+ </message>
+ <message>
+ <source>Audio element playback controls and status display</source>
+ <comment>Media controller element</comment>
+ <translation>Kontrolki odtwarzania dźwięku i wyświetlacz stanu</translation>
+ </message>
+ <message>
+ <source>Video element playback controls and status display</source>
+ <comment>Media controller element</comment>
+ <translation>Kontrolki odtwarzania wideo i wyświetlacz stanu</translation>
+ </message>
+ <message>
+ <source>Mute audio tracks</source>
+ <comment>Media controller element</comment>
+ <translation>Wyłącz ścieżkę dźwiękową</translation>
+ </message>
+ <message>
+ <source>Unmute audio tracks</source>
+ <comment>Media controller element</comment>
+ <translation>Włącz ścieżkę dźwiękową</translation>
+ </message>
+ <message>
+ <source>Begin playback</source>
+ <comment>Media controller element</comment>
+ <translation>Rozpocznij odtwarzanie</translation>
+ </message>
+ <message>
+ <source>Pause playback</source>
+ <comment>Media controller element</comment>
+ <translation>Wstrzymaj odtwarzanie</translation>
+ </message>
+ <message>
+ <source>Movie time scrubber</source>
+ <comment>Media controller element</comment>
+ <translation>Suwak czasu</translation>
+ </message>
+ <message>
+ <source>Movie time scrubber thumb</source>
+ <comment>Media controller element</comment>
+ <translation>Uchwyt suwaka czasu</translation>
+ </message>
+ <message>
+ <source>Rewind movie</source>
+ <comment>Media controller element</comment>
+ <translation>Przewiń film</translation>
+ </message>
+ <message>
+ <source>Return streaming movie to real-time</source>
+ <comment>Media controller element</comment>
+ <translation>Przywróć przesyłanie filmu do czasu rzeczywistego</translation>
+ </message>
+ <message>
+ <source>Current movie time</source>
+ <comment>Media controller element</comment>
+ <translation>Czas bieżącego filmu</translation>
+ </message>
+ <message>
+ <source>Remaining movie time</source>
+ <comment>Media controller element</comment>
+ <translation>Czas do końca filmu</translation>
+ </message>
+ <message>
+ <source>Current movie status</source>
+ <comment>Media controller element</comment>
+ <translation>Stan bieżącego filmu</translation>
+ </message>
+ <message>
+ <source>Play movie in full-screen mode</source>
+ <comment>Media controller element</comment>
+ <translation>Odtwarzaj film w trybie pełnoekranowym</translation>
+ </message>
+ <message>
+ <source>Seek quickly back</source>
+ <comment>Media controller element</comment>
+ <translation>Przeszukaj szybko do tyłu</translation>
+ </message>
+ <message>
+ <source>Seek quickly forward</source>
+ <comment>Media controller element</comment>
+ <translation>Przeszukaj szybko do przodu</translation>
+ </message>
+ <message>
+ <source>Indefinite time</source>
+ <comment>Media time description</comment>
+ <translation>Nieokreślony czas</translation>
+ </message>
+ <message>
+ <source>%1 days %2 hours %3 minutes %4 seconds</source>
+ <comment>Media time description</comment>
+ <translation>%1 dni %2 godzin %3 minut %4 sekund</translation>
+ </message>
+ <message>
+ <source>%1 hours %2 minutes %3 seconds</source>
+ <comment>Media time description</comment>
+ <translation>%1 godzin %2 minut %3 sekund</translation>
+ </message>
+ <message>
+ <source>%1 minutes %2 seconds</source>
+ <comment>Media time description</comment>
+ <translation>%1 minut %2 sekund</translation>
+ </message>
+ <message>
+ <source>%1 seconds</source>
+ <comment>Media time description</comment>
+ <translation>%1 sekund</translation>
+ </message>
+ <message>
+ <source>Inspect</source>
+ <comment>Inspect Element context menu item</comment>
+ <translation>Zwiedzaj</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>Brak ostatnich wyszukiwań</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>Ostatnie wyszukiwania</translation>
+ </message>
+ <message>
+ <source>Clear recent searches</source>
+ <comment>menu item in Recent Searches menu that empties menu&apos;s contents</comment>
+ <translation>Wyczyść ostatnie wyszukiwania</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <comment>Unknown filesize FTP directory listing item</comment>
+ <translation>Nieznany</translation>
+ </message>
+ <message>
+ <source>Web Inspector - %2</source>
+ <translation>Wizytator sieciowy - %2</translation>
+ </message>
+ <message>
+ <source>%1 (%2x%3 pixels)</source>
+ <comment>Title string for images</comment>
+ <translation>%1 (%2x%3 piksli)</translation>
+ </message>
+ <message>
+ <source>Bad HTTP request</source>
+ <translation>Niepoprawna komenda HTTP</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>To jest indeks wyszukiwawczy. Podaj słowa do wyszukania:</translation>
+ </message>
+ <message>
+ <source>Scroll here</source>
+ <translation>Przewiń tutaj</translation>
+ </message>
+ <message>
+ <source>Left edge</source>
+ <translation>Lewa krawędź</translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <translation>Do góry</translation>
+ </message>
+ <message>
+ <source>Right edge</source>
+ <translation>Prawa krawędź</translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <translation>W dół</translation>
+ </message>
+ <message>
+ <source>Page left</source>
+ <translation>Strona w lewo</translation>
+ </message>
+ <message>
+ <source>Page up</source>
+ <translation>Strona do góry</translation>
+ </message>
+ <message>
+ <source>Page right</source>
+ <translation>Strona w prawo</translation>
+ </message>
+ <message>
+ <source>Page down</source>
+ <translation>Strona w dół</translation>
+ </message>
+ <message>
+ <source>Scroll left</source>
+ <translation>Przewiń w lewo</translation>
+ </message>
+ <message>
+ <source>Scroll up</source>
+ <translation>Przewiń do góry</translation>
+ </message>
+ <message>
+ <source>Scroll right</source>
+ <translation>Przewiń w prawo</translation>
+ </message>
+ <message>
+ <source>Scroll down</source>
+ <translation>Przewiń w dół</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n file(s)</source>
+ <comment>number of chosen file</comment>
+ <translation>
+ <numerusform>%n plik</numerusform>
+ <numerusform>%n pliki</numerusform>
+ <numerusform>%n plików</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>JavaScript Alert - %1</source>
+ <translation>Ostrzeżenie JavaScript - %1</translation>
+ </message>
+ <message>
+ <source>JavaScript Confirm - %1</source>
+ <translation>Potwierdzenie JavaScript - %1</translation>
+ </message>
+ <message>
+ <source>JavaScript Prompt - %1</source>
+ <translation>Zachęta JavaScript - %1</translation>
+ </message>
+ <message>
+ <source>JavaScript Problem - %1</source>
+ <translation>Problem JavaScript - %1</translation>
+ </message>
+ <message>
+ <source>The script on this page appears to have a problem. Do you want to stop the script?</source>
+ <translation>Skrypt na tej stronie nie działa poprawnie. Czy chcesz przerwać ten skrypt?</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the next character</source>
+ <translation>Przesuń kursor do następnego znaku</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the previous character</source>
+ <translation>Przesuń kursor do poprzedniego znaku</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the next word</source>
+ <translation>Przesuń kursor do następnego słowa</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the previous word</source>
+ <translation>Przesuń kursor do poprzedniego słowa</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the next line</source>
+ <translation>Przesuń kursor do następnej linii</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the previous line</source>
+ <translation>Przesuń kursor do poprzedniej linii</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the start of the line</source>
+ <translation>Przesuń kursor do początku linii</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the end of the line</source>
+ <translation>Przesuń kursor do końca linii</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the start of the block</source>
+ <translation>Przesuń kursor do początku bloku</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the end of the block</source>
+ <translation>Przesuń kursor do końca bloku</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the start of the document</source>
+ <translation>Przesuń kursor do początku dokumentu</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the end of the document</source>
+ <translation>Przesuń kursor do końca dokumentu</translation>
+ </message>
+ <message>
+ <source>Select all</source>
+ <translation>Zaznacz wszystko</translation>
+ </message>
+ <message>
+ <source>Select to the next character</source>
+ <translation>Zaznacz do następnego znaku</translation>
+ </message>
+ <message>
+ <source>Select to the previous character</source>
+ <translation>Zaznacz do poprzedniego znaku</translation>
+ </message>
+ <message>
+ <source>Select to the next word</source>
+ <translation>Zaznacz do następnego słowa</translation>
+ </message>
+ <message>
+ <source>Select to the previous word</source>
+ <translation>Zaznacz do poprzedniego słowa</translation>
+ </message>
+ <message>
+ <source>Select to the next line</source>
+ <translation>Zaznacz do następnej linii</translation>
+ </message>
+ <message>
+ <source>Select to the previous line</source>
+ <translation>Zaznacz do poprzedniej linii</translation>
+ </message>
+ <message>
+ <source>Select to the start of the line</source>
+ <translation>Zaznacz do początku linii</translation>
+ </message>
+ <message>
+ <source>Select to the end of the line</source>
+ <translation>Zaznacz do końca linii</translation>
+ </message>
+ <message>
+ <source>Select to the start of the block</source>
+ <translation>Zaznacz do początku bloku</translation>
+ </message>
+ <message>
+ <source>Select to the end of the block</source>
+ <translation>Zaznacz do końca bloku</translation>
+ </message>
+ <message>
+ <source>Select to the start of the document</source>
+ <translation>Zaznacz do początku dokumentu</translation>
+ </message>
+ <message>
+ <source>Select to the end of the document</source>
+ <translation>Zaznacz do końca dokumentu</translation>
+ </message>
+ <message>
+ <source>Delete to the start of the word</source>
+ <translation>Skasuj do początku słowa</translation>
+ </message>
+ <message>
+ <source>Delete to the end of the word</source>
+ <translation>Skasuj do końca słowa</translation>
+ </message>
+ <message>
+ <source>Insert a new paragraph</source>
+ <translation>Wstaw nowy paragraf</translation>
+ </message>
+ <message>
+ <source>Insert a new line</source>
+ <translation>Wstaw nową linię</translation>
+ </message>
+ <message>
+ <source>Paste and Match Style</source>
+ <translation>Wklej i dopasuj styl</translation>
+ </message>
+ <message>
+ <source>Remove formatting</source>
+ <translation>Usuń formatowanie</translation>
+ </message>
+ <message>
+ <source>Strikethrough</source>
+ <translation>Przekreślenie</translation>
+ </message>
+ <message>
+ <source>Subscript</source>
+ <translation>Indeks dolny</translation>
+ </message>
+ <message>
+ <source>Superscript</source>
+ <translation>Indeks górny</translation>
+ </message>
+ <message>
+ <source>Insert Bulleted List</source>
+ <translation>Wstaw listę wypunktowaną</translation>
+ </message>
+ <message>
+ <source>Insert Numbered List</source>
+ <translation>Wstaw listę ponumerowaną</translation>
+ </message>
+ <message>
+ <source>Indent</source>
+ <translation>Zwiększ wcięcie</translation>
+ </message>
+ <message>
+ <source>Outdent</source>
+ <translation>Zmniejsz wcięcie</translation>
+ </message>
+ <message>
+ <source>Center</source>
+ <translation>Wyśrodkuj</translation>
+ </message>
+ <message>
+ <source>Justify</source>
+ <translation>Wyjustuj</translation>
+ </message>
+ <message>
+ <source>Align Left</source>
+ <translation>Wyrównaj do lewej</translation>
+ </message>
+ <message>
+ <source>Align Right</source>
+ <translation>Wyrównaj do prawej</translation>
+ </message>
+ </context>
+ <context>
+ <name>QWhatsThisAction</name>
+ <message>
+ <source>What&apos;s This?</source>
+ <translation>Co to jest?</translation>
+ </message>
+ </context>
+ <context>
+ <name>QWidget</name>
+ <message>
+ <source>*</source>
+ <translation>*</translation>
+ </message>
+ </context>
+ <context>
+ <name>QWizard</name>
+ <message>
+ <source>Cancel</source>
+ <translation>Anuluj</translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation>Pomoc</translation>
+ </message>
+ <message>
+ <source>&lt; &amp;Back</source>
+ <translation>&lt; &amp;Wstecz</translation>
+ </message>
+ <message>
+ <source>&amp;Finish</source>
+ <translation>&amp;Zakończ</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>&amp;Pomoc</translation>
+ </message>
+ <message>
+ <source>Go Back</source>
+ <translation>Wróć</translation>
+ </message>
+ <message>
+ <source>Continue</source>
+ <translation>Kontynuuj</translation>
+ </message>
+ <message>
+ <source>Commit</source>
+ <translation>Dokonaj</translation>
+ </message>
+ <message>
+ <source>Done</source>
+ <translation>Wykonano</translation>
+ </message>
+ <message>
+ <source>&amp;Next</source>
+ <translation>&amp;Dalej</translation>
+ </message>
+ <message>
+ <source>&amp;Next &gt;</source>
+ <translation>&amp;Dalej &gt;</translation>
+ </message>
+ </context>
+ <context>
+ <name>QWorkspace</name>
+ <message>
+ <source>&amp;Restore</source>
+ <translation>&amp;Przywróć</translation>
+ </message>
+ <message>
+ <source>&amp;Move</source>
+ <translation>&amp;Przenieś</translation>
+ </message>
+ <message>
+ <source>&amp;Size</source>
+ <translation>&amp;Rozmiar</translation>
+ </message>
+ <message>
+ <source>Mi&amp;nimize</source>
+ <translation>Zmi&amp;nimalizuj</translation>
+ </message>
+ <message>
+ <source>Ma&amp;ximize</source>
+ <translation>Zma&amp;ksymalizuj</translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation>&amp;Zamknij</translation>
+ </message>
+ <message>
+ <source>Stay on &amp;Top</source>
+ <translation>Pozostaw na &amp;wierzchu</translation>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation>Zminimalizuj</translation>
+ </message>
+ <message>
+ <source>Restore Down</source>
+ <translation>Przywróć pod spód</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Zamknij</translation>
+ </message>
+ <message>
+ <source>Sh&amp;ade</source>
+ <translation>&amp;Zwiń</translation>
+ </message>
+ <message>
+ <source>%1 - [%2]</source>
+ <translation>%1 - [%2]</translation>
+ </message>
+ <message>
+ <source>&amp;Unshade</source>
+ <translation>R&amp;ozwiń</translation>
+ </message>
+ </context>
+ <context>
+ <name>QXml</name>
+ <message>
+ <source>no error occurred</source>
+ <translation>nie pojawił się żaden błąd</translation>
+ </message>
+ <message>
+ <source>error triggered by consumer</source>
+ <translation>błąd wywołany przez konsumenta</translation>
+ </message>
+ <message>
+ <source>unexpected end of file</source>
+ <translation>nieoczekiwany koniec pliku</translation>
+ </message>
+ <message>
+ <source>more than one document type definition</source>
+ <translation>więcej niż jedna definicja typu dokumentu</translation>
+ </message>
+ <message>
+ <source>error occurred while parsing element</source>
+ <translation>wystąpił błąd podczas parsowania elementu</translation>
+ </message>
+ <message>
+ <source>tag mismatch</source>
+ <translation>niepoprawny tag</translation>
+ </message>
+ <message>
+ <source>error occurred while parsing content</source>
+ <translation>wystąpił błąd podczas parsowania zawartości</translation>
+ </message>
+ <message>
+ <source>unexpected character</source>
+ <translation>nieoczekiwany znak</translation>
+ </message>
+ <message>
+ <source>invalid name for processing instruction</source>
+ <translation>niepoprawna nazwa dla instrukcji przetwarzającej</translation>
+ </message>
+ <message>
+ <source>version expected while reading the XML declaration</source>
+ <translation>oczekiwana wersja podczas czytania deklaracji XML</translation>
+ </message>
+ <message>
+ <source>wrong value for standalone declaration</source>
+ <translation>błędna wartość dla deklaracji &quot;standalone&quot;</translation>
+ </message>
+ <message>
+ <source>error occurred while parsing document type definition</source>
+ <translation>wystąpił błąd podczas parsowania typu definicji dokumentu</translation>
+ </message>
+ <message>
+ <source>letter is expected</source>
+ <translation>oczekiwana jest litera</translation>
+ </message>
+ <message>
+ <source>error occurred while parsing comment</source>
+ <translation>wystąpił błąd podczas parsowania komentarza</translation>
+ </message>
+ <message>
+ <source>error occurred while parsing reference</source>
+ <translation>wystąpił błąd podczas parsowania odwołania</translation>
+ </message>
+ <message>
+ <source>internal general entity reference not allowed in DTD</source>
+ <translation>odwołanie do jednostki ogólnej wewnętrznej nie dozwolone w DTD</translation>
+ </message>
+ <message>
+ <source>external parsed general entity reference not allowed in attribute value</source>
+ <translation>odwołanie do jednostki ogólnej zewnętrznie przetworzonej nie dozwolone dla wartości atrybutu </translation>
+ </message>
+ <message>
+ <source>external parsed general entity reference not allowed in DTD</source>
+ <translation>odwołanie do jednostki ogólnej zewnętrznie przetworzonej nie dozwolone w DTD</translation>
+ </message>
+ <message>
+ <source>unparsed entity reference in wrong context</source>
+ <translation>odwołanie do jednostki nieprzetworzonej w złym kontekście</translation>
+ </message>
+ <message>
+ <source>recursive entities</source>
+ <translation>jednostki rekurencyjne</translation>
+ </message>
+ <message>
+ <source>error in the text declaration of an external entity</source>
+ <translation>błąd w deklaracji &quot;text&quot; zewnętrznej jednostki</translation>
+ </message>
+ <message>
+ <source>encoding declaration or standalone declaration expected while reading the XML declaration</source>
+ <translation>oczekiwano deklaracji &quot;encoding&quot; lub &quot;standalone&quot; podczas odczytywania deklaracji XML</translation>
+ </message>
+ <message>
+ <source>standalone declaration expected while reading the XML declaration</source>
+ <translation>deklaracja &quot;standalone&quot; oczekiwana podczas czytania deklaracji XML</translation>
+ </message>
+ </context>
+ <context>
+ <name>QXmlPatternistCLI</name>
+ <message>
+ <source>Warning in %1, at line %2, column %3: %4</source>
+ <translation>Ostrzeżenie w %1, wiersz %2, kolumna %3: %4</translation>
+ </message>
+ <message>
+ <source>Warning in %1: %2</source>
+ <translation>Ostrzeżenie w %1: %2</translation>
+ </message>
+ <message>
+ <source>Unknown location</source>
+ <translation>Nieznana lokalizacja</translation>
+ </message>
+ <message>
+ <source>Error %1 in %2, at line %3, column %4: %5</source>
+ <translation>Błąd %1 w %2, wiersz %3, kolumna %4: %5</translation>
+ </message>
+ <message>
+ <source>Error %1 in %2: %3</source>
+ <translation>Błąd %1 w %2: %3</translation>
+ </message>
+ </context>
+ <context>
+ <name>QXmlStream</name>
+ <message>
+ <source>Extra content at end of document.</source>
+ <translation>Dodatkowa treść na końcu dokumentu.</translation>
+ </message>
+ <message>
+ <source>Invalid entity value.</source>
+ <translation>Niepoprawna wartość jednostki.</translation>
+ </message>
+ <message>
+ <source>Invalid XML character.</source>
+ <translation>Niepoprawny znak XML.</translation>
+ </message>
+ <message>
+ <source>Sequence &apos;]]&gt;&apos; not allowed in content.</source>
+ <translation>Ciąg &apos;]]&gt;&apos; niedozwolony w treści.</translation>
+ </message>
+ <message>
+ <source>Namespace prefix &apos;%1&apos; not declared</source>
+ <translation>Przedrostek przestrzeni nazw &apos;%1&apos; nie został zadeklarowany</translation>
+ </message>
+ <message>
+ <source>Attribute redefined.</source>
+ <translation>Atrybut zdefiniowany wielokrotnie.</translation>
+ </message>
+ <message>
+ <source>Unexpected character &apos;%1&apos; in public id literal.</source>
+ <translation>Nieoczekiwany znak &apos;%1&apos; w publicznej stałej znakowej.</translation>
+ </message>
+ <message>
+ <source>Invalid XML version string.</source>
+ <translation>Niepoprawna wersja XML.</translation>
+ </message>
+ <message>
+ <source>Unsupported XML version.</source>
+ <translation>Nieobsługiwana wersja XML.</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid encoding name.</source>
+ <translation>%1 jest niepoprawną nazwą kodowania.</translation>
+ </message>
+ <message>
+ <source>Encoding %1 is unsupported</source>
+ <translation>Kodowanie %1 jest nieobsługiwane</translation>
+ </message>
+ <message>
+ <source>Standalone accepts only yes or no.</source>
+ <translation>Tylko wartości &quot;tak&quot; lub &quot;nie&quot; są akceptowane przez &quot;standalone&quot;.</translation>
+ </message>
+ <message>
+ <source>Invalid attribute in XML declaration.</source>
+ <translation>Niepoprawny atrybut w deklaracji XML.</translation>
+ </message>
+ <message>
+ <source>Premature end of document.</source>
+ <translation>Przedwczesne zakończenie dokumentu.</translation>
+ </message>
+ <message>
+ <source>Invalid document.</source>
+ <translation>Niepoprawny dokument.</translation>
+ </message>
+ <message>
+ <source>Expected </source>
+ <translation>Oczekiwano </translation>
+ </message>
+ <message>
+ <source>, but got &apos;</source>
+ <translation>, ale otrzymano &apos;</translation>
+ </message>
+ <message>
+ <source>Unexpected &apos;</source>
+ <translation>Nieoczekiwany &apos;</translation>
+ </message>
+ <message>
+ <source>Expected character data.</source>
+ <translation>Oczekiwana dana znakowa.</translation>
+ </message>
+ <message>
+ <source>Recursive entity detected.</source>
+ <translation>Wykryto jednostkę rekurencyjną.</translation>
+ </message>
+ <message>
+ <source>Start tag expected.</source>
+ <translation>Oczekiwano tagu start.</translation>
+ </message>
+ <message>
+ <source>XML declaration not at start of document.</source>
+ <translation>Deklaracja XML nie jest na początku dokumentu.</translation>
+ </message>
+ <message>
+ <source>NDATA in parameter entity declaration.</source>
+ <translation>NDATA w deklaracji parametru obiektu.</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid processing instruction name.</source>
+ <translation>%1 jest niepoprawną nazwą instrukcji przetwarzającej.</translation>
+ </message>
+ <message>
+ <source>Invalid processing instruction name.</source>
+ <translation>Niepoprawna nazwa instrukcji przetwarzającej.</translation>
+ </message>
+ <message>
+ <source>Illegal namespace declaration.</source>
+ <translation>Niepoprawna deklaracja przestrzeni nazw.</translation>
+ </message>
+ <message>
+ <source>Invalid XML name.</source>
+ <translation>Niepoprawna nazwa XML.</translation>
+ </message>
+ <message>
+ <source>Opening and ending tag mismatch.</source>
+ <translation>Niezgodne tagi początku i końca.</translation>
+ </message>
+ <message>
+ <source>Reference to unparsed entity &apos;%1&apos;.</source>
+ <translation>Odwołanie do nieprzetworzonej jednostki &apos;%1&apos;.</translation>
+ </message>
+ <message>
+ <source>Entity &apos;%1&apos; not declared.</source>
+ <translation>Jednostka &apos;%1&apos; nie zadeklarowana.</translation>
+ </message>
+ <message>
+ <source>Reference to external entity &apos;%1&apos; in attribute value.</source>
+ <translation>Odwołanie do zewnętrznej jednostki &apos;%1&apos; jako wartość atrybutu.</translation>
+ </message>
+ <message>
+ <source>Invalid character reference.</source>
+ <translation>Niepoprawny znak odwołania.</translation>
+ </message>
+ <message>
+ <source>Encountered incorrectly encoded content.</source>
+ <translation>Natrafiono na niepoprawnie zakodowaną treść.</translation>
+ </message>
+ <message>
+ <source>The standalone pseudo attribute must appear after the encoding.</source>
+ <translation>Pseudo atrybut &quot;standalone&quot; musi pojawić się po &quot;encoding&quot;.</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid PUBLIC identifier.</source>
+ <translation>%1 jest niepoprawnym publicznym identyfikatorem.</translation>
+ </message>
+ </context>
+ <context>
+ <name>QtXmlPatterns</name>
+ <message>
+ <source>At least one component must be present.</source>
+ <translation>Przynajmniej jeden komponent musi być obecny.</translation>
+ </message>
+ <message>
+ <source>%1 is not a valid value of type %2.</source>
+ <translation>%1 nie jest poprawną wartością dla typu %2.</translation>
+ </message>
+ <message>
+ <source>When casting to %1 from %2, the source value cannot be %3.</source>
+ <translation>W rzutowaniu %1 na %2 wartość źródłowa nie może być %3.</translation>
+ </message>
+ <message>
+ <source>Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values.</source>
+ <translation>Efektywna wartość boolowska (EBV) nie może być obliczona dla sekwencji zawierającej dwie lub więcej wartości atomowe.</translation>
+ </message>
+ <message>
+ <source>The data of a processing instruction cannot contain the string %1</source>
+ <translation>Dane instrukcji przetwarzania nie mogą zawierać ciągu %1</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid %2</source>
+ <translation>%1 jest niepoprawnym %2</translation>
+ </message>
+ <message>
+ <source>%1 is not a valid XML 1.0 character.</source>
+ <translation>%1 nie jest poprawnym znakiem XML 1.0.</translation>
+ </message>
+ <message>
+ <source>%1 was called.</source>
+ <translation>Wywołano %1.</translation>
+ </message>
+ <message>
+ <source>In the replacement string, %1 must be followed by at least one digit when not escaped.</source>
+ <translation>W ciągu zastępczym, po %1 musi następować przynajmniej jedna cyfra</translation>
+ </message>
+ <message>
+ <source>In the replacement string, %1 can only be used to escape itself or %2, not %3</source>
+ <translation>W ciągu zastępczym, %1 może być użyte tylko do zabezpieczenia samej siebie lub %2, nigdy %3</translation>
+ </message>
+ <message>
+ <source>%1 matches newline characters</source>
+ <translation>%1 dopasowało znak nowej linii</translation>
+ </message>
+ <message>
+ <source>Matches are case insensitive</source>
+ <translation>Dopasowania uwzględniają wielkość liter</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid regular expression pattern: %2</source>
+ <translation>%1 jest niepoprawnym wzorcem wyrażenia regularnego: %2</translation>
+ </message>
+ <message>
+ <source>It will not be possible to retrieve %1.</source>
+ <translation>Nie będzie można odzyskać %1.</translation>
+ </message>
+ <message>
+ <source>The default collection is undefined</source>
+ <translation>Domyślna kolekcja jest niezdefiniowana</translation>
+ </message>
+ <message>
+ <source>%1 cannot be retrieved</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The item %1 did not match the required type %2.</source>
+ <translation>Element %1 nie został dopasowany do wymaganego typu %2.</translation>
+ </message>
+ <message>
+ <source>%1 is an unknown schema type.</source>
+ <translation>%1 jest nieznanym typem schematu.</translation>
+ </message>
+ <message>
+ <source>A template with name %1 has already been declared.</source>
+ <translation>Szablon o nazwie %1 został już zadeklarowany.</translation>
+ </message>
+ <message>
+ <source>Only one %1 declaration can occur in the query prolog.</source>
+ <translation>Tylko jedna deklaracja %1 może się pojawić w prologu zapytania.</translation>
+ </message>
+ <message>
+ <source>The initialization of variable %1 depends on itself</source>
+ <translation>Inicjalizacja zmiennej %1 zależy od niej samej</translation>
+ </message>
+ <message>
+ <source>The variable %1 is unused</source>
+ <translation>Zmienna %1 jest nieużywana</translation>
+ </message>
+ <message>
+ <source>Version %1 is not supported. The supported XQuery version is 1.0.</source>
+ <translation>Wersja %1 nie jest obsługiwana. Obsługiwaną wersją XQuery jest wersja 1.0.</translation>
+ </message>
+ <message>
+ <source>No function with signature %1 is available</source>
+ <translation>Żadna funkcja w postaci %1 nie jest dostępna</translation>
+ </message>
+ <message>
+ <source>It is not possible to redeclare prefix %1.</source>
+ <translation>Nie jest możliwe ponowne zadeklarowanie przedrostka %1.</translation>
+ </message>
+ <message>
+ <source>Prefix %1 is already declared in the prolog.</source>
+ <translation>Przedrostek %1 jest już zadeklarowany w prologu.</translation>
+ </message>
+ <message>
+ <source>The name of an option must have a prefix. There is no default namespace for options.</source>
+ <translation>Nazwa opcji musi posiadać przedrostek. Nie istnieje domyślna przestrzeń nazw dla opcji.</translation>
+ </message>
+ <message>
+ <source>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</source>
+ <translation>Cecha &quot;Import schematu&quot; nie jest obsługiwana, dlatego deklaracje %1 nie mogą pojawić.</translation>
+ </message>
+ <message>
+ <source>The target namespace of a %1 cannot be empty.</source>
+ <translation>Docelowa przestrzeń nazw dla %1 nie może być pusta.</translation>
+ </message>
+ <message>
+ <source>The module import feature is not supported</source>
+ <translation>Cecha &quot;Import modułu&quot; nie jest obsługiwana</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>Przestrzeń nazw dla funkcji zdefiniowanej przez użytkownika w module bibliotecznym musi odpowiadać przestrzeni nazw modułu. Powinna to być %1 zamiast %2</translation>
+ </message>
+ <message>
+ <source>A function already exists with the signature %1.</source>
+ <translation>Funkcja w postaci %1 już istnieje.</translation>
+ </message>
+ <message>
+ <source>No external functions are supported. All supported functions can be used directly, without first declaring them as external</source>
+ <translation>Zewnętrzne funkcje nie są obsługiwane. Wszystkie obsługiwane funkcje mogą być używane bezpośrednio, bez ich uprzedniego deklarowania jako zewnętrzne</translation>
+ </message>
+ <message>
+ <source>The %1-axis is unsupported in XQuery</source>
+ <translation>Oś %1 nie jest obsługiwana w XQuery</translation>
+ </message>
+ <message>
+ <source>The namespace URI cannot be the empty string when binding to a prefix, %1.</source>
+ <translation>Przestrzeń nazw URI nie może być pustym ciągiem w powiązaniu z przedrostkiem, %1.</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid namespace URI.</source>
+ <translation>%1 jest niepoprawną przestrzenią nazw URI.</translation>
+ </message>
+ <message>
+ <source>It is not possible to bind to the prefix %1</source>
+ <translation>Nie jest możliwe powiązanie z przedrostkiem %1</translation>
+ </message>
+ <message>
+ <source>Two namespace declaration attributes have the same name: %1.</source>
+ <translation>Atrybuty deklaracji przestrzeni nazw mają tą samą nazwę: %1.</translation>
+ </message>
+ <message>
+ <source>The namespace URI must be a constant and cannot use enclosed expressions.</source>
+ <translation>Przestrzeń nazw URI nie może być stałą i nie może używać zawartych w niej wyrażeń.</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 nie jest wewnątrz zakresu deklaracji atrybutów. Zwróć uwagę że importowanie schematów nie jest obsługiwane.</translation>
+ </message>
+ <message>
+ <source>empty</source>
+ <translation>pusty</translation>
+ </message>
+ <message>
+ <source>zero or one</source>
+ <translation>zero lub jeden</translation>
+ </message>
+ <message>
+ <source>exactly one</source>
+ <translation>dokładnie jeden</translation>
+ </message>
+ <message>
+ <source>one or more</source>
+ <translation>jeden lub więcej</translation>
+ </message>
+ <message>
+ <source>zero or more</source>
+ <translation>zero lub więcej</translation>
+ </message>
+ <message>
+ <source>The focus is undefined.</source>
+ <translation>Focus jest niezdefiniowany.</translation>
+ </message>
+ <message>
+ <source>An attribute by name %1 has already been created.</source>
+ <translation>Atrybut o nazwie %1 został już utworzony.</translation>
+ </message>
+ <message>
+ <source>Network timeout.</source>
+ <translation>Przekroczony czas połączenia.</translation>
+ </message>
+ <message>
+ <source>Element %1 can&apos;t be serialized because it appears outside the document element.</source>
+ <translation>Element %1 nie może być zserializowany ponieważ pojawił się poza elementem &quot;document&quot;.</translation>
+ </message>
+ <message>
+ <source>Year %1 is invalid because it begins with %2.</source>
+ <translation>Rok %1 jest niepoprawny ponieważ rozpoczyna się: %2.</translation>
+ </message>
+ <message>
+ <source>Day %1 is outside the range %2..%3.</source>
+ <translation>Dzień %1 jest poza zakresem %2..%3.</translation>
+ </message>
+ <message>
+ <source>Month %1 is outside the range %2..%3.</source>
+ <translation>Miesiąc %1 jest poza zakresem %2..%3.</translation>
+ </message>
+ <message>
+ <source>Overflow: Can&apos;t represent date %1.</source>
+ <translation>Przepełnienie: Nie można wyrazić daty %1.</translation>
+ </message>
+ <message>
+ <source>Day %1 is invalid for month %2.</source>
+ <translation>Dzień %1 jest niepoprawny dla miesiąca %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>Czas 24:%1:%2:%3 jest niepoprawny. Godzina jest 24, ale minuty, sekundy i milisekundy nie są równocześnie zerami;</translation>
+ </message>
+ <message>
+ <source>Time %1:%2:%3.%4 is invalid.</source>
+ <translation>Czas %1:%2:%3.%4 jest niepoprawny.</translation>
+ </message>
+ <message>
+ <source>Overflow: Date can&apos;t be represented.</source>
+ <translation>Przepełnienie: Data nie może być wyrażona.</translation>
+ </message>
+ <message>
+ <source>At least one time component must appear after the %1-delimiter.</source>
+ <translation>Przynajmniej jeden komponent musi wystąpić po nawiasie %1.</translation>
+ </message>
+ <message>
+ <source>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</source>
+ <translation>Dzielenie wartości typu %1 przez %2 (typ nienumeryczny) jest niedozwolone.</translation>
+ </message>
+ <message>
+ <source>Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed.</source>
+ <translation>Dzielenie wartości typu %1 przez %2 lub %3 (plus lub minus zero) jest niedozwolone.</translation>
+ </message>
+ <message>
+ <source>Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed.</source>
+ <translation>Mnożenie wartości typu %1 przez %2 lub %3 (plus lub minus nieskończoność) jest niedozwolone.</translation>
+ </message>
+ <message>
+ <source>A value of type %1 cannot have an Effective Boolean Value.</source>
+ <translation>Wartość typu %1 nie może posiadać efektywnej wartości boolowskiej (EBV).</translation>
+ </message>
+ <message>
+ <source>Value %1 of type %2 exceeds maximum (%3).</source>
+ <translation>Wartość %1 typu %2 przekracza maksimum (%3).</translation>
+ </message>
+ <message>
+ <source>Value %1 of type %2 is below minimum (%3).</source>
+ <translation>Wartość %1 typu %2 jest poniżej 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>Wartość typu %1 musi zawierać parzystą liczbę cyfr. Wartość %2 nie zawiera.</translation>
+ </message>
+ <message>
+ <source>%1 is not valid as a value of type %2.</source>
+ <translation>Wartość %1 nie jest poprawna jako wartość typu %2.</translation>
+ </message>
+ <message>
+ <source>Operator %1 cannot be used on type %2.</source>
+ <translation>Operator %1 nie może być użyty dla typu %2.</translation>
+ </message>
+ <message>
+ <source>Operator %1 cannot be used on atomic values of type %2 and %3.</source>
+ <translation>Operator %1 nie może być użyty dla atomowych wartości typu %2 i %3.</translation>
+ </message>
+ <message>
+ <source>The namespace URI in the name for a computed attribute cannot be %1.</source>
+ <translation>Przestrzeń nazw URI nie może być %1 w nazwie dla obliczonego atrybutu.</translation>
+ </message>
+ <message>
+ <source>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</source>
+ <translation>Nazwa dla wyliczonego atrybutu nie może zawierać przestrzeni nazw URI %1 z lokalną nazwą %2.</translation>
+ </message>
+ <message>
+ <source>Type error in cast, expected %1, received %2.</source>
+ <translation>Błąd typów w rzutowaniu: spodziewano się %1, otrzymano %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>Podczas rzutowania na %1 lub na typ pochodny, wartość źródłowa musi być tego samego typu lub musi być zapisem tekstowym. Typ %2 nie jest dozwolony.</translation>
+ </message>
+ <message>
+ <source>A comment cannot contain %1</source>
+ <translation>Komentarz nie może zawierać %1</translation>
+ </message>
+ <message>
+ <source>A comment cannot end with a %1.</source>
+ <translation>Komentarz nie może kończyć się: %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>Węzeł &quot;attribute&quot; nie może być podelementem węzła &quot;document&quot;. Dlatego atrybut %1 jest w złym miejscu.</translation>
+ </message>
+ <message>
+ <source>A library module cannot be evaluated directly. It must be imported from a main module.</source>
+ <translation>Moduł biblioteki nie może być bezpośrednio oceniony. On musi być zaimportowany z głównego modułu.</translation>
+ </message>
+ <message>
+ <source>No template by name %1 exists.</source>
+ <translation>Szablon o nazwie %1 nie istnieje.</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>Wartość typu %1 nie może być predykatem. Predykat musi być typu liczbowego lub Efektywną Wartość Logiczną.</translation>
+ </message>
+ <message>
+ <source>A positional predicate must evaluate to a single numeric value.</source>
+ <translation>Wynikiem predykatu pozycyjnego musi być pojedyncza wartość liczbowa.</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>Docelowa nazwa w instrukcji przetwarzania nie może być %1 w żadnej kombinacji wielkich i małych liter. Dlatego nazwa %2 jest niepoprawna.</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 nie jest poprawną nazwą docelową w instrukcji przetwarzania. Nazwa musi być wartością %2, np. %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>Ostatni krok w ścieżce musi zawierać albo węzły albo wartości atomowe. Nie może zawierać obu jednocześnie.</translation>
+ </message>
+ <message>
+ <source>No namespace binding exists for the prefix %1</source>
+ <translation>Żadna przestrzeń nazw nie jest powiązana z przedrostkiem %1</translation>
+ </message>
+ <message>
+ <source>No namespace binding exists for the prefix %1 in %2</source>
+ <translation>Żadna przestrzeń nazw nie jest powiązana z przedrostkiem %1 w %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>Pierwszy argument w %1 nie może być typu %2. Musi on być typu liczbowego: xs:yearMonthDuration lub 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>Pierwszy argument w %1 nie może być typu %2. Musi on być typu: %3, %4 lub %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>Drugi argument w %1 nie może być typu %2. Musi on być typu: %3, %4 lub %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>Jeśli oba argumenty mają przesunięcia strefowe, muszą one być takie same. %1 i %2 nie są takie same.</translation>
+ </message>
+ <message>
+ <source>%1 must be followed by %2 or %3, not at the end of the replacement string.</source>
+ <translation>Po %1 musi następować %2 lub %3, lecz nie na końcu zastępczego ciągu.</translation>
+ </message>
+ <message>
+ <source>%1 and %2 match the start and end of a line.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Whitespace characters are removed, except when they appear in character classes</source>
+ <translation>Spacje są usuwane z wyjątkiem kiedy pojawią się w klasach znakowych</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid flag for regular expressions. Valid flags are:</source>
+ <translation>%1 jest niepoprawną flagą dla wyrażeń regularnych. Poprawnymi flagami są:</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>Jeśli pierwszy argument jest pustą sekwencją lub zerowej długości ciągiem (przy braku przestrzeni nazw), przedrostek nie może wystąpić. Podano przedrostek %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>Znormalizowana forma %1 nie jest obsługiwana. Obsługiwanymi formami są: %2, %3, %4 i %5 oraz pusta forma (brak normalizacji).</translation>
+ </message>
+ <message>
+ <source>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</source>
+ <translation>Przesunięcie strefowe musi być w zakresie %1..%2 włącznie. %3 jest poza tym zakresem.</translation>
+ </message>
+ <message>
+ <source>Required cardinality is %1; got cardinality %2.</source>
+ <translation>Wymagana liczność wynosi %1; otrzymano %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>Enkodowanie %1 jest niepoprawne. Może ono zawierać jedynie znaki alfabetu łacińskiego, nie może zawierać spacji i musi być dopasowane do wyrażenia regularnego %2.</translation>
+ </message>
+ <message>
+ <source>The keyword %1 cannot occur with any other mode name.</source>
+ <translation>Słowo kluczowe %1 nie może wystąpić z inną nazwą trybu.</translation>
+ </message>
+ <message>
+ <source>No variable with name %1 exists</source>
+ <translation>Zmienna o nazwie %1 nie istnieje</translation>
+ </message>
+ <message>
+ <source>The value of attribute %1 must be of type %2, which %3 isn&apos;t.</source>
+ <translation>Wartość atrybutu %1 musi być typu %2, którym nie jest %3.</translation>
+ </message>
+ <message>
+ <source>The prefix %1 cannot be bound. By default, it is already bound to the namespace %2.</source>
+ <translation>Przedrostek %1 nie może być powiązany. Jest on domyślnie powiązany z przestrzenią nazw %2.</translation>
+ </message>
+ <message>
+ <source>A variable with name %1 has already been declared.</source>
+ <translation>Zmienna o nazwie %1 została już zadeklarowana.</translation>
+ </message>
+ <message>
+ <source>No value is available for the external variable with name %1.</source>
+ <translation>Brak wartości dla zewnętrznej zmiennej o nazwie %1.</translation>
+ </message>
+ <message>
+ <source>A stylesheet function must have a prefixed name.</source>
+ <translation>Funkcja arkusza stylu musi zawierać nazwę z przedrostkiem.</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>Przestrzeń nazw %1 jest zarezerwowana, dlatego funkcje zdefiniowane przez użytkownika nie mogą jej użyć. Spróbuj predefiniowany przedrostek %2, który istnieje w takich przypadkach.</translation>
+ </message>
+ <message>
+ <source>An argument with name %1 has already been declared. Every argument name must be unique.</source>
+ <translation>Argument o nazwie %1 został już zadeklarowany. Każda nazwa argumentu musi być unikatowa.</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>Gdy funkcja %1 jest wykorzystana do dopasowania wewnątrz wzorca, jej argument musi być referencją do zmiennej lub napisem.</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>We wzorze XSL-T pierwszy argument w funkcji %1 musi być stałą znakową podczas dopasowywania.</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>We wzorze XSL-T pierwszy argument w funkcji %1 musi być stałą znakową lub nazwą zmiennej podczas dopasowywania.</translation>
+ </message>
+ <message>
+ <source>In an XSL-T pattern, function %1 cannot have a third argument.</source>
+ <translation>We wzorze XSL-T funkcja %1 nie może zawierać trzeciego argumentu.</translation>
+ </message>
+ <message>
+ <source>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</source>
+ <translation>We wzorze XSL-T tylko funkcje %1 i %2 mogą być użyte do dopasowania, zaś funkcja %3 nie.</translation>
+ </message>
+ <message>
+ <source>In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can.</source>
+ <translation>We wzorze XSL-T tylko osie %2 i %3 mogą być użyte, zaś oś %1 nie.</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid template mode name.</source>
+ <translation>%1 nie jest poprawną nazwa trybu szablonu.</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>Nazwa zmiennej powiązanej w wyrażeniu &quot;for&quot; musi być inna od zmiennej pozycjonującej. W związku z tym dwie zmienne o nazwie %1 kolidują ze sobą.</translation>
+ </message>
+ <message>
+ <source>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</source>
+ <translation>Cecha &quot;Walidacja schematu&quot; nie jest obsługiwana. Dlatego też wyrażenia %1 nie mogą być użyte.</translation>
+ </message>
+ <message>
+ <source>None of the pragma expressions are supported. Therefore, a fallback expression must be present</source>
+ <translation>Wyrażenia &quot;pragma&quot; nie są obsługiwane. Dlatego musi wystąpić wyrażenie zastępcze</translation>
+ </message>
+ <message>
+ <source>Each name of a template parameter must be unique; %1 is duplicated.</source>
+ <translation>Każda nazwa parametru szablonu musi być unikatowa; %1 się powtarza.</translation>
+ </message>
+ <message>
+ <source>No function with name %1 is available.</source>
+ <translation>Żadna funkcja o nazwie %1 nie jest dostępna.</translation>
+ </message>
+ <message>
+ <source>%1 is not a valid numeric literal.</source>
+ <translation>%1 nie jest poprawnym zapisem liczbowym.</translation>
+ </message>
+ <message>
+ <source>W3C XML Schema identity constraint selector</source>
+ <translation>Selektor narzucenia niepowtarzalności W3C XML Schema</translation>
+ </message>
+ <message>
+ <source>W3C XML Schema identity constraint field</source>
+ <translation>Pole narzucenia niepowtarzalności W3C XML Schema</translation>
+ </message>
+ <message>
+ <source>A construct was encountered which is disallowed in the current language(%1).</source>
+ <translation>Wystąpiła konstrukcja która jest niedozwolona w bieżącym języku (%1).</translation>
+ </message>
+ <message>
+ <source>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
+ <translation>Przestrzeń nazw %1 może być jedynie powiązana z %2 (w przeciwnym wypadku jest ona domyślnie zadeklarowana).</translation>
+ </message>
+ <message>
+ <source>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
+ <translation>Przedrostek %1 może być jedynie powiązany z %2 (w przeciwnym wypadku jest on domyślnie zadeklarowany).</translation>
+ </message>
+ <message>
+ <source>An attribute with name %1 has already appeared on this element.</source>
+ <translation>Atrybut o nazwie %1 już się pojawił w tym elemencie.</translation>
+ </message>
+ <message>
+ <source>A direct element constructor is not well-formed. %1 is ended with %2.</source>
+ <translation>Konstruktor elementu bezpośredniego nie jest dobrze sformatowany. %1 jest zakończony %2.</translation>
+ </message>
+ <message>
+ <source>The name %1 does not refer to any schema type.</source>
+ <translation>Nazwa %1 nie odpowiada żadnemu typowi schematu.</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 jest typem złożonym. Rzutowanie na typy złożone nie jest możliwe. Jednakże rzutowanie na typy atomowe np.: %2 jest dozwolone.</translation>
+ </message>
+ <message>
+ <source>%1 is not an atomic type. Casting is only possible to atomic types.</source>
+ <translation>%1 nie jest typem atomowym. Możliwe jest rzutowanie tylko na typy atomowe.</translation>
+ </message>
+ <message>
+ <source>%1 is not a valid name for a processing-instruction.</source>
+ <translation>%1 nie jest poprawną nazwą dla instrukcji przetwarzającej.</translation>
+ </message>
+ <message>
+ <source>The name of an extension expression must be in a namespace.</source>
+ <translation>Nazwa dodatkowego wyrażenia musi znajdować sie w przestrzeni nazw.</translation>
+ </message>
+ <message>
+ <source>Required type is %1, but %2 was found.</source>
+ <translation>Odnaleziono typ %2, lecz wymaganym typem jest %1.</translation>
+ </message>
+ <message>
+ <source>Promoting %1 to %2 may cause loss of precision.</source>
+ <translation>Przekształcenie %1 do %2 może spowodować utratę precyzji.</translation>
+ </message>
+ <message>
+ <source>It&apos;s not possible to add attributes after any other kind of node.</source>
+ <translation>Dodanie atrybutu poza węzłami nie jest możliwe.</translation>
+ </message>
+ <message>
+ <source>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</source>
+ <translation>Obsługiwane jest jedynie &quot;Unicode Codepoint Collation&quot; (%1), %2 nie jest obsługiwane.</translation>
+ </message>
+ <message>
+ <source>Integer division (%1) by zero (%2) is undefined.</source>
+ <translation>Dzielenie w dziedzinie liczb całkowitych (%1) przez zero (%2) jest niezdefiniowane.</translation>
+ </message>
+ <message>
+ <source>Division (%1) by zero (%2) is undefined.</source>
+ <translation>Dzielenie (%1) przez zero (%2) jest niezdefiniowane.</translation>
+ </message>
+ <message>
+ <source>Modulus division (%1) by zero (%2) is undefined.</source>
+ <translation>Dzielenie modulo (%1) przez zero (%2) jest niezdefiniowane.</translation>
+ </message>
+ <message numerus="yes">
+ <source>%1 takes at most %n argument(s). %2 is therefore invalid.</source>
+ <translation>
+ <numerusform>%1 przyjmuje co najwyżej %n argument. %2 jest dlatego niepoprawne.</numerusform>
+ <numerusform>%1 przyjmuje co najwyżej %n argumenty. %2 jest dlatego niepoprawne.</numerusform>
+ <numerusform>%1 przyjmuje co najwyżej %n argumentów. %2 jest dlatego niepoprawne.</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%1 requires at least %n argument(s). %2 is therefore invalid.</source>
+ <translation>
+ <numerusform>%1 wymaga przynajmniej %n argumentu. %2 jest dlatego niepoprawne.</numerusform>
+ <numerusform>%1 wymaga przynajmniej %n argumentów. %2 jest dlatego niepoprawne.</numerusform>
+ <numerusform>%1 wymaga przynajmniej %n argumentów. %2 jest dlatego niepoprawne.</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>Głównym węzłem drugiego argumentu w funkcji %1 musi być węzeł &quot;document&quot;. %2 nie jest węzłem &quot;document&quot;.</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>Przestrzeń nazw dla funkcji zdefiniowanej przez użytkownika nie może być pusta (spróbuj predefiniowany przedrostek %1, który stworzono specjalnie do takich sytuacji)</translation>
+ </message>
+ <message>
+ <source>A default namespace declaration must occur before function, variable, and option declarations.</source>
+ <translation>Domyślna deklaracja przestrzeni nazw musi pojawić się przed deklaracjami funkcji, zmiennych i opcji.</translation>
+ </message>
+ <message>
+ <source>Namespace declarations must occur before function, variable, and option declarations.</source>
+ <translation>Deklaracje przestrzeni nazw muszą pojawić się przed deklaracjami funkcji, zmiennych i opcji.</translation>
+ </message>
+ <message>
+ <source>Module imports must occur before function, variable, and option declarations.</source>
+ <translation>Importy modułów muszą pojawić się przed deklaracjami funkcji, zmiennych i opcji.</translation>
+ </message>
+ <message>
+ <source>%1 is not a whole number of minutes.</source>
+ <translation>%1 nie jest całkowitą liczbą minut.</translation>
+ </message>
+ <message>
+ <source>Attribute %1 can&apos;t be serialized because it appears at the top level.</source>
+ <translation>Atrybut %1 nie może być zserializowany ponieważ pojawił się na najwyższym poziomie.</translation>
+ </message>
+ <message>
+ <source>%1 is an unsupported encoding.</source>
+ <translation>Nieobsługiwane kodowanie %1.</translation>
+ </message>
+ <message>
+ <source>%1 contains octets which are disallowed in the requested encoding %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</source>
+ <translation>Kod %1 który pojawił się w %2 i który używa kodowania %3 jest niepoprawnym znakiem XML.</translation>
+ </message>
+ <message>
+ <source>Ambiguous rule match.</source>
+ <translation>Dopasowano niejednoznaczną regułę.</translation>
+ </message>
+ <message>
+ <source>In a namespace constructor, the value for a namespace cannot be an empty string.</source>
+ <translation>W konstruktorze przestrzeni nazw wartość przestrzeni nazw nie może być pustym ciągiem.</translation>
+ </message>
+ <message>
+ <source>The prefix must be a valid %1, which %2 is not.</source>
+ <translation>Przedrostek musi być poprawnym %1, którym %2 nie jest.</translation>
+ </message>
+ <message>
+ <source>The prefix %1 cannot be bound.</source>
+ <translation>Przedrostek %1 nie może być powiązany.</translation>
+ </message>
+ <message>
+ <source>Only the prefix %1 can be bound to %2 and vice versa.</source>
+ <translation>Tylko przedrostek %1 może być powiązany z %2 i vice versa.</translation>
+ </message>
+ <message>
+ <source>The parameter %1 is required, but no corresponding %2 is supplied.</source>
+ <translation>Wymagany jest parametr %1 lecz żaden odpowiadający mu %2 nie został dostarczony.</translation>
+ </message>
+ <message>
+ <source>The parameter %1 is passed, but no corresponding %2 exists.</source>
+ <translation>Przekazany jest parametr %1 lecz żaden odpowiadający mu %2 nie istnieje.</translation>
+ </message>
+ <message>
+ <source>The URI cannot have a fragment</source>
+ <translation>URI nie może posiadać fragmentu</translation>
+ </message>
+ <message>
+ <source>Element %1 is not allowed at this location.</source>
+ <translation>Element %1 jest niedozwolony w tym miejscu.</translation>
+ </message>
+ <message>
+ <source>Text nodes are not allowed at this location.</source>
+ <translation>Węzły tekstowe są niedozwolone w tym miejscu.</translation>
+ </message>
+ <message>
+ <source>Parse error: %1</source>
+ <translation>Błąd parsowania: %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>Wartość atrybutu wersji XSL-T musi być typu %1, którym %2 nie jest.</translation>
+ </message>
+ <message>
+ <source>Running an XSL-T 1.0 stylesheet with a 2.0 processor.</source>
+ <translation>Przetwarzanie arkusza XSL-T w wersji 1.0 przez procesor w wersji 2.0.</translation>
+ </message>
+ <message>
+ <source>Unknown XSL-T attribute %1.</source>
+ <translation>Nieznany atrybut %1 XSL-T.</translation>
+ </message>
+ <message>
+ <source>Attribute %1 and %2 are mutually exclusive.</source>
+ <translation>Atrybuty %1 i %2 wzajemnie się wykluczającą.</translation>
+ </message>
+ <message>
+ <source>In a simplified stylesheet module, attribute %1 must be present.</source>
+ <translation>W uproszczonym module arkuszu stylu musi wystąpić atrybut %1.</translation>
+ </message>
+ <message>
+ <source>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</source>
+ <translation>Jeśli element %1 nie posiada atrybutu %2, nie może on również posiadać atrybutu %3 ani %4.</translation>
+ </message>
+ <message>
+ <source>Element %1 must have at least one of the attributes %2 or %3.</source>
+ <translation>Element %1 musi posiadać przynajmniej jeden z atrybutów: %2 lub %3.</translation>
+ </message>
+ <message>
+ <source>At least one mode must be specified in the %1-attribute on element %2.</source>
+ <translation>Przynajmniej jeden tryb musi być podany w atrybucie %1 elementu %2.</translation>
+ </message>
+ <message>
+ <source>Element %1 must come last.</source>
+ <translation>Element %1 musi wystąpić jako ostatni.</translation>
+ </message>
+ <message>
+ <source>At least one %1-element must occur before %2.</source>
+ <translation>Przynajmniej jeden element %1 musi wystąpić przed %2.</translation>
+ </message>
+ <message>
+ <source>Only one %1-element can appear.</source>
+ <translation>Może wystąpić tylko jeden element %1.</translation>
+ </message>
+ <message>
+ <source>At least one %1-element must occur inside %2.</source>
+ <translation>Przynajmniej jeden element %1 musi wystąpić wewnątrz %2.</translation>
+ </message>
+ <message>
+ <source>When attribute %1 is present on %2, a sequence constructor cannot be used.</source>
+ <translation>Kiedy atrybut %1 występuje w %2 konstruktor sekwencyjny nie może być użyty.</translation>
+ </message>
+ <message>
+ <source>Element %1 must have either a %2-attribute or a sequence constructor.</source>
+ <translation>Element %1 musi posiadać albo atrybut %2 albo sekwencyjny konstruktor.</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>Kiedy wymagany jest parametr, domyślna wartość nie może być dostarczona przez atrybut %1 ani przez sekwencyjny konstruktor.</translation>
+ </message>
+ <message>
+ <source>Element %1 cannot have children.</source>
+ <translation>Element %1 nie może posiadać potomków.</translation>
+ </message>
+ <message>
+ <source>Element %1 cannot have a sequence constructor.</source>
+ <translation>Element %1 nie może posiadać sekwencyjnego konstruktora.</translation>
+ </message>
+ <message>
+ <source>The attribute %1 cannot appear on %2, when it is a child of %3.</source>
+ <translation>Atrybut %1 nie może wystąpić w %2 kiedy jest on potomkiem %3.</translation>
+ </message>
+ <message>
+ <source>A parameter in a function cannot be declared to be a tunnel.</source>
+ <translation>Parametr funkcji nie może być zadeklarowany jako tunelowy.</translation>
+ </message>
+ <message>
+ <source>This processor is not Schema-aware and therefore %1 cannot be used.</source>
+ <translation>Procesor nie obsługuje schematów, więc %1 nie może zostać użyte.</translation>
+ </message>
+ <message>
+ <source>Top level stylesheet elements must be in a non-null namespace, which %1 isn&apos;t.</source>
+ <translation>Elementy arkusza stylu najwyższego poziomu muszą być w niezerowej przestrzeni nazw, którą %1 nie jest.</translation>
+ </message>
+ <message>
+ <source>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</source>
+ <translation>Wartością atrybutu %1 w elemencie %2 musi być %3 albo %4, lecz nie %5.</translation>
+ </message>
+ <message>
+ <source>Attribute %1 cannot have the value %2.</source>
+ <translation>Atrybut %1 nie może posiadać wartości %2.</translation>
+ </message>
+ <message>
+ <source>The attribute %1 can only appear on the first %2 element.</source>
+ <translation>Atrybut %1 może wystąpić jedynie w pierwszym elemencie %2.</translation>
+ </message>
+ <message>
+ <source>At least one %1 element must appear as child of %2.</source>
+ <translation>Przynajmniej jeden element %1 musi wystąpić jako potomek %2.</translation>
+ </message>
+ <message>
+ <source>%1 has inheritance loop in its base type %2.</source>
+ <translation>%1 ma pętlę w dziedziczeniu w jego podstawowym typie %2.</translation>
+ </message>
+ <message>
+ <source>Circular inheritance of base type %1.</source>
+ <translation>Cykliczne dziedziczenie podstawowego typu %1.</translation>
+ </message>
+ <message>
+ <source>Circular inheritance of union %1.</source>
+ <translation>Cykliczne dziedziczenie unii %1.</translation>
+ </message>
+ <message>
+ <source>%1 is not allowed to derive from %2 by restriction as the latter defines it as final.</source>
+ <translation>Nie można wywieść %1 z %2 ograniczając go ponieważ jest on zdefiniowany jako końcowy.</translation>
+ </message>
+ <message>
+ <source>%1 is not allowed to derive from %2 by extension as the latter defines it as final.</source>
+ <translation>Nie można wywieść %1 z %2 rozszerzając go ponieważ jest on zdefiniowany jako końcowy.</translation>
+ </message>
+ <message>
+ <source>Base type of simple type %1 cannot be complex type %2.</source>
+ <translation>Typ podstawowy dla typu prostego %1 nie może być typem złożonym %2.</translation>
+ </message>
+ <message>
+ <source>Simple type %1 cannot have direct base type %2.</source>
+ <translation>Typ prosty %1 nie może mieć bezpośredniego typu podstawowego %2.</translation>
+ </message>
+ <message>
+ <source>Simple type %1 is not allowed to have base type %2.</source>
+ <translation>Typ prosty %1 nie może mieć typu podstawowego %2.</translation>
+ </message>
+ <message>
+ <source>Simple type %1 can only have simple atomic type as base type.</source>
+ <translation>Typem podstawowym typu prostego %1 może być tylko typ atomowy.</translation>
+ </message>
+ <message>
+ <source>Simple type %1 cannot derive from %2 as the latter defines restriction as final.</source>
+ <translation>Typ prosty %1 nie może wywodzić się z %2 ponieważ ten ostatni jest zdefiniowany jako końcowy.</translation>
+ </message>
+ <message>
+ <source>Variety of item type of %1 must be either atomic or union.</source>
+ <translation>Typem elementów listy %1 musi być albo typ atomowy albo unia.</translation>
+ </message>
+ <message>
+ <source>Variety of member types of %1 must be atomic.</source>
+ <translation>Typy składników %1 muszą być atomowe.</translation>
+ </message>
+ <message>
+ <source>%1 is not allowed to derive from %2 by list as the latter defines it as final.</source>
+ <translation>Nie można wywieść %1 z %2 poprzez listę ponieważ jest to zdefiniowane ostatecznie w typie podstawowym.</translation>
+ </message>
+ <message>
+ <source>Simple type %1 is only allowed to have %2 facet.</source>
+ <translation>Typ prosty %1 może jedynie posiadać aspekt %2.</translation>
+ </message>
+ <message>
+ <source>Base type of simple type %1 must have variety of type list.</source>
+ <translation>Typ podstawowy dla typu prostego %1 musi być listą typów.</translation>
+ </message>
+ <message>
+ <source>Base type of simple type %1 has defined derivation by restriction as final.</source>
+ <translation>Typ podstawowy dla typu prostego %1 ma zdefiniowane wywodzenie poprzez ograniczenie jako końcowe.</translation>
+ </message>
+ <message>
+ <source>Item type of base type does not match item type of %1.</source>
+ <translation>Typ elementów listy typu podstawowego nie pasuje do typu elementów listy %1.</translation>
+ </message>
+ <message>
+ <source>Simple type %1 contains not allowed facet type %2.</source>
+ <translation>Typ prosty %1 posiada niedozwolony aspekt %2.</translation>
+ </message>
+ <message>
+ <source>%1 is not allowed to derive from %2 by union as the latter defines it as final.</source>
+ <translation>Nie można wywieść %1 z %2 poprzez unię ponieważ jest to zdefiniowane ostatecznie w typie podstawowym.</translation>
+ </message>
+ <message>
+ <source>%1 is not allowed to have any facets.</source>
+ <translation>%1 nie może posiadać żadnych aspektów.</translation>
+ </message>
+ <message>
+ <source>Base type %1 of simple type %2 must have variety of union.</source>
+ <translation>Typ podstawowy %1 dla typu prostego %2 musi być unią.</translation>
+ </message>
+ <message>
+ <source>Base type %1 of simple type %2 is not allowed to have restriction in %3 attribute.</source>
+ <translation>Typ podstawowy %1 dla typu prostego %2 nie może posiadać ograniczenia dla atrybutu %3.</translation>
+ </message>
+ <message>
+ <source>Member type %1 cannot be derived from member type %2 of %3&apos;s base type %4.</source>
+ <translation>Typ %1 składnika nie może być wywiedziony z typu %2 który jest typem składnika %3 typu podstawowego %4.</translation>
+ </message>
+ <message>
+ <source>Derivation method of %1 must be extension because the base type %2 is a simple type.</source>
+ <translation>Metodą wywodzenia z %1 musi być rozszerzenie ponieważ typ podstawowy %2 jest typem prostym.</translation>
+ </message>
+ <message>
+ <source>Complex type %1 has duplicated element %2 in its content model.</source>
+ <translation>Typ złożony %1 posiada powielony element %2 w jego modelu zawartości.</translation>
+ </message>
+ <message>
+ <source>Complex type %1 has non-deterministic content.</source>
+ <translation>Typ złożony %1 posiada nieokreśloną zawartość.</translation>
+ </message>
+ <message>
+ <source>Attributes of complex type %1 are not a valid extension of the attributes of base type %2: %3.</source>
+ <translation>Atrybuty typu złożonego %1 nie są poprawnym rozszerzeniem atrybutów typu podstawowego %2: %3.</translation>
+ </message>
+ <message>
+ <source>Content model of complex type %1 is not a valid extension of content model of %2.</source>
+ <translation>Model zawartości typu złożonego %1 nie jest poprawnym rozszerzeniem modelu zawartości %2.</translation>
+ </message>
+ <message>
+ <source>Complex type %1 must have simple content.</source>
+ <translation>Typ złożony %1 musi mieć prostą zawartość.</translation>
+ </message>
+ <message>
+ <source>Complex type %1 must have the same simple type as its base class %2.</source>
+ <translation>Typ złożony %1 musi posiadać ten sam prosty typ jaki posiada jego klasa podstawowa %2.</translation>
+ </message>
+ <message>
+ <source>Complex type %1 cannot be derived from base type %2%3.</source>
+ <translation>Typ złożony %1 nie może być wywiedziony z typu %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>Atrybuty typu złożonego %1 nie są poprawnym ograniczeniem atrybutów typu podstawowego %2: %3.</translation>
+ </message>
+ <message>
+ <source>Complex type %1 with simple content cannot be derived from complex base type %2.</source>
+ <translation>Typ złożony %1 z prostą zawartością nie może być wywiedziony z podstawowego typu złożonego %2.</translation>
+ </message>
+ <message>
+ <source>Item type of simple type %1 cannot be a complex type.</source>
+ <translation>Typ elementów listy w prostym typie %1 nie może być typem złożonym.</translation>
+ </message>
+ <message>
+ <source>Member type of simple type %1 cannot be a complex type.</source>
+ <translation>Typ składnika typu prostego %1 nie może być typem złożonym.</translation>
+ </message>
+ <message>
+ <source>%1 is not allowed to have a member type with the same name as itself.</source>
+ <translation>%1 nie może posiadać typu składnika o tej samej nazwie jaką on sam posiada.</translation>
+ </message>
+ <message>
+ <source>%1 facet collides with %2 facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must have the same value as %2 facet of base type.</source>
+ <translation>Aspekt %1 musi mieć tą samą wartość jaką ma aspekt %2 typu podstawowego.</translation>
+ </message>
+ <message>
+ <source>%1 facet must be equal or greater than %2 facet of base type.</source>
+ <translation>Wartość aspektu %1 musi większa od lub równa wartości aspektu %2 typu podstawowego.</translation>
+ </message>
+ <message>
+ <source>%1 facet must be less than or equal to %2 facet of base type.</source>
+ <translation>Wartość aspektu %1 musi być mniejsza od lub równa wartości aspektu %2 typu podstawowego.</translation>
+ </message>
+ <message>
+ <source>%1 facet contains invalid regular expression</source>
+ <translation>Aspekt %1 zawiera niepoprawne wyrażenie regularne</translation>
+ </message>
+ <message>
+ <source>Unknown notation %1 used in %2 facet.</source>
+ <translation>Nieznany zapis %1 użyty w aspekcie %2.</translation>
+ </message>
+ <message>
+ <source>%1 facet contains invalid value %2: %3.</source>
+ <translation>Aspekt %1 zawiera niepoprawną wartość %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"></translation>
+ </message>
+ <message>
+ <source>%1 facet cannot be %2 if %3 facet of base type is %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be less than or equal to %2 facet.</source>
+ <translation>Wartość aspektu %1 musi być mniejsza od lub równa wartości aspektu %2.</translation>
+ </message>
+ <message>
+ <source>%1 facet must be less than %2 facet of base type.</source>
+ <translation>Wartość aspektu %1 musi być mniejsza od wartości aspektu %2 typu podstawowego.</translation>
+ </message>
+ <message>
+ <source>%1 facet and %2 facet cannot appear together.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be greater than %2 facet of base type.</source>
+ <translation>Wartość aspektu %1 musi być większa od wartości aspektu %2 typu podstawowego.</translation>
+ </message>
+ <message>
+ <source>%1 facet must be less than %2 facet.</source>
+ <translation>Wartość aspektu %1 musi być mniejsza od wartości aspektu %2.</translation>
+ </message>
+ <message>
+ <source>%1 facet must be greater than or equal to %2 facet of base type.</source>
+ <translation>Wartość aspektu %1 musi być większa od lub równa wartości aspektu %2 typu podstawowego.</translation>
+ </message>
+ <message>
+ <source>Simple type contains not allowed facet %1.</source>
+ <translation>Typ prosty zawiera niedozwolony aspekt %1.</translation>
+ </message>
+ <message>
+ <source>%1, %2, %3, %4, %5 and %6 facets are not allowed when derived by list.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Only %1 and %2 facets are allowed when derived by union.</source>
+ <translation>Dozwolone są jedynie aspekty %1 i %2 podczas wywodzenia z unii.</translation>
+ </message>
+ <message>
+ <source>%1 contains %2 facet with invalid data: %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute group %1 contains attribute %2 twice.</source>
+ <translation>Grupa atrybutów %1 zawiera dwukrotnie atrybut %2.</translation>
+ </message>
+ <message>
+ <source>Attribute group %1 contains two different attributes that both have types derived from %2.</source>
+ <translation>Grupa atrybutów %1 zawiera dwa różne atrybuty których typy są wywiedzione z %2.</translation>
+ </message>
+ <message>
+ <source>Attribute group %1 contains attribute %2 that has value constraint but type that inherits from %3.</source>
+ <translation>Grupa atrybutów %1 zawiera atrybut %2 który ma ograniczenie wartości ale typ wywodzi się z %3.</translation>
+ </message>
+ <message>
+ <source>Complex type %1 contains attribute %2 twice.</source>
+ <translation>Typ złożony %1 zawiera atrybut %2 dwukrotnie.</translation>
+ </message>
+ <message>
+ <source>Complex type %1 contains two different attributes that both have types derived from %2.</source>
+ <translation>Typ złożony %1 zawiera dwa różne atrybuty których typy są wywiedzione z %2.</translation>
+ </message>
+ <message>
+ <source>Complex type %1 contains attribute %2 that has value constraint but type that inherits from %3.</source>
+ <translation>Typ złożony %1 zawiera atrybut %2 który ma ograniczenie wartości ale typ wywodzi się z %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 nie może zawierać ograniczenia wartości gdy jego typ podstawowy jest złożony.</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 nie może zawierać ograniczenia wartości gdy jego typ jest wywiedziony z %2.</translation>
+ </message>
+ <message>
+ <source>Value constraint of element %1 is not of elements type: %2.</source>
+ <translation>Ograniczenie wartości elementu %1 nie jest typu: %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 nie może przynależeć do grupy zastępującej ponieważ nie jest on elementem globalnym.</translation>
+ </message>
+ <message>
+ <source>Type of element %1 cannot be derived from type of substitution group affiliation.</source>
+ <translation>Typ elementu %1 nie może być wywiedziony z typu przynależnego do grupy zastępującej.</translation>
+ </message>
+ <message>
+ <source>Value constraint of attribute %1 is not of attributes type: %2.</source>
+ <translation>Ograniczenie wartości atrybutu %1 nie jest typu: %2.</translation>
+ </message>
+ <message>
+ <source>Attribute %1 has value constraint but has type derived from %2.</source>
+ <translation>Atrybut %1 posiada ograniczenie wartości lecz jego typ wywodzi się z %2.</translation>
+ </message>
+ <message>
+ <source>%1 attribute in derived complex type must be %2 like in base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 in derived complex type must have %2 value constraint like in base type.</source>
+ <translation>Atrybut %1 w wywiedzionym typie złożonym musi zawierać ograniczenie wartości %2 jak w typie podstawowym.</translation>
+ </message>
+ <message>
+ <source>Attribute %1 in derived complex type must have the same %2 value constraint like in base type.</source>
+ <translation>Atrybut %1 w wywiedzionym typie złożonym musi zawierać te same ograniczenie wartości %2 jak w typie podstawowym.</translation>
+ </message>
+ <message>
+ <source>Attribute %1 in derived complex type must have %2 value constraint.</source>
+ <translation>Atrybut %1 w wywiedzionym typie złożonym musi zawierać ograniczenie wartości %2.</translation>
+ </message>
+ <message>
+ <source>processContent of base wildcard must be weaker than derived wildcard.</source>
+ <translation>&quot;processContent&quot; podstawowego dżokera musi być słabszy od wywiedzionego dżokera.</translation>
+ </message>
+ <message>
+ <source>Element %1 exists twice with different types.</source>
+ <translation>Istnieją dwa elementy %1 o różnych typach.</translation>
+ </message>
+ <message>
+ <source>Particle contains non-deterministic wildcards.</source>
+ <translation>Element zawiera nieokreślone dżokery.</translation>
+ </message>
+ <message>
+ <source>Base attribute %1 is required but derived attribute is not.</source>
+ <translation>Wymagany jest bazowy atrybut %1, wywiedziony zaś nie.</translation>
+ </message>
+ <message>
+ <source>Type of derived attribute %1 cannot be validly derived from type of base attribute.</source>
+ <translation>Typ wywiedzionego atrybutu %1 nie może być poprawnie wywiedziony z typu podstawowego atrybutu.</translation>
+ </message>
+ <message>
+ <source>Value constraint of derived attribute %1 does not match value constraint of base attribute.</source>
+ <translation>Ograniczenie wartości wywiedzionego atrybutu %1 nie pasuje do ograniczenia wartości podstawowego atrybutu.</translation>
+ </message>
+ <message>
+ <source>Derived attribute %1 does not exist in the base definition.</source>
+ <translation>Wywiedziony atrybut %1 nie istnieje w podstawowej definicji.</translation>
+ </message>
+ <message>
+ <source>Derived attribute %1 does not match the wildcard in the base definition.</source>
+ <translation>Wywiedziony atrybut %1 nie pasuje do dżokera w podstawowej definicji.</translation>
+ </message>
+ <message>
+ <source>Base attribute %1 is required but missing in derived definition.</source>
+ <translation>Brak wymaganego bazowego atrybutu %1 w wywiedzionej definicji.</translation>
+ </message>
+ <message>
+ <source>Derived definition contains an %1 element that does not exists in the base definition</source>
+ <translation>Wywiedziona definicja zawiera element %1 który nie istnieje w definicji podstawowej</translation>
+ </message>
+ <message>
+ <source>Derived wildcard is not a subset of the base wildcard.</source>
+ <translation>Wywiedziony dżoker nie jest podzbiorem podstawowego dżokera.</translation>
+ </message>
+ <message>
+ <source>%1 of derived wildcard is not a valid restriction of %2 of base wildcard</source>
+ <translation>%1 wywiedzionego dżokera nie jest poprawnym ograniczeniem %2 podstawowego dżokera</translation>
+ </message>
+ <message>
+ <source>Attribute %1 from base type is missing in derived type.</source>
+ <translation>Brak atrybutu %1 typu bazowego w wywiedzionej definicji.</translation>
+ </message>
+ <message>
+ <source>Type of derived attribute %1 differs from type of base attribute.</source>
+ <translation>Typ wywiedzionego atrybutu %1 różni się od typu podstawowego atrybutu.</translation>
+ </message>
+ <message>
+ <source>Base definition contains an %1 element that is missing in the derived definition</source>
+ <translation>Podstawowa definicja zawiera element %1 którego brakuje w wywiedzionej definicji</translation>
+ </message>
+ <message>
+ <source>%1 references unknown %2 or %3 element %4.</source>
+ <translation>%1 odwołuje się do nieznanego elementu %2 lub %3: %4.</translation>
+ </message>
+ <message>
+ <source>%1 references identity constraint %2 that is no %3 or %4 element.</source>
+ <translation>%1 odwołuje się do narzucenia niepowtarzalności %2 które nie jest elementem %3 ani %4.</translation>
+ </message>
+ <message>
+ <source>%1 has a different number of fields from the identity constraint %2 that it references.</source>
+ <translation>%1 posiada inna liczbę pól od narzucenia niepowtarzalności %2 które się do niego odwołuje.</translation>
+ </message>
+ <message>
+ <source>Base type %1 of %2 element cannot be resolved.</source>
+ <translation>Nie można rozwiązać typu podstawowego %1 elementu %2.</translation>
+ </message>
+ <message>
+ <source>Item type %1 of %2 element cannot be resolved.</source>
+ <translation>Nie można rozwiązać typu elementów listy %1 w elemencie %2.</translation>
+ </message>
+ <message>
+ <source>Member type %1 of %2 element cannot be resolved.</source>
+ <translation>Nie można rozwiązać typu %1 składnika elementu %2.</translation>
+ </message>
+ <message>
+ <source>Type %1 of %2 element cannot be resolved.</source>
+ <translation>Nie można rozwiązać typu %1 elementu %2.</translation>
+ </message>
+ <message>
+ <source>Base type %1 of complex type cannot be resolved.</source>
+ <translation>Nie można rozwiązać typu podstawowego %1 dla typu złożonego.</translation>
+ </message>
+ <message>
+ <source>%1 cannot have complex base type that has a %2.</source>
+ <translation type="unfinished"></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>Model zawartości typu złożonego %1 posiada element %2 więc nie może być on wywiedziony poprzez rozszerzenie niepustego typu.</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>Typ złożony %1 nie może być wywiedziony z %2 poprzez rozszerzenie ponieważ ten ostatni zawiera element %3 w jego modelu zawartości.</translation>
+ </message>
+ <message>
+ <source>Type of %1 element must be a simple type, %2 is not.</source>
+ <translation>Typem elementu %1 musi być typ prosty, %2 nim nie jest.</translation>
+ </message>
+ <message>
+ <source>Substitution group %1 of %2 element cannot be resolved.</source>
+ <translation>Nie można rozwiązać grupy zastępującej %1 elementu %2.</translation>
+ </message>
+ <message>
+ <source>Substitution group %1 has circular definition.</source>
+ <translation>Grupa zastępująca %1 posiada cykliczną definicję.</translation>
+ </message>
+ <message>
+ <source>Duplicated element names %1 in %2 element.</source>
+ <translation>Powielona nazwa elementu %1 w elemencie %2.</translation>
+ </message>
+ <message>
+ <source>Reference %1 of %2 element cannot be resolved.</source>
+ <translation>Nie można rozwiązać odwołania %1 do elementu %2.</translation>
+ </message>
+ <message>
+ <source>Circular group reference for %1.</source>
+ <translation>Cykliczne odwołanie do grupy dla %1.</translation>
+ </message>
+ <message>
+ <source>%1 element is not allowed in this scope</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element cannot have %2 attribute with value other than %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element cannot have %2 attribute with value other than %3 or %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 or %2 attribute of reference %3 does not match with the attribute declaration %4.</source>
+ <translation>Atrybut %1 lub %2 odwołania %3 nie pasuje do deklaracji atrybutu %4.</translation>
+ </message>
+ <message>
+ <source>Attribute group %1 has circular reference.</source>
+ <translation>Grupa atrybutów %1 posiada cykliczne odwołanie.</translation>
+ </message>
+ <message>
+ <source>%1 attribute in %2 must have %3 use like in base type %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute wildcard of %1 is not a valid restriction of attribute wildcard of base type %2.</source>
+ <translation>Atrybut dżokera %1 nie jest poprawnym ograniczeniem atrybutu dżokera typu podstawowego %2.</translation>
+ </message>
+ <message>
+ <source>%1 has attribute wildcard but its base type %2 has not.</source>
+ <translation>%1 posiada atrybut dżokera lecz jego typ podstawowy %2 go nie posiada.</translation>
+ </message>
+ <message>
+ <source>Union of attribute wildcard of type %1 and attribute wildcard of its base type %2 is not expressible.</source>
+ <translation>Nie można wyrazić unii atrybutu dżokera typu %1 i atrybutu dżokera jego typu podstawowego %2.</translation>
+ </message>
+ <message>
+ <source>Enumeration facet contains invalid content: {%1} is not a value of type %2.</source>
+ <translation>Aspekt &quot;enumeration&quot; posiada niepoprawną zawartość: {%1} nie jest wartością typu %2.</translation>
+ </message>
+ <message>
+ <source>Namespace prefix of qualified name %1 is not defined.</source>
+ <translation>Przedrostek przestrzeni nazw występujący w pełnej nazwie %1 nie jest zdefiniowany.</translation>
+ </message>
+ <message>
+ <source>%1 element %2 is not a valid restriction of the %3 element it redefines: %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Empty particle cannot be derived from non-empty particle.</source>
+ <translation>Pusty element nie może być wywiedziony z niepustego elementu.</translation>
+ </message>
+ <message>
+ <source>Derived particle is missing element %1.</source>
+ <translation>Brak elementu %1 w wywiedzionym elemencie.</translation>
+ </message>
+ <message>
+ <source>Derived element %1 is missing value constraint as defined in base particle.</source>
+ <translation>Brak ograniczenia wartości w wywiedzionym elemencie %1 takiego jak w podstawowym elemencie.</translation>
+ </message>
+ <message>
+ <source>Derived element %1 has weaker value constraint than base particle.</source>
+ <translation>Wywiedziony element %1 posiada słabsze ograniczenie wartości niż element podstawowy.</translation>
+ </message>
+ <message>
+ <source>Fixed value constraint of element %1 differs from value constraint in base particle.</source>
+ <translation>Ograniczenie stałej wartości elementu %1 różni się od ograniczenia wartości w podstawowym elemencie.</translation>
+ </message>
+ <message>
+ <source>Derived element %1 cannot be nillable as base element is not nillable.</source>
+ <translation>Wywiedziony element %1 może być zerowalny ponieważ element podstawowy nie jest zerowalny.</translation>
+ </message>
+ <message>
+ <source>Block constraints of derived element %1 must not be more weaker than in the base element.</source>
+ <translation>Ograniczenia blokujące dla wywiedzionego elementu %1 nie mogą być słabsze od ograniczeń w elemencie podstawowym.</translation>
+ </message>
+ <message>
+ <source>Simple type of derived element %1 cannot be validly derived from base element.</source>
+ <translation>Typ prosty w elemencie wywiedzionym %1 nie może być poprawnie wywiedziony z elementu podstawowego.</translation>
+ </message>
+ <message>
+ <source>Complex type of derived element %1 cannot be validly derived from base element.</source>
+ <translation>Typ złożony w elemencie wywiedzionym %1 nie może być poprawnie wywiedziony z elementu podstawowego.</translation>
+ </message>
+ <message>
+ <source>Element %1 is missing in derived particle.</source>
+ <translation>Brak elementu %1 w wywiedzionym elemencie.</translation>
+ </message>
+ <message>
+ <source>Element %1 does not match namespace constraint of wildcard in base particle.</source>
+ <translation>Element %1 nie pasuje do ograniczenia przestrzeni nazw dżokera w elemencie podstawowym.</translation>
+ </message>
+ <message>
+ <source>Wildcard in derived particle is not a valid subset of wildcard in base particle.</source>
+ <translation>Dżoker w wywiedzionym elemencie nie jest poprawnym podzbiorem dżokera w elemencie podstawowym.</translation>
+ </message>
+ <message>
+ <source>processContent of wildcard in derived particle is weaker than wildcard in base particle.</source>
+ <translation>&quot;processContent&quot; dżokera w wywiedzionym elemencie jest słabszy od dżokera w podstawowym elemencie.</translation>
+ </message>
+ <message>
+ <source>Derived particle allows content that is not allowed in the base particle.</source>
+ <translation>Wywiedziony element pozwala na zawartość która jest niedozwolona w podstawowym elemencie.</translation>
+ </message>
+ <message>
+ <source>Can not process unknown element %1, expected elements are: %2.</source>
+ <translation>Nie można przetworzyć nieznanego elementu %1, spodziewanymi elementami są: %2.</translation>
+ </message>
+ <message>
+ <source>Element %1 is not allowed in this scope, possible elements are: %2.</source>
+ <translation>Element %1 jest niedozwolony w tym zakresie, możliwymi elementami są: %2.</translation>
+ </message>
+ <message>
+ <source>Child element is missing in that scope, possible child elements are: %1.</source>
+ <translation>Brak podelementu w tym zakresie, możliwymi podelementami są: %1.</translation>
+ </message>
+ <message>
+ <source>Document is not a XML schema.</source>
+ <translation>Dokument nie jest schematem 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>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element contains invalid content: {%3}.</source>
+ <translation type="unfinished"></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>Docelowa przestrzeń nazw %1 załączonego schematu jest różna od docelowej przestrzeni nazw %2 która jest zdefiniowana w schemacie załączającym.</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>Docelowa przestrzeń nazw %1 zaimportowanego schematu jest różna od docelowej przestrzeni nazw %2 która jest zdefiniowana w schemacie importującym.</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>
+ </message>
+ <message>
+ <source>%1 element without %2 attribute is not allowed inside schema without target namespace.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element is not allowed inside %2 element if %3 attribute is present.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element has neither %2 attribute nor %3 child element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element with %2 child element must not have a %3 attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must be %3 or %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must have a value of %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must have a value of %3 or %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element must not have %2 and %3 attribute together.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Content of %1 attribute of %2 element must not be from namespace %3.</source>
+ <translation>Zawartość atrybutu %1 elementu %2 nie może pochodzić z przestrzeni nazw %3.</translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must not be %3.</source>
+ <translation type="unfinished"></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>
+ </message>
+ <message>
+ <source>Specifying use=&apos;prohibited&apos; inside an attribute group has no effect.</source>
+ <translation>Podawanie: use=&apos;prohibited&apos; wewnątrz grupy atrybutów nie przynosi żadnego efektu.</translation>
+ </message>
+ <message>
+ <source>%1 element must have either %2 or %3 attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element must have either %2 attribute or %3 or %4 as child element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element requires either %2 or %3 attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Text or entity references not allowed inside %1 element</source>
+ <translation>Tekst ani odwołanie nie są dozwolone wewnątrz elementu %1</translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must contain %3, %4 or a list of URIs.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element is not allowed in this context.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element has larger value than %3 attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Prefix of qualified name %1 is not defined.</source>
+ <translation>Przedrostek w pełnej nazwie %1 nie jest zdefiniowany.</translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must either contain %3 or the other values.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Component with ID %1 has been defined previously.</source>
+ <translation>Komponent o identyfikatorze %1 został uprzednio zdefiniowany.</translation>
+ </message>
+ <message>
+ <source>Element %1 already defined.</source>
+ <translation>Element %1 jest już zdefiniowany.</translation>
+ </message>
+ <message>
+ <source>Attribute %1 already defined.</source>
+ <translation>Atrybut %1 jest już zdefiniowany.</translation>
+ </message>
+ <message>
+ <source>Type %1 already defined.</source>
+ <translation>Typ %1 jest już zdefiniowany.</translation>
+ </message>
+ <message>
+ <source>Attribute group %1 already defined.</source>
+ <translation>Grupa atrybutów %1 jest już zdefiniowana.</translation>
+ </message>
+ <message>
+ <source>Element group %1 already defined.</source>
+ <translation>Grupa elementów %1 jest już zdefiniowana.</translation>
+ </message>
+ <message>
+ <source>Notation %1 already defined.</source>
+ <translation>Zapis %1 jest już zdefiniowany.</translation>
+ </message>
+ <message>
+ <source>Identity constraint %1 already defined.</source>
+ <translation>Narzucenie niepowtarzalności %1 jest już zdefiniowane.</translation>
+ </message>
+ <message>
+ <source>Duplicated facets in simple type %1.</source>
+ <translation>Powielone aspekty w prostym typie %1.</translation>
+ </message>
+ <message>
+ <source>%1 is not valid according to %2.</source>
+ <translation>%1 nie jest poprawne według %2.</translation>
+ </message>
+ <message>
+ <source>String content does not match the length facet.</source>
+ <translation>Wartość ciągu koliduje z aspektem &quot;length&quot;.</translation>
+ </message>
+ <message>
+ <source>String content does not match the minLength facet.</source>
+ <translation>Wartość ciągu koliduje z aspektem &quot;minLength&quot;.</translation>
+ </message>
+ <message>
+ <source>String content does not match the maxLength facet.</source>
+ <translation>Wartość ciągu koliduje z aspektem &quot;maxLength&quot;.</translation>
+ </message>
+ <message>
+ <source>String content does not match pattern facet.</source>
+ <translation>Wartość ciągu koliduje z aspektem &quot;pattern&quot;.</translation>
+ </message>
+ <message>
+ <source>String content is not listed in the enumeration facet.</source>
+ <translation>Wartość ciągu nie widnieje na liście aspektu &quot;enumeration&quot;.</translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match the maxInclusive facet.</source>
+ <translation>Wartość liczby całkowitej koliduje z aspektem &quot;maxInclusive&quot;.</translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match the maxExclusive facet.</source>
+ <translation>Wartość liczby całkowitej koliduje z aspektem &quot;maxExclusive&quot;.</translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match the minInclusive facet.</source>
+ <translation>Wartość liczby całkowitej koliduje z aspektem &quot;minInclusive&quot;.</translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match the minExclusive facet.</source>
+ <translation>Wartość liczby całkowitej koliduje z aspektem &quot;minExclusive&quot;.</translation>
+ </message>
+ <message>
+ <source>Signed integer content is not listed in the enumeration facet.</source>
+ <translation>Wartość liczby całkowitej nie widnieje na liście aspektu &quot;enumeration&quot;.</translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match pattern facet.</source>
+ <translation>Wartość liczby całkowitej koliduje z aspektem &quot;pattern&quot;.</translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match in the totalDigits facet.</source>
+ <translation>Wartość liczby całkowitej koliduje z aspektem &quot;totalDigits&quot;.</translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match the maxInclusive facet.</source>
+ <translation>Wartość liczby naturalnej koliduje z aspektem &quot;maxInclusive&quot;.</translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match the maxExclusive facet.</source>
+ <translation>Wartość liczby naturalnej koliduje z aspektem &quot;maxExclusive&quot;.</translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match the minInclusive facet.</source>
+ <translation>Wartość liczby naturalnej koliduje z aspektem &quot;minInclusive&quot;.</translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match the minExclusive facet.</source>
+ <translation>Wartość liczby naturalnej koliduje z aspektem &quot;minExclusive&quot;.</translation>
+ </message>
+ <message>
+ <source>Unsigned integer content is not listed in the enumeration facet.</source>
+ <translation>Wartość liczby naturalnej nie widnieje na liście aspektu &quot;enumeration&quot;.</translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match pattern facet.</source>
+ <translation>Wartość liczby naturalnej koliduje z aspektem &quot;pattern&quot;.</translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match in the totalDigits facet.</source>
+ <translation>Wartość liczby naturalnej koliduje z aspektem &quot;totalDigits&quot;.</translation>
+ </message>
+ <message>
+ <source>Double content does not match the maxInclusive facet.</source>
+ <translation>Wartość liczby rzeczywistej koliduje z aspektem &quot;maxInclusive&quot;.</translation>
+ </message>
+ <message>
+ <source>Double content does not match the maxExclusive facet.</source>
+ <translation>Wartość liczby rzeczywistej koliduje z aspektem &quot;maxExclusive&quot;.</translation>
+ </message>
+ <message>
+ <source>Double content does not match the minInclusive facet.</source>
+ <translation>Wartość liczby rzeczywistej koliduje z aspektem &quot;minInclusive&quot;.</translation>
+ </message>
+ <message>
+ <source>Double content does not match the minExclusive facet.</source>
+ <translation>Wartość liczby rzeczywistej koliduje z aspektem &quot;minExclusive&quot;.</translation>
+ </message>
+ <message>
+ <source>Double content is not listed in the enumeration facet.</source>
+ <translation>Wartość liczby rzeczywistej nie widnieje na liście aspektu &quot;enumeration&quot;.</translation>
+ </message>
+ <message>
+ <source>Double content does not match pattern facet.</source>
+ <translation>Wartość liczby rzeczywistej koliduje z aspektem &quot;pattern&quot;.</translation>
+ </message>
+ <message>
+ <source>Decimal content does not match in the fractionDigits facet.</source>
+ <translation>Wartość liczby rzeczywistej koliduje z aspektem &quot;fractionDigits&quot;.</translation>
+ </message>
+ <message>
+ <source>Decimal content does not match in the totalDigits facet.</source>
+ <translation>Wartość liczby rzeczywistej koliduje z aspektem &quot;totalDigits&quot;.</translation>
+ </message>
+ <message>
+ <source>Date time content does not match the maxInclusive facet.</source>
+ <translation>Zawartość daty i czasu koliduje z aspektem &quot;maxInclusive&quot;.</translation>
+ </message>
+ <message>
+ <source>Date time content does not match the maxExclusive facet.</source>
+ <translation>Zawartość daty i czasu koliduje z aspektem &quot;maxExclusive&quot;.</translation>
+ </message>
+ <message>
+ <source>Date time content does not match the minInclusive facet.</source>
+ <translation>Zawartość daty i czasu koliduje z aspektem &quot;minInclusive&quot;.</translation>
+ </message>
+ <message>
+ <source>Date time content does not match the minExclusive facet.</source>
+ <translation>Zawartość daty i czasu koliduje z aspektem &quot;minExclusive&quot;.</translation>
+ </message>
+ <message>
+ <source>Date time content is not listed in the enumeration facet.</source>
+ <translation>Zawartość daty i czasu nie widnieje na liście aspektu &quot;enumeration&quot;.</translation>
+ </message>
+ <message>
+ <source>Date time content does not match pattern facet.</source>
+ <translation>Zawartość daty i czasu koliduje z aspektem &quot;pattern&quot;.</translation>
+ </message>
+ <message>
+ <source>Duration content does not match the maxInclusive facet.</source>
+ <translation>Wartość długości okresu czasu koliduje z aspektem &quot;maxInclusive&quot;.</translation>
+ </message>
+ <message>
+ <source>Duration content does not match the maxExclusive facet.</source>
+ <translation>Wartość długości okresu czasu koliduje z aspektem &quot;maxExclusive&quot;.</translation>
+ </message>
+ <message>
+ <source>Duration content does not match the minInclusive facet.</source>
+ <translation>Wartość długości okresu czasu koliduje z aspektem &quot;minInclusive&quot;.</translation>
+ </message>
+ <message>
+ <source>Duration content does not match the minExclusive facet.</source>
+ <translation>Wartość długości okresu czasu koliduje z aspektem &quot;minExclusive&quot;.</translation>
+ </message>
+ <message>
+ <source>Duration content is not listed in the enumeration facet.</source>
+ <translation>Wartość długości okresu czasu nie widnieje na liście aspektu &quot;enumeration&quot;.</translation>
+ </message>
+ <message>
+ <source>Duration content does not match pattern facet.</source>
+ <translation>Wartość długości okresu czasu koliduje z aspektem &quot;pattern&quot;.</translation>
+ </message>
+ <message>
+ <source>Boolean content does not match pattern facet.</source>
+ <translation>Wartość boolowska koliduje z aspektem &quot;pattern&quot;.</translation>
+ </message>
+ <message>
+ <source>Binary content does not match the length facet.</source>
+ <translation>Wartość binarna koliduje z aspektem &quot;length&quot;.</translation>
+ </message>
+ <message>
+ <source>Binary content does not match the minLength facet.</source>
+ <translation>Wartość binarna koliduje z aspektem &quot;minLength&quot;.</translation>
+ </message>
+ <message>
+ <source>Binary content does not match the maxLength facet.</source>
+ <translation>Wartość binarna koliduje z aspektem &quot;maxLength&quot;.</translation>
+ </message>
+ <message>
+ <source>Binary content is not listed in the enumeration facet.</source>
+ <translation>Wartość binarna nie widnieje na liście aspektu &quot;enumeration&quot;.</translation>
+ </message>
+ <message>
+ <source>Invalid QName content: %1.</source>
+ <translation>Niepoprawna zawartość QName: %1.</translation>
+ </message>
+ <message>
+ <source>QName content is not listed in the enumeration facet.</source>
+ <translation>Zawartość QName nie widnieje na liście aspektu &quot;enumeration&quot;.</translation>
+ </message>
+ <message>
+ <source>QName content does not match pattern facet.</source>
+ <translation>Zawartość QName koliduje z aspektem &quot;pattern&quot;.</translation>
+ </message>
+ <message>
+ <source>Notation content is not listed in the enumeration facet.</source>
+ <translation>Zapis zawartości nie widnieje na liście aspektu &quot;enumeration&quot;.</translation>
+ </message>
+ <message>
+ <source>List content does not match length facet.</source>
+ <translation>Zawartość listy koliduje z aspektem &quot;length&quot;.</translation>
+ </message>
+ <message>
+ <source>List content does not match minLength facet.</source>
+ <translation>Zawartość listy koliduje z aspektem &quot;minLength&quot;.</translation>
+ </message>
+ <message>
+ <source>List content does not match maxLength facet.</source>
+ <translation>Zawartość listy koliduje z aspektem &quot;maxLength&quot;.</translation>
+ </message>
+ <message>
+ <source>List content is not listed in the enumeration facet.</source>
+ <translation>Zawartość listy nie widnieje na liście aspektu &quot;enumeration&quot;.</translation>
+ </message>
+ <message>
+ <source>List content does not match pattern facet.</source>
+ <translation>Zawartość listy koliduje z aspektem &quot;pattern&quot;.</translation>
+ </message>
+ <message>
+ <source>Union content is not listed in the enumeration facet.</source>
+ <translation>Zawartość unii nie widnieje na liście aspektu &quot;enumeration&quot;.</translation>
+ </message>
+ <message>
+ <source>Union content does not match pattern facet.</source>
+ <translation>Zawartość unii koliduje z aspektem &quot;pattern&quot;.</translation>
+ </message>
+ <message>
+ <source>Data of type %1 are not allowed to be empty.</source>
+ <translation>Dane typu %1 nie mogą być puste.</translation>
+ </message>
+ <message>
+ <source>Element %1 is missing child element.</source>
+ <translation>Brak wymaganego podelementu w elemencie %1.</translation>
+ </message>
+ <message>
+ <source>There is one IDREF value with no corresponding ID: %1.</source>
+ <translation>Istnieje wartość IDREF bez odpowiadającej jej wartości ID: %1.</translation>
+ </message>
+ <message>
+ <source>Loaded schema file is invalid.</source>
+ <translation>Załadowany plik nie jest poprawnym plikiem ze schematem.</translation>
+ </message>
+ <message>
+ <source>%1 contains invalid data.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xsi:schemaLocation namespace %1 has already appeared earlier in the instance document.</source>
+ <translation>Przestrzeń nazw &quot;xsi:schemaLocation&quot; %1 wystąpiła już wcześniej w dokumencie.</translation>
+ </message>
+ <message>
+ <source>xsi:noNamespaceSchemaLocation cannot appear after the first no-namespace element or attribute.</source>
+ <translation>&quot;xsi:noNamespaceSchemaLocation&quot; nie może wystąpić po pierwszym elemencie lub atrybucie który nie jest przestrzenią nazw.</translation>
+ </message>
+ <message>
+ <source>No schema defined for validation.</source>
+ <translation>Brak zdefiniowanego schematu dla walidacji.</translation>
+ </message>
+ <message>
+ <source>No definition for element %1 available.</source>
+ <translation>Brak dostępnej definicji dla elementu %1.</translation>
+ </message>
+ <message>
+ <source>Specified type %1 is not known to the schema.</source>
+ <translation>Podany typ %1 nie jest schematowi znany.</translation>
+ </message>
+ <message>
+ <source>Element %1 is not defined in this scope.</source>
+ <translation>Element %1 nie jest zdefiniowany w tym zakresie.</translation>
+ </message>
+ <message>
+ <source>Declaration for element %1 does not exist.</source>
+ <translation>Brak deklaracji dla elementu %1.</translation>
+ </message>
+ <message>
+ <source>Element %1 contains invalid content.</source>
+ <translation>Element %1 posiada niepoprawną zawartość.</translation>
+ </message>
+ <message>
+ <source>Element %1 is declared as abstract.</source>
+ <translation>Element %1 jest zadeklarowany jako abstrakcyjny.</translation>
+ </message>
+ <message>
+ <source>Element %1 is not nillable.</source>
+ <translation>Element %1 nie jest zerowalny.</translation>
+ </message>
+ <message>
+ <source>Attribute %1 contains invalid data: %2</source>
+ <translation>Atrybut %1 zawiera niepoprawne dane: %2</translation>
+ </message>
+ <message>
+ <source>Element contains content although it is nillable.</source>
+ <translation>Element posiada zawartość chociaż jest zerowalny.</translation>
+ </message>
+ <message>
+ <source>Fixed value constraint not allowed if element is nillable.</source>
+ <translation>Ograniczenie stałej wartości jest niedozwolone gdy element jest zerowalny.</translation>
+ </message>
+ <message>
+ <source>Element %1 cannot contain other elements, as it has a fixed content.</source>
+ <translation>Element %1 nie może zawierać innych elementów ponieważ posiada on stałą zawartość.</translation>
+ </message>
+ <message>
+ <source>Specified type %1 is not validly substitutable with element type %2.</source>
+ <translation>Podany typ %1 nie jest poprawnie zastępowalny typem elementu %2.</translation>
+ </message>
+ <message>
+ <source>Complex type %1 is not allowed to be abstract.</source>
+ <translation>Typ złożony %1 nie może być abstrakcyjny.</translation>
+ </message>
+ <message>
+ <source>Element %1 contains not allowed attributes.</source>
+ <translation>Element %1 zawiera niedozwolone atrybuty.</translation>
+ </message>
+ <message>
+ <source>Element %1 contains not allowed child element.</source>
+ <translation>Element %1 zawiera niedozwolony podelement.</translation>
+ </message>
+ <message>
+ <source>Content of element %1 does not match its type definition: %2.</source>
+ <translation>Zawartość elementu %1 nie pasuje do jego definicji typu: %2.</translation>
+ </message>
+ <message>
+ <source>Content of element %1 does not match defined value constraint.</source>
+ <translation>Zawartość elementu %1 nie pasuje do zdefiniowanego ograniczenia wartości.</translation>
+ </message>
+ <message>
+ <source>Element %1 contains not allowed child content.</source>
+ <translation>Element %1 zawiera niedozwolony podelement.</translation>
+ </message>
+ <message>
+ <source>Element %1 contains not allowed text content.</source>
+ <translation>Element %1 zawiera niedozwolony text.</translation>
+ </message>
+ <message>
+ <source>Element %1 is missing required attribute %2.</source>
+ <translation>Brak wymaganego atrybutu %2 w elemencie %1.</translation>
+ </message>
+ <message>
+ <source>Attribute %1 does not match the attribute wildcard.</source>
+ <translation>Atrybut %1 nie pasuje do atrybutu dżokera.</translation>
+ </message>
+ <message>
+ <source>Declaration for attribute %1 does not exist.</source>
+ <translation>Brak deklaracji atrybutu %1.</translation>
+ </message>
+ <message>
+ <source>Element %1 contains two attributes of type %2.</source>
+ <translation>Element %1 posiada dwa atrybuty typu %2.</translation>
+ </message>
+ <message>
+ <source>Attribute %1 contains invalid content.</source>
+ <translation>Atrybut %1 posiada niepoprawną zawartość.</translation>
+ </message>
+ <message>
+ <source>Element %1 contains unknown attribute %2.</source>
+ <translation>Element %1 posiada nieznany atrybut %2.</translation>
+ </message>
+ <message>
+ <source>Content of attribute %1 does not match its type definition: %2.</source>
+ <translation>Zawartość atrybutu %1 nie pasuje do jego definicji typu: %2.</translation>
+ </message>
+ <message>
+ <source>Content of attribute %1 does not match defined value constraint.</source>
+ <translation>Zawartość elementu %1 nie pasuje do zdefiniowanego ograniczenia wartości.</translation>
+ </message>
+ <message>
+ <source>Non-unique value found for constraint %1.</source>
+ <translation>Znaleziono nieunikatową wartość dla ograniczenia %1.</translation>
+ </message>
+ <message>
+ <source>Key constraint %1 contains absent fields.</source>
+ <translation>Ograniczenie klucza %1 zawiera nieobecne pola.</translation>
+ </message>
+ <message>
+ <source>Key constraint %1 contains references nillable element %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No referenced value found for key reference %1.</source>
+ <translation>Brak wartości do której odwołuje się klucz %1.</translation>
+ </message>
+ <message>
+ <source>More than one value found for field %1.</source>
+ <translation>Znaleziono więcej niż jedną wartość dla pola %1.</translation>
+ </message>
+ <message>
+ <source>Field %1 has no simple type.</source>
+ <translation>Pole %1 nie posiada prostego typu.</translation>
+ </message>
+ <message>
+ <source>ID value &apos;%1&apos; is not unique.</source>
+ <translation>Wartość ID &quot;%1&quot; nie jest unikatowa.</translation>
+ </message>
+ <message>
+ <source>&apos;%1&apos; attribute contains invalid QName content: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+</TS>
diff --git a/config.profiles/symbian/translations/qt_ru_symbian.ts b/config.profiles/symbian/translations/qt_ru_symbian.ts
new file mode 100644
index 0000000..b7e69cb
--- /dev/null
+++ b/config.profiles/symbian/translations/qt_ru_symbian.ts
@@ -0,0 +1,8522 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE TS>
+
+<TS version="2.0" language="ru">
+ <context>
+ <name>CloseButton</name>
+ <message>
+ <source>Close Tab</source>
+ <translation>Закрыть вкладку</translation>
+ </message>
+ </context>
+ <context>
+ <name>FakeReply</name>
+ <message>
+ <source>Fake error !</source>
+ <translation>Ошибка: фальшивый!</translation>
+ </message>
+ <message>
+ <source>Invalid URL</source>
+ <translation>Некорректный URL</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::</name>
+ <message>
+ <source>Notifications</source>
+ <translation>Уведомления</translation>
+ </message>
+ <message>
+ <source>Music</source>
+ <translation>Музыка</translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation>Видео</translation>
+ </message>
+ <message>
+ <source>Communication</source>
+ <translation>Общение</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation>Игры</translation>
+ </message>
+ <message>
+ <source>Accessibility</source>
+ <translation>Специальные возможности</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>&lt;html&gt;Звуковое устройство &lt;b&gt;%1&lt;/b&gt; не работает.&lt;br/&gt;Будет использоваться &lt;b&gt;%2&lt;/b&gt;.&lt;/html&gt;</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>&lt;html&gt;Переключение на звуковое устройство &lt;b&gt;%1&lt;/b&gt;&lt;br/&gt;, которое доступно и имеет высший приоритет.&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>Revert back to device &apos;%1&apos;</source>
+ <translation>Возвращение к устройству &apos;%1&apos;</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>Внимание: Похоже, пакет gstreamer0.10-plugins-good не установлен.
+ Некоторые возможности воспроизведения видео недоступны.</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>Внимание: Похоже, основной модуль GStreamer не установлен.
+ Поддержка видео и аудио отключена</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>Отсутствует необходимый кодек. Вам нужно установить следующие кодеки для воспроизведения данного содержимого: %0</translation>
+ </message>
+ <message>
+ <source>Could not open media source.</source>
+ <translation>Не удалось открыть источник медиа-данных.</translation>
+ </message>
+ <message>
+ <source>Invalid source type.</source>
+ <translation>Неверный тип источника медиа-данных.</translation>
+ </message>
+ <message>
+ <source>Could not locate media source.</source>
+ <translation>Не удалось найти источник медиа-данных.</translation>
+ </message>
+ <message>
+ <source>Could not open audio device. The device is already in use.</source>
+ <translation>Не удалось открыть звуковое устройство. Устройство уже используется.</translation>
+ </message>
+ <message>
+ <source>Could not decode media source.</source>
+ <translation>Не удалось декодировать источник медиа-данных.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF</name>
+ <message>
+ <source>Audio Output</source>
+ <translation>Воспроизведение звука</translation>
+ </message>
+ <message>
+ <source>The audio output device</source>
+ <translation>Устройство воспроизведения звука</translation>
+ </message>
+ <message>
+ <source>No error</source>
+ <translation>Нет ошибки</translation>
+ </message>
+ <message>
+ <source>Not found</source>
+ <translation>Не найдено</translation>
+ </message>
+ <message>
+ <source>Out of memory</source>
+ <translation>Недостаточно памяти</translation>
+ </message>
+ <message>
+ <source>Not supported</source>
+ <translation>Не поддерживается</translation>
+ </message>
+ <message>
+ <source>Overflow</source>
+ <translation>Переполнение</translation>
+ </message>
+ <message>
+ <source>Underflow</source>
+ <translation>Потеря значимости</translation>
+ </message>
+ <message>
+ <source>Already exists</source>
+ <translation>Уже существует</translation>
+ </message>
+ <message>
+ <source>Path not found</source>
+ <translation>Путь не найден</translation>
+ </message>
+ <message>
+ <source>In use</source>
+ <translation>Используется</translation>
+ </message>
+ <message>
+ <source>Not ready</source>
+ <translation>Не готово</translation>
+ </message>
+ <message>
+ <source>Access denied</source>
+ <translation>Доступ запрещен</translation>
+ </message>
+ <message>
+ <source>Could not connect</source>
+ <translation>Подключение невозможно</translation>
+ </message>
+ <message>
+ <source>Disconnected</source>
+ <translation>Разъединено</translation>
+ </message>
+ <message>
+ <source>Permission denied</source>
+ <translation>Отказано в разрешении</translation>
+ </message>
+ <message>
+ <source>Insufficient bandwidth</source>
+ <translation>Недостаточная скорость передачи</translation>
+ </message>
+ <message>
+ <source>Network unavailable</source>
+ <translation>Сеть недоступна</translation>
+ </message>
+ <message>
+ <source>Network communication error</source>
+ <translation>Сетевая ошибка связи</translation>
+ </message>
+ <message>
+ <source>Streaming not supported</source>
+ <translation>Потоки не поддерживаются</translation>
+ </message>
+ <message>
+ <source>Server alert</source>
+ <translation>Сигнал сервера</translation>
+ </message>
+ <message>
+ <source>Invalid protocol</source>
+ <translation>Неверный протокол</translation>
+ </message>
+ <message>
+ <source>Invalid URL</source>
+ <translation>Неверный адрес URL</translation>
+ </message>
+ <message>
+ <source>Multicast error</source>
+ <translation>Ошибка групповой передачи</translation>
+ </message>
+ <message>
+ <source>Proxy server error</source>
+ <translation>Ошибка прокси-сервера</translation>
+ </message>
+ <message>
+ <source>Proxy server not supported</source>
+ <translation>Прокси-сервер не поддерживается</translation>
+ </message>
+ <message>
+ <source>Audio output error</source>
+ <translation>Ошибка вывода аудио</translation>
+ </message>
+ <message>
+ <source>Video output error</source>
+ <translation>Ошибка вывода видео</translation>
+ </message>
+ <message>
+ <source>Decoder error</source>
+ <translation>Ошибка декодера</translation>
+ </message>
+ <message>
+ <source>Audio or video components could not be played</source>
+ <translation>Невозможно воспроизвести аудио или видеокомпоненты</translation>
+ </message>
+ <message>
+ <source>DRM error</source>
+ <translation>Ошибка DRM</translation>
+ </message>
+ <message>
+ <source>Unknown error (%1)</source>
+ <translation>Неизвестная ошибка (%1)</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::AbstractMediaPlayer</name>
+ <message>
+ <source>Not ready to play</source>
+ <translation>Не готов к воспроизведению</translation>
+ </message>
+ <message>
+ <source>Error opening file</source>
+ <translation>Ошибка при открытии файла</translation>
+ </message>
+ <message>
+ <source>Error opening URL</source>
+ <translation>Ошибка при открытии адреса URL</translation>
+ </message>
+ <message>
+ <source>Setting volume failed</source>
+ <translation>Сбой при настройке громкости</translation>
+ </message>
+ <message>
+ <source>Playback complete</source>
+ <translation>Воспроизведение завершено</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::AudioEqualizer</name>
+ <message>
+ <source>%1 Hz</source>
+ <translation>%1 Гц</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::AudioPlayer</name>
+ <message>
+ <source>Getting position failed</source>
+ <translation>Сбой определения позиции</translation>
+ </message>
+ <message>
+ <source>Opening clip failed</source>
+ <translation>Сбой при открытии клипа</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::EffectFactory</name>
+ <message>
+ <source>Enabled</source>
+ <translation>Включено</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::EnvironmentalReverb</name>
+ <message>
+ <source>Decay HF ratio (%)</source>
+ <translation>Коэффициент затухания ВЧ (%)</translation>
+ </message>
+ <message>
+ <source>Decay time (ms)</source>
+ <translation>Время затухания (мс)</translation>
+ </message>
+ <message>
+ <source>Density (%)</source>
+ <translation>Плотность (%)</translation>
+ </message>
+ <message>
+ <source>Diffusion (%)</source>
+ <translation>Рассеяние (%)</translation>
+ </message>
+ <message>
+ <source>Reflections delay (ms)</source>
+ <translation>Затухание отражений (мс)</translation>
+ </message>
+ <message>
+ <source>Reflections level (mB)</source>
+ <translation>Уровень отражений (Мбит)</translation>
+ </message>
+ <message>
+ <source>Reverb delay (ms)</source>
+ <translation>Задержка реверберации (мс)</translation>
+ </message>
+ <message>
+ <source>Reverb level (mB)</source>
+ <translation>Уровень реверберации (Мбит)</translation>
+ </message>
+ <message>
+ <source>Room HF level</source>
+ <translation>Уровень ВЧ помещения</translation>
+ </message>
+ <message>
+ <source>Room level (mB)</source>
+ <translation>Уровень помещения (Мбит)</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::MediaObject</name>
+ <message>
+ <source>Error opening source: type not supported</source>
+ <translation>Ошибка при открытии источника: тип не поддерживается</translation>
+ </message>
+ <message>
+ <source>Error opening source: media type could not be determined</source>
+ <translation>Ошибка при открытии источника: тип носителя определить невозможно</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::StereoWidening</name>
+ <message>
+ <source>Level (%)</source>
+ <translation>Уровень (%)</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::VideoPlayer</name>
+ <message>
+ <source>Pause failed</source>
+ <translation>Сбой паузы</translation>
+ </message>
+ <message>
+ <source>Seek failed</source>
+ <translation>Сбой при поиске</translation>
+ </message>
+ <message>
+ <source>Getting position failed</source>
+ <translation>Сбой определения позиции</translation>
+ </message>
+ <message>
+ <source>Opening clip failed</source>
+ <translation>Сбой при открытии клипа</translation>
+ </message>
+ <message>
+ <source>Buffering clip failed</source>
+ <translation>Сбой при буферизации клипа</translation>
+ </message>
+ <message>
+ <source>Video display error</source>
+ <translation>Ошибка отображения видео</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::VolumeSlider</name>
+ <message>
+ <source>Volume: %1%</source>
+ <translation>Громкость: %1%</translation>
+ </message>
+ <message>
+ <source>Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%</source>
+ <translation>Используйте данный ползунок для настройки громкости. Крайнее левое положение соответствует 0%, крайнее правое - %1%</translation>
+ </message>
+ <message>
+ <source>Muted</source>
+ <translation>Без звука</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3Accel</name>
+ <message>
+ <source>%1, %2 not defined</source>
+ <translation>%1, %2 не определён</translation>
+ </message>
+ <message>
+ <source>Ambiguous %1 not handled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3DataTable</name>
+ <message>
+ <source>True</source>
+ <translation>Да</translation>
+ </message>
+ <message>
+ <source>False</source>
+ <translation>Нет</translation>
+ </message>
+ <message>
+ <source>Insert</source>
+ <translation>Вставить</translation>
+ </message>
+ <message>
+ <source>Update</source>
+ <translation>Обновить</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>Удалить</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3FileDialog</name>
+ <message>
+ <source>Copy or Move a File</source>
+ <translation>Копировать или переместить файл</translation>
+ </message>
+ <message>
+ <source>Read: %1</source>
+ <translation>Чтение: %1</translation>
+ </message>
+ <message>
+ <source>Write: %1</source>
+ <translation>Запись: %1</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <source>All Files (*)</source>
+ <translation>Все файлы (*)</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Имя</translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation>Размер</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>Тип</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation>Дата</translation>
+ </message>
+ <message>
+ <source>Attributes</source>
+ <translation>Атрибуты</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;ОК</translation>
+ </message>
+ <message>
+ <source>Look &amp;in:</source>
+ <translation>&amp;Папка:</translation>
+ </message>
+ <message>
+ <source>File &amp;name:</source>
+ <translation>&amp;Имя файла:</translation>
+ </message>
+ <message>
+ <source>File &amp;type:</source>
+ <translation>&amp;Тип файла:</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation>Назад</translation>
+ </message>
+ <message>
+ <source>One directory up</source>
+ <translation>Вверх на один уровень</translation>
+ </message>
+ <message>
+ <source>Create New Folder</source>
+ <translation>Создать папку</translation>
+ </message>
+ <message>
+ <source>List View</source>
+ <translation>Список</translation>
+ </message>
+ <message>
+ <source>Detail View</source>
+ <translation>Подробный вид</translation>
+ </message>
+ <message>
+ <source>Preview File Info</source>
+ <translation>Предпросмотр информации о файле</translation>
+ </message>
+ <message>
+ <source>Preview File Contents</source>
+ <translation>Предпросмотр содержимого файла</translation>
+ </message>
+ <message>
+ <source>Read-write</source>
+ <translation>Чтение и запись</translation>
+ </message>
+ <message>
+ <source>Read-only</source>
+ <translation>Только чтение</translation>
+ </message>
+ <message>
+ <source>Write-only</source>
+ <translation>Только запись</translation>
+ </message>
+ <message>
+ <source>Inaccessible</source>
+ <translation>Нет доступа</translation>
+ </message>
+ <message>
+ <source>Symlink to File</source>
+ <translation>Ссылка на файл</translation>
+ </message>
+ <message>
+ <source>Symlink to Directory</source>
+ <translation>Ссылка на каталог</translation>
+ </message>
+ <message>
+ <source>Symlink to Special</source>
+ <translation>Ссылка на спецфайл</translation>
+ </message>
+ <message>
+ <source>File</source>
+ <translation>Файл</translation>
+ </message>
+ <message>
+ <source>Dir</source>
+ <translation>Каталог</translation>
+ </message>
+ <message>
+ <source>Special</source>
+ <translation>Спецфайл</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>Открыть</translation>
+ </message>
+ <message>
+ <source>Save As</source>
+ <translation>Сохранить как</translation>
+ </message>
+ <message>
+ <source>&amp;Open</source>
+ <translation>&amp;Открыть</translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation>&amp;Сохранить</translation>
+ </message>
+ <message>
+ <source>&amp;Rename</source>
+ <translation>&amp;Переименовать</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Удалить</translation>
+ </message>
+ <message>
+ <source>R&amp;eload</source>
+ <translation>О&amp;бновить</translation>
+ </message>
+ <message>
+ <source>Sort by &amp;Name</source>
+ <translation>По &amp;имени</translation>
+ </message>
+ <message>
+ <source>Sort by &amp;Size</source>
+ <translation>По &amp;размеру</translation>
+ </message>
+ <message>
+ <source>Sort by &amp;Date</source>
+ <translation>По &amp;дате</translation>
+ </message>
+ <message>
+ <source>&amp;Unsorted</source>
+ <translation>&amp;Не упорядочивать</translation>
+ </message>
+ <message>
+ <source>Sort</source>
+ <translation>Упорядочить</translation>
+ </message>
+ <message>
+ <source>Show &amp;hidden files</source>
+ <translation>Показать ск&amp;рытые файлы</translation>
+ </message>
+ <message>
+ <source>the file</source>
+ <translation>файл</translation>
+ </message>
+ <message>
+ <source>the directory</source>
+ <translation>каталог</translation>
+ </message>
+ <message>
+ <source>the symlink</source>
+ <translation>ссылку</translation>
+ </message>
+ <message>
+ <source>Delete %1</source>
+ <translation>Удалить %1</translation>
+ </message>
+ <message>
+ <source>&lt;qt&gt;Are you sure you wish to delete %1 &quot;%2&quot;?&lt;/qt&gt;</source>
+ <translation>&lt;qt&gt;Вы действительно хотите удалить %1 &quot;%2&quot;?&lt;/qt&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Yes</source>
+ <translation>&amp;Да</translation>
+ </message>
+ <message>
+ <source>&amp;No</source>
+ <translation>&amp;Нет</translation>
+ </message>
+ <message>
+ <source>New Folder 1</source>
+ <translation>Новая папка 1</translation>
+ </message>
+ <message>
+ <source>New Folder</source>
+ <translation>Новая папка</translation>
+ </message>
+ <message>
+ <source>New Folder %1</source>
+ <translation>Новая папка %1</translation>
+ </message>
+ <message>
+ <source>Find Directory</source>
+ <translation>Найти каталог</translation>
+ </message>
+ <message>
+ <source>Directories</source>
+ <translation>Каталоги</translation>
+ </message>
+ <message>
+ <source>Directory:</source>
+ <translation>Каталог:</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Ошибка</translation>
+ </message>
+ <message>
+ <source>%1
+File not found.
+Check path and filename.</source>
+ <translation>%1
+Файл не найден.
+Проверьте правильность пути и имени файла.</translation>
+ </message>
+ <message>
+ <source>All Files (*.*)</source>
+ <translation>Все файлы (*.*)</translation>
+ </message>
+ <message>
+ <source>Open </source>
+ <translation>Открыть </translation>
+ </message>
+ <message>
+ <source>Select a Directory</source>
+ <translation>Выбрать каталог</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3LocalFs</name>
+ <message>
+ <source>Could not read directory
+%1</source>
+ <translation>Не удалось прочитать каталог
+%1</translation>
+ </message>
+ <message>
+ <source>Could not create directory
+%1</source>
+ <translation>Не удалось создать каталог
+%1</translation>
+ </message>
+ <message>
+ <source>Could not remove file or directory
+%1</source>
+ <translation>Не удалось удалить файл или каталог
+%1</translation>
+ </message>
+ <message>
+ <source>Could not rename
+%1
+to
+%2</source>
+ <translation>Не удалось переименовать
+%1
+%2</translation>
+ </message>
+ <message>
+ <source>Could not open
+%1</source>
+ <translation>Не удалось открыть
+%1</translation>
+ </message>
+ <message>
+ <source>Could not write
+%1</source>
+ <translation>Не удалось записать
+%1</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3MainWindow</name>
+ <message>
+ <source>Line up</source>
+ <translation>Выровнять</translation>
+ </message>
+ <message>
+ <source>Customize...</source>
+ <translation>Настроить...</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3NetworkProtocol</name>
+ <message>
+ <source>Operation stopped by the user</source>
+ <translation>Операция остановлена пользователем</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3ProgressDialog</name>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3TabDialog</name>
+ <message>
+ <source>OK</source>
+ <translation>ОК</translation>
+ </message>
+ <message>
+ <source>Apply</source>
+ <translation>Применить</translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation>Справка</translation>
+ </message>
+ <message>
+ <source>Defaults</source>
+ <translation>По умолчанию</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3TextEdit</name>
+ <message>
+ <source>&amp;Undo</source>
+ <translation>&amp;Отменить действие</translation>
+ </message>
+ <message>
+ <source>&amp;Redo</source>
+ <translation>&amp;Повторить действие</translation>
+ </message>
+ <message>
+ <source>Cu&amp;t</source>
+ <translation>&amp;Вырезать</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>&amp;Копировать</translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation>В&amp;ставить</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Очистить</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation>Выделить всё</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3TitleBar</name>
+ <message>
+ <source>System</source>
+ <translation>Системное меню</translation>
+ </message>
+ <message>
+ <source>Restore up</source>
+ <translation>Восстановить</translation>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation>Свернуть</translation>
+ </message>
+ <message>
+ <source>Restore down</source>
+ <translation>Восстановить</translation>
+ </message>
+ <message>
+ <source>Maximize</source>
+ <translation>Распахнуть</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Закрыть</translation>
+ </message>
+ <message>
+ <source>Contains commands to manipulate the window</source>
+ <translation>Содержит команды управления окном</translation>
+ </message>
+ <message>
+ <source>Puts a minimized window back to normal</source>
+ <translation>Возвращает свёрнутое окно в нормальное состояние</translation>
+ </message>
+ <message>
+ <source>Moves the window out of the way</source>
+ <translation>Сворачивает окно</translation>
+ </message>
+ <message>
+ <source>Puts a maximized window back to normal</source>
+ <translation>Возвращает распахнутое окно в нормальное состояние</translation>
+ </message>
+ <message>
+ <source>Makes the window full screen</source>
+ <translation>Разворачивает окно на весь экран</translation>
+ </message>
+ <message>
+ <source>Closes the window</source>
+ <translation>Зыкрывает окно</translation>
+ </message>
+ <message>
+ <source>Displays the name of the window and contains controls to manipulate it</source>
+ <translation>Отображает название окна и содержит команды управления им</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3ToolBar</name>
+ <message>
+ <source>More...</source>
+ <translation>Больше...</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3UrlOperator</name>
+ <message>
+ <source>The protocol `%1&apos; is not supported</source>
+ <translation>Протокол &apos;%1&apos; не поддерживается</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support listing directories</source>
+ <translation>Протокол &apos;%1&apos; не поддерживает просмотр каталогов</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support creating new directories</source>
+ <translation>Протокол &apos;%1&apos; не поддерживает создание каталогов</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support removing files or directories</source>
+ <translation>Протокол &apos;%1&apos; не поддерживает удаление файлов или каталогов</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support renaming files or directories</source>
+ <translation>Протокол &apos;%1&apos; не поддерживает переименование файлов или каталогов</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support getting files</source>
+ <translation>Протокол &apos;%1&apos; не поддерживает доставку файлов</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support putting files</source>
+ <translation>Протокол &apos;%1&apos; не поддерживает отправку файлов</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support copying or moving files or directories</source>
+ <translation>Протокол &apos;%1&apos; не поддерживает копирование или перемещение файлов или каталогов</translation>
+ </message>
+ <message>
+ <source>(unknown)</source>
+ <translation>(неизвестно)</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3Wizard</name>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>От&amp;мена</translation>
+ </message>
+ <message>
+ <source>&lt; &amp;Back</source>
+ <translation>&lt; &amp;Назад</translation>
+ </message>
+ <message>
+ <source>&amp;Next &gt;</source>
+ <translation>&amp;Далее &gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Finish</source>
+ <translation>&amp;Завершить</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>&amp;Справка</translation>
+ </message>
+ </context>
+ <context>
+ <name>QAbstractSocket</name>
+ <message>
+ <source>Host not found</source>
+ <translation>Узел не найден</translation>
+ </message>
+ <message>
+ <source>Connection refused</source>
+ <translation>Отказано в соединении</translation>
+ </message>
+ <message>
+ <source>Connection timed out</source>
+ <translation>Время на соединение истекло</translation>
+ </message>
+ <message>
+ <source>Operation on socket is not supported</source>
+ <translation>Операция с сокетом не поддерживается</translation>
+ </message>
+ <message>
+ <source>Socket operation timed out</source>
+ <translation>Время на операцию с сокетом истекло</translation>
+ </message>
+ <message>
+ <source>Socket is not connected</source>
+ <translation>Сокет не подключён</translation>
+ </message>
+ <message>
+ <source>Network unreachable</source>
+ <translation>Сеть недоступна</translation>
+ </message>
+ </context>
+ <context>
+ <name>QAbstractSpinBox</name>
+ <message>
+ <source>&amp;Step up</source>
+ <translation>Шаг вв&amp;ерх</translation>
+ </message>
+ <message>
+ <source>Step &amp;down</source>
+ <translation>Шаг вн&amp;из</translation>
+ </message>
+ <message>
+ <source>&amp;Select All</source>
+ <translation>&amp;Выделить всё</translation>
+ </message>
+ </context>
+ <context>
+ <name>QAccessibleButton</name>
+ <message>
+ <source>Press</source>
+ <translation>Нажмите</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>LTR</translation>
+ </message>
+ <message>
+ <source>Executable &apos;%1&apos; requires Qt %2, found Qt %3.</source>
+ <translation>Программный модуль &apos;%1&apos; требует Qt %2, найдена версия %3.</translation>
+ </message>
+ <message>
+ <source>Incompatible Qt Library Error</source>
+ <translation>Ошибка совместимости библиотеки Qt</translation>
+ </message>
+ <message>
+ <source>Activate</source>
+ <translation>Активировать</translation>
+ </message>
+ <message>
+ <source>Activates the program&apos;s main window</source>
+ <translation>Активирует главное окно программы</translation>
+ </message>
+ </context>
+ <context>
+ <name>QAxSelect</name>
+ <message>
+ <source>Select ActiveX Control</source>
+ <translation>Выбор компоненты ActiveX</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>Выбрать</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>От&amp;мена</translation>
+ </message>
+ <message>
+ <source>COM &amp;Object:</source>
+ <translation>&amp;Объект COM:</translation>
+ </message>
+ </context>
+ <context>
+ <name>QCheckBox</name>
+ <message>
+ <source>Uncheck</source>
+ <translation>Снять отметку</translation>
+ </message>
+ <message>
+ <source>Check</source>
+ <translation>Отметить</translation>
+ </message>
+ <message>
+ <source>Toggle</source>
+ <translation>Переключить</translation>
+ </message>
+ </context>
+ <context>
+ <name>QColorDialog</name>
+ <message>
+ <source>Hu&amp;e:</source>
+ <translation>&amp;Тон:</translation>
+ </message>
+ <message>
+ <source>&amp;Sat:</source>
+ <translation>&amp;Нас:</translation>
+ </message>
+ <message>
+ <source>&amp;Val:</source>
+ <translation>&amp;Ярк:</translation>
+ </message>
+ <message>
+ <source>&amp;Red:</source>
+ <translation>&amp;Красный:</translation>
+ </message>
+ <message>
+ <source>&amp;Green:</source>
+ <translation>&amp;Зелёный:</translation>
+ </message>
+ <message>
+ <source>Bl&amp;ue:</source>
+ <translation>С&amp;иний:</translation>
+ </message>
+ <message>
+ <source>A&amp;lpha channel:</source>
+ <translation>&amp;Альфа-канал:</translation>
+ </message>
+ <message>
+ <source>Select Color</source>
+ <translation>Выбор цвета</translation>
+ </message>
+ <message>
+ <source>&amp;Basic colors</source>
+ <translation>&amp;Основные цвета</translation>
+ </message>
+ <message>
+ <source>&amp;Custom colors</source>
+ <translation>&amp;Пользовательские цвета</translation>
+ </message>
+ <message>
+ <source>&amp;Add to Custom Colors</source>
+ <translation>&amp;Добавить к пользовательским цветам</translation>
+ </message>
+ </context>
+ <context>
+ <name>QComboBox</name>
+ <message>
+ <source>Open</source>
+ <translation>Открыть</translation>
+ </message>
+ <message>
+ <source>False</source>
+ <translation>Нет</translation>
+ </message>
+ <message>
+ <source>True</source>
+ <translation>Да</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Закрыть</translation>
+ </message>
+ </context>
+ <context>
+ <name>QCoreApplication</name>
+ <message>
+ <source>%1: key is empty</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1: пустой ключ</translation>
+ </message>
+ <message>
+ <source>%1: unable to make key</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1: невозможно создать ключ</translation>
+ </message>
+ <message>
+ <source>%1: ftok failed</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1: ошибка ftok</translation>
+ </message>
+ <message>
+ <source>%1: already exists</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1: уже существует</translation>
+ </message>
+ <message>
+ <source>%1: does not exist</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1: не существует</translation>
+ </message>
+ <message>
+ <source>%1: out of resources</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1: недостаточно ресурсов</translation>
+ </message>
+ <message>
+ <source>%1: unknown error %2</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1: неизвестная ошибка %2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QDB2Driver</name>
+ <message>
+ <source>Unable to connect</source>
+ <translation>Невозможно соединиться</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>Невозможно завершить транзакцию</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>Невозможно отозвать транзакцию</translation>
+ </message>
+ <message>
+ <source>Unable to set autocommit</source>
+ <translation>Невозможно установить автозавершение транзакций</translation>
+ </message>
+ </context>
+ <context>
+ <name>QDB2Result</name>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>Невозможно выполнить выражение</translation>
+ </message>
+ <message>
+ <source>Unable to prepare statement</source>
+ <translation>Невозможно подготовить выражение</translation>
+ </message>
+ <message>
+ <source>Unable to bind variable</source>
+ <translation>Невозможно привязать значение</translation>
+ </message>
+ <message>
+ <source>Unable to fetch record %1</source>
+ <translation>Невозможно получить запись %1</translation>
+ </message>
+ <message>
+ <source>Unable to fetch next</source>
+ <translation>Невозможно получить следующую строку</translation>
+ </message>
+ <message>
+ <source>Unable to fetch first</source>
+ <translation>Невозможно получить первую строку</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>Что это?</translation>
+ </message>
+ <message>
+ <source>Done</source>
+ <translation>Готово</translation>
+ </message>
+ </context>
+ <context>
+ <name>QDialogButtonBox</name>
+ <message>
+ <source>OK</source>
+ <translation>ОК</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation>Сохранить</translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation>&amp;Сохранить</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>Открыть</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>От&amp;мена</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Закрыть</translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation>&amp;Закрыть</translation>
+ </message>
+ <message>
+ <source>Apply</source>
+ <translation>Применить</translation>
+ </message>
+ <message>
+ <source>Reset</source>
+ <translation>Сбросить</translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation>Справка</translation>
+ </message>
+ <message>
+ <source>Don&apos;t Save</source>
+ <translation>Не сохранять</translation>
+ </message>
+ <message>
+ <source>Discard</source>
+ <translation>Отклонить</translation>
+ </message>
+ <message>
+ <source>&amp;Yes</source>
+ <translation>&amp;Да</translation>
+ </message>
+ <message>
+ <source>Yes to &amp;All</source>
+ <translation>Да для &amp;всех</translation>
+ </message>
+ <message>
+ <source>&amp;No</source>
+ <translation>&amp;Нет</translation>
+ </message>
+ <message>
+ <source>N&amp;o to All</source>
+ <translation>Н&amp;ет для всех</translation>
+ </message>
+ <message>
+ <source>Save All</source>
+ <translation>Сохранить все</translation>
+ </message>
+ <message>
+ <source>Abort</source>
+ <translation>Прервать</translation>
+ </message>
+ <message>
+ <source>Retry</source>
+ <translation>Повторить</translation>
+ </message>
+ <message>
+ <source>Ignore</source>
+ <translation>Пропустить</translation>
+ </message>
+ <message>
+ <source>Restore Defaults</source>
+ <translation>Восстановить значения</translation>
+ </message>
+ <message>
+ <source>Close without Saving</source>
+ <translation>Закрыть без сохранения</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;ОК</translation>
+ </message>
+ </context>
+ <context>
+ <name>QDirModel</name>
+ <message>
+ <source>Name</source>
+ <translation>Имя</translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation>Размер</translation>
+ </message>
+ <message>
+ <source>Kind</source>
+ <comment>Match OS X Finder</comment>
+ <translation>Вид</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <comment>All other platforms</comment>
+ <translation>Тип</translation>
+ </message>
+ <message>
+ <source>Date Modified</source>
+ <translation>Дата изменения</translation>
+ </message>
+ </context>
+ <context>
+ <name>QDockWidget</name>
+ <message>
+ <source>Close</source>
+ <translation>Закрыть</translation>
+ </message>
+ <message>
+ <source>Dock</source>
+ <translation>Прикрепить</translation>
+ </message>
+ <message>
+ <source>Float</source>
+ <translation>Открепить</translation>
+ </message>
+ </context>
+ <context>
+ <name>QDoubleSpinBox</name>
+ <message>
+ <source>More</source>
+ <translation>Больше</translation>
+ </message>
+ <message>
+ <source>Less</source>
+ <translation>Меньше</translation>
+ </message>
+ </context>
+ <context>
+ <name>QErrorMessage</name>
+ <message>
+ <source>&amp;Show this message again</source>
+ <translation>&amp;Показывать это сообщение в дальнейшем</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;Закрыть</translation>
+ </message>
+ <message>
+ <source>Debug Message:</source>
+ <translation>Отладочное сообщение:</translation>
+ </message>
+ <message>
+ <source>Warning:</source>
+ <translation>Предупреждение:</translation>
+ </message>
+ <message>
+ <source>Fatal Error:</source>
+ <translation>Критическая ошибка:</translation>
+ </message>
+ </context>
+ <context>
+ <name>QFile</name>
+ <message>
+ <source>Destination file exists</source>
+ <translation>Файл существует</translation>
+ </message>
+ <message>
+ <source>Will not rename sequential file using block copy</source>
+ <translation>Последовательный файл не будет переименован с использованием поблочного копирования</translation>
+ </message>
+ <message>
+ <source>Cannot remove source file</source>
+ <translation>Невозможно удалить исходный файл</translation>
+ </message>
+ <message>
+ <source>Cannot open %1 for input</source>
+ <translation>Невозможно открыть %1 для ввода</translation>
+ </message>
+ <message>
+ <source>Cannot open for output</source>
+ <translation>Невозможно открыть для вывода</translation>
+ </message>
+ <message>
+ <source>Failure to write block</source>
+ <translation>Сбой записи блока</translation>
+ </message>
+ <message>
+ <source>Cannot create %1 for output</source>
+ <translation>Невозможно создать %1 для вывода</translation>
+ </message>
+ </context>
+ <context>
+ <name>QFileDialog</name>
+ <message>
+ <source>All Files (*)</source>
+ <translation>Все файлы (*)</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation>Назад</translation>
+ </message>
+ <message>
+ <source>List View</source>
+ <translation>Список</translation>
+ </message>
+ <message>
+ <source>Detail View</source>
+ <translation>Подробный вид</translation>
+ </message>
+ <message>
+ <source>File</source>
+ <translation>Файл</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>Открыть</translation>
+ </message>
+ <message>
+ <source>Save As</source>
+ <translation>Сохранить как</translation>
+ </message>
+ <message>
+ <source>&amp;Open</source>
+ <translation>&amp;Открыть</translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation>&amp;Сохранить</translation>
+ </message>
+ <message>
+ <source>Recent Places</source>
+ <translation>Недавние документы</translation>
+ </message>
+ <message>
+ <source>&amp;Rename</source>
+ <translation>&amp;Переименовать</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Удалить</translation>
+ </message>
+ <message>
+ <source>Show &amp;hidden files</source>
+ <translation>Показать ск&amp;рытые файлы</translation>
+ </message>
+ <message>
+ <source>New Folder</source>
+ <translation>Новая папка</translation>
+ </message>
+ <message>
+ <source>Find Directory</source>
+ <translation>Найти каталог</translation>
+ </message>
+ <message>
+ <source>Directories</source>
+ <translation>Каталоги</translation>
+ </message>
+ <message>
+ <source>All Files (*.*)</source>
+ <translation>Все файлы (*.*)</translation>
+ </message>
+ <message>
+ <source>Directory:</source>
+ <translation>Каталог:</translation>
+ </message>
+ <message>
+ <source>%1 already exists.
+Do you want to replace it?</source>
+ <translation>%1 уже существует.
+Хотите заменить его?</translation>
+ </message>
+ <message>
+ <source>%1
+File not found.
+Please verify the correct file name was given.</source>
+ <translation>%1
+Файл не найден.
+Проверьте правильность указанного имени файла.</translation>
+ </message>
+ <message>
+ <source>My Computer</source>
+ <translation>Мой компьютер</translation>
+ </message>
+ <message>
+ <source>Parent Directory</source>
+ <translation>Родительский каталог</translation>
+ </message>
+ <message>
+ <source>Files of type:</source>
+ <translation>Типы файлов:</translation>
+ </message>
+ <message>
+ <source>%1
+Directory not found.
+Please verify the correct directory name was given.</source>
+ <translation>%1
+Каталог не найден.
+Проверьте правильность указанного имени каталога.</translation>
+ </message>
+ <message>
+ <source>&apos;%1&apos; is write protected.
+Do you want to delete it anyway?</source>
+ <translation>&apos;%1&apos; защищён от записи.
+Всё-равно хотите удалить?</translation>
+ </message>
+ <message>
+ <source>Are sure you want to delete &apos;%1&apos;?</source>
+ <translation>Вы действительно хотите удалить &apos;%1&apos;?</translation>
+ </message>
+ <message>
+ <source>Could not delete directory.</source>
+ <translation>Не удалось удалить каталог.</translation>
+ </message>
+ <message>
+ <source>Drive</source>
+ <translation>Диск</translation>
+ </message>
+ <message>
+ <source>File Folder</source>
+ <comment>Match Windows Explorer</comment>
+ <translation>Папка с файлами</translation>
+ </message>
+ <message>
+ <source>Folder</source>
+ <comment>All other platforms</comment>
+ <translation>Папка</translation>
+ </message>
+ <message>
+ <source>Alias</source>
+ <comment>Mac OS X Finder</comment>
+ <translation>Псевдоним</translation>
+ </message>
+ <message>
+ <source>Shortcut</source>
+ <comment>All other platforms</comment>
+ <translation>Ярлык</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation>Неизвестный</translation>
+ </message>
+ <message>
+ <source>Show </source>
+ <translation>Показать </translation>
+ </message>
+ <message>
+ <source>Forward</source>
+ <translation>Вперёд</translation>
+ </message>
+ <message>
+ <source>&amp;New Folder</source>
+ <translation>&amp;Новая папка</translation>
+ </message>
+ <message>
+ <source>&amp;Choose</source>
+ <translation>&amp;Выбрать</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Удалить</translation>
+ </message>
+ <message>
+ <source>File &amp;name:</source>
+ <translation>&amp;Имя файла:</translation>
+ </message>
+ <message>
+ <source>Look in:</source>
+ <translation>Перейти к:</translation>
+ </message>
+ <message>
+ <source>Create New Folder</source>
+ <translation>Создать папку</translation>
+ </message>
+ </context>
+ <context>
+ <name>QFileSystemModel</name>
+ <message>
+ <source>%1 TB</source>
+ <translation>%1 Тб</translation>
+ </message>
+ <message>
+ <source>%1 GB</source>
+ <translation>%1 Гб</translation>
+ </message>
+ <message>
+ <source>%1 MB</source>
+ <translation>%1 Мб</translation>
+ </message>
+ <message>
+ <source>%1 KB</source>
+ <translation>%1 Кб</translation>
+ </message>
+ <message>
+ <source>%1 bytes</source>
+ <translation>%1 байт</translation>
+ </message>
+ <message>
+ <source>Invalid filename</source>
+ <translation>Некорректное имя файла</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;Имя &quot;%1&quot; не может быть использовано.&lt;/b&gt;&lt;p&gt;Попробуйте использовать имя меньшей длины и/или без символов пунктуации.</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Имя</translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation>Размер</translation>
+ </message>
+ <message>
+ <source>Kind</source>
+ <comment>Match OS X Finder</comment>
+ <translation>Вид</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <comment>All other platforms</comment>
+ <translation>Тип</translation>
+ </message>
+ <message>
+ <source>Date Modified</source>
+ <translation>Дата изменения</translation>
+ </message>
+ <message>
+ <source>My Computer</source>
+ <translation>Мой компьютер</translation>
+ </message>
+ <message>
+ <source>Computer</source>
+ <translation>Компьютер</translation>
+ </message>
+ <message>
+ <source>%1 byte(s)</source>
+ <translation>%1 байт(ов)</translation>
+ </message>
+ </context>
+ <context>
+ <name>QFontDatabase</name>
+ <message>
+ <source>Normal</source>
+ <translation>Обычный</translation>
+ </message>
+ <message>
+ <source>Bold</source>
+ <translation>Жирный</translation>
+ </message>
+ <message>
+ <source>Demi Bold</source>
+ <translation>Полужирный</translation>
+ </message>
+ <message>
+ <source>Black</source>
+ <translation>Чёрный</translation>
+ </message>
+ <message>
+ <source>Demi</source>
+ <translation>Средний</translation>
+ </message>
+ <message>
+ <source>Light</source>
+ <translation>Светлый</translation>
+ </message>
+ <message>
+ <source>Italic</source>
+ <translation>Курсив</translation>
+ </message>
+ <message>
+ <source>Oblique</source>
+ <translation>Наклонный</translation>
+ </message>
+ <message>
+ <source>Any</source>
+ <translation>Любая</translation>
+ </message>
+ <message>
+ <source>Latin</source>
+ <translation>Латиница</translation>
+ </message>
+ <message>
+ <source>Greek</source>
+ <translation>Греческая</translation>
+ </message>
+ <message>
+ <source>Cyrillic</source>
+ <translation>Кириллица</translation>
+ </message>
+ <message>
+ <source>Armenian</source>
+ <translation>Армянская</translation>
+ </message>
+ <message>
+ <source>Hebrew</source>
+ <translation>Иврит</translation>
+ </message>
+ <message>
+ <source>Arabic</source>
+ <translation>Арабская</translation>
+ </message>
+ <message>
+ <source>Syriac</source>
+ <translation>Сирийская</translation>
+ </message>
+ <message>
+ <source>Thaana</source>
+ <translation>Таана</translation>
+ </message>
+ <message>
+ <source>Devanagari</source>
+ <translation>Деванагири</translation>
+ </message>
+ <message>
+ <source>Bengali</source>
+ <translation>Бенгальская</translation>
+ </message>
+ <message>
+ <source>Gurmukhi</source>
+ <translation>Гурмукхи</translation>
+ </message>
+ <message>
+ <source>Gujarati</source>
+ <translation>Гуджарати</translation>
+ </message>
+ <message>
+ <source>Oriya</source>
+ <translation>Ория</translation>
+ </message>
+ <message>
+ <source>Tamil</source>
+ <translation>Тамильская</translation>
+ </message>
+ <message>
+ <source>Telugu</source>
+ <translation>Телугу</translation>
+ </message>
+ <message>
+ <source>Kannada</source>
+ <translation>Каннада</translation>
+ </message>
+ <message>
+ <source>Malayalam</source>
+ <translation>Малайялам</translation>
+ </message>
+ <message>
+ <source>Sinhala</source>
+ <translation>Сингальская</translation>
+ </message>
+ <message>
+ <source>Thai</source>
+ <translation>Тайская</translation>
+ </message>
+ <message>
+ <source>Lao</source>
+ <translation>Лаосская</translation>
+ </message>
+ <message>
+ <source>Tibetan</source>
+ <translation>Тибетская</translation>
+ </message>
+ <message>
+ <source>Myanmar</source>
+ <translation>Мьянма</translation>
+ </message>
+ <message>
+ <source>Georgian</source>
+ <translation>Грузинская</translation>
+ </message>
+ <message>
+ <source>Khmer</source>
+ <translation>Кхмерская</translation>
+ </message>
+ <message>
+ <source>Simplified Chinese</source>
+ <translation>Китайская упрощенная</translation>
+ </message>
+ <message>
+ <source>Traditional Chinese</source>
+ <translation>Китайская традиционная</translation>
+ </message>
+ <message>
+ <source>Japanese</source>
+ <translation>Японская</translation>
+ </message>
+ <message>
+ <source>Korean</source>
+ <translation>Корейская</translation>
+ </message>
+ <message>
+ <source>Vietnamese</source>
+ <translation>Вьетнамская</translation>
+ </message>
+ <message>
+ <source>Symbol</source>
+ <translation>Символьная</translation>
+ </message>
+ <message>
+ <source>Ogham</source>
+ <translation>Огамическая</translation>
+ </message>
+ <message>
+ <source>Runic</source>
+ <translation>Руническая</translation>
+ </message>
+ <message>
+ <source>N&apos;Ko</source>
+ <translation>##</translation>
+ </message>
+ </context>
+ <context>
+ <name>QFontDialog</name>
+ <message>
+ <source>&amp;Font</source>
+ <translation>&amp;Шрифт</translation>
+ </message>
+ <message>
+ <source>Font st&amp;yle</source>
+ <translation>&amp;Начертание</translation>
+ </message>
+ <message>
+ <source>&amp;Size</source>
+ <translation>&amp;Размер</translation>
+ </message>
+ <message>
+ <source>Effects</source>
+ <translation>Эффекты</translation>
+ </message>
+ <message>
+ <source>Stri&amp;keout</source>
+ <translation>Зачёр&amp;кнутый</translation>
+ </message>
+ <message>
+ <source>&amp;Underline</source>
+ <translation>П&amp;одчёркнутый</translation>
+ </message>
+ <message>
+ <source>Sample</source>
+ <translation>Пример</translation>
+ </message>
+ <message>
+ <source>Select Font</source>
+ <translation>Выбор шрифта</translation>
+ </message>
+ <message>
+ <source>Wr&amp;iting System</source>
+ <translation>&amp;Система письма</translation>
+ </message>
+ </context>
+ <context>
+ <name>QFtp</name>
+ <message>
+ <source>Host %1 found</source>
+ <translation>Узел %1 найден</translation>
+ </message>
+ <message>
+ <source>Host found</source>
+ <translation>Узел найден</translation>
+ </message>
+ <message>
+ <source>Connected to host %1</source>
+ <translation>Установлено соединение с узлом %1</translation>
+ </message>
+ <message>
+ <source>Connected to host</source>
+ <translation>Соединение с узлом установлено</translation>
+ </message>
+ <message>
+ <source>Connection to %1 closed</source>
+ <translation>Соединение с %1 закрыто</translation>
+ </message>
+ <message>
+ <source>Connection closed</source>
+ <translation>Соединение закрыто</translation>
+ </message>
+ <message>
+ <source>Host %1 not found</source>
+ <translation>Узел %1 не найден</translation>
+ </message>
+ <message>
+ <source>Connection refused to host %1</source>
+ <translation>В соединении с узлом %1 отказано</translation>
+ </message>
+ <message>
+ <source>Connection timed out to host %1</source>
+ <translation>Время на соединение с узлом %1 истекло</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>Неизвестная ошибка</translation>
+ </message>
+ <message>
+ <source>Connecting to host failed:
+%1</source>
+ <translation>Не удалось соединиться с узлом:
+%1</translation>
+ </message>
+ <message>
+ <source>Login failed:
+%1</source>
+ <translation>Не удалось авторизоваться:
+%1</translation>
+ </message>
+ <message>
+ <source>Listing directory failed:
+%1</source>
+ <translation>Не удалось прочитать каталог:
+%1</translation>
+ </message>
+ <message>
+ <source>Changing directory failed:
+%1</source>
+ <translation>Не удалось сменить каталог:
+%1</translation>
+ </message>
+ <message>
+ <source>Downloading file failed:
+%1</source>
+ <translation>Не удалось загрузить файл:
+%1</translation>
+ </message>
+ <message>
+ <source>Uploading file failed:
+%1</source>
+ <translation>Не удалось отгрузить файл:
+%1</translation>
+ </message>
+ <message>
+ <source>Removing file failed:
+%1</source>
+ <translation>Не удалось удалить файл:
+%1</translation>
+ </message>
+ <message>
+ <source>Creating directory failed:
+%1</source>
+ <translation>Не удалось создать каталог:
+%1</translation>
+ </message>
+ <message>
+ <source>Removing directory failed:
+%1</source>
+ <translation>Не удалось удалить каталог:
+%1</translation>
+ </message>
+ <message>
+ <source>Not connected</source>
+ <translation>Соединение не установлено</translation>
+ </message>
+ <message>
+ <source>Connection refused for data connection</source>
+ <translation>Отказ в соединении для передачи данных</translation>
+ </message>
+ </context>
+ <context>
+ <name>QHostInfo</name>
+ <message>
+ <source>Unknown error</source>
+ <translation>Неизвестная ошибка</translation>
+ </message>
+ </context>
+ <context>
+ <name>QHostInfoAgent</name>
+ <message>
+ <source>Host not found</source>
+ <translation>Узел не найден</translation>
+ </message>
+ <message>
+ <source>Unknown address type</source>
+ <translation>Неизвестный тип адреса</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>Неизвестная ошибка</translation>
+ </message>
+ <message>
+ <source>No host name given</source>
+ <translation>Имя узла не задано</translation>
+ </message>
+ <message>
+ <source>Invalid hostname</source>
+ <translation>Некорректное имя узла</translation>
+ </message>
+ </context>
+ <context>
+ <name>QHttp</name>
+ <message>
+ <source>Connection refused</source>
+ <translation>Отказано в соединении</translation>
+ </message>
+ <message>
+ <source>Host %1 not found</source>
+ <translation>Узел %1 не найден</translation>
+ </message>
+ <message>
+ <source>Wrong content length</source>
+ <translation>Неверная длина содержимого</translation>
+ </message>
+ <message>
+ <source>HTTP request failed</source>
+ <translation>HTTP-запрос не удался</translation>
+ </message>
+ <message>
+ <source>Host %1 found</source>
+ <translation>Узел %1 найден</translation>
+ </message>
+ <message>
+ <source>Host found</source>
+ <translation>Узел найден</translation>
+ </message>
+ <message>
+ <source>Connected to host %1</source>
+ <translation>Установлено соединение с узлом %1</translation>
+ </message>
+ <message>
+ <source>Connected to host</source>
+ <translation>Соединение с узлом установлено</translation>
+ </message>
+ <message>
+ <source>Connection to %1 closed</source>
+ <translation>Соединение с узлом %1 закрыто</translation>
+ </message>
+ <message>
+ <source>Connection closed</source>
+ <translation>Соединение закрыто</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>Неизвестная ошибка</translation>
+ </message>
+ <message>
+ <source>Request aborted</source>
+ <translation>Запрос прерван</translation>
+ </message>
+ <message>
+ <source>No server set to connect to</source>
+ <translation>Не указан сервер для подключения</translation>
+ </message>
+ <message>
+ <source>Server closed connection unexpectedly</source>
+ <translation>Сервер неожиданно разорвал соединение</translation>
+ </message>
+ <message>
+ <source>Invalid HTTP response header</source>
+ <translation>Некорректный HTTP-заголовок ответа</translation>
+ </message>
+ <message>
+ <source>Unknown authentication method</source>
+ <translation>Неизвестный метод авторизации</translation>
+ </message>
+ <message>
+ <source>Invalid HTTP chunked body</source>
+ <translation>Некорректное HTTP-фрагментирование данных</translation>
+ </message>
+ <message>
+ <source>Error writing response to device</source>
+ <translation>Ошибка записи ответа на устройство</translation>
+ </message>
+ <message>
+ <source>Proxy authentication required</source>
+ <translation>Требуется авторизация на прокси-сервере</translation>
+ </message>
+ <message>
+ <source>Authentication required</source>
+ <translation>Требуется авторизация</translation>
+ </message>
+ <message>
+ <source>Proxy requires authentication</source>
+ <translation>Прокси-сервер требует авторизацию</translation>
+ </message>
+ <message>
+ <source>Host requires authentication</source>
+ <translation>Узел требует авторизацию</translation>
+ </message>
+ <message>
+ <source>Data corrupted</source>
+ <translation>Данные повреждены</translation>
+ </message>
+ <message>
+ <source>SSL handshake failed</source>
+ <translation>Квитирование SSL не удалось</translation>
+ </message>
+ <message>
+ <source>Unknown protocol specified</source>
+ <translation>Указан неизвестный протокол</translation>
+ </message>
+ <message>
+ <source>Connection refused (or timed out)</source>
+ <translation>В соединении отказано (или время ожидания истекло)</translation>
+ </message>
+ <message>
+ <source>HTTPS connection requested but SSL support not compiled in</source>
+ <translation>Запрошено соединение по протоколу HTTPS, но поддержка SSL не скомпилирована</translation>
+ </message>
+ </context>
+ <context>
+ <name>QHttpSocketEngine</name>
+ <message>
+ <source>Did not receive HTTP response from proxy</source>
+ <translation>Не получен HTTP-ответ от прокси-сервера</translation>
+ </message>
+ <message>
+ <source>Error parsing authentication request from proxy</source>
+ <translation>Ошибка разбора запроса авторизации от прокси-сервера</translation>
+ </message>
+ <message>
+ <source>Authentication required</source>
+ <translation>Требуется авторизация</translation>
+ </message>
+ <message>
+ <source>Proxy denied connection</source>
+ <translation>Прокси-сервер запретил соединение</translation>
+ </message>
+ <message>
+ <source>Error communicating with HTTP proxy</source>
+ <translation>Ошибка обмена данными с прокси-сервером HTTP</translation>
+ </message>
+ <message>
+ <source>Proxy server not found</source>
+ <translation>Прокси-сервер не найден</translation>
+ </message>
+ <message>
+ <source>Proxy connection refused</source>
+ <translation>В соединении прокси-сервером отказано</translation>
+ </message>
+ <message>
+ <source>Proxy server connection timed out</source>
+ <translation>Время на соединение с прокси-сервером истекло</translation>
+ </message>
+ <message>
+ <source>Proxy connection closed prematurely</source>
+ <translation>Соединение с прокси-сервером неожиданно закрыто</translation>
+ </message>
+ </context>
+ <context>
+ <name>QIBaseDriver</name>
+ <message>
+ <source>Error opening database</source>
+ <translation>Ошибка открытия базы данных</translation>
+ </message>
+ <message>
+ <source>Could not start transaction</source>
+ <translation>Не удалось начать транзакцию</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>Невозможно завершить транзакцию</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>Невозможно отозвать транзакцию</translation>
+ </message>
+ </context>
+ <context>
+ <name>QIBaseResult</name>
+ <message>
+ <source>Unable to create BLOB</source>
+ <translation>Невозможно создать BLOB</translation>
+ </message>
+ <message>
+ <source>Unable to write BLOB</source>
+ <translation>Невозможно записать BLOB</translation>
+ </message>
+ <message>
+ <source>Unable to open BLOB</source>
+ <translation>Невозможно открыть BLOB</translation>
+ </message>
+ <message>
+ <source>Unable to read BLOB</source>
+ <translation>Невозможно прочитать BLOB</translation>
+ </message>
+ <message>
+ <source>Could not find array</source>
+ <translation>Не удалось найти массив</translation>
+ </message>
+ <message>
+ <source>Could not get array data</source>
+ <translation>Не удалось найти данные массива</translation>
+ </message>
+ <message>
+ <source>Could not get query info</source>
+ <translation>Не удалось найти информацию о запросе</translation>
+ </message>
+ <message>
+ <source>Could not start transaction</source>
+ <translation>Не удалось начать транзакцию</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>Невозможно завершить транзакцию</translation>
+ </message>
+ <message>
+ <source>Could not allocate statement</source>
+ <translation>Не удалось получить ресурсы для создания выражения</translation>
+ </message>
+ <message>
+ <source>Could not prepare statement</source>
+ <translation>Не удалось подготовить выражение</translation>
+ </message>
+ <message>
+ <source>Could not describe input statement</source>
+ <translation>Не удалось описать входящее выражение</translation>
+ </message>
+ <message>
+ <source>Could not describe statement</source>
+ <translation>Не удалось описать выражение</translation>
+ </message>
+ <message>
+ <source>Unable to close statement</source>
+ <translation>Невозможно закрыть выражение</translation>
+ </message>
+ <message>
+ <source>Unable to execute query</source>
+ <translation>Невозможно выполнить запрос</translation>
+ </message>
+ <message>
+ <source>Could not fetch next item</source>
+ <translation>Не удалось получить следующий элемент</translation>
+ </message>
+ <message>
+ <source>Could not get statement info</source>
+ <translation>Не удалось найти информацию о выражении</translation>
+ </message>
+ </context>
+ <context>
+ <name>QIODevice</name>
+ <message>
+ <source>Permission denied</source>
+ <translation>Доступ запрещён</translation>
+ </message>
+ <message>
+ <source>Too many open files</source>
+ <translation>Слишком много открытых файлов</translation>
+ </message>
+ <message>
+ <source>No such file or directory</source>
+ <translation>Файл или каталог не существует</translation>
+ </message>
+ <message>
+ <source>No space left on device</source>
+ <translation>Нет свободного места на устройстве</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>Неизвестная ошибка</translation>
+ </message>
+ </context>
+ <context>
+ <name>QInputContext</name>
+ <message>
+ <source>XIM</source>
+ <translation>Метод ввода X-сервера</translation>
+ </message>
+ <message>
+ <source>FEP</source>
+ <translation>Метод ввода S60 FEP</translation>
+ </message>
+ <message>
+ <source>XIM input method</source>
+ <translation>Метод ввода X-сервера</translation>
+ </message>
+ <message>
+ <source>Windows input method</source>
+ <translation>Метод ввода Windows</translation>
+ </message>
+ <message>
+ <source>Mac OS X input method</source>
+ <translation>Метод ввода Mac OS X</translation>
+ </message>
+ <message>
+ <source>S60 FEP input method</source>
+ <translation>Метод ввода S60 FEP</translation>
+ </message>
+ </context>
+ <context>
+ <name>QInputDialog</name>
+ <message>
+ <source>Enter a value:</source>
+ <translation>Укажите значение:</translation>
+ </message>
+ </context>
+ <context>
+ <name>QLibrary</name>
+ <message>
+ <source>Could not mmap &apos;%1&apos;: %2</source>
+ <translation>Не удалось выполнить mmap &apos;%1&apos;: %2</translation>
+ </message>
+ <message>
+ <source>Plugin verification data mismatch in &apos;%1&apos;</source>
+ <translation>Проверочная информация для модуля &apos;%1&apos; не совпадает</translation>
+ </message>
+ <message>
+ <source>Could not unmap &apos;%1&apos;: %2</source>
+ <translation>Не удалось выполнить unmap &apos;%1&apos;: %2</translation>
+ </message>
+ <message>
+ <source>The plugin &apos;%1&apos; uses incompatible Qt library. (%2.%3.%4) [%5]</source>
+ <translation>Модуль &apos;%1&apos; использует несоместимую библиотеку Qt. (%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>Модуль &apos;%1&apos; использует несоместимую библиотеку Qt. Ожидается ключ &quot;%2&quot;, но получен ключ &quot;%3&quot;</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>Неизвестная ошибка</translation>
+ </message>
+ <message>
+ <source>The shared library was not found.</source>
+ <translation>Динамическая библиотека не найдена.</translation>
+ </message>
+ <message>
+ <source>The file &apos;%1&apos; is not a valid Qt plugin.</source>
+ <translation>Файл &apos;%1&apos; - не является корректным модулем Qt.</translation>
+ </message>
+ <message>
+ <source>The plugin &apos;%1&apos; uses incompatible Qt library. (Cannot mix debug and release libraries.)</source>
+ <translation>Модуль &apos;%1&apos; использует несоместимую библиотеку Qt. (Невозможно совместить релизные и отладочные библиотеки.)</translation>
+ </message>
+ <message>
+ <source>Cannot load library %1: %2</source>
+ <translation>Невозможно загрузить библиотеку %1: %2</translation>
+ </message>
+ <message>
+ <source>Cannot unload library %1: %2</source>
+ <translation>Невозможно выгрузить библиотеку %1: %2</translation>
+ </message>
+ <message>
+ <source>Cannot resolve symbol &quot;%1&quot; in %2: %3</source>
+ <translation>Невозможно разрешить символ &quot;%1&quot; в %2: %3</translation>
+ </message>
+ </context>
+ <context>
+ <name>QLineEdit</name>
+ <message>
+ <source>Select All</source>
+ <translation>Выделить всё</translation>
+ </message>
+ <message>
+ <source>&amp;Undo</source>
+ <translation>&amp;Отменить действие</translation>
+ </message>
+ <message>
+ <source>&amp;Redo</source>
+ <translation>&amp;Повторить действие</translation>
+ </message>
+ <message>
+ <source>Cu&amp;t</source>
+ <translation>&amp;Вырезать</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>&amp;Копировать</translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation>В&amp;ставить</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>Удалить</translation>
+ </message>
+ </context>
+ <context>
+ <name>QLocalServer</name>
+ <message>
+ <source>%1: Name error</source>
+ <translation>%1: Некорректное имя</translation>
+ </message>
+ <message>
+ <source>%1: Permission denied</source>
+ <translation>%1: Доступ запрещён</translation>
+ </message>
+ <message>
+ <source>%1: Address in use</source>
+ <translation>%1: Адрес используется</translation>
+ </message>
+ <message>
+ <source>%1: Unknown error %2</source>
+ <translation>%1: Неизвестная ошибка %2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QLocalSocket</name>
+ <message>
+ <source>%1: Connection refused</source>
+ <translation>%1: Отказано в соединении</translation>
+ </message>
+ <message>
+ <source>%1: Remote closed</source>
+ <translation>%1: Закрыто удаленной стороной</translation>
+ </message>
+ <message>
+ <source>%1: Invalid name</source>
+ <translation>%1: Некорректное имя</translation>
+ </message>
+ <message>
+ <source>%1: Socket access error</source>
+ <translation>%1: Ошибка обращения к сокету</translation>
+ </message>
+ <message>
+ <source>%1: Socket resource error</source>
+ <translation>%1: Ошибка выделения ресурсов сокета</translation>
+ </message>
+ <message>
+ <source>%1: Socket operation timed out</source>
+ <translation>%1: Время на операцию с сокетом истекло</translation>
+ </message>
+ <message>
+ <source>%1: Datagram too large</source>
+ <translation>%1: Датаграмма слишком большая</translation>
+ </message>
+ <message>
+ <source>%1: Connection error</source>
+ <translation>%1: Ошибка соединения</translation>
+ </message>
+ <message>
+ <source>%1: The socket operation is not supported</source>
+ <translation>%1: Операция с сокетом не поддерживается</translation>
+ </message>
+ <message>
+ <source>%1: Unknown error</source>
+ <translation>%1: Неизвестная ошибка</translation>
+ </message>
+ <message>
+ <source>%1: Unknown error %2</source>
+ <translation>%1: Неизвестная ошибка %2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMYSQLDriver</name>
+ <message>
+ <source>Unable to open database &apos;</source>
+ <translation>Невозможно открыть базу данных &apos;</translation>
+ </message>
+ <message>
+ <source>Unable to connect</source>
+ <translation>Невозможно соединиться</translation>
+ </message>
+ <message>
+ <source>Unable to begin transaction</source>
+ <translation>Невозможно начать транзакцию</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>Невозможно завершить транзакцию</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>Невозможно отозвать транзакцию</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMYSQLResult</name>
+ <message>
+ <source>Unable to fetch data</source>
+ <translation>Невозможно получить данные</translation>
+ </message>
+ <message>
+ <source>Unable to execute query</source>
+ <translation>Невозможно выполнить запрос</translation>
+ </message>
+ <message>
+ <source>Unable to store result</source>
+ <translation>Невозможно сохранить результат</translation>
+ </message>
+ <message>
+ <source>Unable to prepare statement</source>
+ <translation>Невозможно подготовить выражение</translation>
+ </message>
+ <message>
+ <source>Unable to reset statement</source>
+ <translation>Невозможно сбросить выражение</translation>
+ </message>
+ <message>
+ <source>Unable to bind value</source>
+ <translation>Невозможно привязать значение</translation>
+ </message>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>Невозможно выполнить выражение</translation>
+ </message>
+ <message>
+ <source>Unable to bind outvalues</source>
+ <translation>Невозможно привязать результирующие значения</translation>
+ </message>
+ <message>
+ <source>Unable to store statement results</source>
+ <translation>Невозможно сохранить результаты выполнения выражения</translation>
+ </message>
+ <message>
+ <source>Unable to execute next query</source>
+ <translation>Невозможно выполнить следующий запрос</translation>
+ </message>
+ <message>
+ <source>Unable to store next result</source>
+ <translation>Невозможно сохранить следующий результат</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMdiArea</name>
+ <message>
+ <source>(Untitled)</source>
+ <translation>(Неозаглавлено)</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMdiSubWindow</name>
+ <message>
+ <source>%1 - [%2]</source>
+ <translation>%1 - [%2]</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Закрыть</translation>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation>Свернуть</translation>
+ </message>
+ <message>
+ <source>Restore Down</source>
+ <translation>Восстановить</translation>
+ </message>
+ <message>
+ <source>&amp;Restore</source>
+ <translation>&amp;Восстановить</translation>
+ </message>
+ <message>
+ <source>&amp;Move</source>
+ <translation>&amp;Переместить</translation>
+ </message>
+ <message>
+ <source>&amp;Size</source>
+ <translation>&amp;Размер</translation>
+ </message>
+ <message>
+ <source>Mi&amp;nimize</source>
+ <translation>&amp;Свернуть</translation>
+ </message>
+ <message>
+ <source>Ma&amp;ximize</source>
+ <translation>Р&amp;аспахнуть</translation>
+ </message>
+ <message>
+ <source>Stay on &amp;Top</source>
+ <translation>Оставаться &amp;сверху</translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation>&amp;Закрыть</translation>
+ </message>
+ <message>
+ <source>Maximize</source>
+ <translation>Распахнуть</translation>
+ </message>
+ <message>
+ <source>Unshade</source>
+ <translation>Восстановить из заголовка</translation>
+ </message>
+ <message>
+ <source>Shade</source>
+ <translation>Свернуть в заголовок</translation>
+ </message>
+ <message>
+ <source>Restore</source>
+ <translation>Восстановить</translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation>Справка</translation>
+ </message>
+ <message>
+ <source>Menu</source>
+ <translation>Меню</translation>
+ </message>
+ <message>
+ <source>- [%1]</source>
+ <translation>- [%1]</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMenu</name>
+ <message>
+ <source>Close</source>
+ <translation>Закрыть</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>Открыть</translation>
+ </message>
+ <message>
+ <source>Execute</source>
+ <translation>Выполнить</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMenuBar</name>
+ <message>
+ <source>Actions</source>
+ <translation>Действия</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMessageBox</name>
+ <message>
+ <source>OK</source>
+ <translation>Закрыть</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;О Qt&lt;/h3&gt;&lt;p&gt;Данная программа использует Qt версии %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 - это инструментарий для разработки кроссплатформенных приложений на C++.&lt;/p&gt;&lt;p&gt;Qt предоставляет совместимость на уровне исходных текстов между MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux и всеми популярными коммерческими вариантами Unix. Также Qt доступна для встраиваемых устройств в виде Qt для Embedded Linux и Qt для Windows CE.&lt;/p&gt;&lt;p&gt;Qt доступна под тремя различными лицензиями, разработанными для удовлетворения различных требований.&lt;/p&gt;&lt;p&gt;Qt под нашей коммерческой лицензией предназначена для развития проприетарного/коммерческого программного обеспечения, когда Вы не желаете предоставлять исходные тексты третьим сторонам, или в случае невозможности принятия условий лицензий GNU LGPL версии 2.1 или GNU GPL версии 3.0.&lt;/p&gt;&lt;p&gt;Qt под лицензией GNU LGPL версии 2.1 предназначена для разработки программного обеспечения с открытыми исходными текстами или коммерческого программного обеспечения при соблюдении условий лицензии GNU LGPL версии 2.1.&lt;/p&gt;&lt;p&gt;Qt под лицензией GNU General Public License версии 3.0 предназначена для разработки программных приложений в тех случаях, когда Вы хотели бы использовать такие приложения в сочетании с программным обеспечением на условиях лицензии GNU GPL с версии 3.0 или если Вы готовы соблюдать условия лицензии GNU GPL версии 3.0.&lt;/p&gt;&lt;p&gt;Обратитесь к &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; для обзора лицензий Qt.&lt;/p&gt;&lt;p&gt;Copyright (C) 2010 Корпорация Nokia и/или её дочерние подразделения.&lt;/p&gt;&lt;p&gt;Qt - продукт компании Nokia. Обратитесь к &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; для получения дополнительной информации.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>About Qt</source>
+ <translation>О Qt</translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation>Справка</translation>
+ </message>
+ <message>
+ <source>Show Details...</source>
+ <translation>Показать подробности...</translation>
+ </message>
+ <message>
+ <source>Hide Details...</source>
+ <translation>Скрыть подробности...</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMultiInputContext</name>
+ <message>
+ <source>Select IM</source>
+ <translation>Выбор режима ввода</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMultiInputContextPlugin</name>
+ <message>
+ <source>Multiple input method switcher</source>
+ <translation>Переключатель режима множественного ввода</translation>
+ </message>
+ <message>
+ <source>Multiple input method switcher that uses the context menu of the text widgets</source>
+ <translation>Переключатель режима множественного ввода, используемый в контекстном меню текстовых виджетов</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNativeSocketEngine</name>
+ <message>
+ <source>The remote host closed the connection</source>
+ <translation>Удалённый узел закрыл соединение</translation>
+ </message>
+ <message>
+ <source>Network operation timed out</source>
+ <translation>Время на сетевую операцию истекло</translation>
+ </message>
+ <message>
+ <source>Out of resources</source>
+ <translation>Недостаточно ресурсов</translation>
+ </message>
+ <message>
+ <source>Unsupported socket operation</source>
+ <translation>Операция с сокетом не поддерживается</translation>
+ </message>
+ <message>
+ <source>Protocol type not supported</source>
+ <translation>Протокол не поддерживается</translation>
+ </message>
+ <message>
+ <source>Invalid socket descriptor</source>
+ <translation>Некорректный дескриптор сокета</translation>
+ </message>
+ <message>
+ <source>Network unreachable</source>
+ <translation>Сеть недоступна</translation>
+ </message>
+ <message>
+ <source>Permission denied</source>
+ <translation>Доступ запрещён</translation>
+ </message>
+ <message>
+ <source>Connection timed out</source>
+ <translation>Время на соединение истекло</translation>
+ </message>
+ <message>
+ <source>Connection refused</source>
+ <translation>Отказано в соединении</translation>
+ </message>
+ <message>
+ <source>The bound address is already in use</source>
+ <translation>Адрес уже используется</translation>
+ </message>
+ <message>
+ <source>The address is not available</source>
+ <translation>Адрес недоступен</translation>
+ </message>
+ <message>
+ <source>The address is protected</source>
+ <translation>Адрес защищён</translation>
+ </message>
+ <message>
+ <source>Unable to send a message</source>
+ <translation>Невозможно отправить сообщение</translation>
+ </message>
+ <message>
+ <source>Unable to receive a message</source>
+ <translation>Невозможно получить сообщение</translation>
+ </message>
+ <message>
+ <source>Unable to write</source>
+ <translation>Невозможно записать</translation>
+ </message>
+ <message>
+ <source>Network error</source>
+ <translation>Ошибка сети</translation>
+ </message>
+ <message>
+ <source>Another socket is already listening on the same port</source>
+ <translation>Другой сокет уже прослушивает этот порт</translation>
+ </message>
+ <message>
+ <source>Unable to initialize non-blocking socket</source>
+ <translation>Невозможно инициализировать не-блочный сокет</translation>
+ </message>
+ <message>
+ <source>Unable to initialize broadcast socket</source>
+ <translation>Невозможно инициализировать широковещательный сокет</translation>
+ </message>
+ <message>
+ <source>Attempt to use IPv6 socket on a platform with no IPv6 support</source>
+ <translation>Попытка использовать IPv6 на платформе, не поддерживающей IPv6</translation>
+ </message>
+ <message>
+ <source>Host unreachable</source>
+ <translation>Узел недоступен</translation>
+ </message>
+ <message>
+ <source>Datagram was too large to send</source>
+ <translation>Датаграмма слишком большая для отправки</translation>
+ </message>
+ <message>
+ <source>Operation on non-socket</source>
+ <translation>Операция с не-сокетом</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>Неизвестная ошибка</translation>
+ </message>
+ <message>
+ <source>The proxy type is invalid for this operation</source>
+ <translation>Некорректный тип прокси-сервера для данной операции</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkAccessCacheBackend</name>
+ <message>
+ <source>Error opening %1</source>
+ <translation>Ошибка открытия %1</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkAccessDebugPipeBackend</name>
+ <message>
+ <source>Write error writing to %1: %2</source>
+ <translation>Ошибка записи в %1: %2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkAccessFileBackend</name>
+ <message>
+ <source>Request for opening non-local file %1</source>
+ <translation>Запрос на открытие файла вне файловой системы %1</translation>
+ </message>
+ <message>
+ <source>Error opening %1: %2</source>
+ <translation>Ошибка открытия %1: %2</translation>
+ </message>
+ <message>
+ <source>Write error writing to %1: %2</source>
+ <translation>Ошибка записи в %1: %2</translation>
+ </message>
+ <message>
+ <source>Cannot open %1: Path is a directory</source>
+ <translation>Невозможно открыть %1: Указан путь к каталогу</translation>
+ </message>
+ <message>
+ <source>Read error reading from %1: %2</source>
+ <translation>Ошибка чтения из %1: %2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkAccessFtpBackend</name>
+ <message>
+ <source>No suitable proxy found</source>
+ <translation>Подходящий прокси-сервер не найден</translation>
+ </message>
+ <message>
+ <source>Cannot open %1: is a directory</source>
+ <translation>Невозможно открыть %1: Указан путь к каталогу</translation>
+ </message>
+ <message>
+ <source>Logging in to %1 failed: authentication required</source>
+ <translation>Соединение с %1 не удалось: требуется авторизация</translation>
+ </message>
+ <message>
+ <source>Error while downloading %1: %2</source>
+ <translation>Ошибка в процессе загрузки %1: %2</translation>
+ </message>
+ <message>
+ <source>Error while uploading %1: %2</source>
+ <translation>Ошибка в процессе отгрузки %1: %2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkAccessHttpBackend</name>
+ <message>
+ <source>No suitable proxy found</source>
+ <translation>Подходящий прокси-сервер не найден</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkReply</name>
+ <message>
+ <source>Error downloading %1 - server replied: %2</source>
+ <translation>Ошибка загрузки %1 - ответ сервера: %2</translation>
+ </message>
+ <message>
+ <source>Protocol &quot;%1&quot; is unknown</source>
+ <translation>Неизвестный протокол &quot;%1&quot;</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkReplyImpl</name>
+ <message>
+ <source>Operation canceled</source>
+ <translation>Операция отменена</translation>
+ </message>
+ </context>
+ <context>
+ <name>QOCIDriver</name>
+ <message>
+ <source>Unable to logon</source>
+ <translation>Невозможно авторизоваться</translation>
+ </message>
+ <message>
+ <source>Unable to initialize</source>
+ <comment>QOCIDriver</comment>
+ <translation>Невозможно инициализировать</translation>
+ </message>
+ <message>
+ <source>Unable to begin transaction</source>
+ <translation>Невозможно начать транзакцию</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>Невозможно завершить транзакцию</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>Невозможно отозвать транзакцию</translation>
+ </message>
+ </context>
+ <context>
+ <name>QOCIResult</name>
+ <message>
+ <source>Unable to bind column for batch execute</source>
+ <translation>Невозможно привязать столбец для пакетного выполнения</translation>
+ </message>
+ <message>
+ <source>Unable to execute batch statement</source>
+ <translation>Невозможно выполнить пакетное выражение</translation>
+ </message>
+ <message>
+ <source>Unable to goto next</source>
+ <translation>Невозможно перейти к следующей строке</translation>
+ </message>
+ <message>
+ <source>Unable to alloc statement</source>
+ <translation>Невозможно создать выражение</translation>
+ </message>
+ <message>
+ <source>Unable to prepare statement</source>
+ <translation>Невозможно подготовить выражение</translation>
+ </message>
+ <message>
+ <source>Unable to get statement type</source>
+ <translation>Невозможно определить тип выражения</translation>
+ </message>
+ <message>
+ <source>Unable to bind value</source>
+ <translation>Невозможно привязать результирующие значения</translation>
+ </message>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>Невозможно выполнить выражение</translation>
+ </message>
+ </context>
+ <context>
+ <name>QODBCDriver</name>
+ <message>
+ <source>Unable to connect</source>
+ <translation>Невозможно соединиться</translation>
+ </message>
+ <message>
+ <source>Unable to disable autocommit</source>
+ <translation>Невозможно отключить автозавершение транзакций</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>Невозможно завершить транзакцию</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>Невозможно отозвать транзакцию</translation>
+ </message>
+ <message>
+ <source>Unable to enable autocommit</source>
+ <translation>Невозможно включить автозавершение транзакций</translation>
+ </message>
+ <message>
+ <source>Unable to connect - Driver doesn&apos;t support all functionality required</source>
+ <translation>Невозможно соединиться - Драйвер не поддерживает требуемый функционал</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: Невозможно установить &apos;SQL_CURSOR_STATIC&apos; атрибутом выражение. Проверьте настройки драйвера ODBC</translation>
+ </message>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>Невозможно выполнить выражение</translation>
+ </message>
+ <message>
+ <source>Unable to fetch next</source>
+ <translation>Невозможно получить следующую строку</translation>
+ </message>
+ <message>
+ <source>Unable to prepare statement</source>
+ <translation>Невозможно подготовить выражение</translation>
+ </message>
+ <message>
+ <source>Unable to bind variable</source>
+ <translation>Невозможно привязать значение</translation>
+ </message>
+ <message>
+ <source>Unable to fetch last</source>
+ <translation>Невозможно получить последнюю строку</translation>
+ </message>
+ <message>
+ <source>Unable to fetch</source>
+ <translation>Невозможно получить данные</translation>
+ </message>
+ <message>
+ <source>Unable to fetch first</source>
+ <translation>Невозможно получить первую строку</translation>
+ </message>
+ <message>
+ <source>Unable to fetch previous</source>
+ <translation>Невозможно получить предыдущую строку</translation>
+ </message>
+ </context>
+ <context>
+ <name>QObject</name>
+ <message>
+ <source>Invalid hostname</source>
+ <translation>Некорректное имя узла</translation>
+ </message>
+ <message>
+ <source>Operation not supported on %1</source>
+ <translation>Операция не поддерживается для %1</translation>
+ </message>
+ <message>
+ <source>Invalid URI: %1</source>
+ <translation>Некорректный URI: %1</translation>
+ </message>
+ <message>
+ <source>Socket error on %1: %2</source>
+ <translation>Ошика сокета для %1: %2</translation>
+ </message>
+ <message>
+ <source>Remote host closed the connection prematurely on %1</source>
+ <translation>Удалённый узел неожиданно прервал соединение для %1</translation>
+ </message>
+ <message>
+ <source>No host name given</source>
+ <translation>Имя узла не задано</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPPDOptionsModel</name>
+ <message>
+ <source>Name</source>
+ <translation>Имя</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Значение</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPSQLDriver</name>
+ <message>
+ <source>Unable to connect</source>
+ <translation>Невозможно соединиться</translation>
+ </message>
+ <message>
+ <source>Could not begin transaction</source>
+ <translation>Не удалось начать транзакцию</translation>
+ </message>
+ <message>
+ <source>Could not commit transaction</source>
+ <translation>Не удалось завершить транзакцию</translation>
+ </message>
+ <message>
+ <source>Could not rollback transaction</source>
+ <translation>Не удалось отозвать транзакцию</translation>
+ </message>
+ <message>
+ <source>Unable to subscribe</source>
+ <translation>Невозможно подписаться</translation>
+ </message>
+ <message>
+ <source>Unable to unsubscribe</source>
+ <translation>Невозможно отписаться</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPSQLResult</name>
+ <message>
+ <source>Unable to create query</source>
+ <translation>Невозможно создать запрос</translation>
+ </message>
+ <message>
+ <source>Unable to prepare statement</source>
+ <translation>Невозможно подготовить выражение</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPageSetupWidget</name>
+ <message>
+ <source>Centimeters (cm)</source>
+ <translation>Сантиметры (cm)</translation>
+ </message>
+ <message>
+ <source>Millimeters (mm)</source>
+ <translation>Миллиметры (mm)</translation>
+ </message>
+ <message>
+ <source>Inches (in)</source>
+ <translation>Дюймы (in)</translation>
+ </message>
+ <message>
+ <source>Points (pt)</source>
+ <translation>Точки (pt)</translation>
+ </message>
+ <message>
+ <source>Form</source>
+ <translation>Форма</translation>
+ </message>
+ <message>
+ <source>Paper</source>
+ <translation>Бумага</translation>
+ </message>
+ <message>
+ <source>Page size:</source>
+ <translation>Размер страницы:</translation>
+ </message>
+ <message>
+ <source>Width:</source>
+ <translation>Ширина:</translation>
+ </message>
+ <message>
+ <source>Height:</source>
+ <translation>Высота:</translation>
+ </message>
+ <message>
+ <source>Paper source:</source>
+ <translation>Источник бумаги:</translation>
+ </message>
+ <message>
+ <source>Orientation</source>
+ <translation>Ориентация</translation>
+ </message>
+ <message>
+ <source>Portrait</source>
+ <translation>Книжная</translation>
+ </message>
+ <message>
+ <source>Landscape</source>
+ <translation>Альбомная</translation>
+ </message>
+ <message>
+ <source>Reverse landscape</source>
+ <translation>Перевёрнутая альбомная</translation>
+ </message>
+ <message>
+ <source>Reverse portrait</source>
+ <translation>Перевёрнутая книжная</translation>
+ </message>
+ <message>
+ <source>Margins</source>
+ <translation>Поля</translation>
+ </message>
+ <message>
+ <source>top margin</source>
+ <translation>верхнее поле</translation>
+ </message>
+ <message>
+ <source>left margin</source>
+ <translation>левое поле</translation>
+ </message>
+ <message>
+ <source>right margin</source>
+ <translation>правое поле</translation>
+ </message>
+ <message>
+ <source>bottom margin</source>
+ <translation>нижнее поле</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPluginLoader</name>
+ <message>
+ <source>Unknown error</source>
+ <translation>Неизвестная ошибка</translation>
+ </message>
+ <message>
+ <source>The plugin was not loaded.</source>
+ <translation>Модуль не был загружен.</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPrintDialog</name>
+ <message>
+ <source>locally connected</source>
+ <translation>соединено локально</translation>
+ </message>
+ <message>
+ <source>Aliases: %1</source>
+ <translation>Псевдонимы: %1</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation>неизвестно</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>Закрыть</translation>
+ </message>
+ <message>
+ <source>Print all</source>
+ <translation>Печатать все</translation>
+ </message>
+ <message>
+ <source>Print range</source>
+ <translation>Печатать диапазон</translation>
+ </message>
+ <message>
+ <source>A0 (841 x 1189 mm)</source>
+ <translation>A0 (841 x 1189 мм)</translation>
+ </message>
+ <message>
+ <source>A1 (594 x 841 mm)</source>
+ <translation>A1 (594 x 841 мм)</translation>
+ </message>
+ <message>
+ <source>A2 (420 x 594 mm)</source>
+ <translation>A2 (420 x 594 мм)</translation>
+ </message>
+ <message>
+ <source>A3 (297 x 420 mm)</source>
+ <translation>A3 (297 x 420 мм)</translation>
+ </message>
+ <message>
+ <source>A5 (148 x 210 mm)</source>
+ <translation>A5 (148 x 210 мм)</translation>
+ </message>
+ <message>
+ <source>A6 (105 x 148 mm)</source>
+ <translation>A6 (105 x 148 мм)</translation>
+ </message>
+ <message>
+ <source>A7 (74 x 105 mm)</source>
+ <translation>A7 (74 x 105 мм)</translation>
+ </message>
+ <message>
+ <source>A8 (52 x 74 mm)</source>
+ <translation>A8 (52 x 74 мм)</translation>
+ </message>
+ <message>
+ <source>A9 (37 x 52 mm)</source>
+ <translation>A9 (37 x 52 мм)</translation>
+ </message>
+ <message>
+ <source>B0 (1000 x 1414 mm)</source>
+ <translation>B0 (1000 x 1414 мм)</translation>
+ </message>
+ <message>
+ <source>B1 (707 x 1000 mm)</source>
+ <translation>B1 (707 x 1000 мм)</translation>
+ </message>
+ <message>
+ <source>B2 (500 x 707 mm)</source>
+ <translation>B2 (500 x 707 мм)</translation>
+ </message>
+ <message>
+ <source>B3 (353 x 500 mm)</source>
+ <translation>B3 (353 x 500 мм)</translation>
+ </message>
+ <message>
+ <source>B4 (250 x 353 mm)</source>
+ <translation>B4 (250 x 353 мм)</translation>
+ </message>
+ <message>
+ <source>B6 (125 x 176 mm)</source>
+ <translation>B6 (125 x 176 мм)</translation>
+ </message>
+ <message>
+ <source>B7 (88 x 125 mm)</source>
+ <translation>B7 (88 x 125 мм)</translation>
+ </message>
+ <message>
+ <source>B8 (62 x 88 mm)</source>
+ <translation>B8 (62 x 88 мм)</translation>
+ </message>
+ <message>
+ <source>B9 (44 x 62 mm)</source>
+ <translation>B9 (44 x 62 мм)</translation>
+ </message>
+ <message>
+ <source>B10 (31 x 44 mm)</source>
+ <translation>B10 (31 x 44 мм)</translation>
+ </message>
+ <message>
+ <source>C5E (163 x 229 mm)</source>
+ <translation>C5E (163 x 229 мм)</translation>
+ </message>
+ <message>
+ <source>DLE (110 x 220 mm)</source>
+ <translation>DLE (110 x 220 мм)</translation>
+ </message>
+ <message>
+ <source>Folio (210 x 330 mm)</source>
+ <translation>Folio (210 x 330 мм)</translation>
+ </message>
+ <message>
+ <source>Ledger (432 x 279 mm)</source>
+ <translation>Ledger (432 x 279 мм)</translation>
+ </message>
+ <message>
+ <source>Tabloid (279 x 432 mm)</source>
+ <translation>Tabloid (279 x 432 мм)</translation>
+ </message>
+ <message>
+ <source>US Common #10 Envelope (105 x 241 mm)</source>
+ <translation>Конверт US #10 (105x241 мм)</translation>
+ </message>
+ <message>
+ <source>A4 (210 x 297 mm, 8.26 x 11.7 inches)</source>
+ <translation>A4 (210 x 297 мм, 8.26 x 11.7 дюймов)</translation>
+ </message>
+ <message>
+ <source>B5 (176 x 250 mm, 6.93 x 9.84 inches)</source>
+ <translation>B5 (176 x 250 мм, 6.93 x 9.84 дюймов)</translation>
+ </message>
+ <message>
+ <source>Executive (7.5 x 10 inches, 191 x 254 mm)</source>
+ <translation>Executive (191 x 254 мм, 7.5 x 10 дюймов)</translation>
+ </message>
+ <message>
+ <source>Legal (8.5 x 14 inches, 216 x 356 mm)</source>
+ <translation>Legal (216 x 356 мм, 8.5 x 14 дюймов)</translation>
+ </message>
+ <message>
+ <source>Letter (8.5 x 11 inches, 216 x 279 mm)</source>
+ <translation>Letter (216 x 279 мм, 8.5 x 11 дюймов)</translation>
+ </message>
+ <message>
+ <source>Print selection</source>
+ <translation>Выделенный фрагмент</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation>Печать</translation>
+ </message>
+ <message>
+ <source>Print To File ...</source>
+ <translation>Печать в файл ...</translation>
+ </message>
+ <message>
+ <source>File %1 is not writable.
+Please choose a different file name.</source>
+ <translation>%1 недоступен для записи.
+Выберите другое имя файла.</translation>
+ </message>
+ <message>
+ <source>%1 already exists.
+Do you want to overwrite it?</source>
+ <translation>%1 уже существует.
+Хотите заменить его?</translation>
+ </message>
+ <message>
+ <source>File exists</source>
+ <translation>Файл существует</translation>
+ </message>
+ <message>
+ <source>&lt;qt&gt;Do you want to overwrite it?&lt;/qt&gt;</source>
+ <translation>&lt;qt&gt;Хотите заменить?&lt;/qt&gt;</translation>
+ </message>
+ <message>
+ <source>%1 is a directory.
+Please choose a different file name.</source>
+ <translation>%1 - это каталог.
+Выберите другое имя файла.</translation>
+ </message>
+ <message>
+ <source>The &apos;From&apos; value cannot be greater than the &apos;To&apos; value.</source>
+ <translation>Значение &apos;от&apos; не может быть больше значения &apos;до&apos;.</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>Пользовательский</translation>
+ </message>
+ <message>
+ <source>&amp;Options &gt;&gt;</source>
+ <translation>&amp;Параметры &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Options &lt;&lt;</source>
+ <translation>&amp;Параметры &lt;&lt;</translation>
+ </message>
+ <message>
+ <source>Print to File (PDF)</source>
+ <translation>Печать в файл (PDF)</translation>
+ </message>
+ <message>
+ <source>Print to File (Postscript)</source>
+ <translation>Печать в файл (Postscript)</translation>
+ </message>
+ <message>
+ <source>Local file</source>
+ <translation>Локальный файл</translation>
+ </message>
+ <message>
+ <source>Write %1 file</source>
+ <translation>Запись %1 файла</translation>
+ </message>
+ <message>
+ <source>&amp;Print</source>
+ <translation>&amp;Печать</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPrintPreviewDialog</name>
+ <message>
+ <source>%1%</source>
+ <translation>%1%</translation>
+ </message>
+ <message>
+ <source>Print Preview</source>
+ <translation>Просмотр печати</translation>
+ </message>
+ <message>
+ <source>Next page</source>
+ <translation>Следующая страница</translation>
+ </message>
+ <message>
+ <source>Previous page</source>
+ <translation>Предыдущая страница</translation>
+ </message>
+ <message>
+ <source>First page</source>
+ <translation>Первая страница</translation>
+ </message>
+ <message>
+ <source>Last page</source>
+ <translation>Последняя страница</translation>
+ </message>
+ <message>
+ <source>Fit width</source>
+ <translation>По ширине</translation>
+ </message>
+ <message>
+ <source>Fit page</source>
+ <translation>На всю страницу</translation>
+ </message>
+ <message>
+ <source>Zoom in</source>
+ <translation>Увеличить</translation>
+ </message>
+ <message>
+ <source>Zoom out</source>
+ <translation>Уменьшить</translation>
+ </message>
+ <message>
+ <source>Portrait</source>
+ <translation>Книжная</translation>
+ </message>
+ <message>
+ <source>Landscape</source>
+ <translation>Альбомная</translation>
+ </message>
+ <message>
+ <source>Show single page</source>
+ <translation>Показать одну страницу</translation>
+ </message>
+ <message>
+ <source>Show facing pages</source>
+ <translation>Показать титульные страницы</translation>
+ </message>
+ <message>
+ <source>Show overview of all pages</source>
+ <translation>Показать обзор всех страниц</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation>Печать</translation>
+ </message>
+ <message>
+ <source>Page setup</source>
+ <translation>Параметры страницы</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Export to PDF</source>
+ <translation>Экспорт в PDF</translation>
+ </message>
+ <message>
+ <source>Export to PostScript</source>
+ <translation>Экспорт в Postscript</translation>
+ </message>
+ <message>
+ <source>Page Setup</source>
+ <translation>Параметры страницы</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPrintPropertiesWidget</name>
+ <message>
+ <source>Form</source>
+ <translation>Форма</translation>
+ </message>
+ <message>
+ <source>Page</source>
+ <translation>Страница</translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Дополнительно</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPrintSettingsOutput</name>
+ <message>
+ <source>Form</source>
+ <translation>Форма</translation>
+ </message>
+ <message>
+ <source>Copies</source>
+ <translation>Копии</translation>
+ </message>
+ <message>
+ <source>Print range</source>
+ <translation>Диапазон печати</translation>
+ </message>
+ <message>
+ <source>Print all</source>
+ <translation>Все</translation>
+ </message>
+ <message>
+ <source>Pages from</source>
+ <translation>Страницы от</translation>
+ </message>
+ <message>
+ <source>to</source>
+ <translation>до</translation>
+ </message>
+ <message>
+ <source>Selection</source>
+ <translation>Выделенный фрагмент</translation>
+ </message>
+ <message>
+ <source>Output Settings</source>
+ <translation>Настройки вывода</translation>
+ </message>
+ <message>
+ <source>Copies:</source>
+ <translation>Количество копий:</translation>
+ </message>
+ <message>
+ <source>Collate</source>
+ <translation>Разобрать про копиям</translation>
+ </message>
+ <message>
+ <source>Reverse</source>
+ <translation>Обратный порядок</translation>
+ </message>
+ <message>
+ <source>Options</source>
+ <translation>Параметры</translation>
+ </message>
+ <message>
+ <source>Color Mode</source>
+ <translation>Режим цвета</translation>
+ </message>
+ <message>
+ <source>Color</source>
+ <translation>Цвет</translation>
+ </message>
+ <message>
+ <source>Grayscale</source>
+ <translation>Оттенки серого</translation>
+ </message>
+ <message>
+ <source>Duplex Printing</source>
+ <translation>Двусторонняя печать</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Нет</translation>
+ </message>
+ <message>
+ <source>Long side</source>
+ <translation>По длинной стороне</translation>
+ </message>
+ <message>
+ <source>Short side</source>
+ <translation>По короткой стороне</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPrintWidget</name>
+ <message>
+ <source>Form</source>
+ <translation>Форма</translation>
+ </message>
+ <message>
+ <source>Printer</source>
+ <translation>Принтер</translation>
+ </message>
+ <message>
+ <source>&amp;Name:</source>
+ <translation>&amp;Название:</translation>
+ </message>
+ <message>
+ <source>P&amp;roperties</source>
+ <translation>С&amp;войства</translation>
+ </message>
+ <message>
+ <source>Location:</source>
+ <translation>Расположение:</translation>
+ </message>
+ <message>
+ <source>Preview</source>
+ <translation>Просмотр</translation>
+ </message>
+ <message>
+ <source>Type:</source>
+ <translation>Тип:</translation>
+ </message>
+ <message>
+ <source>Output &amp;file:</source>
+ <translation>Вывод в &amp;файл:</translation>
+ </message>
+ <message>
+ <source>...</source>
+ <translation>...</translation>
+ </message>
+ </context>
+ <context>
+ <name>QProcess</name>
+ <message>
+ <source>Could not open input redirection for reading</source>
+ <translation>Не удалось открыть перенаправление ввода для чтения</translation>
+ </message>
+ <message>
+ <source>Could not open output redirection for writing</source>
+ <translation>Не удалось открыть перенаправление вывода для записи</translation>
+ </message>
+ <message>
+ <source>Resource error (fork failure): %1</source>
+ <translation>Ошибка выделения ресурсов (сбой fork): %1</translation>
+ </message>
+ <message>
+ <source>Process operation timed out</source>
+ <translation>Время на операцию с процессом истекло</translation>
+ </message>
+ <message>
+ <source>Error reading from process</source>
+ <translation>Ошибка получения данных от процесса</translation>
+ </message>
+ <message>
+ <source>Error writing to process</source>
+ <translation>Ошибка отправки данных процессу</translation>
+ </message>
+ <message>
+ <source>Process crashed</source>
+ <translation>Процесс завершился с ошибкой</translation>
+ </message>
+ <message>
+ <source>No program defined</source>
+ <translation>Программа не указана</translation>
+ </message>
+ <message>
+ <source>Process failed to start: %1</source>
+ <translation>Не удалось запустить процесс: %1</translation>
+ </message>
+ </context>
+ <context>
+ <name>QProgressDialog</name>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPushButton</name>
+ <message>
+ <source>Open</source>
+ <translation>Открыть</translation>
+ </message>
+ </context>
+ <context>
+ <name>QRadioButton</name>
+ <message>
+ <source>Check</source>
+ <translation>Отметить</translation>
+ </message>
+ </context>
+ <context>
+ <name>QRegExp</name>
+ <message>
+ <source>no error occurred</source>
+ <translation>ошибки отсутствуют</translation>
+ </message>
+ <message>
+ <source>disabled feature used</source>
+ <translation>использование отключённых возможностей</translation>
+ </message>
+ <message>
+ <source>bad char class syntax</source>
+ <translation>неправильный синтаксис класса символов</translation>
+ </message>
+ <message>
+ <source>bad lookahead syntax</source>
+ <translation>неправильный предварительный синтаксис</translation>
+ </message>
+ <message>
+ <source>bad repetition syntax</source>
+ <translation>неправильный синтаксис повторения</translation>
+ </message>
+ <message>
+ <source>invalid octal value</source>
+ <translation>некорректное восьмеричное значение</translation>
+ </message>
+ <message>
+ <source>missing left delim</source>
+ <translation>отсутствует левый разделитель</translation>
+ </message>
+ <message>
+ <source>unexpected end</source>
+ <translation>неожиданный конец</translation>
+ </message>
+ <message>
+ <source>met internal limit</source>
+ <translation>достигнуто внутреннее ограничение</translation>
+ </message>
+ <message>
+ <source>invalid interval</source>
+ <translation>некорректный интервал</translation>
+ </message>
+ <message>
+ <source>invalid category</source>
+ <translation>некорректная категория</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSQLite2Driver</name>
+ <message>
+ <source>Error opening database</source>
+ <translation>Ошибка открытия базы данных</translation>
+ </message>
+ <message>
+ <source>Unable to begin transaction</source>
+ <translation>Невозможно начать транзакцию</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>Невозможно завершить транзакцию</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>Невозможно отозвать транзакцию</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSQLite2Result</name>
+ <message>
+ <source>Unable to fetch results</source>
+ <translation>Невозможно получить результаты</translation>
+ </message>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>Невозможно выполнить выражение</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSQLiteDriver</name>
+ <message>
+ <source>Error opening database</source>
+ <translation>Ошибка открытия базы данных</translation>
+ </message>
+ <message>
+ <source>Error closing database</source>
+ <translation>Ошибка закрытия базы данных</translation>
+ </message>
+ <message>
+ <source>Unable to begin transaction</source>
+ <translation>Невозможно начать транзакцию</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>Невозможно завершить транзакцию</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>Невозможно отозвать транзакцию</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSQLiteResult</name>
+ <message>
+ <source>Unable to fetch row</source>
+ <translation>Невозможно получить строку</translation>
+ </message>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>Невозможно выполнить выражение</translation>
+ </message>
+ <message>
+ <source>Unable to reset statement</source>
+ <translation>Невозможно сбросить выражение</translation>
+ </message>
+ <message>
+ <source>Unable to bind parameters</source>
+ <translation>Невозможно привязать параметр</translation>
+ </message>
+ <message>
+ <source>Parameter count mismatch</source>
+ <translation>Количество параметров не совпадает</translation>
+ </message>
+ <message>
+ <source>No query</source>
+ <translation>Отсутствует запрос</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptBreakpointsModel</name>
+ <message>
+ <source>ID</source>
+ <translation>ID</translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation>Размещение</translation>
+ </message>
+ <message>
+ <source>Condition</source>
+ <translation>Условие</translation>
+ </message>
+ <message>
+ <source>Ignore-count</source>
+ <translation>Пропустить</translation>
+ </message>
+ <message>
+ <source>Single-shot</source>
+ <translation>Один раз</translation>
+ </message>
+ <message>
+ <source>Hit-count</source>
+ <translation>Попаданий</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptBreakpointsWidget</name>
+ <message>
+ <source>New</source>
+ <translation>Новая</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>Удалить</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptDebugger</name>
+ <message>
+ <source>Go to Line</source>
+ <translation>Перейти к строке</translation>
+ </message>
+ <message>
+ <source>Line:</source>
+ <translation>Строка:</translation>
+ </message>
+ <message>
+ <source>Interrupt</source>
+ <translation>Прервать</translation>
+ </message>
+ <message>
+ <source>Shift+F5</source>
+ <translation>Shift+F5</translation>
+ </message>
+ <message>
+ <source>Continue</source>
+ <translation>Продолжить</translation>
+ </message>
+ <message>
+ <source>F5</source>
+ <translation>F5</translation>
+ </message>
+ <message>
+ <source>Step Into</source>
+ <translation>Войти в</translation>
+ </message>
+ <message>
+ <source>F11</source>
+ <translation>F11</translation>
+ </message>
+ <message>
+ <source>Step Over</source>
+ <translation>Перейти через</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation>F10</translation>
+ </message>
+ <message>
+ <source>Step Out</source>
+ <translation>Выйти из функции</translation>
+ </message>
+ <message>
+ <source>Shift+F11</source>
+ <translation>Shift+F11</translation>
+ </message>
+ <message>
+ <source>Run to Cursor</source>
+ <translation>Выполнить до курсора</translation>
+ </message>
+ <message>
+ <source>Ctrl+F10</source>
+ <translation>Ctrl+F10</translation>
+ </message>
+ <message>
+ <source>Run to New Script</source>
+ <translation>Выполнить до нового сценария</translation>
+ </message>
+ <message>
+ <source>Toggle Breakpoint</source>
+ <translation>Установить/убрать точку останова</translation>
+ </message>
+ <message>
+ <source>F9</source>
+ <translation>F9</translation>
+ </message>
+ <message>
+ <source>Clear Debug Output</source>
+ <translation>Очистить отладочный вывод</translation>
+ </message>
+ <message>
+ <source>Clear Error Log</source>
+ <translation>Очистить журнал ошибок</translation>
+ </message>
+ <message>
+ <source>Clear Console</source>
+ <translation>Очистить консоль</translation>
+ </message>
+ <message>
+ <source>&amp;Find in Script...</source>
+ <translation>&amp;Найти в сценарии...</translation>
+ </message>
+ <message>
+ <source>Ctrl+F</source>
+ <translation>Ctrl+F</translation>
+ </message>
+ <message>
+ <source>Find &amp;Next</source>
+ <translation>Найти &amp;следующее</translation>
+ </message>
+ <message>
+ <source>F3</source>
+ <translation>F3</translation>
+ </message>
+ <message>
+ <source>Find &amp;Previous</source>
+ <translation>Найти &amp;предыдущее</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>Отладка</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptDebuggerCodeFinderWidget</name>
+ <message>
+ <source>Close</source>
+ <translation>Закрыть</translation>
+ </message>
+ <message>
+ <source>Previous</source>
+ <translation>Предыдущий</translation>
+ </message>
+ <message>
+ <source>Next</source>
+ <translation>Следующий</translation>
+ </message>
+ <message>
+ <source>Case Sensitive</source>
+ <translation>Учитывать регистр</translation>
+ </message>
+ <message>
+ <source>Whole words</source>
+ <translation>Слова целиком</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;Поиск с начала</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptDebuggerLocalsModel</name>
+ <message>
+ <source>Name</source>
+ <translation>Название</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Значение</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptDebuggerStackModel</name>
+ <message>
+ <source>Level</source>
+ <translation>Уровень</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Название</translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation>Размещение</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptEdit</name>
+ <message>
+ <source>Toggle Breakpoint</source>
+ <translation>Установить/убрать точку останова</translation>
+ </message>
+ <message>
+ <source>Disable Breakpoint</source>
+ <translation>Убрать точку останова</translation>
+ </message>
+ <message>
+ <source>Enable Breakpoint</source>
+ <translation>Установить точку останова</translation>
+ </message>
+ <message>
+ <source>Breakpoint Condition:</source>
+ <translation>Условие точки останова:</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptEngineDebugger</name>
+ <message>
+ <source>Loaded Scripts</source>
+ <translation>Загруженные сценарии</translation>
+ </message>
+ <message>
+ <source>Breakpoints</source>
+ <translation>Точки останова</translation>
+ </message>
+ <message>
+ <source>Stack</source>
+ <translation>Стек</translation>
+ </message>
+ <message>
+ <source>Locals</source>
+ <translation>Локальные переменные</translation>
+ </message>
+ <message>
+ <source>Console</source>
+ <translation>Консоль</translation>
+ </message>
+ <message>
+ <source>Debug Output</source>
+ <translation>Отладочный вывод</translation>
+ </message>
+ <message>
+ <source>Error Log</source>
+ <translation>Журнал ошибок</translation>
+ </message>
+ <message>
+ <source>Search</source>
+ <translation>Поиск</translation>
+ </message>
+ <message>
+ <source>View</source>
+ <translation>Вид</translation>
+ </message>
+ <message>
+ <source>Qt Script Debugger</source>
+ <translation>Отладчик сценариев Qt</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptNewBreakpointWidget</name>
+ <message>
+ <source>Close</source>
+ <translation>Закрыть</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScrollBar</name>
+ <message>
+ <source>Scroll here</source>
+ <translation>Прокрутить сюда</translation>
+ </message>
+ <message>
+ <source>Left edge</source>
+ <translation>К левой границе</translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <translation>Вверх</translation>
+ </message>
+ <message>
+ <source>Right edge</source>
+ <translation>К правой границе</translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <translation>Вниз</translation>
+ </message>
+ <message>
+ <source>Page left</source>
+ <translation>На страницу влево</translation>
+ </message>
+ <message>
+ <source>Page up</source>
+ <translation>На страницу вверх</translation>
+ </message>
+ <message>
+ <source>Page right</source>
+ <translation>На страницу вправо</translation>
+ </message>
+ <message>
+ <source>Page down</source>
+ <translation>На страницу вниз</translation>
+ </message>
+ <message>
+ <source>Scroll left</source>
+ <translation>Прокрутить влево</translation>
+ </message>
+ <message>
+ <source>Scroll up</source>
+ <translation>Прокрутить вверх</translation>
+ </message>
+ <message>
+ <source>Scroll right</source>
+ <translation>Прокрутить вправо</translation>
+ </message>
+ <message>
+ <source>Scroll down</source>
+ <translation>Прокрутить вниз</translation>
+ </message>
+ <message>
+ <source>Line up</source>
+ <translation>На строку вверх</translation>
+ </message>
+ <message>
+ <source>Position</source>
+ <translation>Положение</translation>
+ </message>
+ <message>
+ <source>Line down</source>
+ <translation>На строку вниз</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSharedMemory</name>
+ <message>
+ <source>%1: create size is less then 0</source>
+ <translation>%1: размер меньше нуля</translation>
+ </message>
+ <message>
+ <source>%1: unable to lock</source>
+ <translation>%1: невозможно заблокировать</translation>
+ </message>
+ <message>
+ <source>%1: unable to unlock</source>
+ <translation>%1: невозможно разблокировать</translation>
+ </message>
+ <message>
+ <source>%1: permission denied</source>
+ <translation>%1: доступ запрещён</translation>
+ </message>
+ <message>
+ <source>%1: already exists</source>
+ <translation>%1: уже существует</translation>
+ </message>
+ <message>
+ <source>%1: doesn&apos;t exists</source>
+ <translation>%1: не существует</translation>
+ </message>
+ <message>
+ <source>%1: out of resources</source>
+ <translation>%1: недостаточно ресурсов</translation>
+ </message>
+ <message>
+ <source>%1: unknown error %2</source>
+ <translation>%1: неизвестная ошибка %2</translation>
+ </message>
+ <message>
+ <source>%1: key is empty</source>
+ <translation>%1: пустой ключ</translation>
+ </message>
+ <message>
+ <source>%1: ftok failed</source>
+ <translation>%1: ошибка ftok</translation>
+ </message>
+ <message>
+ <source>%1: unable to make key</source>
+ <translation>%1: невозможно создать ключ</translation>
+ </message>
+ <message>
+ <source>%1: doesn&apos;t exist</source>
+ <translation>%1: не существует</translation>
+ </message>
+ <message>
+ <source>%1: UNIX key file doesn&apos;t exist</source>
+ <translation>%1: специфический ключ UNIX не существует</translation>
+ </message>
+ <message>
+ <source>%1: system-imposed size restrictions</source>
+ <translation>%1: системой наложены ограничения на размер</translation>
+ </message>
+ <message>
+ <source>%1: not attached</source>
+ <translation>%1: не приложенный</translation>
+ </message>
+ <message>
+ <source>%1: invalid size</source>
+ <translation>%1: некорректный размер</translation>
+ </message>
+ <message>
+ <source>%1: key error</source>
+ <translation>%1: некорректный ключ</translation>
+ </message>
+ <message>
+ <source>%1: size query failed</source>
+ <translation>%1: не удалось запросить размер</translation>
+ </message>
+ <message>
+ <source>%1: unable to set key on lock</source>
+ <translation>%1: невозможно установить ключ на блокировку</translation>
+ </message>
+ </context>
+ <context>
+ <name>QShortcut</name>
+ <message>
+ <source>Space</source>
+ <translation>Пробел</translation>
+ </message>
+ <message>
+ <source>Esc</source>
+ <translation>Esc</translation>
+ </message>
+ <message>
+ <source>Tab</source>
+ <translation>Tab</translation>
+ </message>
+ <message>
+ <source>Backtab</source>
+ <translation>Обратная табуляция</translation>
+ </message>
+ <message>
+ <source>Backspace</source>
+ <translation>Backspace</translation>
+ </message>
+ <message>
+ <source>Return</source>
+ <translation>Возврат</translation>
+ </message>
+ <message>
+ <source>Enter</source>
+ <translation>Ввод</translation>
+ </message>
+ <message>
+ <source>Ins</source>
+ <translation>Ins</translation>
+ </message>
+ <message>
+ <source>Del</source>
+ <translation>Del</translation>
+ </message>
+ <message>
+ <source>Pause</source>
+ <translation>Пауза</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation>Распечатать</translation>
+ </message>
+ <message>
+ <source>SysReq</source>
+ <translation>SysReq</translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation>Главный</translation>
+ </message>
+ <message>
+ <source>End</source>
+ <translation>Завершить</translation>
+ </message>
+ <message>
+ <source>Left</source>
+ <translation>Влево</translation>
+ </message>
+ <message>
+ <source>Up</source>
+ <translation>Вверх</translation>
+ </message>
+ <message>
+ <source>Right</source>
+ <translation>Вправо</translation>
+ </message>
+ <message>
+ <source>Down</source>
+ <translation>Вниз</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>Меню</translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation>Справка</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation>Назад</translation>
+ </message>
+ <message>
+ <source>Forward</source>
+ <translation>Вперёд</translation>
+ </message>
+ <message>
+ <source>Stop</source>
+ <translation>Остановить</translation>
+ </message>
+ <message>
+ <source>Refresh</source>
+ <translation>Обновить</translation>
+ </message>
+ <message>
+ <source>Volume Down</source>
+ <translation>Тише</translation>
+ </message>
+ <message>
+ <source>Volume Mute</source>
+ <translation>Выключить звук</translation>
+ </message>
+ <message>
+ <source>Volume Up</source>
+ <translation>Громче</translation>
+ </message>
+ <message>
+ <source>Bass Boost</source>
+ <translation>Усиление басов</translation>
+ </message>
+ <message>
+ <source>Bass Up</source>
+ <translation>Увеличить басы</translation>
+ </message>
+ <message>
+ <source>Bass Down</source>
+ <translation>Уменьшить басы</translation>
+ </message>
+ <message>
+ <source>Treble Up</source>
+ <translation>Увеличить ВЧ</translation>
+ </message>
+ <message>
+ <source>Treble Down</source>
+ <translation>Уменьшить ВЧ</translation>
+ </message>
+ <message>
+ <source>Media Play</source>
+ <translation>Воспроизведение</translation>
+ </message>
+ <message>
+ <source>Media Stop</source>
+ <translation>Остановить воспроизведение</translation>
+ </message>
+ <message>
+ <source>Media Previous</source>
+ <translation>Воспроизвести предыдущее</translation>
+ </message>
+ <message>
+ <source>Media Next</source>
+ <translation>Воспроизвести следующее</translation>
+ </message>
+ <message>
+ <source>Media Record</source>
+ <translation>Запись</translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation>Избранное</translation>
+ </message>
+ <message>
+ <source>Search</source>
+ <translation>Поиск</translation>
+ </message>
+ <message>
+ <source>Standby</source>
+ <translation>Режим ожидания</translation>
+ </message>
+ <message>
+ <source>Open URL</source>
+ <translation>Открыть URL</translation>
+ </message>
+ <message>
+ <source>Launch Mail</source>
+ <translation>Почта</translation>
+ </message>
+ <message>
+ <source>Launch Media</source>
+ <translation>Проигрыватель</translation>
+ </message>
+ <message>
+ <source>Launch (0)</source>
+ <translation>Запустить (0)</translation>
+ </message>
+ <message>
+ <source>Launch (1)</source>
+ <translation>Запустить (1)</translation>
+ </message>
+ <message>
+ <source>Launch (2)</source>
+ <translation>Запустить (2)</translation>
+ </message>
+ <message>
+ <source>Launch (3)</source>
+ <translation>Запустить (3)</translation>
+ </message>
+ <message>
+ <source>Launch (4)</source>
+ <translation>Запустить (4)</translation>
+ </message>
+ <message>
+ <source>Launch (5)</source>
+ <translation>Запустить (5)</translation>
+ </message>
+ <message>
+ <source>Launch (6)</source>
+ <translation>Запустить (6)</translation>
+ </message>
+ <message>
+ <source>Launch (7)</source>
+ <translation>Запустить (7)</translation>
+ </message>
+ <message>
+ <source>Launch (8)</source>
+ <translation>Запустить (8)</translation>
+ </message>
+ <message>
+ <source>Launch (9)</source>
+ <translation>Запустить (9)</translation>
+ </message>
+ <message>
+ <source>Launch (A)</source>
+ <translation>Запустить (A)</translation>
+ </message>
+ <message>
+ <source>Launch (B)</source>
+ <translation>Запустить (B)</translation>
+ </message>
+ <message>
+ <source>Launch (C)</source>
+ <translation>Запустить (C)</translation>
+ </message>
+ <message>
+ <source>Launch (D)</source>
+ <translation>Запустить (D)</translation>
+ </message>
+ <message>
+ <source>Launch (E)</source>
+ <translation>Запустить (E)</translation>
+ </message>
+ <message>
+ <source>Launch (F)</source>
+ <translation>Запустить (F)</translation>
+ </message>
+ <message>
+ <source>Monitor Brightness Up</source>
+ <translation>Увеличить яркость монитора</translation>
+ </message>
+ <message>
+ <source>Monitor Brightness Down</source>
+ <translation>Уменьшить яркость монитора</translation>
+ </message>
+ <message>
+ <source>Keyboard Light On/Off</source>
+ <translation>Вкл./Откл. подсветку клавиатуры</translation>
+ </message>
+ <message>
+ <source>Keyboard Brightness Up</source>
+ <translation>Увеличить яркость клавиатуры</translation>
+ </message>
+ <message>
+ <source>Keyboard Brightness Down</source>
+ <translation>Уменьшить яркость клавиатуры</translation>
+ </message>
+ <message>
+ <source>Power Off</source>
+ <translation>Откл. питание</translation>
+ </message>
+ <message>
+ <source>Wake Up</source>
+ <translation>Проснуться</translation>
+ </message>
+ <message>
+ <source>Eject</source>
+ <translation>Извлечь</translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation>Экранная заставка</translation>
+ </message>
+ <message>
+ <source>WWW</source>
+ <translation>WWW</translation>
+ </message>
+ <message>
+ <source>Sleep</source>
+ <translation>Спящий режим</translation>
+ </message>
+ <message>
+ <source>LightBulb</source>
+ <translation>Лампочка</translation>
+ </message>
+ <message>
+ <source>Shop</source>
+ <translation>Магазин</translation>
+ </message>
+ <message>
+ <source>History</source>
+ <translation>История</translation>
+ </message>
+ <message>
+ <source>Add Favorite</source>
+ <translation>Добавить избранные</translation>
+ </message>
+ <message>
+ <source>Hot Links</source>
+ <translation>Активные ссылки</translation>
+ </message>
+ <message>
+ <source>Adjust Brightness</source>
+ <translation>Настроить яркость</translation>
+ </message>
+ <message>
+ <source>Finance</source>
+ <translation>Финансы</translation>
+ </message>
+ <message>
+ <source>Community</source>
+ <translation>Сообщество</translation>
+ </message>
+ <message>
+ <source>Audio Rewind</source>
+ <translation>Перемотка аудио назад</translation>
+ </message>
+ <message>
+ <source>Back Forward</source>
+ <translation>##</translation>
+ </message>
+ <message>
+ <source>Application Left</source>
+ <translation>Приложение слева</translation>
+ </message>
+ <message>
+ <source>Application Right</source>
+ <translation>Приложение справа</translation>
+ </message>
+ <message>
+ <source>Book</source>
+ <translation>Книга</translation>
+ </message>
+ <message>
+ <source>CD</source>
+ <translation>Компакт-диск</translation>
+ </message>
+ <message>
+ <source>Calculator</source>
+ <translation>Калькулятор</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Очистить</translation>
+ </message>
+ <message>
+ <source>Clear Grab</source>
+ <translation>Очистить буфер</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>Закрыть</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation>Скопировать</translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation>Вырезать</translation>
+ </message>
+ <message>
+ <source>Display</source>
+ <translation>Дисплей</translation>
+ </message>
+ <message>
+ <source>DOS</source>
+ <translation>DOS</translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation>Документы</translation>
+ </message>
+ <message>
+ <source>Spreadsheet</source>
+ <translation>Электронная таблица</translation>
+ </message>
+ <message>
+ <source>Browser</source>
+ <translation>Браузер</translation>
+ </message>
+ <message>
+ <source>Game</source>
+ <translation>Игра</translation>
+ </message>
+ <message>
+ <source>Go</source>
+ <translation>Перейти</translation>
+ </message>
+ <message>
+ <source>iTouch</source>
+ <translation>iTouch</translation>
+ </message>
+ <message>
+ <source>Logoff</source>
+ <translation>Выйти</translation>
+ </message>
+ <message>
+ <source>Market</source>
+ <translation>Рынок</translation>
+ </message>
+ <message>
+ <source>Meeting</source>
+ <translation>Встреча</translation>
+ </message>
+ <message>
+ <source>Keyboard Menu</source>
+ <translation>Меню клавиатуры</translation>
+ </message>
+ <message>
+ <source>Menu PB</source>
+ <translation>Меню PB</translation>
+ </message>
+ <message>
+ <source>My Sites</source>
+ <translation>Мои сайты</translation>
+ </message>
+ <message>
+ <source>News</source>
+ <translation>Новости</translation>
+ </message>
+ <message>
+ <source>Home Office</source>
+ <translation>Домашний офис</translation>
+ </message>
+ <message>
+ <source>Option</source>
+ <translation>Функция</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation>Вставить</translation>
+ </message>
+ <message>
+ <source>Phone</source>
+ <translation>Телефон</translation>
+ </message>
+ <message>
+ <source>Reply</source>
+ <translation>Ответить</translation>
+ </message>
+ <message>
+ <source>Reload</source>
+ <translation>Перезагрузить</translation>
+ </message>
+ <message>
+ <source>Rotate Windows</source>
+ <translation>Повернуть Windows</translation>
+ </message>
+ <message>
+ <source>Rotation PB</source>
+ <translation>Поворот PB</translation>
+ </message>
+ <message>
+ <source>Rotation KB</source>
+ <translation>Поворот KB</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation>Сохранить</translation>
+ </message>
+ <message>
+ <source>Send</source>
+ <translation>Передать</translation>
+ </message>
+ <message>
+ <source>Spellchecker</source>
+ <translation>Проверка правописания</translation>
+ </message>
+ <message>
+ <source>Split Screen</source>
+ <translation>Разделить экран</translation>
+ </message>
+ <message>
+ <source>Support</source>
+ <translation>Поддержка</translation>
+ </message>
+ <message>
+ <source>Task Panel</source>
+ <translation>Панель задач</translation>
+ </message>
+ <message>
+ <source>Terminal</source>
+ <translation>Терминал</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation>Инструменты</translation>
+ </message>
+ <message>
+ <source>Travel</source>
+ <translation>##</translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation>Видео</translation>
+ </message>
+ <message>
+ <source>Word Processor</source>
+ <translation>Редактор текста</translation>
+ </message>
+ <message>
+ <source>XFer</source>
+ <translation>XFer</translation>
+ </message>
+ <message>
+ <source>Zoom In</source>
+ <translation>Увеличить</translation>
+ </message>
+ <message>
+ <source>Zoom Out</source>
+ <translation>Уменьшить</translation>
+ </message>
+ <message>
+ <source>Away</source>
+ <translation>Отсутствует</translation>
+ </message>
+ <message>
+ <source>Messenger</source>
+ <translation>Messenger</translation>
+ </message>
+ <message>
+ <source>WebCam</source>
+ <translation>WebCam</translation>
+ </message>
+ <message>
+ <source>Mail Forward</source>
+ <translation>Переслать почту</translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation>Фотографии</translation>
+ </message>
+ <message>
+ <source>Music</source>
+ <translation>Музыка</translation>
+ </message>
+ <message>
+ <source>Battery</source>
+ <translation>Аккумулятор</translation>
+ </message>
+ <message>
+ <source>Bluetooth</source>
+ <translation>Bluetooth</translation>
+ </message>
+ <message>
+ <source>Wireless</source>
+ <translation>Беспроводной</translation>
+ </message>
+ <message>
+ <source>Ultra Wide Band</source>
+ <translation>Сверхширокий диапазон</translation>
+ </message>
+ <message>
+ <source>Audio Forward</source>
+ <translation>Перемотка аудио вперед</translation>
+ </message>
+ <message>
+ <source>Audio Repeat</source>
+ <translation>Повтор аудио</translation>
+ </message>
+ <message>
+ <source>Audio Random Play</source>
+ <translation>Воспроизведение аудио в случайном порядке</translation>
+ </message>
+ <message>
+ <source>Subtitle</source>
+ <translation>Подзаголовок</translation>
+ </message>
+ <message>
+ <source>Audio Cycle Track</source>
+ <translation>Повтор аудиодорожки</translation>
+ </message>
+ <message>
+ <source>Time</source>
+ <translation>Время</translation>
+ </message>
+ <message>
+ <source>View</source>
+ <translation>Вид</translation>
+ </message>
+ <message>
+ <source>Top Menu</source>
+ <translation>Верхнее меню</translation>
+ </message>
+ <message>
+ <source>Suspend</source>
+ <translation>Приостановить</translation>
+ </message>
+ <message>
+ <source>Hibernate</source>
+ <translation>Спящий режим</translation>
+ </message>
+ <message>
+ <source>Print Screen</source>
+ <translation>Печать экрана</translation>
+ </message>
+ <message>
+ <source>Page Up</source>
+ <translation>Страница вверх</translation>
+ </message>
+ <message>
+ <source>Page Down</source>
+ <translation>Страница вниз</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>Режим ввода цифр</translation>
+ </message>
+ <message>
+ <source>Scroll Lock</source>
+ <translation>Блокировка прокрутки</translation>
+ </message>
+ <message>
+ <source>Insert</source>
+ <translation>Вставить</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>Удалить</translation>
+ </message>
+ <message>
+ <source>Escape</source>
+ <translation>Выход</translation>
+ </message>
+ <message>
+ <source>System Request</source>
+ <translation>Системный запрос</translation>
+ </message>
+ <message>
+ <source>Select</source>
+ <translation>Выбрать</translation>
+ </message>
+ <message>
+ <source>Yes</source>
+ <translation>Да</translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation>Нет</translation>
+ </message>
+ <message>
+ <source>Context1</source>
+ <translation>Контекст1</translation>
+ </message>
+ <message>
+ <source>Context2</source>
+ <translation>Контекст2</translation>
+ </message>
+ <message>
+ <source>Context3</source>
+ <translation>Контекст3</translation>
+ </message>
+ <message>
+ <source>Context4</source>
+ <translation>Контекст4</translation>
+ </message>
+ <message>
+ <source>Call</source>
+ <translation>Вызов</translation>
+ </message>
+ <message>
+ <source>Hangup</source>
+ <translation>Завершить вызов</translation>
+ </message>
+ <message>
+ <source>Flip</source>
+ <translation>Перевернуть</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>##</translation>
+ </message>
+ <message>
+ <source>+</source>
+ <translation>+</translation>
+ </message>
+ <message>
+ <source>F%1</source>
+ <translation>F%1</translation>
+ </message>
+ <message>
+ <source>Home Page</source>
+ <translation>Главная страница</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSlider</name>
+ <message>
+ <source>Page left</source>
+ <translation>Страница влево</translation>
+ </message>
+ <message>
+ <source>Page up</source>
+ <translation>Страница вверх</translation>
+ </message>
+ <message>
+ <source>Position</source>
+ <translation>Положение</translation>
+ </message>
+ <message>
+ <source>Page right</source>
+ <translation>Страница вправо</translation>
+ </message>
+ <message>
+ <source>Page down</source>
+ <translation>Страница вниз</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSocks5SocketEngine</name>
+ <message>
+ <source>Connection to proxy refused</source>
+ <translation>В соединении с прокси-сервером отказано</translation>
+ </message>
+ <message>
+ <source>Connection to proxy closed prematurely</source>
+ <translation>Соединение с прокси-сервером неожиданно закрыто</translation>
+ </message>
+ <message>
+ <source>Proxy host not found</source>
+ <translation>Прокси-сервер не найден</translation>
+ </message>
+ <message>
+ <source>Connection to proxy timed out</source>
+ <translation>Время на соединение с прокси-сервером истекло</translation>
+ </message>
+ <message>
+ <source>Proxy authentication failed</source>
+ <translation>Не удалось авторизоваться на прокси-сервере</translation>
+ </message>
+ <message>
+ <source>Proxy authentication failed: %1</source>
+ <translation>Не удалось авторизоваться на прокси-сервере: %1</translation>
+ </message>
+ <message>
+ <source>SOCKS version 5 protocol error</source>
+ <translation>Ошибка протокола SOCKSv5</translation>
+ </message>
+ <message>
+ <source>General SOCKSv5 server failure</source>
+ <translation>Ошибка сервере SOCKSv5</translation>
+ </message>
+ <message>
+ <source>Connection not allowed by SOCKSv5 server</source>
+ <translation>Соединение не разрешено сервером SOCKSv5</translation>
+ </message>
+ <message>
+ <source>TTL expired</source>
+ <translation>TTL истекло</translation>
+ </message>
+ <message>
+ <source>SOCKSv5 command not supported</source>
+ <translation>Команда SOCKSv5 не поддерживается</translation>
+ </message>
+ <message>
+ <source>Address type not supported</source>
+ <translation>Тип адреса не поддерживается</translation>
+ </message>
+ <message>
+ <source>Unknown SOCKSv5 proxy error code 0x%1</source>
+ <translation>Неизвестная ошибка SOCKSv5 прокси (код 0x%1)</translation>
+ </message>
+ <message>
+ <source>Network operation timed out</source>
+ <translation>Время на сетевую операцию истекло</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSoftKeyManager</name>
+ <message>
+ <source>Ok</source>
+ <translation>ОК</translation>
+ </message>
+ <message>
+ <source>Select</source>
+ <translation>Выбрать</translation>
+ </message>
+ <message>
+ <source>Done</source>
+ <translation>Готово</translation>
+ </message>
+ <message>
+ <source>Options</source>
+ <translation>Параметры</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation>Выход</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSpinBox</name>
+ <message>
+ <source>More</source>
+ <translation>Больше</translation>
+ </message>
+ <message>
+ <source>Less</source>
+ <translation>Меньше</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSql</name>
+ <message>
+ <source>Delete</source>
+ <translation>Удалить</translation>
+ </message>
+ <message>
+ <source>Delete this record?</source>
+ <translation>Удалить данную запись?</translation>
+ </message>
+ <message>
+ <source>Yes</source>
+ <translation>Да</translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation>Нет</translation>
+ </message>
+ <message>
+ <source>Insert</source>
+ <translation>Вставить</translation>
+ </message>
+ <message>
+ <source>Update</source>
+ <translation>Обновить</translation>
+ </message>
+ <message>
+ <source>Save edits?</source>
+ <translation>Сохранить изменения?</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <source>Confirm</source>
+ <translation>Подтверждение</translation>
+ </message>
+ <message>
+ <source>Cancel your edits?</source>
+ <translation>Отменить изменения?</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSslSocket</name>
+ <message>
+ <source>Unable to write data: %1</source>
+ <translation>Невозможно записать данные: %1</translation>
+ </message>
+ <message>
+ <source>Unable to decrypt data: %1</source>
+ <translation>Невозможно расшифровать данные: %1</translation>
+ </message>
+ <message>
+ <source>Error while reading: %1</source>
+ <translation>Ошибка чтения: %1</translation>
+ </message>
+ <message>
+ <source>Error during SSL handshake: %1</source>
+ <translation>Ошибка квитирования SSL: %1</translation>
+ </message>
+ <message>
+ <source>Error creating SSL context (%1)</source>
+ <translation>Ошибка создания контекста SSL: (%1)</translation>
+ </message>
+ <message>
+ <source>Invalid or empty cipher list (%1)</source>
+ <translation>Неправильный или пустой список шифров (%1)</translation>
+ </message>
+ <message>
+ <source>Private key does not certify public key, %1</source>
+ <translation>Частный ключ не подтверждает общий ключ, %1</translation>
+ </message>
+ <message>
+ <source>Error creating SSL session, %1</source>
+ <translation>Ошибка создания сессии SSL, %1</translation>
+ </message>
+ <message>
+ <source>Error creating SSL session: %1</source>
+ <translation>Ошибка создания сессии SSL: %1</translation>
+ </message>
+ <message>
+ <source>Cannot provide a certificate with no key, %1</source>
+ <translation>Невозможно предоставить сертификат без ключа, %1</translation>
+ </message>
+ <message>
+ <source>Error loading local certificate, %1</source>
+ <translation>Ошибка загрузки локального сертификата, %1</translation>
+ </message>
+ <message>
+ <source>Error loading private key, %1</source>
+ <translation>Ошибка загрузки закрытого ключа, %1</translation>
+ </message>
+ <message>
+ <source>No error</source>
+ <translation>Нет ошибки</translation>
+ </message>
+ <message>
+ <source>The issuer certificate could not be found</source>
+ <translation>Невозможно найти сертификат издателя</translation>
+ </message>
+ <message>
+ <source>The certificate signature could not be decrypted</source>
+ <translation>Невозможно расшифровать подпись сертификата</translation>
+ </message>
+ <message>
+ <source>The public key in the certificate could not be read</source>
+ <translation>Невозможно прочитать общий ключ сертификата</translation>
+ </message>
+ <message>
+ <source>The signature of the certificate is invalid</source>
+ <translation>Неверная подпись сертификата</translation>
+ </message>
+ <message>
+ <source>The certificate is not yet valid</source>
+ <translation>Сертификат еще не действует</translation>
+ </message>
+ <message>
+ <source>The certificate has expired</source>
+ <translation>Сертификат истек</translation>
+ </message>
+ <message>
+ <source>The certificate&apos;s notBefore field contains an invalid time</source>
+ <translation>Поле notBefore сертификата содержит неверное время</translation>
+ </message>
+ <message>
+ <source>The certificate&apos;s notAfter field contains an invalid time</source>
+ <translation>Поле notAfter сертификата содержит неверное время</translation>
+ </message>
+ <message>
+ <source>The certificate is self-signed, and untrusted</source>
+ <translation>Сертификаты с внутренней подписью и не проверены</translation>
+ </message>
+ <message>
+ <source>The root certificate of the certificate chain is self-signed, and untrusted</source>
+ <translation>Корневой сертификат цепочки сертификатов имеет внутреннюю подппись и не проверен</translation>
+ </message>
+ <message>
+ <source>The issuer certificate of a locally looked up certificate could not be found</source>
+ <translation>Невозможно найти сертификат издателя локального сертификата</translation>
+ </message>
+ <message>
+ <source>No certificates could be verified</source>
+ <translation>Невозможно проверить сертификаты</translation>
+ </message>
+ <message>
+ <source>One of the CA certificates is invalid</source>
+ <translation>Один из сертификатов центра сертификации неверный</translation>
+ </message>
+ <message>
+ <source>The basicConstraints path length parameter has been exceeded</source>
+ <translation>Превышено значение параметра длины пути basicConstraints</translation>
+ </message>
+ <message>
+ <source>The supplied certificate is unsuitable for this purpose</source>
+ <translation>Представленный сертификат непригоден для этой цели</translation>
+ </message>
+ <message>
+ <source>The root CA certificate is not trusted for this purpose</source>
+ <translation>Корневой сертификат ЦС не проверен для этой цели</translation>
+ </message>
+ <message>
+ <source>The root CA certificate is marked to reject the specified purpose</source>
+ <translation>Корневой сертификат ЦС отмечен для отклонения для указанной цели</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>Текущий кандидат сертификат издателя отклонен, так как название темы не совпадает с названием издателя текущего сертификата</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>Текущий кандидат сертификат издателя отклонен, так как его название издателя и серийный номер не совпадают с идентификатором ключа текущего сертификата</translation>
+ </message>
+ <message>
+ <source>The peer did not present any certificate</source>
+ <translation>Сертификат не представлен</translation>
+ </message>
+ <message>
+ <source>The host name did not match any of the valid hosts for this certificate</source>
+ <translation>Имя владельца не совпадает с допустимыми владельцами сертификата</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>Неизвестная ошибка</translation>
+ </message>
+ </context>
+ <context>
+ <name>QStateMachine</name>
+ <message>
+ <source>Missing initial state in compound state &apos;%1&apos;</source>
+ <translation>Отсутствует исходное состояние в составном состоянии &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <source>Missing default state in history state &apos;%1&apos;</source>
+ <translation>Отсутствует состояние по умолчанию в историческом состоянии &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <source>No common ancestor for targets and source of transition from state &apos;%1&apos;</source>
+ <translation>Нет общего предка для целей и источника перехода из состояния &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>Неизвестная ошибка</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSystemSemaphore</name>
+ <message>
+ <source>%1: does not exist</source>
+ <translation>%1: не существует</translation>
+ </message>
+ <message>
+ <source>%1: out of resources</source>
+ <translation>%1: недостаточно ресурсов</translation>
+ </message>
+ <message>
+ <source>%1: permission denied</source>
+ <translation>%1: доступ запрещён</translation>
+ </message>
+ <message>
+ <source>%1: already exists</source>
+ <translation>%1: уже существует</translation>
+ </message>
+ <message>
+ <source>%1: unknown error %2</source>
+ <translation>%1: неизвестная ошибка %2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QTDSDriver</name>
+ <message>
+ <source>Unable to open connection</source>
+ <translation>Невозможно открыть соединение</translation>
+ </message>
+ <message>
+ <source>Unable to use database</source>
+ <translation>Невозможно использовать базу данных</translation>
+ </message>
+ </context>
+ <context>
+ <name>QTabBar</name>
+ <message>
+ <source>Scroll Left</source>
+ <translation>Прокрутить влево</translation>
+ </message>
+ <message>
+ <source>Scroll Right</source>
+ <translation>Прокрутить вправо</translation>
+ </message>
+ </context>
+ <context>
+ <name>QTcpServer</name>
+ <message>
+ <source>Operation on socket is not supported</source>
+ <translation>Операция с сокетом не поддерживается</translation>
+ </message>
+ </context>
+ <context>
+ <name>QTextControl</name>
+ <message>
+ <source>&amp;Undo</source>
+ <translation>&amp;Отменить действие</translation>
+ </message>
+ <message>
+ <source>&amp;Redo</source>
+ <translation>&amp;Повторить действие</translation>
+ </message>
+ <message>
+ <source>Cu&amp;t</source>
+ <translation>&amp;Вырезать</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>&amp;Копировать</translation>
+ </message>
+ <message>
+ <source>Copy &amp;Link Location</source>
+ <translation>Скопировать &amp;адрес ссылки</translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation>В&amp;ставить</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>Удалить</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation>Выделить всё</translation>
+ </message>
+ </context>
+ <context>
+ <name>QToolButton</name>
+ <message>
+ <source>Press</source>
+ <translation>Нажать</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>Открыть</translation>
+ </message>
+ </context>
+ <context>
+ <name>QUdpSocket</name>
+ <message>
+ <source>This platform does not support IPv6</source>
+ <translation>Данная платформа не поддерживает IPv6</translation>
+ </message>
+ </context>
+ <context>
+ <name>QUndoGroup</name>
+ <message>
+ <source>Undo</source>
+ <translation>Отменить действие</translation>
+ </message>
+ <message>
+ <source>Redo</source>
+ <translation>Повторить действие</translation>
+ </message>
+ </context>
+ <context>
+ <name>QUndoModel</name>
+ <message>
+ <source>&lt;empty&gt;</source>
+ <translation>&lt;пусто&gt;</translation>
+ </message>
+ </context>
+ <context>
+ <name>QUndoStack</name>
+ <message>
+ <source>Undo</source>
+ <translation>Отменить действие</translation>
+ </message>
+ <message>
+ <source>Redo</source>
+ <translation>Повторить действие</translation>
+ </message>
+ </context>
+ <context>
+ <name>QUnicodeControlCharacterMenu</name>
+ <message>
+ <source>LRM Left-to-right mark</source>
+ <translation>LRM Признак письма слева направо</translation>
+ </message>
+ <message>
+ <source>RLM Right-to-left mark</source>
+ <translation>RLM Признак письма справа налево</translation>
+ </message>
+ <message>
+ <source>ZWJ Zero width joiner</source>
+ <translation>ZWJ Объединяющий символ нулевой ширины</translation>
+ </message>
+ <message>
+ <source>ZWNJ Zero width non-joiner</source>
+ <translation>ZWNJ Не объединяющий символ нулевой ширины</translation>
+ </message>
+ <message>
+ <source>ZWSP Zero width space</source>
+ <translation>ZWSP Пробел нулевой ширины</translation>
+ </message>
+ <message>
+ <source>LRE Start of left-to-right embedding</source>
+ <translation>LRE Начать встраивание слева направо</translation>
+ </message>
+ <message>
+ <source>RLE Start of right-to-left embedding</source>
+ <translation>RLE Начать встраивание справа налево</translation>
+ </message>
+ <message>
+ <source>LRO Start of left-to-right override</source>
+ <translation>LRE Начать замену слева направо</translation>
+ </message>
+ <message>
+ <source>RLO Start of right-to-left override</source>
+ <translation>RLE Начать замену справа налево</translation>
+ </message>
+ <message>
+ <source>PDF Pop directional formatting</source>
+ <translation>##</translation>
+ </message>
+ <message>
+ <source>Insert Unicode control character</source>
+ <translation>Вставить управляющий символ Unicode</translation>
+ </message>
+ </context>
+ <context>
+ <name>QWebFrame</name>
+ <message>
+ <source>Request cancelled</source>
+ <translation>Запрос отменён</translation>
+ </message>
+ <message>
+ <source>Request blocked</source>
+ <translation>Запрос блокирован</translation>
+ </message>
+ <message>
+ <source>Cannot show URL</source>
+ <translation>Невозможно отобразить URL</translation>
+ </message>
+ <message>
+ <source>Frame load interrupted by policy change</source>
+ <translation>Загрузка фрейма прервана изменением политики</translation>
+ </message>
+ <message>
+ <source>Cannot show mimetype</source>
+ <translation>Невозможно отобразить тип MIME</translation>
+ </message>
+ <message>
+ <source>File does not exist</source>
+ <translation>Файл не существует</translation>
+ </message>
+ </context>
+ <context>
+ <name>QWebPage</name>
+ <message>
+ <source>Submit</source>
+ <comment>default label for Submit buttons in forms on web pages</comment>
+ <translation>Отправить</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>Отправить</translation>
+ </message>
+ <message>
+ <source>Reset</source>
+ <comment>default label for Reset buttons in forms on web pages</comment>
+ <translation>Сбросить</translation>
+ </message>
+ <message>
+ <source>Choose File</source>
+ <comment>title for file button used in HTML forms</comment>
+ <translation>Обзор...</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>Файл не указан</translation>
+ </message>
+ <message>
+ <source>Open in New Window</source>
+ <comment>Open in New Window context menu item</comment>
+ <translation>Открыть в новом окне</translation>
+ </message>
+ <message>
+ <source>Save Link...</source>
+ <comment>Download Linked File context menu item</comment>
+ <translation>Сохранить по ссылке как...</translation>
+ </message>
+ <message>
+ <source>Copy Link</source>
+ <comment>Copy Link context menu item</comment>
+ <translation>Копировать адрес ссылки</translation>
+ </message>
+ <message>
+ <source>Open Image</source>
+ <comment>Open Image in New Window context menu item</comment>
+ <translation>Открыть изображение</translation>
+ </message>
+ <message>
+ <source>Save Image</source>
+ <comment>Download Image context menu item</comment>
+ <translation>Сохранить изображение</translation>
+ </message>
+ <message>
+ <source>Copy Image</source>
+ <comment>Copy Link context menu item</comment>
+ <translation>Копировать изображение в буффер обмена</translation>
+ </message>
+ <message>
+ <source>Open Frame</source>
+ <comment>Open Frame in New Window context menu item</comment>
+ <translation>Открыть фрейм</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <comment>Copy context menu item</comment>
+ <translation>Копировать</translation>
+ </message>
+ <message>
+ <source>Go Back</source>
+ <comment>Back context menu item</comment>
+ <translation>Назад</translation>
+ </message>
+ <message>
+ <source>Go Forward</source>
+ <comment>Forward context menu item</comment>
+ <translation>Вперёд</translation>
+ </message>
+ <message>
+ <source>Stop</source>
+ <comment>Stop context menu item</comment>
+ <translation>Остановить</translation>
+ </message>
+ <message>
+ <source>Reload</source>
+ <comment>Reload context menu item</comment>
+ <translation>Обновить</translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <comment>Cut context menu item</comment>
+ <translation>Вырезать</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <comment>Paste context menu item</comment>
+ <translation>Вставить</translation>
+ </message>
+ <message>
+ <source>No Guesses Found</source>
+ <comment>No Guesses Found context menu item</comment>
+ <translation>Неверное слово</translation>
+ </message>
+ <message>
+ <source>Ignore</source>
+ <comment>Ignore Spelling context menu item</comment>
+ <translation>Пропустить</translation>
+ </message>
+ <message>
+ <source>Add To Dictionary</source>
+ <comment>Learn Spelling context menu item</comment>
+ <translation>Добавить в словарь</translation>
+ </message>
+ <message>
+ <source>Search The Web</source>
+ <comment>Search The Web context menu item</comment>
+ <translation>Искать в Интернет</translation>
+ </message>
+ <message>
+ <source>Look Up In Dictionary</source>
+ <comment>Look Up in Dictionary context menu item</comment>
+ <translation>Искать в словаре</translation>
+ </message>
+ <message>
+ <source>Open Link</source>
+ <comment>Open Link context menu item</comment>
+ <translation>Открыть ссылку</translation>
+ </message>
+ <message>
+ <source>Ignore</source>
+ <comment>Ignore Grammar context menu item</comment>
+ <translation>Пропустить</translation>
+ </message>
+ <message>
+ <source>Spelling</source>
+ <comment>Spelling and Grammar context sub-menu item</comment>
+ <translation>Орфография</translation>
+ </message>
+ <message>
+ <source>Show Spelling and Grammar</source>
+ <comment>menu item title</comment>
+ <translation>Показать панель проверки правописания</translation>
+ </message>
+ <message>
+ <source>Hide Spelling and Grammar</source>
+ <comment>menu item title</comment>
+ <translation>Скрыть панель проверки правописания</translation>
+ </message>
+ <message>
+ <source>Check Spelling</source>
+ <comment>Check spelling context menu item</comment>
+ <translation>Проверка орфографии</translation>
+ </message>
+ <message>
+ <source>Check Spelling While Typing</source>
+ <comment>Check spelling while typing context menu item</comment>
+ <translation>Проверять орфографию при наборе текста</translation>
+ </message>
+ <message>
+ <source>Check Grammar With Spelling</source>
+ <comment>Check grammar with spelling context menu item</comment>
+ <translation>Проверять грамматику с орфографией</translation>
+ </message>
+ <message>
+ <source>Fonts</source>
+ <comment>Font context sub-menu item</comment>
+ <translation>Шрифты</translation>
+ </message>
+ <message>
+ <source>Bold</source>
+ <comment>Bold context menu item</comment>
+ <translation>Жирный</translation>
+ </message>
+ <message>
+ <source>Italic</source>
+ <comment>Italic context menu item</comment>
+ <translation>Курсив</translation>
+ </message>
+ <message>
+ <source>Underline</source>
+ <comment>Underline context menu item</comment>
+ <translation>Подчёркнутый</translation>
+ </message>
+ <message>
+ <source>Outline</source>
+ <comment>Outline context menu item</comment>
+ <translation>Перечёркнутый</translation>
+ </message>
+ <message>
+ <source>Direction</source>
+ <comment>Writing direction context sub-menu item</comment>
+ <translation>Направление письма</translation>
+ </message>
+ <message>
+ <source>Text Direction</source>
+ <comment>Text direction context sub-menu item</comment>
+ <translation>Направление текста</translation>
+ </message>
+ <message>
+ <source>Default</source>
+ <comment>Default writing direction context menu item</comment>
+ <translation>По умолчанию</translation>
+ </message>
+ <message>
+ <source>Left to Right</source>
+ <comment>Left to Right context menu item</comment>
+ <translation>Слева направо</translation>
+ </message>
+ <message>
+ <source>Right to Left</source>
+ <comment>Right to Left context menu item</comment>
+ <translation>Справа налево</translation>
+ </message>
+ <message>
+ <source>Loading...</source>
+ <comment>Media controller status message when the media is loading</comment>
+ <translation>Загрузка...</translation>
+ </message>
+ <message>
+ <source>Live Broadcast</source>
+ <comment>Media controller status message when watching a live broadcast</comment>
+ <translation>Потоковое вещание</translation>
+ </message>
+ <message>
+ <source>Audio Element</source>
+ <comment>Media controller element</comment>
+ <translation>Аудио-элемент</translation>
+ </message>
+ <message>
+ <source>Video Element</source>
+ <comment>Media controller element</comment>
+ <translation>Видеоэлемент</translation>
+ </message>
+ <message>
+ <source>Mute Button</source>
+ <comment>Media controller element</comment>
+ <translation>Кнопка &quot;Отключить звук&quot;</translation>
+ </message>
+ <message>
+ <source>Unmute Button</source>
+ <comment>Media controller element</comment>
+ <translation>Кнопка &quot;Включить звук&quot;</translation>
+ </message>
+ <message>
+ <source>Play Button</source>
+ <comment>Media controller element</comment>
+ <translation>Кнопка воспроизведения</translation>
+ </message>
+ <message>
+ <source>Pause Button</source>
+ <comment>Media controller element</comment>
+ <translation>Кнопка &quot;Пауза&quot;</translation>
+ </message>
+ <message>
+ <source>Slider</source>
+ <comment>Media controller element</comment>
+ <translation>Регулятор</translation>
+ </message>
+ <message>
+ <source>Slider Thumb</source>
+ <comment>Media controller element</comment>
+ <translation>Метка регулятора</translation>
+ </message>
+ <message>
+ <source>Rewind Button</source>
+ <comment>Media controller element</comment>
+ <translation>Кнопка &quot;Перемотка назад&quot;</translation>
+ </message>
+ <message>
+ <source>Return to Real-time Button</source>
+ <comment>Media controller element</comment>
+ <translation>Кнопка &quot;Вернуть в реальное время&quot;</translation>
+ </message>
+ <message>
+ <source>Elapsed Time</source>
+ <comment>Media controller element</comment>
+ <translation>Прошедшее время</translation>
+ </message>
+ <message>
+ <source>Remaining Time</source>
+ <comment>Media controller element</comment>
+ <translation>Оставшееся время</translation>
+ </message>
+ <message>
+ <source>Status Display</source>
+ <comment>Media controller element</comment>
+ <translation>Экран состояния</translation>
+ </message>
+ <message>
+ <source>Fullscreen Button</source>
+ <comment>Media controller element</comment>
+ <translation>Кнопка &quot;На весь экран&quot;</translation>
+ </message>
+ <message>
+ <source>Seek Forward Button</source>
+ <comment>Media controller element</comment>
+ <translation>Кнопка &quot;Поиск вперед&quot;</translation>
+ </message>
+ <message>
+ <source>Seek Back Button</source>
+ <comment>Media controller element</comment>
+ <translation>Кнопка &quot;Поиск назад&quot;</translation>
+ </message>
+ <message>
+ <source>Audio element playback controls and status display</source>
+ <comment>Media controller element</comment>
+ <translation>Органы управления воспроизведением аудио-элементов и отображением состояния</translation>
+ </message>
+ <message>
+ <source>Video element playback controls and status display</source>
+ <comment>Media controller element</comment>
+ <translation>Органы управления воспроизведением видеоэлементов и отображением состояния</translation>
+ </message>
+ <message>
+ <source>Mute audio tracks</source>
+ <comment>Media controller element</comment>
+ <translation>Отключить звук аудиодорожек</translation>
+ </message>
+ <message>
+ <source>Unmute audio tracks</source>
+ <comment>Media controller element</comment>
+ <translation>Включить звук аудиодорожек</translation>
+ </message>
+ <message>
+ <source>Begin playback</source>
+ <comment>Media controller element</comment>
+ <translation>Начать воспроизведение</translation>
+ </message>
+ <message>
+ <source>Pause playback</source>
+ <comment>Media controller element</comment>
+ <translation>Воспроизведение после паузы</translation>
+ </message>
+ <message>
+ <source>Movie time scrubber</source>
+ <comment>Media controller element</comment>
+ <translation>Очиститель времени фильма</translation>
+ </message>
+ <message>
+ <source>Movie time scrubber thumb</source>
+ <comment>Media controller element</comment>
+ <translation>Метка очистителя времени фильма</translation>
+ </message>
+ <message>
+ <source>Rewind movie</source>
+ <comment>Media controller element</comment>
+ <translation>Перемотать фильм назад</translation>
+ </message>
+ <message>
+ <source>Return streaming movie to real-time</source>
+ <comment>Media controller element</comment>
+ <translation>Вернуть потоковое воспроизведение фильма в реальное время</translation>
+ </message>
+ <message>
+ <source>Current movie time</source>
+ <comment>Media controller element</comment>
+ <translation>Время текущего фильма</translation>
+ </message>
+ <message>
+ <source>Remaining movie time</source>
+ <comment>Media controller element</comment>
+ <translation>Оставшееся время фильма</translation>
+ </message>
+ <message>
+ <source>Current movie status</source>
+ <comment>Media controller element</comment>
+ <translation>Состояние текущего фильма</translation>
+ </message>
+ <message>
+ <source>Play movie in full-screen mode</source>
+ <comment>Media controller element</comment>
+ <translation>Воспроизведение фильма в режиме отображения на весь экран</translation>
+ </message>
+ <message>
+ <source>Seek quickly back</source>
+ <comment>Media controller element</comment>
+ <translation>Быстрый поиск назад</translation>
+ </message>
+ <message>
+ <source>Seek quickly forward</source>
+ <comment>Media controller element</comment>
+ <translation>Быстрый поиск вперед</translation>
+ </message>
+ <message>
+ <source>Indefinite time</source>
+ <comment>Media time description</comment>
+ <translation>Неопределенное время</translation>
+ </message>
+ <message>
+ <source>%1 days %2 hours %3 minutes %4 seconds</source>
+ <comment>Media time description</comment>
+ <translation>%1 дн. %2 ч. %3 мин. %4 сек.</translation>
+ </message>
+ <message>
+ <source>%1 hours %2 minutes %3 seconds</source>
+ <comment>Media time description</comment>
+ <translation>%1 ч. %2 мин. %3 сек.</translation>
+ </message>
+ <message>
+ <source>%1 minutes %2 seconds</source>
+ <comment>Media time description</comment>
+ <translation>%1 мин. %2 сек.</translation>
+ </message>
+ <message>
+ <source>%1 seconds</source>
+ <comment>Media time description</comment>
+ <translation>%1 сек.</translation>
+ </message>
+ <message>
+ <source>Inspect</source>
+ <comment>Inspect Element context menu item</comment>
+ <translation>Проверить</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>История поиска пуста</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>История поиска</translation>
+ </message>
+ <message>
+ <source>Clear recent searches</source>
+ <comment>menu item in Recent Searches menu that empties menu&apos;s contents</comment>
+ <translation>Очистить историю поиска</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <comment>Unknown filesize FTP directory listing item</comment>
+ <translation>Неизвестно</translation>
+ </message>
+ <message>
+ <source>Web Inspector - %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 (%2x%3 pixels)</source>
+ <comment>Title string for images</comment>
+ <translation>%1 (%2x%3 px)</translation>
+ </message>
+ <message>
+ <source>Bad HTTP request</source>
+ <translation>Некорректный HTTP-запрос</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>Индекс поиска. Введите ключевые слова для поиска: </translation>
+ </message>
+ <message>
+ <source>Scroll here</source>
+ <translation>Прокрутить сюда</translation>
+ </message>
+ <message>
+ <source>Left edge</source>
+ <translation>К левой границе</translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <translation>Вверх</translation>
+ </message>
+ <message>
+ <source>Right edge</source>
+ <translation>К правой границе</translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <translation>Вниз</translation>
+ </message>
+ <message>
+ <source>Page left</source>
+ <translation>На страницу влево</translation>
+ </message>
+ <message>
+ <source>Page up</source>
+ <translation>На страницу вверх</translation>
+ </message>
+ <message>
+ <source>Page right</source>
+ <translation>На страницу вправо</translation>
+ </message>
+ <message>
+ <source>Page down</source>
+ <translation>На страницу вниз</translation>
+ </message>
+ <message>
+ <source>Scroll left</source>
+ <translation>Прокрутить влево</translation>
+ </message>
+ <message>
+ <source>Scroll up</source>
+ <translation>Прокрутить вверх</translation>
+ </message>
+ <message>
+ <source>Scroll right</source>
+ <translation>Прокрутить вправо</translation>
+ </message>
+ <message>
+ <source>Scroll down</source>
+ <translation>Прокрутить вниз</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n file(s)</source>
+ <comment>number of chosen file</comment>
+ <translation>
+ <numerusform>%n файл(а)</numerusform>
+ <numerusform>%n файла</numerusform>
+ <numerusform>%n файлов</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>JavaScript Alert - %1</source>
+ <translation>JavaScript: Предупреждение - %1</translation>
+ </message>
+ <message>
+ <source>JavaScript Confirm - %1</source>
+ <translation>JavaScript: Подтверждение - %1</translation>
+ </message>
+ <message>
+ <source>JavaScript Prompt - %1</source>
+ <translation>JavaScript: Запрос - %1</translation>
+ </message>
+ <message>
+ <source>JavaScript Problem - %1</source>
+ <translation>JavaScript: Проблема - %1</translation>
+ </message>
+ <message>
+ <source>The script on this page appears to have a problem. Do you want to stop the script?</source>
+ <translation>Сбой выполнения сценария на данной странице. Желаете остановить выполение сценария?</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the next character</source>
+ <translation>Переместить указатель к следующему символу</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the previous character</source>
+ <translation>Переместить указатель к предыдущему символу</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the next word</source>
+ <translation>Переместить указатель к следующему слову</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the previous word</source>
+ <translation>Переместить указатель к предыдущему слову</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the next line</source>
+ <translation>Переместить указатель на следующую строку</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the previous line</source>
+ <translation>Переместить указатель на предыдущую строку</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the start of the line</source>
+ <translation>Переместить указатель в начало строки</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the end of the line</source>
+ <translation>Переместить указатель в конец строки</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the start of the block</source>
+ <translation>Переместить указатель в начало блока</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the end of the block</source>
+ <translation>Переместить указатель в конец блока</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the start of the document</source>
+ <translation>Переместить указатель в начало документа</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the end of the document</source>
+ <translation>Переместить указатель в конец документа</translation>
+ </message>
+ <message>
+ <source>Select all</source>
+ <translation>Выделить всё</translation>
+ </message>
+ <message>
+ <source>Select to the next character</source>
+ <translation>Выделить до следующего символа</translation>
+ </message>
+ <message>
+ <source>Select to the previous character</source>
+ <translation>Выделить до предыдущего символа</translation>
+ </message>
+ <message>
+ <source>Select to the next word</source>
+ <translation>Выделить до следующего слова</translation>
+ </message>
+ <message>
+ <source>Select to the previous word</source>
+ <translation>Выделить до предыдущего слова</translation>
+ </message>
+ <message>
+ <source>Select to the next line</source>
+ <translation>Выделить до следующей строки</translation>
+ </message>
+ <message>
+ <source>Select to the previous line</source>
+ <translation>Выделить до предыдущей строки</translation>
+ </message>
+ <message>
+ <source>Select to the start of the line</source>
+ <translation>Выделить до начала строки</translation>
+ </message>
+ <message>
+ <source>Select to the end of the line</source>
+ <translation>Выделить до конца строки</translation>
+ </message>
+ <message>
+ <source>Select to the start of the block</source>
+ <translation>Выделить до начала блока</translation>
+ </message>
+ <message>
+ <source>Select to the end of the block</source>
+ <translation>Выделить до конца блока</translation>
+ </message>
+ <message>
+ <source>Select to the start of the document</source>
+ <translation>Выделить до начала документа</translation>
+ </message>
+ <message>
+ <source>Select to the end of the document</source>
+ <translation>Выделить до конца документа</translation>
+ </message>
+ <message>
+ <source>Delete to the start of the word</source>
+ <translation>Удалить до начала слова</translation>
+ </message>
+ <message>
+ <source>Delete to the end of the word</source>
+ <translation>Удалить до конца слова</translation>
+ </message>
+ <message>
+ <source>Insert a new paragraph</source>
+ <translation>Вставить новый параграф</translation>
+ </message>
+ <message>
+ <source>Insert a new line</source>
+ <translation>Вставить новую строку</translation>
+ </message>
+ <message>
+ <source>Paste and Match Style</source>
+ <translation>Вставить, сохранив стиль</translation>
+ </message>
+ <message>
+ <source>Remove formatting</source>
+ <translation>Удалить форматирование</translation>
+ </message>
+ <message>
+ <source>Strikethrough</source>
+ <translation>Зачёркнутый</translation>
+ </message>
+ <message>
+ <source>Subscript</source>
+ <translation>Подстрочный</translation>
+ </message>
+ <message>
+ <source>Superscript</source>
+ <translation>Надстрочный</translation>
+ </message>
+ <message>
+ <source>Insert Bulleted List</source>
+ <translation>Вставить маркированный список</translation>
+ </message>
+ <message>
+ <source>Insert Numbered List</source>
+ <translation>Вставить нумерованный список</translation>
+ </message>
+ <message>
+ <source>Indent</source>
+ <translation>Увеличить отступ</translation>
+ </message>
+ <message>
+ <source>Outdent</source>
+ <translation>Уменьшить отступ</translation>
+ </message>
+ <message>
+ <source>Center</source>
+ <translation>По центру</translation>
+ </message>
+ <message>
+ <source>Justify</source>
+ <translation>По ширине</translation>
+ </message>
+ <message>
+ <source>Align Left</source>
+ <translation>По левому краю</translation>
+ </message>
+ <message>
+ <source>Align Right</source>
+ <translation>По правому краю</translation>
+ </message>
+ </context>
+ <context>
+ <name>QWhatsThisAction</name>
+ <message>
+ <source>What&apos;s This?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QWidget</name>
+ <message>
+ <source>*</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QWizard</name>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt; &amp;Back</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>
+ <message>
+ <source>Go Back</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Commit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Done</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Next &gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QWorkspace</name>
+ <message>
+ <source>&amp;Restore</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mi&amp;nimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ma&amp;ximize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Stay on &amp;Top</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>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sh&amp;ade</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 - [%2]</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Unshade</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QXml</name>
+ <message>
+ <source>no error occurred</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error triggered by consumer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>unexpected end of file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>more than one document type definition</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error occurred while parsing element</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>tag mismatch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error occurred while parsing content</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>unexpected character</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>invalid name for processing instruction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>version expected while reading the XML declaration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>wrong value for standalone declaration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error occurred while parsing document type definition</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>letter is expected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error occurred while parsing comment</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error occurred while parsing reference</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>internal general entity reference not allowed in DTD</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>external parsed general entity reference not allowed in attribute value</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>external parsed general entity reference not allowed in DTD</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>unparsed entity reference in wrong context</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>recursive entities</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error in the text declaration of an external entity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>encoding declaration or standalone declaration expected while reading the XML declaration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>standalone declaration expected while reading the XML declaration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QXmlPatternistCLI</name>
+ <message>
+ <source>Warning in %1, at line %2, column %3: %4</source>
+ <translation>Предупреждение в %1, в строке %2, столбце%3: %4</translation>
+ </message>
+ <message>
+ <source>Warning in %1: %2</source>
+ <translation>Предупреждение в %1: %2</translation>
+ </message>
+ <message>
+ <source>Unknown location</source>
+ <translation>Неизвестное местоположение</translation>
+ </message>
+ <message>
+ <source>Error %1 in %2, at line %3, column %4: %5</source>
+ <translation>Ошибка %1 в %2, в строке %3, столбце %4: %5</translation>
+ </message>
+ <message>
+ <source>Error %1 in %2: %3</source>
+ <translation>Ошибка %1 в %2: %3</translation>
+ </message>
+ </context>
+ <context>
+ <name>QXmlStream</name>
+ <message>
+ <source>Extra content at end of document.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid entity value.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid XML character.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sequence &apos;]]&gt;&apos; not allowed in content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Namespace prefix &apos;%1&apos; not declared</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute redefined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unexpected character &apos;%1&apos; in public id literal.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid XML version string.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsupported XML version.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 is an invalid encoding name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encoding %1 is unsupported</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Standalone accepts only yes or no.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid attribute in XML declaration.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Premature end of document.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid document.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Expected </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>, but got &apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unexpected &apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Expected character data.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Recursive entity detected.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start tag expected.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>XML declaration not at start of document.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>NDATA in parameter entity declaration.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 is an invalid processing instruction name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid processing instruction name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Illegal namespace declaration.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid XML name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opening and ending tag mismatch.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reference to unparsed entity &apos;%1&apos;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Entity &apos;%1&apos; not declared.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reference to external entity &apos;%1&apos; in attribute value.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid character reference.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encountered incorrectly encoded content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The standalone pseudo attribute must appear after the encoding.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 is an invalid PUBLIC identifier.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QtXmlPatterns</name>
+ <message>
+ <source>At least one component must be present.</source>
+ <translation>Должна присутствовать как минимум одна компонента.</translation>
+ </message>
+ <message>
+ <source>%1 is not a valid value of type %2.</source>
+ <translation>%1 не является правильным значением типа %2.</translation>
+ </message>
+ <message>
+ <source>When casting to %1 from %2, the source value cannot be %3.</source>
+ <translation>При преобразовании %2 в %1 исходное значение не может быть %3.</translation>
+ </message>
+ <message>
+ <source>Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values.</source>
+ <translation>Булево значение не может быть вычислено для последовательностей, которые содержат два и более атомарных значения.</translation>
+ </message>
+ <message>
+ <source>The data of a processing instruction cannot contain the string %1</source>
+ <translation>Данные обрабатываемой инструкции не могут содержать строку &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid %2</source>
+ <translation>%1 некоррекно для %2</translation>
+ </message>
+ <message>
+ <source>%1 is not a valid XML 1.0 character.</source>
+ <translation>Символ %1 недопустим для XML 1.0.</translation>
+ </message>
+ <message>
+ <source>%1 was called.</source>
+ <translation>%1 было вызвано.</translation>
+ </message>
+ <message>
+ <source>In the replacement string, %1 must be followed by at least one digit when not escaped.</source>
+ <translation>В замещаемой строке &apos;%1&apos; должно сопровождаться как минимум одной цифрой, если неэкранировано.</translation>
+ </message>
+ <message>
+ <source>In the replacement string, %1 can only be used to escape itself or %2, not %3</source>
+ <translation>В замещаемой строке символ &apos;%1&apos; может использоваться только для экранирования самого себя или &apos;%2&apos;, но не &apos;%3&apos;</translation>
+ </message>
+ <message>
+ <source>%1 matches newline characters</source>
+ <translation>%1 соответствует символам конца строки</translation>
+ </message>
+ <message>
+ <source>Matches are case insensitive</source>
+ <translation>Соответствия регистронезависимы</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid regular expression pattern: %2</source>
+ <translation>%1 - неверный шаблон регулярного выражения: %2</translation>
+ </message>
+ <message>
+ <source>It will not be possible to retrieve %1.</source>
+ <translation>Будет невозможно восстановить %1.</translation>
+ </message>
+ <message>
+ <source>The default collection is undefined</source>
+ <translation>Набор по умолчанию не определён</translation>
+ </message>
+ <message>
+ <source>%1 cannot be retrieved</source>
+ <translation>%1 не может быть восстановлен</translation>
+ </message>
+ <message>
+ <source>The item %1 did not match the required type %2.</source>
+ <translation>Элемент %1 не соответствует необходимому типу %2.</translation>
+ </message>
+ <message>
+ <source>%1 is an unknown schema type.</source>
+ <translation>%1 является схемой неизвестного типа.</translation>
+ </message>
+ <message>
+ <source>A template with name %1 has already been declared.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Only one %1 declaration can occur in the query prolog.</source>
+ <translation>Только одно объявление %1 может присутствовать в прологе запроса.</translation>
+ </message>
+ <message>
+ <source>The initialization of variable %1 depends on itself</source>
+ <translation>Инициализация переменной %1 зависит от себя самой</translation>
+ </message>
+ <message>
+ <source>The variable %1 is unused</source>
+ <translation>Переменная %1 не используется</translation>
+ </message>
+ <message>
+ <source>Version %1 is not supported. The supported XQuery version is 1.0.</source>
+ <translation>Версия %1 не поддерживается. Поддерживается XQuery версии 1.0.</translation>
+ </message>
+ <message>
+ <source>No function with signature %1 is available</source>
+ <translation>Функция с сигнатурой %1 отсутствует</translation>
+ </message>
+ <message>
+ <source>It is not possible to redeclare prefix %1.</source>
+ <translation>Невозможно переопределить префикс %1.</translation>
+ </message>
+ <message>
+ <source>Prefix %1 is already declared in the prolog.</source>
+ <translation>Префикс %1 уже объявлен в прологе.</translation>
+ </message>
+ <message>
+ <source>The name of an option must have a prefix. There is no default namespace for options.</source>
+ <translation>Название опции должно содержать префикс. Нет пространства имён по умолчанию для опций.</translation>
+ </message>
+ <message>
+ <source>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</source>
+ <translation>Возможность импорта схем не поддерживается, следовательно, объявлений %1 быть не должно.</translation>
+ </message>
+ <message>
+ <source>The target namespace of a %1 cannot be empty.</source>
+ <translation>Целевое пространство имён %1 не может быть пустым.</translation>
+ </message>
+ <message>
+ <source>The module import feature is not supported</source>
+ <translation>Возможность импорта модулей не поддерживается</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>Пространство имён пользовательской функции в модуле библиотеки должен соответствовать пространству имён модуля. Другими словами, он должен быть %1 вместо %2</translation>
+ </message>
+ <message>
+ <source>A function already exists with the signature %1.</source>
+ <translation>Функция с сигнатурой %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>Внешние функции не поддерживаются. Все поддерживаемые функции могут использоваться напрямую без первоначального объявления их в качестве внешних</translation>
+ </message>
+ <message>
+ <source>The %1-axis is unsupported in XQuery</source>
+ <translation>Ось %1 не поддерживается в XQuery</translation>
+ </message>
+ <message>
+ <source>The namespace URI cannot be the empty string when binding to a prefix, %1.</source>
+ <translation>URI пространства имён не может быть пустой строкой при связывании с префиксом %1.</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid namespace URI.</source>
+ <translation>%1 - неверный URI пространства имён.</translation>
+ </message>
+ <message>
+ <source>It is not possible to bind to the prefix %1</source>
+ <translation>Невозможно связать с префиксом %1</translation>
+ </message>
+ <message>
+ <source>Two namespace declaration attributes have the same name: %1.</source>
+ <translation>Два атрибута объявления пространств имён имеют одинаковое имя: %1.</translation>
+ </message>
+ <message>
+ <source>The namespace URI must be a constant and cannot use enclosed expressions.</source>
+ <translation>URI пространства имён должно быть константой и не может содержать выражений.</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 является объявлением атрибута вне области объявлений. Имейте в виду, возможность импорта схем не поддерживается.</translation>
+ </message>
+ <message>
+ <source>empty</source>
+ <translation>пусто</translation>
+ </message>
+ <message>
+ <source>zero or one</source>
+ <translation>нуль или один</translation>
+ </message>
+ <message>
+ <source>exactly one</source>
+ <translation>ровно один</translation>
+ </message>
+ <message>
+ <source>one or more</source>
+ <translation>один или более</translation>
+ </message>
+ <message>
+ <source>zero or more</source>
+ <translation>нуль или более</translation>
+ </message>
+ <message>
+ <source>The focus is undefined.</source>
+ <translation>Фокус не определён.</translation>
+ </message>
+ <message>
+ <source>An attribute by name %1 has already been created.</source>
+ <translation>Атрибут с именем %1 уже существует.</translation>
+ </message>
+ <message>
+ <source>Network timeout.</source>
+ <translation>Время ожидания сети истекло.</translation>
+ </message>
+ <message>
+ <source>Element %1 can&apos;t be serialized because it appears outside the document element.</source>
+ <translation>Элемент %1 не может быть сериализован, так как присутствует вне документа.</translation>
+ </message>
+ <message>
+ <source>Year %1 is invalid because it begins with %2.</source>
+ <translation>Год %1 неверен, так как начинается с %2.</translation>
+ </message>
+ <message>
+ <source>Day %1 is outside the range %2..%3.</source>
+ <translation>День %1 вне диапазона %2..%3.</translation>
+ </message>
+ <message>
+ <source>Month %1 is outside the range %2..%3.</source>
+ <translation>Месяц %1 вне диапазона %2..%3.</translation>
+ </message>
+ <message>
+ <source>Overflow: Can&apos;t represent date %1.</source>
+ <translation>Переполнение: Не удается представить дату %1.</translation>
+ </message>
+ <message>
+ <source>Day %1 is invalid for month %2.</source>
+ <translation>День %1 неверен для месяца %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>Время 24:%1:%2.%3 неверно. 24 часа, но минуты, секунды и/или миллисекунды отличны от 0; </translation>
+ </message>
+ <message>
+ <source>Time %1:%2:%3.%4 is invalid.</source>
+ <translation>Время %1:%2:%3.%4 неверно.</translation>
+ </message>
+ <message>
+ <source>Overflow: Date can&apos;t be represented.</source>
+ <translation>Переполнение: невозможно представить дату.</translation>
+ </message>
+ <message>
+ <source>At least one time component must appear after the %1-delimiter.</source>
+ <translation>Как минимум одна компонента времени должна следовать за разделителем &apos;%1&apos;.</translation>
+ </message>
+ <message>
+ <source>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</source>
+ <translation>Деление числа типа %1 на %2 (не числовое выражение) недопустимо.</translation>
+ </message>
+ <message>
+ <source>Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed.</source>
+ <translation>Деление числа типа %1 на %2 или %3 (плюс или минус нуль) недопустимо.</translation>
+ </message>
+ <message>
+ <source>Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed.</source>
+ <translation>Умножение числа типа %1 на %2 или %3 (плюс-минус бесконечность) недопустимо.</translation>
+ </message>
+ <message>
+ <source>A value of type %1 cannot have an Effective Boolean Value.</source>
+ <translation>Значение типа %1 не может быть булевым значением.</translation>
+ </message>
+ <message>
+ <source>Value %1 of type %2 exceeds maximum (%3).</source>
+ <translation>Значение %1 типа %2 больше максимума (%3).</translation>
+ </message>
+ <message>
+ <source>Value %1 of type %2 is below minimum (%3).</source>
+ <translation>Значение %1 типа %2 меньше минимума (%3).</translation>
+ </message>
+ <message>
+ <source>A value of type %1 must contain an even number of digits. The value %2 does not.</source>
+ <translation>Значение типа %1 должно содержать четное количество цифр. Значение %2 этому требованию не удовлетворяет.</translation>
+ </message>
+ <message>
+ <source>%1 is not valid as a value of type %2.</source>
+ <translation>Значение %1 некорректно для типа %2.</translation>
+ </message>
+ <message>
+ <source>Operator %1 cannot be used on type %2.</source>
+ <translation>Оператор %1 не может использоваться для типа %2.</translation>
+ </message>
+ <message>
+ <source>Operator %1 cannot be used on atomic values of type %2 and %3.</source>
+ <translation>Оператор %1 не может использоваться для атомарных значений типов %2 и %3.</translation>
+ </message>
+ <message>
+ <source>The namespace URI in the name for a computed attribute cannot be %1.</source>
+ <translation>URI пространства имён в названии рассчитываемого атрибута не может быть %1.</translation>
+ </message>
+ <message>
+ <source>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</source>
+ <translation>Название расчитываемого атрибута не может иметь URI пространства имён %1 с локальным именем %2.</translation>
+ </message>
+ <message>
+ <source>Type error in cast, expected %1, received %2.</source>
+ <translation>Ошибка типов в преобразовании, ожидалось %1, получено %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>При преобразовании в %1 или производные от него типы исходное значение должно быть того же типа или строковым литералом. Тип %2 недопустим.</translation>
+ </message>
+ <message>
+ <source>A comment cannot contain %1</source>
+ <translation>Комментарий не может содержать %1</translation>
+ </message>
+ <message>
+ <source>A comment cannot end with a %1.</source>
+ <translation>Комментарий не может оканчиваться на %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>Узел-атрибут не может быть потомком узла-документа. Атрибут %1 неуместен.</translation>
+ </message>
+ <message>
+ <source>A library module cannot be evaluated directly. It must be imported from a main module.</source>
+ <translation>Модуль библиотеки не может использоваться напрямую. Он должен быть импортирован из основного модуля.</translation>
+ </message>
+ <message>
+ <source>No template by name %1 exists.</source>
+ <translation>Шаблон с именем %1 отсутствует.</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>Значение типа %1 не может быть условием. Условием могут являться числовой и булевый типы.</translation>
+ </message>
+ <message>
+ <source>A positional predicate must evaluate to a single numeric value.</source>
+ <translation>Позиционный предикат должен вычисляться как числовое выражение.</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>Целевое имя в обрабатываемой инструкции не может быть %1 в любой комбинации нижнего и верхнего регистров. Имя %2 некорректно.</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 некорректное целевое имя в обрабатываемой инструкции. Имя должно быть значением типа %2, например: %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>Последняя часть пути должна содержать узлы или атомарные значения, но не может содержать и то, и другое одновременно.</translation>
+ </message>
+ <message>
+ <source>No namespace binding exists for the prefix %1</source>
+ <translation>Отсутствует привязка к пространству имён для префикса %1</translation>
+ </message>
+ <message>
+ <source>No namespace binding exists for the prefix %1 in %2</source>
+ <translation>Отсутствует привязка к пространству имён для префикса %1 в %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>Первый аргумент %1 не может быть типа %2. Он должен быть числового типа, типа xs:yearMonthDuration или типа 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>Первый аргумент %1 не может быть типа %2. Он должен быть типа %3, %4 или %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>Второй аргумент %1 не может быть типа %2. Он должен быть типа %3, %4 или %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>Если оба значения имеют региональные смещения, смещения должны быть одинаковы. %1 и %2 не одинаковы.</translation>
+ </message>
+ <message>
+ <source>%1 must be followed by %2 or %3, not at the end of the replacement string.</source>
+ <translation>&apos;%1&apos; должно сопровождаться &apos;%2&apos; или &apos;%3&apos;, но не в конце замещаемой строки.</translation>
+ </message>
+ <message>
+ <source>%1 and %2 match the start and end of a line.</source>
+ <translation>%1 и %2 соответствуют началу и концу строки.</translation>
+ </message>
+ <message>
+ <source>Whitespace characters are removed, except when they appear in character classes</source>
+ <translation>Символы пробелов удалены, за исключением тех, что были в классах символов</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid flag for regular expressions. Valid flags are:</source>
+ <translation>%1 - неверный флаг для регулярного выражения. Допустимые флаги:</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>Префикс не должен быть указан, если первый параметр - пустая последовательность или пустая строка (вне пространства имён). Был указан префикс %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>Форма нормализации %1 не поддерживается. Поддерживаются только %2, %3, %4, %5 и пустая, т.е. пустая строка (без нормализации).</translation>
+ </message>
+ <message>
+ <source>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</source>
+ <translation>Региональное смещение должно быть в переделах от %1 до %2 включительно. %3 выходит за допустимые пределы.</translation>
+ </message>
+ <message>
+ <source>Required cardinality is %1; got cardinality %2.</source>
+ <translation>Необходимо %1 элементов, получено %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>Кодировка %1 неверна. Имя кодировки должно содержать только символы латиницы без пробелов и должно удовлетворять регулярному выражению %2.</translation>
+ </message>
+ <message>
+ <source>The keyword %1 cannot occur with any other mode name.</source>
+ <translation>Ключевое слово %1 не может встречаться с любым другим названием режима.</translation>
+ </message>
+ <message>
+ <source>No variable with name %1 exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The value of attribute %1 must be of type %2, which %3 isn&apos;t.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The prefix %1 cannot be bound. By default, it is already bound to the namespace %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A variable with name %1 has already been declared.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No value is available for the external variable with name %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A stylesheet function must have a prefixed name.</source>
+ <translation>Функция стилей должна иметь имя с префиксом.</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>Пространтсво имён %1 зарезервировано, поэтому пользовательские функции не могут его использовать. Попробуйте предопределённый префикс %2, который существует для подобных ситуаций.</translation>
+ </message>
+ <message>
+ <source>An argument with name %1 has already been declared. Every argument name must be unique.</source>
+ <translation type="unfinished"></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>Если функция %1 используется для сравнения внутри шаблона, аргумент должен быть ссылкой на переменную или строковым литералом.</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>В шаблоне XSL-T первый аргумент функции %1 должен быть строковым литералом, если функция используется для сравнения.</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>В шаблоне XSL-T первый аргумент функции %1 должен быть литералом или ссылкой на переменную, если функция используется для сравнения.</translation>
+ </message>
+ <message>
+ <source>In an XSL-T pattern, function %1 cannot have a third argument.</source>
+ <translation>В шаблоне XSL-T у функции %1 не должно быть третьего аргумента.</translation>
+ </message>
+ <message>
+ <source>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</source>
+ <translation>В шаблоне XSL-T только функции %1 и %2 могут использоваться для сравнения, но не %3.</translation>
+ </message>
+ <message>
+ <source>In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can.</source>
+ <translation>В шаблоне XSL-T не может быть использована ось %1 - только оси %2 или %3.</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid template mode name.</source>
+ <translation>%1 является неверным шаблоном имени режима.</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>Имя переменной, связанной с выражением for, должно отличаться от позиционной переменной. Две переменные с именем %1 конфликтуют.</translation>
+ </message>
+ <message>
+ <source>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</source>
+ <translation>Возможность проверки по схеме не поддерживается. Выражения %1 не могут использоваться.</translation>
+ </message>
+ <message>
+ <source>None of the pragma expressions are supported. Therefore, a fallback expression must be present</source>
+ <translation>Ни одно из выражений pragma не поддерживается. Должно существовать запасное выражение</translation>
+ </message>
+ <message>
+ <source>Each name of a template parameter must be unique; %1 is duplicated.</source>
+ <translation>Имя каждого параметра шаблона должно быть уникальным, но %1 повторяется.</translation>
+ </message>
+ <message>
+ <source>No function with name %1 is available.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 is not a valid numeric literal.</source>
+ <translation>%1 является неверным числовым литералом.</translation>
+ </message>
+ <message>
+ <source>W3C XML Schema identity constraint selector</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>W3C XML Schema identity constraint field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A construct was encountered which is disallowed in the current language(%1).</source>
+ <translation>Встречена конструкция, запрещённая для текущего языка (%1).</translation>
+ </message>
+ <message>
+ <source>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
+ <translation>Пространство имён %1 может быть связано только с %2 (в данном случае уже предопределено).</translation>
+ </message>
+ <message>
+ <source>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
+ <translation>Префикс %1 может быть связан только с %2 (в данном случае уже предопределено).</translation>
+ </message>
+ <message>
+ <source>An attribute with name %1 has already appeared on this element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A direct element constructor is not well-formed. %1 is ended with %2.</source>
+ <translation>Прямой конструктор элемента составлен некорректно. %1 заканчивается на %2.</translation>
+ </message>
+ <message>
+ <source>The name %1 does not refer to any schema type.</source>
+ <translation>Название %1 не соответствует ни одному типу схемы.</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 - сложный тип. Преобразование к сложным типам невозможно. Однако, преобразование к атомарным типам как %2 работает.</translation>
+ </message>
+ <message>
+ <source>%1 is not an atomic type. Casting is only possible to atomic types.</source>
+ <translation>%1 - не атомарный тип. Преобразование возможно только к атомарным типам.</translation>
+ </message>
+ <message>
+ <source>%1 is not a valid name for a processing-instruction.</source>
+ <translation>%1 является неверным названием для инструкции обработки.</translation>
+ </message>
+ <message>
+ <source>The name of an extension expression must be in a namespace.</source>
+ <translation>Название выражения расширения должно быть в пространстве имён.</translation>
+ </message>
+ <message>
+ <source>Required type is %1, but %2 was found.</source>
+ <translation>Требуется тип %1, но обнаружен %2.</translation>
+ </message>
+ <message>
+ <source>Promoting %1 to %2 may cause loss of precision.</source>
+ <translation>Преобразование %1 к %2 может снизить точность.</translation>
+ </message>
+ <message>
+ <source>It&apos;s not possible to add attributes after any other kind of node.</source>
+ <translation>Невозможно добавлять атрибуты после любого другого вида узла.</translation>
+ </message>
+ <message>
+ <source>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</source>
+ <translation>Поддерживается только Unicode Codepoint Collation (%1). %2 не поддерживается.</translation>
+ </message>
+ <message>
+ <source>Integer division (%1) by zero (%2) is undefined.</source>
+ <translation>Целочисленное деление (%1) на нуль (%2) не определено.</translation>
+ </message>
+ <message>
+ <source>Division (%1) by zero (%2) is undefined.</source>
+ <translation>Деление (%1) на нуль (%2) не определено.</translation>
+ </message>
+ <message>
+ <source>Modulus division (%1) by zero (%2) is undefined.</source>
+ <translation>Деление по модулю (%1) на нуль (%2) не определено.</translation>
+ </message>
+ <message numerus="yes">
+ <source>%1 takes at most %n argument(s). %2 is therefore invalid.</source>
+ <translation>
+ <numerusform>%1 принимает не более %n аргумента. Следовательно, %2 неверно.</numerusform>
+ <numerusform>%1 принимает не более %n аргументов. Следовательно, %2 неверно.</numerusform>
+ <numerusform>%1 принимает не более %n аргументов. Следовательно, %2 неверно.</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%1 requires at least %n argument(s). %2 is therefore invalid.</source>
+ <translation>
+ <numerusform>%1 принимает не менее %n аргумента. Следовательно, %2 неверно.</numerusform>
+ <numerusform>%1 принимает не менее %n аргументов. Следовательно, %2 неверно.</numerusform>
+ <numerusform>%1 принимает не менее %n аргументов. Следовательно, %2 неверно.</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>Корневой узел второго аргумента функции %1 должен быть документом. %2 не является документом.</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>Пространство имён для пользовательских функций не может быть пустым (попробуйте предопределённый префикс %1, который существует для подобных ситуаций)</translation>
+ </message>
+ <message>
+ <source>A default namespace declaration must occur before function, variable, and option declarations.</source>
+ <translation>Объявление пространство имён по умолчанию должно быть до объявления функций, переменных и опций.</translation>
+ </message>
+ <message>
+ <source>Namespace declarations must occur before function, variable, and option declarations.</source>
+ <translation>Объявление пространства имён должно быть до объявления функций, переменных и опций.</translation>
+ </message>
+ <message>
+ <source>Module imports must occur before function, variable, and option declarations.</source>
+ <translation>Импортируемые модули должны быть указаны до объявления функций, переменных и опций.</translation>
+ </message>
+ <message>
+ <source>%1 is not a whole number of minutes.</source>
+ <translation>%1 не является полным количеством минут.</translation>
+ </message>
+ <message>
+ <source>Attribute %1 can&apos;t be serialized because it appears at the top level.</source>
+ <translation>Атрибут %1 не может быть сериализован, так как присутствует на верхнем уровне.</translation>
+ </message>
+ <message>
+ <source>%1 is an unsupported encoding.</source>
+ <translation>Кодировка %1 не поддерживается.</translation>
+ </message>
+ <message>
+ <source>%1 contains octets which are disallowed in the requested encoding %2.</source>
+ <translation>%1 содержит октеты, которые недопустимы в требуемой кодировке %2.</translation>
+ </message>
+ <message>
+ <source>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</source>
+ <translation>Символ с кодом %1, присутствующий в %2 при использовании кодировки %3, не является допустимым символом XML.</translation>
+ </message>
+ <message>
+ <source>Ambiguous rule match.</source>
+ <translation>Неоднозначное соответствие правилу.</translation>
+ </message>
+ <message>
+ <source>In a namespace constructor, the value for a namespace cannot be an empty string.</source>
+ <translation>В конструкторе пространства имён значение пространства имён не может быть пустой строкой.</translation>
+ </message>
+ <message>
+ <source>The prefix must be a valid %1, which %2 is not.</source>
+ <translation>Префикс должен быть корректным %1, но %2 им не является.</translation>
+ </message>
+ <message>
+ <source>The prefix %1 cannot be bound.</source>
+ <translation>Префикс%1 не может быть связан.</translation>
+ </message>
+ <message>
+ <source>Only the prefix %1 can be bound to %2 and vice versa.</source>
+ <translation>Только префикс %1 может быть связан с %2 и наоборот.</translation>
+ </message>
+ <message>
+ <source>The parameter %1 is required, but no corresponding %2 is supplied.</source>
+ <translation>Необходим параметр %1 , но соответствующего %2 не передано.</translation>
+ </message>
+ <message>
+ <source>The parameter %1 is passed, but no corresponding %2 exists.</source>
+ <translation>Передан параметр %1 , но соответствующего %2 не существует.</translation>
+ </message>
+ <message>
+ <source>The URI cannot have a fragment</source>
+ <translation>URI не может содержать фрагмент</translation>
+ </message>
+ <message>
+ <source>Element %1 is not allowed at this location.</source>
+ <translation>Элемент %1 недопустим в этом месте.</translation>
+ </message>
+ <message>
+ <source>Text nodes are not allowed at this location.</source>
+ <translation>Текстовые узлы недопустимы в этом месте.</translation>
+ </message>
+ <message>
+ <source>Parse error: %1</source>
+ <translation>Ошибка разбора: %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>Значение атрибута версии XSL-T должно быть типа %1, но %2 им не является.</translation>
+ </message>
+ <message>
+ <source>Running an XSL-T 1.0 stylesheet with a 2.0 processor.</source>
+ <translation>Выполняется таблица стилей XSL-T 1.0 с обработчиком версии 2.0.</translation>
+ </message>
+ <message>
+ <source>Unknown XSL-T attribute %1.</source>
+ <translation>Неизвествный атрибут XSL-T %1.</translation>
+ </message>
+ <message>
+ <source>Attribute %1 and %2 are mutually exclusive.</source>
+ <translation>Атрибуты %1 и %2 взаимоисключающие.</translation>
+ </message>
+ <message>
+ <source>In a simplified stylesheet module, attribute %1 must be present.</source>
+ <translation>В модуле упрощённой таблицы стилей обязан присутствовать атрибут %1.</translation>
+ </message>
+ <message>
+ <source>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</source>
+ <translation>Если элемент %1 не имеет атрибут %2, у него не может быть атрибутов %3 и %4.</translation>
+ </message>
+ <message>
+ <source>Element %1 must have at least one of the attributes %2 or %3.</source>
+ <translation>Элемент %1 должен иметь как минимум один из атрибутов %2 или %3.</translation>
+ </message>
+ <message>
+ <source>At least one mode must be specified in the %1-attribute on element %2.</source>
+ <translation>Как минимум один режим должен быть указан в атрибуте %1 элемента %2.</translation>
+ </message>
+ <message>
+ <source>Element %1 must come last.</source>
+ <translation>Элемент %1 должен идти последним.</translation>
+ </message>
+ <message>
+ <source>At least one %1-element must occur before %2.</source>
+ <translation>Как минимум один элемент %1 должен быть перед %2.</translation>
+ </message>
+ <message>
+ <source>Only one %1-element can appear.</source>
+ <translation>Должен быть только один элемент %1.</translation>
+ </message>
+ <message>
+ <source>At least one %1-element must occur inside %2.</source>
+ <translation>Как минимум один элемент %1 должен быть внутри %2.</translation>
+ </message>
+ <message>
+ <source>When attribute %1 is present on %2, a sequence constructor cannot be used.</source>
+ <translation>Если %2 содержит атрибут %1, конструктор последовательности не может быть использован.</translation>
+ </message>
+ <message>
+ <source>Element %1 must have either a %2-attribute or a sequence constructor.</source>
+ <translation>Элемент %1 должен иметь атрибут %2 или конструктор последовательности.</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>Если параметр необходим, значение по умолчание не может быть передано через атрибут %1 или конструктор последовательности.</translation>
+ </message>
+ <message>
+ <source>Element %1 cannot have children.</source>
+ <translation>У элемента %1 не может быть потомков.</translation>
+ </message>
+ <message>
+ <source>Element %1 cannot have a sequence constructor.</source>
+ <translation>У элемента %1 не может быть конструктора последовательности.</translation>
+ </message>
+ <message>
+ <source>The attribute %1 cannot appear on %2, when it is a child of %3.</source>
+ <translation>У %2 не может быть атрибута %1, когда он является потомком %3.</translation>
+ </message>
+ <message>
+ <source>A parameter in a function cannot be declared to be a tunnel.</source>
+ <translation>Параметр в функции не может быть объявлен туннелем.</translation>
+ </message>
+ <message>
+ <source>This processor is not Schema-aware and therefore %1 cannot be used.</source>
+ <translation>Данный обработчик не работает со схемами, следовательно, %1 не может использоваться.</translation>
+ </message>
+ <message>
+ <source>Top level stylesheet elements must be in a non-null namespace, which %1 isn&apos;t.</source>
+ <translation>Элементы верхнего уровня таблицы стилей должны быть в пространстве имен, которым %1 не является.</translation>
+ </message>
+ <message>
+ <source>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</source>
+ <translation>Значение атрибута %1 элемента %2 должно быть или %3, или %4, но не %5.</translation>
+ </message>
+ <message>
+ <source>Attribute %1 cannot have the value %2.</source>
+ <translation>Атрибут %1 не может принимать значение %2.</translation>
+ </message>
+ <message>
+ <source>The attribute %1 can only appear on the first %2 element.</source>
+ <translation>Атрибут %1 может быть только у первого элемента %2.</translation>
+ </message>
+ <message>
+ <source>At least one %1 element must appear as child of %2.</source>
+ <translation>Как минимум один элемент %1 должен быть в %2.</translation>
+ </message>
+ <message>
+ <source>%1 has inheritance loop in its base type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Circular inheritance of base type %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Circular inheritance of union %1.</source>
+ <translation type="unfinished"></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"></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"></translation>
+ </message>
+ <message>
+ <source>Base type of simple type %1 cannot be complex type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type %1 cannot have direct base type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type %1 is not allowed to have base type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type %1 can only have simple atomic type as base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type %1 cannot derive from %2 as the latter defines restriction as final.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Variety of item type of %1 must be either atomic or union.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Variety of member types of %1 must be atomic.</source>
+ <translation type="unfinished"></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"></translation>
+ </message>
+ <message>
+ <source>Simple type %1 is only allowed to have %2 facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base type of simple type %1 must have variety of type list.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base type of simple type %1 has defined derivation by restriction as final.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Item type of base type does not match item type of %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type %1 contains not allowed facet type %2.</source>
+ <translation type="unfinished"></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"></translation>
+ </message>
+ <message>
+ <source>%1 is not allowed to have any facets.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base type %1 of simple type %2 must have variety of union.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base type %1 of simple type %2 is not allowed to have restriction in %3 attribute.</source>
+ <translation type="unfinished"></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"></translation>
+ </message>
+ <message>
+ <source>Derivation method of %1 must be extension because the base type %2 is a simple type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 has duplicated element %2 in its content model.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 has non-deterministic content.</source>
+ <translation type="unfinished"></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"></translation>
+ </message>
+ <message>
+ <source>Content model of complex type %1 is not a valid extension of content model of %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 must have simple content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 must have the same simple type as its base class %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 cannot be derived from base type %2%3.</source>
+ <translation type="unfinished"></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"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 with simple content cannot be derived from complex base type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Item type of simple type %1 cannot be a complex type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Member type of simple type %1 cannot be a complex type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 is not allowed to have a member type with the same name as itself.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet collides with %2 facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must have the same value as %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be equal or greater than %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be less than or equal to %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet contains invalid regular expression</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unknown notation %1 used in %2 facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet contains invalid value %2: %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet cannot be %2 or %3 if %4 facet of base type is %5.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet cannot be %2 if %3 facet of base type is %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be less than or equal to %2 facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be less than %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet and %2 facet cannot appear together.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be greater than %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be less than %2 facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be greater than or equal to %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type contains not allowed facet %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1, %2, %3, %4, %5 and %6 facets are not allowed when derived by list.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Only %1 and %2 facets are allowed when derived by union.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 contains %2 facet with invalid data: %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute group %1 contains attribute %2 twice.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute group %1 contains two different attributes that both have types derived from %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute group %1 contains attribute %2 that has value constraint but type that inherits from %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 contains attribute %2 twice.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 contains two different attributes that both have types derived from %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 contains attribute %2 that has value constraint but type that inherits from %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is not allowed to have a value constraint if its base type is complex.</source>
+ <translation type="unfinished"></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"></translation>
+ </message>
+ <message>
+ <source>Value constraint of element %1 is not of elements type: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is not allowed to have substitution group affiliation as it is no global element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type of element %1 cannot be derived from type of substitution group affiliation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Value constraint of attribute %1 is not of attributes type: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 has value constraint but has type derived from %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute in derived complex type must be %2 like in base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 in derived complex type must have %2 value constraint like in base type.</source>
+ <translation type="unfinished"></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>
+ </message>
+ <message>
+ <source>Attribute %1 in derived complex type must have %2 value constraint.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>processContent of base wildcard must be weaker than derived wildcard.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 exists twice with different types.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Particle contains non-deterministic wildcards.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base attribute %1 is required but derived attribute is not.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type of derived attribute %1 cannot be validly derived from type of base attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Value constraint of derived attribute %1 does not match value constraint of base attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived attribute %1 does not exist in the base definition.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived attribute %1 does not match the wildcard in the base definition.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base attribute %1 is required but missing in derived definition.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived definition contains an %1 element that does not exists in the base definition</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived wildcard is not a subset of the base wildcard.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 of derived wildcard is not a valid restriction of %2 of base wildcard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 from base type is missing in derived type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type of derived attribute %1 differs from type of base attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base definition contains an %1 element that is missing in the derived definition</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 references unknown %2 or %3 element %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 references identity constraint %2 that is no %3 or %4 element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 has a different number of fields from the identity constraint %2 that it references.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base type %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Item type %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Member type %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base type %1 of complex type cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 cannot have complex base type that has a %2.</source>
+ <translation type="unfinished"></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>
+ </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>
+ </message>
+ <message>
+ <source>Type of %1 element must be a simple type, %2 is not.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Substitution group %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Substitution group %1 has circular definition.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duplicated element names %1 in %2 element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reference %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Circular group reference for %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element is not allowed in this scope</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element cannot have %2 attribute with value other than %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element cannot have %2 attribute with value other than %3 or %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 or %2 attribute of reference %3 does not match with the attribute declaration %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute group %1 has circular reference.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute in %2 must have %3 use like in base type %4.</source>
+ <translation type="unfinished"></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>
+ </message>
+ <message>
+ <source>%1 has attribute wildcard but its base type %2 has not.</source>
+ <translation type="unfinished"></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>
+ </message>
+ <message>
+ <source>Enumeration facet contains invalid content: {%1} is not a value of type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Namespace prefix of qualified name %1 is not defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element %2 is not a valid restriction of the %3 element it redefines: %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Empty particle cannot be derived from non-empty particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived particle is missing element %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived element %1 is missing value constraint as defined in base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived element %1 has weaker value constraint than base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fixed value constraint of element %1 differs from value constraint in base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived element %1 cannot be nillable as base element is not nillable.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Block constraints of derived element %1 must not be more weaker than in the base element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type of derived element %1 cannot be validly derived from base element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type of derived element %1 cannot be validly derived from base element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is missing in derived particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 does not match namespace constraint of wildcard in base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wildcard in derived particle is not a valid subset of wildcard in base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>processContent of wildcard in derived particle is weaker than wildcard in base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived particle allows content that is not allowed in the base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Can not process unknown element %1, expected elements are: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is not allowed in this scope, possible elements are: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Child element is missing in that scope, possible child elements are: %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Document is not a XML schema.</source>
+ <translation type="unfinished"></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>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element contains invalid content: {%3}.</source>
+ <translation type="unfinished"></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>
+ </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>
+ </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>
+ </message>
+ <message>
+ <source>%1 element without %2 attribute is not allowed inside schema without target namespace.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element is not allowed inside %2 element if %3 attribute is present.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element has neither %2 attribute nor %3 child element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element with %2 child element must not have a %3 attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must be %3 or %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must have a value of %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must have a value of %3 or %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element must not have %2 and %3 attribute together.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Content of %1 attribute of %2 element must not be from namespace %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must not be %3.</source>
+ <translation type="unfinished"></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>
+ </message>
+ <message>
+ <source>Specifying use=&apos;prohibited&apos; inside an attribute group has no effect.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element must have either %2 or %3 attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element must have either %2 attribute or %3 or %4 as child element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element requires either %2 or %3 attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Text or entity references not allowed inside %1 element</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must contain %3, %4 or a list of URIs.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element is not allowed in this context.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element has larger value than %3 attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Prefix of qualified name %1 is not defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must either contain %3 or the other values.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Component with ID %1 has been defined previously.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute group %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element group %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Notation %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Identity constraint %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duplicated facets in simple type %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 is not valid according to %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>String content does not match the length facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>String content does not match the minLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>String content does not match the maxLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>String content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>String content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match the maxInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match the maxExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match the minInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match the minExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match in the totalDigits facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match the maxInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match the maxExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match the minInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match the minExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match in the totalDigits facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Double content does not match the maxInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Double content does not match the maxExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Double content does not match the minInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Double content does not match the minExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Double content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Double content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Decimal content does not match in the fractionDigits facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Decimal content does not match in the totalDigits facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Date time content does not match the maxInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Date time content does not match the maxExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Date time content does not match the minInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Date time content does not match the minExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Date time content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Date time content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duration content does not match the maxInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duration content does not match the maxExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duration content does not match the minInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duration content does not match the minExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duration content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duration content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Boolean content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Binary content does not match the length facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Binary content does not match the minLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Binary content does not match the maxLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Binary content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid QName content: %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>QName content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>QName content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Notation content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List content does not match length facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List content does not match minLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List content does not match maxLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Union content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Union content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Data of type %1 are not allowed to be empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is missing child element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>There is one IDREF value with no corresponding ID: %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Loaded schema file is invalid.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 contains invalid data.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xsi:schemaLocation namespace %1 has already appeared earlier in the instance document.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xsi:noNamespaceSchemaLocation cannot appear after the first no-namespace element or attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No schema defined for validation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No definition for element %1 available.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Specified type %1 is not known to the schema.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is not defined in this scope.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Declaration for element %1 does not exist.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains invalid content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is declared as abstract.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is not nillable.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 contains invalid data: %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element contains content although it is nillable.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fixed value constraint not allowed if element is nillable.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 cannot contain other elements, as it has a fixed content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Specified type %1 is not validly substitutable with element type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 is not allowed to be abstract.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains not allowed attributes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains not allowed child element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Content of element %1 does not match its type definition: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Content of element %1 does not match defined value constraint.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains not allowed child content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains not allowed text content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is missing required attribute %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 does not match the attribute wildcard.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Declaration for attribute %1 does not exist.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains two attributes of type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 contains invalid content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains unknown attribute %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Content of attribute %1 does not match its type definition: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Content of attribute %1 does not match defined value constraint.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Non-unique value found for constraint %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Key constraint %1 contains absent fields.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Key constraint %1 contains references nillable element %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No referenced value found for key reference %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>More than one value found for field %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Field %1 has no simple type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID value &apos;%1&apos; is not unique.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&apos;%1&apos; attribute contains invalid QName content: %2.</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
new file mode 100644
index 0000000..13797d5
--- /dev/null
+++ b/config.profiles/symbian/translations/qt_ur.ts
@@ -0,0 +1,8507 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!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>
+</TS>
diff --git a/config.profiles/symbian/translations/qt_zh_cn_symbian.ts b/config.profiles/symbian/translations/qt_zh_cn_symbian.ts
new file mode 100644
index 0000000..b1b9941
--- /dev/null
+++ b/config.profiles/symbian/translations/qt_zh_cn_symbian.ts
@@ -0,0 +1,8517 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE TS>
+
+<TS version="2.0" language="zh_cn">
+ <context>
+ <name>CloseButton</name>
+ <message>
+ <source>Close Tab</source>
+ <translation>关闭标签页</translation>
+ </message>
+ </context>
+ <context>
+ <name>FakeReply</name>
+ <message>
+ <source>Fake error !</source>
+ <translation>虚假错误!</translation>
+ </message>
+ <message>
+ <source>Invalid URL</source>
+ <translation>无效URL</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::</name>
+ <message>
+ <source>Notifications</source>
+ <translation>通知</translation>
+ </message>
+ <message>
+ <source>Music</source>
+ <translation>音乐</translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation>视频</translation>
+ </message>
+ <message>
+ <source>Communication</source>
+ <translation>通讯</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation>游戏</translation>
+ </message>
+ <message>
+ <source>Accessibility</source>
+ <translation>无障碍环境</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>&lt;html&gt;音频播放设备&lt;b&gt;%1&lt;/b&gt;不工作。&lt;br/&gt;无法返回到&lt;b&gt;%2&lt;/b&gt;。&lt;/html&gt;</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>&lt;html&gt;切换到刚刚可用且较为&lt;br/&gt;偏爱的音频播放设备&lt;b&gt;%1&lt;/b&gt;。&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>Revert back to device &apos;%1&apos;</source>
+ <translation>回复到设备&quot;%1&quot;</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>警告:看起来,您没有安装 gstreamer0.10-plugins-good 包。
+ 一些视频特性已经被关闭。</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>警告:看起来,您没有安装基础的 GStreamer 插件。
+ 所有的音频和视频支持都已经被关闭。</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>缺少一个需要的解码器。您需要安装如下解码器来播放这个内容:%0</translation>
+ </message>
+ <message>
+ <source>Could not open media source.</source>
+ <translation>不能打开媒体源。</translation>
+ </message>
+ <message>
+ <source>Invalid source type.</source>
+ <translation>无效的源类型。</translation>
+ </message>
+ <message>
+ <source>Could not locate media source.</source>
+ <translation>不能定位媒体源。</translation>
+ </message>
+ <message>
+ <source>Could not open audio device. The device is already in use.</source>
+ <translation>不能打开音频设备。这个设备正在被使用。</translation>
+ </message>
+ <message>
+ <source>Could not decode media source.</source>
+ <translation>不能解码媒体源。</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF</name>
+ <message>
+ <source>Audio Output</source>
+ <translation>音频输出</translation>
+ </message>
+ <message>
+ <source>The audio output device</source>
+ <translation>音频输出设备</translation>
+ </message>
+ <message>
+ <source>No error</source>
+ <translation>无错误</translation>
+ </message>
+ <message>
+ <source>Not found</source>
+ <translation>未找到</translation>
+ </message>
+ <message>
+ <source>Out of memory</source>
+ <translation>存储不足</translation>
+ </message>
+ <message>
+ <source>Not supported</source>
+ <translation>不支持</translation>
+ </message>
+ <message>
+ <source>Overflow</source>
+ <translation>溢出</translation>
+ </message>
+ <message>
+ <source>Underflow</source>
+ <translation>下溢</translation>
+ </message>
+ <message>
+ <source>Already exists</source>
+ <translation>已经存在</translation>
+ </message>
+ <message>
+ <source>Path not found</source>
+ <translation>未找到路径</translation>
+ </message>
+ <message>
+ <source>In use</source>
+ <translation>在使用中</translation>
+ </message>
+ <message>
+ <source>Not ready</source>
+ <translation>未就绪</translation>
+ </message>
+ <message>
+ <source>Access denied</source>
+ <translation>访问被拒绝</translation>
+ </message>
+ <message>
+ <source>Could not connect</source>
+ <translation>无法连接</translation>
+ </message>
+ <message>
+ <source>Disconnected</source>
+ <translation>已断开连接</translation>
+ </message>
+ <message>
+ <source>Permission denied</source>
+ <translation>权限被拒绝</translation>
+ </message>
+ <message>
+ <source>Insufficient bandwidth</source>
+ <translation>带宽不足</translation>
+ </message>
+ <message>
+ <source>Network unavailable</source>
+ <translation>网络不可用</translation>
+ </message>
+ <message>
+ <source>Network communication error</source>
+ <translation>网络通讯错误</translation>
+ </message>
+ <message>
+ <source>Streaming not supported</source>
+ <translation>不支持流</translation>
+ </message>
+ <message>
+ <source>Server alert</source>
+ <translation>服务器提示</translation>
+ </message>
+ <message>
+ <source>Invalid protocol</source>
+ <translation>无效协议</translation>
+ </message>
+ <message>
+ <source>Invalid URL</source>
+ <translation>无效URL</translation>
+ </message>
+ <message>
+ <source>Multicast error</source>
+ <translation>组播错误</translation>
+ </message>
+ <message>
+ <source>Proxy server error</source>
+ <translation>代理服务器错误</translation>
+ </message>
+ <message>
+ <source>Proxy server not supported</source>
+ <translation>代理服务器不受支持</translation>
+ </message>
+ <message>
+ <source>Audio output error</source>
+ <translation>音频输出错误</translation>
+ </message>
+ <message>
+ <source>Video output error</source>
+ <translation>视频输出错误</translation>
+ </message>
+ <message>
+ <source>Decoder error</source>
+ <translation>解码器错误</translation>
+ </message>
+ <message>
+ <source>Audio or video components could not be played</source>
+ <translation>无法播放音频或视频组件</translation>
+ </message>
+ <message>
+ <source>DRM error</source>
+ <translation>DRM错误</translation>
+ </message>
+ <message>
+ <source>Unknown error (%1)</source>
+ <translation>未知错误(%1)</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::AbstractMediaPlayer</name>
+ <message>
+ <source>Not ready to play</source>
+ <translation>不准备播放</translation>
+ </message>
+ <message>
+ <source>Error opening file</source>
+ <translation>打开文件时出错</translation>
+ </message>
+ <message>
+ <source>Error opening URL</source>
+ <translation>打开URL时出错</translation>
+ </message>
+ <message>
+ <source>Setting volume failed</source>
+ <translation>设置卷失败</translation>
+ </message>
+ <message>
+ <source>Playback complete</source>
+ <translation>播放结束</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::AudioEqualizer</name>
+ <message>
+ <source>%1 Hz</source>
+ <translation>%1赫兹</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::AudioPlayer</name>
+ <message>
+ <source>Getting position failed</source>
+ <translation>获取位置失败</translation>
+ </message>
+ <message>
+ <source>Opening clip failed</source>
+ <translation>打开片段失败</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::EffectFactory</name>
+ <message>
+ <source>Enabled</source>
+ <translation>已启用</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::EnvironmentalReverb</name>
+ <message>
+ <source>Decay HF ratio (%)</source>
+ <translation>高频衰减率(%)</translation>
+ </message>
+ <message>
+ <source>Decay time (ms)</source>
+ <translation>衰减时间(毫秒)</translation>
+ </message>
+ <message>
+ <source>Density (%)</source>
+ <translation>密度(%)</translation>
+ </message>
+ <message>
+ <source>Diffusion (%)</source>
+ <translation>散射(%)</translation>
+ </message>
+ <message>
+ <source>Reflections delay (ms)</source>
+ <translation>反映延迟(毫秒)</translation>
+ </message>
+ <message>
+ <source>Reflections level (mB)</source>
+ <translation>反映级别(mB)</translation>
+ </message>
+ <message>
+ <source>Reverb delay (ms)</source>
+ <translation>混响延迟(毫秒)</translation>
+ </message>
+ <message>
+ <source>Reverb level (mB)</source>
+ <translation>混响级别(mB)</translation>
+ </message>
+ <message>
+ <source>Room HF level</source>
+ <translation>高频室级别</translation>
+ </message>
+ <message>
+ <source>Room level (mB)</source>
+ <translation>室级别(mB)</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::MediaObject</name>
+ <message>
+ <source>Error opening source: type not supported</source>
+ <translation>打开源时出错:类型不受支持</translation>
+ </message>
+ <message>
+ <source>Error opening source: media type could not be determined</source>
+ <translation>打开源时出错:无法判断多媒体类型</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::StereoWidening</name>
+ <message>
+ <source>Level (%)</source>
+ <translation>级别(%)</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::VideoPlayer</name>
+ <message>
+ <source>Pause failed</source>
+ <translation>暂停失败</translation>
+ </message>
+ <message>
+ <source>Seek failed</source>
+ <translation>寻找失败</translation>
+ </message>
+ <message>
+ <source>Getting position failed</source>
+ <translation>获取位置失败</translation>
+ </message>
+ <message>
+ <source>Opening clip failed</source>
+ <translation>打开片段失败</translation>
+ </message>
+ <message>
+ <source>Buffering clip failed</source>
+ <translation>片段缓冲失败</translation>
+ </message>
+ <message>
+ <source>Video display error</source>
+ <translation>视频显示错误</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::VolumeSlider</name>
+ <message>
+ <source>Volume: %1%</source>
+ <translation>音量:%1%</translation>
+ </message>
+ <message>
+ <source>Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%</source>
+ <translation>请使用这个滑块调节音量。最左为%0,最右为%1%</translation>
+ </message>
+ <message>
+ <source>Muted</source>
+ <translation>已静音</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3Accel</name>
+ <message>
+ <source>%1, %2 not defined</source>
+ <translation>%1,%2未定义</translation>
+ </message>
+ <message>
+ <source>Ambiguous %1 not handled</source>
+ <translation>不明确的%1没有被处理</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3DataTable</name>
+ <message>
+ <source>True</source>
+ <translation>真</translation>
+ </message>
+ <message>
+ <source>False</source>
+ <translation>假</translation>
+ </message>
+ <message>
+ <source>Insert</source>
+ <translation>插入</translation>
+ </message>
+ <message>
+ <source>Update</source>
+ <translation>更新</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>删除</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3FileDialog</name>
+ <message>
+ <source>Copy or Move a File</source>
+ <translation>复制或者移动一个文件</translation>
+ </message>
+ <message>
+ <source>Read: %1</source>
+ <translation>读取:%1</translation>
+ </message>
+ <message>
+ <source>Write: %1</source>
+ <translation>写入:%1</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>取消</translation>
+ </message>
+ <message>
+ <source>All Files (*)</source>
+ <translation>所有文件 (*)</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>名称</translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation>大小</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>类型</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation>日期</translation>
+ </message>
+ <message>
+ <source>Attributes</source>
+ <translation>属性</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>确定(&amp;O)</translation>
+ </message>
+ <message>
+ <source>Look &amp;in:</source>
+ <translation>查找范围(&amp;I):</translation>
+ </message>
+ <message>
+ <source>File &amp;name:</source>
+ <translation>文件名称(&amp;N):</translation>
+ </message>
+ <message>
+ <source>File &amp;type:</source>
+ <translation>文件类型(&amp;T):</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation>后退</translation>
+ </message>
+ <message>
+ <source>One directory up</source>
+ <translation>向上一级</translation>
+ </message>
+ <message>
+ <source>Create New Folder</source>
+ <translation>创建新文件夹</translation>
+ </message>
+ <message>
+ <source>List View</source>
+ <translation>列表视图</translation>
+ </message>
+ <message>
+ <source>Detail View</source>
+ <translation>详细视图</translation>
+ </message>
+ <message>
+ <source>Preview File Info</source>
+ <translation>预览文件信息</translation>
+ </message>
+ <message>
+ <source>Preview File Contents</source>
+ <translation>预览文件内容</translation>
+ </message>
+ <message>
+ <source>Read-write</source>
+ <translation>读写</translation>
+ </message>
+ <message>
+ <source>Read-only</source>
+ <translation>只读</translation>
+ </message>
+ <message>
+ <source>Write-only</source>
+ <translation>只写</translation>
+ </message>
+ <message>
+ <source>Inaccessible</source>
+ <translation>不可访问的</translation>
+ </message>
+ <message>
+ <source>Symlink to File</source>
+ <translation>文件的系统链接</translation>
+ </message>
+ <message>
+ <source>Symlink to Directory</source>
+ <translation>目录的系统链接</translation>
+ </message>
+ <message>
+ <source>Symlink to Special</source>
+ <translation>特殊的系统链接</translation>
+ </message>
+ <message>
+ <source>File</source>
+ <translation>文件</translation>
+ </message>
+ <message>
+ <source>Dir</source>
+ <translation>目录</translation>
+ </message>
+ <message>
+ <source>Special</source>
+ <translation>特殊</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>打开</translation>
+ </message>
+ <message>
+ <source>Save As</source>
+ <translation>另存为</translation>
+ </message>
+ <message>
+ <source>&amp;Open</source>
+ <translation>打开(&amp;O)</translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation>保存(&amp;S)</translation>
+ </message>
+ <message>
+ <source>&amp;Rename</source>
+ <translation>重命名(&amp;R)</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>删除(&amp;D)</translation>
+ </message>
+ <message>
+ <source>R&amp;eload</source>
+ <translation>重新载入(&amp;E)</translation>
+ </message>
+ <message>
+ <source>Sort by &amp;Name</source>
+ <translation>按名称排列(&amp;N)</translation>
+ </message>
+ <message>
+ <source>Sort by &amp;Size</source>
+ <translation>按大小排列(&amp;S)</translation>
+ </message>
+ <message>
+ <source>Sort by &amp;Date</source>
+ <translation>按日期排列(&amp;D)</translation>
+ </message>
+ <message>
+ <source>&amp;Unsorted</source>
+ <translation>未排列的(&amp;U)</translation>
+ </message>
+ <message>
+ <source>Sort</source>
+ <translation>排列</translation>
+ </message>
+ <message>
+ <source>Show &amp;hidden files</source>
+ <translation>显示隐藏文件(&amp;H)</translation>
+ </message>
+ <message>
+ <source>the file</source>
+ <translation>文件</translation>
+ </message>
+ <message>
+ <source>the directory</source>
+ <translation>目录</translation>
+ </message>
+ <message>
+ <source>the symlink</source>
+ <translation>系统链接</translation>
+ </message>
+ <message>
+ <source>Delete %1</source>
+ <translation>删除%1</translation>
+ </message>
+ <message>
+ <source>&lt;qt&gt;Are you sure you wish to delete %1 &quot;%2&quot;?&lt;/qt&gt;</source>
+ <translation>&lt;qt&gt;你确认你想删除%1,“%2”?&lt;/qt&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Yes</source>
+ <translation>是(&amp;Y)</translation>
+ </message>
+ <message>
+ <source>&amp;No</source>
+ <translation>否(&amp;N)</translation>
+ </message>
+ <message>
+ <source>New Folder 1</source>
+ <translation>新建文件夹1</translation>
+ </message>
+ <message>
+ <source>New Folder</source>
+ <translation>新建文件夹</translation>
+ </message>
+ <message>
+ <source>New Folder %1</source>
+ <translation>新建文件夹%1</translation>
+ </message>
+ <message>
+ <source>Find Directory</source>
+ <translation>查找目录</translation>
+ </message>
+ <message>
+ <source>Directories</source>
+ <translation>目录</translation>
+ </message>
+ <message>
+ <source>Directory:</source>
+ <translation>目录:</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>错误</translation>
+ </message>
+ <message>
+ <source>%1
+File not found.
+Check path and filename.</source>
+ <translation>文件%1
+未找到。
+请检查路径和文件名。
+</translation>
+ </message>
+ <message>
+ <source>All Files (*.*)</source>
+ <translation>所有文件 (*.*)</translation>
+ </message>
+ <message>
+ <source>Open </source>
+ <translation>打开</translation>
+ </message>
+ <message>
+ <source>Select a Directory</source>
+ <translation>选择一个目录</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3LocalFs</name>
+ <message>
+ <source>Could not read directory
+%1</source>
+ <translation>不能读取目录
+%1</translation>
+ </message>
+ <message>
+ <source>Could not create directory
+%1</source>
+ <translation>不能创建目录
+%1</translation>
+ </message>
+ <message>
+ <source>Could not remove file or directory
+%1</source>
+ <translation>不能移除文件或者目录
+%1</translation>
+ </message>
+ <message>
+ <source>Could not rename
+%1
+to
+%2</source>
+ <translation>不能把
+%1
+重命名为
+%2</translation>
+ </message>
+ <message>
+ <source>Could not open
+%1</source>
+ <translation>不能打开
+%1</translation>
+ </message>
+ <message>
+ <source>Could not write
+%1</source>
+ <translation>不能写入
+%1</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3MainWindow</name>
+ <message>
+ <source>Line up</source>
+ <translation>排列</translation>
+ </message>
+ <message>
+ <source>Customize...</source>
+ <translation>自定义...</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3NetworkProtocol</name>
+ <message>
+ <source>Operation stopped by the user</source>
+ <translation>操作被用户停止</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3ProgressDialog</name>
+ <message>
+ <source>Cancel</source>
+ <translation>取消</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3TabDialog</name>
+ <message>
+ <source>OK</source>
+ <translation>确认</translation>
+ </message>
+ <message>
+ <source>Apply</source>
+ <translation>应用</translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation>帮助</translation>
+ </message>
+ <message>
+ <source>Defaults</source>
+ <translation>默认</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>取消</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3TextEdit</name>
+ <message>
+ <source>&amp;Undo</source>
+ <translation>撤消(&amp;U)</translation>
+ </message>
+ <message>
+ <source>&amp;Redo</source>
+ <translation>恢复(&amp;R)</translation>
+ </message>
+ <message>
+ <source>Cu&amp;t</source>
+ <translation>剪切(&amp;T)</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>复制(&amp;C)</translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation>粘贴(&amp;P)</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>清空</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation>选择全部</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3TitleBar</name>
+ <message>
+ <source>System</source>
+ <translation>系统</translation>
+ </message>
+ <message>
+ <source>Restore up</source>
+ <translation>向上恢复</translation>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation>最小化</translation>
+ </message>
+ <message>
+ <source>Restore down</source>
+ <translation>向下恢复</translation>
+ </message>
+ <message>
+ <source>Maximize</source>
+ <translation>最大化</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>关闭</translation>
+ </message>
+ <message>
+ <source>Contains commands to manipulate the window</source>
+ <translation>包含操作窗口的命令。</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>把窗口移到外面</translation>
+ </message>
+ <message>
+ <source>Puts a maximized window back to normal</source>
+ <translation>把一个最大化窗口恢复为普通状态</translation>
+ </message>
+ <message>
+ <source>Makes the window full screen</source>
+ <translation>窗口全屏化</translation>
+ </message>
+ <message>
+ <source>Closes the window</source>
+ <translation>关闭窗口</translation>
+ </message>
+ <message>
+ <source>Displays the name of the window and contains controls to manipulate it</source>
+ <translation>显示窗口名称并且包含维护它的控件</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3ToolBar</name>
+ <message>
+ <source>More...</source>
+ <translation>更多...</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3UrlOperator</name>
+ <message>
+ <source>The protocol `%1&apos; is not supported</source>
+ <translation>协议“%1”不被支持</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support listing directories</source>
+ <translation>协议“%1”不支持列出目录</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support creating new directories</source>
+ <translation>协议“%1”不支持创建新目录</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support removing files or directories</source>
+ <translation>协议“%1”不支持移除文件或者目录</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support renaming files or directories</source>
+ <translation>协议“%1”不支持重命名文件或者目录</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support getting files</source>
+ <translation>协议“%1”不支持获取文件</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support putting files</source>
+ <translation>协议“%1”不支持上传文件</translation>
+ </message>
+ <message>
+ <source>The protocol `%1&apos; does not support copying or moving files or directories</source>
+ <translation>协议“%1”不支持复制或者移动文件或者目录</translation>
+ </message>
+ <message>
+ <source>(unknown)</source>
+ <translation>(未知的)</translation>
+ </message>
+ </context>
+ <context>
+ <name>Q3Wizard</name>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>取消(&amp;C)</translation>
+ </message>
+ <message>
+ <source>&lt; &amp;Back</source>
+ <translation>&lt; 上一步(&amp;B)</translation>
+ </message>
+ <message>
+ <source>&amp;Next &gt;</source>
+ <translation>下一步(&amp;N) &gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Finish</source>
+ <translation>完成(&amp;F)</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>帮助(&amp;H)</translation>
+ </message>
+ </context>
+ <context>
+ <name>QAbstractSocket</name>
+ <message>
+ <source>Host not found</source>
+ <translation>主机未找到</translation>
+ </message>
+ <message>
+ <source>Connection refused</source>
+ <translation>连接被拒绝</translation>
+ </message>
+ <message>
+ <source>Connection timed out</source>
+ <translation>连接超时</translation>
+ </message>
+ <message>
+ <source>Operation on socket is not supported</source>
+ <translation>Socket操作不被支持</translation>
+ </message>
+ <message>
+ <source>Socket operation timed out</source>
+ <translation>套接字操作超时</translation>
+ </message>
+ <message>
+ <source>Socket is not connected</source>
+ <translation>套接字没有被连接</translation>
+ </message>
+ <message>
+ <source>Network unreachable</source>
+ <translation>网络不能访问</translation>
+ </message>
+ </context>
+ <context>
+ <name>QAbstractSpinBox</name>
+ <message>
+ <source>&amp;Step up</source>
+ <translation>增加(&amp;S)</translation>
+ </message>
+ <message>
+ <source>Step &amp;down</source>
+ <translation>减少(&amp;D)</translation>
+ </message>
+ <message>
+ <source>&amp;Select All</source>
+ <translation>选择关部(&amp;S)</translation>
+ </message>
+ </context>
+ <context>
+ <name>QAccessibleButton</name>
+ <message>
+ <source>Press</source>
+ <translation>按下</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>LTR</translation>
+ </message>
+ <message>
+ <source>Executable &apos;%1&apos; requires Qt %2, found Qt %3.</source>
+ <translation>执行“%1”需要Qt %2,只找到了Qt %3。</translation>
+ </message>
+ <message>
+ <source>Incompatible Qt Library Error</source>
+ <translation>不兼容的Qt错误</translation>
+ </message>
+ <message>
+ <source>Activate</source>
+ <translation>激活</translation>
+ </message>
+ <message>
+ <source>Activates the program&apos;s main window</source>
+ <translation>激活这个程序的主窗口</translation>
+ </message>
+ </context>
+ <context>
+ <name>QAxSelect</name>
+ <message>
+ <source>Select ActiveX Control</source>
+ <translation>选择ActiveX控件</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>确定</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>取消(&amp;C)</translation>
+ </message>
+ <message>
+ <source>COM &amp;Object:</source>
+ <translation>COM对象(&amp;O):</translation>
+ </message>
+ </context>
+ <context>
+ <name>QCheckBox</name>
+ <message>
+ <source>Uncheck</source>
+ <translation>取消选中</translation>
+ </message>
+ <message>
+ <source>Check</source>
+ <translation>选中</translation>
+ </message>
+ <message>
+ <source>Toggle</source>
+ <translation>切换</translation>
+ </message>
+ </context>
+ <context>
+ <name>QColorDialog</name>
+ <message>
+ <source>Hu&amp;e:</source>
+ <translation>色调(&amp;E):</translation>
+ </message>
+ <message>
+ <source>&amp;Sat:</source>
+ <translation>饱和度(&amp;S):</translation>
+ </message>
+ <message>
+ <source>&amp;Val:</source>
+ <translation>亮度(&amp;V):</translation>
+ </message>
+ <message>
+ <source>&amp;Red:</source>
+ <translation>红色(&amp;R):</translation>
+ </message>
+ <message>
+ <source>&amp;Green:</source>
+ <translation>绿色(&amp;G):</translation>
+ </message>
+ <message>
+ <source>Bl&amp;ue:</source>
+ <translation>蓝色(&amp;U):</translation>
+ </message>
+ <message>
+ <source>A&amp;lpha channel:</source>
+ <translation>Alpha通道(&amp;A):</translation>
+ </message>
+ <message>
+ <source>Select Color</source>
+ <translation>选择颜色</translation>
+ </message>
+ <message>
+ <source>&amp;Basic colors</source>
+ <translation>基本颜色(&amp;B)</translation>
+ </message>
+ <message>
+ <source>&amp;Custom colors</source>
+ <translation>自定义颜色(&amp;C)</translation>
+ </message>
+ <message>
+ <source>&amp;Add to Custom Colors</source>
+ <translation>添加到自定义颜色(&amp;A)</translation>
+ </message>
+ </context>
+ <context>
+ <name>QComboBox</name>
+ <message>
+ <source>Open</source>
+ <translation>打开</translation>
+ </message>
+ <message>
+ <source>False</source>
+ <translation>假</translation>
+ </message>
+ <message>
+ <source>True</source>
+ <translation>真</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>关闭</translation>
+ </message>
+ </context>
+ <context>
+ <name>QCoreApplication</name>
+ <message>
+ <source>%1: key is empty</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1:键是空的</translation>
+ </message>
+ <message>
+ <source>%1: unable to make key</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1:不能制造键</translation>
+ </message>
+ <message>
+ <source>%1: ftok failed</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1:ftok 失败</translation>
+ </message>
+ <message>
+ <source>%1: already exists</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1:已经存在</translation>
+ </message>
+ <message>
+ <source>%1: does not exist</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1:不存在</translation>
+ </message>
+ <message>
+ <source>%1: out of resources</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1:资源耗尽了</translation>
+ </message>
+ <message>
+ <source>%1: unknown error %2</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1:未知错误 %2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QDB2Driver</name>
+ <message>
+ <source>Unable to connect</source>
+ <translation>不能连接</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>不能提交事务</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>不能回滚事务</translation>
+ </message>
+ <message>
+ <source>Unable to set autocommit</source>
+ <translation>不能设置自动提交</translation>
+ </message>
+ </context>
+ <context>
+ <name>QDB2Result</name>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>不能执行语句</translation>
+ </message>
+ <message>
+ <source>Unable to prepare statement</source>
+ <translation>不能准备语句</translation>
+ </message>
+ <message>
+ <source>Unable to bind variable</source>
+ <translation>不能帮定变量</translation>
+ </message>
+ <message>
+ <source>Unable to fetch record %1</source>
+ <translation>不能获取记录%1</translation>
+ </message>
+ <message>
+ <source>Unable to fetch next</source>
+ <translation>不能获取下一个</translation>
+ </message>
+ <message>
+ <source>Unable to fetch first</source>
+ <translation>不能获取第一个</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>这是什么?</translation>
+ </message>
+ <message>
+ <source>Done</source>
+ <translation>完成</translation>
+ </message>
+ </context>
+ <context>
+ <name>QDialogButtonBox</name>
+ <message>
+ <source>OK</source>
+ <translation>确定</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation>保存</translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation>保存(&amp;S)</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>打开</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>取消</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>取消(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>关闭</translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation>关闭(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Apply</source>
+ <translation>应用</translation>
+ </message>
+ <message>
+ <source>Reset</source>
+ <translation>重置</translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation>帮助</translation>
+ </message>
+ <message>
+ <source>Don&apos;t Save</source>
+ <translation>不保存</translation>
+ </message>
+ <message>
+ <source>Discard</source>
+ <translation>抛弃</translation>
+ </message>
+ <message>
+ <source>&amp;Yes</source>
+ <translation>是(&amp;Y)</translation>
+ </message>
+ <message>
+ <source>Yes to &amp;All</source>
+ <translation>全部是(&amp;A)</translation>
+ </message>
+ <message>
+ <source>&amp;No</source>
+ <translation>否(&amp;N)</translation>
+ </message>
+ <message>
+ <source>N&amp;o to All</source>
+ <translation>全部否(&amp;O)</translation>
+ </message>
+ <message>
+ <source>Save All</source>
+ <translation>保存全部</translation>
+ </message>
+ <message>
+ <source>Abort</source>
+ <translation>放弃</translation>
+ </message>
+ <message>
+ <source>Retry</source>
+ <translation>重试</translation>
+ </message>
+ <message>
+ <source>Ignore</source>
+ <translation>忽略</translation>
+ </message>
+ <message>
+ <source>Restore Defaults</source>
+ <translation>恢复默认</translation>
+ </message>
+ <message>
+ <source>Close without Saving</source>
+ <translation>不保存关闭</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>确定(&amp;O)</translation>
+ </message>
+ </context>
+ <context>
+ <name>QDirModel</name>
+ <message>
+ <source>Name</source>
+ <translation>名称</translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation>大小</translation>
+ </message>
+ <message>
+ <source>Kind</source>
+ <comment>Match OS X Finder</comment>
+ <translation>类型</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <comment>All other platforms</comment>
+ <translation>类型</translation>
+ </message>
+ <message>
+ <source>Date Modified</source>
+ <translation>日期被修改</translation>
+ </message>
+ </context>
+ <context>
+ <name>QDockWidget</name>
+ <message>
+ <source>Close</source>
+ <translation>关闭</translation>
+ </message>
+ <message>
+ <source>Dock</source>
+ <translation>锚接</translation>
+ </message>
+ <message>
+ <source>Float</source>
+ <translation>浮动</translation>
+ </message>
+ </context>
+ <context>
+ <name>QDoubleSpinBox</name>
+ <message>
+ <source>More</source>
+ <translation>更多</translation>
+ </message>
+ <message>
+ <source>Less</source>
+ <translation>更少</translation>
+ </message>
+ </context>
+ <context>
+ <name>QErrorMessage</name>
+ <message>
+ <source>&amp;Show this message again</source>
+ <translation>再次显示这个消息(&amp;S)</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>确定(&amp;O)</translation>
+ </message>
+ <message>
+ <source>Debug Message:</source>
+ <translation>调试消息:</translation>
+ </message>
+ <message>
+ <source>Warning:</source>
+ <translation>警告:</translation>
+ </message>
+ <message>
+ <source>Fatal Error:</source>
+ <translation>致命错误:</translation>
+ </message>
+ </context>
+ <context>
+ <name>QFile</name>
+ <message>
+ <source>Destination file exists</source>
+ <translation>目标文件已存在</translation>
+ </message>
+ <message>
+ <source>Will not rename sequential file using block copy</source>
+ <translation>将不使用块复制重命名顺序文件</translation>
+ </message>
+ <message>
+ <source>Cannot remove source file</source>
+ <translation>无法删除源文件</translation>
+ </message>
+ <message>
+ <source>Cannot open %1 for input</source>
+ <translation>无法输入 %1 </translation>
+ </message>
+ <message>
+ <source>Cannot open for output</source>
+ <translation>无法输出</translation>
+ </message>
+ <message>
+ <source>Failure to write block</source>
+ <translation>写块失败</translation>
+ </message>
+ <message>
+ <source>Cannot create %1 for output</source>
+ <translation>无法创建 %1 </translation>
+ </message>
+ </context>
+ <context>
+ <name>QFileDialog</name>
+ <message>
+ <source>All Files (*)</source>
+ <translation>所有文件 (*)</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation>后退</translation>
+ </message>
+ <message>
+ <source>List View</source>
+ <translation>列表视图</translation>
+ </message>
+ <message>
+ <source>Detail View</source>
+ <translation>详细视图</translation>
+ </message>
+ <message>
+ <source>File</source>
+ <translation>文件</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>打开</translation>
+ </message>
+ <message>
+ <source>Save As</source>
+ <translation>另存为</translation>
+ </message>
+ <message>
+ <source>&amp;Open</source>
+ <translation>打开(&amp;O)</translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation>保存(&amp;S)</translation>
+ </message>
+ <message>
+ <source>Recent Places</source>
+ <translation>最近的地方</translation>
+ </message>
+ <message>
+ <source>&amp;Rename</source>
+ <translation>重命名(&amp;R)</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>删除(&amp;D)</translation>
+ </message>
+ <message>
+ <source>Show &amp;hidden files</source>
+ <translation>显示隐藏文件(&amp;H)</translation>
+ </message>
+ <message>
+ <source>New Folder</source>
+ <translation>新建文件夹</translation>
+ </message>
+ <message>
+ <source>Find Directory</source>
+ <translation>查找目录</translation>
+ </message>
+ <message>
+ <source>Directories</source>
+ <translation>目录</translation>
+ </message>
+ <message>
+ <source>All Files (*.*)</source>
+ <translation>所有文件 (*.*)</translation>
+ </message>
+ <message>
+ <source>Directory:</source>
+ <translation>目录:</translation>
+ </message>
+ <message>
+ <source>%1 already exists.
+Do you want to replace it?</source>
+ <translation>%1已经存在。
+你想要替换它么?</translation>
+ </message>
+ <message>
+ <source>%1
+File not found.
+Please verify the correct file name was given.</source>
+ <translation>文件%1
+没有找到。
+请核实已给定正确文件名。</translation>
+ </message>
+ <message>
+ <source>My Computer</source>
+ <translation>我的计算机</translation>
+ </message>
+ <message>
+ <source>Parent Directory</source>
+ <translation>父目录</translation>
+ </message>
+ <message>
+ <source>Files of type:</source>
+ <translation>文件类型:</translation>
+ </message>
+ <message>
+ <source>%1
+Directory not found.
+Please verify the correct directory name was given.</source>
+ <translation>目录%1
+没有找到。
+请核实已给定正确目录名。</translation>
+ </message>
+ <message>
+ <source>&apos;%1&apos; is write protected.
+Do you want to delete it anyway?</source>
+ <translation>“%1“是写保护的。
+你还是想删除它么?</translation>
+ </message>
+ <message>
+ <source>Are sure you want to delete &apos;%1&apos;?</source>
+ <translation>你确认你想删除“%1“?</translation>
+ </message>
+ <message>
+ <source>Could not delete directory.</source>
+ <translation>不能删除目录。</translation>
+ </message>
+ <message>
+ <source>Drive</source>
+ <translation>驱动器</translation>
+ </message>
+ <message>
+ <source>File Folder</source>
+ <comment>Match Windows Explorer</comment>
+ <translation>文件文件夹</translation>
+ </message>
+ <message>
+ <source>Folder</source>
+ <comment>All other platforms</comment>
+ <translation>文件夹</translation>
+ </message>
+ <message>
+ <source>Alias</source>
+ <comment>Mac OS X Finder</comment>
+ <translation>别名</translation>
+ </message>
+ <message>
+ <source>Shortcut</source>
+ <comment>All other platforms</comment>
+ <translation>快捷方式</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation>未知的</translation>
+ </message>
+ <message>
+ <source>Show </source>
+ <translation>显示 </translation>
+ </message>
+ <message>
+ <source>Forward</source>
+ <translation>前进</translation>
+ </message>
+ <message>
+ <source>&amp;New Folder</source>
+ <translation>新建文件夹(&amp;N)</translation>
+ </message>
+ <message>
+ <source>&amp;Choose</source>
+ <translation>选择(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>移除</translation>
+ </message>
+ <message>
+ <source>File &amp;name:</source>
+ <translation>文件名称(&amp;N):</translation>
+ </message>
+ <message>
+ <source>Look in:</source>
+ <translation>查看:</translation>
+ </message>
+ <message>
+ <source>Create New Folder</source>
+ <translation>创建新文件夹</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千字节</translation>
+ </message>
+ <message>
+ <source>%1 bytes</source>
+ <translation>%1字节</translation>
+ </message>
+ <message>
+ <source>Invalid filename</source>
+ <translation>无效文件名</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;名称“%1“不能被使用。&lt;/b&gt;&lt;p&gt;请使用另外一个包含更少字符或者不含有标点符号的名称。</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>名称</translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation>大小</translation>
+ </message>
+ <message>
+ <source>Kind</source>
+ <comment>Match OS X Finder</comment>
+ <translation>类型</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <comment>All other platforms</comment>
+ <translation>类型</translation>
+ </message>
+ <message>
+ <source>Date Modified</source>
+ <translation>日期被修改</translation>
+ </message>
+ <message>
+ <source>My Computer</source>
+ <translation>我的计算机</translation>
+ </message>
+ <message>
+ <source>Computer</source>
+ <translation>计算机</translation>
+ </message>
+ <message>
+ <source>%1 byte(s)</source>
+ <translation>%1字节</translation>
+ </message>
+ </context>
+ <context>
+ <name>QFontDatabase</name>
+ <message>
+ <source>Normal</source>
+ <translation>普通</translation>
+ </message>
+ <message>
+ <source>Bold</source>
+ <translation>粗体</translation>
+ </message>
+ <message>
+ <source>Demi Bold</source>
+ <translation>半粗体</translation>
+ </message>
+ <message>
+ <source>Black</source>
+ <translation>黑体</translation>
+ </message>
+ <message>
+ <source>Demi</source>
+ <translation>半体</translation>
+ </message>
+ <message>
+ <source>Light</source>
+ <translation>轻体</translation>
+ </message>
+ <message>
+ <source>Italic</source>
+ <translation>意大利体</translation>
+ </message>
+ <message>
+ <source>Oblique</source>
+ <translation>斜体</translation>
+ </message>
+ <message>
+ <source>Any</source>
+ <translation>任意</translation>
+ </message>
+ <message>
+ <source>Latin</source>
+ <translation>拉丁文</translation>
+ </message>
+ <message>
+ <source>Greek</source>
+ <translation>希腊文</translation>
+ </message>
+ <message>
+ <source>Cyrillic</source>
+ <translation>西里尔文</translation>
+ </message>
+ <message>
+ <source>Armenian</source>
+ <translation>亚美尼亚文</translation>
+ </message>
+ <message>
+ <source>Hebrew</source>
+ <translation>希伯来文</translation>
+ </message>
+ <message>
+ <source>Arabic</source>
+ <translation>阿拉伯文</translation>
+ </message>
+ <message>
+ <source>Syriac</source>
+ <translation>叙利亚文</translation>
+ </message>
+ <message>
+ <source>Thaana</source>
+ <translation>马尔代夫文</translation>
+ </message>
+ <message>
+ <source>Devanagari</source>
+ <translation>梵文</translation>
+ </message>
+ <message>
+ <source>Bengali</source>
+ <translation>孟加拉文</translation>
+ </message>
+ <message>
+ <source>Gurmukhi</source>
+ <translation>旁遮普文</translation>
+ </message>
+ <message>
+ <source>Gujarati</source>
+ <translation>古吉拉特文</translation>
+ </message>
+ <message>
+ <source>Oriya</source>
+ <translation>奥里雅文</translation>
+ </message>
+ <message>
+ <source>Tamil</source>
+ <translation>泰米尔文</translation>
+ </message>
+ <message>
+ <source>Telugu</source>
+ <translation>泰卢固文</translation>
+ </message>
+ <message>
+ <source>Kannada</source>
+ <translation>埃纳德文</translation>
+ </message>
+ <message>
+ <source>Malayalam</source>
+ <translation>马拉亚拉姆文</translation>
+ </message>
+ <message>
+ <source>Sinhala</source>
+ <translation>僧伽罗文</translation>
+ </message>
+ <message>
+ <source>Thai</source>
+ <translation>泰国文</translation>
+ </message>
+ <message>
+ <source>Lao</source>
+ <translation>老挝文</translation>
+ </message>
+ <message>
+ <source>Tibetan</source>
+ <translation>藏文</translation>
+ </message>
+ <message>
+ <source>Myanmar</source>
+ <translation>缅甸文</translation>
+ </message>
+ <message>
+ <source>Georgian</source>
+ <translation>格鲁吉亚文</translation>
+ </message>
+ <message>
+ <source>Khmer</source>
+ <translation>谷美尔文</translation>
+ </message>
+ <message>
+ <source>Simplified Chinese</source>
+ <translation>简体中文</translation>
+ </message>
+ <message>
+ <source>Traditional Chinese</source>
+ <translation>繁体中文</translation>
+ </message>
+ <message>
+ <source>Japanese</source>
+ <translation>日文</translation>
+ </message>
+ <message>
+ <source>Korean</source>
+ <translation>韩文</translation>
+ </message>
+ <message>
+ <source>Vietnamese</source>
+ <translation>越南文</translation>
+ </message>
+ <message>
+ <source>Symbol</source>
+ <translation>符号</translation>
+ </message>
+ <message>
+ <source>Ogham</source>
+ <translation>欧甘文</translation>
+ </message>
+ <message>
+ <source>Runic</source>
+ <translation>古北欧文</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;F)</translation>
+ </message>
+ <message>
+ <source>Font st&amp;yle</source>
+ <translation>字体风格(&amp;Y)</translation>
+ </message>
+ <message>
+ <source>&amp;Size</source>
+ <translation>大小(&amp;S)</translation>
+ </message>
+ <message>
+ <source>Effects</source>
+ <translation>效果</translation>
+ </message>
+ <message>
+ <source>Stri&amp;keout</source>
+ <translation>删除线(&amp;K)</translation>
+ </message>
+ <message>
+ <source>&amp;Underline</source>
+ <translation>下划线(&amp;U)</translation>
+ </message>
+ <message>
+ <source>Sample</source>
+ <translation>实例</translation>
+ </message>
+ <message>
+ <source>Select Font</source>
+ <translation>选择字体</translation>
+ </message>
+ <message>
+ <source>Wr&amp;iting System</source>
+ <translation>书写系统(&amp;I)</translation>
+ </message>
+ </context>
+ <context>
+ <name>QFtp</name>
+ <message>
+ <source>Host %1 found</source>
+ <translation>主机%1找到了</translation>
+ </message>
+ <message>
+ <source>Host found</source>
+ <translation>主机找到了</translation>
+ </message>
+ <message>
+ <source>Connected to host %1</source>
+ <translation>连接到主机%1了</translation>
+ </message>
+ <message>
+ <source>Connected to host</source>
+ <translation>连接到主机了</translation>
+ </message>
+ <message>
+ <source>Connection to %1 closed</source>
+ <translation>到%1的连接关闭了</translation>
+ </message>
+ <message>
+ <source>Connection closed</source>
+ <translation>连接关闭了</translation>
+ </message>
+ <message>
+ <source>Host %1 not found</source>
+ <translation>主机%1没有找到</translation>
+ </message>
+ <message>
+ <source>Connection refused to host %1</source>
+ <translation>连接被主机 %1 拒绝</translation>
+ </message>
+ <message>
+ <source>Connection timed out to host %1</source>
+ <translation>主机%1连接超时</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>未知的错误</translation>
+ </message>
+ <message>
+ <source>Connecting to host failed:
+%1</source>
+ <translation>连接主机失败:
+%1</translation>
+ </message>
+ <message>
+ <source>Login failed:
+%1</source>
+ <translation>登录失败:
+%1</translation>
+ </message>
+ <message>
+ <source>Listing directory failed:
+%1</source>
+ <translation>列出目录失败:
+%1</translation>
+ </message>
+ <message>
+ <source>Changing directory failed:
+%1</source>
+ <translation>改变目录失败:
+%1</translation>
+ </message>
+ <message>
+ <source>Downloading file failed:
+%1</source>
+ <translation>下载文件失败:
+%1</translation>
+ </message>
+ <message>
+ <source>Uploading file failed:
+%1</source>
+ <translation>上传文件失败:
+%1</translation>
+ </message>
+ <message>
+ <source>Removing file failed:
+%1</source>
+ <translation>移除文件失败:
+%1</translation>
+ </message>
+ <message>
+ <source>Creating directory failed:
+%1</source>
+ <translation>创建目录失败:
+%1</translation>
+ </message>
+ <message>
+ <source>Removing directory failed:
+%1</source>
+ <translation>移除目录失败:
+%1</translation>
+ </message>
+ <message>
+ <source>Not connected</source>
+ <translation>没有连接</translation>
+ </message>
+ <message>
+ <source>Connection refused for data connection</source>
+ <translation>因为数据连接而被拒绝连接</translation>
+ </message>
+ </context>
+ <context>
+ <name>QHostInfo</name>
+ <message>
+ <source>Unknown error</source>
+ <translation>未知的错误</translation>
+ </message>
+ </context>
+ <context>
+ <name>QHostInfoAgent</name>
+ <message>
+ <source>Host not found</source>
+ <translation>主机未找到</translation>
+ </message>
+ <message>
+ <source>Unknown address type</source>
+ <translation>未知的地址类型</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>未知的错误</translation>
+ </message>
+ <message>
+ <source>No host name given</source>
+ <translation>未给定主机名</translation>
+ </message>
+ <message>
+ <source>Invalid hostname</source>
+ <translation>无效主机名</translation>
+ </message>
+ </context>
+ <context>
+ <name>QHttp</name>
+ <message>
+ <source>Connection refused</source>
+ <translation>连接被拒绝</translation>
+ </message>
+ <message>
+ <source>Host %1 not found</source>
+ <translation>主机%1没有找到</translation>
+ </message>
+ <message>
+ <source>Wrong content length</source>
+ <translation>错误的内容长度</translation>
+ </message>
+ <message>
+ <source>HTTP request failed</source>
+ <translation>HTTP请求失败</translation>
+ </message>
+ <message>
+ <source>Host %1 found</source>
+ <translation>主机%1找到了</translation>
+ </message>
+ <message>
+ <source>Host found</source>
+ <translation>主机找到了</translation>
+ </message>
+ <message>
+ <source>Connected to host %1</source>
+ <translation>连接到%1主机了</translation>
+ </message>
+ <message>
+ <source>Connected to host</source>
+ <translation>连接到主机了</translation>
+ </message>
+ <message>
+ <source>Connection to %1 closed</source>
+ <translation>到%1的连接关闭了</translation>
+ </message>
+ <message>
+ <source>Connection closed</source>
+ <translation>连接关闭了</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>未知的错误</translation>
+ </message>
+ <message>
+ <source>Request aborted</source>
+ <translation>请求被放弃了</translation>
+ </message>
+ <message>
+ <source>No server set to connect to</source>
+ <translation>没有设置要连接的服务器</translation>
+ </message>
+ <message>
+ <source>Server closed connection unexpectedly</source>
+ <translation>服务器异常地关闭了连接</translation>
+ </message>
+ <message>
+ <source>Invalid HTTP response header</source>
+ <translation>无效的HTTP响应头</translation>
+ </message>
+ <message>
+ <source>Unknown authentication method</source>
+ <translation>未知鉴定方法</translation>
+ </message>
+ <message>
+ <source>Invalid HTTP chunked body</source>
+ <translation>无效的HTTP臃肿体</translation>
+ </message>
+ <message>
+ <source>Error writing response to device</source>
+ <translation>向设备中进行写回复时发生错误</translation>
+ </message>
+ <message>
+ <source>Proxy authentication required</source>
+ <translation>代理需要认证</translation>
+ </message>
+ <message>
+ <source>Authentication required</source>
+ <translation>需要认证</translation>
+ </message>
+ <message>
+ <source>Proxy requires authentication</source>
+ <translation>代理需要验证</translation>
+ </message>
+ <message>
+ <source>Host requires authentication</source>
+ <translation>主机需要验证</translation>
+ </message>
+ <message>
+ <source>Data corrupted</source>
+ <translation>数据错误</translation>
+ </message>
+ <message>
+ <source>SSL handshake failed</source>
+ <translation>SSL 握手失败</translation>
+ </message>
+ <message>
+ <source>Unknown protocol specified</source>
+ <translation>所指定的协议是未知的</translation>
+ </message>
+ <message>
+ <source>Connection refused (or timed out)</source>
+ <translation>连接被拒绝(或者超时)</translation>
+ </message>
+ <message>
+ <source>HTTPS connection requested but SSL support not compiled in</source>
+ <translation>HTTPS 连接需要 SSL,但它没有被编译进来</translation>
+ </message>
+ </context>
+ <context>
+ <name>QHttpSocketEngine</name>
+ <message>
+ <source>Did not receive HTTP response from proxy</source>
+ <translation>未收到代理的HTTP响应</translation>
+ </message>
+ <message>
+ <source>Error parsing authentication request from proxy</source>
+ <translation>解析代理的认证请求出错</translation>
+ </message>
+ <message>
+ <source>Authentication required</source>
+ <translation>需要认证</translation>
+ </message>
+ <message>
+ <source>Proxy denied connection</source>
+ <translation>代理拒绝连接</translation>
+ </message>
+ <message>
+ <source>Error communicating with HTTP proxy</source>
+ <translation>和HTTP代理通讯时发生错误</translation>
+ </message>
+ <message>
+ <source>Proxy server not found</source>
+ <translation>未找到代理服务器</translation>
+ </message>
+ <message>
+ <source>Proxy connection refused</source>
+ <translation>代理连接被拒绝</translation>
+ </message>
+ <message>
+ <source>Proxy server connection timed out</source>
+ <translation>代理服务器连接超时</translation>
+ </message>
+ <message>
+ <source>Proxy connection closed prematurely</source>
+ <translation>代理连接过早关闭</translation>
+ </message>
+ </context>
+ <context>
+ <name>QIBaseDriver</name>
+ <message>
+ <source>Error opening database</source>
+ <translation>打开数据库错误</translation>
+ </message>
+ <message>
+ <source>Could not start transaction</source>
+ <translation>不能开始事务</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>不能提交事务</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>不能回滚事务</translation>
+ </message>
+ </context>
+ <context>
+ <name>QIBaseResult</name>
+ <message>
+ <source>Unable to create BLOB</source>
+ <translation>不能创建BLOB</translation>
+ </message>
+ <message>
+ <source>Unable to write BLOB</source>
+ <translation>不能写入BLOB</translation>
+ </message>
+ <message>
+ <source>Unable to open BLOB</source>
+ <translation>不能打开BLOB</translation>
+ </message>
+ <message>
+ <source>Unable to read BLOB</source>
+ <translation>不能读取BLOB</translation>
+ </message>
+ <message>
+ <source>Could not find array</source>
+ <translation>不能找到数组</translation>
+ </message>
+ <message>
+ <source>Could not get array data</source>
+ <translation>不能得到数组数据</translation>
+ </message>
+ <message>
+ <source>Could not get query info</source>
+ <translation>不能得到查询信息</translation>
+ </message>
+ <message>
+ <source>Could not start transaction</source>
+ <translation>不能开始事务</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>不能提交事务</translation>
+ </message>
+ <message>
+ <source>Could not allocate statement</source>
+ <translation>不能分配语句</translation>
+ </message>
+ <message>
+ <source>Could not prepare statement</source>
+ <translation>不能准备语句</translation>
+ </message>
+ <message>
+ <source>Could not describe input statement</source>
+ <translation>不能描述输入语句</translation>
+ </message>
+ <message>
+ <source>Could not describe statement</source>
+ <translation>不能描述语句</translation>
+ </message>
+ <message>
+ <source>Unable to close statement</source>
+ <translation>不能关闭语句</translation>
+ </message>
+ <message>
+ <source>Unable to execute query</source>
+ <translation>不能执行查询</translation>
+ </message>
+ <message>
+ <source>Could not fetch next item</source>
+ <translation>不能获取下一项</translation>
+ </message>
+ <message>
+ <source>Could not get statement info</source>
+ <translation>不能得到语句信息</translation>
+ </message>
+ </context>
+ <context>
+ <name>QIODevice</name>
+ <message>
+ <source>Permission denied</source>
+ <translation>权限被拒绝</translation>
+ </message>
+ <message>
+ <source>Too many open files</source>
+ <translation>太多打开的文件</translation>
+ </message>
+ <message>
+ <source>No such file or directory</source>
+ <translation>没有这个文件或者目录</translation>
+ </message>
+ <message>
+ <source>No space left on device</source>
+ <translation>设备上没有空间了</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>未知的错误</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输入法</translation>
+ </message>
+ <message>
+ <source>Windows input method</source>
+ <translation>Windows输入法</translation>
+ </message>
+ <message>
+ <source>Mac OS X input method</source>
+ <translation>Mac OS X输入法</translation>
+ </message>
+ <message>
+ <source>S60 FEP input method</source>
+ <translation>S60 FEP输入法</translation>
+ </message>
+ </context>
+ <context>
+ <name>QInputDialog</name>
+ <message>
+ <source>Enter a value:</source>
+ <translation>输入一个值:</translation>
+ </message>
+ </context>
+ <context>
+ <name>QLibrary</name>
+ <message>
+ <source>Could not mmap &apos;%1&apos;: %2</source>
+ <translation>不能映射”%1“:%2</translation>
+ </message>
+ <message>
+ <source>Plugin verification data mismatch in &apos;%1&apos;</source>
+ <translation>“%1“中的插件验证数据不匹配</translation>
+ </message>
+ <message>
+ <source>Could not unmap &apos;%1&apos;: %2</source>
+ <translation>不能取消映射“%1“:%2</translation>
+ </message>
+ <message>
+ <source>The plugin &apos;%1&apos; uses incompatible Qt library. (%2.%3.%4) [%5]</source>
+ <translation>插件“%1”使用了不兼容的Qt库。(%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>插件“%1“使用了不兼容的Qt库。期待的构建键是“%2“,得到的却是”%3“</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>未知的错误</translation>
+ </message>
+ <message>
+ <source>The shared library was not found.</source>
+ <translation>共享库没有被找到。</translation>
+ </message>
+ <message>
+ <source>The file &apos;%1&apos; is not a valid Qt plugin.</source>
+ <translation>文件“%1“不是有效的Qt插件。</translation>
+ </message>
+ <message>
+ <source>The plugin &apos;%1&apos; uses incompatible Qt library. (Cannot mix debug and release libraries.)</source>
+ <translation>插件“%1“使用了不兼容的Qt库。(不能混合使用库的调试版本和发布版本。)</translation>
+ </message>
+ <message>
+ <source>Cannot load library %1: %2</source>
+ <translation>无法加载库%1:%2</translation>
+ </message>
+ <message>
+ <source>Cannot unload library %1: %2</source>
+ <translation>无法卸载库%1:%2</translation>
+ </message>
+ <message>
+ <source>Cannot resolve symbol &quot;%1&quot; in %2: %3</source>
+ <translation>无法解析%2中的符号“%2”:%3</translation>
+ </message>
+ </context>
+ <context>
+ <name>QLineEdit</name>
+ <message>
+ <source>Select All</source>
+ <translation>选择全部</translation>
+ </message>
+ <message>
+ <source>&amp;Undo</source>
+ <translation>撤消(&amp;U)</translation>
+ </message>
+ <message>
+ <source>&amp;Redo</source>
+ <translation>恢复(&amp;R)</translation>
+ </message>
+ <message>
+ <source>Cu&amp;t</source>
+ <translation>剪切(&amp;T)</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>复制(&amp;C)</translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation>粘贴(&amp;P)</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>删除</translation>
+ </message>
+ </context>
+ <context>
+ <name>QLocalServer</name>
+ <message>
+ <source>%1: Name error</source>
+ <translation>%1: 名称错误</translation>
+ </message>
+ <message>
+ <source>%1: Permission denied</source>
+ <translation>%1:权限被拒绝</translation>
+ </message>
+ <message>
+ <source>%1: Address in use</source>
+ <translation>%1:地址正在被使用</translation>
+ </message>
+ <message>
+ <source>%1: Unknown error %2</source>
+ <translation>%1:未知错误 %2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QLocalSocket</name>
+ <message>
+ <source>%1: Connection refused</source>
+ <translation>%1:连接被拒绝</translation>
+ </message>
+ <message>
+ <source>%1: Remote closed</source>
+ <translation>%1:远程已关闭</translation>
+ </message>
+ <message>
+ <source>%1: Invalid name</source>
+ <translation>%1:无效名称</translation>
+ </message>
+ <message>
+ <source>%1: Socket access error</source>
+ <translation>%1:套接字访问错误</translation>
+ </message>
+ <message>
+ <source>%1: Socket resource error</source>
+ <translation>%1:套接字资源错误</translation>
+ </message>
+ <message>
+ <source>%1: Socket operation timed out</source>
+ <translation>%1:套接字操作超时</translation>
+ </message>
+ <message>
+ <source>%1: Datagram too large</source>
+ <translation>%1:数据报太大</translation>
+ </message>
+ <message>
+ <source>%1: Connection error</source>
+ <translation>%1:连接错误</translation>
+ </message>
+ <message>
+ <source>%1: The socket operation is not supported</source>
+ <translation>%1:套接字操作不被支持</translation>
+ </message>
+ <message>
+ <source>%1: Unknown error</source>
+ <translation>%1:未知错误</translation>
+ </message>
+ <message>
+ <source>%1: Unknown error %2</source>
+ <translation>%1:未知错误 %2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMYSQLDriver</name>
+ <message>
+ <source>Unable to open database &apos;</source>
+ <translation>不能打开数据库</translation>
+ </message>
+ <message>
+ <source>Unable to connect</source>
+ <translation>不能连接</translation>
+ </message>
+ <message>
+ <source>Unable to begin transaction</source>
+ <translation>不能开始事务</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>不能提交事务</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>不能回滚事务</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMYSQLResult</name>
+ <message>
+ <source>Unable to fetch data</source>
+ <translation>不能获取数据</translation>
+ </message>
+ <message>
+ <source>Unable to execute query</source>
+ <translation>不能执行查询</translation>
+ </message>
+ <message>
+ <source>Unable to store result</source>
+ <translation>不能存储结果</translation>
+ </message>
+ <message>
+ <source>Unable to prepare statement</source>
+ <translation>不能准备语句</translation>
+ </message>
+ <message>
+ <source>Unable to reset statement</source>
+ <translation>不能重置语句</translation>
+ </message>
+ <message>
+ <source>Unable to bind value</source>
+ <translation>不能绑定值</translation>
+ </message>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>不能执行语句</translation>
+ </message>
+ <message>
+ <source>Unable to bind outvalues</source>
+ <translation>不能绑定外值</translation>
+ </message>
+ <message>
+ <source>Unable to store statement results</source>
+ <translation>不能存储语句结果</translation>
+ </message>
+ <message>
+ <source>Unable to execute next query</source>
+ <translation>不能执行下一个查询</translation>
+ </message>
+ <message>
+ <source>Unable to store next result</source>
+ <translation>不能存储下一个结果</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMdiArea</name>
+ <message>
+ <source>(Untitled)</source>
+ <translation>(未命名的)</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMdiSubWindow</name>
+ <message>
+ <source>%1 - [%2]</source>
+ <translation>%1 - [%2]</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>关闭</translation>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation>最小化</translation>
+ </message>
+ <message>
+ <source>Restore Down</source>
+ <translation>向下恢复</translation>
+ </message>
+ <message>
+ <source>&amp;Restore</source>
+ <translation>恢复(&amp;R)</translation>
+ </message>
+ <message>
+ <source>&amp;Move</source>
+ <translation>移动(&amp;M)</translation>
+ </message>
+ <message>
+ <source>&amp;Size</source>
+ <translation>大小(&amp;S)</translation>
+ </message>
+ <message>
+ <source>Mi&amp;nimize</source>
+ <translation>最小化(&amp;N)</translation>
+ </message>
+ <message>
+ <source>Ma&amp;ximize</source>
+ <translation>最大化(&amp;X)</translation>
+ </message>
+ <message>
+ <source>Stay on &amp;Top</source>
+ <translation>总在最前(&amp;T)</translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation>关闭(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Maximize</source>
+ <translation>最大化</translation>
+ </message>
+ <message>
+ <source>Unshade</source>
+ <translation>取消遮蔽</translation>
+ </message>
+ <message>
+ <source>Shade</source>
+ <translation>遮蔽</translation>
+ </message>
+ <message>
+ <source>Restore</source>
+ <translation>恢复</translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation>帮助</translation>
+ </message>
+ <message>
+ <source>Menu</source>
+ <translation>菜单</translation>
+ </message>
+ <message>
+ <source>- [%1]</source>
+ <translation>- [%1]</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMenu</name>
+ <message>
+ <source>Close</source>
+ <translation>关闭</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>打开</translation>
+ </message>
+ <message>
+ <source>Execute</source>
+ <translation>执行</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMenuBar</name>
+ <message>
+ <source>Actions</source>
+ <translation>操作</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMessageBox</name>
+ <message>
+ <source>OK</source>
+ <translation>确定</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;关于Qt&lt;/h3&gt;&lt;p&gt;此程序使用Qt版本%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是一个C++工具箱,用于跨平台应用程序开发。&lt;/p&gt;&lt;p&gt;Qt具有单一源跨可移植性,可跨越MS&amp;nbsp;Windows、Mac&amp;nbsp;OS&amp;nbsp;X、Linux和所有主要的商业Unix类平台进行移植。Qt还适用于嵌入式设备,如Qt for Embedded Linux和Qt for Windows CE。&lt;/p&gt;&lt;p&gt;Qt有三种不同许可方式,以满足各种用户需求。&lt;/p&gt;&lt;p&gt;假如您要开发专利/商业软件,但不希望与第三方共享任何源代码,或者无法符合GNU LGPL版本2.1或GNU GPL版本3.0的条款,则按照我们的商业许可证协议授权的Qt非常适用。&lt;/p&gt;&lt;p&gt;假如您能够符合GNU LGPL版本2.1的条款和条件,则按照GNU LGPL版本2.1授权的Qt非常适合开发Qt应用程序(专有或开放源码)。&lt;/p&gt;&lt;p&gt;假如在开发Qt应用程序过程中,您希望这类应用程序能与遵循GNU GPL版本3.0的软件合用,或者您愿意符合GNU GPL版本3.0条款,则按照GNU通用公共许可证版本3.0授权的Qt非常适用。&lt;/p&gt;&lt;p&gt;请参阅&lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt;了解Qt授权概况。&lt;/p&gt;&lt;p&gt;版权所有 (C) 2010 诺基亚公司和/或附属公司。&lt;/p&gt;&lt;p&gt;Qt是一款诺基亚产品。请参阅&lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt;了解详情。&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>About Qt</source>
+ <translation>关于Qt</translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation>帮助</translation>
+ </message>
+ <message>
+ <source>Show Details...</source>
+ <translation>显示细节……</translation>
+ </message>
+ <message>
+ <source>Hide Details...</source>
+ <translation>隐藏细节……</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMultiInputContext</name>
+ <message>
+ <source>Select IM</source>
+ <translation>选择输入法</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMultiInputContextPlugin</name>
+ <message>
+ <source>Multiple input method switcher</source>
+ <translation>多输入法切换器</translation>
+ </message>
+ <message>
+ <source>Multiple input method switcher that uses the context menu of the text widgets</source>
+ <translation>使用文本窗口部件上下文菜单的多输入法切换器</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNativeSocketEngine</name>
+ <message>
+ <source>The remote host closed the connection</source>
+ <translation>远端主机关闭了这个连接</translation>
+ </message>
+ <message>
+ <source>Network operation timed out</source>
+ <translation>网络操作超时</translation>
+ </message>
+ <message>
+ <source>Out of resources</source>
+ <translation>资源耗尽了</translation>
+ </message>
+ <message>
+ <source>Unsupported socket operation</source>
+ <translation>不被支持的套接字操作</translation>
+ </message>
+ <message>
+ <source>Protocol type not supported</source>
+ <translation>协议类型不被支持</translation>
+ </message>
+ <message>
+ <source>Invalid socket descriptor</source>
+ <translation>无效的套接字描述符</translation>
+ </message>
+ <message>
+ <source>Network unreachable</source>
+ <translation>网络不能访问</translation>
+ </message>
+ <message>
+ <source>Permission denied</source>
+ <translation>权限被拒绝</translation>
+ </message>
+ <message>
+ <source>Connection timed out</source>
+ <translation>连接超时</translation>
+ </message>
+ <message>
+ <source>Connection refused</source>
+ <translation>连接被拒绝</translation>
+ </message>
+ <message>
+ <source>The bound address is already in use</source>
+ <translation>要启用的地址已经被使用</translation>
+ </message>
+ <message>
+ <source>The address is not available</source>
+ <translation>这个地址不可用</translation>
+ </message>
+ <message>
+ <source>The address is protected</source>
+ <translation>这个地址被保护了</translation>
+ </message>
+ <message>
+ <source>Unable to send a message</source>
+ <translation>不能发送一个消息</translation>
+ </message>
+ <message>
+ <source>Unable to receive a message</source>
+ <translation>不能接收一个消息</translation>
+ </message>
+ <message>
+ <source>Unable to write</source>
+ <translation>不能写入</translation>
+ </message>
+ <message>
+ <source>Network error</source>
+ <translation>网络错误</translation>
+ </message>
+ <message>
+ <source>Another socket is already listening on the same port</source>
+ <translation>另一个套接字已经正在监听同一端口</translation>
+ </message>
+ <message>
+ <source>Unable to initialize non-blocking socket</source>
+ <translation>不能初始化非阻塞套接字</translation>
+ </message>
+ <message>
+ <source>Unable to initialize broadcast socket</source>
+ <translation>不能初始化广播套接字</translation>
+ </message>
+ <message>
+ <source>Attempt to use IPv6 socket on a platform with no IPv6 support</source>
+ <translation>试图在不支持IPv6支持的平台上使用IPv6套接字</translation>
+ </message>
+ <message>
+ <source>Host unreachable</source>
+ <translation>主机不能访问</translation>
+ </message>
+ <message>
+ <source>Datagram was too large to send</source>
+ <translation>不能发送过大的数据报</translation>
+ </message>
+ <message>
+ <source>Operation on non-socket</source>
+ <translation>对非套接字操作</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>未知的错误</translation>
+ </message>
+ <message>
+ <source>The proxy type is invalid for this operation</source>
+ <translation>对于这个操作代理类型是无效的。</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkAccessCacheBackend</name>
+ <message>
+ <source>Error opening %1</source>
+ <translation>打开%1发生错误</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkAccessDebugPipeBackend</name>
+ <message>
+ <source>Write error writing to %1: %2</source>
+ <translation>写入%1时出错:%2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkAccessFileBackend</name>
+ <message>
+ <source>Request for opening non-local file %1</source>
+ <translation>正在打开非本地文件 %1 的请求</translation>
+ </message>
+ <message>
+ <source>Error opening %1: %2</source>
+ <translation>打开 %1 错误:%2</translation>
+ </message>
+ <message>
+ <source>Write error writing to %1: %2</source>
+ <translation>写入 %1 错误:%2</translation>
+ </message>
+ <message>
+ <source>Cannot open %1: Path is a directory</source>
+ <translation>无法打开 %1:路径是一个目录</translation>
+ </message>
+ <message>
+ <source>Read error reading from %1: %2</source>
+ <translation>读取 %1 错误:%2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkAccessFtpBackend</name>
+ <message>
+ <source>No suitable proxy found</source>
+ <translation>未找到合适的代理</translation>
+ </message>
+ <message>
+ <source>Cannot open %1: is a directory</source>
+ <translation>无法读取 %1:是一个目录</translation>
+ </message>
+ <message>
+ <source>Logging in to %1 failed: authentication required</source>
+ <translation>登入 %1 失败:需要验证</translation>
+ </message>
+ <message>
+ <source>Error while downloading %1: %2</source>
+ <translation>下载 %1 时错误:%2</translation>
+ </message>
+ <message>
+ <source>Error while uploading %1: %2</source>
+ <translation>上载 %1 时错误:%2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkAccessHttpBackend</name>
+ <message>
+ <source>No suitable proxy found</source>
+ <translation>未找到合适的代理</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkReply</name>
+ <message>
+ <source>Error downloading %1 - server replied: %2</source>
+ <translation>下载 %1 错误 - 服务器回复:%2</translation>
+ </message>
+ <message>
+ <source>Protocol &quot;%1&quot; is unknown</source>
+ <translation>协议“%1”是未知的</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkReplyImpl</name>
+ <message>
+ <source>Operation canceled</source>
+ <translation>操作被取消</translation>
+ </message>
+ </context>
+ <context>
+ <name>QOCIDriver</name>
+ <message>
+ <source>Unable to logon</source>
+ <translation>不能登录</translation>
+ </message>
+ <message>
+ <source>Unable to initialize</source>
+ <comment>QOCIDriver</comment>
+ <translation>不能初始化</translation>
+ </message>
+ <message>
+ <source>Unable to begin transaction</source>
+ <translation>不能开始事务</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>不能提交事务</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>不能回滚事务</translation>
+ </message>
+ </context>
+ <context>
+ <name>QOCIResult</name>
+ <message>
+ <source>Unable to bind column for batch execute</source>
+ <translation>不能绑定批处理执行的列</translation>
+ </message>
+ <message>
+ <source>Unable to execute batch statement</source>
+ <translation>不能执行批处理语句</translation>
+ </message>
+ <message>
+ <source>Unable to goto next</source>
+ <translation>不能进入下一个</translation>
+ </message>
+ <message>
+ <source>Unable to alloc statement</source>
+ <translation>不能分配语句</translation>
+ </message>
+ <message>
+ <source>Unable to prepare statement</source>
+ <translation>不能准备语句</translation>
+ </message>
+ <message>
+ <source>Unable to get statement type</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to bind value</source>
+ <translation>不能绑定值</translation>
+ </message>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>不能执行语句</translation>
+ </message>
+ </context>
+ <context>
+ <name>QODBCDriver</name>
+ <message>
+ <source>Unable to connect</source>
+ <translation>不能连接</translation>
+ </message>
+ <message>
+ <source>Unable to disable autocommit</source>
+ <translation>不能禁止自动提交</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>不能提交事务</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>不能回滚事务</translation>
+ </message>
+ <message>
+ <source>Unable to enable autocommit</source>
+ <translation>不能打开自动提交</translation>
+ </message>
+ <message>
+ <source>Unable to connect - Driver doesn&apos;t support all functionality required</source>
+ <translation type="unfinished"></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: 不能把“SQL_CURSOR_STATIC”设置为语句属性。请检查你的ODBC驱动程序设置。</translation>
+ </message>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>不能执行语句</translation>
+ </message>
+ <message>
+ <source>Unable to fetch next</source>
+ <translation>不能获取下一个</translation>
+ </message>
+ <message>
+ <source>Unable to prepare statement</source>
+ <translation>不能准备语句</translation>
+ </message>
+ <message>
+ <source>Unable to bind variable</source>
+ <translation>不能帮定变量</translation>
+ </message>
+ <message>
+ <source>Unable to fetch last</source>
+ <translation>不能获取最后一个</translation>
+ </message>
+ <message>
+ <source>Unable to fetch</source>
+ <translation>不能获取</translation>
+ </message>
+ <message>
+ <source>Unable to fetch first</source>
+ <translation>不能获取第一个</translation>
+ </message>
+ <message>
+ <source>Unable to fetch previous</source>
+ <translation>不能获取上一个</translation>
+ </message>
+ </context>
+ <context>
+ <name>QObject</name>
+ <message>
+ <source>Invalid hostname</source>
+ <translation>无效主机名</translation>
+ </message>
+ <message>
+ <source>Operation not supported on %1</source>
+ <translation>在 %1 上不被支持的操作</translation>
+ </message>
+ <message>
+ <source>Invalid URI: %1</source>
+ <translation>无效的 URI:%1</translation>
+ </message>
+ <message>
+ <source>Socket error on %1: %2</source>
+ <translation>%1 上的套接字错误:%2</translation>
+ </message>
+ <message>
+ <source>Remote host closed the connection prematurely on %1</source>
+ <translation>远程主机过早地关闭了在 %1 上的这个连接</translation>
+ </message>
+ <message>
+ <source>No host name given</source>
+ <translation>未指定主机名</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPPDOptionsModel</name>
+ <message>
+ <source>Name</source>
+ <translation>名称</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>值</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPSQLDriver</name>
+ <message>
+ <source>Unable to connect</source>
+ <translation>不能连接</translation>
+ </message>
+ <message>
+ <source>Could not begin transaction</source>
+ <translation>不能开始事务</translation>
+ </message>
+ <message>
+ <source>Could not commit transaction</source>
+ <translation>不能提交事务</translation>
+ </message>
+ <message>
+ <source>Could not rollback transaction</source>
+ <translation>不能回滚事务</translation>
+ </message>
+ <message>
+ <source>Unable to subscribe</source>
+ <translation>不能订阅</translation>
+ </message>
+ <message>
+ <source>Unable to unsubscribe</source>
+ <translation>不能取消订阅</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPSQLResult</name>
+ <message>
+ <source>Unable to create query</source>
+ <translation>不能创建查询</translation>
+ </message>
+ <message>
+ <source>Unable to prepare statement</source>
+ <translation>不能准备语句</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPageSetupWidget</name>
+ <message>
+ <source>Centimeters (cm)</source>
+ <translation>厘米 (cm)</translation>
+ </message>
+ <message>
+ <source>Millimeters (mm)</source>
+ <translation>毫米 (mm)</translation>
+ </message>
+ <message>
+ <source>Inches (in)</source>
+ <translation>英寸 (in)</translation>
+ </message>
+ <message>
+ <source>Points (pt)</source>
+ <translation>点 (pt)</translation>
+ </message>
+ <message>
+ <source>Form</source>
+ <translation>窗体</translation>
+ </message>
+ <message>
+ <source>Paper</source>
+ <translation>纸张</translation>
+ </message>
+ <message>
+ <source>Page size:</source>
+ <translation>纸张大小:</translation>
+ </message>
+ <message>
+ <source>Width:</source>
+ <translation>宽度:</translation>
+ </message>
+ <message>
+ <source>Height:</source>
+ <translation>高度:</translation>
+ </message>
+ <message>
+ <source>Paper source:</source>
+ <translation>纸张源:</translation>
+ </message>
+ <message>
+ <source>Orientation</source>
+ <translation>方向</translation>
+ </message>
+ <message>
+ <source>Portrait</source>
+ <translation>纵向</translation>
+ </message>
+ <message>
+ <source>Landscape</source>
+ <translation>横向</translation>
+ </message>
+ <message>
+ <source>Reverse landscape</source>
+ <translation>反向横向</translation>
+ </message>
+ <message>
+ <source>Reverse portrait</source>
+ <translation>反向纵向</translation>
+ </message>
+ <message>
+ <source>Margins</source>
+ <translation>边距</translation>
+ </message>
+ <message>
+ <source>top margin</source>
+ <translation>上边距</translation>
+ </message>
+ <message>
+ <source>left margin</source>
+ <translation>左边距</translation>
+ </message>
+ <message>
+ <source>right margin</source>
+ <translation>右边距</translation>
+ </message>
+ <message>
+ <source>bottom margin</source>
+ <translation>下边距</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPluginLoader</name>
+ <message>
+ <source>Unknown error</source>
+ <translation>未知的错误</translation>
+ </message>
+ <message>
+ <source>The plugin was not loaded.</source>
+ <translation>插件没有被载入。</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPrintDialog</name>
+ <message>
+ <source>locally connected</source>
+ <translation>本地已经连接的</translation>
+ </message>
+ <message>
+ <source>Aliases: %1</source>
+ <translation>别名:%1</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation>未知的</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>确定</translation>
+ </message>
+ <message>
+ <source>Print all</source>
+ <translation>打印全部</translation>
+ </message>
+ <message>
+ <source>Print range</source>
+ <translation>打印范围</translation>
+ </message>
+ <message>
+ <source>A0 (841 x 1189 mm)</source>
+ <translation>A0 (841 x 1189 毫米)</translation>
+ </message>
+ <message>
+ <source>A1 (594 x 841 mm)</source>
+ <translation>A1 (594 x 841 毫米)</translation>
+ </message>
+ <message>
+ <source>A2 (420 x 594 mm)</source>
+ <translation>A2 (420 x 594 毫米)</translation>
+ </message>
+ <message>
+ <source>A3 (297 x 420 mm)</source>
+ <translation>A3 (297 x 420 毫米)</translation>
+ </message>
+ <message>
+ <source>A5 (148 x 210 mm)</source>
+ <translation>A5 (148 x 210 毫米)</translation>
+ </message>
+ <message>
+ <source>A6 (105 x 148 mm)</source>
+ <translation>A6 (105 x 148 毫米)</translation>
+ </message>
+ <message>
+ <source>A7 (74 x 105 mm)</source>
+ <translation>A7 (74 x 105 毫米)</translation>
+ </message>
+ <message>
+ <source>A8 (52 x 74 mm)</source>
+ <translation>A8 (52 x 74 毫米)</translation>
+ </message>
+ <message>
+ <source>A9 (37 x 52 mm)</source>
+ <translation>A9 (37 x 52 毫米)</translation>
+ </message>
+ <message>
+ <source>B0 (1000 x 1414 mm)</source>
+ <translation>B0 (1000 x 1414 毫米)</translation>
+ </message>
+ <message>
+ <source>B1 (707 x 1000 mm)</source>
+ <translation>B1 (707 x 1000 毫米)</translation>
+ </message>
+ <message>
+ <source>B2 (500 x 707 mm)</source>
+ <translation>B2 (500 x 707 毫米)</translation>
+ </message>
+ <message>
+ <source>B3 (353 x 500 mm)</source>
+ <translation>B3 (353 x 500 毫米)</translation>
+ </message>
+ <message>
+ <source>B4 (250 x 353 mm)</source>
+ <translation>B4 (250 x 353 毫米)</translation>
+ </message>
+ <message>
+ <source>B6 (125 x 176 mm)</source>
+ <translation>B6 (125 x 176 毫米)</translation>
+ </message>
+ <message>
+ <source>B7 (88 x 125 mm)</source>
+ <translation>B7 (88 x 125 毫米)</translation>
+ </message>
+ <message>
+ <source>B8 (62 x 88 mm)</source>
+ <translation>B8 (62 x 88 毫米)</translation>
+ </message>
+ <message>
+ <source>B9 (44 x 62 mm)</source>
+ <translation>B9 (44 x 62 毫米)</translation>
+ </message>
+ <message>
+ <source>B10 (31 x 44 mm)</source>
+ <translation>B10 (31 x 44 毫米)</translation>
+ </message>
+ <message>
+ <source>C5E (163 x 229 mm)</source>
+ <translation>C5E (163 x 229 毫米)</translation>
+ </message>
+ <message>
+ <source>DLE (110 x 220 mm)</source>
+ <translation>DLE (110 x 220 毫米)</translation>
+ </message>
+ <message>
+ <source>Folio (210 x 330 mm)</source>
+ <translation>Folio (210 x 330 毫米)</translation>
+ </message>
+ <message>
+ <source>Ledger (432 x 279 mm)</source>
+ <translation>Ledger (432 x 279 毫米)</translation>
+ </message>
+ <message>
+ <source>Tabloid (279 x 432 mm)</source>
+ <translation>Tabloid (279 x 432 毫米)</translation>
+ </message>
+ <message>
+ <source>US Common #10 Envelope (105 x 241 mm)</source>
+ <translation>美国普通10号信封 (105 x 241 毫米)</translation>
+ </message>
+ <message>
+ <source>A4 (210 x 297 mm, 8.26 x 11.7 inches)</source>
+ <translation>A4 (210 x 297 毫米,8.26 x 11.7 英寸)</translation>
+ </message>
+ <message>
+ <source>B5 (176 x 250 mm, 6.93 x 9.84 inches)</source>
+ <translation>B5 (176 x 250 毫米,6.93 x 9.84 英寸)</translation>
+ </message>
+ <message>
+ <source>Executive (7.5 x 10 inches, 191 x 254 mm)</source>
+ <translation>Executive (7.5 x 10 英寸,191 x 254 毫米)</translation>
+ </message>
+ <message>
+ <source>Legal (8.5 x 14 inches, 216 x 356 mm)</source>
+ <translation>Legal (8.5 x 14 英寸,216 x 356 毫米)</translation>
+ </message>
+ <message>
+ <source>Letter (8.5 x 11 inches, 216 x 279 mm)</source>
+ <translation>Letter (8.5 x 11 英寸,216 x 279 毫米)</translation>
+ </message>
+ <message>
+ <source>Print selection</source>
+ <translation>打印选择</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation>打印</translation>
+ </message>
+ <message>
+ <source>Print To File ...</source>
+ <translation>打印到文件……</translation>
+ </message>
+ <message>
+ <source>File %1 is not writable.
+Please choose a different file name.</source>
+ <translation>文件%1不可写。
+请选择一个不同的文件名。</translation>
+ </message>
+ <message>
+ <source>%1 already exists.
+Do you want to overwrite it?</source>
+ <translation>%1已经存在。
+你想覆盖它么?</translation>
+ </message>
+ <message>
+ <source>File exists</source>
+ <translation>文件存在</translation>
+ </message>
+ <message>
+ <source>&lt;qt&gt;Do you want to overwrite it?&lt;/qt&gt;</source>
+ <translation>&lt;qt&gt;你想覆盖它么?&lt;/qt&gt;</translation>
+ </message>
+ <message>
+ <source>%1 is a directory.
+Please choose a different file name.</source>
+ <translation>%1是目录。
+请选择一个不同的文件名。</translation>
+ </message>
+ <message>
+ <source>The &apos;From&apos; value cannot be greater than the &apos;To&apos; value.</source>
+ <translation>“从”的数值不能大于“到”的数值。</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>决策文书</translation>
+ </message>
+ <message>
+ <source>Folio</source>
+ <translation>对开纸</translation>
+ </message>
+ <message>
+ <source>Ledger</source>
+ <translation>帐页</translation>
+ </message>
+ <message>
+ <source>Legal</source>
+ <translation>法律文书</translation>
+ </message>
+ <message>
+ <source>Letter</source>
+ <translation>信纸</translation>
+ </message>
+ <message>
+ <source>Tabloid</source>
+ <translation>小型报纸</translation>
+ </message>
+ <message>
+ <source>US Common #10 Envelope</source>
+ <translation>美国普通10号信封</translation>
+ </message>
+ <message>
+ <source>Custom</source>
+ <translation>自定义</translation>
+ </message>
+ <message>
+ <source>&amp;Options &gt;&gt;</source>
+ <translation>选项(&amp;O) &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Options &lt;&lt;</source>
+ <translation>选项(&amp;O) &lt;&lt;</translation>
+ </message>
+ <message>
+ <source>Print to File (PDF)</source>
+ <translation>打印到文件(PDF)</translation>
+ </message>
+ <message>
+ <source>Print to File (Postscript)</source>
+ <translation>打印到文件(Postscript)</translation>
+ </message>
+ <message>
+ <source>Local file</source>
+ <translation>本地文件</translation>
+ </message>
+ <message>
+ <source>Write %1 file</source>
+ <translation>写入 %1 文件</translation>
+ </message>
+ <message>
+ <source>&amp;Print</source>
+ <translation>打印(&amp;P)</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPrintPreviewDialog</name>
+ <message>
+ <source>%1%</source>
+ <translation>%1%</translation>
+ </message>
+ <message>
+ <source>Print Preview</source>
+ <translation>打印预览</translation>
+ </message>
+ <message>
+ <source>Next page</source>
+ <translation>下一页</translation>
+ </message>
+ <message>
+ <source>Previous page</source>
+ <translation>上一页</translation>
+ </message>
+ <message>
+ <source>First page</source>
+ <translation>第一页</translation>
+ </message>
+ <message>
+ <source>Last page</source>
+ <translation>最后一页</translation>
+ </message>
+ <message>
+ <source>Fit width</source>
+ <translation>适应宽度</translation>
+ </message>
+ <message>
+ <source>Fit page</source>
+ <translation>适应页面</translation>
+ </message>
+ <message>
+ <source>Zoom in</source>
+ <translation>放大</translation>
+ </message>
+ <message>
+ <source>Zoom out</source>
+ <translation>缩小</translation>
+ </message>
+ <message>
+ <source>Portrait</source>
+ <translation>纵向</translation>
+ </message>
+ <message>
+ <source>Landscape</source>
+ <translation>横向</translation>
+ </message>
+ <message>
+ <source>Show single page</source>
+ <translation>显示单页</translation>
+ </message>
+ <message>
+ <source>Show facing pages</source>
+ <translation>显示当前页</translation>
+ </message>
+ <message>
+ <source>Show overview of all pages</source>
+ <translation>显示所有页的概览</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation>打印</translation>
+ </message>
+ <message>
+ <source>Page setup</source>
+ <translation>打印设置</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>关闭</translation>
+ </message>
+ <message>
+ <source>Export to PDF</source>
+ <translation>导出为PDF</translation>
+ </message>
+ <message>
+ <source>Export to PostScript</source>
+ <translation>导出为PostScript</translation>
+ </message>
+ <message>
+ <source>Page Setup</source>
+ <translation>页面设置</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPrintPropertiesWidget</name>
+ <message>
+ <source>Form</source>
+ <translation>窗体</translation>
+ </message>
+ <message>
+ <source>Page</source>
+ <translation>页</translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>高级</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPrintSettingsOutput</name>
+ <message>
+ <source>Form</source>
+ <translation>窗体</translation>
+ </message>
+ <message>
+ <source>Copies</source>
+ <translation>拷贝</translation>
+ </message>
+ <message>
+ <source>Print range</source>
+ <translation>打印范围</translation>
+ </message>
+ <message>
+ <source>Print all</source>
+ <translation>打印全部</translation>
+ </message>
+ <message>
+ <source>Pages from</source>
+ <translation>页数从</translation>
+ </message>
+ <message>
+ <source>to</source>
+ <translation>到</translation>
+ </message>
+ <message>
+ <source>Selection</source>
+ <translation>选择</translation>
+ </message>
+ <message>
+ <source>Output Settings</source>
+ <translation>输出设置</translation>
+ </message>
+ <message>
+ <source>Copies:</source>
+ <translation>备份:</translation>
+ </message>
+ <message>
+ <source>Collate</source>
+ <translation>校对</translation>
+ </message>
+ <message>
+ <source>Reverse</source>
+ <translation>反向</translation>
+ </message>
+ <message>
+ <source>Options</source>
+ <translation>选项</translation>
+ </message>
+ <message>
+ <source>Color Mode</source>
+ <translation>彩色模式</translation>
+ </message>
+ <message>
+ <source>Color</source>
+ <translation>彩色</translation>
+ </message>
+ <message>
+ <source>Grayscale</source>
+ <translation>灰度</translation>
+ </message>
+ <message>
+ <source>Duplex Printing</source>
+ <translation>两部分打印</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>无</translation>
+ </message>
+ <message>
+ <source>Long side</source>
+ <translation>长侧</translation>
+ </message>
+ <message>
+ <source>Short side</source>
+ <translation>短侧</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPrintWidget</name>
+ <message>
+ <source>Form</source>
+ <translation>窗体</translation>
+ </message>
+ <message>
+ <source>Printer</source>
+ <translation>打印机</translation>
+ </message>
+ <message>
+ <source>&amp;Name:</source>
+ <translation>名称(&amp;N):</translation>
+ </message>
+ <message>
+ <source>P&amp;roperties</source>
+ <translation>属性(&amp;R)</translation>
+ </message>
+ <message>
+ <source>Location:</source>
+ <translation>位置:</translation>
+ </message>
+ <message>
+ <source>Preview</source>
+ <translation>预览</translation>
+ </message>
+ <message>
+ <source>Type:</source>
+ <translation>类型:</translation>
+ </message>
+ <message>
+ <source>Output &amp;file:</source>
+ <translation>输出文件(&amp;F):</translation>
+ </message>
+ <message>
+ <source>...</source>
+ <translation>...</translation>
+ </message>
+ </context>
+ <context>
+ <name>QProcess</name>
+ <message>
+ <source>Could not open input redirection for reading</source>
+ <translation>无法打开用于读取的输入重定向</translation>
+ </message>
+ <message>
+ <source>Could not open output redirection for writing</source>
+ <translation>无法打开用于写入的输出重定向</translation>
+ </message>
+ <message>
+ <source>Resource error (fork failure): %1</source>
+ <translation>资源错误(fork失败):%1</translation>
+ </message>
+ <message>
+ <source>Process operation timed out</source>
+ <translation>进程处理超时</translation>
+ </message>
+ <message>
+ <source>Error reading from process</source>
+ <translation>从进程中读取时发生错误</translation>
+ </message>
+ <message>
+ <source>Error writing to process</source>
+ <translation>向进程写入时发生错误</translation>
+ </message>
+ <message>
+ <source>Process crashed</source>
+ <translation>进程已崩溃</translation>
+ </message>
+ <message>
+ <source>No program defined</source>
+ <translation>未定义程序</translation>
+ </message>
+ <message>
+ <source>Process failed to start: %1</source>
+ <translation>过程无法启动:%1</translation>
+ </message>
+ </context>
+ <context>
+ <name>QProgressDialog</name>
+ <message>
+ <source>Cancel</source>
+ <translation>撤消</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPushButton</name>
+ <message>
+ <source>Open</source>
+ <translation>打开</translation>
+ </message>
+ </context>
+ <context>
+ <name>QRadioButton</name>
+ <message>
+ <source>Check</source>
+ <translation>选中</translation>
+ </message>
+ </context>
+ <context>
+ <name>QRegExp</name>
+ <message>
+ <source>no error occurred</source>
+ <translation>没有错误发生</translation>
+ </message>
+ <message>
+ <source>disabled feature used</source>
+ <translation>使用了失效的特效</translation>
+ </message>
+ <message>
+ <source>bad char class syntax</source>
+ <translation>错误的字符类语法</translation>
+ </message>
+ <message>
+ <source>bad lookahead syntax</source>
+ <translation>错误的预测语法</translation>
+ </message>
+ <message>
+ <source>bad repetition syntax</source>
+ <translation>错误的重复语法</translation>
+ </message>
+ <message>
+ <source>invalid octal value</source>
+ <translation>无效的八进制数值</translation>
+ </message>
+ <message>
+ <source>missing left delim</source>
+ <translation>找不到左分隔符</translation>
+ </message>
+ <message>
+ <source>unexpected end</source>
+ <translation>意外的终止</translation>
+ </message>
+ <message>
+ <source>met internal limit</source>
+ <translation>遇到内部限制</translation>
+ </message>
+ <message>
+ <source>invalid interval</source>
+ <translation>无效时间间隔</translation>
+ </message>
+ <message>
+ <source>invalid category</source>
+ <translation>无效类别</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSQLite2Driver</name>
+ <message>
+ <source>Error opening database</source>
+ <translation>打开数据库时出错</translation>
+ </message>
+ <message>
+ <source>Unable to begin transaction</source>
+ <translation>不能开始事务</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>不能提交事务</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>不能回滚事务</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSQLite2Result</name>
+ <message>
+ <source>Unable to fetch results</source>
+ <translation>不能获取结果</translation>
+ </message>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>不能执行语句</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSQLiteDriver</name>
+ <message>
+ <source>Error opening database</source>
+ <translation>打开数据库错误</translation>
+ </message>
+ <message>
+ <source>Error closing database</source>
+ <translation>关闭数据库错误</translation>
+ </message>
+ <message>
+ <source>Unable to begin transaction</source>
+ <translation>不能开始事务</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>不能提交事务</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>不能回滚事务</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSQLiteResult</name>
+ <message>
+ <source>Unable to fetch row</source>
+ <translation>不能获取行</translation>
+ </message>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>不能执行语句</translation>
+ </message>
+ <message>
+ <source>Unable to reset statement</source>
+ <translation>不能重置语句</translation>
+ </message>
+ <message>
+ <source>Unable to bind parameters</source>
+ <translation>不能绑定参数</translation>
+ </message>
+ <message>
+ <source>Parameter count mismatch</source>
+ <translation>参数数量不匹配</translation>
+ </message>
+ <message>
+ <source>No query</source>
+ <translation>没有查询</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptBreakpointsModel</name>
+ <message>
+ <source>ID</source>
+ <translation>ID</translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation>位置</translation>
+ </message>
+ <message>
+ <source>Condition</source>
+ <translation>条件</translation>
+ </message>
+ <message>
+ <source>Ignore-count</source>
+ <translation>忽略计数</translation>
+ </message>
+ <message>
+ <source>Single-shot</source>
+ <translation>单发</translation>
+ </message>
+ <message>
+ <source>Hit-count</source>
+ <translation>点击量</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptBreakpointsWidget</name>
+ <message>
+ <source>New</source>
+ <translation>新建</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>删除</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptDebugger</name>
+ <message>
+ <source>Go to Line</source>
+ <translation>转至行</translation>
+ </message>
+ <message>
+ <source>Line:</source>
+ <translation>行:</translation>
+ </message>
+ <message>
+ <source>Interrupt</source>
+ <translation>中断</translation>
+ </message>
+ <message>
+ <source>Shift+F5</source>
+ <translation>Shift+F5</translation>
+ </message>
+ <message>
+ <source>Continue</source>
+ <translation>继续</translation>
+ </message>
+ <message>
+ <source>F5</source>
+ <translation>F5</translation>
+ </message>
+ <message>
+ <source>Step Into</source>
+ <translation>进入</translation>
+ </message>
+ <message>
+ <source>F11</source>
+ <translation>F11</translation>
+ </message>
+ <message>
+ <source>Step Over</source>
+ <translation>越过</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation>F10</translation>
+ </message>
+ <message>
+ <source>Step Out</source>
+ <translation>跳出</translation>
+ </message>
+ <message>
+ <source>Shift+F11</source>
+ <translation>Shift+F11</translation>
+ </message>
+ <message>
+ <source>Run to Cursor</source>
+ <translation>运行到光标</translation>
+ </message>
+ <message>
+ <source>Ctrl+F10</source>
+ <translation>Ctrl+F10</translation>
+ </message>
+ <message>
+ <source>Run to New Script</source>
+ <translation>运行到新脚本</translation>
+ </message>
+ <message>
+ <source>Toggle Breakpoint</source>
+ <translation>切换断点</translation>
+ </message>
+ <message>
+ <source>F9</source>
+ <translation>F9</translation>
+ </message>
+ <message>
+ <source>Clear Debug Output</source>
+ <translation>清除调试输出</translation>
+ </message>
+ <message>
+ <source>Clear Error Log</source>
+ <translation>清除错误日志</translation>
+ </message>
+ <message>
+ <source>Clear Console</source>
+ <translation>清除控制台</translation>
+ </message>
+ <message>
+ <source>&amp;Find in Script...</source>
+ <translation>在脚本中查找(&amp;F)...</translation>
+ </message>
+ <message>
+ <source>Ctrl+F</source>
+ <translation>Ctrl+F</translation>
+ </message>
+ <message>
+ <source>Find &amp;Next</source>
+ <translation>查找下一个(&amp;N)</translation>
+ </message>
+ <message>
+ <source>F3</source>
+ <translation>F3</translation>
+ </message>
+ <message>
+ <source>Find &amp;Previous</source>
+ <translation>查找上一个(&amp;P)</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>调试</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptDebuggerCodeFinderWidget</name>
+ <message>
+ <source>Close</source>
+ <translation>关闭</translation>
+ </message>
+ <message>
+ <source>Previous</source>
+ <translation>上一个</translation>
+ </message>
+ <message>
+ <source>Next</source>
+ <translation>下一个</translation>
+ </message>
+ <message>
+ <source>Case Sensitive</source>
+ <translation>区分大小写</translation>
+ </message>
+ <message>
+ <source>Whole words</source>
+ <translation>整个词</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;搜索已完成</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptDebuggerLocalsModel</name>
+ <message>
+ <source>Name</source>
+ <translation>名称</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>值</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptDebuggerStackModel</name>
+ <message>
+ <source>Level</source>
+ <translation>级别</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>名称</translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation>位置</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptEdit</name>
+ <message>
+ <source>Toggle Breakpoint</source>
+ <translation>切换断点</translation>
+ </message>
+ <message>
+ <source>Disable Breakpoint</source>
+ <translation>禁用断点</translation>
+ </message>
+ <message>
+ <source>Enable Breakpoint</source>
+ <translation>启用断点</translation>
+ </message>
+ <message>
+ <source>Breakpoint Condition:</source>
+ <translation>断点条件:</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptEngineDebugger</name>
+ <message>
+ <source>Loaded Scripts</source>
+ <translation>已加载的脚本</translation>
+ </message>
+ <message>
+ <source>Breakpoints</source>
+ <translation>断点</translation>
+ </message>
+ <message>
+ <source>Stack</source>
+ <translation>堆栈</translation>
+ </message>
+ <message>
+ <source>Locals</source>
+ <translation>区域设置</translation>
+ </message>
+ <message>
+ <source>Console</source>
+ <translation>控制台</translation>
+ </message>
+ <message>
+ <source>Debug Output</source>
+ <translation>调试输出</translation>
+ </message>
+ <message>
+ <source>Error Log</source>
+ <translation>错误日志</translation>
+ </message>
+ <message>
+ <source>Search</source>
+ <translation>搜索</translation>
+ </message>
+ <message>
+ <source>View</source>
+ <translation>查看</translation>
+ </message>
+ <message>
+ <source>Qt Script Debugger</source>
+ <translation>Qt脚本调试器</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptNewBreakpointWidget</name>
+ <message>
+ <source>Close</source>
+ <translation>关闭</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScrollBar</name>
+ <message>
+ <source>Scroll here</source>
+ <translation>滚动到这里</translation>
+ </message>
+ <message>
+ <source>Left edge</source>
+ <translation>左边缘</translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <translation>顶部</translation>
+ </message>
+ <message>
+ <source>Right edge</source>
+ <translation>右边缘</translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <translation>底部</translation>
+ </message>
+ <message>
+ <source>Page left</source>
+ <translation>左一页</translation>
+ </message>
+ <message>
+ <source>Page up</source>
+ <translation>上一页</translation>
+ </message>
+ <message>
+ <source>Page right</source>
+ <translation>右一页</translation>
+ </message>
+ <message>
+ <source>Page down</source>
+ <translation>下一页</translation>
+ </message>
+ <message>
+ <source>Scroll left</source>
+ <translation>向左滚动</translation>
+ </message>
+ <message>
+ <source>Scroll up</source>
+ <translation>向上滚动</translation>
+ </message>
+ <message>
+ <source>Scroll right</source>
+ <translation>向右滚动</translation>
+ </message>
+ <message>
+ <source>Scroll down</source>
+ <translation>向下滚动</translation>
+ </message>
+ <message>
+ <source>Line up</source>
+ <translation>向上排列</translation>
+ </message>
+ <message>
+ <source>Position</source>
+ <translation>位置</translation>
+ </message>
+ <message>
+ <source>Line down</source>
+ <translation>向下排列</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSharedMemory</name>
+ <message>
+ <source>%1: create size is less then 0</source>
+ <translation>%1:创建的大小小于 0</translation>
+ </message>
+ <message>
+ <source>%1: unable to lock</source>
+ <translation>%1:无法锁定</translation>
+ </message>
+ <message>
+ <source>%1: unable to unlock</source>
+ <translation>%1:无法取消锁定</translation>
+ </message>
+ <message>
+ <source>%1: permission denied</source>
+ <translation>%1:权限被拒绝</translation>
+ </message>
+ <message>
+ <source>%1: already exists</source>
+ <translation>%1:已经存在</translation>
+ </message>
+ <message>
+ <source>%1: doesn&apos;t exists</source>
+ <translation>%1:不存在</translation>
+ </message>
+ <message>
+ <source>%1: out of resources</source>
+ <translation>%1:资源耗尽了</translation>
+ </message>
+ <message>
+ <source>%1: unknown error %2</source>
+ <translation>%1:未知错误 %2</translation>
+ </message>
+ <message>
+ <source>%1: key is empty</source>
+ <translation>%1:键是空的</translation>
+ </message>
+ <message>
+ <source>%1: ftok failed</source>
+ <translation>%1:ftok 失败</translation>
+ </message>
+ <message>
+ <source>%1: unable to make key</source>
+ <translation>%1:不能制造键</translation>
+ </message>
+ <message>
+ <source>%1: doesn&apos;t exist</source>
+ <translation>%1:不存在</translation>
+ </message>
+ <message>
+ <source>%1: UNIX key file doesn&apos;t exist</source>
+ <translation>%1:UNIX密钥文件不存在</translation>
+ </message>
+ <message>
+ <source>%1: system-imposed size restrictions</source>
+ <translation>%1:系统预设大小限制</translation>
+ </message>
+ <message>
+ <source>%1: not attached</source>
+ <translation>%1:没有附加</translation>
+ </message>
+ <message>
+ <source>%1: invalid size</source>
+ <translation>%1:无效大小</translation>
+ </message>
+ <message>
+ <source>%1: key error</source>
+ <translation>%1: 键错误</translation>
+ </message>
+ <message>
+ <source>%1: size query failed</source>
+ <translation>%1:大小查询失败</translation>
+ </message>
+ <message>
+ <source>%1: unable to set key on lock</source>
+ <translation>%1:无法设置锁定的键</translation>
+ </message>
+ </context>
+ <context>
+ <name>QShortcut</name>
+ <message>
+ <source>Space</source>
+ <translation>空格</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>后退</translation>
+ </message>
+ <message>
+ <source>Forward</source>
+ <translation>前进</translation>
+ </message>
+ <message>
+ <source>Stop</source>
+ <translation>停止</translation>
+ </message>
+ <message>
+ <source>Refresh</source>
+ <translation>刷新</translation>
+ </message>
+ <message>
+ <source>Volume Down</source>
+ <translation>调小音量</translation>
+ </message>
+ <message>
+ <source>Volume Mute</source>
+ <translation>静音</translation>
+ </message>
+ <message>
+ <source>Volume Up</source>
+ <translation>调大音量</translation>
+ </message>
+ <message>
+ <source>Bass Boost</source>
+ <translation>低音增强</translation>
+ </message>
+ <message>
+ <source>Bass Up</source>
+ <translation>调大低音</translation>
+ </message>
+ <message>
+ <source>Bass Down</source>
+ <translation>调小低音</translation>
+ </message>
+ <message>
+ <source>Treble Up</source>
+ <translation>调大高音</translation>
+ </message>
+ <message>
+ <source>Treble Down</source>
+ <translation>调小高音</translation>
+ </message>
+ <message>
+ <source>Media Play</source>
+ <translation>多媒体播放</translation>
+ </message>
+ <message>
+ <source>Media Stop</source>
+ <translation>多媒体停止</translation>
+ </message>
+ <message>
+ <source>Media Previous</source>
+ <translation>上一个多媒体</translation>
+ </message>
+ <message>
+ <source>Media Next</source>
+ <translation>下一个多媒体</translation>
+ </message>
+ <message>
+ <source>Media Record</source>
+ <translation>多媒体记录</translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation>最喜爱的</translation>
+ </message>
+ <message>
+ <source>Search</source>
+ <translation>搜索</translation>
+ </message>
+ <message>
+ <source>Standby</source>
+ <translation>等待</translation>
+ </message>
+ <message>
+ <source>Open URL</source>
+ <translation>打开URL</translation>
+ </message>
+ <message>
+ <source>Launch Mail</source>
+ <translation>启动邮件</translation>
+ </message>
+ <message>
+ <source>Launch Media</source>
+ <translation>启动多媒体</translation>
+ </message>
+ <message>
+ <source>Launch (0)</source>
+ <translation>启动 (0)</translation>
+ </message>
+ <message>
+ <source>Launch (1)</source>
+ <translation>启动 (1)</translation>
+ </message>
+ <message>
+ <source>Launch (2)</source>
+ <translation>启动 (2)</translation>
+ </message>
+ <message>
+ <source>Launch (3)</source>
+ <translation>启动 (3)</translation>
+ </message>
+ <message>
+ <source>Launch (4)</source>
+ <translation>启动 (4)</translation>
+ </message>
+ <message>
+ <source>Launch (5)</source>
+ <translation>启动 (5)</translation>
+ </message>
+ <message>
+ <source>Launch (6)</source>
+ <translation>启动 (6)</translation>
+ </message>
+ <message>
+ <source>Launch (7)</source>
+ <translation>启动 (7)</translation>
+ </message>
+ <message>
+ <source>Launch (8)</source>
+ <translation>启动 (8)</translation>
+ </message>
+ <message>
+ <source>Launch (9)</source>
+ <translation>启动 (9)</translation>
+ </message>
+ <message>
+ <source>Launch (A)</source>
+ <translation>启动 (A)</translation>
+ </message>
+ <message>
+ <source>Launch (B)</source>
+ <translation>启动 (B)</translation>
+ </message>
+ <message>
+ <source>Launch (C)</source>
+ <translation>启动 (C)</translation>
+ </message>
+ <message>
+ <source>Launch (D)</source>
+ <translation>启动 (D)</translation>
+ </message>
+ <message>
+ <source>Launch (E)</source>
+ <translation>启动 (E)</translation>
+ </message>
+ <message>
+ <source>Launch (F)</source>
+ <translation>启动 (F)</translation>
+ </message>
+ <message>
+ <source>Monitor Brightness Up</source>
+ <translation>提高监视器亮度</translation>
+ </message>
+ <message>
+ <source>Monitor Brightness Down</source>
+ <translation>降低监视器亮度</translation>
+ </message>
+ <message>
+ <source>Keyboard Light On/Off</source>
+ <translation>键盘灯打开/关闭</translation>
+ </message>
+ <message>
+ <source>Keyboard Brightness Up</source>
+ <translation>提高键盘亮度</translation>
+ </message>
+ <message>
+ <source>Keyboard Brightness Down</source>
+ <translation>降低键盘亮度</translation>
+ </message>
+ <message>
+ <source>Power Off</source>
+ <translation>关机</translation>
+ </message>
+ <message>
+ <source>Wake Up</source>
+ <translation>唤醒</translation>
+ </message>
+ <message>
+ <source>Eject</source>
+ <translation>弹出</translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation>屏幕保护程序</translation>
+ </message>
+ <message>
+ <source>WWW</source>
+ <translation>WWW</translation>
+ </message>
+ <message>
+ <source>Sleep</source>
+ <translation>睡眠</translation>
+ </message>
+ <message>
+ <source>LightBulb</source>
+ <translation>灯泡</translation>
+ </message>
+ <message>
+ <source>Shop</source>
+ <translation>商店</translation>
+ </message>
+ <message>
+ <source>History</source>
+ <translation>历史记录</translation>
+ </message>
+ <message>
+ <source>Add Favorite</source>
+ <translation>添加收藏夹</translation>
+ </message>
+ <message>
+ <source>Hot Links</source>
+ <translation>热点链接</translation>
+ </message>
+ <message>
+ <source>Adjust Brightness</source>
+ <translation>调节亮度</translation>
+ </message>
+ <message>
+ <source>Finance</source>
+ <translation>财务</translation>
+ </message>
+ <message>
+ <source>Community</source>
+ <translation>社区</translation>
+ </message>
+ <message>
+ <source>Audio Rewind</source>
+ <translation>音频倒带</translation>
+ </message>
+ <message>
+ <source>Back Forward</source>
+ <translation>后倒</translation>
+ </message>
+ <message>
+ <source>Application Left</source>
+ <translation>应用程序偏左</translation>
+ </message>
+ <message>
+ <source>Application Right</source>
+ <translation>应用程序偏右</translation>
+ </message>
+ <message>
+ <source>Book</source>
+ <translation>书籍</translation>
+ </message>
+ <message>
+ <source>CD</source>
+ <translation>CD</translation>
+ </message>
+ <message>
+ <source>Calculator</source>
+ <translation>计算器</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>清除</translation>
+ </message>
+ <message>
+ <source>Clear Grab</source>
+ <translation>清除抓取</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>关闭</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation>复制</translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation>剪切</translation>
+ </message>
+ <message>
+ <source>Display</source>
+ <translation>显示</translation>
+ </message>
+ <message>
+ <source>DOS</source>
+ <translation>DOS</translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation>文档</translation>
+ </message>
+ <message>
+ <source>Spreadsheet</source>
+ <translation>电子表格</translation>
+ </message>
+ <message>
+ <source>Browser</source>
+ <translation>浏览器</translation>
+ </message>
+ <message>
+ <source>Game</source>
+ <translation>游戏</translation>
+ </message>
+ <message>
+ <source>Go</source>
+ <translation>转至</translation>
+ </message>
+ <message>
+ <source>iTouch</source>
+ <translation>iTouch</translation>
+ </message>
+ <message>
+ <source>Logoff</source>
+ <translation>注销</translation>
+ </message>
+ <message>
+ <source>Market</source>
+ <translation>市场</translation>
+ </message>
+ <message>
+ <source>Meeting</source>
+ <translation>会议</translation>
+ </message>
+ <message>
+ <source>Keyboard Menu</source>
+ <translation>键盘功能表</translation>
+ </message>
+ <message>
+ <source>Menu PB</source>
+ <translation>功能表PB</translation>
+ </message>
+ <message>
+ <source>My Sites</source>
+ <translation>我的站点</translation>
+ </message>
+ <message>
+ <source>News</source>
+ <translation>新闻</translation>
+ </message>
+ <message>
+ <source>Home Office</source>
+ <translation>家庭办公</translation>
+ </message>
+ <message>
+ <source>Option</source>
+ <translation>选项</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation>粘贴</translation>
+ </message>
+ <message>
+ <source>Phone</source>
+ <translation>手机</translation>
+ </message>
+ <message>
+ <source>Reply</source>
+ <translation>回复</translation>
+ </message>
+ <message>
+ <source>Reload</source>
+ <translation>重新加载</translation>
+ </message>
+ <message>
+ <source>Rotate Windows</source>
+ <translation>旋转视窗</translation>
+ </message>
+ <message>
+ <source>Rotation PB</source>
+ <translation>旋转PB</translation>
+ </message>
+ <message>
+ <source>Rotation KB</source>
+ <translation>旋转KB</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation>储存</translation>
+ </message>
+ <message>
+ <source>Send</source>
+ <translation>发送</translation>
+ </message>
+ <message>
+ <source>Spellchecker</source>
+ <translation>拼写检查程序</translation>
+ </message>
+ <message>
+ <source>Split Screen</source>
+ <translation>分屏</translation>
+ </message>
+ <message>
+ <source>Support</source>
+ <translation>支持</translation>
+ </message>
+ <message>
+ <source>Task Panel</source>
+ <translation>任务面板</translation>
+ </message>
+ <message>
+ <source>Terminal</source>
+ <translation>终端</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation>工具</translation>
+ </message>
+ <message>
+ <source>Travel</source>
+ <translation>旅行</translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation>视频</translation>
+ </message>
+ <message>
+ <source>Word Processor</source>
+ <translation>字处理器</translation>
+ </message>
+ <message>
+ <source>XFer</source>
+ <translation>XFer</translation>
+ </message>
+ <message>
+ <source>Zoom In</source>
+ <translation>放大</translation>
+ </message>
+ <message>
+ <source>Zoom Out</source>
+ <translation>缩小</translation>
+ </message>
+ <message>
+ <source>Away</source>
+ <translation>远离</translation>
+ </message>
+ <message>
+ <source>Messenger</source>
+ <translation>##</translation>
+ </message>
+ <message>
+ <source>WebCam</source>
+ <translation>WebCam</translation>
+ </message>
+ <message>
+ <source>Mail Forward</source>
+ <translation>电子邮件转发</translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation>图片</translation>
+ </message>
+ <message>
+ <source>Music</source>
+ <translation>音乐</translation>
+ </message>
+ <message>
+ <source>Battery</source>
+ <translation>电池</translation>
+ </message>
+ <message>
+ <source>Bluetooth</source>
+ <translation>蓝牙</translation>
+ </message>
+ <message>
+ <source>Wireless</source>
+ <translation>无线</translation>
+ </message>
+ <message>
+ <source>Ultra Wide Band</source>
+ <translation>超宽带</translation>
+ </message>
+ <message>
+ <source>Audio Forward</source>
+ <translation>音频前进</translation>
+ </message>
+ <message>
+ <source>Audio Repeat</source>
+ <translation>音频重复</translation>
+ </message>
+ <message>
+ <source>Audio Random Play</source>
+ <translation>音频随机播放</translation>
+ </message>
+ <message>
+ <source>Subtitle</source>
+ <translation>小标题</translation>
+ </message>
+ <message>
+ <source>Audio Cycle Track</source>
+ <translation>音频循环轨道</translation>
+ </message>
+ <message>
+ <source>Time</source>
+ <translation>时间</translation>
+ </message>
+ <message>
+ <source>View</source>
+ <translation>查看</translation>
+ </message>
+ <message>
+ <source>Top Menu</source>
+ <translation>顶端功能表</translation>
+ </message>
+ <message>
+ <source>Suspend</source>
+ <translation>挂起</translation>
+ </message>
+ <message>
+ <source>Hibernate</source>
+ <translation>休眠</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>选择</translation>
+ </message>
+ <message>
+ <source>Yes</source>
+ <translation>是</translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation>否</translation>
+ </message>
+ <message>
+ <source>Context1</source>
+ <translation>上下文1</translation>
+ </message>
+ <message>
+ <source>Context2</source>
+ <translation>上下文2</translation>
+ </message>
+ <message>
+ <source>Context3</source>
+ <translation>上下文3</translation>
+ </message>
+ <message>
+ <source>Context4</source>
+ <translation>上下文4</translation>
+ </message>
+ <message>
+ <source>Call</source>
+ <translation>呼叫</translation>
+ </message>
+ <message>
+ <source>Hangup</source>
+ <translation>挂起</translation>
+ </message>
+ <message>
+ <source>Flip</source>
+ <translation>翻转</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>主页</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSlider</name>
+ <message>
+ <source>Page left</source>
+ <translation>左一页</translation>
+ </message>
+ <message>
+ <source>Page up</source>
+ <translation>上一页</translation>
+ </message>
+ <message>
+ <source>Position</source>
+ <translation>位置</translation>
+ </message>
+ <message>
+ <source>Page right</source>
+ <translation>右一页</translation>
+ </message>
+ <message>
+ <source>Page down</source>
+ <translation>下一页</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSocks5SocketEngine</name>
+ <message>
+ <source>Connection to proxy refused</source>
+ <translation>代理拒绝连接</translation>
+ </message>
+ <message>
+ <source>Connection to proxy closed prematurely</source>
+ <translation>代理连接过早关闭</translation>
+ </message>
+ <message>
+ <source>Proxy host not found</source>
+ <translation>代理主机未找到</translation>
+ </message>
+ <message>
+ <source>Connection to proxy timed out</source>
+ <translation>代理连接超时</translation>
+ </message>
+ <message>
+ <source>Proxy authentication failed</source>
+ <translation>代理认证失败</translation>
+ </message>
+ <message>
+ <source>Proxy authentication failed: %1</source>
+ <translation>代理认证失败: %1</translation>
+ </message>
+ <message>
+ <source>SOCKS version 5 protocol error</source>
+ <translation>SOCKS版本5协议错误</translation>
+ </message>
+ <message>
+ <source>General SOCKSv5 server failure</source>
+ <translation>常规服务器失败</translation>
+ </message>
+ <message>
+ <source>Connection not allowed by SOCKSv5 server</source>
+ <translation>连接不被SOCKSv5服务器允许</translation>
+ </message>
+ <message>
+ <source>TTL expired</source>
+ <translation>TTL已过期</translation>
+ </message>
+ <message>
+ <source>SOCKSv5 command not supported</source>
+ <translation>不支持的SOCKSv5命令</translation>
+ </message>
+ <message>
+ <source>Address type not supported</source>
+ <translation>不支持的地址类型</translation>
+ </message>
+ <message>
+ <source>Unknown SOCKSv5 proxy error code 0x%1</source>
+ <translation>未知SOCKSv5代理,错误代码 0x%1</translation>
+ </message>
+ <message>
+ <source>Network operation timed out</source>
+ <translation>网络操作超时</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSoftKeyManager</name>
+ <message>
+ <source>Ok</source>
+ <translation>确定</translation>
+ </message>
+ <message>
+ <source>Select</source>
+ <translation>选择</translation>
+ </message>
+ <message>
+ <source>Done</source>
+ <translation>完成</translation>
+ </message>
+ <message>
+ <source>Options</source>
+ <translation>选项</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>取消</translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation>退出</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSpinBox</name>
+ <message>
+ <source>More</source>
+ <translation>更多</translation>
+ </message>
+ <message>
+ <source>Less</source>
+ <translation>更少</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSql</name>
+ <message>
+ <source>Delete</source>
+ <translation>删除</translation>
+ </message>
+ <message>
+ <source>Delete this record?</source>
+ <translation>删除这条记录?</translation>
+ </message>
+ <message>
+ <source>Yes</source>
+ <translation>是</translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation>否</translation>
+ </message>
+ <message>
+ <source>Insert</source>
+ <translation>插入</translation>
+ </message>
+ <message>
+ <source>Update</source>
+ <translation>更新</translation>
+ </message>
+ <message>
+ <source>Save edits?</source>
+ <translation>保存编辑?</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>取消</translation>
+ </message>
+ <message>
+ <source>Confirm</source>
+ <translation>确认</translation>
+ </message>
+ <message>
+ <source>Cancel your edits?</source>
+ <translation>取消您的编辑?</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSslSocket</name>
+ <message>
+ <source>Unable to write data: %1</source>
+ <translation>不能写入数据:%1</translation>
+ </message>
+ <message>
+ <source>Unable to decrypt data: %1</source>
+ <translation>无法解密数据:%1</translation>
+ </message>
+ <message>
+ <source>Error while reading: %1</source>
+ <translation>读取时错误:%1</translation>
+ </message>
+ <message>
+ <source>Error during SSL handshake: %1</source>
+ <translation>SSL握手错误:%1</translation>
+ </message>
+ <message>
+ <source>Error creating SSL context (%1)</source>
+ <translation>创建SSL上下文错误(%1)</translation>
+ </message>
+ <message>
+ <source>Invalid or empty cipher list (%1)</source>
+ <translation>无效或者空白的密码列表(%1)</translation>
+ </message>
+ <message>
+ <source>Private key does not certify public key, %1</source>
+ <translation>私钥不能证明公钥,%1</translation>
+ </message>
+ <message>
+ <source>Error creating SSL session, %1</source>
+ <translation>创建SSL会话错误,%1</translation>
+ </message>
+ <message>
+ <source>Error creating SSL session: %1</source>
+ <translation>创建SSL会话错误:%1</translation>
+ </message>
+ <message>
+ <source>Cannot provide a certificate with no key, %1</source>
+ <translation>不能提供没有键的证书,%1</translation>
+ </message>
+ <message>
+ <source>Error loading local certificate, %1</source>
+ <translation>不能载入本地证书,%1</translation>
+ </message>
+ <message>
+ <source>Error loading private key, %1</source>
+ <translation>不能载入私有键,%1</translation>
+ </message>
+ <message>
+ <source>No error</source>
+ <translation>无错误</translation>
+ </message>
+ <message>
+ <source>The issuer certificate could not be found</source>
+ <translation>找不到发行人证书</translation>
+ </message>
+ <message>
+ <source>The certificate signature could not be decrypted</source>
+ <translation>证书签名无法解密</translation>
+ </message>
+ <message>
+ <source>The public key in the certificate could not be read</source>
+ <translation>无法读取证书中的公钥</translation>
+ </message>
+ <message>
+ <source>The signature of the certificate is invalid</source>
+ <translation>证书签名无效</translation>
+ </message>
+ <message>
+ <source>The certificate is not yet valid</source>
+ <translation>证书不再失效</translation>
+ </message>
+ <message>
+ <source>The certificate has expired</source>
+ <translation>证书已过期</translation>
+ </message>
+ <message>
+ <source>The certificate&apos;s notBefore field contains an invalid time</source>
+ <translation>证书的notBefore字段包含无效时间</translation>
+ </message>
+ <message>
+ <source>The certificate&apos;s notAfter field contains an invalid time</source>
+ <translation>证书的notAfter字段包含无效时间</translation>
+ </message>
+ <message>
+ <source>The certificate is self-signed, and untrusted</source>
+ <translation>证书为自签名,因而不受信任</translation>
+ </message>
+ <message>
+ <source>The root certificate of the certificate chain is self-signed, and untrusted</source>
+ <translation>证书链的根证书为自签名,因而不受信任</translation>
+ </message>
+ <message>
+ <source>The issuer certificate of a locally looked up certificate could not be found</source>
+ <translation>无法找到在本地查找的证书的发行人证书</translation>
+ </message>
+ <message>
+ <source>No certificates could be verified</source>
+ <translation>无证书可验证</translation>
+ </message>
+ <message>
+ <source>One of the CA certificates is invalid</source>
+ <translation>CA证书之一无效</translation>
+ </message>
+ <message>
+ <source>The basicConstraints path length parameter has been exceeded</source>
+ <translation>已超过basicConstraints路径长度参数</translation>
+ </message>
+ <message>
+ <source>The supplied certificate is unsuitable for this purpose</source>
+ <translation>提供的证书不适合此用途</translation>
+ </message>
+ <message>
+ <source>The root CA certificate is not trusted for this purpose</source>
+ <translation>此用途不信任根CA证书</translation>
+ </message>
+ <message>
+ <source>The root CA certificate is marked to reject the specified purpose</source>
+ <translation>已将根CA证书标记为拒绝用于指定用途</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>当前候选发行人证书被拒绝,因其持有人姓名与当前证书的发行人姓名不匹配</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>当前候选发行人证书被拒绝,因其发行人姓名和序列号虽存在,但与当前证书的权威密钥标识符不匹配</translation>
+ </message>
+ <message>
+ <source>The peer did not present any certificate</source>
+ <translation>对方没有提供任何证书</translation>
+ </message>
+ <message>
+ <source>The host name did not match any of the valid hosts for this certificate</source>
+ <translation>主机名与此证书的任何有效主机都不匹配</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>未知错误</translation>
+ </message>
+ </context>
+ <context>
+ <name>QStateMachine</name>
+ <message>
+ <source>Missing initial state in compound state &apos;%1&apos;</source>
+ <translation>复合状态“%1”缺少初始状态</translation>
+ </message>
+ <message>
+ <source>Missing default state in history state &apos;%1&apos;</source>
+ <translation>历史状态“%1”缺少预设状态</translation>
+ </message>
+ <message>
+ <source>No common ancestor for targets and source of transition from state &apos;%1&apos;</source>
+ <translation>从状态&quot;%1&quot;过渡,但源和目标无共同父辈</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>未知错误</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSystemSemaphore</name>
+ <message>
+ <source>%1: does not exist</source>
+ <translation>%1:不存在</translation>
+ </message>
+ <message>
+ <source>%1: out of resources</source>
+ <translation>%1:资源耗尽了</translation>
+ </message>
+ <message>
+ <source>%1: permission denied</source>
+ <translation>%1:权限被拒绝</translation>
+ </message>
+ <message>
+ <source>%1: already exists</source>
+ <translation>%1:已经存在</translation>
+ </message>
+ <message>
+ <source>%1: unknown error %2</source>
+ <translation>%1:未知错误 %2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QTDSDriver</name>
+ <message>
+ <source>Unable to open connection</source>
+ <translation>不能打开连接</translation>
+ </message>
+ <message>
+ <source>Unable to use database</source>
+ <translation>不能使用数据库</translation>
+ </message>
+ </context>
+ <context>
+ <name>QTabBar</name>
+ <message>
+ <source>Scroll Left</source>
+ <translation>向左滚动</translation>
+ </message>
+ <message>
+ <source>Scroll Right</source>
+ <translation>向右滚动</translation>
+ </message>
+ </context>
+ <context>
+ <name>QTcpServer</name>
+ <message>
+ <source>Operation on socket is not supported</source>
+ <translation>socket操作不被支持</translation>
+ </message>
+ </context>
+ <context>
+ <name>QTextControl</name>
+ <message>
+ <source>&amp;Undo</source>
+ <translation>撤消(&amp;U)</translation>
+ </message>
+ <message>
+ <source>&amp;Redo</source>
+ <translation>恢复(&amp;R)</translation>
+ </message>
+ <message>
+ <source>Cu&amp;t</source>
+ <translation>剪切(&amp;T)</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>复制(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Copy &amp;Link Location</source>
+ <translation>复制链接位置(&amp;L)</translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation>粘贴(&amp;P)</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>删除</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation>选择全部</translation>
+ </message>
+ </context>
+ <context>
+ <name>QToolButton</name>
+ <message>
+ <source>Press</source>
+ <translation>按下</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>打开</translation>
+ </message>
+ </context>
+ <context>
+ <name>QUdpSocket</name>
+ <message>
+ <source>This platform does not support IPv6</source>
+ <translation>这个平台不支持IPv6</translation>
+ </message>
+ </context>
+ <context>
+ <name>QUndoGroup</name>
+ <message>
+ <source>Undo</source>
+ <translation>撤销</translation>
+ </message>
+ <message>
+ <source>Redo</source>
+ <translation>恢复</translation>
+ </message>
+ </context>
+ <context>
+ <name>QUndoModel</name>
+ <message>
+ <source>&lt;empty&gt;</source>
+ <translation>&lt;空白&gt;</translation>
+ </message>
+ </context>
+ <context>
+ <name>QUndoStack</name>
+ <message>
+ <source>Undo</source>
+ <translation>撤销</translation>
+ </message>
+ <message>
+ <source>Redo</source>
+ <translation>恢复</translation>
+ </message>
+ </context>
+ <context>
+ <name>QUnicodeControlCharacterMenu</name>
+ <message>
+ <source>LRM Left-to-right mark</source>
+ <translation>LRM 从左到右标记</translation>
+ </message>
+ <message>
+ <source>RLM Right-to-left mark</source>
+ <translation>RLM 从右向左标记</translation>
+ </message>
+ <message>
+ <source>ZWJ Zero width joiner</source>
+ <translation>ZWJ 零宽度连接器</translation>
+ </message>
+ <message>
+ <source>ZWNJ Zero width non-joiner</source>
+ <translation>ZWNJ 零宽度非连接器</translation>
+ </message>
+ <message>
+ <source>ZWSP Zero width space</source>
+ <translation>ZWSP 零宽度空格</translation>
+ </message>
+ <message>
+ <source>LRE Start of left-to-right embedding</source>
+ <translation>LRE 开始从左到右嵌入</translation>
+ </message>
+ <message>
+ <source>RLE Start of right-to-left embedding</source>
+ <translation>RLE 开始从右向左嵌入</translation>
+ </message>
+ <message>
+ <source>LRO Start of left-to-right override</source>
+ <translation>LRO 开始从左向右覆盖</translation>
+ </message>
+ <message>
+ <source>RLO Start of right-to-left override</source>
+ <translation>RLO 开始从右向左覆盖</translation>
+ </message>
+ <message>
+ <source>PDF Pop directional formatting</source>
+ <translation>PDF 弹出方向格式</translation>
+ </message>
+ <message>
+ <source>Insert Unicode control character</source>
+ <translation>插入Unicode控制字符</translation>
+ </message>
+ </context>
+ <context>
+ <name>QWebFrame</name>
+ <message>
+ <source>Request cancelled</source>
+ <translation>请求被取消了</translation>
+ </message>
+ <message>
+ <source>Request blocked</source>
+ <translation>请求被阻塞了</translation>
+ </message>
+ <message>
+ <source>Cannot show URL</source>
+ <translation>无法显示 URL</translation>
+ </message>
+ <message>
+ <source>Frame load interrupted by policy change</source>
+ <translation>策略变化导致帧加载中断</translation>
+ </message>
+ <message>
+ <source>Cannot show mimetype</source>
+ <translation>无法显示 MIMETYPE</translation>
+ </message>
+ <message>
+ <source>File does not exist</source>
+ <translation>文件不存在</translation>
+ </message>
+ </context>
+ <context>
+ <name>QWebPage</name>
+ <message>
+ <source>Submit</source>
+ <comment>default label for Submit buttons in forms on web pages</comment>
+ <translation type="unfinished"></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 type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reset</source>
+ <comment>default label for Reset buttons in forms on web pages</comment>
+ <translation>重置</translation>
+ </message>
+ <message>
+ <source>Choose File</source>
+ <comment>title for file button used in HTML forms</comment>
+ <translation>选择文件</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>没有文件被选择</translation>
+ </message>
+ <message>
+ <source>Open in New Window</source>
+ <comment>Open in New Window context menu item</comment>
+ <translation>在新窗口中打开</translation>
+ </message>
+ <message>
+ <source>Save Link...</source>
+ <comment>Download Linked File context menu item</comment>
+ <translation>保存链接...</translation>
+ </message>
+ <message>
+ <source>Copy Link</source>
+ <comment>Copy Link context menu item</comment>
+ <translation>复制链接</translation>
+ </message>
+ <message>
+ <source>Open Image</source>
+ <comment>Open Image in New Window context menu item</comment>
+ <translation>打开图片</translation>
+ </message>
+ <message>
+ <source>Save Image</source>
+ <comment>Download Image context menu item</comment>
+ <translation>保存图片</translation>
+ </message>
+ <message>
+ <source>Copy Image</source>
+ <comment>Copy Link context menu item</comment>
+ <translation>复制图片</translation>
+ </message>
+ <message>
+ <source>Open Frame</source>
+ <comment>Open Frame in New Window context menu item</comment>
+ <translation>打开框架</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <comment>Copy context menu item</comment>
+ <translation>复制</translation>
+ </message>
+ <message>
+ <source>Go Back</source>
+ <comment>Back context menu item</comment>
+ <translation>后退</translation>
+ </message>
+ <message>
+ <source>Go Forward</source>
+ <comment>Forward context menu item</comment>
+ <translation>前进</translation>
+ </message>
+ <message>
+ <source>Stop</source>
+ <comment>Stop context menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reload</source>
+ <comment>Reload context menu item</comment>
+ <translation>重新载入</translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <comment>Cut context menu item</comment>
+ <translation>剪切</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <comment>Paste context menu item</comment>
+ <translation>粘贴</translation>
+ </message>
+ <message>
+ <source>No Guesses Found</source>
+ <comment>No Guesses Found context menu item</comment>
+ <translation>没有找到猜测</translation>
+ </message>
+ <message>
+ <source>Ignore</source>
+ <comment>Ignore Spelling context menu item</comment>
+ <translation>忽略</translation>
+ </message>
+ <message>
+ <source>Add To Dictionary</source>
+ <comment>Learn Spelling context menu item</comment>
+ <translation>添加到字典</translation>
+ </message>
+ <message>
+ <source>Search The Web</source>
+ <comment>Search The Web context menu item</comment>
+ <translation>搜索网页</translation>
+ </message>
+ <message>
+ <source>Look Up In Dictionary</source>
+ <comment>Look Up in Dictionary context menu item</comment>
+ <translation>在字典中查找</translation>
+ </message>
+ <message>
+ <source>Open Link</source>
+ <comment>Open Link context menu item</comment>
+ <translation>打开链接</translation>
+ </message>
+ <message>
+ <source>Ignore</source>
+ <comment>Ignore Grammar context menu item</comment>
+ <translation>忽略</translation>
+ </message>
+ <message>
+ <source>Spelling</source>
+ <comment>Spelling and Grammar context sub-menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show Spelling and Grammar</source>
+ <comment>menu item title</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hide Spelling and Grammar</source>
+ <comment>menu item title</comment>
+ <translation>隐藏拼写和语法</translation>
+ </message>
+ <message>
+ <source>Check Spelling</source>
+ <comment>Check spelling context menu item</comment>
+ <translation>检查拼写</translation>
+ </message>
+ <message>
+ <source>Check Spelling While Typing</source>
+ <comment>Check spelling while typing context menu item</comment>
+ <translation>在输入时检查拼写</translation>
+ </message>
+ <message>
+ <source>Check Grammar With Spelling</source>
+ <comment>Check grammar with spelling context menu item</comment>
+ <translation>检查语法和拼写</translation>
+ </message>
+ <message>
+ <source>Fonts</source>
+ <comment>Font context sub-menu item</comment>
+ <translation>字体</translation>
+ </message>
+ <message>
+ <source>Bold</source>
+ <comment>Bold context menu item</comment>
+ <translation>粗体</translation>
+ </message>
+ <message>
+ <source>Italic</source>
+ <comment>Italic context menu item</comment>
+ <translation>意大利体</translation>
+ </message>
+ <message>
+ <source>Underline</source>
+ <comment>Underline context menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Outline</source>
+ <comment>Outline context menu item</comment>
+ <translation>轮廓</translation>
+ </message>
+ <message>
+ <source>Direction</source>
+ <comment>Writing direction context sub-menu item</comment>
+ <translation>方向</translation>
+ </message>
+ <message>
+ <source>Text Direction</source>
+ <comment>Text direction context sub-menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Default</source>
+ <comment>Default writing direction context menu item</comment>
+ <translation>默认</translation>
+ </message>
+ <message>
+ <source>Left to Right</source>
+ <comment>Left to Right context menu item</comment>
+ <translation>左到右</translation>
+ </message>
+ <message>
+ <source>Right to Left</source>
+ <comment>Right to Left context menu item</comment>
+ <translation>右到左</translation>
+ </message>
+ <message>
+ <source>Loading...</source>
+ <comment>Media controller status message when the media is loading</comment>
+ <translation>正在加载...</translation>
+ </message>
+ <message>
+ <source>Live Broadcast</source>
+ <comment>Media controller status message when watching a live broadcast</comment>
+ <translation>手机广播</translation>
+ </message>
+ <message>
+ <source>Audio Element</source>
+ <comment>Media controller element</comment>
+ <translation>音频元素</translation>
+ </message>
+ <message>
+ <source>Video Element</source>
+ <comment>Media controller element</comment>
+ <translation>视频元素</translation>
+ </message>
+ <message>
+ <source>Mute Button</source>
+ <comment>Media controller element</comment>
+ <translation>静音按钮</translation>
+ </message>
+ <message>
+ <source>Unmute Button</source>
+ <comment>Media controller element</comment>
+ <translation>取消静音按钮</translation>
+ </message>
+ <message>
+ <source>Play Button</source>
+ <comment>Media controller element</comment>
+ <translation>播放按钮</translation>
+ </message>
+ <message>
+ <source>Pause Button</source>
+ <comment>Media controller element</comment>
+ <translation>暂停按钮</translation>
+ </message>
+ <message>
+ <source>Slider</source>
+ <comment>Media controller element</comment>
+ <translation>滑块</translation>
+ </message>
+ <message>
+ <source>Slider Thumb</source>
+ <comment>Media controller element</comment>
+ <translation>滑块微缩图像</translation>
+ </message>
+ <message>
+ <source>Rewind Button</source>
+ <comment>Media controller element</comment>
+ <translation>倒带按钮</translation>
+ </message>
+ <message>
+ <source>Return to Real-time Button</source>
+ <comment>Media controller element</comment>
+ <translation>返回到实时按钮</translation>
+ </message>
+ <message>
+ <source>Elapsed Time</source>
+ <comment>Media controller element</comment>
+ <translation>耗时</translation>
+ </message>
+ <message>
+ <source>Remaining Time</source>
+ <comment>Media controller element</comment>
+ <translation>剩余时间</translation>
+ </message>
+ <message>
+ <source>Status Display</source>
+ <comment>Media controller element</comment>
+ <translation>状态显示</translation>
+ </message>
+ <message>
+ <source>Fullscreen Button</source>
+ <comment>Media controller element</comment>
+ <translation>全屏按钮</translation>
+ </message>
+ <message>
+ <source>Seek Forward Button</source>
+ <comment>Media controller element</comment>
+ <translation>向前寻找按钮</translation>
+ </message>
+ <message>
+ <source>Seek Back Button</source>
+ <comment>Media controller element</comment>
+ <translation>向后寻找按钮</translation>
+ </message>
+ <message>
+ <source>Audio element playback controls and status display</source>
+ <comment>Media controller element</comment>
+ <translation>音频元素播放控件和状态显示</translation>
+ </message>
+ <message>
+ <source>Video element playback controls and status display</source>
+ <comment>Media controller element</comment>
+ <translation>视频元素播放控件和状态显示</translation>
+ </message>
+ <message>
+ <source>Mute audio tracks</source>
+ <comment>Media controller element</comment>
+ <translation>静音音轨</translation>
+ </message>
+ <message>
+ <source>Unmute audio tracks</source>
+ <comment>Media controller element</comment>
+ <translation>取消静音音轨</translation>
+ </message>
+ <message>
+ <source>Begin playback</source>
+ <comment>Media controller element</comment>
+ <translation>开始播放</translation>
+ </message>
+ <message>
+ <source>Pause playback</source>
+ <comment>Media controller element</comment>
+ <translation>暂停播放</translation>
+ </message>
+ <message>
+ <source>Movie time scrubber</source>
+ <comment>Media controller element</comment>
+ <translation>影片时间刷新器</translation>
+ </message>
+ <message>
+ <source>Movie time scrubber thumb</source>
+ <comment>Media controller element</comment>
+ <translation>影片时间刷新器微缩图像</translation>
+ </message>
+ <message>
+ <source>Rewind movie</source>
+ <comment>Media controller element</comment>
+ <translation>影片倒带</translation>
+ </message>
+ <message>
+ <source>Return streaming movie to real-time</source>
+ <comment>Media controller element</comment>
+ <translation>将流式影片返回到实时</translation>
+ </message>
+ <message>
+ <source>Current movie time</source>
+ <comment>Media controller element</comment>
+ <translation>当前影片时间</translation>
+ </message>
+ <message>
+ <source>Remaining movie time</source>
+ <comment>Media controller element</comment>
+ <translation>影片剩余时间</translation>
+ </message>
+ <message>
+ <source>Current movie status</source>
+ <comment>Media controller element</comment>
+ <translation>当前影片状态</translation>
+ </message>
+ <message>
+ <source>Play movie in full-screen mode</source>
+ <comment>Media controller element</comment>
+ <translation>以全屏模式播放影片</translation>
+ </message>
+ <message>
+ <source>Seek quickly back</source>
+ <comment>Media controller element</comment>
+ <translation>快速向后寻找</translation>
+ </message>
+ <message>
+ <source>Seek quickly forward</source>
+ <comment>Media controller element</comment>
+ <translation>快速向前寻找</translation>
+ </message>
+ <message>
+ <source>Indefinite time</source>
+ <comment>Media time description</comment>
+ <translation>不定时间</translation>
+ </message>
+ <message>
+ <source>%1 days %2 hours %3 minutes %4 seconds</source>
+ <comment>Media time description</comment>
+ <translation>%1天%2小时%3分%4秒</translation>
+ </message>
+ <message>
+ <source>%1 hours %2 minutes %3 seconds</source>
+ <comment>Media time description</comment>
+ <translation>%1小时%2分%3秒</translation>
+ </message>
+ <message>
+ <source>%1 minutes %2 seconds</source>
+ <comment>Media time description</comment>
+ <translation>%1分%2秒</translation>
+ </message>
+ <message>
+ <source>%1 seconds</source>
+ <comment>Media time description</comment>
+ <translation>%1秒</translation>
+ </message>
+ <message>
+ <source>Inspect</source>
+ <comment>Inspect Element context menu item</comment>
+ <translation>检查</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>没有最近的搜索</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>最近的搜索</translation>
+ </message>
+ <message>
+ <source>Clear recent searches</source>
+ <comment>menu item in Recent Searches menu that empties menu&apos;s contents</comment>
+ <translation>清除最近的搜索</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <comment>Unknown filesize FTP directory listing item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Web Inspector - %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 (%2x%3 pixels)</source>
+ <comment>Title string for images</comment>
+ <translation>%1 (%2x%3 像素)</translation>
+ </message>
+ <message>
+ <source>Bad HTTP request</source>
+ <translation>错误的 HTTP 请求</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 type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scroll here</source>
+ <translation>滚动到这里</translation>
+ </message>
+ <message>
+ <source>Left edge</source>
+ <translation>左边缘</translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Right edge</source>
+ <translation>右边缘</translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <translation>底部</translation>
+ </message>
+ <message>
+ <source>Page left</source>
+ <translation>左一页</translation>
+ </message>
+ <message>
+ <source>Page up</source>
+ <translation>上一页</translation>
+ </message>
+ <message>
+ <source>Page right</source>
+ <translation>右一页</translation>
+ </message>
+ <message>
+ <source>Page down</source>
+ <translation>下一页</translation>
+ </message>
+ <message>
+ <source>Scroll left</source>
+ <translation>向左滚动</translation>
+ </message>
+ <message>
+ <source>Scroll up</source>
+ <translation>向上滚动</translation>
+ </message>
+ <message>
+ <source>Scroll right</source>
+ <translation>向右滚动</translation>
+ </message>
+ <message>
+ <source>Scroll down</source>
+ <translation>向下滚动</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n file(s)</source>
+ <comment>number of chosen file</comment>
+ <translation>
+ <numerusform>%n 个文件</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>JavaScript Alert - %1</source>
+ <translation>JavaScript警告 - %1</translation>
+ </message>
+ <message>
+ <source>JavaScript Confirm - %1</source>
+ <translation>JavaScript确认 - %1</translation>
+ </message>
+ <message>
+ <source>JavaScript Prompt - %1</source>
+ <translation>JavaScript提示 - %1</translation>
+ </message>
+ <message>
+ <source>JavaScript Problem - %1</source>
+ <translation>JavaScript问题 - %1</translation>
+ </message>
+ <message>
+ <source>The script on this page appears to have a problem. Do you want to stop the script?</source>
+ <translation>此页上的脚本似乎有问题。是否停止脚本?</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the next character</source>
+ <translation>移动光标到下一个字符</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the previous character</source>
+ <translation>移动光标到上一个字符</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the next word</source>
+ <translation>移动光标到下一个单词</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the previous word</source>
+ <translation>移动光标到上一个单词</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the next line</source>
+ <translation>移动光标到下一行</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the previous line</source>
+ <translation>移动光标到上一行</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the start of the line</source>
+ <translation>移动光标到行首</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the end of the line</source>
+ <translation>移动光标到行尾</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the start of the block</source>
+ <translation>移动光标到块首</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the end of the block</source>
+ <translation>移动光标到块尾</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the start of the document</source>
+ <translation>移动光标到文件开头</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the end of the document</source>
+ <translation>移动光标到文件末尾</translation>
+ </message>
+ <message>
+ <source>Select all</source>
+ <translation>全选</translation>
+ </message>
+ <message>
+ <source>Select to the next character</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the previous character</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the next word</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the previous word</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the next line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the previous line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the start of the line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the end of the line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the start of the block</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the end of the block</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the start of the document</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the end of the document</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete to the start of the word</source>
+ <translation>删除到单词首</translation>
+ </message>
+ <message>
+ <source>Delete to the end of the word</source>
+ <translation>删除到单词尾</translation>
+ </message>
+ <message>
+ <source>Insert a new paragraph</source>
+ <translation>插入新段落</translation>
+ </message>
+ <message>
+ <source>Insert a new line</source>
+ <translation>插入新行</translation>
+ </message>
+ <message>
+ <source>Paste and Match Style</source>
+ <translation>粘贴和匹配样式</translation>
+ </message>
+ <message>
+ <source>Remove formatting</source>
+ <translation>删除格式设置</translation>
+ </message>
+ <message>
+ <source>Strikethrough</source>
+ <translation>删除线</translation>
+ </message>
+ <message>
+ <source>Subscript</source>
+ <translation>下标</translation>
+ </message>
+ <message>
+ <source>Superscript</source>
+ <translation>上标</translation>
+ </message>
+ <message>
+ <source>Insert Bulleted List</source>
+ <translation>插入项目符号列表</translation>
+ </message>
+ <message>
+ <source>Insert Numbered List</source>
+ <translation>插入编号列表</translation>
+ </message>
+ <message>
+ <source>Indent</source>
+ <translation>缩进</translation>
+ </message>
+ <message>
+ <source>Outdent</source>
+ <translation>凸出</translation>
+ </message>
+ <message>
+ <source>Center</source>
+ <translation>中心</translation>
+ </message>
+ <message>
+ <source>Justify</source>
+ <translation>调整</translation>
+ </message>
+ <message>
+ <source>Align Left</source>
+ <translation>左对齐</translation>
+ </message>
+ <message>
+ <source>Align Right</source>
+ <translation>右对齐</translation>
+ </message>
+ </context>
+ <context>
+ <name>QWhatsThisAction</name>
+ <message>
+ <source>What&apos;s This?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QWidget</name>
+ <message>
+ <source>*</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QWizard</name>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt; &amp;Back</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>
+ <message>
+ <source>Go Back</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Commit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Done</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Next &gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QWorkspace</name>
+ <message>
+ <source>&amp;Restore</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mi&amp;nimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ma&amp;ximize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Stay on &amp;Top</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>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sh&amp;ade</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 - [%2]</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Unshade</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QXml</name>
+ <message>
+ <source>no error occurred</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error triggered by consumer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>unexpected end of file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>more than one document type definition</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error occurred while parsing element</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>tag mismatch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error occurred while parsing content</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>unexpected character</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>invalid name for processing instruction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>version expected while reading the XML declaration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>wrong value for standalone declaration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error occurred while parsing document type definition</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>letter is expected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error occurred while parsing comment</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error occurred while parsing reference</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>internal general entity reference not allowed in DTD</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>external parsed general entity reference not allowed in attribute value</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>external parsed general entity reference not allowed in DTD</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>unparsed entity reference in wrong context</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>recursive entities</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error in the text declaration of an external entity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>encoding declaration or standalone declaration expected while reading the XML declaration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>standalone declaration expected while reading the XML declaration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QXmlPatternistCLI</name>
+ <message>
+ <source>Warning in %1, at line %2, column %3: %4</source>
+ <translation>%1中出现警告,位于%2行,%3列:%4</translation>
+ </message>
+ <message>
+ <source>Warning in %1: %2</source>
+ <translation>%1中出现警告:%2</translation>
+ </message>
+ <message>
+ <source>Unknown location</source>
+ <translation>未知位置</translation>
+ </message>
+ <message>
+ <source>Error %1 in %2, at line %3, column %4: %5</source>
+ <translation>%2中存在错误%1,位于%3行,%4列:%5</translation>
+ </message>
+ <message>
+ <source>Error %1 in %2: %3</source>
+ <translation>%2中存在错误%1:%3</translation>
+ </message>
+ </context>
+ <context>
+ <name>QXmlStream</name>
+ <message>
+ <source>Extra content at end of document.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid entity value.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid XML character.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sequence &apos;]]&gt;&apos; not allowed in content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Namespace prefix &apos;%1&apos; not declared</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute redefined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unexpected character &apos;%1&apos; in public id literal.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid XML version string.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsupported XML version.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 is an invalid encoding name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encoding %1 is unsupported</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Standalone accepts only yes or no.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid attribute in XML declaration.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Premature end of document.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid document.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Expected </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>, but got &apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unexpected &apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Expected character data.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Recursive entity detected.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start tag expected.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>XML declaration not at start of document.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>NDATA in parameter entity declaration.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 is an invalid processing instruction name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid processing instruction name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Illegal namespace declaration.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid XML name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opening and ending tag mismatch.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reference to unparsed entity &apos;%1&apos;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Entity &apos;%1&apos; not declared.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reference to external entity &apos;%1&apos; in attribute value.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid character reference.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encountered incorrectly encoded content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The standalone pseudo attribute must appear after the encoding.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 is an invalid PUBLIC identifier.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QtXmlPatterns</name>
+ <message>
+ <source>At least one component must be present.</source>
+ <translation>至少有一个组件被呈现。</translation>
+ </message>
+ <message>
+ <source>%1 is not a valid value of type %2.</source>
+ <translation>%1 不是类型为 %2 的有效值。</translation>
+ </message>
+ <message>
+ <source>When casting to %1 from %2, the source value cannot be %3.</source>
+ <translation>当从 %2 抛出到 %1 时,源值不能是 %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)不能被用于计算一个包含两个或者更多原子值的序列。</translation>
+ </message>
+ <message>
+ <source>The data of a processing instruction cannot contain the string %1</source>
+ <translation>处理指令的数据不能包含字符串 %1</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid %2</source>
+ <translation>%1 是一个无效的 %2。</translation>
+ </message>
+ <message>
+ <source>%1 is not a valid XML 1.0 character.</source>
+ <translation>%1 不是一个有效的 XML 1.0 字符。</translation>
+ </message>
+ <message>
+ <source>%1 was called.</source>
+ <translation>%1 被调用了。</translation>
+ </message>
+ <message>
+ <source>In the replacement string, %1 must be followed by at least one digit when not escaped.</source>
+ <translation>在这个替换字符串中,%1 在没有被转义的时候必须被至少一个数字跟随。</translation>
+ </message>
+ <message>
+ <source>In the replacement string, %1 can only be used to escape itself or %2, not %3</source>
+ <translation>在这个替换字符串中,%1 只能被用于转义它本身或者 %2,而不是 %3</translation>
+ </message>
+ <message>
+ <source>%1 matches newline characters</source>
+ <translation>%1 匹配了换行符</translation>
+ </message>
+ <message>
+ <source>Matches are case insensitive</source>
+ <translation>匹配是大小写不敏感的</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid regular expression pattern: %2</source>
+ <translation>%1 是正则表达式中的一个无效模式:%2</translation>
+ </message>
+ <message>
+ <source>It will not be possible to retrieve %1.</source>
+ <translation>将不能获取 %1。</translation>
+ </message>
+ <message>
+ <source>The default collection is undefined</source>
+ <translation>默认收集(collection)是未定义的</translation>
+ </message>
+ <message>
+ <source>%1 cannot be retrieved</source>
+ <translation>无法获取 %1</translation>
+ </message>
+ <message>
+ <source>The item %1 did not match the required type %2.</source>
+ <translation>项 %1 和所需的类型 %2 不匹配。</translation>
+ </message>
+ <message>
+ <source>%1 is an unknown schema type.</source>
+ <translation>%1 是一个未知的方案类型。</translation>
+ </message>
+ <message>
+ <source>A template with name %1 has already been declared.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Only one %1 declaration can occur in the query prolog.</source>
+ <translation>只有一个 %1 的声明可以出现在查询序言中。</translation>
+ </message>
+ <message>
+ <source>The initialization of variable %1 depends on itself</source>
+ <translation>变量 %1 的初始化依赖于它本身</translation>
+ </message>
+ <message>
+ <source>The variable %1 is unused</source>
+ <translation>变量 %1 没有被使用</translation>
+ </message>
+ <message>
+ <source>Version %1 is not supported. The supported XQuery version is 1.0.</source>
+ <translation>不支持版本 %1。被支持的 XQuery 版本是 1.0。</translation>
+ </message>
+ <message>
+ <source>No function with signature %1 is available</source>
+ <translation>没有签名为 %1 的可用函数。</translation>
+ </message>
+ <message>
+ <source>It is not possible to redeclare prefix %1.</source>
+ <translation>不能重复声明前缀 %1。</translation>
+ </message>
+ <message>
+ <source>Prefix %1 is already declared in the prolog.</source>
+ <translation>前缀 %1 在序言中已经声明过了。</translation>
+ </message>
+ <message>
+ <source>The name of an option must have a prefix. There is no default namespace for options.</source>
+ <translation>一个选项的名称必须带有前缀。对于选项没有默认命名空间。</translation>
+ </message>
+ <message>
+ <source>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</source>
+ <translation>不支持方案导入(Schema Import)特性,并且因此 %1 声明不能出现。</translation>
+ </message>
+ <message>
+ <source>The target namespace of a %1 cannot be empty.</source>
+ <translation>%1 的目标命名空间不能为空。</translation>
+ </message>
+ <message>
+ <source>The module import feature is not supported</source>
+ <translation>不支持模块导入特性</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>用户在一个库模块中定义的函数的命名空间必须和这个模块的命名空间一致。也就是说,它应该是 %1,而不是 %2</translation>
+ </message>
+ <message>
+ <source>A function already exists with the signature %1.</source>
+ <translation>一个带有签名 %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>不支持外部函数。所有支持的函数必须可以被直接使用,不能把它们声明为外部的</translation>
+ </message>
+ <message>
+ <source>The %1-axis is unsupported in XQuery</source>
+ <translation>这个 %1 轴在 XQuery 中是不被支持的。</translation>
+ </message>
+ <message>
+ <source>The namespace URI cannot be the empty string when binding to a prefix, %1.</source>
+ <translation>当这个命名空间 URI 被绑定到一个前缀 %1 时,它不能是空字符串。</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid namespace URI.</source>
+ <translation>%1 是一个无效的命名空间 URI。</translation>
+ </message>
+ <message>
+ <source>It is not possible to bind to the prefix %1</source>
+ <translation>无法绑定到这个前缀 %1。</translation>
+ </message>
+ <message>
+ <source>Two namespace declaration attributes have the same name: %1.</source>
+ <translation>两个命名空间声明属性使用了相同的名称:%1。</translation>
+ </message>
+ <message>
+ <source>The namespace URI must be a constant and cannot use enclosed expressions.</source>
+ <translation>命名空间 URI 必须是一个常量并且不能使用封闭的表达式。</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 不是范围内属性声明。注意方案导入特性是不被支持的。</translation>
+ </message>
+ <message>
+ <source>empty</source>
+ <translation>空白</translation>
+ </message>
+ <message>
+ <source>zero or one</source>
+ <translation>零或者一</translation>
+ </message>
+ <message>
+ <source>exactly one</source>
+ <translation>确切地一</translation>
+ </message>
+ <message>
+ <source>one or more</source>
+ <translation>一或者更多</translation>
+ </message>
+ <message>
+ <source>zero or more</source>
+ <translation>零或者更多</translation>
+ </message>
+ <message>
+ <source>The focus is undefined.</source>
+ <translation>焦点未定义。</translation>
+ </message>
+ <message>
+ <source>An attribute by name %1 has already been created.</source>
+ <translation>一个名称为 %1 的属性已经被创建。</translation>
+ </message>
+ <message>
+ <source>Network timeout.</source>
+ <translation>网络超时。</translation>
+ </message>
+ <message>
+ <source>Element %1 can&apos;t be serialized because it appears outside the document element.</source>
+ <translation>元素 %1 不能被串行化,因为它出现在文档元素之外。</translation>
+ </message>
+ <message>
+ <source>Year %1 is invalid because it begins with %2.</source>
+ <translation>%1 年是无效的,因为应该从 %2 开始。</translation>
+ </message>
+ <message>
+ <source>Day %1 is outside the range %2..%3.</source>
+ <translation>%1 日是在 %2...%3 范围之外的。</translation>
+ </message>
+ <message>
+ <source>Month %1 is outside the range %2..%3.</source>
+ <translation>%1 月是在 %2...%3 范围之外的。</translation>
+ </message>
+ <message>
+ <source>Overflow: Can&apos;t represent date %1.</source>
+ <translation>溢出:无法呈现数据 %1。</translation>
+ </message>
+ <message>
+ <source>Day %1 is invalid for month %2.</source>
+ <translation>%1 日对于 %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>时间 24:%1:%2.%3 是无效的。小时是 24,但是分钟、秒和毫秒不全为 0; </translation>
+ </message>
+ <message>
+ <source>Time %1:%2:%3.%4 is invalid.</source>
+ <translation>时间 %1:%2:%3.%4 是无效的。</translation>
+ </message>
+ <message>
+ <source>Overflow: Date can&apos;t be represented.</source>
+ <translation>溢出:数据无法被呈现。</translation>
+ </message>
+ <message>
+ <source>At least one time component must appear after the %1-delimiter.</source>
+ <translation>至少一个时间组件必须出现在这个 %1 界限之后。</translation>
+ </message>
+ <message>
+ <source>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</source>
+ <translation>一个类型为 %1 的值除以 %2(不是一个数值)是不允许的。</translation>
+ </message>
+ <message>
+ <source>Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed.</source>
+ <translation>一个类型为 %1 的值除以 %2 或者 %3(正负零)是不允许的。</translation>
+ </message>
+ <message>
+ <source>Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed.</source>
+ <translation>一个类型为 %1 的值乘以 %2 或者 %3(正负无穷)是不允许的。</translation>
+ </message>
+ <message>
+ <source>A value of type %1 cannot have an Effective Boolean Value.</source>
+ <translation>一个类型为 %1 的值不能是一个有效的布尔值(Effective Boolean Value)。</translation>
+ </message>
+ <message>
+ <source>Value %1 of type %2 exceeds maximum (%3).</source>
+ <translation>类型为 %2 的值 %1 超过了最大值(%3)。</translation>
+ </message>
+ <message>
+ <source>Value %1 of type %2 is below minimum (%3).</source>
+ <translation>类型为 %2 的值 %1 超过了最小值(%3)。</translation>
+ </message>
+ <message>
+ <source>A value of type %1 must contain an even number of digits. The value %2 does not.</source>
+ <translation>类型为 %1 的值必须包含偶数个数字。值 %2 不是这样的。</translation>
+ </message>
+ <message>
+ <source>%1 is not valid as a value of type %2.</source>
+ <translation>%1 不是类型为 %2 的有效值。</translation>
+ </message>
+ <message>
+ <source>Operator %1 cannot be used on type %2.</source>
+ <translation>操作符 %1 不能被用于类型 %2。</translation>
+ </message>
+ <message>
+ <source>Operator %1 cannot be used on atomic values of type %2 and %3.</source>
+ <translation>操作符 %1 不能被用于类型为 %2 和 %3 的原子值。</translation>
+ </message>
+ <message>
+ <source>The namespace URI in the name for a computed attribute cannot be %1.</source>
+ <translation>一个被计算的属性的名称中的命名空间 URI 不能是 %1。</translation>
+ </message>
+ <message>
+ <source>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</source>
+ <translation>一个被计算的属性的名称不能使用带有本地名称 %2 的命名空间 URI %1。</translation>
+ </message>
+ <message>
+ <source>Type error in cast, expected %1, received %2.</source>
+ <translation>抛出类型错误,期望的是 %1,收到的是 %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>当抛出到 %1 或者它的派生类时,源类型必须是同一类型,或者它必须是一个字符串类型。类型 %2 是不被允许的。</translation>
+ </message>
+ <message>
+ <source>A comment cannot contain %1</source>
+ <translation>注释不能包含 %1</translation>
+ </message>
+ <message>
+ <source>A comment cannot end with a %1.</source>
+ <translation>注释不能以 %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>一个属性节点不能是一个文档节点的子节点。因此,这个属性 %1 所在位置是不合适的。</translation>
+ </message>
+ <message>
+ <source>A library module cannot be evaluated directly. It must be imported from a main module.</source>
+ <translation>一个库模块不能被直接评估。它必须从一个主模块中导入。</translation>
+ </message>
+ <message>
+ <source>No template by name %1 exists.</source>
+ <translation>没有名为 %1 的模板存在。</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>类型为 %1 的值不能被判断。一个判断必须是数值类型或者一个有效的布尔值(Effective Boolean Value)类型。</translation>
+ </message>
+ <message>
+ <source>A positional predicate must evaluate to a single numeric value.</source>
+ <translation>一个定位判断必须评估一个单一数值。</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>一个处理指令中的目标名称不能是任何大小写混合的 %1。因此,%2 是无效的。</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 不是处理指令的有效目标名称。它必须是值 %2,例如 %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>一个路径中的最后一步必须包含节点或者原子值。它不能是两者的一个组合。</translation>
+ </message>
+ <message>
+ <source>No namespace binding exists for the prefix %1</source>
+ <translation>对于前缀 %1,没有存在绑定的命名空间。</translation>
+ </message>
+ <message>
+ <source>No namespace binding exists for the prefix %1 in %2</source>
+ <translation>对于 %2 中的前缀 %1,没有存在绑定的命名空间。</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>%1 的第一个参数不能是类型 %2 的。它必须是数字类型的,xs:yearMonthDuration 或者 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>%1 的第一个参数不能是类型 %2 的。它必须是类型 %3、%4 或者 %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>%1 的第二个参数不能是类型 %2 的。它必须是类型 %3、%4 或者 %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>如果两个值都有区偏移(zone offset),它们必须拥有相同的区偏移。%1 和 %2 的区偏移是不同的。</translation>
+ </message>
+ <message>
+ <source>%1 must be followed by %2 or %3, not at the end of the replacement string.</source>
+ <translation>%1 必须被 %2 或者 %3 跟随,不能在替换字符串的末尾。</translation>
+ </message>
+ <message>
+ <source>%1 and %2 match the start and end of a line.</source>
+ <translation>%1 和 %2 匹配了一行的头和尾。</translation>
+ </message>
+ <message>
+ <source>Whitespace characters are removed, except when they appear in character classes</source>
+ <translation>空白字符被移除了,除非当它们出现在字符类中</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid flag for regular expressions. Valid flags are:</source>
+ <translation>%1 是正则表达式中的一个无效标记。有效标记为:</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>如果第一个参数是空序列或者零长度字符串(无命名空间),那么就不能指定前缀。前缀 %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>不支持正规化(normalization)表单 %1。被支持的表单是 %2、%3、%4 和 %5,以及无,例如空字符串(无正规化)。</translation>
+ </message>
+ <message>
+ <source>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</source>
+ <translation>区偏移(zone offset)必须在 %1...%2 范围之内。%3 是在范围之外的。</translation>
+ </message>
+ <message>
+ <source>Required cardinality is %1; got cardinality %2.</source>
+ <translation>所需要的表间关系是 %1;得到的表间关系却是 %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>编码方式 %1 是无效的。它必须只包含拉丁字符,必须不包含空白符号,并且必须和正则表达式 %2 匹配。</translation>
+ </message>
+ <message>
+ <source>The keyword %1 cannot occur with any other mode name.</source>
+ <translation>任何其他模式名称不能出现关键字%1。</translation>
+ </message>
+ <message>
+ <source>No variable with name %1 exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The value of attribute %1 must be of type %2, which %3 isn&apos;t.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The prefix %1 cannot be bound. By default, it is already bound to the namespace %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A variable with name %1 has already been declared.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No value is available for the external variable with name %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A stylesheet function must have a prefixed name.</source>
+ <translation>样式表函数必须有一个前缀名。</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>命名空间 %1 是保留的;因此用户定义的函数不能使用它。请试试预定义的前缀 %2,它就是用于这种情况的。</translation>
+ </message>
+ <message>
+ <source>An argument with name %1 has already been declared. Every argument name must be unique.</source>
+ <translation type="unfinished"></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>当函数%1被用于样式匹配时,参数必须是变量参考或者字符串。</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>在XSL-T样式中,函数%1的第一个参数必须是字符串,以便用于匹配。</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>在XSL-T样式中,函数%1的第一个参数必须是文字或者变量参考,以便用于匹配。</translation>
+ </message>
+ <message>
+ <source>In an XSL-T pattern, function %1 cannot have a third argument.</source>
+ <translation>在XSL-T样式中,函数%1不能有第三个参数。</translation>
+ </message>
+ <message>
+ <source>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</source>
+ <translation>在XSL-T样式中,只用函数%1和%2可以用于匹配,%3不可以。</translation>
+ </message>
+ <message>
+ <source>In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can.</source>
+ <translation>在XSL-T仰视中,不能使用%1轴,只能使用%2轴或者%3轴。</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid template mode name.</source>
+ <translation>%1不是一个合法的模板模式名称。</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>一个在 for 表达式中绑定的变量的名称必须和这个定位变量不同。因此,这两个名称为 %1 的变量冲突。</translation>
+ </message>
+ <message>
+ <source>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</source>
+ <translation>不支持方案验证特性(Schema Validation Feature)。因此,也许不能使用 %1 表达式。</translation>
+ </message>
+ <message>
+ <source>None of the pragma expressions are supported. Therefore, a fallback expression must be present</source>
+ <translation>不支持任何编译指示表达式(pragma expression)。因此,必须呈现一个回调表达式(fallback expression)。</translation>
+ </message>
+ <message>
+ <source>Each name of a template parameter must be unique; %1 is duplicated.</source>
+ <translation>每一个模板参数的名称都必须是唯一的;%2是重复的。</translation>
+ </message>
+ <message>
+ <source>No function with name %1 is available.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 is not a valid numeric literal.</source>
+ <translation>%1 不是一个有效的数字语义。</translation>
+ </message>
+ <message>
+ <source>W3C XML Schema identity constraint selector</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>W3C XML Schema identity constraint field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A construct was encountered which is disallowed in the current language(%1).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
+ <translation>命名空间 %1 只能和 %2 绑定(并且如果是这种情况,需要提前声明)。</translation>
+ </message>
+ <message>
+ <source>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
+ <translation>前缀 %1 只能和 %2 绑定(并且如果是这种情况,需要提前声明)。</translation>
+ </message>
+ <message>
+ <source>An attribute with name %1 has already appeared on this element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A direct element constructor is not well-formed. %1 is ended with %2.</source>
+ <translation>一个直接元素构造器没有很好地形成。%1 后面跟着 %2。</translation>
+ </message>
+ <message>
+ <source>The name %1 does not refer to any schema type.</source>
+ <translation>名称 %1 没有指向任何方案类型。</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 是一个复杂类型。无法抛出到复杂类型。因此,抛出到例如 %2 这样的原子类型是可以的。</translation>
+ </message>
+ <message>
+ <source>%1 is not an atomic type. Casting is only possible to atomic types.</source>
+ <translation>%1 不是原子类型。只能抛出到原子类型。</translation>
+ </message>
+ <message>
+ <source>%1 is not a valid name for a processing-instruction.</source>
+ <translation>%1不是一个处理指令的合法名称。</translation>
+ </message>
+ <message>
+ <source>The name of an extension expression must be in a namespace.</source>
+ <translation>一个扩展表达式的名称必须在一个命名空间中。</translation>
+ </message>
+ <message>
+ <source>Required type is %1, but %2 was found.</source>
+ <translation>需要的类型是 %1,但是找到的是 %2。</translation>
+ </message>
+ <message>
+ <source>Promoting %1 to %2 may cause loss of precision.</source>
+ <translation>把 %1 升级为 %2 会导致精度的损失。</translation>
+ </message>
+ <message>
+ <source>It&apos;s not possible to add attributes after any other kind of node.</source>
+ <translation>不能在任何其它类型节点后添加属性。</translation>
+ </message>
+ <message>
+ <source>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</source>
+ <translation>只支持 Unicode 代码点校验(Unicode Codepoint Collation)(%1)。%2 是不被支持的。</translation>
+ </message>
+ <message>
+ <source>Integer division (%1) by zero (%2) is undefined.</source>
+ <translation>整数除法(%1)除零(%2)是未定义的。</translation>
+ </message>
+ <message>
+ <source>Division (%1) by zero (%2) is undefined.</source>
+ <translation>除法(%1)除零(%2)是未定义的。</translation>
+ </message>
+ <message>
+ <source>Modulus division (%1) by zero (%2) is undefined.</source>
+ <translation>求模除法(%1)除零(%2)是未定义的。</translation>
+ </message>
+ <message numerus="yes">
+ <source>%1 takes at most %n argument(s). %2 is therefore invalid.</source>
+ <translation>
+ <numerusform>%1 最多可以有 %n 个参数。因此 %2 是无效的。</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%1 requires at least %n argument(s). %2 is therefore invalid.</source>
+ <translation>
+ <numerusform>%1 需要至少 %n 个参数。因此 %2 是无效的。</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>函数 %1 的第二个参数的根节点必须是一个文档节点。%2 不是一个文档节点。</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>用户定义函数的名字空间不能为空(试用为这种情况而存在的预定义前缀%1)</translation>
+ </message>
+ <message>
+ <source>A default namespace declaration must occur before function, variable, and option declarations.</source>
+ <translation>默认命名空间声明必须出现在函数、变量和选项声明之前。</translation>
+ </message>
+ <message>
+ <source>Namespace declarations must occur before function, variable, and option declarations.</source>
+ <translation>命名空间声明必须出现在函数、变量和选项声明之前。</translation>
+ </message>
+ <message>
+ <source>Module imports must occur before function, variable, and option declarations.</source>
+ <translation>模块导入不能出现在函数、变量和选项声明之前。</translation>
+ </message>
+ <message>
+ <source>%1 is not a whole number of minutes.</source>
+ <translation>%1 不是分钟的整数。</translation>
+ </message>
+ <message>
+ <source>Attribute %1 can&apos;t be serialized because it appears at the top level.</source>
+ <translation>属性 %1 不能被串行化,因为它出现在最顶层。</translation>
+ </message>
+ <message>
+ <source>%1 is an unsupported encoding.</source>
+ <translation> %1 是不被支持的编码。</translation>
+ </message>
+ <message>
+ <source>%1 contains octets which are disallowed in the requested encoding %2.</source>
+ <translation>%1包含了在请求编码%2中不允许的八进位值。</translation>
+ </message>
+ <message>
+ <source>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</source>
+ <translation>在使用编码%3的%2中出现的代码点%1不是一个有效的XML字符。</translation>
+ </message>
+ <message>
+ <source>Ambiguous rule match.</source>
+ <translation>含糊规则匹配。</translation>
+ </message>
+ <message>
+ <source>In a namespace constructor, the value for a namespace cannot be an empty string.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The prefix must be a valid %1, which %2 is not.</source>
+ <translation>前缀必须是有效的%1,而%2不是。</translation>
+ </message>
+ <message>
+ <source>The prefix %1 cannot be bound.</source>
+ <translation>前缀%1不能被绑定。</translation>
+ </message>
+ <message>
+ <source>Only the prefix %1 can be bound to %2 and vice versa.</source>
+ <translation>只有前缀%1可以绑定到%2,反之也一样</translation>
+ </message>
+ <message>
+ <source>The parameter %1 is required, but no corresponding %2 is supplied.</source>
+ <translation>需要参数%1,但是没有提供对应的%2。</translation>
+ </message>
+ <message>
+ <source>The parameter %1 is passed, but no corresponding %2 exists.</source>
+ <translation>参数%1已传递,但没有相应的%2存在。</translation>
+ </message>
+ <message>
+ <source>The URI cannot have a fragment</source>
+ <translation>URI不能有片段</translation>
+ </message>
+ <message>
+ <source>Element %1 is not allowed at this location.</source>
+ <translation>元素%1不能在这个位置。</translation>
+ </message>
+ <message>
+ <source>Text nodes are not allowed at this location.</source>
+ <translation>文本节点不能在这个位置。</translation>
+ </message>
+ <message>
+ <source>Parse error: %1</source>
+ <translation>解析错误:%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>XSL-T版本属性的值必须是%1类型的值,而%2不是。</translation>
+ </message>
+ <message>
+ <source>Running an XSL-T 1.0 stylesheet with a 2.0 processor.</source>
+ <translation>在XSL-T 2.0处理器中运行一个1.0的样式表。</translation>
+ </message>
+ <message>
+ <source>Unknown XSL-T attribute %1.</source>
+ <translation>未知的XSL-T属性%1。</translation>
+ </message>
+ <message>
+ <source>Attribute %1 and %2 are mutually exclusive.</source>
+ <translation>属性%1和%2彼此互斥。</translation>
+ </message>
+ <message>
+ <source>In a simplified stylesheet module, attribute %1 must be present.</source>
+ <translation>在一个简化样式表模块中,属性%1必须存在。</translation>
+ </message>
+ <message>
+ <source>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</source>
+ <translation>如果元素%1没有属性%2,那么它也不能有属性%3或者%4。</translation>
+ </message>
+ <message>
+ <source>Element %1 must have at least one of the attributes %2 or %3.</source>
+ <translation>元素%1必须至少有属性%2或者%3其中一个。</translation>
+ </message>
+ <message>
+ <source>At least one mode must be specified in the %1-attribute on element %2.</source>
+ <translation>在元素%2的%1属性中至少要指定一个模式。</translation>
+ </message>
+ <message>
+ <source>Element %1 must come last.</source>
+ <translation>元素%1必须最后出现。</translation>
+ </message>
+ <message>
+ <source>At least one %1-element must occur before %2.</source>
+ <translation>至少一个元素%1要出现在%2之前。</translation>
+ </message>
+ <message>
+ <source>Only one %1-element can appear.</source>
+ <translation>只能出现一个元素%1。</translation>
+ </message>
+ <message>
+ <source>At least one %1-element must occur inside %2.</source>
+ <translation>至少一个元素%1要出现在%2之内。</translation>
+ </message>
+ <message>
+ <source>When attribute %1 is present on %2, a sequence constructor cannot be used.</source>
+ <translation>当属性%1出现在%2中时,不能使用顺序构造。</translation>
+ </message>
+ <message>
+ <source>Element %1 must have either a %2-attribute or a sequence constructor.</source>
+ <translation>元素%1必须有在一个%2属性或者顺序构造。</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>当需要参数时,不能通过属性%1或者顺序构造提供默认值。</translation>
+ </message>
+ <message>
+ <source>Element %1 cannot have children.</source>
+ <translation>元素%1不能有子元素。</translation>
+ </message>
+ <message>
+ <source>Element %1 cannot have a sequence constructor.</source>
+ <translation>元素%1不能有顺序构造。</translation>
+ </message>
+ <message>
+ <source>The attribute %1 cannot appear on %2, when it is a child of %3.</source>
+ <translation>属性%1不能出现在%2中,因为它是%3的子元素。</translation>
+ </message>
+ <message>
+ <source>A parameter in a function cannot be declared to be a tunnel.</source>
+ <translation>函数内的参数不能被声明为通道(tunnel)。</translation>
+ </message>
+ <message>
+ <source>This processor is not Schema-aware and therefore %1 cannot be used.</source>
+ <translation>这个处理器不能感知Schema,因此%1不能被使用。</translation>
+ </message>
+ <message>
+ <source>Top level stylesheet elements must be in a non-null namespace, which %1 isn&apos;t.</source>
+ <translation>顶级样式表元素必须是在非空命名空间中的,而%1不是。</translation>
+ </message>
+ <message>
+ <source>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</source>
+ <translation>元素%2中属性%1的值必须是%3或者%4,而不是%5。</translation>
+ </message>
+ <message>
+ <source>Attribute %1 cannot have the value %2.</source>
+ <translation>属性%1的值不能是%2。</translation>
+ </message>
+ <message>
+ <source>The attribute %1 can only appear on the first %2 element.</source>
+ <translation>属性%1只能出现在前%2个元素中。</translation>
+ </message>
+ <message>
+ <source>At least one %1 element must appear as child of %2.</source>
+ <translation>%2必须至少又一个子元素%1。</translation>
+ </message>
+ <message>
+ <source>%1 has inheritance loop in its base type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Circular inheritance of base type %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Circular inheritance of union %1.</source>
+ <translation type="unfinished"></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"></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"></translation>
+ </message>
+ <message>
+ <source>Base type of simple type %1 cannot be complex type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type %1 cannot have direct base type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type %1 is not allowed to have base type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type %1 can only have simple atomic type as base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type %1 cannot derive from %2 as the latter defines restriction as final.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Variety of item type of %1 must be either atomic or union.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Variety of member types of %1 must be atomic.</source>
+ <translation type="unfinished"></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"></translation>
+ </message>
+ <message>
+ <source>Simple type %1 is only allowed to have %2 facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base type of simple type %1 must have variety of type list.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base type of simple type %1 has defined derivation by restriction as final.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Item type of base type does not match item type of %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type %1 contains not allowed facet type %2.</source>
+ <translation type="unfinished"></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"></translation>
+ </message>
+ <message>
+ <source>%1 is not allowed to have any facets.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base type %1 of simple type %2 must have variety of union.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base type %1 of simple type %2 is not allowed to have restriction in %3 attribute.</source>
+ <translation type="unfinished"></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"></translation>
+ </message>
+ <message>
+ <source>Derivation method of %1 must be extension because the base type %2 is a simple type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 has duplicated element %2 in its content model.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 has non-deterministic content.</source>
+ <translation type="unfinished"></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"></translation>
+ </message>
+ <message>
+ <source>Content model of complex type %1 is not a valid extension of content model of %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 must have simple content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 must have the same simple type as its base class %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 cannot be derived from base type %2%3.</source>
+ <translation type="unfinished"></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"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 with simple content cannot be derived from complex base type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Item type of simple type %1 cannot be a complex type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Member type of simple type %1 cannot be a complex type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 is not allowed to have a member type with the same name as itself.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet collides with %2 facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must have the same value as %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be equal or greater than %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be less than or equal to %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet contains invalid regular expression</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unknown notation %1 used in %2 facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet contains invalid value %2: %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet cannot be %2 or %3 if %4 facet of base type is %5.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet cannot be %2 if %3 facet of base type is %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be less than or equal to %2 facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be less than %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet and %2 facet cannot appear together.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be greater than %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be less than %2 facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be greater than or equal to %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type contains not allowed facet %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1, %2, %3, %4, %5 and %6 facets are not allowed when derived by list.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Only %1 and %2 facets are allowed when derived by union.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 contains %2 facet with invalid data: %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute group %1 contains attribute %2 twice.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute group %1 contains two different attributes that both have types derived from %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute group %1 contains attribute %2 that has value constraint but type that inherits from %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 contains attribute %2 twice.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 contains two different attributes that both have types derived from %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 contains attribute %2 that has value constraint but type that inherits from %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is not allowed to have a value constraint if its base type is complex.</source>
+ <translation type="unfinished"></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"></translation>
+ </message>
+ <message>
+ <source>Value constraint of element %1 is not of elements type: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is not allowed to have substitution group affiliation as it is no global element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type of element %1 cannot be derived from type of substitution group affiliation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Value constraint of attribute %1 is not of attributes type: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 has value constraint but has type derived from %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute in derived complex type must be %2 like in base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 in derived complex type must have %2 value constraint like in base type.</source>
+ <translation type="unfinished"></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>
+ </message>
+ <message>
+ <source>Attribute %1 in derived complex type must have %2 value constraint.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>processContent of base wildcard must be weaker than derived wildcard.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 exists twice with different types.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Particle contains non-deterministic wildcards.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base attribute %1 is required but derived attribute is not.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type of derived attribute %1 cannot be validly derived from type of base attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Value constraint of derived attribute %1 does not match value constraint of base attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived attribute %1 does not exist in the base definition.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived attribute %1 does not match the wildcard in the base definition.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base attribute %1 is required but missing in derived definition.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived definition contains an %1 element that does not exists in the base definition</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived wildcard is not a subset of the base wildcard.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 of derived wildcard is not a valid restriction of %2 of base wildcard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 from base type is missing in derived type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type of derived attribute %1 differs from type of base attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base definition contains an %1 element that is missing in the derived definition</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 references unknown %2 or %3 element %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 references identity constraint %2 that is no %3 or %4 element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 has a different number of fields from the identity constraint %2 that it references.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base type %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Item type %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Member type %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base type %1 of complex type cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 cannot have complex base type that has a %2.</source>
+ <translation type="unfinished"></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>
+ </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>
+ </message>
+ <message>
+ <source>Type of %1 element must be a simple type, %2 is not.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Substitution group %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Substitution group %1 has circular definition.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duplicated element names %1 in %2 element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reference %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Circular group reference for %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element is not allowed in this scope</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element cannot have %2 attribute with value other than %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element cannot have %2 attribute with value other than %3 or %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 or %2 attribute of reference %3 does not match with the attribute declaration %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute group %1 has circular reference.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute in %2 must have %3 use like in base type %4.</source>
+ <translation type="unfinished"></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>
+ </message>
+ <message>
+ <source>%1 has attribute wildcard but its base type %2 has not.</source>
+ <translation type="unfinished"></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>
+ </message>
+ <message>
+ <source>Enumeration facet contains invalid content: {%1} is not a value of type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Namespace prefix of qualified name %1 is not defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element %2 is not a valid restriction of the %3 element it redefines: %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Empty particle cannot be derived from non-empty particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived particle is missing element %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived element %1 is missing value constraint as defined in base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived element %1 has weaker value constraint than base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fixed value constraint of element %1 differs from value constraint in base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived element %1 cannot be nillable as base element is not nillable.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Block constraints of derived element %1 must not be more weaker than in the base element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type of derived element %1 cannot be validly derived from base element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type of derived element %1 cannot be validly derived from base element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is missing in derived particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 does not match namespace constraint of wildcard in base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wildcard in derived particle is not a valid subset of wildcard in base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>processContent of wildcard in derived particle is weaker than wildcard in base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived particle allows content that is not allowed in the base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Can not process unknown element %1, expected elements are: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is not allowed in this scope, possible elements are: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Child element is missing in that scope, possible child elements are: %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Document is not a XML schema.</source>
+ <translation type="unfinished"></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>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element contains invalid content: {%3}.</source>
+ <translation type="unfinished"></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>
+ </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>
+ </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>
+ </message>
+ <message>
+ <source>%1 element without %2 attribute is not allowed inside schema without target namespace.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element is not allowed inside %2 element if %3 attribute is present.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element has neither %2 attribute nor %3 child element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element with %2 child element must not have a %3 attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must be %3 or %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must have a value of %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must have a value of %3 or %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element must not have %2 and %3 attribute together.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Content of %1 attribute of %2 element must not be from namespace %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must not be %3.</source>
+ <translation type="unfinished"></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>
+ </message>
+ <message>
+ <source>Specifying use=&apos;prohibited&apos; inside an attribute group has no effect.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element must have either %2 or %3 attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element must have either %2 attribute or %3 or %4 as child element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element requires either %2 or %3 attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Text or entity references not allowed inside %1 element</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must contain %3, %4 or a list of URIs.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element is not allowed in this context.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element has larger value than %3 attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Prefix of qualified name %1 is not defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must either contain %3 or the other values.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Component with ID %1 has been defined previously.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute group %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element group %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Notation %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Identity constraint %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duplicated facets in simple type %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 is not valid according to %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>String content does not match the length facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>String content does not match the minLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>String content does not match the maxLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>String content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>String content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match the maxInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match the maxExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match the minInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match the minExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match in the totalDigits facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match the maxInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match the maxExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match the minInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match the minExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match in the totalDigits facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Double content does not match the maxInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Double content does not match the maxExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Double content does not match the minInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Double content does not match the minExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Double content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Double content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Decimal content does not match in the fractionDigits facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Decimal content does not match in the totalDigits facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Date time content does not match the maxInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Date time content does not match the maxExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Date time content does not match the minInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Date time content does not match the minExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Date time content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Date time content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duration content does not match the maxInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duration content does not match the maxExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duration content does not match the minInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duration content does not match the minExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duration content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duration content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Boolean content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Binary content does not match the length facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Binary content does not match the minLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Binary content does not match the maxLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Binary content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid QName content: %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>QName content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>QName content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Notation content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List content does not match length facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List content does not match minLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List content does not match maxLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Union content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Union content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Data of type %1 are not allowed to be empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is missing child element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>There is one IDREF value with no corresponding ID: %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Loaded schema file is invalid.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 contains invalid data.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xsi:schemaLocation namespace %1 has already appeared earlier in the instance document.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xsi:noNamespaceSchemaLocation cannot appear after the first no-namespace element or attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No schema defined for validation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No definition for element %1 available.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Specified type %1 is not known to the schema.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is not defined in this scope.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Declaration for element %1 does not exist.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains invalid content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is declared as abstract.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is not nillable.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 contains invalid data: %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element contains content although it is nillable.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fixed value constraint not allowed if element is nillable.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 cannot contain other elements, as it has a fixed content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Specified type %1 is not validly substitutable with element type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 is not allowed to be abstract.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains not allowed attributes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains not allowed child element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Content of element %1 does not match its type definition: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Content of element %1 does not match defined value constraint.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains not allowed child content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains not allowed text content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is missing required attribute %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 does not match the attribute wildcard.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Declaration for attribute %1 does not exist.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains two attributes of type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 contains invalid content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains unknown attribute %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Content of attribute %1 does not match its type definition: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Content of attribute %1 does not match defined value constraint.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Non-unique value found for constraint %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Key constraint %1 contains absent fields.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Key constraint %1 contains references nillable element %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No referenced value found for key reference %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>More than one value found for field %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Field %1 has no simple type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID value &apos;%1&apos; is not unique.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&apos;%1&apos; attribute contains invalid QName content: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+</TS>
diff --git a/config.profiles/symbian/translations/qt_zh_tw_symbian.ts b/config.profiles/symbian/translations/qt_zh_tw_symbian.ts
new file mode 100644
index 0000000..3b1fb51
--- /dev/null
+++ b/config.profiles/symbian/translations/qt_zh_tw_symbian.ts
@@ -0,0 +1,8505 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE TS>
+
+<TS version="2.0" language="zh_tw">
+ <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>假錯誤!</translation>
+ </message>
+ <message>
+ <source>Invalid URL</source>
+ <translation>URL無效</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>&lt;html&gt;音訊播放裝置&lt;b&gt;%1&lt;/b&gt;無法運作。&lt;br/&gt;正在切換回&lt;b&gt;%2&lt;/b&gt;。&lt;/html&gt;</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>&lt;html&gt;正在切換到音訊播放裝置&lt;b&gt;%1&lt;/b&gt;,&lt;br/&gt;該裝置剛變成可使用,而且優先順序較高。&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>Revert back to device &apos;%1&apos;</source>
+ <translation>切換回裝置&quot;%1&quot;</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>音訊輸出</translation>
+ </message>
+ <message>
+ <source>The audio output device</source>
+ <translation>音訊輸出裝置</translation>
+ </message>
+ <message>
+ <source>No error</source>
+ <translation>沒有錯誤</translation>
+ </message>
+ <message>
+ <source>Not found</source>
+ <translation>找不到</translation>
+ </message>
+ <message>
+ <source>Out of memory</source>
+ <translation>記憶體不足</translation>
+ </message>
+ <message>
+ <source>Not supported</source>
+ <translation>不支援</translation>
+ </message>
+ <message>
+ <source>Overflow</source>
+ <translation>溢位</translation>
+ </message>
+ <message>
+ <source>Underflow</source>
+ <translation>降位</translation>
+ </message>
+ <message>
+ <source>Already exists</source>
+ <translation>已經存在</translation>
+ </message>
+ <message>
+ <source>Path not found</source>
+ <translation>找不到路徑</translation>
+ </message>
+ <message>
+ <source>In use</source>
+ <translation>使用中</translation>
+ </message>
+ <message>
+ <source>Not ready</source>
+ <translation>未就緒</translation>
+ </message>
+ <message>
+ <source>Access denied</source>
+ <translation>拒絕存取</translation>
+ </message>
+ <message>
+ <source>Could not connect</source>
+ <translation>無法連線</translation>
+ </message>
+ <message>
+ <source>Disconnected</source>
+ <translation>已中斷連線</translation>
+ </message>
+ <message>
+ <source>Permission denied</source>
+ <translation>權限不足</translation>
+ </message>
+ <message>
+ <source>Insufficient bandwidth</source>
+ <translation>頻寬不足</translation>
+ </message>
+ <message>
+ <source>Network unavailable</source>
+ <translation>網路無法使用</translation>
+ </message>
+ <message>
+ <source>Network communication error</source>
+ <translation>網路通訊錯誤</translation>
+ </message>
+ <message>
+ <source>Streaming not supported</source>
+ <translation>不支援串流</translation>
+ </message>
+ <message>
+ <source>Server alert</source>
+ <translation>伺服器警告</translation>
+ </message>
+ <message>
+ <source>Invalid protocol</source>
+ <translation>通訊協定無效</translation>
+ </message>
+ <message>
+ <source>Invalid URL</source>
+ <translation>URL無效</translation>
+ </message>
+ <message>
+ <source>Multicast error</source>
+ <translation>多點傳送錯誤</translation>
+ </message>
+ <message>
+ <source>Proxy server error</source>
+ <translation>Proxy伺服器錯誤</translation>
+ </message>
+ <message>
+ <source>Proxy server not supported</source>
+ <translation>不支援的Proxy伺服器</translation>
+ </message>
+ <message>
+ <source>Audio output error</source>
+ <translation>音訊輸出錯誤</translation>
+ </message>
+ <message>
+ <source>Video output error</source>
+ <translation>視訊輸出錯誤</translation>
+ </message>
+ <message>
+ <source>Decoder error</source>
+ <translation>解碼器錯誤</translation>
+ </message>
+ <message>
+ <source>Audio or video components could not be played</source>
+ <translation>音訊或視訊元件無法播放</translation>
+ </message>
+ <message>
+ <source>DRM error</source>
+ <translation>DRM錯誤</translation>
+ </message>
+ <message>
+ <source>Unknown error (%1)</source>
+ <translation>不明錯誤(%1)</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::AbstractMediaPlayer</name>
+ <message>
+ <source>Not ready to play</source>
+ <translation>尚未準備好播放</translation>
+ </message>
+ <message>
+ <source>Error opening file</source>
+ <translation>開啟檔案時發生錯誤</translation>
+ </message>
+ <message>
+ <source>Error opening URL</source>
+ <translation>開啟URL時發生錯誤</translation>
+ </message>
+ <message>
+ <source>Setting volume failed</source>
+ <translation>音量設定失敗</translation>
+ </message>
+ <message>
+ <source>Playback complete</source>
+ <translation>播放完成</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::AudioEqualizer</name>
+ <message>
+ <source>%1 Hz</source>
+ <translation>%1 Hz</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::AudioPlayer</name>
+ <message>
+ <source>Getting position failed</source>
+ <translation>取得位置失敗</translation>
+ </message>
+ <message>
+ <source>Opening clip failed</source>
+ <translation>開啟檔案失敗</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::EffectFactory</name>
+ <message>
+ <source>Enabled</source>
+ <translation>已啟用</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::EnvironmentalReverb</name>
+ <message>
+ <source>Decay HF ratio (%)</source>
+ <translation>衰減HF比率(%)</translation>
+ </message>
+ <message>
+ <source>Decay time (ms)</source>
+ <translation>衰減時間(ms)</translation>
+ </message>
+ <message>
+ <source>Density (%)</source>
+ <translation>密度(%)</translation>
+ </message>
+ <message>
+ <source>Diffusion (%)</source>
+ <translation>擴散(%)</translation>
+ </message>
+ <message>
+ <source>Reflections delay (ms)</source>
+ <translation>反射延遲(ms)</translation>
+ </message>
+ <message>
+ <source>Reflections level (mB)</source>
+ <translation>反射電平(mB)</translation>
+ </message>
+ <message>
+ <source>Reverb delay (ms)</source>
+ <translation>殘響延遲(ms)</translation>
+ </message>
+ <message>
+ <source>Reverb level (mB)</source>
+ <translation>殘響電平(mB)</translation>
+ </message>
+ <message>
+ <source>Room HF level</source>
+ <translation>空間HF電平</translation>
+ </message>
+ <message>
+ <source>Room level (mB)</source>
+ <translation>空間電平(mB)</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::MediaObject</name>
+ <message>
+ <source>Error opening source: type not supported</source>
+ <translation>開啟來源時發生錯誤:不支援的類型</translation>
+ </message>
+ <message>
+ <source>Error opening source: media type could not be determined</source>
+ <translation>開啟來源時發生錯誤:無法判斷媒體類型</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::StereoWidening</name>
+ <message>
+ <source>Level (%)</source>
+ <translation>電平(%)</translation>
+ </message>
+ </context>
+ <context>
+ <name>Phonon::MMF::VideoPlayer</name>
+ <message>
+ <source>Pause failed</source>
+ <translation>暫停失敗</translation>
+ </message>
+ <message>
+ <source>Seek failed</source>
+ <translation>搜尋失敗</translation>
+ </message>
+ <message>
+ <source>Getting position failed</source>
+ <translation>取得位置失敗</translation>
+ </message>
+ <message>
+ <source>Opening clip failed</source>
+ <translation>開啟檔案失敗</translation>
+ </message>
+ <message>
+ <source>Buffering clip failed</source>
+ <translation>檔案緩衝處理失敗</translation>
+ </message>
+ <message>
+ <source>Video display error</source>
+ <translation>視訊顯示錯誤</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>已靜音</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>新資料夾</translation>
+ </message>
+ <message>
+ <source>New Folder %1</source>
+ <translation>新資料夾 %1</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>按</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"></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 type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Sat:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Val:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Red:</source>
+ <translation type="unfinished"></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 type="unfinished"></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 type="unfinished"></translation>
+ </message>
+ <message>
+ <source>False</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>True</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QCoreApplication</name>
+ <message>
+ <source>%1: key is empty</source>
+ <comment>QSystemSemaphore</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1: unable to make key</source>
+ <comment>QSystemSemaphore</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1: ftok failed</source>
+ <comment>QSystemSemaphore</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1: already exists</source>
+ <comment>QSystemSemaphore</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1: does not exist</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1:不存在</translation>
+ </message>
+ <message>
+ <source>%1: out of resources</source>
+ <comment>QSystemSemaphore</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1: unknown error %2</source>
+ <comment>QSystemSemaphore</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QDB2Driver</name>
+ <message>
+ <source>Unable to connect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to set autocommit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QDB2Result</name>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to prepare statement</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to bind variable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to fetch record %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to fetch next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to fetch first</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QDateTimeEdit</name>
+ <message>
+ <source>AM</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>am</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PM</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>pm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QDial</name>
+ <message>
+ <source>QDial</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SpeedoMeter</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SliderHandle</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QDialog</name>
+ <message>
+ <source>What&apos;s This?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Done</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QDialogButtonBox</name>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Apply</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reset</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Don&apos;t Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Discard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Yes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Yes to &amp;All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;No</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>N&amp;o to All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Abort</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ignore</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Restore Defaults</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close without Saving</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QDirModel</name>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Kind</source>
+ <comment>Match OS X Finder</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <comment>All other platforms</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Date Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QDockWidget</name>
+ <message>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Dock</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Float</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QDoubleSpinBox</name>
+ <message>
+ <source>More</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Less</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QErrorMessage</name>
+ <message>
+ <source>&amp;Show this message again</source>
+ <translation>再度顯示此訊息(&amp;S)</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Debug Message:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Warning:</source>
+ <translation>警告:</translation>
+ </message>
+ <message>
+ <source>Fatal Error:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QFile</name>
+ <message>
+ <source>Destination file exists</source>
+ <translation>目標檔已存在</translation>
+ </message>
+ <message>
+ <source>Will not rename sequential file using block copy</source>
+ <translation>使用區塊複製將不會重新命名循序檔</translation>
+ </message>
+ <message>
+ <source>Cannot remove source file</source>
+ <translation>無法移除來源檔</translation>
+ </message>
+ <message>
+ <source>Cannot open %1 for input</source>
+ <translation>無法開啟 %1 以輸入</translation>
+ </message>
+ <message>
+ <source>Cannot open for output</source>
+ <translation>無法開啟 %1 以輸出</translation>
+ </message>
+ <message>
+ <source>Failure to write block</source>
+ <translation>寫入區塊時失敗</translation>
+ </message>
+ <message>
+ <source>Cannot create %1 for output</source>
+ <translation>無法建立 %1 以輸出</translation>
+ </message>
+ </context>
+ <context>
+ <name>QFileDialog</name>
+ <message>
+ <source>All Files (*)</source>
+ <translation>所有檔案 (*)</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation>返回</translation>
+ </message>
+ <message>
+ <source>List View</source>
+ <translation>列表檢視</translation>
+ </message>
+ <message>
+ <source>Detail View</source>
+ <translation>詳細檢視</translation>
+ </message>
+ <message>
+ <source>File</source>
+ <translation>檔案</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>開啟</translation>
+ </message>
+ <message>
+ <source>Save As</source>
+ <translation>另存新檔</translation>
+ </message>
+ <message>
+ <source>&amp;Open</source>
+ <translation>開啟(&amp;O)</translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation>儲存(&amp;S)</translation>
+ </message>
+ <message>
+ <source>Recent Places</source>
+ <translation>最近的地方</translation>
+ </message>
+ <message>
+ <source>&amp;Rename</source>
+ <translation>重新命名(&amp;R)</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>刪除(&amp;D)</translation>
+ </message>
+ <message>
+ <source>Show &amp;hidden files</source>
+ <translation>顯示隱藏檔(&amp;H)</translation>
+ </message>
+ <message>
+ <source>New Folder</source>
+ <translation>新資料夾</translation>
+ </message>
+ <message>
+ <source>Find Directory</source>
+ <translation>尋找目錄</translation>
+ </message>
+ <message>
+ <source>Directories</source>
+ <translation>目錄</translation>
+ </message>
+ <message>
+ <source>All Files (*.*)</source>
+ <translation>所有檔案 (*.*)</translation>
+ </message>
+ <message>
+ <source>Directory:</source>
+ <translation>目錄:</translation>
+ </message>
+ <message>
+ <source>%1 already exists.
+Do you want to replace it?</source>
+ <translation>%1 已存在
+您要取代它嗎?</translation>
+ </message>
+ <message>
+ <source>%1
+File not found.
+Please verify the correct file name was given.</source>
+ <translation>%1
+找不到檔案。
+請檢查檔名是否正確。</translation>
+ </message>
+ <message>
+ <source>My Computer</source>
+ <translation>我的電腦</translation>
+ </message>
+ <message>
+ <source>Parent Directory</source>
+ <translation>父目錄</translation>
+ </message>
+ <message>
+ <source>Files of type:</source>
+ <translation>檔案型態:</translation>
+ </message>
+ <message>
+ <source>%1
+Directory not found.
+Please verify the correct directory name was given.</source>
+ <translation>%1
+找不到目錄。
+請檢查目錄名稱是否正確。</translation>
+ </message>
+ <message>
+ <source>&apos;%1&apos; is write protected.
+Do you want to delete it anyway?</source>
+ <translation>%1 有寫入保護。
+您確定要刪除它嗎?</translation>
+ </message>
+ <message>
+ <source>Are sure you want to delete &apos;%1&apos;?</source>
+ <translation>您確定要刪除 %1 嗎?</translation>
+ </message>
+ <message>
+ <source>Could not delete directory.</source>
+ <translation>無法刪除目錄。</translation>
+ </message>
+ <message>
+ <source>Drive</source>
+ <translation>磁碟</translation>
+ </message>
+ <message>
+ <source>File Folder</source>
+ <comment>Match Windows Explorer</comment>
+ <translation>檔案資料夾</translation>
+ </message>
+ <message>
+ <source>Folder</source>
+ <comment>All other platforms</comment>
+ <translation>資料夾</translation>
+ </message>
+ <message>
+ <source>Alias</source>
+ <comment>Mac OS X Finder</comment>
+ <translation>別名</translation>
+ </message>
+ <message>
+ <source>Shortcut</source>
+ <comment>All other platforms</comment>
+ <translation>捷徑</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation>未知</translation>
+ </message>
+ <message>
+ <source>Show </source>
+ <translation>顯示 </translation>
+ </message>
+ <message>
+ <source>Forward</source>
+ <translation>往前</translation>
+ </message>
+ <message>
+ <source>&amp;New Folder</source>
+ <translation>新增資料夾(&amp;N)</translation>
+ </message>
+ <message>
+ <source>&amp;Choose</source>
+ <translation>選擇(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>移除</translation>
+ </message>
+ <message>
+ <source>File &amp;name:</source>
+ <translation>檔名(&amp;N):</translation>
+ </message>
+ <message>
+ <source>Look in:</source>
+ <translation>尋找於:</translation>
+ </message>
+ <message>
+ <source>Create New Folder</source>
+ <translation>建立新資料夾</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 位元組</translation>
+ </message>
+ <message>
+ <source>Invalid filename</source>
+ <translation>不合法的檔名</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;無法使用名稱 &quot;%1&quot;。&lt;/b&gt;&lt;p&gt;請使用其它名稱,字元數少一點,或是不要有標點符號。</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>名稱</translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation>大小</translation>
+ </message>
+ <message>
+ <source>Kind</source>
+ <comment>Match OS X Finder</comment>
+ <translation>種類</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <comment>All other platforms</comment>
+ <translation>型態</translation>
+ </message>
+ <message>
+ <source>Date Modified</source>
+ <translation>變更日期</translation>
+ </message>
+ <message>
+ <source>My Computer</source>
+ <translation>我的電腦</translation>
+ </message>
+ <message>
+ <source>Computer</source>
+ <translation>電腦</translation>
+ </message>
+ <message>
+ <source>%1 byte(s)</source>
+ <translation>%1位元組</translation>
+ </message>
+ </context>
+ <context>
+ <name>QFontDatabase</name>
+ <message>
+ <source>Normal</source>
+ <translation>正常</translation>
+ </message>
+ <message>
+ <source>Bold</source>
+ <translation>粗體</translation>
+ </message>
+ <message>
+ <source>Demi Bold</source>
+ <translation>半粗體</translation>
+ </message>
+ <message>
+ <source>Black</source>
+ <translation>黑體</translation>
+ </message>
+ <message>
+ <source>Demi</source>
+ <translation>半體</translation>
+ </message>
+ <message>
+ <source>Light</source>
+ <translation>輕體</translation>
+ </message>
+ <message>
+ <source>Italic</source>
+ <translation>斜體</translation>
+ </message>
+ <message>
+ <source>Oblique</source>
+ <translation>傾斜體</translation>
+ </message>
+ <message>
+ <source>Any</source>
+ <translation>任何</translation>
+ </message>
+ <message>
+ <source>Latin</source>
+ <translation>拉丁</translation>
+ </message>
+ <message>
+ <source>Greek</source>
+ <translation>希臘</translation>
+ </message>
+ <message>
+ <source>Cyrillic</source>
+ <translation>斯拉夫</translation>
+ </message>
+ <message>
+ <source>Armenian</source>
+ <translation>亞美尼亞</translation>
+ </message>
+ <message>
+ <source>Hebrew</source>
+ <translation>希伯來</translation>
+ </message>
+ <message>
+ <source>Arabic</source>
+ <translation>阿拉伯</translation>
+ </message>
+ <message>
+ <source>Syriac</source>
+ <translation>敘利亞</translation>
+ </message>
+ <message>
+ <source>Thaana</source>
+ <translation>Thaana</translation>
+ </message>
+ <message>
+ <source>Devanagari</source>
+ <translation>Devanagari</translation>
+ </message>
+ <message>
+ <source>Bengali</source>
+ <translation>孟加拉</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>坦米爾</translation>
+ </message>
+ <message>
+ <source>Telugu</source>
+ <translation>Telugu</translation>
+ </message>
+ <message>
+ <source>Kannada</source>
+ <translation>坎達那</translation>
+ </message>
+ <message>
+ <source>Malayalam</source>
+ <translation>馬來語</translation>
+ </message>
+ <message>
+ <source>Sinhala</source>
+ <translation>錫蘭</translation>
+ </message>
+ <message>
+ <source>Thai</source>
+ <translation>泰語</translation>
+ </message>
+ <message>
+ <source>Lao</source>
+ <translation>寮國</translation>
+ </message>
+ <message>
+ <source>Tibetan</source>
+ <translation>西藏</translation>
+ </message>
+ <message>
+ <source>Myanmar</source>
+ <translation>緬甸</translation>
+ </message>
+ <message>
+ <source>Georgian</source>
+ <translation>喬治亞</translation>
+ </message>
+ <message>
+ <source>Khmer</source>
+ <translation>高棉</translation>
+ </message>
+ <message>
+ <source>Simplified Chinese</source>
+ <translation>簡體中文</translation>
+ </message>
+ <message>
+ <source>Traditional Chinese</source>
+ <translation>繁體中文</translation>
+ </message>
+ <message>
+ <source>Japanese</source>
+ <translation>日語</translation>
+ </message>
+ <message>
+ <source>Korean</source>
+ <translation>韓語</translation>
+ </message>
+ <message>
+ <source>Vietnamese</source>
+ <translation>越南</translation>
+ </message>
+ <message>
+ <source>Symbol</source>
+ <translation>符號</translation>
+ </message>
+ <message>
+ <source>Ogham</source>
+ <translation>歐甘</translation>
+ </message>
+ <message>
+ <source>Runic</source>
+ <translation>盧恩</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;F)</translation>
+ </message>
+ <message>
+ <source>Font st&amp;yle</source>
+ <translation>字型樣式(&amp;Y)</translation>
+ </message>
+ <message>
+ <source>&amp;Size</source>
+ <translation>大小(&amp;S)</translation>
+ </message>
+ <message>
+ <source>Effects</source>
+ <translation>效果</translation>
+ </message>
+ <message>
+ <source>Stri&amp;keout</source>
+ <translation>刪除線(&amp;K)</translation>
+ </message>
+ <message>
+ <source>&amp;Underline</source>
+ <translation>底線(&amp;U)</translation>
+ </message>
+ <message>
+ <source>Sample</source>
+ <translation>範例</translation>
+ </message>
+ <message>
+ <source>Select Font</source>
+ <translation>選擇字型</translation>
+ </message>
+ <message>
+ <source>Wr&amp;iting System</source>
+ <translation>寫入系統(&amp;I)</translation>
+ </message>
+ </context>
+ <context>
+ <name>QFtp</name>
+ <message>
+ <source>Host %1 found</source>
+ <translation>找到主機 %1</translation>
+ </message>
+ <message>
+ <source>Host found</source>
+ <translation>找到主機</translation>
+ </message>
+ <message>
+ <source>Connected to host %1</source>
+ <translation>已連接到主機 %1</translation>
+ </message>
+ <message>
+ <source>Connected to host</source>
+ <translation>已連線到主機</translation>
+ </message>
+ <message>
+ <source>Connection to %1 closed</source>
+ <translation>到 %1 的連線已關閉</translation>
+ </message>
+ <message>
+ <source>Connection closed</source>
+ <translation>連線已關閉</translation>
+ </message>
+ <message>
+ <source>Host %1 not found</source>
+ <translation>找不到主機 %1</translation>
+ </message>
+ <message>
+ <source>Connection refused to host %1</source>
+ <translation>連線到主機 %1 被拒</translation>
+ </message>
+ <message>
+ <source>Connection timed out to host %1</source>
+ <translation>連線到主機 %1 逾時</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>未知的錯誤</translation>
+ </message>
+ <message>
+ <source>Connecting to host failed:
+%1</source>
+ <translation>連線到主機失敗:
+%1</translation>
+ </message>
+ <message>
+ <source>Login failed:
+%1</source>
+ <translation>登入失敗:
+%1</translation>
+ </message>
+ <message>
+ <source>Listing directory failed:
+%1</source>
+ <translation>列出目錄時失敗:
+%1</translation>
+ </message>
+ <message>
+ <source>Changing directory failed:
+%1</source>
+ <translation>變更目錄時失敗:
+%1</translation>
+ </message>
+ <message>
+ <source>Downloading file failed:
+%1</source>
+ <translation>下載檔案時失敗:
+%1</translation>
+ </message>
+ <message>
+ <source>Uploading file failed:
+%1</source>
+ <translation>上傳檔案時失敗:
+%1</translation>
+ </message>
+ <message>
+ <source>Removing file failed:
+%1</source>
+ <translation>移除檔案時失敗:
+%1</translation>
+ </message>
+ <message>
+ <source>Creating directory failed:
+%1</source>
+ <translation>建立目錄時失敗:
+%1</translation>
+ </message>
+ <message>
+ <source>Removing directory failed:
+%1</source>
+ <translation>移除目錄時失敗:
+%1</translation>
+ </message>
+ <message>
+ <source>Not connected</source>
+ <translation>未連線</translation>
+ </message>
+ <message>
+ <source>Connection refused for data connection</source>
+ <translation>資料連線被拒</translation>
+ </message>
+ </context>
+ <context>
+ <name>QHostInfo</name>
+ <message>
+ <source>Unknown error</source>
+ <translation>未知的錯誤</translation>
+ </message>
+ </context>
+ <context>
+ <name>QHostInfoAgent</name>
+ <message>
+ <source>Host not found</source>
+ <translation>找不到主機</translation>
+ </message>
+ <message>
+ <source>Unknown address type</source>
+ <translation>未知的位址型態</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>未知的錯誤</translation>
+ </message>
+ <message>
+ <source>No host name given</source>
+ <translation>未提供主機名稱</translation>
+ </message>
+ <message>
+ <source>Invalid hostname</source>
+ <translation>主機名稱無效</translation>
+ </message>
+ </context>
+ <context>
+ <name>QHttp</name>
+ <message>
+ <source>Connection refused</source>
+ <translation>連線被拒</translation>
+ </message>
+ <message>
+ <source>Host %1 not found</source>
+ <translation>找不到主機 %1</translation>
+ </message>
+ <message>
+ <source>Wrong content length</source>
+ <translation>錯誤的內容長度</translation>
+ </message>
+ <message>
+ <source>HTTP request failed</source>
+ <translation>HTTP 要求失敗</translation>
+ </message>
+ <message>
+ <source>Host %1 found</source>
+ <translation>找到主機 %1</translation>
+ </message>
+ <message>
+ <source>Host found</source>
+ <translation>找到主機</translation>
+ </message>
+ <message>
+ <source>Connected to host %1</source>
+ <translation>已連接到主機 %1</translation>
+ </message>
+ <message>
+ <source>Connected to host</source>
+ <translation>已連線到主機</translation>
+ </message>
+ <message>
+ <source>Connection to %1 closed</source>
+ <translation>到 %1 的連線已關閉</translation>
+ </message>
+ <message>
+ <source>Connection closed</source>
+ <translation>連線已關閉</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>未知的錯誤</translation>
+ </message>
+ <message>
+ <source>Request aborted</source>
+ <translation>要求中止</translation>
+ </message>
+ <message>
+ <source>No server set to connect to</source>
+ <translation>沒有設定要連線到哪個伺服器</translation>
+ </message>
+ <message>
+ <source>Server closed connection unexpectedly</source>
+ <translation>伺服器無預警關閉連線</translation>
+ </message>
+ <message>
+ <source>Invalid HTTP response header</source>
+ <translation>不合法的 HTTP 回覆標頭</translation>
+ </message>
+ <message>
+ <source>Unknown authentication method</source>
+ <translation>不明的驗證方法</translation>
+ </message>
+ <message>
+ <source>Invalid HTTP chunked body</source>
+ <translation>不合法的 HTTP 區塊主體</translation>
+ </message>
+ <message>
+ <source>Error writing response to device</source>
+ <translation>寫入回應到裝置時發生錯誤</translation>
+ </message>
+ <message>
+ <source>Proxy authentication required</source>
+ <translation>代理伺服器需要認證</translation>
+ </message>
+ <message>
+ <source>Authentication required</source>
+ <translation>需要認證</translation>
+ </message>
+ <message>
+ <source>Proxy requires authentication</source>
+ <translation>代理伺服器需要認證</translation>
+ </message>
+ <message>
+ <source>Host requires authentication</source>
+ <translation>主機需要認證</translation>
+ </message>
+ <message>
+ <source>Data corrupted</source>
+ <translation>資料已損毀</translation>
+ </message>
+ <message>
+ <source>SSL handshake failed</source>
+ <translation>SSL 溝通失敗</translation>
+ </message>
+ <message>
+ <source>Unknown protocol specified</source>
+ <translation>指定了未知的協定</translation>
+ </message>
+ <message>
+ <source>Connection refused (or timed out)</source>
+ <translation>連線被拒(或連線逾時)</translation>
+ </message>
+ <message>
+ <source>HTTPS connection requested but SSL support not compiled in</source>
+ <translation>HTTPS 連線需要的 SSL 支援並未編譯進來</translation>
+ </message>
+ </context>
+ <context>
+ <name>QHttpSocketEngine</name>
+ <message>
+ <source>Did not receive HTTP response from proxy</source>
+ <translation>未從代理伺服器接收到 HTTP 回應</translation>
+ </message>
+ <message>
+ <source>Error parsing authentication request from proxy</source>
+ <translation>剖析從代理伺服器傳來的認證要求時發生錯誤</translation>
+ </message>
+ <message>
+ <source>Authentication required</source>
+ <translation>需要認證</translation>
+ </message>
+ <message>
+ <source>Proxy denied connection</source>
+ <translation>代理伺服器拒絕連線</translation>
+ </message>
+ <message>
+ <source>Error communicating with HTTP proxy</source>
+ <translation>與 HTTP 代理伺服器聯繫時發生錯誤</translation>
+ </message>
+ <message>
+ <source>Proxy server not found</source>
+ <translation>找不到代理伺服器</translation>
+ </message>
+ <message>
+ <source>Proxy connection refused</source>
+ <translation>代理伺服器連線被拒</translation>
+ </message>
+ <message>
+ <source>Proxy server connection timed out</source>
+ <translation>代理伺服器連線逾時</translation>
+ </message>
+ <message>
+ <source>Proxy connection closed prematurely</source>
+ <translation>代理伺服器連線已不正常關閉</translation>
+ </message>
+ </context>
+ <context>
+ <name>QIBaseDriver</name>
+ <message>
+ <source>Error opening database</source>
+ <translation>開啟資料庫發生錯誤</translation>
+ </message>
+ <message>
+ <source>Could not start transaction</source>
+ <translation>無法開始事務</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>無法提交事務</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>無法反轉事務</translation>
+ </message>
+ </context>
+ <context>
+ <name>QIBaseResult</name>
+ <message>
+ <source>Unable to create BLOB</source>
+ <translation>無法建立 BLOB</translation>
+ </message>
+ <message>
+ <source>Unable to write BLOB</source>
+ <translation>無法寫入 BLOB</translation>
+ </message>
+ <message>
+ <source>Unable to open BLOB</source>
+ <translation>無法開啟 BLOB</translation>
+ </message>
+ <message>
+ <source>Unable to read BLOB</source>
+ <translation>無法讀取 BLOB</translation>
+ </message>
+ <message>
+ <source>Could not find array</source>
+ <translation>找不到陣列</translation>
+ </message>
+ <message>
+ <source>Could not get array data</source>
+ <translation>無法取得陣列資料</translation>
+ </message>
+ <message>
+ <source>Could not get query info</source>
+ <translation>無法取得查詢資訊</translation>
+ </message>
+ <message>
+ <source>Could not start transaction</source>
+ <translation>無法開始事務</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>無法提交事務</translation>
+ </message>
+ <message>
+ <source>Could not allocate statement</source>
+ <translation>無法配置敘述</translation>
+ </message>
+ <message>
+ <source>Could not prepare statement</source>
+ <translation>無法準備敘述</translation>
+ </message>
+ <message>
+ <source>Could not describe input statement</source>
+ <translation>無法描述輸入敘述</translation>
+ </message>
+ <message>
+ <source>Could not describe statement</source>
+ <translation>無法描述敘述</translation>
+ </message>
+ <message>
+ <source>Unable to close statement</source>
+ <translation>無法關閉敘述</translation>
+ </message>
+ <message>
+ <source>Unable to execute query</source>
+ <translation>無法執行查詢</translation>
+ </message>
+ <message>
+ <source>Could not fetch next item</source>
+ <translation>無法抓取下一個項目</translation>
+ </message>
+ <message>
+ <source>Could not get statement info</source>
+ <translation>無法取得敘述資訊</translation>
+ </message>
+ </context>
+ <context>
+ <name>QIODevice</name>
+ <message>
+ <source>Permission denied</source>
+ <translation>權限不足</translation>
+ </message>
+ <message>
+ <source>Too many open files</source>
+ <translation>開啟過多檔案</translation>
+ </message>
+ <message>
+ <source>No such file or directory</source>
+ <translation>找不到該檔案或目錄</translation>
+ </message>
+ <message>
+ <source>No space left on device</source>
+ <translation>裝置上已無空間</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>未知的錯誤</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 輸入法</translation>
+ </message>
+ <message>
+ <source>Windows input method</source>
+ <translation>Windows 輸入法</translation>
+ </message>
+ <message>
+ <source>Mac OS X input method</source>
+ <translation>Mac OS X 輸入法</translation>
+ </message>
+ <message>
+ <source>S60 FEP input method</source>
+ <translation>S60 FEP輸入法</translation>
+ </message>
+ </context>
+ <context>
+ <name>QInputDialog</name>
+ <message>
+ <source>Enter a value:</source>
+ <translation>請輸入值:</translation>
+ </message>
+ </context>
+ <context>
+ <name>QLibrary</name>
+ <message>
+ <source>Could not mmap &apos;%1&apos;: %2</source>
+ <translation>無法 mmap &apos;%1&apos;:%2</translation>
+ </message>
+ <message>
+ <source>Plugin verification data mismatch in &apos;%1&apos;</source>
+ <translation>在 %1 中的外掛程式確認資料不符合</translation>
+ </message>
+ <message>
+ <source>Could not unmap &apos;%1&apos;: %2</source>
+ <translation>無法 unmap &apos;%1&apos;:%2</translation>
+ </message>
+ <message>
+ <source>The plugin &apos;%1&apos; uses incompatible Qt library. (%2.%3.%4) [%5]</source>
+ <translation>外掛程式 %1 使用不相容的 Qt 函式庫(%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>外掛程式 %1 使用不相容的 Qt 函式庫。預期建構鑰 %2,卻得到 %3</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>未知的錯誤</translation>
+ </message>
+ <message>
+ <source>The shared library was not found.</source>
+ <translation>找不到分享函式庫</translation>
+ </message>
+ <message>
+ <source>The file &apos;%1&apos; is not a valid Qt plugin.</source>
+ <translation>檔案 %1 不是合法的 Qt 外掛程式。</translation>
+ </message>
+ <message>
+ <source>The plugin &apos;%1&apos; uses incompatible Qt library. (Cannot mix debug and release libraries.)</source>
+ <translation>外掛程式 %1 使用不相容的 Qt 函式庫。(不能將除錯與釋出版的函式庫混在一起。)</translation>
+ </message>
+ <message>
+ <source>Cannot load library %1: %2</source>
+ <translation>無法載入函式庫 %1:%2</translation>
+ </message>
+ <message>
+ <source>Cannot unload library %1: %2</source>
+ <translation>無法卸載函式庫 %1:%2</translation>
+ </message>
+ <message>
+ <source>Cannot resolve symbol &quot;%1&quot; in %2: %3</source>
+ <translation>無法反解 %2 內的符號 %1:%3</translation>
+ </message>
+ </context>
+ <context>
+ <name>QLineEdit</name>
+ <message>
+ <source>Select All</source>
+ <translation>全部選擇</translation>
+ </message>
+ <message>
+ <source>&amp;Undo</source>
+ <translation>復原(&amp;U)</translation>
+ </message>
+ <message>
+ <source>&amp;Redo</source>
+ <translation>重做(&amp;R)</translation>
+ </message>
+ <message>
+ <source>Cu&amp;t</source>
+ <translation>剪下(&amp;T)</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>複製(&amp;C)</translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation>貼上(&amp;P)</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>刪除</translation>
+ </message>
+ </context>
+ <context>
+ <name>QLocalServer</name>
+ <message>
+ <source>%1: Name error</source>
+ <translation>%1:名稱錯誤</translation>
+ </message>
+ <message>
+ <source>%1: Permission denied</source>
+ <translation>%1:存取被拒</translation>
+ </message>
+ <message>
+ <source>%1: Address in use</source>
+ <translation>%1:位址使用中</translation>
+ </message>
+ <message>
+ <source>%1: Unknown error %2</source>
+ <translation>%1:未知的錯誤 %2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QLocalSocket</name>
+ <message>
+ <source>%1: Connection refused</source>
+ <translation>%1:連線被拒</translation>
+ </message>
+ <message>
+ <source>%1: Remote closed</source>
+ <translation>%1:遠端已關閉</translation>
+ </message>
+ <message>
+ <source>%1: Invalid name</source>
+ <translation>%1:不合法的名稱</translation>
+ </message>
+ <message>
+ <source>%1: Socket access error</source>
+ <translation>%1:Socket 位址錯誤</translation>
+ </message>
+ <message>
+ <source>%1: Socket resource error</source>
+ <translation>%1:Socket 資源錯誤</translation>
+ </message>
+ <message>
+ <source>%1: Socket operation timed out</source>
+ <translation>%1:Socket 操作逾時</translation>
+ </message>
+ <message>
+ <source>%1: Datagram too large</source>
+ <translation>%1:資料包過大</translation>
+ </message>
+ <message>
+ <source>%1: Connection error</source>
+ <translation>%1:連線錯誤</translation>
+ </message>
+ <message>
+ <source>%1: The socket operation is not supported</source>
+ <translation>%1:socket 操作未支援</translation>
+ </message>
+ <message>
+ <source>%1: Unknown error</source>
+ <translation>%1:未知的錯誤</translation>
+ </message>
+ <message>
+ <source>%1: Unknown error %2</source>
+ <translation>%1:未知的錯誤 %2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMYSQLDriver</name>
+ <message>
+ <source>Unable to open database &apos;</source>
+ <translation>無法開啟資料庫</translation>
+ </message>
+ <message>
+ <source>Unable to connect</source>
+ <translation>無法連線</translation>
+ </message>
+ <message>
+ <source>Unable to begin transaction</source>
+ <translation>無法開始事務</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>無法提交事務</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>無法反轉事務</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMYSQLResult</name>
+ <message>
+ <source>Unable to fetch data</source>
+ <translation>無法抓取資料</translation>
+ </message>
+ <message>
+ <source>Unable to execute query</source>
+ <translation>無法執行查詢</translation>
+ </message>
+ <message>
+ <source>Unable to store result</source>
+ <translation>無法儲存結果</translation>
+ </message>
+ <message>
+ <source>Unable to prepare statement</source>
+ <translation>無法準備敘述</translation>
+ </message>
+ <message>
+ <source>Unable to reset statement</source>
+ <translation>無法重置敘述</translation>
+ </message>
+ <message>
+ <source>Unable to bind value</source>
+ <translation>無法結合數值</translation>
+ </message>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>無法執行敘述</translation>
+ </message>
+ <message>
+ <source>Unable to bind outvalues</source>
+ <translation>無法結合輸出值</translation>
+ </message>
+ <message>
+ <source>Unable to store statement results</source>
+ <translation>無法儲存敘述結果</translation>
+ </message>
+ <message>
+ <source>Unable to execute next query</source>
+ <translation>無法執行下一個查詢</translation>
+ </message>
+ <message>
+ <source>Unable to store next result</source>
+ <translation>無法儲存下一個結果</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMdiArea</name>
+ <message>
+ <source>(Untitled)</source>
+ <translation>(未命名)</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMdiSubWindow</name>
+ <message>
+ <source>%1 - [%2]</source>
+ <translation>%1 - [%2]</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>關閉</translation>
+ </message>
+ <message>
+ <source>Minimize</source>
+ <translation>最小化</translation>
+ </message>
+ <message>
+ <source>Restore Down</source>
+ <translation>向下恢復</translation>
+ </message>
+ <message>
+ <source>&amp;Restore</source>
+ <translation>回復(&amp;R)</translation>
+ </message>
+ <message>
+ <source>&amp;Move</source>
+ <translation>移動(&amp;M)</translation>
+ </message>
+ <message>
+ <source>&amp;Size</source>
+ <translation>大小(&amp;S)</translation>
+ </message>
+ <message>
+ <source>Mi&amp;nimize</source>
+ <translation>最小化(&amp;N)</translation>
+ </message>
+ <message>
+ <source>Ma&amp;ximize</source>
+ <translation>最大化(&amp;X)</translation>
+ </message>
+ <message>
+ <source>Stay on &amp;Top</source>
+ <translation>留在頂端(&amp;T)</translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation>關閉(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Maximize</source>
+ <translation>最大化</translation>
+ </message>
+ <message>
+ <source>Unshade</source>
+ <translation>取消遮蔽</translation>
+ </message>
+ <message>
+ <source>Shade</source>
+ <translation>遮蔽</translation>
+ </message>
+ <message>
+ <source>Restore</source>
+ <translation>回復</translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation>說明</translation>
+ </message>
+ <message>
+ <source>Menu</source>
+ <translation>選單</translation>
+ </message>
+ <message>
+ <source>- [%1]</source>
+ <translation>- [%1]</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMenu</name>
+ <message>
+ <source>Close</source>
+ <translation>關閉</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>開啟</translation>
+ </message>
+ <message>
+ <source>Execute</source>
+ <translation>執行</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMenuBar</name>
+ <message>
+ <source>Actions</source>
+ <translation>動作</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMessageBox</name>
+ <message>
+ <source>OK</source>
+ <translation>確定</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;關於Qt&lt;/h3&gt;&lt;p&gt;本程式使用Qt %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是一套應用於跨平台應用程式開發的C++工具集。&lt;/p&gt;&lt;p&gt;Qt提供橫跨MS&amp;nbsp;Windows、Mac&amp;nbsp;OS&amp;nbsp;X、Linux及各主要商業Unix系統的單一來源移植能力。Qt也提供適用於嵌入式裝置的版本,例如Qt for Embedded Linux和Qt for Windows CE。&lt;/p&gt;&lt;p&gt;針對不同使用者的需求,Qt有三種不同授權方式。&lt;/p&gt;&lt;p&gt;商業授權合約下的Qt授權適用於專利/商業軟體的開發,在這種情況中,您可能不想與第三方分享任何原始碼或無法遵從GNU LGPL 2.1版或GNU GPL 3.0版的條款。&lt;/p&gt;&lt;p&gt;GNU LGPL 2.1版下的Qt授權適用於開發Qt應用程式(專利或開放原始碼),您必須遵從GNU LGPL 2.1版的條款與條件。&lt;/p&gt;&lt;p&gt;GNU GPL 3.0版下的Qt授權適用於開發Qt應用程式,在這種情況中,您希望將此應用程式搭配基於GNU GPL 3.0版開發的軟體一起使用,或您樂意遵從GNU GPL 3.0版的條款。&lt;/p&gt;&lt;p&gt;請參閱&lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt;,此頁面對於Qt授權會有概略的介紹。&lt;/p&gt;&lt;p&gt;Copyright (C) 2010 諾基亞公司及/或其子公司。&lt;/p&gt;&lt;p&gt;Qt是一項諾基亞產品。如需詳細資訊,請參閱&lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt;。&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>About Qt</source>
+ <translation>關於 Qt</translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation>說明</translation>
+ </message>
+ <message>
+ <source>Show Details...</source>
+ <translation>顯示詳情...</translation>
+ </message>
+ <message>
+ <source>Hide Details...</source>
+ <translation>隱藏詳情...</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMultiInputContext</name>
+ <message>
+ <source>Select IM</source>
+ <translation>選擇輸入法</translation>
+ </message>
+ </context>
+ <context>
+ <name>QMultiInputContextPlugin</name>
+ <message>
+ <source>Multiple input method switcher</source>
+ <translation>多重輸入法切換器</translation>
+ </message>
+ <message>
+ <source>Multiple input method switcher that uses the context menu of the text widgets</source>
+ <translation>使用文字元件中的內文選單的多重輸入法切換器</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNativeSocketEngine</name>
+ <message>
+ <source>The remote host closed the connection</source>
+ <translation>遠端主機關閉了連線</translation>
+ </message>
+ <message>
+ <source>Network operation timed out</source>
+ <translation>網路操作逾時</translation>
+ </message>
+ <message>
+ <source>Out of resources</source>
+ <translation>資源不足</translation>
+ </message>
+ <message>
+ <source>Unsupported socket operation</source>
+ <translation>未支援的 socket 操作</translation>
+ </message>
+ <message>
+ <source>Protocol type not supported</source>
+ <translation>協定型態未支援</translation>
+ </message>
+ <message>
+ <source>Invalid socket descriptor</source>
+ <translation>不合法的 socket 描述子</translation>
+ </message>
+ <message>
+ <source>Network unreachable</source>
+ <translation>無法使用網路</translation>
+ </message>
+ <message>
+ <source>Permission denied</source>
+ <translation>權限不足</translation>
+ </message>
+ <message>
+ <source>Connection timed out</source>
+ <translation>連線逾時</translation>
+ </message>
+ <message>
+ <source>Connection refused</source>
+ <translation>連線被拒</translation>
+ </message>
+ <message>
+ <source>The bound address is already in use</source>
+ <translation>結合的位址已經在使用中</translation>
+ </message>
+ <message>
+ <source>The address is not available</source>
+ <translation>無法取得位址</translation>
+ </message>
+ <message>
+ <source>The address is protected</source>
+ <translation>此位址已被保護</translation>
+ </message>
+ <message>
+ <source>Unable to send a message</source>
+ <translation>無法送出訊息</translation>
+ </message>
+ <message>
+ <source>Unable to receive a message</source>
+ <translation>無法接收訊息</translation>
+ </message>
+ <message>
+ <source>Unable to write</source>
+ <translation>無法寫入</translation>
+ </message>
+ <message>
+ <source>Network error</source>
+ <translation>網路錯誤</translation>
+ </message>
+ <message>
+ <source>Another socket is already listening on the same port</source>
+ <translation>另一個 socket 已經在監聽同一個連接埠</translation>
+ </message>
+ <message>
+ <source>Unable to initialize non-blocking socket</source>
+ <translation>無法初始化非阻擋性 socket</translation>
+ </message>
+ <message>
+ <source>Unable to initialize broadcast socket</source>
+ <translation>無法初始化廣播 socket</translation>
+ </message>
+ <message>
+ <source>Attempt to use IPv6 socket on a platform with no IPv6 support</source>
+ <translation>試圖在沒有 IPv6 支援的平台上使用 IPv6 socket</translation>
+ </message>
+ <message>
+ <source>Host unreachable</source>
+ <translation>無法連線到主機</translation>
+ </message>
+ <message>
+ <source>Datagram was too large to send</source>
+ <translation>資料過大無法送出</translation>
+ </message>
+ <message>
+ <source>Operation on non-socket</source>
+ <translation>對非 socket 操作</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>未知的錯誤</translation>
+ </message>
+ <message>
+ <source>The proxy type is invalid for this operation</source>
+ <translation>代理伺服器型態無法支援此操作</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkAccessCacheBackend</name>
+ <message>
+ <source>Error opening %1</source>
+ <translation>開啟 %1 發生錯誤</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkAccessDebugPipeBackend</name>
+ <message>
+ <source>Write error writing to %1: %2</source>
+ <translation>寫入%1時發生寫入錯誤:%2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkAccessFileBackend</name>
+ <message>
+ <source>Request for opening non-local file %1</source>
+ <translation>要求開啟非本地端檔案 %1</translation>
+ </message>
+ <message>
+ <source>Error opening %1: %2</source>
+ <translation>開啟 %1 發生錯誤:%2</translation>
+ </message>
+ <message>
+ <source>Write error writing to %1: %2</source>
+ <translation>寫入 %1 時發生錯誤:%2</translation>
+ </message>
+ <message>
+ <source>Cannot open %1: Path is a directory</source>
+ <translation>無法開啟 %1:此路徑是一個目錄</translation>
+ </message>
+ <message>
+ <source>Read error reading from %1: %2</source>
+ <translation>從 %1 讀取錯誤:%2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkAccessFtpBackend</name>
+ <message>
+ <source>No suitable proxy found</source>
+ <translation>找不到合適的代理伺服器</translation>
+ </message>
+ <message>
+ <source>Cannot open %1: is a directory</source>
+ <translation>無法開啟 %1:是一個目錄</translation>
+ </message>
+ <message>
+ <source>Logging in to %1 failed: authentication required</source>
+ <translation>登入 %1 失敗:需要認證</translation>
+ </message>
+ <message>
+ <source>Error while downloading %1: %2</source>
+ <translation>下載 %1 時發生錯誤:%2</translation>
+ </message>
+ <message>
+ <source>Error while uploading %1: %2</source>
+ <translation>上傳 %1 時發生錯誤:%2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkAccessHttpBackend</name>
+ <message>
+ <source>No suitable proxy found</source>
+ <translation>找不到合適的代理伺服器</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkReply</name>
+ <message>
+ <source>Error downloading %1 - server replied: %2</source>
+ <translation>下載 %1 時發生錯誤─伺服器回應:%2</translation>
+ </message>
+ <message>
+ <source>Protocol &quot;%1&quot; is unknown</source>
+ <translation>未知的協定 %1</translation>
+ </message>
+ </context>
+ <context>
+ <name>QNetworkReplyImpl</name>
+ <message>
+ <source>Operation canceled</source>
+ <translation>取消操作</translation>
+ </message>
+ </context>
+ <context>
+ <name>QOCIDriver</name>
+ <message>
+ <source>Unable to logon</source>
+ <translation>無法登入</translation>
+ </message>
+ <message>
+ <source>Unable to initialize</source>
+ <comment>QOCIDriver</comment>
+ <translation>無法初始化</translation>
+ </message>
+ <message>
+ <source>Unable to begin transaction</source>
+ <translation>無法開始事務</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>無法提交事務</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>無法反轉事務</translation>
+ </message>
+ </context>
+ <context>
+ <name>QOCIResult</name>
+ <message>
+ <source>Unable to bind column for batch execute</source>
+ <translation>無法結合欄位以做批次執行</translation>
+ </message>
+ <message>
+ <source>Unable to execute batch statement</source>
+ <translation>無法執行批次敘述</translation>
+ </message>
+ <message>
+ <source>Unable to goto next</source>
+ <translation>無法跳到下一個</translation>
+ </message>
+ <message>
+ <source>Unable to alloc statement</source>
+ <translation>無法配置敘述</translation>
+ </message>
+ <message>
+ <source>Unable to prepare statement</source>
+ <translation>無法準備敘述</translation>
+ </message>
+ <message>
+ <source>Unable to get statement type</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to bind value</source>
+ <translation>無法結合數值</translation>
+ </message>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>無法執行敘述</translation>
+ </message>
+ </context>
+ <context>
+ <name>QODBCDriver</name>
+ <message>
+ <source>Unable to connect</source>
+ <translation>無法連接</translation>
+ </message>
+ <message>
+ <source>Unable to disable autocommit</source>
+ <translation>無法關閉自動提交功能</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>無法提交事務</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>無法反轉事務</translation>
+ </message>
+ <message>
+ <source>Unable to enable autocommit</source>
+ <translation>無法開啟自動提交功能</translation>
+ </message>
+ <message>
+ <source>Unable to connect - Driver doesn&apos;t support all functionality required</source>
+ <translation type="unfinished"></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: 無法設定 SQL_CURSOR_STATIC 做為敘述屬性。請檢查您的 ODBC 驅動程式的設定</translation>
+ </message>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>無法執行敘述</translation>
+ </message>
+ <message>
+ <source>Unable to fetch next</source>
+ <translation>無法抓取下一筆</translation>
+ </message>
+ <message>
+ <source>Unable to prepare statement</source>
+ <translation>無法準備敘述</translation>
+ </message>
+ <message>
+ <source>Unable to bind variable</source>
+ <translation>無法結合變數</translation>
+ </message>
+ <message>
+ <source>Unable to fetch last</source>
+ <translation>無法抓取最後一筆</translation>
+ </message>
+ <message>
+ <source>Unable to fetch</source>
+ <translation>無法抓取</translation>
+ </message>
+ <message>
+ <source>Unable to fetch first</source>
+ <translation>無法抓取第一筆</translation>
+ </message>
+ <message>
+ <source>Unable to fetch previous</source>
+ <translation>無法抓取前一筆</translation>
+ </message>
+ </context>
+ <context>
+ <name>QObject</name>
+ <message>
+ <source>Invalid hostname</source>
+ <translation>主機名稱無效</translation>
+ </message>
+ <message>
+ <source>Operation not supported on %1</source>
+ <translation>在 %1 上不支援此操作</translation>
+ </message>
+ <message>
+ <source>Invalid URI: %1</source>
+ <translation>不合法的網址:%1</translation>
+ </message>
+ <message>
+ <source>Socket error on %1: %2</source>
+ <translation>%1 上發生 socket 錯誤:%2</translation>
+ </message>
+ <message>
+ <source>Remote host closed the connection prematurely on %1</source>
+ <translation>於 %1 上遠端主機關閉了不正常的連線</translation>
+ </message>
+ <message>
+ <source>No host name given</source>
+ <translation>未指定主機</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPPDOptionsModel</name>
+ <message>
+ <source>Name</source>
+ <translation>名稱</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>值</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPSQLDriver</name>
+ <message>
+ <source>Unable to connect</source>
+ <translation>無法連線</translation>
+ </message>
+ <message>
+ <source>Could not begin transaction</source>
+ <translation>無法開始事務</translation>
+ </message>
+ <message>
+ <source>Could not commit transaction</source>
+ <translation>無法提交事務</translation>
+ </message>
+ <message>
+ <source>Could not rollback transaction</source>
+ <translation>無法反轉事務</translation>
+ </message>
+ <message>
+ <source>Unable to subscribe</source>
+ <translation>無法訂閱</translation>
+ </message>
+ <message>
+ <source>Unable to unsubscribe</source>
+ <translation>無法取消訂閱</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPSQLResult</name>
+ <message>
+ <source>Unable to create query</source>
+ <translation>無法建立查詢</translation>
+ </message>
+ <message>
+ <source>Unable to prepare statement</source>
+ <translation>無法準備敘述</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPageSetupWidget</name>
+ <message>
+ <source>Centimeters (cm)</source>
+ <translation>公分</translation>
+ </message>
+ <message>
+ <source>Millimeters (mm)</source>
+ <translation>公厘</translation>
+ </message>
+ <message>
+ <source>Inches (in)</source>
+ <translation>英吋</translation>
+ </message>
+ <message>
+ <source>Points (pt)</source>
+ <translation>點</translation>
+ </message>
+ <message>
+ <source>Form</source>
+ <translation>表單</translation>
+ </message>
+ <message>
+ <source>Paper</source>
+ <translation>紙張</translation>
+ </message>
+ <message>
+ <source>Page size:</source>
+ <translation>紙張大小:</translation>
+ </message>
+ <message>
+ <source>Width:</source>
+ <translation>寬度:</translation>
+ </message>
+ <message>
+ <source>Height:</source>
+ <translation>高度:</translation>
+ </message>
+ <message>
+ <source>Paper source:</source>
+ <translation>紙張來源:</translation>
+ </message>
+ <message>
+ <source>Orientation</source>
+ <translation>方向</translation>
+ </message>
+ <message>
+ <source>Portrait</source>
+ <translation>縱向</translation>
+ </message>
+ <message>
+ <source>Landscape</source>
+ <translation>橫向</translation>
+ </message>
+ <message>
+ <source>Reverse landscape</source>
+ <translation>反序橫向</translation>
+ </message>
+ <message>
+ <source>Reverse portrait</source>
+ <translation>反序縱向</translation>
+ </message>
+ <message>
+ <source>Margins</source>
+ <translation>邊緣</translation>
+ </message>
+ <message>
+ <source>top margin</source>
+ <translation>上緣</translation>
+ </message>
+ <message>
+ <source>left margin</source>
+ <translation>左緣</translation>
+ </message>
+ <message>
+ <source>right margin</source>
+ <translation>右緣</translation>
+ </message>
+ <message>
+ <source>bottom margin</source>
+ <translation>下緣</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPluginLoader</name>
+ <message>
+ <source>Unknown error</source>
+ <translation>未知的錯誤</translation>
+ </message>
+ <message>
+ <source>The plugin was not loaded.</source>
+ <translation>外掛程式未載入。</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPrintDialog</name>
+ <message>
+ <source>locally connected</source>
+ <translation>本地連接</translation>
+ </message>
+ <message>
+ <source>Aliases: %1</source>
+ <translation>別名:%1</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation>未知</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>確定</translation>
+ </message>
+ <message>
+ <source>Print all</source>
+ <translation>全部列印</translation>
+ </message>
+ <message>
+ <source>Print range</source>
+ <translation>列印範圍</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>對開 (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 常用 10 號信封 (105x241 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 英吋)</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 英吋)</translation>
+ </message>
+ <message>
+ <source>Executive (7.5 x 10 inches, 191 x 254 mm)</source>
+ <translation>Executive (7.5 x 10 英吋, 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 英吋, 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 英吋, 216 x 279 mm)</translation>
+ </message>
+ <message>
+ <source>Print selection</source>
+ <translation>列印選擇區</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation>列印</translation>
+ </message>
+ <message>
+ <source>Print To File ...</source>
+ <translation>列印到檔案...</translation>
+ </message>
+ <message>
+ <source>File %1 is not writable.
+Please choose a different file name.</source>
+ <translation>檔案 %1 無法寫入。
+請選擇其它檔名。</translation>
+ </message>
+ <message>
+ <source>%1 already exists.
+Do you want to overwrite it?</source>
+ <translation>%1 已存在。
+您要覆寫它嗎?</translation>
+ </message>
+ <message>
+ <source>File exists</source>
+ <translation>檔案已存在</translation>
+ </message>
+ <message>
+ <source>&lt;qt&gt;Do you want to overwrite it?&lt;/qt&gt;</source>
+ <translation>&lt;qt&gt;您要覆寫它嗎?&lt;/qt&gt;</translation>
+ </message>
+ <message>
+ <source>%1 is a directory.
+Please choose a different file name.</source>
+ <translation>%1 是一個目錄。
+請選擇其他檔名。</translation>
+ </message>
+ <message>
+ <source>The &apos;From&apos; value cannot be greater than the &apos;To&apos; value.</source>
+ <translation>起始數值不能大於結束數值</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>自訂</translation>
+ </message>
+ <message>
+ <source>&amp;Options &gt;&gt;</source>
+ <translation>操作 (&amp;O) &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Options &lt;&lt;</source>
+ <translation>操作 (&amp;O) &lt;&lt;</translation>
+ </message>
+ <message>
+ <source>Print to File (PDF)</source>
+ <translation>列印到檔案(PDF)</translation>
+ </message>
+ <message>
+ <source>Print to File (Postscript)</source>
+ <translation>列印到檔案(Postscript)</translation>
+ </message>
+ <message>
+ <source>Local file</source>
+ <translation>本地端檔案</translation>
+ </message>
+ <message>
+ <source>Write %1 file</source>
+ <translation>寫入 %1 檔案</translation>
+ </message>
+ <message>
+ <source>&amp;Print</source>
+ <translation>列印(&amp;P)</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPrintPreviewDialog</name>
+ <message>
+ <source>%1%</source>
+ <translation>%1%</translation>
+ </message>
+ <message>
+ <source>Print Preview</source>
+ <translation>列印預覽</translation>
+ </message>
+ <message>
+ <source>Next page</source>
+ <translation>下一頁</translation>
+ </message>
+ <message>
+ <source>Previous page</source>
+ <translation>前一頁</translation>
+ </message>
+ <message>
+ <source>First page</source>
+ <translation>第一頁</translation>
+ </message>
+ <message>
+ <source>Last page</source>
+ <translation>最後一頁</translation>
+ </message>
+ <message>
+ <source>Fit width</source>
+ <translation>符合寬度</translation>
+ </message>
+ <message>
+ <source>Fit page</source>
+ <translation>符合頁面</translation>
+ </message>
+ <message>
+ <source>Zoom in</source>
+ <translation>放大</translation>
+ </message>
+ <message>
+ <source>Zoom out</source>
+ <translation>縮小</translation>
+ </message>
+ <message>
+ <source>Portrait</source>
+ <translation>縱向</translation>
+ </message>
+ <message>
+ <source>Landscape</source>
+ <translation>橫向</translation>
+ </message>
+ <message>
+ <source>Show single page</source>
+ <translation>顯示單一頁面</translation>
+ </message>
+ <message>
+ <source>Show facing pages</source>
+ <translation>顯示封面</translation>
+ </message>
+ <message>
+ <source>Show overview of all pages</source>
+ <translation>顯示所有頁面預覽</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation>列印</translation>
+ </message>
+ <message>
+ <source>Page setup</source>
+ <translation>列印設定</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>關閉</translation>
+ </message>
+ <message>
+ <source>Export to PDF</source>
+ <translation>匯出到 PDF 檔</translation>
+ </message>
+ <message>
+ <source>Export to PostScript</source>
+ <translation>匯出到 PostScript 檔</translation>
+ </message>
+ <message>
+ <source>Page Setup</source>
+ <translation>頁面設定</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPrintPropertiesWidget</name>
+ <message>
+ <source>Form</source>
+ <translation>表單</translation>
+ </message>
+ <message>
+ <source>Page</source>
+ <translation>頁面</translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>進階</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPrintSettingsOutput</name>
+ <message>
+ <source>Form</source>
+ <translation>表單</translation>
+ </message>
+ <message>
+ <source>Copies</source>
+ <translation>份數</translation>
+ </message>
+ <message>
+ <source>Print range</source>
+ <translation>列印範圍</translation>
+ </message>
+ <message>
+ <source>Print all</source>
+ <translation>全部列印</translation>
+ </message>
+ <message>
+ <source>Pages from</source>
+ <translation>指定頁面:從</translation>
+ </message>
+ <message>
+ <source>to</source>
+ <translation>到</translation>
+ </message>
+ <message>
+ <source>Selection</source>
+ <translation>選擇區</translation>
+ </message>
+ <message>
+ <source>Output Settings</source>
+ <translation>輸出設定</translation>
+ </message>
+ <message>
+ <source>Copies:</source>
+ <translation>份數:</translation>
+ </message>
+ <message>
+ <source>Collate</source>
+ <translation>校對</translation>
+ </message>
+ <message>
+ <source>Reverse</source>
+ <translation>反向</translation>
+ </message>
+ <message>
+ <source>Options</source>
+ <translation>選項</translation>
+ </message>
+ <message>
+ <source>Color Mode</source>
+ <translation>顏色模式</translation>
+ </message>
+ <message>
+ <source>Color</source>
+ <translation>顏色</translation>
+ </message>
+ <message>
+ <source>Grayscale</source>
+ <translation>灰階</translation>
+ </message>
+ <message>
+ <source>Duplex Printing</source>
+ <translation>雙工列印</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>無</translation>
+ </message>
+ <message>
+ <source>Long side</source>
+ <translation>長邊</translation>
+ </message>
+ <message>
+ <source>Short side</source>
+ <translation>短邊</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPrintWidget</name>
+ <message>
+ <source>Form</source>
+ <translation>表單</translation>
+ </message>
+ <message>
+ <source>Printer</source>
+ <translation>印表機</translation>
+ </message>
+ <message>
+ <source>&amp;Name:</source>
+ <translation>名稱(&amp;N):</translation>
+ </message>
+ <message>
+ <source>P&amp;roperties</source>
+ <translation>屬性(&amp;R)</translation>
+ </message>
+ <message>
+ <source>Location:</source>
+ <translation>位置:</translation>
+ </message>
+ <message>
+ <source>Preview</source>
+ <translation>預覽</translation>
+ </message>
+ <message>
+ <source>Type:</source>
+ <translation>型態:</translation>
+ </message>
+ <message>
+ <source>Output &amp;file:</source>
+ <translation>輸出檔案(&amp;F):</translation>
+ </message>
+ <message>
+ <source>...</source>
+ <translation>...</translation>
+ </message>
+ </context>
+ <context>
+ <name>QProcess</name>
+ <message>
+ <source>Could not open input redirection for reading</source>
+ <translation>無法開啟輸入導向以讀取</translation>
+ </message>
+ <message>
+ <source>Could not open output redirection for writing</source>
+ <translation>無法開啟輸出導向以寫入</translation>
+ </message>
+ <message>
+ <source>Resource error (fork failure): %1</source>
+ <translation>資源錯誤(fork 失敗):%1</translation>
+ </message>
+ <message>
+ <source>Process operation timed out</source>
+ <translation>行程操作逾時</translation>
+ </message>
+ <message>
+ <source>Error reading from process</source>
+ <translation>從行程讀取時發生錯誤</translation>
+ </message>
+ <message>
+ <source>Error writing to process</source>
+ <translation>寫入行程時發生錯誤</translation>
+ </message>
+ <message>
+ <source>Process crashed</source>
+ <translation>行程已崩潰</translation>
+ </message>
+ <message>
+ <source>No program defined</source>
+ <translation>未定義程式</translation>
+ </message>
+ <message>
+ <source>Process failed to start: %1</source>
+ <translation>處理序啟動失敗:%1</translation>
+ </message>
+ </context>
+ <context>
+ <name>QProgressDialog</name>
+ <message>
+ <source>Cancel</source>
+ <translation>取消</translation>
+ </message>
+ </context>
+ <context>
+ <name>QPushButton</name>
+ <message>
+ <source>Open</source>
+ <translation>開啟</translation>
+ </message>
+ </context>
+ <context>
+ <name>QRadioButton</name>
+ <message>
+ <source>Check</source>
+ <translation>勾選</translation>
+ </message>
+ </context>
+ <context>
+ <name>QRegExp</name>
+ <message>
+ <source>no error occurred</source>
+ <translation>沒有發生錯誤</translation>
+ </message>
+ <message>
+ <source>disabled feature used</source>
+ <translation>使用已關閉的功能</translation>
+ </message>
+ <message>
+ <source>bad char class syntax</source>
+ <translation>錯誤的字元類別語法</translation>
+ </message>
+ <message>
+ <source>bad lookahead syntax</source>
+ <translation>錯誤的 lookahead 語法</translation>
+ </message>
+ <message>
+ <source>bad repetition syntax</source>
+ <translation>錯誤的重覆語法</translation>
+ </message>
+ <message>
+ <source>invalid octal value</source>
+ <translation>不合法的八進位值</translation>
+ </message>
+ <message>
+ <source>missing left delim</source>
+ <translation>少了左方的區隔符</translation>
+ </message>
+ <message>
+ <source>unexpected end</source>
+ <translation>未預期遇到結尾</translation>
+ </message>
+ <message>
+ <source>met internal limit</source>
+ <translation>遇到內部限制</translation>
+ </message>
+ <message>
+ <source>invalid interval</source>
+ <translation>間隔無效</translation>
+ </message>
+ <message>
+ <source>invalid category</source>
+ <translation>類別無效</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSQLite2Driver</name>
+ <message>
+ <source>Error opening database</source>
+ <translation>開啟資料庫時發生錯誤</translation>
+ </message>
+ <message>
+ <source>Unable to begin transaction</source>
+ <translation>無法開始事務</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>無法提交事務</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>無法復原交易</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSQLite2Result</name>
+ <message>
+ <source>Unable to fetch results</source>
+ <translation>無法抓取結果</translation>
+ </message>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>無法執行敘述</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSQLiteDriver</name>
+ <message>
+ <source>Error opening database</source>
+ <translation>開啟資料庫發生錯誤</translation>
+ </message>
+ <message>
+ <source>Error closing database</source>
+ <translation>關閉資料庫發生錯誤</translation>
+ </message>
+ <message>
+ <source>Unable to begin transaction</source>
+ <translation>無法開始事務</translation>
+ </message>
+ <message>
+ <source>Unable to commit transaction</source>
+ <translation>無法提交事務</translation>
+ </message>
+ <message>
+ <source>Unable to rollback transaction</source>
+ <translation>無法反轉事務</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSQLiteResult</name>
+ <message>
+ <source>Unable to fetch row</source>
+ <translation>無法抓取列</translation>
+ </message>
+ <message>
+ <source>Unable to execute statement</source>
+ <translation>無法執行敘述</translation>
+ </message>
+ <message>
+ <source>Unable to reset statement</source>
+ <translation>無法重置敘述</translation>
+ </message>
+ <message>
+ <source>Unable to bind parameters</source>
+ <translation>無法結合參數</translation>
+ </message>
+ <message>
+ <source>Parameter count mismatch</source>
+ <translation>參數數量不符合</translation>
+ </message>
+ <message>
+ <source>No query</source>
+ <translation>沒有查詢</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptBreakpointsModel</name>
+ <message>
+ <source>ID</source>
+ <translation>ID</translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation>位置</translation>
+ </message>
+ <message>
+ <source>Condition</source>
+ <translation>條件</translation>
+ </message>
+ <message>
+ <source>Ignore-count</source>
+ <translation>忽略次數</translation>
+ </message>
+ <message>
+ <source>Single-shot</source>
+ <translation>單次</translation>
+ </message>
+ <message>
+ <source>Hit-count</source>
+ <translation>叫用次數</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptBreakpointsWidget</name>
+ <message>
+ <source>New</source>
+ <translation>新增</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>刪除</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptDebugger</name>
+ <message>
+ <source>Go to Line</source>
+ <translation>跳至指定行</translation>
+ </message>
+ <message>
+ <source>Line:</source>
+ <translation>行:</translation>
+ </message>
+ <message>
+ <source>Interrupt</source>
+ <translation>插斷</translation>
+ </message>
+ <message>
+ <source>Shift+F5</source>
+ <translation>Shift+F5</translation>
+ </message>
+ <message>
+ <source>Continue</source>
+ <translation>繼續</translation>
+ </message>
+ <message>
+ <source>F5</source>
+ <translation>F5</translation>
+ </message>
+ <message>
+ <source>Step Into</source>
+ <translation>逐步執行</translation>
+ </message>
+ <message>
+ <source>F11</source>
+ <translation>F11</translation>
+ </message>
+ <message>
+ <source>Step Over</source>
+ <translation>不進入函式</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation>F10</translation>
+ </message>
+ <message>
+ <source>Step Out</source>
+ <translation>跳出函式</translation>
+ </message>
+ <message>
+ <source>Shift+F11</source>
+ <translation>Shift+F11</translation>
+ </message>
+ <message>
+ <source>Run to Cursor</source>
+ <translation>執行至游標處</translation>
+ </message>
+ <message>
+ <source>Ctrl+F10</source>
+ <translation>Ctrl+F10</translation>
+ </message>
+ <message>
+ <source>Run to New Script</source>
+ <translation>執行至新指令碼</translation>
+ </message>
+ <message>
+ <source>Toggle Breakpoint</source>
+ <translation>切換中斷點</translation>
+ </message>
+ <message>
+ <source>F9</source>
+ <translation>F9</translation>
+ </message>
+ <message>
+ <source>Clear Debug Output</source>
+ <translation>清除偵錯輸出</translation>
+ </message>
+ <message>
+ <source>Clear Error Log</source>
+ <translation>清除錯誤記錄</translation>
+ </message>
+ <message>
+ <source>Clear Console</source>
+ <translation>清除主控台</translation>
+ </message>
+ <message>
+ <source>&amp;Find in Script...</source>
+ <translation>在指令碼中尋找(&amp;F)...</translation>
+ </message>
+ <message>
+ <source>Ctrl+F</source>
+ <translation>Ctrl+F</translation>
+ </message>
+ <message>
+ <source>Find &amp;Next</source>
+ <translation>尋找下一個(&amp;N)</translation>
+ </message>
+ <message>
+ <source>F3</source>
+ <translation>F3</translation>
+ </message>
+ <message>
+ <source>Find &amp;Previous</source>
+ <translation>尋找上一個(&amp;P)</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>偵錯</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptDebuggerCodeFinderWidget</name>
+ <message>
+ <source>Close</source>
+ <translation>關閉</translation>
+ </message>
+ <message>
+ <source>Previous</source>
+ <translation>上一個</translation>
+ </message>
+ <message>
+ <source>Next</source>
+ <translation>下一個</translation>
+ </message>
+ <message>
+ <source>Case Sensitive</source>
+ <translation>區分大小寫</translation>
+ </message>
+ <message>
+ <source>Whole words</source>
+ <translation>全字</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;搜尋已繞回</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptDebuggerLocalsModel</name>
+ <message>
+ <source>Name</source>
+ <translation>名稱</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>值</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptDebuggerStackModel</name>
+ <message>
+ <source>Level</source>
+ <translation>層級</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>名稱</translation>
+ </message>
+ <message>
+ <source>Location</source>
+ <translation>位置</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptEdit</name>
+ <message>
+ <source>Toggle Breakpoint</source>
+ <translation>切換中斷點</translation>
+ </message>
+ <message>
+ <source>Disable Breakpoint</source>
+ <translation>停用中斷點</translation>
+ </message>
+ <message>
+ <source>Enable Breakpoint</source>
+ <translation>啟用中斷點</translation>
+ </message>
+ <message>
+ <source>Breakpoint Condition:</source>
+ <translation>中斷點條件:</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptEngineDebugger</name>
+ <message>
+ <source>Loaded Scripts</source>
+ <translation>載入的指令碼</translation>
+ </message>
+ <message>
+ <source>Breakpoints</source>
+ <translation>中斷點</translation>
+ </message>
+ <message>
+ <source>Stack</source>
+ <translation>堆疊</translation>
+ </message>
+ <message>
+ <source>Locals</source>
+ <translation>區域變數</translation>
+ </message>
+ <message>
+ <source>Console</source>
+ <translation>主控台</translation>
+ </message>
+ <message>
+ <source>Debug Output</source>
+ <translation>偵錯輸出</translation>
+ </message>
+ <message>
+ <source>Error Log</source>
+ <translation>錯誤記錄</translation>
+ </message>
+ <message>
+ <source>Search</source>
+ <translation>搜尋</translation>
+ </message>
+ <message>
+ <source>View</source>
+ <translation>檢視</translation>
+ </message>
+ <message>
+ <source>Qt Script Debugger</source>
+ <translation>Qt指令碼偵錯程式</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScriptNewBreakpointWidget</name>
+ <message>
+ <source>Close</source>
+ <translation>關閉</translation>
+ </message>
+ </context>
+ <context>
+ <name>QScrollBar</name>
+ <message>
+ <source>Scroll here</source>
+ <translation>在此捲軸</translation>
+ </message>
+ <message>
+ <source>Left edge</source>
+ <translation>左邊緣</translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <translation>頂端</translation>
+ </message>
+ <message>
+ <source>Right edge</source>
+ <translation>右邊緣</translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <translation>底端</translation>
+ </message>
+ <message>
+ <source>Page left</source>
+ <translation>頁面左方</translation>
+ </message>
+ <message>
+ <source>Page up</source>
+ <translation>頁面上方</translation>
+ </message>
+ <message>
+ <source>Page right</source>
+ <translation>頁面右方</translation>
+ </message>
+ <message>
+ <source>Page down</source>
+ <translation>頁面下方</translation>
+ </message>
+ <message>
+ <source>Scroll left</source>
+ <translation>往左捲軸</translation>
+ </message>
+ <message>
+ <source>Scroll up</source>
+ <translation>往上捲軸</translation>
+ </message>
+ <message>
+ <source>Scroll right</source>
+ <translation>往右捲軸</translation>
+ </message>
+ <message>
+ <source>Scroll down</source>
+ <translation>往下捲軸</translation>
+ </message>
+ <message>
+ <source>Line up</source>
+ <translation>對上排列</translation>
+ </message>
+ <message>
+ <source>Position</source>
+ <translation>位置</translation>
+ </message>
+ <message>
+ <source>Line down</source>
+ <translation>對下排列</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSharedMemory</name>
+ <message>
+ <source>%1: create size is less then 0</source>
+ <translation>%1:建立大小小於 0</translation>
+ </message>
+ <message>
+ <source>%1: unable to lock</source>
+ <translation>%1:無法鎖定</translation>
+ </message>
+ <message>
+ <source>%1: unable to unlock</source>
+ <translation>%1:無法解除鎖定</translation>
+ </message>
+ <message>
+ <source>%1: permission denied</source>
+ <translation>%1:存取被拒</translation>
+ </message>
+ <message>
+ <source>%1: already exists</source>
+ <translation>%1:已存在</translation>
+ </message>
+ <message>
+ <source>%1: doesn&apos;t exists</source>
+ <translation>%1:不存在</translation>
+ </message>
+ <message>
+ <source>%1: out of resources</source>
+ <translation>%1:資源不足</translation>
+ </message>
+ <message>
+ <source>%1: unknown error %2</source>
+ <translation>%1:未知的錯誤 %2</translation>
+ </message>
+ <message>
+ <source>%1: key is empty</source>
+ <translation>%1:鍵值是空的</translation>
+ </message>
+ <message>
+ <source>%1: ftok failed</source>
+ <translation>%1:ftok 失敗</translation>
+ </message>
+ <message>
+ <source>%1: unable to make key</source>
+ <translation>%1:無法產生鍵值</translation>
+ </message>
+ <message>
+ <source>%1: doesn&apos;t exist</source>
+ <translation>%1:不存在</translation>
+ </message>
+ <message>
+ <source>%1: UNIX key file doesn&apos;t exist</source>
+ <translation>%1:UNIX金鑰檔不存在</translation>
+ </message>
+ <message>
+ <source>%1: system-imposed size restrictions</source>
+ <translation>%1:系統大小限制</translation>
+ </message>
+ <message>
+ <source>%1: not attached</source>
+ <translation>%1:未附加</translation>
+ </message>
+ <message>
+ <source>%1: invalid size</source>
+ <translation>%1:不合法的大小</translation>
+ </message>
+ <message>
+ <source>%1: key error</source>
+ <translation>%1:鍵值錯誤</translation>
+ </message>
+ <message>
+ <source>%1: size query failed</source>
+ <translation>%1:大小查詢失敗</translation>
+ </message>
+ <message>
+ <source>%1: unable to set key on lock</source>
+ <translation>%1:無法設定鍵值</translation>
+ </message>
+ </context>
+ <context>
+ <name>QShortcut</name>
+ <message>
+ <source>Space</source>
+ <translation>空白鍵</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>左鍵</translation>
+ </message>
+ <message>
+ <source>Up</source>
+ <translation>上鍵</translation>
+ </message>
+ <message>
+ <source>Right</source>
+ <translation>右鍵</translation>
+ </message>
+ <message>
+ <source>Down</source>
+ <translation>下鍵</translation>
+ </message>
+ <message>
+ <source>PgUp</source>
+ <translation>PgUp</translation>
+ </message>
+ <message>
+ <source>PgDown</source>
+ <translation>PgDown</translation>
+ </message>
+ <message>
+ <source>CapsLock</source>
+ <translation>大寫鎖定</translation>
+ </message>
+ <message>
+ <source>NumLock</source>
+ <translation>數字鎖定</translation>
+ </message>
+ <message>
+ <source>ScrollLock</source>
+ <translation>捲軸鎖定</translation>
+ </message>
+ <message>
+ <source>Menu</source>
+ <translation>選單</translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation>說明</translation>
+ </message>
+ <message>
+ <source>Back</source>
+ <translation>返回</translation>
+ </message>
+ <message>
+ <source>Forward</source>
+ <translation>往前</translation>
+ </message>
+ <message>
+ <source>Stop</source>
+ <translation>停止</translation>
+ </message>
+ <message>
+ <source>Refresh</source>
+ <translation>刷新</translation>
+ </message>
+ <message>
+ <source>Volume Down</source>
+ <translation>音量降低</translation>
+ </message>
+ <message>
+ <source>Volume Mute</source>
+ <translation>靜音</translation>
+ </message>
+ <message>
+ <source>Volume Up</source>
+ <translation>音量提高</translation>
+ </message>
+ <message>
+ <source>Bass Boost</source>
+ <translation>重低音</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>媒體播放</translation>
+ </message>
+ <message>
+ <source>Media Stop</source>
+ <translation>媒體停止</translation>
+ </message>
+ <message>
+ <source>Media Previous</source>
+ <translation>媒體前一首</translation>
+ </message>
+ <message>
+ <source>Media Next</source>
+ <translation>媒體下一首</translation>
+ </message>
+ <message>
+ <source>Media Record</source>
+ <translation>媒體錄音</translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation>我的最愛</translation>
+ </message>
+ <message>
+ <source>Search</source>
+ <translation>搜尋</translation>
+ </message>
+ <message>
+ <source>Standby</source>
+ <translation>待命</translation>
+ </message>
+ <message>
+ <source>Open URL</source>
+ <translation>開啟網址</translation>
+ </message>
+ <message>
+ <source>Launch Mail</source>
+ <translation>啟動郵件程式</translation>
+ </message>
+ <message>
+ <source>Launch Media</source>
+ <translation>啟動媒體程式</translation>
+ </message>
+ <message>
+ <source>Launch (0)</source>
+ <translation>啟動(0)</translation>
+ </message>
+ <message>
+ <source>Launch (1)</source>
+ <translation>啟動(1)</translation>
+ </message>
+ <message>
+ <source>Launch (2)</source>
+ <translation>啟動(2)</translation>
+ </message>
+ <message>
+ <source>Launch (3)</source>
+ <translation>啟動(3)</translation>
+ </message>
+ <message>
+ <source>Launch (4)</source>
+ <translation>啟動(4)</translation>
+ </message>
+ <message>
+ <source>Launch (5)</source>
+ <translation>啟動(5)</translation>
+ </message>
+ <message>
+ <source>Launch (6)</source>
+ <translation>啟動(6)</translation>
+ </message>
+ <message>
+ <source>Launch (7)</source>
+ <translation>啟動(7)</translation>
+ </message>
+ <message>
+ <source>Launch (8)</source>
+ <translation>啟動(8)</translation>
+ </message>
+ <message>
+ <source>Launch (9)</source>
+ <translation>啟動(9)</translation>
+ </message>
+ <message>
+ <source>Launch (A)</source>
+ <translation>啟動(A)</translation>
+ </message>
+ <message>
+ <source>Launch (B)</source>
+ <translation>啟動(B)</translation>
+ </message>
+ <message>
+ <source>Launch (C)</source>
+ <translation>啟動(C)</translation>
+ </message>
+ <message>
+ <source>Launch (D)</source>
+ <translation>啟動(D)</translation>
+ </message>
+ <message>
+ <source>Launch (E)</source>
+ <translation>啟動(E)</translation>
+ </message>
+ <message>
+ <source>Launch (F)</source>
+ <translation>啟動(F)</translation>
+ </message>
+ <message>
+ <source>Monitor Brightness Up</source>
+ <translation>螢幕亮度提高</translation>
+ </message>
+ <message>
+ <source>Monitor Brightness Down</source>
+ <translation>螢幕亮度降低</translation>
+ </message>
+ <message>
+ <source>Keyboard Light On/Off</source>
+ <translation>鍵盤燈光開/關</translation>
+ </message>
+ <message>
+ <source>Keyboard Brightness Up</source>
+ <translation>鍵盤亮度提高</translation>
+ </message>
+ <message>
+ <source>Keyboard Brightness Down</source>
+ <translation>鍵盤亮度降低</translation>
+ </message>
+ <message>
+ <source>Power Off</source>
+ <translation>關閉電源</translation>
+ </message>
+ <message>
+ <source>Wake Up</source>
+ <translation>喚醒</translation>
+ </message>
+ <message>
+ <source>Eject</source>
+ <translation>退出</translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation>螢幕保護</translation>
+ </message>
+ <message>
+ <source>WWW</source>
+ <translation>WWW</translation>
+ </message>
+ <message>
+ <source>Sleep</source>
+ <translation>睡眠</translation>
+ </message>
+ <message>
+ <source>LightBulb</source>
+ <translation>燈泡</translation>
+ </message>
+ <message>
+ <source>Shop</source>
+ <translation>商店</translation>
+ </message>
+ <message>
+ <source>History</source>
+ <translation>記錄</translation>
+ </message>
+ <message>
+ <source>Add Favorite</source>
+ <translation>加入我的最愛</translation>
+ </message>
+ <message>
+ <source>Hot Links</source>
+ <translation>熱門連結</translation>
+ </message>
+ <message>
+ <source>Adjust Brightness</source>
+ <translation>調整亮度</translation>
+ </message>
+ <message>
+ <source>Finance</source>
+ <translation>財務</translation>
+ </message>
+ <message>
+ <source>Community</source>
+ <translation>社群</translation>
+ </message>
+ <message>
+ <source>Audio Rewind</source>
+ <translation>音訊倒轉</translation>
+ </message>
+ <message>
+ <source>Back Forward</source>
+ <translation>上一個下一個</translation>
+ </message>
+ <message>
+ <source>Application Left</source>
+ <translation>應用程式靠左</translation>
+ </message>
+ <message>
+ <source>Application Right</source>
+ <translation>應用程式靠右</translation>
+ </message>
+ <message>
+ <source>Book</source>
+ <translation>書籍</translation>
+ </message>
+ <message>
+ <source>CD</source>
+ <translation>CD</translation>
+ </message>
+ <message>
+ <source>Calculator</source>
+ <translation>計算機</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>清除</translation>
+ </message>
+ <message>
+ <source>Clear Grab</source>
+ <translation>清除抓取內容</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>關閉</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation>複製</translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation>剪下</translation>
+ </message>
+ <message>
+ <source>Display</source>
+ <translation>顯示</translation>
+ </message>
+ <message>
+ <source>DOS</source>
+ <translation>DOS</translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation>文件</translation>
+ </message>
+ <message>
+ <source>Spreadsheet</source>
+ <translation>試算表</translation>
+ </message>
+ <message>
+ <source>Browser</source>
+ <translation>瀏覽器</translation>
+ </message>
+ <message>
+ <source>Game</source>
+ <translation>遊戲</translation>
+ </message>
+ <message>
+ <source>Go</source>
+ <translation>到</translation>
+ </message>
+ <message>
+ <source>iTouch</source>
+ <translation>iTouch</translation>
+ </message>
+ <message>
+ <source>Logoff</source>
+ <translation>登出</translation>
+ </message>
+ <message>
+ <source>Market</source>
+ <translation>市場</translation>
+ </message>
+ <message>
+ <source>Meeting</source>
+ <translation>會議</translation>
+ </message>
+ <message>
+ <source>Keyboard Menu</source>
+ <translation>鍵盤功能表</translation>
+ </message>
+ <message>
+ <source>Menu PB</source>
+ <translation>功能表PB</translation>
+ </message>
+ <message>
+ <source>My Sites</source>
+ <translation>我的網站</translation>
+ </message>
+ <message>
+ <source>News</source>
+ <translation>新聞</translation>
+ </message>
+ <message>
+ <source>Home Office</source>
+ <translation>Home Office</translation>
+ </message>
+ <message>
+ <source>Option</source>
+ <translation>選項</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation>貼上</translation>
+ </message>
+ <message>
+ <source>Phone</source>
+ <translation>手機</translation>
+ </message>
+ <message>
+ <source>Reply</source>
+ <translation>回覆</translation>
+ </message>
+ <message>
+ <source>Reload</source>
+ <translation>重新載入</translation>
+ </message>
+ <message>
+ <source>Rotate Windows</source>
+ <translation>旋轉視窗</translation>
+ </message>
+ <message>
+ <source>Rotation PB</source>
+ <translation>循環PB</translation>
+ </message>
+ <message>
+ <source>Rotation KB</source>
+ <translation>循環KB</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation>儲存</translation>
+ </message>
+ <message>
+ <source>Send</source>
+ <translation>傳送</translation>
+ </message>
+ <message>
+ <source>Spellchecker</source>
+ <translation>拼字檢查</translation>
+ </message>
+ <message>
+ <source>Split Screen</source>
+ <translation>分割畫面</translation>
+ </message>
+ <message>
+ <source>Support</source>
+ <translation>支援</translation>
+ </message>
+ <message>
+ <source>Task Panel</source>
+ <translation>工作面板</translation>
+ </message>
+ <message>
+ <source>Terminal</source>
+ <translation>終端機</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation>工具</translation>
+ </message>
+ <message>
+ <source>Travel</source>
+ <translation>旅行</translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation>視訊</translation>
+ </message>
+ <message>
+ <source>Word Processor</source>
+ <translation>文字處理器</translation>
+ </message>
+ <message>
+ <source>XFer</source>
+ <translation>XFer</translation>
+ </message>
+ <message>
+ <source>Zoom In</source>
+ <translation>放大</translation>
+ </message>
+ <message>
+ <source>Zoom Out</source>
+ <translation>縮小</translation>
+ </message>
+ <message>
+ <source>Away</source>
+ <translation>離開</translation>
+ </message>
+ <message>
+ <source>Messenger</source>
+ <translation>Messenger</translation>
+ </message>
+ <message>
+ <source>WebCam</source>
+ <translation>網路攝影機</translation>
+ </message>
+ <message>
+ <source>Mail Forward</source>
+ <translation>郵件轉寄</translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation>圖片</translation>
+ </message>
+ <message>
+ <source>Music</source>
+ <translation>音樂</translation>
+ </message>
+ <message>
+ <source>Battery</source>
+ <translation>電池</translation>
+ </message>
+ <message>
+ <source>Bluetooth</source>
+ <translation>藍牙</translation>
+ </message>
+ <message>
+ <source>Wireless</source>
+ <translation>無線</translation>
+ </message>
+ <message>
+ <source>Ultra Wide Band</source>
+ <translation>超寬頻</translation>
+ </message>
+ <message>
+ <source>Audio Forward</source>
+ <translation>音訊轉送</translation>
+ </message>
+ <message>
+ <source>Audio Repeat</source>
+ <translation>音訊重複</translation>
+ </message>
+ <message>
+ <source>Audio Random Play</source>
+ <translation>音訊機播放</translation>
+ </message>
+ <message>
+ <source>Subtitle</source>
+ <translation>副標題</translation>
+ </message>
+ <message>
+ <source>Audio Cycle Track</source>
+ <translation>音訊循環軌跡</translation>
+ </message>
+ <message>
+ <source>Time</source>
+ <translation>時間</translation>
+ </message>
+ <message>
+ <source>View</source>
+ <translation>檢視</translation>
+ </message>
+ <message>
+ <source>Top Menu</source>
+ <translation>上層功能表</translation>
+ </message>
+ <message>
+ <source>Suspend</source>
+ <translation>暫止</translation>
+ </message>
+ <message>
+ <source>Hibernate</source>
+ <translation>休眠</translation>
+ </message>
+ <message>
+ <source>Print Screen</source>
+ <translation>列印螢幕</translation>
+ </message>
+ <message>
+ <source>Page Up</source>
+ <translation>往上一頁</translation>
+ </message>
+ <message>
+ <source>Page Down</source>
+ <translation>往下一頁</translation>
+ </message>
+ <message>
+ <source>Caps Lock</source>
+ <translation>大寫鎖定</translation>
+ </message>
+ <message>
+ <source>Num Lock</source>
+ <translation>數字鎖定</translation>
+ </message>
+ <message>
+ <source>Number Lock</source>
+ <translation>數字鎖定</translation>
+ </message>
+ <message>
+ <source>Scroll Lock</source>
+ <translation>捲軸鎖定</translation>
+ </message>
+ <message>
+ <source>Insert</source>
+ <translation>插入</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>刪除</translation>
+ </message>
+ <message>
+ <source>Escape</source>
+ <translation>Escape</translation>
+ </message>
+ <message>
+ <source>System Request</source>
+ <translation>系統要求 SysRq</translation>
+ </message>
+ <message>
+ <source>Select</source>
+ <translation>選擇</translation>
+ </message>
+ <message>
+ <source>Yes</source>
+ <translation>是</translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation>否</translation>
+ </message>
+ <message>
+ <source>Context1</source>
+ <translation>內文1</translation>
+ </message>
+ <message>
+ <source>Context2</source>
+ <translation>內文2</translation>
+ </message>
+ <message>
+ <source>Context3</source>
+ <translation>內文3</translation>
+ </message>
+ <message>
+ <source>Context4</source>
+ <translation>內文4</translation>
+ </message>
+ <message>
+ <source>Call</source>
+ <translation>呼叫</translation>
+ </message>
+ <message>
+ <source>Hangup</source>
+ <translation>掛斷</translation>
+ </message>
+ <message>
+ <source>Flip</source>
+ <translation>反轉</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>首頁</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSlider</name>
+ <message>
+ <source>Page left</source>
+ <translation>頁面左方</translation>
+ </message>
+ <message>
+ <source>Page up</source>
+ <translation>頁面上方</translation>
+ </message>
+ <message>
+ <source>Position</source>
+ <translation>位置</translation>
+ </message>
+ <message>
+ <source>Page right</source>
+ <translation>頁面右方</translation>
+ </message>
+ <message>
+ <source>Page down</source>
+ <translation>頁面下方</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSocks5SocketEngine</name>
+ <message>
+ <source>Connection to proxy refused</source>
+ <translation>代理伺服器連線被拒</translation>
+ </message>
+ <message>
+ <source>Connection to proxy closed prematurely</source>
+ <translation>代理伺服器連線已不正常關閉</translation>
+ </message>
+ <message>
+ <source>Proxy host not found</source>
+ <translation>找不到代理伺服器</translation>
+ </message>
+ <message>
+ <source>Connection to proxy timed out</source>
+ <translation>代理伺服器連線逾時</translation>
+ </message>
+ <message>
+ <source>Proxy authentication failed</source>
+ <translation>代理伺服器認證失敗</translation>
+ </message>
+ <message>
+ <source>Proxy authentication failed: %1</source>
+ <translation>代理伺服器認證失敗:%1</translation>
+ </message>
+ <message>
+ <source>SOCKS version 5 protocol error</source>
+ <translation>SOCKS 5 的協定錯誤</translation>
+ </message>
+ <message>
+ <source>General SOCKSv5 server failure</source>
+ <translation>一般的 SOCKSv5 伺服器錯誤</translation>
+ </message>
+ <message>
+ <source>Connection not allowed by SOCKSv5 server</source>
+ <translation>連線未被 SOCKSv5 伺服器允許</translation>
+ </message>
+ <message>
+ <source>TTL expired</source>
+ <translation>TTL 逾時</translation>
+ </message>
+ <message>
+ <source>SOCKSv5 command not supported</source>
+ <translation>SOCKSv5 指令未被支援</translation>
+ </message>
+ <message>
+ <source>Address type not supported</source>
+ <translation>位址型態未被支援</translation>
+ </message>
+ <message>
+ <source>Unknown SOCKSv5 proxy error code 0x%1</source>
+ <translation>未知的 SOCKSv5 代理伺服器錯誤代碼 0x%1</translation>
+ </message>
+ <message>
+ <source>Network operation timed out</source>
+ <translation>網路操作逾時</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSoftKeyManager</name>
+ <message>
+ <source>Ok</source>
+ <translation>確定</translation>
+ </message>
+ <message>
+ <source>Select</source>
+ <translation>選取</translation>
+ </message>
+ <message>
+ <source>Done</source>
+ <translation>完成</translation>
+ </message>
+ <message>
+ <source>Options</source>
+ <translation>選項</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>取消</translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation>退出</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSpinBox</name>
+ <message>
+ <source>More</source>
+ <translation>更多</translation>
+ </message>
+ <message>
+ <source>Less</source>
+ <translation>較少</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSql</name>
+ <message>
+ <source>Delete</source>
+ <translation>刪除</translation>
+ </message>
+ <message>
+ <source>Delete this record?</source>
+ <translation>要刪除這筆紀錄嗎?</translation>
+ </message>
+ <message>
+ <source>Yes</source>
+ <translation>是</translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation>否</translation>
+ </message>
+ <message>
+ <source>Insert</source>
+ <translation>插入</translation>
+ </message>
+ <message>
+ <source>Update</source>
+ <translation>更新</translation>
+ </message>
+ <message>
+ <source>Save edits?</source>
+ <translation>要儲存編輯過的內容嗎?</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>取消</translation>
+ </message>
+ <message>
+ <source>Confirm</source>
+ <translation>確認</translation>
+ </message>
+ <message>
+ <source>Cancel your edits?</source>
+ <translation>要取消編輯嗎?</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSslSocket</name>
+ <message>
+ <source>Unable to write data: %1</source>
+ <translation>無法寫入資料:%1</translation>
+ </message>
+ <message>
+ <source>Unable to decrypt data: %1</source>
+ <translation>無法解密資料:%1</translation>
+ </message>
+ <message>
+ <source>Error while reading: %1</source>
+ <translation>讀取時發生錯誤:%1</translation>
+ </message>
+ <message>
+ <source>Error during SSL handshake: %1</source>
+ <translation>SSL 同步時發生錯誤:%1</translation>
+ </message>
+ <message>
+ <source>Error creating SSL context (%1)</source>
+ <translation>建立 SSL 內文時發生錯誤(%1)</translation>
+ </message>
+ <message>
+ <source>Invalid or empty cipher list (%1)</source>
+ <translation>不合法或空白的加密清單(%1)</translation>
+ </message>
+ <message>
+ <source>Private key does not certify public key, %1</source>
+ <translation>私密金鑰無法認證公開金鑰,%1</translation>
+ </message>
+ <message>
+ <source>Error creating SSL session, %1</source>
+ <translation>建立 SSL 工作階段時發生錯誤:%1</translation>
+ </message>
+ <message>
+ <source>Error creating SSL session: %1</source>
+ <translation>建立 SSL 工作階段時發生錯誤:%1</translation>
+ </message>
+ <message>
+ <source>Cannot provide a certificate with no key, %1</source>
+ <translation>沒有金鑰無法提供憑證:%1</translation>
+ </message>
+ <message>
+ <source>Error loading local certificate, %1</source>
+ <translation>載入本地憑證時發生錯誤:%1</translation>
+ </message>
+ <message>
+ <source>Error loading private key, %1</source>
+ <translation>載入私鑰時發生錯誤:%1</translation>
+ </message>
+ <message>
+ <source>No error</source>
+ <translation>沒有錯誤</translation>
+ </message>
+ <message>
+ <source>The issuer certificate could not be found</source>
+ <translation>找不到發行者憑證</translation>
+ </message>
+ <message>
+ <source>The certificate signature could not be decrypted</source>
+ <translation>無法解密憑證簽名</translation>
+ </message>
+ <message>
+ <source>The public key in the certificate could not be read</source>
+ <translation>憑證中的公開金鑰無法讀取</translation>
+ </message>
+ <message>
+ <source>The signature of the certificate is invalid</source>
+ <translation>憑證的簽名無效</translation>
+ </message>
+ <message>
+ <source>The certificate is not yet valid</source>
+ <translation>憑證尚未生效</translation>
+ </message>
+ <message>
+ <source>The certificate has expired</source>
+ <translation>憑證已逾期</translation>
+ </message>
+ <message>
+ <source>The certificate&apos;s notBefore field contains an invalid time</source>
+ <translation>憑證的notBefore欄位包含無效的時間</translation>
+ </message>
+ <message>
+ <source>The certificate&apos;s notAfter field contains an invalid time</source>
+ <translation>憑證的notAfter欄位包含無效的時間</translation>
+ </message>
+ <message>
+ <source>The certificate is self-signed, and untrusted</source>
+ <translation>憑證是自我簽署的,而且不受信任</translation>
+ </message>
+ <message>
+ <source>The root certificate of the certificate chain is self-signed, and untrusted</source>
+ <translation>憑證鏈的根憑證是自我簽署的,而且不受信任</translation>
+ </message>
+ <message>
+ <source>The issuer certificate of a locally looked up certificate could not be found</source>
+ <translation>找不到本機查詢憑證的發行者憑證</translation>
+ </message>
+ <message>
+ <source>No certificates could be verified</source>
+ <translation>沒有可確認的憑證</translation>
+ </message>
+ <message>
+ <source>One of the CA certificates is invalid</source>
+ <translation>CA憑證的其中之一無效</translation>
+ </message>
+ <message>
+ <source>The basicConstraints path length parameter has been exceeded</source>
+ <translation>basicConstraints路徑長度參數已超出限制</translation>
+ </message>
+ <message>
+ <source>The supplied certificate is unsuitable for this purpose</source>
+ <translation>提供的憑證不適用於此目的</translation>
+ </message>
+ <message>
+ <source>The root CA certificate is not trusted for this purpose</source>
+ <translation>根CA憑證在此目的中不受信任</translation>
+ </message>
+ <message>
+ <source>The root CA certificate is marked to reject the specified purpose</source>
+ <translation>根CA憑證已註記拒絕該特定目的</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>目前候選發行者的憑證已遭拒絕,因為其主旨名稱和目前憑證的發行者名稱不符</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>目前候選發行者的憑證已遭拒絕,因為其發行者名稱及提出的序號和目前憑證的授權單位金鑰識別元不符</translation>
+ </message>
+ <message>
+ <source>The peer did not present any certificate</source>
+ <translation>對等節點未提出任何憑證</translation>
+ </message>
+ <message>
+ <source>The host name did not match any of the valid hosts for this certificate</source>
+ <translation>主機名稱不符合此憑證任何有效的主機</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>不明的錯誤</translation>
+ </message>
+ </context>
+ <context>
+ <name>QStateMachine</name>
+ <message>
+ <source>Missing initial state in compound state &apos;%1&apos;</source>
+ <translation>在複合狀態&quot;%1&quot;中遺失初始狀態</translation>
+ </message>
+ <message>
+ <source>Missing default state in history state &apos;%1&apos;</source>
+ <translation>在記錄狀態&quot;%1&quot;中遺失預設狀態</translation>
+ </message>
+ <message>
+ <source>No common ancestor for targets and source of transition from state &apos;%1&apos;</source>
+ <translation>從狀態&quot;%1&quot;的轉換中,目標和來源沒有共同的上階</translation>
+ </message>
+ <message>
+ <source>Unknown error</source>
+ <translation>不明的錯誤</translation>
+ </message>
+ </context>
+ <context>
+ <name>QSystemSemaphore</name>
+ <message>
+ <source>%1: does not exist</source>
+ <translation>%1:不存在</translation>
+ </message>
+ <message>
+ <source>%1: out of resources</source>
+ <translation>%1:資源不足</translation>
+ </message>
+ <message>
+ <source>%1: permission denied</source>
+ <translation>%1:存取被拒</translation>
+ </message>
+ <message>
+ <source>%1: already exists</source>
+ <translation>%1:已存在</translation>
+ </message>
+ <message>
+ <source>%1: unknown error %2</source>
+ <translation>%1:未知的錯誤 %2</translation>
+ </message>
+ </context>
+ <context>
+ <name>QTDSDriver</name>
+ <message>
+ <source>Unable to open connection</source>
+ <translation>無法開啟連線</translation>
+ </message>
+ <message>
+ <source>Unable to use database</source>
+ <translation>無法使用資料庫</translation>
+ </message>
+ </context>
+ <context>
+ <name>QTabBar</name>
+ <message>
+ <source>Scroll Left</source>
+ <translation>往左捲軸</translation>
+ </message>
+ <message>
+ <source>Scroll Right</source>
+ <translation>往右捲軸</translation>
+ </message>
+ </context>
+ <context>
+ <name>QTcpServer</name>
+ <message>
+ <source>Operation on socket is not supported</source>
+ <translation>Socket 的操作未被支援</translation>
+ </message>
+ </context>
+ <context>
+ <name>QTextControl</name>
+ <message>
+ <source>&amp;Undo</source>
+ <translation>復原(&amp;U)</translation>
+ </message>
+ <message>
+ <source>&amp;Redo</source>
+ <translation>重做(&amp;R)</translation>
+ </message>
+ <message>
+ <source>Cu&amp;t</source>
+ <translation>剪下(&amp;T)</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>複製(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Copy &amp;Link Location</source>
+ <translation>複製連結位址(&amp;L)</translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation>貼上(&amp;P)</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>刪除</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation>全部選擇</translation>
+ </message>
+ </context>
+ <context>
+ <name>QToolButton</name>
+ <message>
+ <source>Press</source>
+ <translation>按下</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>開啟</translation>
+ </message>
+ </context>
+ <context>
+ <name>QUdpSocket</name>
+ <message>
+ <source>This platform does not support IPv6</source>
+ <translation>此平台不支援 IPv6</translation>
+ </message>
+ </context>
+ <context>
+ <name>QUndoGroup</name>
+ <message>
+ <source>Undo</source>
+ <translation>復原</translation>
+ </message>
+ <message>
+ <source>Redo</source>
+ <translation>重做</translation>
+ </message>
+ </context>
+ <context>
+ <name>QUndoModel</name>
+ <message>
+ <source>&lt;empty&gt;</source>
+ <translation><空白></translation>
+ </message>
+ </context>
+ <context>
+ <name>QUndoStack</name>
+ <message>
+ <source>Undo</source>
+ <translation>復原</translation>
+ </message>
+ <message>
+ <source>Redo</source>
+ <translation>重做</translation>
+ </message>
+ </context>
+ <context>
+ <name>QUnicodeControlCharacterMenu</name>
+ <message>
+ <source>LRM Left-to-right mark</source>
+ <translation>LRM 左到右標記</translation>
+ </message>
+ <message>
+ <source>RLM Right-to-left mark</source>
+ <translation>RLM 右到左標記</translation>
+ </message>
+ <message>
+ <source>ZWJ Zero width joiner</source>
+ <translation>ZWJ 零寬度連接器</translation>
+ </message>
+ <message>
+ <source>ZWNJ Zero width non-joiner</source>
+ <translation>ZWNJ 零寬度非連接器</translation>
+ </message>
+ <message>
+ <source>ZWSP Zero width space</source>
+ <translation>ZWSP 零寬度空白</translation>
+ </message>
+ <message>
+ <source>LRE Start of left-to-right embedding</source>
+ <translation>LRE 左到右嵌入起點</translation>
+ </message>
+ <message>
+ <source>RLE Start of right-to-left embedding</source>
+ <translation>RLE 右到左嵌入起點</translation>
+ </message>
+ <message>
+ <source>LRO Start of left-to-right override</source>
+ <translation>LRO 左到右覆寫起點</translation>
+ </message>
+ <message>
+ <source>RLO Start of right-to-left override</source>
+ <translation>RLO 右到左覆寫起點</translation>
+ </message>
+ <message>
+ <source>PDF Pop directional formatting</source>
+ <translation>PDF 彈出方向格式</translation>
+ </message>
+ <message>
+ <source>Insert Unicode control character</source>
+ <translation>插入萬國碼控制字元</translation>
+ </message>
+ </context>
+ <context>
+ <name>QWebFrame</name>
+ <message>
+ <source>Request cancelled</source>
+ <translation>請求已取消</translation>
+ </message>
+ <message>
+ <source>Request blocked</source>
+ <translation>請求已被阻擋</translation>
+ </message>
+ <message>
+ <source>Cannot show URL</source>
+ <translation>無法顯示網址</translation>
+ </message>
+ <message>
+ <source>Frame load interrupted by policy change</source>
+ <translation>框架載入因為原則變更而中斷</translation>
+ </message>
+ <message>
+ <source>Cannot show mimetype</source>
+ <translation>無法顯示 MIME 型態</translation>
+ </message>
+ <message>
+ <source>File does not exist</source>
+ <translation>檔案不存在</translation>
+ </message>
+ </context>
+ <context>
+ <name>QWebPage</name>
+ <message>
+ <source>Submit</source>
+ <comment>default label for Submit buttons in forms on web pages</comment>
+ <translation type="unfinished"></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 type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reset</source>
+ <comment>default label for Reset buttons in forms on web pages</comment>
+ <translation>重置</translation>
+ </message>
+ <message>
+ <source>Choose File</source>
+ <comment>title for file button used in HTML forms</comment>
+ <translation>選擇檔案</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>未選取任何檔案</translation>
+ </message>
+ <message>
+ <source>Open in New Window</source>
+ <comment>Open in New Window context menu item</comment>
+ <translation>在新視窗開啟</translation>
+ </message>
+ <message>
+ <source>Save Link...</source>
+ <comment>Download Linked File context menu item</comment>
+ <translation>儲存連結...</translation>
+ </message>
+ <message>
+ <source>Copy Link</source>
+ <comment>Copy Link context menu item</comment>
+ <translation>複製連結</translation>
+ </message>
+ <message>
+ <source>Open Image</source>
+ <comment>Open Image in New Window context menu item</comment>
+ <translation>開啟影像</translation>
+ </message>
+ <message>
+ <source>Save Image</source>
+ <comment>Download Image context menu item</comment>
+ <translation>儲存影像</translation>
+ </message>
+ <message>
+ <source>Copy Image</source>
+ <comment>Copy Link context menu item</comment>
+ <translation>複製影像</translation>
+ </message>
+ <message>
+ <source>Open Frame</source>
+ <comment>Open Frame in New Window context menu item</comment>
+ <translation>開啟框架</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <comment>Copy context menu item</comment>
+ <translation>複製</translation>
+ </message>
+ <message>
+ <source>Go Back</source>
+ <comment>Back context menu item</comment>
+ <translation>往回</translation>
+ </message>
+ <message>
+ <source>Go Forward</source>
+ <comment>Forward context menu item</comment>
+ <translation>往前</translation>
+ </message>
+ <message>
+ <source>Stop</source>
+ <comment>Stop context menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reload</source>
+ <comment>Reload context menu item</comment>
+ <translation>重新載入</translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <comment>Cut context menu item</comment>
+ <translation>剪下</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <comment>Paste context menu item</comment>
+ <translation>貼上</translation>
+ </message>
+ <message>
+ <source>No Guesses Found</source>
+ <comment>No Guesses Found context menu item</comment>
+ <translation>找不到可能的內容</translation>
+ </message>
+ <message>
+ <source>Ignore</source>
+ <comment>Ignore Spelling context menu item</comment>
+ <translation>忽略</translation>
+ </message>
+ <message>
+ <source>Add To Dictionary</source>
+ <comment>Learn Spelling context menu item</comment>
+ <translation>新增到字典</translation>
+ </message>
+ <message>
+ <source>Search The Web</source>
+ <comment>Search The Web context menu item</comment>
+ <translation>搜尋站台</translation>
+ </message>
+ <message>
+ <source>Look Up In Dictionary</source>
+ <comment>Look Up in Dictionary context menu item</comment>
+ <translation>在字典裡搜尋</translation>
+ </message>
+ <message>
+ <source>Open Link</source>
+ <comment>Open Link context menu item</comment>
+ <translation>開啟連結</translation>
+ </message>
+ <message>
+ <source>Ignore</source>
+ <comment>Ignore Grammar context menu item</comment>
+ <translation>忽略</translation>
+ </message>
+ <message>
+ <source>Spelling</source>
+ <comment>Spelling and Grammar context sub-menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show Spelling and Grammar</source>
+ <comment>menu item title</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hide Spelling and Grammar</source>
+ <comment>menu item title</comment>
+ <translation>隱藏拼字與文法</translation>
+ </message>
+ <message>
+ <source>Check Spelling</source>
+ <comment>Check spelling context menu item</comment>
+ <translation>檢查拼字</translation>
+ </message>
+ <message>
+ <source>Check Spelling While Typing</source>
+ <comment>Check spelling while typing context menu item</comment>
+ <translation>打字時立即檢查拼字</translation>
+ </message>
+ <message>
+ <source>Check Grammar With Spelling</source>
+ <comment>Check grammar with spelling context menu item</comment>
+ <translation>檢查拼字與文法</translation>
+ </message>
+ <message>
+ <source>Fonts</source>
+ <comment>Font context sub-menu item</comment>
+ <translation>字型</translation>
+ </message>
+ <message>
+ <source>Bold</source>
+ <comment>Bold context menu item</comment>
+ <translation>粗體</translation>
+ </message>
+ <message>
+ <source>Italic</source>
+ <comment>Italic context menu item</comment>
+ <translation>斜體</translation>
+ </message>
+ <message>
+ <source>Underline</source>
+ <comment>Underline context menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Outline</source>
+ <comment>Outline context menu item</comment>
+ <translation>外框線</translation>
+ </message>
+ <message>
+ <source>Direction</source>
+ <comment>Writing direction context sub-menu item</comment>
+ <translation>方向</translation>
+ </message>
+ <message>
+ <source>Text Direction</source>
+ <comment>Text direction context sub-menu item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Default</source>
+ <comment>Default writing direction context menu item</comment>
+ <translation>預設</translation>
+ </message>
+ <message>
+ <source>Left to Right</source>
+ <comment>Left to Right context menu item</comment>
+ <translation>從左至右</translation>
+ </message>
+ <message>
+ <source>Right to Left</source>
+ <comment>Right to Left context menu item</comment>
+ <translation>從右至左</translation>
+ </message>
+ <message>
+ <source>Loading...</source>
+ <comment>Media controller status message when the media is loading</comment>
+ <translation>載入中...</translation>
+ </message>
+ <message>
+ <source>Live Broadcast</source>
+ <comment>Media controller status message when watching a live broadcast</comment>
+ <translation>即時廣播</translation>
+ </message>
+ <message>
+ <source>Audio Element</source>
+ <comment>Media controller element</comment>
+ <translation>音訊元素</translation>
+ </message>
+ <message>
+ <source>Video Element</source>
+ <comment>Media controller element</comment>
+ <translation>視訊元素</translation>
+ </message>
+ <message>
+ <source>Mute Button</source>
+ <comment>Media controller element</comment>
+ <translation>靜音按鈕</translation>
+ </message>
+ <message>
+ <source>Unmute Button</source>
+ <comment>Media controller element</comment>
+ <translation>取消靜音按鈕</translation>
+ </message>
+ <message>
+ <source>Play Button</source>
+ <comment>Media controller element</comment>
+ <translation>播放按鈕</translation>
+ </message>
+ <message>
+ <source>Pause Button</source>
+ <comment>Media controller element</comment>
+ <translation>暫停按鈕</translation>
+ </message>
+ <message>
+ <source>Slider</source>
+ <comment>Media controller element</comment>
+ <translation>滑桿</translation>
+ </message>
+ <message>
+ <source>Slider Thumb</source>
+ <comment>Media controller element</comment>
+ <translation>滑桿縮圖</translation>
+ </message>
+ <message>
+ <source>Rewind Button</source>
+ <comment>Media controller element</comment>
+ <translation>倒轉按鈕</translation>
+ </message>
+ <message>
+ <source>Return to Real-time Button</source>
+ <comment>Media controller element</comment>
+ <translation>回復成即時按鈕</translation>
+ </message>
+ <message>
+ <source>Elapsed Time</source>
+ <comment>Media controller element</comment>
+ <translation>經過時間</translation>
+ </message>
+ <message>
+ <source>Remaining Time</source>
+ <comment>Media controller element</comment>
+ <translation>剩餘時間</translation>
+ </message>
+ <message>
+ <source>Status Display</source>
+ <comment>Media controller element</comment>
+ <translation>狀態顯示</translation>
+ </message>
+ <message>
+ <source>Fullscreen Button</source>
+ <comment>Media controller element</comment>
+ <translation>全螢幕按鈕</translation>
+ </message>
+ <message>
+ <source>Seek Forward Button</source>
+ <comment>Media controller element</comment>
+ <translation>往前搜尋按鈕</translation>
+ </message>
+ <message>
+ <source>Seek Back Button</source>
+ <comment>Media controller element</comment>
+ <translation>往回搜尋按鈕</translation>
+ </message>
+ <message>
+ <source>Audio element playback controls and status display</source>
+ <comment>Media controller element</comment>
+ <translation>音訊元素播放控制和狀態顯示</translation>
+ </message>
+ <message>
+ <source>Video element playback controls and status display</source>
+ <comment>Media controller element</comment>
+ <translation>視訊元素播放控制和狀態顯示</translation>
+ </message>
+ <message>
+ <source>Mute audio tracks</source>
+ <comment>Media controller element</comment>
+ <translation>音軌靜音</translation>
+ </message>
+ <message>
+ <source>Unmute audio tracks</source>
+ <comment>Media controller element</comment>
+ <translation>音軌取消靜音</translation>
+ </message>
+ <message>
+ <source>Begin playback</source>
+ <comment>Media controller element</comment>
+ <translation>開始播放</translation>
+ </message>
+ <message>
+ <source>Pause playback</source>
+ <comment>Media controller element</comment>
+ <translation>暫停播放</translation>
+ </message>
+ <message>
+ <source>Movie time scrubber</source>
+ <comment>Media controller element</comment>
+ <translation>影片時間清除器</translation>
+ </message>
+ <message>
+ <source>Movie time scrubber thumb</source>
+ <comment>Media controller element</comment>
+ <translation>影片時間清除器縮圖</translation>
+ </message>
+ <message>
+ <source>Rewind movie</source>
+ <comment>Media controller element</comment>
+ <translation>倒轉影片</translation>
+ </message>
+ <message>
+ <source>Return streaming movie to real-time</source>
+ <comment>Media controller element</comment>
+ <translation>串流影片回復成即時播放</translation>
+ </message>
+ <message>
+ <source>Current movie time</source>
+ <comment>Media controller element</comment>
+ <translation>目前的影片時間</translation>
+ </message>
+ <message>
+ <source>Remaining movie time</source>
+ <comment>Media controller element</comment>
+ <translation>剩餘的影片時間</translation>
+ </message>
+ <message>
+ <source>Current movie status</source>
+ <comment>Media controller element</comment>
+ <translation>目前的影片狀態</translation>
+ </message>
+ <message>
+ <source>Play movie in full-screen mode</source>
+ <comment>Media controller element</comment>
+ <translation>以全螢幕模式播放影片</translation>
+ </message>
+ <message>
+ <source>Seek quickly back</source>
+ <comment>Media controller element</comment>
+ <translation>快速往回搜尋</translation>
+ </message>
+ <message>
+ <source>Seek quickly forward</source>
+ <comment>Media controller element</comment>
+ <translation>快速往前搜尋</translation>
+ </message>
+ <message>
+ <source>Indefinite time</source>
+ <comment>Media time description</comment>
+ <translation>不限定時間</translation>
+ </message>
+ <message>
+ <source>%1 days %2 hours %3 minutes %4 seconds</source>
+ <comment>Media time description</comment>
+ <translation>%1天%2小時%3分鐘%4秒鐘</translation>
+ </message>
+ <message>
+ <source>%1 hours %2 minutes %3 seconds</source>
+ <comment>Media time description</comment>
+ <translation>%1小時%2分鐘%3秒鐘</translation>
+ </message>
+ <message>
+ <source>%1 minutes %2 seconds</source>
+ <comment>Media time description</comment>
+ <translation>%1分鐘%2秒鐘</translation>
+ </message>
+ <message>
+ <source>%1 seconds</source>
+ <comment>Media time description</comment>
+ <translation>%1秒鐘</translation>
+ </message>
+ <message>
+ <source>Inspect</source>
+ <comment>Inspect Element context menu item</comment>
+ <translation>查驗</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>沒有最近的搜尋</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>最近的搜尋</translation>
+ </message>
+ <message>
+ <source>Clear recent searches</source>
+ <comment>menu item in Recent Searches menu that empties menu&apos;s contents</comment>
+ <translation>清除最近的搜尋</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <comment>Unknown filesize FTP directory listing item</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Web Inspector - %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 (%2x%3 pixels)</source>
+ <comment>Title string for images</comment>
+ <translation>%1(%2x%3 像素)</translation>
+ </message>
+ <message>
+ <source>Bad HTTP request</source>
+ <translation>不良的 HTTP 請求</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 type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scroll here</source>
+ <translation>在此捲軸</translation>
+ </message>
+ <message>
+ <source>Left edge</source>
+ <translation>左邊緣</translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Right edge</source>
+ <translation>右邊緣</translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <translation>底端</translation>
+ </message>
+ <message>
+ <source>Page left</source>
+ <translation>頁面左方</translation>
+ </message>
+ <message>
+ <source>Page up</source>
+ <translation>頁面上方</translation>
+ </message>
+ <message>
+ <source>Page right</source>
+ <translation>頁面右方</translation>
+ </message>
+ <message>
+ <source>Page down</source>
+ <translation>頁面下方</translation>
+ </message>
+ <message>
+ <source>Scroll left</source>
+ <translation>往左捲軸</translation>
+ </message>
+ <message>
+ <source>Scroll up</source>
+ <translation>往上捲軸</translation>
+ </message>
+ <message>
+ <source>Scroll right</source>
+ <translation>往右捲軸</translation>
+ </message>
+ <message>
+ <source>Scroll down</source>
+ <translation>往下捲軸</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n file(s)</source>
+ <comment>number of chosen file</comment>
+ <translation>
+ <numerusform>%n 個檔案</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>JavaScript Alert - %1</source>
+ <translation>JavaScript 警告 ─ %1</translation>
+ </message>
+ <message>
+ <source>JavaScript Confirm - %1</source>
+ <translation>JavaScript 確認 ─ %1</translation>
+ </message>
+ <message>
+ <source>JavaScript Prompt - %1</source>
+ <translation>JavaScript 提示 ─ %1</translation>
+ </message>
+ <message>
+ <source>JavaScript Problem - %1</source>
+ <translation>JavaScript問題 - %1</translation>
+ </message>
+ <message>
+ <source>The script on this page appears to have a problem. Do you want to stop the script?</source>
+ <translation>此頁面上的指令碼似乎有問題。是否要停止指令碼?</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the next character</source>
+ <translation>移動游標到下一個字元</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the previous character</source>
+ <translation>移動游標到前一個字元</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the next word</source>
+ <translation>移動游標到下一個單字</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the previous word</source>
+ <translation>移動游標到前一個單字</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the next line</source>
+ <translation>移動游標到下一行</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the previous line</source>
+ <translation>移動游標到前一行</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the start of the line</source>
+ <translation>移動游標到這一行的起頭</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the end of the line</source>
+ <translation>移動游標到這一行的結尾</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the start of the block</source>
+ <translation>移動游標到這一個區塊的起頭</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the end of the block</source>
+ <translation>移動游標到這一個區塊的結尾</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the start of the document</source>
+ <translation>移動游標到這一個文件的起頭</translation>
+ </message>
+ <message>
+ <source>Move the cursor to the end of the document</source>
+ <translation>移動游標到這一個文件的結尾</translation>
+ </message>
+ <message>
+ <source>Select all</source>
+ <translation>全選</translation>
+ </message>
+ <message>
+ <source>Select to the next character</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the previous character</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the next word</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the previous word</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the next line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the previous line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the start of the line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the end of the line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the start of the block</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the end of the block</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the start of the document</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select to the end of the document</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete to the start of the word</source>
+ <translation>刪除到此單字的起頭</translation>
+ </message>
+ <message>
+ <source>Delete to the end of the word</source>
+ <translation>刪除到此單字的結尾</translation>
+ </message>
+ <message>
+ <source>Insert a new paragraph</source>
+ <translation>插入新段落</translation>
+ </message>
+ <message>
+ <source>Insert a new line</source>
+ <translation>插入新行</translation>
+ </message>
+ <message>
+ <source>Paste and Match Style</source>
+ <translation>貼上並符合樣式</translation>
+ </message>
+ <message>
+ <source>Remove formatting</source>
+ <translation>移除格式設定</translation>
+ </message>
+ <message>
+ <source>Strikethrough</source>
+ <translation>刪除線</translation>
+ </message>
+ <message>
+ <source>Subscript</source>
+ <translation>下標</translation>
+ </message>
+ <message>
+ <source>Superscript</source>
+ <translation>上標</translation>
+ </message>
+ <message>
+ <source>Insert Bulleted List</source>
+ <translation>插入項目符號清單</translation>
+ </message>
+ <message>
+ <source>Insert Numbered List</source>
+ <translation>插入編號清單</translation>
+ </message>
+ <message>
+ <source>Indent</source>
+ <translation>縮排</translation>
+ </message>
+ <message>
+ <source>Outdent</source>
+ <translation>凸排</translation>
+ </message>
+ <message>
+ <source>Center</source>
+ <translation>置中</translation>
+ </message>
+ <message>
+ <source>Justify</source>
+ <translation>左右對齊</translation>
+ </message>
+ <message>
+ <source>Align Left</source>
+ <translation>靠左對齊</translation>
+ </message>
+ <message>
+ <source>Align Right</source>
+ <translation>靠右對齊</translation>
+ </message>
+ </context>
+ <context>
+ <name>QWhatsThisAction</name>
+ <message>
+ <source>What&apos;s This?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QWidget</name>
+ <message>
+ <source>*</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QWizard</name>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt; &amp;Back</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>
+ <message>
+ <source>Go Back</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Commit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Done</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Next &gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QWorkspace</name>
+ <message>
+ <source>&amp;Restore</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mi&amp;nimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ma&amp;ximize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Stay on &amp;Top</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>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sh&amp;ade</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 - [%2]</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Unshade</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QXml</name>
+ <message>
+ <source>no error occurred</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error triggered by consumer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>unexpected end of file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>more than one document type definition</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error occurred while parsing element</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>tag mismatch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error occurred while parsing content</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>unexpected character</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>invalid name for processing instruction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>version expected while reading the XML declaration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>wrong value for standalone declaration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error occurred while parsing document type definition</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>letter is expected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error occurred while parsing comment</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error occurred while parsing reference</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>internal general entity reference not allowed in DTD</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>external parsed general entity reference not allowed in attribute value</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>external parsed general entity reference not allowed in DTD</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>unparsed entity reference in wrong context</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>recursive entities</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>error in the text declaration of an external entity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>encoding declaration or standalone declaration expected while reading the XML declaration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>standalone declaration expected while reading the XML declaration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QXmlPatternistCLI</name>
+ <message>
+ <source>Warning in %1, at line %2, column %3: %4</source>
+ <translation>%1中的警告,位於行%2,欄%3:%4</translation>
+ </message>
+ <message>
+ <source>Warning in %1: %2</source>
+ <translation>%1中的警告:%2</translation>
+ </message>
+ <message>
+ <source>Unknown location</source>
+ <translation>不明的位置</translation>
+ </message>
+ <message>
+ <source>Error %1 in %2, at line %3, column %4: %5</source>
+ <translation>在%2發生%1錯誤,位於行%3,欄%4:%5</translation>
+ </message>
+ <message>
+ <source>Error %1 in %2: %3</source>
+ <translation>在%2發生%1錯誤:%3</translation>
+ </message>
+ </context>
+ <context>
+ <name>QXmlStream</name>
+ <message>
+ <source>Extra content at end of document.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid entity value.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid XML character.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sequence &apos;]]&gt;&apos; not allowed in content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Namespace prefix &apos;%1&apos; not declared</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute redefined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unexpected character &apos;%1&apos; in public id literal.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid XML version string.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsupported XML version.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 is an invalid encoding name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encoding %1 is unsupported</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Standalone accepts only yes or no.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid attribute in XML declaration.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Premature end of document.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid document.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Expected </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>, but got &apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unexpected &apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Expected character data.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Recursive entity detected.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start tag expected.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>XML declaration not at start of document.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>NDATA in parameter entity declaration.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 is an invalid processing instruction name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid processing instruction name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Illegal namespace declaration.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid XML name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opening and ending tag mismatch.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reference to unparsed entity &apos;%1&apos;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Entity &apos;%1&apos; not declared.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reference to external entity &apos;%1&apos; in attribute value.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid character reference.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encountered incorrectly encoded content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The standalone pseudo attribute must appear after the encoding.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 is an invalid PUBLIC identifier.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ <context>
+ <name>QtXmlPatterns</name>
+ <message>
+ <source>At least one component must be present.</source>
+ <translation>必須表達至少一個組件。</translation>
+ </message>
+ <message>
+ <source>%1 is not a valid value of type %2.</source>
+ <translation>%1 不是合法的 %2 型態的值。</translation>
+ </message>
+ <message>
+ <source>When casting to %1 from %2, the source value cannot be %3.</source>
+ <translation>從 %2 轉換型態為 %1 的時候,來源數值不能是 %3。</translation>
+ </message>
+ <message>
+ <source>Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values.</source>
+ <translation>實際布林值(Effective Boolean)無法用在兩個或兩個以上的原數值(atomic value)的計算。</translation>
+ </message>
+ <message>
+ <source>The data of a processing instruction cannot contain the string %1</source>
+ <translation>處理指令的資料不能包含字串 %1</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid %2</source>
+ <translation>%1 是不合法的 %2</translation>
+ </message>
+ <message>
+ <source>%1 is not a valid XML 1.0 character.</source>
+ <translation>%1 不是合法的 XML 1.0 字元。</translation>
+ </message>
+ <message>
+ <source>%1 was called.</source>
+ <translation>%1 已被呼叫。</translation>
+ </message>
+ <message>
+ <source>In the replacement string, %1 must be followed by at least one digit when not escaped.</source>
+ <translation>在取代字串中,在未脫逸的情形下 %1 必須至少跟著一位數字。</translation>
+ </message>
+ <message>
+ <source>In the replacement string, %1 can only be used to escape itself or %2, not %3</source>
+ <translation>在取代字串中,%1 只能用於自身或 %2 的脫逸,而非 %3。</translation>
+ </message>
+ <message>
+ <source>%1 matches newline characters</source>
+ <translation>%1 符合了換行字元</translation>
+ </message>
+ <message>
+ <source>Matches are case insensitive</source>
+ <translation>比對為區分大小寫</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid regular expression pattern: %2</source>
+ <translation>%1 是不合法的正規表示式樣式:%2</translation>
+ </message>
+ <message>
+ <source>It will not be possible to retrieve %1.</source>
+ <translation>無法取得 %1。</translation>
+ </message>
+ <message>
+ <source>The default collection is undefined</source>
+ <translation>預設的收藏未定義</translation>
+ </message>
+ <message>
+ <source>%1 cannot be retrieved</source>
+ <translation>%1 無法取得</translation>
+ </message>
+ <message>
+ <source>The item %1 did not match the required type %2.</source>
+ <translation>項目 %1 未符合需要的型態 %2。</translation>
+ </message>
+ <message>
+ <source>%1 is an unknown schema type.</source>
+ <translation>%1 是未知的機制型態。</translation>
+ </message>
+ <message>
+ <source>A template with name %1 has already been declared.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Only one %1 declaration can occur in the query prolog.</source>
+ <translation>只有一個 %1 宣告可以在查詢中。</translation>
+ </message>
+ <message>
+ <source>The initialization of variable %1 depends on itself</source>
+ <translation>變數 %1 的初始化與自身相依。</translation>
+ </message>
+ <message>
+ <source>The variable %1 is unused</source>
+ <translation>變數 %1 未使用</translation>
+ </message>
+ <message>
+ <source>Version %1 is not supported. The supported XQuery version is 1.0.</source>
+ <translation>版本 %1 未支援。支援的 XQuery 版本為 1.0。</translation>
+ </message>
+ <message>
+ <source>No function with signature %1 is available</source>
+ <translation>沒有簽章為 %1 的函式可使用</translation>
+ </message>
+ <message>
+ <source>It is not possible to redeclare prefix %1.</source>
+ <translation>無法重宣告前置字串 %1。</translation>
+ </message>
+ <message>
+ <source>Prefix %1 is already declared in the prolog.</source>
+ <translation>前置字串 %1 已在 prolog 中宣告。</translation>
+ </message>
+ <message>
+ <source>The name of an option must have a prefix. There is no default namespace for options.</source>
+ <translation>選項名稱必須有前置字串。沒有選項的預設命名空間。</translation>
+ </message>
+ <message>
+ <source>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</source>
+ <translation>機制匯入功能未支援,因此有 %1 個宣告無法達成。</translation>
+ </message>
+ <message>
+ <source>The target namespace of a %1 cannot be empty.</source>
+ <translation>%1 的目標命名空間不能是空的。</translation>
+ </message>
+ <message>
+ <source>The module import feature is not supported</source>
+ <translation>模組匯入功能未支援。</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>在函式模組中的使用者定義函式的命名空間必須與模組的命名空間相同。也就是,應該為 %1 而不是 %2。</translation>
+ </message>
+ <message>
+ <source>A function already exists with the signature %1.</source>
+ <translation>已經有簽章為 %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>未支援外部函式。所有支援的含式可以直接使用而不需要先宣告為外部函式。</translation>
+ </message>
+ <message>
+ <source>The %1-axis is unsupported in XQuery</source>
+ <translation>XQuery 中未支援 %1 軸</translation>
+ </message>
+ <message>
+ <source>The namespace URI cannot be the empty string when binding to a prefix, %1.</source>
+ <translation>要與前置字串 %1 結合的命名空間網址不能是空字串。</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid namespace URI.</source>
+ <translation>%1 是不合法的命名空間網址。</translation>
+ </message>
+ <message>
+ <source>It is not possible to bind to the prefix %1</source>
+ <translation>無法與前置字串 %1 結合。</translation>
+ </message>
+ <message>
+ <source>Two namespace declaration attributes have the same name: %1.</source>
+ <translation>有兩個命名空間宣告的屬性有相同的名稱:%1</translation>
+ </message>
+ <message>
+ <source>The namespace URI must be a constant and cannot use enclosed expressions.</source>
+ <translation>命名空間網址必須是常數,並且不能使用封閉敘述。</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 不是範圍內屬性宣告。注意機制匯入功能未支援。</translation>
+ </message>
+ <message>
+ <source>empty</source>
+ <translation>空白</translation>
+ </message>
+ <message>
+ <source>zero or one</source>
+ <translation>0 或 1 個</translation>
+ </message>
+ <message>
+ <source>exactly one</source>
+ <translation>剛好一個</translation>
+ </message>
+ <message>
+ <source>one or more</source>
+ <translation>一個以上</translation>
+ </message>
+ <message>
+ <source>zero or more</source>
+ <translation>0 個以上</translation>
+ </message>
+ <message>
+ <source>The focus is undefined.</source>
+ <translation>焦點未定義。</translation>
+ </message>
+ <message>
+ <source>An attribute by name %1 has already been created.</source>
+ <translation>名為 %1 的屬性已被建立。</translation>
+ </message>
+ <message>
+ <source>Network timeout.</source>
+ <translation>網路逾時。</translation>
+ </message>
+ <message>
+ <source>Element %1 can&apos;t be serialized because it appears outside the document element.</source>
+ <translation>元素 %1 無法序列化,因為似乎是在文件元素之外。</translation>
+ </message>
+ <message>
+ <source>Year %1 is invalid because it begins with %2.</source>
+ <translation>年份 %1 不合法,因為是從 %2 開始的。</translation>
+ </message>
+ <message>
+ <source>Day %1 is outside the range %2..%3.</source>
+ <translation>日期 %1 已超出 %2 到 %3 的範圍。</translation>
+ </message>
+ <message>
+ <source>Month %1 is outside the range %2..%3.</source>
+ <translation>月份 %1 已超出 %2 到 %3 的範圍。</translation>
+ </message>
+ <message>
+ <source>Overflow: Can&apos;t represent date %1.</source>
+ <translation>溢位:無法表示日期 %1。</translation>
+ </message>
+ <message>
+ <source>Day %1 is invalid for month %2.</source>
+ <translation>月份 %2 中沒有日期 %1。</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>時間 24:%1:%2.%3 不合法。小時為 24 則分、秒與毫秒都必須是 0。
+</translation>
+ </message>
+ <message>
+ <source>Time %1:%2:%3.%4 is invalid.</source>
+ <translation>時間 %1:%2:%3.%4 不合法。</translation>
+ </message>
+ <message>
+ <source>Overflow: Date can&apos;t be represented.</source>
+ <translation>溢位:無法表示日期。</translation>
+ </message>
+ <message>
+ <source>At least one time component must appear after the %1-delimiter.</source>
+ <translation>在分隔符 %1 後必須至少有一個時間組件。</translation>
+ </message>
+ <message>
+ <source>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</source>
+ <translation>將型態 %1 除以 %2(非數值)是不允許的。</translation>
+ </message>
+ <message>
+ <source>Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed.</source>
+ <translation>將型態 %1 除以 %2 或 %3(正或負零)是不允許的。</translation>
+ </message>
+ <message>
+ <source>Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed.</source>
+ <translation>將型態 %1 乘以 %2 或 %3(正或負無限大)是不允許的。</translation>
+ </message>
+ <message>
+ <source>A value of type %1 cannot have an Effective Boolean Value.</source>
+ <translation>型態 %1 不能有實際布林值。</translation>
+ </message>
+ <message>
+ <source>Value %1 of type %2 exceeds maximum (%3).</source>
+ <translation>型態 %2 的數值 %1 已超過最大值(%3)。</translation>
+ </message>
+ <message>
+ <source>Value %1 of type %2 is below minimum (%3).</source>
+ <translation>型態 %2 的數值 %1 已低過最小值(%3)。</translation>
+ </message>
+ <message>
+ <source>A value of type %1 must contain an even number of digits. The value %2 does not.</source>
+ <translation>型態 %1 的值必須包含偶數個數字。數值 %2 未符合此條件。</translation>
+ </message>
+ <message>
+ <source>%1 is not valid as a value of type %2.</source>
+ <translation>%1 不是合法的 %2 型態的值。</translation>
+ </message>
+ <message>
+ <source>Operator %1 cannot be used on type %2.</source>
+ <translation>操作元 %1 不能用於型態 %2。</translation>
+ </message>
+ <message>
+ <source>Operator %1 cannot be used on atomic values of type %2 and %3.</source>
+ <translation>操作元 %1 不能用於型態 %2 與 %3 的原數值。</translation>
+ </message>
+ <message>
+ <source>The namespace URI in the name for a computed attribute cannot be %1.</source>
+ <translation>在已計算屬性的名稱的命名空間網址不能是 %1。</translation>
+ </message>
+ <message>
+ <source>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</source>
+ <translation>在已計算屬性的名稱不能同時有命名空間網址 %1 與本地端名稱 %2。</translation>
+ </message>
+ <message>
+ <source>Type error in cast, expected %1, received %2.</source>
+ <translation>轉換型態錯誤,應為 %1 但接收到 %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>轉換為型態 %1 或其衍生型態時,來源數值必須是相同型態,或者是字串。型態 %2 是不被允許的。</translation>
+ </message>
+ <message>
+ <source>A comment cannot contain %1</source>
+ <translation>註解不能包含 %1</translation>
+ </message>
+ <message>
+ <source>A comment cannot end with a %1.</source>
+ <translation>註解不能以 %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>屬性點不能做為文件點的子節點。因此,屬性 %1 的位置不合適。</translation>
+ </message>
+ <message>
+ <source>A library module cannot be evaluated directly. It must be imported from a main module.</source>
+ <translation>不能直接計算函式模組。必須要從主模組匯入。</translation>
+ </message>
+ <message>
+ <source>No template by name %1 exists.</source>
+ <translation>沒有名為 %1 的樣本存在。</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>型態 %1 的值不能是謂詞(predicate)。謂詞必須是數值型態,或是實際布林值。</translation>
+ </message>
+ <message>
+ <source>A positional predicate must evaluate to a single numeric value.</source>
+ <translation>位置謂詞必須能計算出單一的數值。</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>處理指令的目標名稱不能是任何大小寫組合的 %1。因此,%2 是不合法的值。</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 不是一個合法的處理指令的目標名稱。必須是 %2 的值,例如 %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>路徑的最後一步必須是節點或原值,而不能在兩者之間。</translation>
+ </message>
+ <message>
+ <source>No namespace binding exists for the prefix %1</source>
+ <translation>前置字串 %1 沒有結合命名空間</translation>
+ </message>
+ <message>
+ <source>No namespace binding exists for the prefix %1 in %2</source>
+ <translation>在 %2 的前置字串 %1 沒有結合命名空間</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>呼叫 %1 的第一個參數不能是 %2 型態。必須是數值型態,xs.yearMonthDuration 或 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>呼叫 %1 的第一個參數不能是 %2 型態。必須是 %3、%4 或 %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>呼叫 %1 的第二個參數不能是 %2 型態。必須是 %3、%4 或 %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>如果兩個值都有區域位移,則必須是相同的區域位移。%1 與 %2 並不相同。</translation>
+ </message>
+ <message>
+ <source>%1 must be followed by %2 or %3, not at the end of the replacement string.</source>
+ <translation>%1 後面必須跟著 %2 或 %3,而非取代字串的結尾。</translation>
+ </message>
+ <message>
+ <source>%1 and %2 match the start and end of a line.</source>
+ <translation>%1 與 %2 符合了一行的開始與結尾。</translation>
+ </message>
+ <message>
+ <source>Whitespace characters are removed, except when they appear in character classes</source>
+ <translation>空白字元已移除,除非它們出現在字元類別</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid flag for regular expressions. Valid flags are:</source>
+ <translation>%1 是正規表示式中不合法的旗標。合法的旗標有:</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>如果第一個參數是空序列,或是長度為 0 的字串(沒有命名空間),則無法指定前置字串。但是您指定了 %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>未支援常態化表單 %1。支援的表單有 %2、%3、%4、%5,以及無(也就是空字串,未常態化)。</translation>
+ </message>
+ <message>
+ <source>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</source>
+ <translation>區域位移必須是在 %1 到 %2 範圍之內。%3 已超出範圍。</translation>
+ </message>
+ <message>
+ <source>Required cardinality is %1; got cardinality %2.</source>
+ <translation>需要的基數為 %1;得到的是 %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>編碼 %1 不合法。必須只能包含拉丁字元,不含空白,並且要符合正規表示式 %2。</translation>
+ </message>
+ <message>
+ <source>The keyword %1 cannot occur with any other mode name.</source>
+ <translation>關鍵字 %1 不能與任何其它模式名稱一起存在。</translation>
+ </message>
+ <message>
+ <source>No variable with name %1 exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The value of attribute %1 must be of type %2, which %3 isn&apos;t.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The prefix %1 cannot be bound. By default, it is already bound to the namespace %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A variable with name %1 has already been declared.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No value is available for the external variable with name %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A stylesheet function must have a prefixed name.</source>
+ <translation>樣式表函式必須有前置名稱。</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>命名空間 %1 已被保留,因此使用者定義函式不能使用它。請試試預定義前置字串 %2。</translation>
+ </message>
+ <message>
+ <source>An argument with name %1 has already been declared. Every argument name must be unique.</source>
+ <translation type="unfinished"></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>當函式 %1 用於樣式比對時,參數必須是變數參考或字串。</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>在 XSL-T 樣式內,函式 %1 的第一個參數必須是字串,以便用於比對。</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>在 XSL-T 樣式內,函式 %1 的第一個參數必須是文字或變數參考,以便用於比對。</translation>
+ </message>
+ <message>
+ <source>In an XSL-T pattern, function %1 cannot have a third argument.</source>
+ <translation>在 XSL-T 樣式內,函式 %1 的不能有第三個參數。</translation>
+ </message>
+ <message>
+ <source>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</source>
+ <translation>在 XSL-T 樣式內,只有函式 %1,%2 可以用於比對。%3 不行。</translation>
+ </message>
+ <message>
+ <source>In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can.</source>
+ <translation>在 XSL-T 樣式內,不能用 %1 軸,只能用 %2 或 %3。</translation>
+ </message>
+ <message>
+ <source>%1 is an invalid template mode name.</source>
+ <translation>%1 不是合法的樣本模式名稱。</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>與 for 敘述結合的變數名稱必須與位置變數不同。因此,有兩個名為 %1 的變數衝突了。</translation>
+ </message>
+ <message>
+ <source>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</source>
+ <translation>未支援機制確認功能。%1 敘述無法使用。</translation>
+ </message>
+ <message>
+ <source>None of the pragma expressions are supported. Therefore, a fallback expression must be present</source>
+ <translation>未支援 pragma 敘述。因次,必須有預設的敘述。</translation>
+ </message>
+ <message>
+ <source>Each name of a template parameter must be unique; %1 is duplicated.</source>
+ <translation>每個樣本參數的名稱必須唯一;%1 已經被使用。</translation>
+ </message>
+ <message>
+ <source>No function with name %1 is available.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 is not a valid numeric literal.</source>
+ <translation>%1 不是合法的數值。</translation>
+ </message>
+ <message>
+ <source>W3C XML Schema identity constraint selector</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>W3C XML Schema identity constraint field</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A construct was encountered which is disallowed in the current language(%1).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
+ <translation>命名空間 %1 只能與 %2 結合(也就是說,要預先定義)。</translation>
+ </message>
+ <message>
+ <source>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
+ <translation>前置字串 %1 只能與 %2 結合(也就是說,要預先定義)。</translation>
+ </message>
+ <message>
+ <source>An attribute with name %1 has already appeared on this element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A direct element constructor is not well-formed. %1 is ended with %2.</source>
+ <translation>直接元素建構器沒有完整產生。%1 以 %2 結束。</translation>
+ </message>
+ <message>
+ <source>The name %1 does not refer to any schema type.</source>
+ <translation>名稱 %1 未指向任何機制型態。</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 是複數型態,無法轉換成複數型態。然而,轉換為原型態,如 %2 是可行的。</translation>
+ </message>
+ <message>
+ <source>%1 is not an atomic type. Casting is only possible to atomic types.</source>
+ <translation>%1 不是一個原型態。只能轉換為原型態。</translation>
+ </message>
+ <message>
+ <source>%1 is not a valid name for a processing-instruction.</source>
+ <translation>%1 不是處理指令的合法名稱。</translation>
+ </message>
+ <message>
+ <source>The name of an extension expression must be in a namespace.</source>
+ <translation>延伸敘述的名稱必須在命名空間內。</translation>
+ </message>
+ <message>
+ <source>Required type is %1, but %2 was found.</source>
+ <translation>需要的型態為 %1,但找到 %2。</translation>
+ </message>
+ <message>
+ <source>Promoting %1 to %2 may cause loss of precision.</source>
+ <translation>將 %1 抬升為 %2 可能會失去精確度。</translation>
+ </message>
+ <message>
+ <source>It&apos;s not possible to add attributes after any other kind of node.</source>
+ <translation>不能在任何其它種類的節點後面加入屬性。</translation>
+ </message>
+ <message>
+ <source>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</source>
+ <translation>只支援 Unicode Codepoint Collation(%1)。%2 未支援。;</translation>
+ </message>
+ <message>
+ <source>Integer division (%1) by zero (%2) is undefined.</source>
+ <translation>整數除法 %1 除以零(%2)的行為未定義。</translation>
+ </message>
+ <message>
+ <source>Division (%1) by zero (%2) is undefined.</source>
+ <translation>除法 %1 除以零(%2)的行為未定義。</translation>
+ </message>
+ <message>
+ <source>Modulus division (%1) by zero (%2) is undefined.</source>
+ <translation>餘數除法 %1 除以零(%2)的行為未定義。</translation>
+ </message>
+ <message numerus="yes">
+ <source>%1 takes at most %n argument(s). %2 is therefore invalid.</source>
+ <translation>
+ <numerusform>%1 最多只能有 %n 個參數,因此 %2 是不合法的。</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%1 requires at least %n argument(s). %2 is therefore invalid.</source>
+ <translation>
+ <numerusform>%1 至少需要 %n 個參數,因此 %2 是不合法的。</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>函式 %1 的第二個參數的根節點必須是文件節點。%2 不是文件節點。</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>使用者定義函式的命名空間不能為空白(請試著用預先定義的前置字串 %1)</translation>
+ </message>
+ <message>
+ <source>A default namespace declaration must occur before function, variable, and option declarations.</source>
+ <translation>預設的命名空間宣告必須在函式、變數與選項宣告之前。</translation>
+ </message>
+ <message>
+ <source>Namespace declarations must occur before function, variable, and option declarations.</source>
+ <translation>命名空間宣告必須在函式、變數與選項宣告之前。</translation>
+ </message>
+ <message>
+ <source>Module imports must occur before function, variable, and option declarations.</source>
+ <translation>模組匯入必須在函式、變數與選項宣告之前。</translation>
+ </message>
+ <message>
+ <source>%1 is not a whole number of minutes.</source>
+ <translation>%1 不是分鐘的數值。</translation>
+ </message>
+ <message>
+ <source>Attribute %1 can&apos;t be serialized because it appears at the top level.</source>
+ <translation>屬性元素 %1 無法序列化,因為似乎是在頂層。</translation>
+ </message>
+ <message>
+ <source>%1 is an unsupported encoding.</source>
+ <translation>%1 是個未被支援的編碼。</translation>
+ </message>
+ <message>
+ <source>%1 contains octets which are disallowed in the requested encoding %2.</source>
+ <translation>%1 包含了在要求的編碼 %2 內不允許的八進位值。</translation>
+ </message>
+ <message>
+ <source>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</source>
+ <translation>在 %2 內的代碼點 %1(編碼 %3)是一個不合法的 XML 字元。</translation>
+ </message>
+ <message>
+ <source>Ambiguous rule match.</source>
+ <translation>不明確的規則符合。</translation>
+ </message>
+ <message>
+ <source>In a namespace constructor, the value for a namespace cannot be an empty string.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The prefix must be a valid %1, which %2 is not.</source>
+ <translation>前置字串必須是合法的 %1,但 %2 不是。</translation>
+ </message>
+ <message>
+ <source>The prefix %1 cannot be bound.</source>
+ <translation>前置字串 %1 不能被結合。</translation>
+ </message>
+ <message>
+ <source>Only the prefix %1 can be bound to %2 and vice versa.</source>
+ <translation>只有前置字串 %1 能與 %2 結合。反之亦然。</translation>
+ </message>
+ <message>
+ <source>The parameter %1 is required, but no corresponding %2 is supplied.</source>
+ <translation>需要參數 %1,但是沒有提供相關的 %2。</translation>
+ </message>
+ <message>
+ <source>The parameter %1 is passed, but no corresponding %2 exists.</source>
+ <translation>參數 %1 已傳送,但找不到相關的 %2。</translation>
+ </message>
+ <message>
+ <source>The URI cannot have a fragment</source>
+ <translation>URI 不能有片段。</translation>
+ </message>
+ <message>
+ <source>Element %1 is not allowed at this location.</source>
+ <translation>元素 %1 不能在此位置。</translation>
+ </message>
+ <message>
+ <source>Text nodes are not allowed at this location.</source>
+ <translation>文字節點不能在此位置。</translation>
+ </message>
+ <message>
+ <source>Parse error: %1</source>
+ <translation>剖析錯誤:%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>XLS-T 版本屬性的值必須是型態 %1 的值,而 %2 不是。</translation>
+ </message>
+ <message>
+ <source>Running an XSL-T 1.0 stylesheet with a 2.0 processor.</source>
+ <translation>使用 2.0 處理器執行 XSL-T 1.0 樣式表中。</translation>
+ </message>
+ <message>
+ <source>Unknown XSL-T attribute %1.</source>
+ <translation>未知的 XSL-T 屬性 %1。</translation>
+ </message>
+ <message>
+ <source>Attribute %1 and %2 are mutually exclusive.</source>
+ <translation>屬性 %1 與 %2 彼此互斥。</translation>
+ </message>
+ <message>
+ <source>In a simplified stylesheet module, attribute %1 must be present.</source>
+ <translation>在簡化的樣式表模組中,屬性 %1 必須存在。</translation>
+ </message>
+ <message>
+ <source>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</source>
+ <translation>若元素 %1 沒有屬性 %2,則也不能有屬性 %3 或 %4。</translation>
+ </message>
+ <message>
+ <source>Element %1 must have at least one of the attributes %2 or %3.</source>
+ <translation>元素 %1 必須至少有屬性 %2 或 %3 其中一個。</translation>
+ </message>
+ <message>
+ <source>At least one mode must be specified in the %1-attribute on element %2.</source>
+ <translation>在元素 %2 的 %1 屬性中至少要指定一個模式。</translation>
+ </message>
+ <message>
+ <source>Element %1 must come last.</source>
+ <translation>元素 %1 必須最後出現。</translation>
+ </message>
+ <message>
+ <source>At least one %1-element must occur before %2.</source>
+ <translation>至少一個元素 %1 要出現在 %2 之前。</translation>
+ </message>
+ <message>
+ <source>Only one %1-element can appear.</source>
+ <translation>只能出現一個元素 %1。</translation>
+ </message>
+ <message>
+ <source>At least one %1-element must occur inside %2.</source>
+ <translation>至少一個元素 %1 要出現在 %2 之內。</translation>
+ </message>
+ <message>
+ <source>When attribute %1 is present on %2, a sequence constructor cannot be used.</source>
+ <translation>當屬性 %1 出現在 %2 內時,不能使用序列建構子。</translation>
+ </message>
+ <message>
+ <source>Element %1 must have either a %2-attribute or a sequence constructor.</source>
+ <translation>元素 %1 必須至少有一個屬性 %2 或一個序列建構子。</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>當需要參數時,不能透過屬性 %1 或序列建構子提供預設值。</translation>
+ </message>
+ <message>
+ <source>Element %1 cannot have children.</source>
+ <translation>元素 %1 不能有子元素。</translation>
+ </message>
+ <message>
+ <source>Element %1 cannot have a sequence constructor.</source>
+ <translation>元素 %1不能有序列建構子。</translation>
+ </message>
+ <message>
+ <source>The attribute %1 cannot appear on %2, when it is a child of %3.</source>
+ <translation>屬性 %1 不能出現在 %2,因為它是 %3 的子元素。</translation>
+ </message>
+ <message>
+ <source>A parameter in a function cannot be declared to be a tunnel.</source>
+ <translation>函式內的參數不能被宣告為通道(tunnel)。</translation>
+ </message>
+ <message>
+ <source>This processor is not Schema-aware and therefore %1 cannot be used.</source>
+ <translation>此處理器不是 Schema-aware,因此不能使用 %1。</translation>
+ </message>
+ <message>
+ <source>Top level stylesheet elements must be in a non-null namespace, which %1 isn&apos;t.</source>
+ <translation>頂層樣式表元素必須是非空白的命名空間,而 %1 不是。</translation>
+ </message>
+ <message>
+ <source>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</source>
+ <translation>元素 %2 內屬性 %1 的值必須是 %3 或 %4,而不是 %5。</translation>
+ </message>
+ <message>
+ <source>Attribute %1 cannot have the value %2.</source>
+ <translation>屬性 %1 的值不能為 %2。</translation>
+ </message>
+ <message>
+ <source>The attribute %1 can only appear on the first %2 element.</source>
+ <translation>屬性 %1 只能出現在前 %2 個元素內。</translation>
+ </message>
+ <message>
+ <source>At least one %1 element must appear as child of %2.</source>
+ <translation>%2 必須至少有一個子元素 %1。</translation>
+ </message>
+ <message>
+ <source>%1 has inheritance loop in its base type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Circular inheritance of base type %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Circular inheritance of union %1.</source>
+ <translation type="unfinished"></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"></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"></translation>
+ </message>
+ <message>
+ <source>Base type of simple type %1 cannot be complex type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type %1 cannot have direct base type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type %1 is not allowed to have base type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type %1 can only have simple atomic type as base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type %1 cannot derive from %2 as the latter defines restriction as final.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Variety of item type of %1 must be either atomic or union.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Variety of member types of %1 must be atomic.</source>
+ <translation type="unfinished"></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"></translation>
+ </message>
+ <message>
+ <source>Simple type %1 is only allowed to have %2 facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base type of simple type %1 must have variety of type list.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base type of simple type %1 has defined derivation by restriction as final.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Item type of base type does not match item type of %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type %1 contains not allowed facet type %2.</source>
+ <translation type="unfinished"></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"></translation>
+ </message>
+ <message>
+ <source>%1 is not allowed to have any facets.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base type %1 of simple type %2 must have variety of union.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base type %1 of simple type %2 is not allowed to have restriction in %3 attribute.</source>
+ <translation type="unfinished"></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"></translation>
+ </message>
+ <message>
+ <source>Derivation method of %1 must be extension because the base type %2 is a simple type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 has duplicated element %2 in its content model.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 has non-deterministic content.</source>
+ <translation type="unfinished"></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"></translation>
+ </message>
+ <message>
+ <source>Content model of complex type %1 is not a valid extension of content model of %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 must have simple content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 must have the same simple type as its base class %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 cannot be derived from base type %2%3.</source>
+ <translation type="unfinished"></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"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 with simple content cannot be derived from complex base type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Item type of simple type %1 cannot be a complex type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Member type of simple type %1 cannot be a complex type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 is not allowed to have a member type with the same name as itself.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet collides with %2 facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must have the same value as %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be equal or greater than %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be less than or equal to %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet contains invalid regular expression</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unknown notation %1 used in %2 facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet contains invalid value %2: %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet cannot be %2 or %3 if %4 facet of base type is %5.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet cannot be %2 if %3 facet of base type is %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be less than or equal to %2 facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be less than %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet and %2 facet cannot appear together.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be greater than %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be less than %2 facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 facet must be greater than or equal to %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type contains not allowed facet %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1, %2, %3, %4, %5 and %6 facets are not allowed when derived by list.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Only %1 and %2 facets are allowed when derived by union.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 contains %2 facet with invalid data: %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute group %1 contains attribute %2 twice.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute group %1 contains two different attributes that both have types derived from %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute group %1 contains attribute %2 that has value constraint but type that inherits from %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 contains attribute %2 twice.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 contains two different attributes that both have types derived from %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 contains attribute %2 that has value constraint but type that inherits from %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is not allowed to have a value constraint if its base type is complex.</source>
+ <translation type="unfinished"></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"></translation>
+ </message>
+ <message>
+ <source>Value constraint of element %1 is not of elements type: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is not allowed to have substitution group affiliation as it is no global element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type of element %1 cannot be derived from type of substitution group affiliation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Value constraint of attribute %1 is not of attributes type: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 has value constraint but has type derived from %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute in derived complex type must be %2 like in base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 in derived complex type must have %2 value constraint like in base type.</source>
+ <translation type="unfinished"></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>
+ </message>
+ <message>
+ <source>Attribute %1 in derived complex type must have %2 value constraint.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>processContent of base wildcard must be weaker than derived wildcard.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 exists twice with different types.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Particle contains non-deterministic wildcards.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base attribute %1 is required but derived attribute is not.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type of derived attribute %1 cannot be validly derived from type of base attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Value constraint of derived attribute %1 does not match value constraint of base attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived attribute %1 does not exist in the base definition.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived attribute %1 does not match the wildcard in the base definition.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base attribute %1 is required but missing in derived definition.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived definition contains an %1 element that does not exists in the base definition</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived wildcard is not a subset of the base wildcard.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 of derived wildcard is not a valid restriction of %2 of base wildcard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 from base type is missing in derived type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type of derived attribute %1 differs from type of base attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base definition contains an %1 element that is missing in the derived definition</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 references unknown %2 or %3 element %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 references identity constraint %2 that is no %3 or %4 element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 has a different number of fields from the identity constraint %2 that it references.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base type %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Item type %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Member type %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Base type %1 of complex type cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 cannot have complex base type that has a %2.</source>
+ <translation type="unfinished"></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>
+ </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>
+ </message>
+ <message>
+ <source>Type of %1 element must be a simple type, %2 is not.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Substitution group %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Substitution group %1 has circular definition.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duplicated element names %1 in %2 element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reference %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Circular group reference for %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element is not allowed in this scope</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element cannot have %2 attribute with value other than %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element cannot have %2 attribute with value other than %3 or %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 or %2 attribute of reference %3 does not match with the attribute declaration %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute group %1 has circular reference.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute in %2 must have %3 use like in base type %4.</source>
+ <translation type="unfinished"></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>
+ </message>
+ <message>
+ <source>%1 has attribute wildcard but its base type %2 has not.</source>
+ <translation type="unfinished"></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>
+ </message>
+ <message>
+ <source>Enumeration facet contains invalid content: {%1} is not a value of type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Namespace prefix of qualified name %1 is not defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element %2 is not a valid restriction of the %3 element it redefines: %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Empty particle cannot be derived from non-empty particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived particle is missing element %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived element %1 is missing value constraint as defined in base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived element %1 has weaker value constraint than base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fixed value constraint of element %1 differs from value constraint in base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived element %1 cannot be nillable as base element is not nillable.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Block constraints of derived element %1 must not be more weaker than in the base element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Simple type of derived element %1 cannot be validly derived from base element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type of derived element %1 cannot be validly derived from base element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is missing in derived particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 does not match namespace constraint of wildcard in base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wildcard in derived particle is not a valid subset of wildcard in base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>processContent of wildcard in derived particle is weaker than wildcard in base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Derived particle allows content that is not allowed in the base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Can not process unknown element %1, expected elements are: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is not allowed in this scope, possible elements are: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Child element is missing in that scope, possible child elements are: %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Document is not a XML schema.</source>
+ <translation type="unfinished"></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>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element contains invalid content: {%3}.</source>
+ <translation type="unfinished"></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>
+ </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>
+ </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>
+ </message>
+ <message>
+ <source>%1 element without %2 attribute is not allowed inside schema without target namespace.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element is not allowed inside %2 element if %3 attribute is present.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element has neither %2 attribute nor %3 child element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element with %2 child element must not have a %3 attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must be %3 or %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must have a value of %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must have a value of %3 or %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element must not have %2 and %3 attribute together.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Content of %1 attribute of %2 element must not be from namespace %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must not be %3.</source>
+ <translation type="unfinished"></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>
+ </message>
+ <message>
+ <source>Specifying use=&apos;prohibited&apos; inside an attribute group has no effect.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element must have either %2 or %3 attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element must have either %2 attribute or %3 or %4 as child element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element requires either %2 or %3 attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Text or entity references not allowed inside %1 element</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must contain %3, %4 or a list of URIs.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 element is not allowed in this context.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element has larger value than %3 attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Prefix of qualified name %1 is not defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 attribute of %2 element must either contain %3 or the other values.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Component with ID %1 has been defined previously.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute group %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element group %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Notation %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Identity constraint %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duplicated facets in simple type %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 is not valid according to %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>String content does not match the length facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>String content does not match the minLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>String content does not match the maxLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>String content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>String content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match the maxInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match the maxExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match the minInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match the minExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Signed integer content does not match in the totalDigits facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match the maxInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match the maxExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match the minInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match the minExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsigned integer content does not match in the totalDigits facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Double content does not match the maxInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Double content does not match the maxExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Double content does not match the minInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Double content does not match the minExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Double content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Double content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Decimal content does not match in the fractionDigits facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Decimal content does not match in the totalDigits facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Date time content does not match the maxInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Date time content does not match the maxExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Date time content does not match the minInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Date time content does not match the minExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Date time content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Date time content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duration content does not match the maxInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duration content does not match the maxExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duration content does not match the minInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duration content does not match the minExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duration content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duration content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Boolean content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Binary content does not match the length facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Binary content does not match the minLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Binary content does not match the maxLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Binary content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid QName content: %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>QName content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>QName content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Notation content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List content does not match length facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List content does not match minLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List content does not match maxLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Union content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Union content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Data of type %1 are not allowed to be empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is missing child element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>There is one IDREF value with no corresponding ID: %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Loaded schema file is invalid.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 contains invalid data.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xsi:schemaLocation namespace %1 has already appeared earlier in the instance document.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xsi:noNamespaceSchemaLocation cannot appear after the first no-namespace element or attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No schema defined for validation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No definition for element %1 available.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Specified type %1 is not known to the schema.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is not defined in this scope.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Declaration for element %1 does not exist.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains invalid content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is declared as abstract.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is not nillable.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 contains invalid data: %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element contains content although it is nillable.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fixed value constraint not allowed if element is nillable.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 cannot contain other elements, as it has a fixed content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Specified type %1 is not validly substitutable with element type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Complex type %1 is not allowed to be abstract.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains not allowed attributes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains not allowed child element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Content of element %1 does not match its type definition: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Content of element %1 does not match defined value constraint.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains not allowed child content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains not allowed text content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 is missing required attribute %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 does not match the attribute wildcard.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Declaration for attribute %1 does not exist.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains two attributes of type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attribute %1 contains invalid content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Element %1 contains unknown attribute %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Content of attribute %1 does not match its type definition: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Content of attribute %1 does not match defined value constraint.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Non-unique value found for constraint %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Key constraint %1 contains absent fields.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Key constraint %1 contains references nillable element %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No referenced value found for key reference %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>More than one value found for field %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Field %1 has no simple type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID value &apos;%1&apos; is not unique.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&apos;%1&apos; attribute contains invalid QName content: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+</TS>
diff --git a/config.profiles/symbian/translations_symbian/translations.pro b/config.profiles/symbian/translations_symbian/translations.pro
new file mode 100644
index 0000000..f304c1b
--- /dev/null
+++ b/config.profiles/symbian/translations_symbian/translations.pro
@@ -0,0 +1,16 @@
+TEMPLATE = subdirs
+
+
+symbian: {
+SYMBIANTRANSLATIONSFILES = qt
+SYMBIANTRANSLATIONS = ur fa ar he fr pl ru zh_cn zh_tw cs da de es gl hu ja pt sk sl sv uk
+
+CONFIG = loc
+
+for( FILE, SYMBIANTRANSLATIONSFILES ) {
+ for( LANGID, SYMBIANTRANSLATIONS ) {
+ TRANSLATIONS += $${EPOCROOT}epoc32/include/platform/qt/translations/$${FILE}_$${LANGID}.ts
+ }
+}
+
+} \ No newline at end of file
diff --git a/configure b/configure
index 804e580..e8a5662 100755
--- a/configure
+++ b/configure
@@ -525,7 +525,7 @@ elif [ $COMMERCIAL_USER = "yes" ]; then
# Qt All-OS
LICENSE_EXTENSION="-ALLOS"
;;
- 8M,* | KM,* | S9,* | SC,* | SU,* | SW,* | X9,* | XC,* | XU,* | XW,*)
+ 8M,* | KM,* | S9,* | SC,* | SM,* | SU,* | SW,* | X9,* | XC,* | XU,* | XW,*)
# Qt for Embedded Linux
LICENSE_EXTENSION="-EMBEDDED"
;;
@@ -849,6 +849,7 @@ CFG_ALSA=auto
CFG_PULSEAUDIO=auto
CFG_COREWLAN=auto
CFG_ICD=auto
+CFG_NOPROCESS=no
# initalize variables used for installation
QT_INSTALL_PREFIX=
@@ -888,6 +889,9 @@ QT_LIBS_GLIB=
QT_CFLAGS_GSTREAMER=
QT_LIBS_GSTREAMER=
+#flag for Symbian fpu settings
+QT_CFLAGS_FPU=
+
# flags for libconnsettings0 (used for Maemo ICD bearer management plugin)
QT_CFLAGS_CONNSETTINGS=
QT_LIBS_CONNSETTINGS=
@@ -1172,6 +1176,16 @@ while [ "$#" -gt 0 ]; do
VAL=`echo $1 | sed 's,-D,,'`
fi
;;
+ -fpu)
+ VAR="fpu"
+ # this option may or may not be followed by an argument
+ if [ -z "$2" ] || echo "$2" | grep '^-' >/dev/null 2>&1; then
+ VAL=no
+ else
+ shift
+ VAL=$1
+ fi
+ ;;
-I?*|-I)
VAR="add_ipath"
if [ "$1" = "-I" ]; then
@@ -2357,6 +2371,12 @@ while [ "$#" -gt 0 ]; do
UNKNOWN_OPT=yes
fi
;;
+ dont-process)
+ CFG_NOPROCESS=yes
+ ;;
+ process)
+ CFG_NOPROCESS=no
+ ;;
audio-backend)
if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
CFG_AUDIO_BACKEND="$VAL"
@@ -2364,6 +2384,11 @@ while [ "$#" -gt 0 ]; do
UNKNOWN_OPT=yes
fi
;;
+ fpu)
+ if [ "$VAL" != "no" ]; then
+ QT_CFLAGS_FPU=$VAL
+ fi
+ ;;
*)
UNKNOWN_OPT=yes
;;
@@ -5016,6 +5041,9 @@ if [ "$XPLATFORM_SYMBIAN" = "yes" ]; then
if [ "$CFG_LARGEFILE" = auto ]; then
CFG_LARGEFILE=no
fi
+ if [ "$CFG_PHONON" = auto ]; then
+ CFG_PHONON=yes
+ fi
if test -z "$EPOCROOT"; then
echo "Please export EPOCROOT. It should point to the sdk install dir"
@@ -6898,9 +6926,11 @@ else
QCONFIG_FLAGS="$QCONFIG_FLAGS QT_STYLE_S60"
fi
-# Disable OpenGL on Symbian.
+# Just check if OpenGL is not set by command argumets for Symbian.
if [ "$XPLATFORM_SYMBIAN" = "yes" ]; then
- CFG_OPENGL="no"
+ if [ "$CFG_OPENGL" = "auto" ]; then
+ CFG_OPENGL="no"
+ fi
fi
# enable opengl
@@ -8220,6 +8250,12 @@ if [ "$CFG_DEV" = "yes" ]; then
QT_CONFIG="$QT_CONFIG private_tests"
fi
+if [ -z "$QT_CFLAGS_FPU" ]; then
+ if echo "$XPLATFORM" | grep "symbian-sbsv2" > /dev/null 2>&1; then
+ QT_CFLAGS_FPU=softvfp
+ fi
+fi
+
# Make the application arch follow the Qt arch for single arch builds.
# (for multiple-arch builds, set CONFIG manually in the application .pro file)
if [ `echo "$CFG_MAC_ARCHS" | wc -w` -eq 1 ]; then
@@ -8253,10 +8289,11 @@ if [ -n "$QT_GCC_MAJOR_VERSION" ]; then
echo "QT_GCC_MINOR_VERSION = $QT_GCC_MINOR_VERSION" >> "$QTCONFIG.tmp"
echo "QT_GCC_PATCH_VERSION = $QT_GCC_PATCH_VERSION" >> "$QTCONFIG.tmp"
fi
-if [ "$XPLATFORM_SYMBIAN_SBSV2" = "yes" ]; then
+if [ -n "$QT_CFLAGS_FPU" ]; then
echo "#Qt for symbian FPU settings" >> "$QTCONFIG.tmp"
- echo "MMP_RULES += \"ARMFPU softvfp\"" >> "$QTCONFIG.tmp"
+ echo "MMP_RULES += \"ARMFPU $QT_CFLAGS_FPU\"" >> "$QTCONFIG.tmp"
fi
+
# replace qconfig.pri if it differs from the newly created temp file
if cmp -s "$QTCONFIG.tmp" "$QTCONFIG"; then
rm -f "$QTCONFIG.tmp"
@@ -8679,11 +8716,13 @@ EXEC=""
#-------------------------------------------------------------------------------
echo "Finding project files. Please wait..."
-"$outpath/bin/qmake" -prl -r "${relpath}/projects.pro"
-if [ -f "${relpath}/projects.pro" ]; then
- mkfile="${outpath}/Makefile"
- [ -f "$mkfile" ] && chmod +w "$mkfile"
- QTDIR="$outpath" "$outpath/bin/qmake" -spec "$XQMAKESPEC" "${relpath}/projects.pro" -o "$mkfile"
+if [ "$CFG_NOPROCESS" != "yes" ]; then
+ "$outpath/bin/qmake" -prl -r "${relpath}/projects.pro"
+ if [ -f "${relpath}/projects.pro" ]; then
+ mkfile="${outpath}/Makefile"
+ [ -f "$mkfile" ] && chmod +w "$mkfile"
+ QTDIR="$outpath" "$outpath/bin/qmake" -spec "$XQMAKESPEC" "${relpath}/projects.pro" -o "$mkfile"
+ fi
fi
# .projects -> projects to process
@@ -8812,8 +8851,8 @@ PART_ROOTS=
for part in $CFG_BUILD_PARTS; do
case "$part" in
tools) PART_ROOTS="$PART_ROOTS tools" ;;
- libs) PART_ROOTS="$PART_ROOTS src" ;;
- translations) PART_ROOTS="$PART_ROOTS tools/linguist/lrelease translations" ;;
+ libs) PART_ROOTS="$PART_ROOTS src tools/linguist/lrelease" ;;
+ translations) PART_ROOTS="$PART_ROOTS translations" ;;
examples) PART_ROOTS="$PART_ROOTS examples demos" ;;
*) ;;
esac
@@ -8838,15 +8877,22 @@ for file in .projects .projects.3; do
case $a in
*winmain/winmain.pro)
- [ "$XPLATFORM_MINGW" = "yes" ] || continue
+ if [ "$CFG_NOPROCESS" = "yes" ] || [ "$XPLATFORM_MINGW" != "yes" ]; then
+ continue
+ fi
SPEC=$XQMAKESPEC ;;
*s60main/s60main.pro)
- [ "$XPLATFORM_SYMBIAN" = "yes" ] || continue
- ;;
+ if [ "$CFG_NOPROCESS" = "yes" ] || [ "$XPLATFORM_SYMBIAN" != "yes" ]; then
+ continue
+ fi;;
*examples/activeqt/*) continue ;;
*/qmake/qmake.pro) continue ;;
*tools/bootstrap*|*tools/moc*|*tools/rcc*|*tools/uic*|*linguist/lrelease*) SPEC=$QMAKESPEC ;;
- *) SPEC=$XQMAKESPEC ;;
+ *) if [ "$CFG_NOPROCESS" = "yes" ]; then
+ continue
+ else
+ SPEC=$XQMAKESPEC
+ fi;;
esac
dir=`dirname "$a" | sed -e "s;$sepath;.;g"`
test -d "$dir" || mkdir -p "$dir"
diff --git a/configure.exe b/configure.exe
index f8d520a..068701f 100755
--- a/configure.exe
+++ b/configure.exe
Binary files differ
diff --git a/demos/declarative/minehunt/minehunt.pro b/demos/declarative/minehunt/minehunt.pro
index f591011..d23bb05 100644
--- a/demos/declarative/minehunt/minehunt.pro
+++ b/demos/declarative/minehunt/minehunt.pro
@@ -18,6 +18,6 @@ symbian:{
TARGET.EPOCHEAPSIZE = 0x20000 0x2000000
include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
qmlminehuntfiles.files = MinehuntCore minehunt.qml
- DEPLOYMENT = qmlminehuntfiles
+ DEPLOYMENT += qmlminehuntfiles
}
diff --git a/demos/textedit/textedit.cpp b/demos/textedit/textedit.cpp
index 165c97c..9fa1949 100644
--- a/demos/textedit/textedit.cpp
+++ b/demos/textedit/textedit.cpp
@@ -262,7 +262,8 @@ void TextEdit::setupEditActions()
tb->addAction(a);
menu->addAction(a);
#ifndef QT_NO_CLIPBOARD
- actionPaste->setEnabled(QApplication::clipboard()->mimeData()->hasText());
+ if (const QMimeData *md = QApplication::clipboard()->mimeData())
+ actionPaste->setEnabled(md->hasText());
#endif
}
@@ -681,7 +682,8 @@ void TextEdit::cursorPositionChanged()
void TextEdit::clipboardDataChanged()
{
#ifndef QT_NO_CLIPBOARD
- actionPaste->setEnabled(QApplication::clipboard()->mimeData()->hasText());
+ if (const QMimeData *md = QApplication::clipboard()->mimeData())
+ actionPaste->setEnabled(md->hasText());
#endif
}
diff --git a/doc/src/declarative/anchor-layout.qdoc b/doc/src/declarative/anchor-layout.qdoc
index b77ce36..f5d5697 100644
--- a/doc/src/declarative/anchor-layout.qdoc
+++ b/doc/src/declarative/anchor-layout.qdoc
@@ -30,6 +30,8 @@
\target anchor-layout
\title Anchor-based Layout in QML
+\section1 Overview
+
In addition to the more traditional \l Grid, \l Row, and \l Column,
QML also provides a way to layout items using the concept of \e anchors.
Each item can be thought of as having a set of 7 invisible "anchor lines":
@@ -54,20 +56,6 @@ In this case, the left edge of \e rect2 is bound to the right edge of \e rect1,
\image edge1.png
-The anchoring system also allows you to specify margins and offsets. Margins specify the amount of empty space to leave to the outside of an item, while offsets allow you to manipulate positioning using the center anchor lines. Note that margins specified using the anchor layout system only have meaning for anchors; they won't have any effect when using other layouts or absolute positioning.
-
-\image margins_qml.png
-
-The following example specifies a left margin:
-
-\code
-Rectangle { id: rect1; ... }
-Rectangle { id: rect2; anchors.left: rect1.right; anchors.leftMargin: 5; ... }
-\endcode
-
-In this case, a margin of 5 pixels is reserved to the left of \e rect2, producing the following:
-
-\image edge2.png
You can specify multiple anchors. For example:
@@ -78,7 +66,9 @@ Rectangle { id: rect2; anchors.left: rect1.right; anchors.top: rect1.bottom; ...
\image edge3.png
-By specifying multiple horizontal or vertical anchors you can control the size of an item. For example:
+By specifying multiple horizontal or vertical anchors you can control the size of an item. Below,
+\e rect2 is anchored to the right of \e rect1 and the left of \e rect3. If either of the blue
+rectangles are moved, \e rect2 will stretch and shrink as necessary:
\code
Rectangle { id: rect1; x: 0; ... }
@@ -88,9 +78,42 @@ Rectangle { id: rect3; x: 150; ... }
\image edge4.png
-\section1 Limitations
-For performance reasons, you can only anchor an item to its siblings and direct parent. For example, the following anchor would be considered invalid and would produce a warning:
+\section1 Anchor Margins and Offsets
+
+The anchoring system also allows \e margins and \e offsets to be specified for an item's anchors.
+Margins specify the amount of empty space to leave to the outside of an item's anchor, while
+offsets allow positioning to be manipulated using the center anchor lines. An item can
+specify its anchor margins individually through \l {Item::anchors.leftMargin}{leftMargin},
+\l {Item::anchors.rightMargin}{rightMargin}, \l {Item::anchors.topMargin}{topMargin} and
+\l {Item::anchors.bottomMargin}{bottomMargin}, or use \l {Item::}{anchors.margins} to
+specify the same margin value for all four edges. Anchor offsets are specified using
+\l {Item::anchors.horizontalCenterOffset}{horizontalCenterOffset},
+\l {Item::anchors.verticalCenterOffset}{verticalCenterOffset} and
+\l {Item::anchors.baselineOffset}{baselineOffset}.
+
+\image margins_qml.png
+
+The following example specifies a left margin:
+
+\code
+Rectangle { id: rect1; ... }
+Rectangle { id: rect2; anchors.left: rect1.right; anchors.leftMargin: 5; ... }
+\endcode
+
+In this case, a margin of 5 pixels is reserved to the left of \e rect2, producing the following:
+
+\image edge2.png
+
+\note Anchor margins only apply to anchors; they are \e not a generic means of applying margins to an \l Item.
+If an anchor margin is specified for an edge but the item is not anchored to any item on that
+edge, the margin is not applied.
+
+
+\section1 Restrictions
+
+For performance reasons, you can only anchor an item to its siblings and direct parent. For example,
+the following anchor is invalid and would produce a warning:
\badcode
Item {
@@ -103,4 +126,13 @@ Item {
}
\endcode
+Also, anchor-based layouts cannot be mixed with absolute positioning. If an item specifies its
+\l {Item::}{x} position and also sets \l {Item::}{anchors.left},
+or anchors its left and right edges but additionally sets a \l {Item::}{width}, the
+result is undefined, as it would not be clear whether the item should use anchoring or absolute
+positioning. The same can be said for setting an item's \l {Item::}{y} and \l {Item::}{height}
+with \l {Item::}{anchors.top} and \l {Item::}{anchors.bottom}, or setting \l {Item::}{anchors.fill}
+as well as \l {Item::}{width} or \l {Item::}{height}. If you wish to change from using
+anchor-based to absolute positioning, you can clear an anchor value by setting it to \c undefined.
+
*/
diff --git a/doc/src/declarative/basictypes.qdoc b/doc/src/declarative/basictypes.qdoc
index 71192bf..e9d3a44 100644
--- a/doc/src/declarative/basictypes.qdoc
+++ b/doc/src/declarative/basictypes.qdoc
@@ -33,7 +33,7 @@
the \l {QML Elements}.
Some of these types can also be used for defining
- \c property values in QML. See \l{Extending types from QML} for the
+ \c property values in QML. See \l{Writing QML Components: Properties, Methods and Signals} for the
list of types that can be used for \c property values.
\annotatedlist qmlbasictypes
@@ -95,6 +95,26 @@
*/
/*!
+ \qmlbasictype double
+ \ingroup qmlbasictypes
+
+ \brief A double number has a decimal point and is stored in double precision.
+
+ A double number has a decimal point and is stored in double precision, \l
+ {http://en.wikipedia.org/wiki/IEEE_754} {IEEE floating point}
+ format.
+
+ Example:
+ \qml
+ Item {
+ property double number: 32155.2355
+ }
+ \endqml
+
+ \sa {QML Basic Types}
+*/
+
+/*!
\qmlbasictype string
\ingroup qmlbasictypes
@@ -380,7 +400,7 @@
\c child1, \c child2 and \c child3 will be added to the children list
in the order in which they appear.
- List \l {Adding new properties}{properties} can be created as a
+ 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:
@@ -412,7 +432,8 @@
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.)
- To create a modifiable list, create an array object from within a \c .js JavaScript file,
+ 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:
@@ -452,6 +473,78 @@
\sa {QML Basic Types}
*/
+
+/*!
+ \qmlbasictype variant
+ \ingroup qmlbasictypes
+
+ \brief A variant type is a generic property type.
+
+ 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 {
+ property variant aNumber : 100
+ property variant aString : "Hello world!"
+ property variant aList : [ 1, 2, "buckle my shoe" ]
+ }
+ \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.
+
+ \qml
+ Item {
+ property variant animal : { 'type': 'bird', 'species': 'galah', 'age': 7 }
+
+ Component.onCompleted: {
+ for (var attribute in animal)
+ console.log(attribute, "=", animal[attribute])
+ }
+ }
+ \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:
+
+ \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
+
+ \sa {QML Basic Types}
+*/
+
+
/*!
\qmlbasictype vector3d
\ingroup qmlbasictypes
diff --git a/doc/src/declarative/codingconventions.qdoc b/doc/src/declarative/codingconventions.qdoc
index ba789e0..3f92d46 100644
--- a/doc/src/declarative/codingconventions.qdoc
+++ b/doc/src/declarative/codingconventions.qdoc
@@ -35,7 +35,7 @@ This page assumes that you are already familiar with the QML language.
If you need an introduction to the language, please read \l {Introduction to the QML language}{the QML introduction} first.
-\section1 QML objects
+\section1 QML Objects
Through our documentation and examples, QML objects are always structured in the following order:
@@ -58,7 +58,7 @@ For example, a hypothetical \e photo QML object would look like this:
\snippet doc/src/snippets/declarative/codingconventions/photo.qml 0
-\section1 Grouped properties
+\section1 Grouped Properties
If using multiple properties from a group of properties,
we use the \e {group notation} rather than the \e {dot notation} to improve readability.
@@ -72,6 +72,18 @@ can be written like this:
\snippet doc/src/snippets/declarative/codingconventions/dotproperties.qml 1
+\section1 Private Properties
+
+QML and JavaScript do not enforce private properties like C++. There is a need
+to hide these private properties, for example, when the properties are part of
+the implementation. As a convention, private properties begin with two
+\e underscore characters. For example, \c __area, is a property that is
+accessible but is not meant for public use. Note that QML and JavaScript will
+grant the user access to these properties.
+
+\snippet doc/src/snippets/declarative/codingconventions/private.qml 0
+
+
\section1 Lists
If a list contains only one element, we generally omit the square brackets.
@@ -87,7 +99,7 @@ we will write this:
\snippet doc/src/snippets/declarative/codingconventions/lists.qml 1
-\section1 JavaScript code
+\section1 JavaScript Code
If the script is a single expression, we recommend writing it inline:
diff --git a/doc/src/declarative/declarativeui.qdoc b/doc/src/declarative/declarativeui.qdoc
index 01e1302..41b9952 100644
--- a/doc/src/declarative/declarativeui.qdoc
+++ b/doc/src/declarative/declarativeui.qdoc
@@ -91,9 +91,10 @@ Module.
\list
\o \l{QML Documents}
\o \l{Property Binding}
+\o \l{Anchor-based Layout in QML}
+\o \l{Writing QML Components: Properties, Methods and Signals}
\o \l{QML Scope}
\o \l{QML Modules}
-\o \l{Anchor-based Layout in QML}
\endlist
\section1 User Interaction
@@ -107,6 +108,7 @@ Module.
\section1 Handling Data
\list
+\o \l{QML Basic Types}{QML Basic Data Types}
\o \l{Using QML Positioner and Repeater Items}
\o \l{QML Data Models}
\o \l{Presenting Data with QML}
@@ -118,7 +120,6 @@ Module.
\list
\o \l{Qt Declarative UI Runtime}
\o \l{Integrating JavaScript}
-\o \l{Extending types from QML}
\o \l{Dynamic Object Management in QML}
\endlist
@@ -136,6 +137,7 @@ Module.
\list
\o \l{QML Elements}
+\o \l{QML Basic Types}
\o \l{QML Global Object}
\o \l{QML Internationalization}
\o \l{QML Security}
diff --git a/doc/src/declarative/dynamicobjects.qdoc b/doc/src/declarative/dynamicobjects.qdoc
index daf2ae1..fcc9fd4 100644
--- a/doc/src/declarative/dynamicobjects.qdoc
+++ b/doc/src/declarative/dynamicobjects.qdoc
@@ -102,6 +102,9 @@ Notice in both instances, \l {Component::createObject()}{createObject()} is call
When using files with relative paths, the path should
be relative to the file where \l {QML:Qt::createComponent()}{Qt.createComponent()} is executed.
+To connect signals to (or receive signals from) dynamically created objects, use the signal
+\c connect() method. See \l {Connecting signals to methods and other signals} for more information.
+
\section2 Creating an object from a string of QML
diff --git a/doc/src/declarative/extending-tutorial.qdoc b/doc/src/declarative/extending-tutorial.qdoc
index dff1d9c..c998c5c 100644
--- a/doc/src/declarative/extending-tutorial.qdoc
+++ b/doc/src/declarative/extending-tutorial.qdoc
@@ -285,8 +285,8 @@ int-type property to store an identifier for each chart:
}
\endcode
-We can also use various other property types. QML has built-in support for the following
-types listed in the \l{Extending Types from QML} document, including the following:
+We can also use various other property types. QML has built-in support for the types
+listed in the \l{Adding Properties} documentation, which includes the following:
\list
\o bool, unsigned int, int, float, double, qreal
diff --git a/doc/src/declarative/extending.qdoc b/doc/src/declarative/extending.qdoc
index 19e9ffc..3311c82 100644
--- a/doc/src/declarative/extending.qdoc
+++ b/doc/src/declarative/extending.qdoc
@@ -75,13 +75,15 @@ constructor.
\endquotation
+#include <QtDeclarative> to use qmlRegisterType().
+
Types can be registered by libraries, application code, or by plugins
(see QDeclarativeExtensionPlugin).
Once registered, all \l {Qt's Property System}{properties} of the
supported types are available in QML. QML has intrinsic support for
-properties of the types listed in the \l{Extending Types from QML}
-document, including the following:
+properties of the types listed in the \l{Adding Properties}
+document, which includes the following:
\list
\o bool, unsigned int, int, float, double, qreal
@@ -427,7 +429,7 @@ on<Property-name>Changed, regardless of the name used for the NOTIFY
signal in C++. We recommend using <property-name>Changed() for the
NOTIFY signal in C++.
-See also \l {Extending Types from QML}.
+See also \l {Writing QML Components: Properties, Methods and Signals}
\section1 Methods
@@ -459,7 +461,7 @@ constructing an animation object and manually setting the animation's "target"
property, a property value source can be assigned directly to a property of any
type and automatically set up this association.
-The example shown here is rather contrived: the \c announcment property of the
+The example shown here is rather contrived: the \c announcement property of the
\c BirthdayParty object is a string that is printed every time it is assigned and
the \c HappyBirthdaySong value source generates the lyrics of the song
"Happy Birthday".
@@ -594,10 +596,10 @@ the appropriate property on the extension object is used instead.
When an extended type is installed, one of the
\code
template<typename T, typename ExtendedT>
-int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName)
+int qmlRegisterExtendedType(const char *uri, int versionMajor, int versionMinor, const char *qmlName)
template<typename T, typename ExtendedT>
-int qmlRegisterType()
+int qmlRegisterExtendedType()
\endcode
functions should be used instead of the regular \c qmlRegisterType() variations.
The arguments are identical to the corresponding non-extension registration functions,
@@ -635,147 +637,179 @@ public:
/*!
\page qml-extending-types.html
-\title Extending Types from QML
+\title Writing QML Components: Properties, Methods and Signals
-Many of the elements available for use in QML are implemented in
-\l {Extending QML in C++}{C++}. These types are know as "core types". QML
-allows programmers to build new, fully functional elements without using C++.
-Existing core types can be extended, and new types defined entirely in the QML
-language.
+One of the key concepts in QML is the ability to define your own QML components that suit
+the purposes of your application. The standard \l {QML Elements} provide the essential components
+for creating a QML application; beyond these, you can write your own custom components that can
+be created and reused, without the use of C++.
-\tableofcontents
+Components are the building blocks of a QML project. When writing a QML application, whether
+large or small, it is best to separate QML code into smaller components that perform specific
+sets of operations, instead of creating mammoth QML files with large, combined functionality
+that is more difficult to manage and may contain duplicated code.
+
+
+\section1 Defining New Components
-\section1 Adding new properties
+A component is a reusable type with a well-defined interface, built entirely in QML.
+Any snippet of QML code can become a component, by placing the code in a file "<Name>.qml" where
+<Name> is the new component name, beginning with an uppercase letter. These QML files automatically
+become available as new QML element types to other QML components and applications in the same directory.
-New properties can be added to an existing type using the \c property keyword.
-These new properties are
-available for use within QML, and also appear as regular Qt properties on the
-C++ object, accessible through the regular property access mechanisms.
+For example, one of the simplest and most common components you can build in QML is a
+button-type component. Below, we implement this component as a \l Rectangle with a clickable
+\l MouseArea, in a file named \c Button.qml:
-Like all properties in QML, custom properties are typed. The type is used to
-define the property's behavior, and also determines the C++ type of the created
-Qt property. The following table shows the list of types available when
-declaring a new property, and the corresponding C++ type.
+\snippet doc/src/snippets/declarative/qml-extending-types/components/Button.qml 0
+
+Now this component can be reused by another file within the same directory. Since the file is
+named \c Button.qml, the component is referred to as \c Button:
\table
-\header \o QML Type Name \o C++ Type Name
-\row \o int \o int
-\row \o bool \o bool
-\row \o double \o double
-\row \o real \o double
-\row \o string \o QString
-\row \o url \o QUrl
-\row \o color \o QColor
-\row \o date \o QDateTime
-\row \o variant \o QVariant
+\row
+\o \snippet doc/src/snippets/declarative/qml-extending-types/components/application.qml 0
+\o \image qml-extending-types.png
\endtable
-From QML you can also declare object and list properties using any element name
-like this:
+The root object in \c Button.qml defines the attributes that are available to users of the
+\c Button component. In this case, the root object is a \l Rectangle, so any properties, methods
+and signals of \l Rectangle are made available, allowing \c application.qml to
+customize the \c width, \c height, \c radius and \c color properties of \c Button objects.
-\code
- property QtObject objectProperty
- property Item itemProperty
- property MyCustomType customProperty
- property list<Item> listOfItemsProperty
-\endcode
-Custom types must be registered with qmlRegisterType() to be usable as a property
-type. Also note that list properties cannot be modified like ordinary JavaScript
-arrays; see the \l {list}{list type documentation} for details.
+If \c Button.qml was not in the same directory, \c application.qml would need to load it as a
+\l {Modules}{module} from a specific filesystem path or \l{QDeclarativeExtensionPlugin}{plugin}.
+Also, note the letter case of the component file name is significant on some (notably UNIX)
+filesystems. It is recommended the file name case matches the case of the QML component name
+exactly - for example, \c Box.qml and not \c BoX.qml - regardless of the platform to which the
+QML component will be deployed.
-QML supports two methods for adding a new property to a type: a new property
-definition, and a property alias. These are shown below.
+To write a useful component, it is generally necessary to provide it with custom attributes that store and
+communicate specific data. This is achieved by adding the following attributes to your components:
-\section2 Property definitions
+\list
+\o \bold Properties that can be accessed externally to modify an object (for example, \l Item has
+ \l {Item::}{width} and \l {Item::}{height} properties) and used in \l {Property Binding}
+\o \bold Methods of JavaScript code can be invoked internally or externally (for example,
+ \l Animation has a \l {Animation::}{start()} method)
+\o \bold Signals to notify other objects when an event has occurred (for example, MouseArea has a
+ \c clicked signal)
+\endlist
+
+The following sections show how these attributes can be added to QML components.
+
+
+\section1 Adding Properties
-Property definitions add a new property to an existing type. The storage of the
-property is managed by QML. The defined property may be read, written and bound
-to and from.
+A property is a value of a QML component that can be read and modified by other objects. For
+example, a \l Rectangle component has \l {Item::}{width}, \l {Item::}{height} and \l
+{Rectangle::}{color} properties. Significantly, properties be used with \l {Property Binding}, where
+a property value is automatically updated using the value of another property.
The syntax for defining a new property is:
+
\code
- [default] property <type> <name>[: defaultValue]
+[default] property <type> <name>[: defaultValue]
\endcode
-This declaration may appear anywhere within a type body, but it is customary to
-include it at the top. Attempting to declare two properties with the same name
-in the same type block is an error. However, a new property may reuse the name
-of an existing property on the type. This should be done with caution, as the
-existing property will be hidden, and become inaccessible.
+A \c property declaration can appear anywhere within a QML component definition, but it is customary
+to place it at the top. A component cannot declare more than one property with the same name. (It is
+possible to have a property name that is the same as an existing property in a type, but this is not
+recommended as the existing property becomes hidden and inaccessible.)
-The <type> must be one of the QML type names shown in the above table.
-Additionally, an optional default value of the property can be provided. The
-default value is a convenient shortcut, but is behaviorally identical to doing
-it in two steps, like this:
+Below is an example. The \c ImageViewer component has defined a \c string type property named
+\c currentImage, and its initial value is "default-image.png". This property is used to set the image
+displayed in the child \l Image object. Another file, \c application.qml, can create
+an \c ImageViewer object and read or modify the \c currentImage value:
-\code
- // Use default value
- property int myProperty: 10
+\table
+\row
+\o \snippet doc/src/snippets/declarative/qml-extending-types/properties/ImageViewer.qml 0
+\o \snippet doc/src/snippets/declarative/qml-extending-types/properties/application.qml 0
+\endtable
- // Longer, but behaviorally identical
- property int myProperty
- myProperty: 10
-\endcode
+It is optional for a property to have a default value. The default value is a convenient shortcut, and is
+behaviorally identical to doing it in two steps, like this:
+
+\qml
+// Use default value
+property int myProperty: 10
+
+// Longer, but behaviorally identical
+property int myProperty
+myProperty: 10
+\endqml
+
+
+\section2 Supported property types
-If a default value is not supplied or set later in the file, each type has a
-default value for when none is explicitly set. Below are the default values
-of some of the types. For the remaining types the default values are undefined.
+All QML properties are typed. The examples above show properties with \c int and \c string types;
+notice that the type of the property must be declared. The type is used to determine the property
+behavior, and how the property is defined in C++.
+
+A number of property types are supported by default. These are listed in the table below,
+with their default values and the corresponding C++ type:
\table
-\header \o QML Type \o Default Value
-\row \o bool \o false
-\row \o int \o 0
-\row \o double, real \o 0.0
-\row \o string, url \o "" (an empty string)
-\row \o color \o #000000 (black)
+\header \o QML Type Name \o Default value \o C++ Type Name
+\row \o \l int \o 0 \o int
+\row \o \l bool \o \c false \o bool
+\row \o \l double \o 0.0 \o double
+\row \o \l real \o 0.0 \o double
+\row \o \l string \o "" (empty string) \o QString
+\row \o \l url \o "" (empty url) \o QUrl
+\row \o \l color \o #000000 (black) \o QColor
+\row \o \l date \o \c undefined \o QDateTime
+\row \o \l variant \o \c undefined \o QVariant
\endtable
-The following example shows how to declare a new "innerColor" property that
-controls the color of the inner rectangle.
+QML object types can also be used as property types. This includes
+\l {Defining new QML elements}{custom QML types} implemented in C++. Such properties are
+defined like this:
-\code
- Rectangle {
- property color innerColor: "black"
-
- color: "red"; width: 100; height: 100
- Rectangle {
- anchors.centerIn: parent
- width: parent.width - 10
- height: parent.height - 10
- color: innerColor
- }
- }
-\endcode
+\qml
+property Item itemProperty
+property QtObject objectProperty
+property MyCustomType customProperty
+\endqml
+Such object-type properties default to an \c undefined value.
-\section3 Property signal handlers
+It is also possible to store a copy of a JavaScript object using the \c variant
+property type. This creates some restrictions on how the property should be used;
+see the \l {variant}{variant type documentation} for details.
-Adding a property to an item automatically adds a \e{value-changed}
-signal handler to the item. The signal hander is named
-\c{on<Property_name>Changed}, with the first letter of the property
-name being upper case.
+\l{list}{List properties} are created with the \c list<Type> syntax, and default to an empty
+list:
-Signal handlers can have arbitrary JavaScript code assigned. The following
-example shows how to output to a text console a new value of property
-\c{innerColor} whenever the value of this property changes.
+\qml
+property list<Item> listOfItems
+\endqml
-\code
- Rectangle {
- id: rect
- property color innerColor: "black"
+Note that list properties cannot be modified like ordinary JavaScript
+arrays. See the \l {list}{list type documentation} for details.
- onInnerColorChanged: { console.log(rect.innerColor); }
- }
-\endcode
+\section2 Property change signals
+
+Adding a \c property to an item automatically adds a \e {value changed}
+signal handler to the item. To connect to this signal, use a \l {Signal Handlers}{signal handler}
+named with the \c on<Property>Changed syntax, using upper case for the first letter of the
+property name.
+
+For example, the following \c onMyNumberChanged signal handler is automatically called whenever the
+\c myNumber property changes:
-\section3 Setting default properties
+\snippet doc/src/snippets/declarative/qml-extending-types/properties/property-signals.qml 0
+
+
+\section2 Default properties
The optional \c default attribute for a property marks it as the \e {default property}
for a type. This allows other items to specify the default property's value
-as child elements. For example, the \l Item element's default property is its
-\l{Item::children}{children} property. This allows the children of an \l Item
+as child elements. For example, the \l Item element's default property is its
+\l{Item::children}{children} property. This allows the children of an \l Item
to be set like this:
\qml
@@ -785,7 +819,7 @@ Item {
}
\endqml
-If the \l{Item::children}{children} property was not the default property for
+If the \l{Item::children}{children} property was not the default property for
\l Item, its value would have to be set like this instead:
\qml
@@ -802,21 +836,20 @@ demonstration of using default properties.
Specifying a default property overrides any existing default property (for
example, any default property inherited from a parent item). Using the
-default attribute twice in the same type block is an error.
+\c default attribute twice in the same type block is an error.
-\target qml-property-aliases
\section2 Property aliases
Property aliases are a more advanced form of property declaration. Unlike a
-property definition, that allocates a new, unique storage space for the
+property definition, which allocates a new, unique storage space for the
property, a property alias connects the newly declared property (called the
-aliasing property) to an existing property (the aliased property). Read
+aliasing property) as a direct reference to an existing property (the aliased property). Read
operations on the aliasing property act as read operations on the aliased
property, and write operations on the aliasing property as write operations on
the aliased property.
-A property alias declaration looks a lot like a property definition:
+A property alias declaration looks a lot like an ordinary property definition:
\code
[default] property alias <name>: <alias reference>
\endcode
@@ -827,7 +860,7 @@ value, a property alias includes a compulsory alias reference. The alias
reference is used to locate the aliased property. While similar to a property
binding, the alias reference syntax is highly restricted.
-An alias reference takes one of the following forms
+An alias reference takes one of the following forms:
\code
<id>.<property>
<id>
@@ -836,61 +869,58 @@ An alias reference takes one of the following forms
where <id> must refer to an object id within the same component as the type
declaring the alias, and, optionally, <property> refers to a property on that object.
-Here is the property definition example rewritten to use property aliases.
-\code
-Rectangle {
- property alias innerColor: innerRect.color
-
- color: "red"; width: 100; height: 100
- Rectangle {
- id: innerRect
- anchors.centerIn: parent
- width: parent.width - 10
- height: parent.height - 10
- color: "black"
- }
-}
-\endcode
+For example, below is a \c Button.qml component with a \c buttonText aliased property which is
+connected to the child Text object's \c text property:
+
+\snippet doc/src/snippets/declarative/qml-extending-types/properties/alias.qml 0
+
+The following code would create a \c Button with a defined text string for the
+child \l Text object:
+
+\qml
+Button { buttonText: "This is a button" }
+\endqml
+
+Here, modifying \c buttonText directly modifies the \c textItem.text value; it does not
+change some other value that then updates \c textItem.text.
+
+In this case, the use of aliased properties is essential. If \c buttonText was not an alias,
+changing its value would not actually change the displayed text at all, as
+\l {Property Binding}{property bindings} are not bi-directional: the \c buttonText value would
+change when \c textItem.text changes, but not the other way around.
-Aliases are most useful when \l {Defining new Components}. Consequently
-they have several apparent limitations that only make sense in this context.
+Aliased properties are also useful for allowing external objects to directly modify and
+access child objects in a component. For example, here is a modified version of the \c ImageViewer
+component shown \l {Adding Properties}{earlier} on this page. The \c currentImage property has
+been changed to an alias to the child \l Image object:
+
+\table
+\row
+\o \snippet doc/src/snippets/declarative/qml-extending-types/properties/alias/ImageViewer.qml 0
+\o \snippet doc/src/snippets/declarative/qml-extending-types/properties/alias/application.qml 0
+\endtable
+
+Instead of being limited to setting the \l Image source, \c application.qml can now directly
+access and modify the child \l Image object and its properties.
+
+Obviously, exposing child objects in this manner should be done with care, as it allows external
+objects to modify them freely. However, this use of aliased properties can be quite useful in
+particular situations, such as for the \l {declarative/ui-components/tabwidget}{TabWidget}
+example, where new tab items are actually parented to a child object that displays the current tab.
+
+
+\section3 Considerations for property aliases
Aliases are only activated once the component specifying them is completed. The
most obvious consequence of this is that the component itself cannot generally
-use the aliased property directly. For example, this will not work:
+use the aliased property directly during creation. For example, this will not work:
\code
// Does NOT work
- property alias innerColor: innerRect.color
- innerColor: "black"
+ property alias buttonText: textItem.text
+ buttonText: "Some text" // buttonText is not yet defined when this value is set
\endcode
-This behavior is required to allow type developers to redefine the behavior
-of existing property names while continuing to use the existing behavior within
-the type they are building, something that is not possible with property
-definitions. In the example used so far, this could allows the developer to fix
-the external rectangle's color as "red" and redefine the "color" property to
-refer to the inner rectangle, like this:
-
-\code
-Rectangle {
- property alias color: innerRect.color
-
- color: "red"; width: 100; height: 100
- Rectangle {
- id: innerRect
- anchors.centerIn: parent
- width: parent.width - 10
- height: parent.height - 10
- color: "black"
- }
-}
-\endcode
-
-Users of this type would not be able to affect the color of the red rectangle,
-but would find using the "color" property, rather than the strange new
-"innerColor" property, much more familiar.
-
A second, much less significant, consequence of the delayed activation of
aliases is that an alias reference cannot refer to another aliasing property
declared within the same component. This will not work:
@@ -898,198 +928,177 @@ declared within the same component. This will not work:
\code
// Does NOT work
id: root
- property alias innerColor: innerRect.color
- property alias innerColor2: root.innerColor
+ property alias buttonText: textItem.text
+ property alias buttonText2: root.buttonText
\endcode
-From outside the component, aliasing properties appear as regular Qt properties
-and consequently can be used in alias references.
+At the time the component is created, the \c buttonText value has not yet been assigned,
+so \c root.buttonText would refer to an undefined value. (From outside the component,
+however, aliasing properties appear as regular Qt properties and consequently can be
+used in alias references.)
-\section1 Adding new signals
+It is possible for an aliased property to have the same name as an existing property. For example,
+the following component has a \c color alias property, named the same as the built-in
+\l {Rectangle::color} property:
-New signals can be added to an existing type. These new signals are available
-for use within QML, and also appear as regular Qt signals on the C++ object that
-can be used in Qt signal/slot connections.
+\snippet doc/src/snippets/declarative/qml-extending-types/properties/alias-override.qml 0
+
+Any objects that use this component and refer to its \c color property will be
+referring to the alias rather than the ordinary \l {Rectangle::color} property. Internally,
+however, the rectangle can correctly set this property to "red" and refer to the actual defined
+property rather than the alias.
+
+
+\section1 Adding Methods
+
+A QML component can define methods of JavaScript code. These methods can be invoked
+either internally or by other objects.
+
+The syntax for defining a method is:
-The syntax for defining a new signal is:
\code
-signal <name>[([<type> <parameter name>[, ...]])]
+function <name>([<parameter name>[, ...]]) { <body> }
\endcode
This declaration may appear anywhere within a type body, but it is customary to
-include it at the top. Attempting to declare two signals or methods with the
-same name in the same type block is an error. However, a new signal may reuse
-the name of an existing signal on the type. This should be done with caution,
-as the existing signal may be hidden and become inaccessible.
+include it at the top. Attempting to declare two methods or signals with the
+same name in the same type block is an error. However, a new method may reuse
+the name of an existing method on the type. (This should be done with caution,
+as the existing method may be hidden and become inaccessible.)
-The options for parameter types are the same as for property types (see
-\l {Adding new properties}. If this signal has no parameters, the parameter
-list may be omitted entirely.
+Unlike \l{Adding Signals}{signals}, method parameter types do not have to be declared as they
+default to the \c variant type. The body of the method is written in JavaScript and may access
+the parameters by name.
-Here are three examples of signal declarations:
-\code
- Item {
- signal clicked
- signal hovered()
- signal performAction(string action, variant actionArgument)
- }
-\endcode
+Here is an example of a component with a \c say() method that accepts a single \c text argument:
-Adding a signal to an item automatically adds a signal handler to it.
-The signal hander is named on<Signal name>, with the first letter of the
-signal name being upper cased. The above example item would now have the
-following signal handlers:
+\snippet doc/src/snippets/declarative/qml-extending-types/methods/app.qml 0
+
+A method can be connected to a signal so that it is automatically invoked whenever the signal
+is emitted. See \l {Connecting signals to methods and other signals} below.
+
+Also see \l {Integrating JavaScript} for more information on using JavaScript with QML.
-\list
- \o onClicked
- \o onHovered
- \o onPerformAction
-\endlist
-\section1 Adding new methods
+\section1 Adding Signals
-New methods can be added to an existing type. These new methods are available
-for use within QML, and also appear as regular Qt slots on the C++ object that
-can be used in Qt signal/slot connections.
+Signals provide a way to notify other objects when an event has occurred. For example, the MouseArea
+\c clicked signal notifies other objects that the mouse has been clicked within the area.
+
+The syntax for defining a new signal is:
\code
-function <name>([<parameter name>[, ...]]) { <body> }
+signal <name>[([<type> <parameter name>[, ...]])]
\endcode
This declaration may appear anywhere within a type body, but it is customary to
-include it at the top. Attempting to declare two methods or signals with the
-same name in the same type block is an error. However, a new method may reuse
-the name of an existing method on the type. This should be done with caution,
-as the existing method may be hidden and become inaccessible.
+include it at the top. Attempting to declare two signals or methods with the
+same name in the same type block is an error. However, a new signal may reuse
+the name of an existing signal on the type. (This should be done with caution,
+as the existing signal may be hidden and become inaccessible.)
-Methods parameters are not typed. In C++ these parameters are of type QVariant.
-The body of the method is written in JavaScript and may access the parameters by
-name.
+Here are three examples of signal declarations:
-This example adds a new method that behaves like a child:
\code
Item {
- function say(text) {
- console.log("You said " + text);
- }
+ signal clicked
+ signal hovered()
+ signal performAction(string action, variant actionArgument)
}
\endcode
-This may be connected to via QObject::connect() or called directly from C++ using
-QMetaObject::invokeMethod():
-
-\code
- QDeclarativeEngine engine;
- QDeclarativeContext *context = new QDeclarativeContext(engine.rootContext());
- QDeclarativeComponent component(&engine, QUrl::fromLocalFile("main.qml"));
- QObject *object = component.create(context);
- QVariant str("Hello");
- QMetaObject::invokeMethod(object, "say", Q_ARG(QVariant, str));
-\endcode
-
-Return values of type QVariant are also supported via Q_RETURN_ARG.
+If the signal has no parameters, the "()" brackets are optional. If parameters are used, the
+parameter types must be declared, as for the \c string and \c variant arguments for the \c
+performAction signal above; the allowed parameter types are the same as those listed in the \l
+{Adding Properties} section on this page.
-\section1 Defining new Components
-\target components
+Adding a signal to an item automatically adds a \l {Signal Handlers}{signal handler} as well.
+The signal hander is named \c on<SignalName>, with the first letter of the signal being upper
+cased. The above example item would now have the following signal handlers:
-A component is a reusable type with a well-defined interface built entirely in
-QML. Components appear as regular QML elements, and can be used interchangeably
-with core types. Components allow developers to create new types to be reused
-in other projects without the use of C++. Components can also help to reduce
-duplication inside one project by limiting the need for large numbers of
-copy-and-pasted blocks.
+\list
+\o onClicked
+\o onHovered
+\o onPerformAction
+\endlist
-Any snippet of QML code can become a component, just by placing it in the file "<Name>.qml"
-where <Name> is the new element name, and begins with an uppercase letter. Note that
-the case of all characters in the <Name> are significant on some filesystems, notably
-UNIX filesystems. It is recommended that the case of the filename matches the case of
-the component name in QML exactly, regardless of the platform the QML will be deployed to.
+To emit a signal, simply invoke it in the same way as a method. Below left, when the \l MouseArea is
+clicked, it emits the parent \c buttonClicked signal by invoking \c rect.buttonClicked(). The
+signal is received by \c application.qml through an \c onButtonClicked signal handler:
-These QML files automatically become available as new QML element types
-to other QML components and applications in the same directory.
+\table
+\row
+\o \snippet doc/src/snippets/declarative/qml-extending-types/signals/basic.qml 0
+\o \snippet doc/src/snippets/declarative/qml-extending-types/signals/no-parameters.qml 0
+\endtable
-For example, here we show how a component named "Box" is defined and used
-multiple times by an application.
+If the signal has parameters, they are accessible by parameter name in the signal handler.
+In the example below, \c buttonClicked is emitted with \c xPos and \c yPos parameters instead:
\table
\row
-\o application.qml
-\code
-Rectangle {
- width: 100; height: 400;
- Box { x: 0; y: 0 }
- Box { x: 0; y: 150 }
- Box { x: 0; y: 300 }
-}
-\endcode
-\o Box.qml
-\code
-Rectangle {
- width: 100; height: 100;
- color: "blue"
-}
-\endcode
+\o \snippet doc/src/snippets/declarative/qml-extending-types/signals/Button.qml 0
+\o \snippet doc/src/snippets/declarative/qml-extending-types/signals/parameters.qml 0
\endtable
-Components may be collected into \l {Modules} that gives the
-developer more freedom than just putting files in the same directory.
-\section2 Building reusable components
+\section2 Connecting signals to methods and other signals
-A component type built to be reused by others must have a well defined
-interface. In QML, an interface consists of a defined collection of
-properties, signals and methods. Users of a component have access to all the
-properties, signals and methods defined on the root element of the component.
+Signal objects have a \c connect() method that can be used to a connect a signal to a method or
+another signal. When a signal is connected to a method, the method is automatically invoked
+whenever the signal is emitted. (In Qt terminology, the method is a \e slot that is connected
+to the \e signal; all methods defined in QML are created as Qt slots.) This enables a signal
+to be received by a method instead of a \l {Signal Handlers}{signal handler}.
-In the component example above, the root element of the "Box" component is a
-Rect. As the Rect type has a "color" property, this property is accessible to
-users of the Box component. For example, the application.qml can be modified
-to show three different colored boxes like this:
-\code
-Rectangle {
- width: 100; height: 400;
- Box { x: 0; y: 0; color: "red"; }
- Box { x: 0; y: 150; color: "yellow"; }
- Box { x: 0; y: 300; color: "green"; }
-}
-\endcode
+For example, the \c application.qml above could be rewritten as:
-As expected, adding additional properties to the root element of Box, makes them
-available externally. Here we add a "text" property:
+\snippet doc/src/snippets/declarative/qml-extending-types/signals/connectslots.qml 0
-\table
-\row
-\o application.qml
-\code
-Rectangle {
- width: 100; height: 400;
- Box { x: 0; y: 0; color: "red"; text: "stop" }
- Box { x: 0; y: 150; color: "yellow"; text: "slow" }
- Box { x: 0; y: 300; color: "green"; text: "go" }
-}
-\endcode
-\o Box.qml
-\code
-Rectangle {
- property alias text: myText.text
- width: 100; height: 100;
- color: "blue"
- Text {
- id: myText
- anchors.centerIn: parent
+The \c myMethod() method will be called whenever the \c buttonClicked signal is received.
+
+In many cases it is sufficient to receive signals through signal handlers rather than using
+the \c connect() function; the above example does not provide any improvements over using a
+simple \c onButtonClicked handler. However, if you are \l{Dynamic Object Management in QML}{creating objects dynamically},
+or \l {Integrating JavaScript}{integrating JavaScript code}, then you will find the
+\c connect() method useful. For example, the component below creates three \c Button
+objects dynamically, and connects the \c buttonClicked signal of each object to the
+\c myMethod() function:
+
+\snippet doc/src/snippets/declarative/qml-extending-types/signals/connectdynamic.qml 0
+
+In the same way, you could connect a signal to methods defined in a dynamically
+created object, or \l {Receiving QML Signals in JavaScript}{connect a signal to a JavaScript method}.
+
+There is also a corresponding \c disconnect() method for removing connected signals. The following
+code removes the connection created in \c application.qml above:
+
+\qml
+// application.qml
+Item {
+ ...
+
+ function removeSignal() {
+ button.clicked.disconnect(item.myMethod)
}
}
-\endcode
-\endtable
+\endqml
+
+
+\section3 Forwarding signals
+
+The \c connect() method can also connect a signal to other signals. This has the effect
+of "forwarding" a signal: it is automatically emitted whenever the relevant signal is emitted. For
+example, the MouseArea \c onClicked handler in \c Button.qml above could have been replaced with
+a call to \c connect():
+
+\qml
+MouseArea {
+ anchors.fill: parent
+ Component.onCompleted: clicked.connect(item.buttonClicked)
+}
+\endqml
-Methods and signals may be added in the same way.
+Whenever the \l MouseArea \c clicked signal is emitted, the \c rect.buttonClicked signal will
+automatically be emitted as well.
-As all external methods, signals and properties are accessible to external
-users, developers should ensure that setting these properties does not have
-any undesirable side-effects. For most resilience, root level properties should
-only be used for literal default values. When a root level property must be
-used inside the component - such as the children property - property aliases
-can be used to redirect this property to a "safe" location for external users.
-Try to think of the root level properties as being "owned" by the components
-user, rather than the component itself.
*/
diff --git a/doc/src/declarative/focus.qdoc b/doc/src/declarative/focus.qdoc
index 2e74fe0..ae72c3c 100644
--- a/doc/src/declarative/focus.qdoc
+++ b/doc/src/declarative/focus.qdoc
@@ -31,7 +31,7 @@
\title Keyboard Focus in QML
When a key is pressed or released, a key event is generated and delivered to the
-focused QML \l Item. To facilitate the construction of reusable components
+focused QML \l Item. To facilitate the construction of reusable components
and to address some of the cases unique to fluid user interfaces, the QML items add a
\e scope based extension to Qt's traditional keyboard focus model.
@@ -42,27 +42,21 @@ and to address some of the cases unique to fluid user interfaces, the QML items
When the user presses or releases a key, the following occurs:
\list 1
\o Qt receives the key action and generates a key event.
-\o If the Qt widget containing the \l QDeclarativeView has focus, the key event is delivered to it. Otherwise, regular Qt key handling continues.
-\o The key event is delivered by the scene to the QML \l Item with \e {active focus}. If no \l Item has \e {active focus}, the key event is \l {QEvent::ignore()}{ignored} and regular Qt key handling continues.
-\o If the QML \l Item with \e {active focus} accepts the key event, propagation stops. Otherwise the event is "bubbled up", by recursively passing it to each \l Item's parent until either the event is accepted, or the root \l Item is reached.
-
-If the \c {Rectangle} element in the following example has active focus and the \e A key is pressed,
-it will bubble up to its parent. However, pressing the \e B key will bubble up to the root
-item and thus subsequently be \l {QEvent::ignore()}{ignored}.
-
-\code
-Item {
- Item {
- Keys.onPressed: {
- if (event.key == Qt.Key_A) {
- console.log('Key A was pressed');
- event.accepted = true;
- }
- }
- Rectangle {}
- }
-}
-\endcode
+\o If the Qt widget containing the \l QDeclarativeView has focus, the key event
+is delivered to it. Otherwise, regular Qt key handling continues.
+\o The key event is delivered by the scene to the QML \l Item with
+\e {active focus}. If no Item has active focus, the key event is
+\l {QEvent::ignore()}{ignored} and regular Qt key handling continues.
+\o If the QML Item with active focus accepts the key event, propagation
+stops. Otherwise the event is "bubbled up", by recursively passing it to each
+Item's parent until either the event is accepted, or the root Item is reached.
+
+If the \c {Rectangle} element in the following example has active focus and the \c A key is pressed,
+it will bubble up to its parent. However, pressing the \c B key will bubble up to the root
+item and thus subsequently be ignored.
+
+\snippet doc/src/snippets/declarative/focus/rectangle.qml simple key event
+\snippet doc/src/snippets/declarative/focus/rectangle.qml simple key event end
\o If the root \l Item is reached, the key event is \l {QEvent::ignore()}{ignored} and regular Qt key handling continues.
@@ -72,232 +66,139 @@ See also the \l {Keys}{Keys attached property} and \l {KeyNavigation}{KeyNavigat
\section1 Querying the Active Focus Item
-Whether or not an \l Item has \e {active focus} can be queried through the
-property \c {Item::activeFocus}. For example, here we have a \l Text
-element whose text is determined by whether or not it has \e {active focus}.
+Whether or not an \l Item has active focus can be queried through the
+property \c {Item::activeFocus} property. For example, here we have a \l Text
+element whose text is determined by whether or not it has active focus.
-\code
-Text {
- text: activeFocus ? "I have active focus!" : "I do not have active focus"
-}
-\endcode
+\snippet doc/src/snippets/declarative/focus/rectangle.qml active focus
\section1 Acquiring Focus and Focus Scopes
-An \l Item requests focus by setting the \c {Item::focus} property to true.
-
-For very simple cases simply setting the \c {Item::focus} property is sometimes
-sufficient. If we run the following example with the \l {QML Viewer}, we see that
-the \c {keyHandler} element has \e {active focus} and pressing the 'A', 'B'
-or 'C' keys modifies the text appropriately.
-
-\table
-\row
-\o \code
- Rectangle {
- color: "lightsteelblue"; width: 240; height: 25
- Text { id: myText }
- Item {
- id: keyHandler
- focus: true
- Keys.onPressed: {
- if (event.key == Qt.Key_A)
- myText.text = 'Key A was pressed'
- else if (event.key == Qt.Key_B)
- myText.text = 'Key B was pressed'
- else if (event.key == Qt.Key_C)
- myText.text = 'Key C was pressed'
- }
- }
- }
-\endcode
-\o \image declarative-qmlfocus1.png
-\endtable
-
-However, were the above example to be used as a self-contained component, this
-simple use of the \c {Item::focus} property is no longer sufficient. The left
-hand side of the following table shows what we would like to be able to write.
-Here we create two instances of our previously defined component, and set the
-second one to have focus. The intention is that when the \e A, \e B, or \e C
-keys are pressed, the second of the two components receives the event and
+An \l Item requests focus by setting the \c focus property to \c true.
+
+For very simple cases simply setting the \c focus property is sometimes
+sufficient. If we run the following example with the \l {QML Viewer}, we see that
+the \c {keyHandler} element has active focus and pressing the \c A, \c B,
+or \c C keys modifies the text appropriately.
+
+\snippet doc/src/snippets/declarative/focus/basicwidget.qml focus true
+
+\image declarative-qmlfocus1.png
+
+However, were the above example to be used as a reusable or imported component,
+this simple use of the \c focus property is no longer sufficient.
+
+To demonstrate, we create two instances of our previously defined component and
+set the first one to have focus. The intention is that when the \c A, \c B, or
+\c C keys are pressed, the first of the two components receives the event and
responds accordingly.
-\table
-\row
-\o \code
-Rectangle {
- color: "red"; width: 240; height: 55
- MyWidget {}
- MyWidget { y: 30; focus: true }
-}
-\endcode
-\o \code
-Rectangle {
- color: "red"; width: 240; height: 55
- Rectangle {
- color: "lightsteelblue"; width: 240; height: 25
- Text { id: myText }
- Item {
- id: keyHandler
- focus: true
- Keys.onPressed: {
- if (event.key == Qt.Key_A)
- myText.text = 'Key A was pressed'
- else if (event.key == Qt.Key_B)
- myText.text = 'Key B was pressed'
- else if (event.key == Qt.Key_C)
- myText.text = 'Key C was pressed'
- }
- }
- }
- Rectangle {
- y: 30; focus: true
- color: "lightsteelblue"; width: 240; height: 25
- Text { id: myText }
- Item {
- id: keyHandler
- focus: true
- Keys.onPressed: {
- if (event.key == Qt.Key_A)
- myText.text = 'Key A was pressed'
- else if (event.key == Qt.Key_B)
- myText.text = 'Key B was pressed'
- else if (event.key == Qt.Key_C)
- myText.text = 'Key C was pressed'
- }
- }
- }
-}
-\endcode
-\endtable
-
-The right hand side of the example shows the expanded code - the equivalent QML
-without the use of the component \c {MyWidget}. From this, the problem is
-evident - there are no less than three elements that have the \c {Item::focus}
-property set to true. Ultimately only one element can have keyboard focus, and the
-system has to decide which on. In this case the first appearance of the
-\c {Item::focus} property being set to true on line 4 is selected, and the value
-of \c {Item::focus} in the other two instances is reverted back to false. This
-is exactly the opposite of what was wanted!
-
-This problem is fundamentally one of visibility. The \c {MyWidget}
-components each set their \c {keyHandler} Items as focused as that is all they can
-do - they don't know how they are going to be used, but they do know that when
-they're in use their \c {keyHandler} element is what needs focus. Likewise
-the code that uses the two \c {MyWidgets} sets the second \c {MyWidget} as
-focused. While it doesn't know exactly how the \c {MyWidget} is
-implemented, it knows that it wants the second one to be focused. This allows us
-to achieve encapsulation, allowing each widget to focus on it's appropriate behaviour
-itself.
-
-To solve this problem - allowing components to care about what they know about
-and ignore everything else - the QML items introduce a concept known as a
-\e {focus scope}. For existing Qt users, a \e {focus scope} is like an
-automatic focus proxy. A \e {focus scope} is created using the \l FocusScope
-element.
-
-In the next example, a \l FocusScope is added to the component, and the visual
-result shown.
-
-\table
-\row
-\o \code
-FocusScope {
- width: 240; height: 25
- Rectangle {
- color: "lightsteelblue"; width: 240; height: 25
- Text { id: myText }
- Item {
- id: keyHandler
- focus: true
- Keys.onPressed: {
- if (event.key == Qt.Key_A)
- myText.text = 'Key A was pressed'
- else if (event.key == Qt.Key_B)
- myText.text = 'Key B was pressed'
- else if (event.key == Qt.Key_C)
- myText.text = 'Key C was pressed'
- }
- }
- }
-}
-\endcode
-\o \image declarative-qmlfocus2.png
-\endtable
+The code that imports and creates two MyWidget instances:
+\snippet doc/src/snippets/declarative/focus/widget.qml window
+
+The MyWidget code:
+\snippet doc/src/snippets/declarative/focus/mywidget.qml mywidget
+
+We would like to have the first MyWidget object to have the focus by setting its
+\c focus property to \c true. However, by running the code, we can confirm that
+the second widget receives the focus.
+
+\image declarative-qmlfocus2.png
+
+Looking at both \c MyWidget and \c window code, the problem is evident - there
+are three elements that set the \c focus property set to \c true. The two
+MyWidget sets the \c focus to \c true and the \c window component also sets the
+focus. Ultimately, only one element can have keyboard focus, and the system has
+to decide which element receives the focus. When the second MyWidget is created,
+it receives the focus because it is the last element to set its \c focus
+property to \c true.
+
+This problem is due to visibility. The \c MyWidget component would like to have
+the focus, but it cannot control the focus when it is imported or reused.
+Likewise, the \c window component does not have the ability to know if its
+imported components are requesting the focus.
+
+To solve this problem, the QML introduces a concept known as a \e {focus scope}.
+For existing Qt users, a focus scope is like an automatic focus proxy.
+A focus scope is created by declaring the \l FocusScope element.
+
+In the next example, a \l FocusScope element is added to the component, and the
+visual result shown.
+
+\snippet doc/src/snippets/declarative/focus/myfocusscopewidget.qml widget in focusscope
+
+\image declarative-qmlfocus3.png
+
Conceptually \e {focus scopes} are quite simple.
\list
-\o Within each \e {focus scope} one element may have \c {Item::focus} set to true.
-If more than one \l Item has the \c {Item::focus} property set, the first is selected
-and the others are unset, just like when there are no \e {focus scopes}.
-\o When a \e {focus scope} receives \e {active focus}, the contained element with
-\c {Item::focus} set (if any) also gets \e {active focus}. If this element is
-also a \l FocusScope, the proxying behaviour continues. Both the
-\e {focus scope} and the sub-focused item will have \c {Item::activeFocus} set.
+\o Within each focus scope one element may have \c {Item::focus} set to
+\c true. If more than one \l Item has the \c focus property set, the
+last element to set the \c focus will have the focus and the others are unset,
+similar to when there are no focus scopes.
+\o When a focus scope receives active focus, the contained element with
+\c focus set (if any) also gets the active focus. If this element is
+also a \l FocusScope, the proxying behavior continues. Both the
+focus scope and the sub-focused item will have \c activeFocus property set.
\endlist
-So far the example has the second component statically selected. It is trivial
+Note that, since the FocusScope element is not a visual element, the properties
+of its children need to be exposed to the parent item of the FocusScope. Layouts
+and positioning elements will use these visual and styling properties to create
+the layout. In our example, the \c Column element cannot display the two widgets
+properly because the FocusScope lacks visual properties of its own. The MyWidget
+component directly binds to the \c rectangle properties to allow the \c Column
+element to create the layout containing the children of the FocusScope.
+
+So far, the example has the second component statically selected. It is trivial
now to extend this component to make it clickable, and add it to the original
-application. We still set a one of the widgets as focused by default, but from
-then on clicking the either one gives it focus.
-
-\table
-\row
-\o \code
-Rectangle {
- color: "red"; width: 240; height: 55
- MyClickableWidget {}
- MyClickableWidget { y: 30; focus: true }
-}
-\endcode
-\o \code
-FocusScope {
- id: page; width: 240; height: 25
- MyWidget { focus: true }
- MouseArea { anchors.fill: parent; onClicked: { page.focus = true } }
-}
-\endcode
-\endtable
+application. We still set one of the widgets as focused by default.
+Now, clicking either MyClickableWidget gives it focus and the other widget
+loses the focus.
-\image declarative-qmlfocus3.png
+The code that imports and creates two MyClickableWidget instances:
+\snippet doc/src/snippets/declarative/focus/clickablewidget.qml clickable window
+
+The MyClickableWidget code:
+\snippet doc/src/snippets/declarative/focus/myclickablewidget.qml clickable in focusscope
-When a QML item explicitly relinquishes focus (by setting its
-\c {Item::focus} property to false while it has \e {active focus}), the system
-does not automatically select another element to receive focus. That is, it
-is possible for there to be no currently \e {active focus}.
+\image declarative-qmlfocus4.png
-See the \l{declarative/keyinteraction/focus}{Keyboard Focus example} for a
+When a QML \l Item explicitly relinquishes focus (by setting its
+\c focus property to \c false while it has active focus), the
+system does not automatically select another element to receive focus. That is,
+it is possible for there to be no currently active focus.
+
+See the \l{declarative/keyinteraction/focus}{Keyboard Focus example} for a
demonstration of moving keyboard focus between multiple areas using FocusScope
elements.
\section1 Advanced uses of Focus Scopes
-Focus scopes allow focus to allocation to be easily partitioned. Several
+Focus scopes allow focus to allocation to be easily partitioned. Several
QML items use it to this effect.
-\l ListView, for example, is itself a focus scope. Generally this isn't
+\l ListView, for example, is itself a focus scope. Generally this isn't
noticeable as \l ListView doesn't usually have manually added visual children.
By being a focus scope, \l ListView can focus the current list item without
-worrying about how that will effect the rest of the application. This allows
-the current item delegate to react to key presses.
+worrying about how that will effect the rest of the application. This allows the
+current item delegate to react to key presses.
-This contrived example shows how this works. Pressing the \c Return key will
+This contrived example shows how this works. Pressing the \c Return key will
print the name of the current list item.
-\table
-\row
-\o \snippet doc/src/snippets/declarative/focusscopes.qml 0
-\o \image declarative-qmlfocus4.png
-\endtable
+\snippet doc/src/snippets/declarative/focus/advancedFocus.qml FocusScope delegate
+
+\image declarative-qmlfocus5.png
-While the example is simple, there's a lot going on behind the scenes. Whenever
+While the example is simple, there are a lot going on behind the scenes. Whenever
the current item changes, the \l ListView sets the delegate's \c {Item::focus}
-property. As the \l ListView is a \e {focus scope}, this doesn't effect the
-rest of the application. However, if the \l ListView itself has
-\e {active focus} this causes the delegate itself to receive \e {active focus}.
-In this example, the root element of the delegate is also a \e {focus scope},
-which in turn gives \e {active focus} to the \c {Text} element that
-actually performs the work of handling the \e {Return} key.
+property. As the \l ListView is a focus scope, this doesn't affect the
+rest of the application. However, if the \l ListView itself has
+active focus this causes the delegate itself to receive active focus.
+In this example, the root element of the delegate is also a focus scope,
+which in turn gives active focus to the \c {Text} element that actually performs
+the work of handling the \c {Return} key.
All of the QML view classes, such as \l PathView and \l GridView, behave
in a similar manner to allow key handling in their respective delegates.
diff --git a/doc/src/declarative/javascriptblocks.qdoc b/doc/src/declarative/javascriptblocks.qdoc
index b6fad5b..68cb392 100644
--- a/doc/src/declarative/javascriptblocks.qdoc
+++ b/doc/src/declarative/javascriptblocks.qdoc
@@ -94,13 +94,14 @@ Both relative and absolute JavaScript URLs can be imported. In the case of a
relative URL, the location is resolved relative to the location of the
\l {QML Document} that contains the import. If the script file is not accessible,
an error will occur. If the JavaScript needs to be fetched from a network
-resource, the QML document has a "Loading"
-\l {QDeclarativeComponent::status()}{status} until the script has been
-downloaded.
+resource, the component's \l {QDeclarativeComponent::status()}{status} is set to
+"Loading" until the script has been downloaded.
Imported JavaScript files are always qualified using the "as" keyword. The
qualifier for JavaScript files must be unique, so there is always a one-to-one
-mapping between qualifiers and JavaScript files.
+mapping between qualifiers and JavaScript files. (This also means qualifiers cannot
+be named the same as built-in JavaScript objects such as \c Date and \c Math).
+
\section2 Code-Behind Implementation Files
@@ -143,6 +144,31 @@ As they are shared, stateless library files cannot access QML component instance
objects or properties directly, although QML values can be passed as function
parameters.
+
+\section2 Importing One JavaScript File From Another
+
+If a JavaScript file needs to use functions defined inside another JavaScript file,
+the other file can be imported using the \l {QML:Qt::include()}{Qt.include()}
+function. This imports all functions from the other file into the current file's
+namespace.
+
+For example, the QML code below left calls \c showCalculations() in \c script.js,
+which in turn can call \c factorial() in \c factorial.js, as it has included
+\c factorial.js using \l {QML:Qt::include()}{Qt.include()}.
+
+\table
+\row
+\o {1,2} \snippet doc/src/snippets/declarative/integrating-javascript/includejs/app.qml 0
+\o \snippet doc/src/snippets/declarative/integrating-javascript/includejs/script.js 0
+\row
+\o \snippet doc/src/snippets/declarative/integrating-javascript/includejs/factorial.js 0
+\endtable
+
+Notice that calling \l {QML:Qt::include()}{Qt.include()} imports all functions from
+\c factorial.js into the \c MyScript namespace, which means the QML component can also
+access \c factorial() directly as \c MyScript.factorial().
+
+
\section1 Running JavaScript at Startup
It is occasionally necessary to run some imperative code at application (or
@@ -207,6 +233,25 @@ changes.
See \l {Property Binding} for more information.
+\section1 Receiving QML Signals in JavaScript
+
+To receive a QML signal, use the signal's \c connect() method to connect it to a JavaScript
+function.
+
+For example, the following code connects the MouseArea \c clicked signal to the \c jsFunction()
+in \c script.js:
+
+\table
+\row
+\o \snippet doc/src/snippets/declarative/integrating-javascript/connectjs.qml 0
+\o \snippet doc/src/snippets/declarative/integrating-javascript/script.js 0
+\endtable
+
+The \c jsFunction() will now be called whenever MouseArea's \c clicked signal is emitted.
+
+See \l {Connecting signals to methods and other signals} for more information.
+
+
\section1 QML JavaScript Restrictions
QML executes standard JavaScript code, with the following restrictions:
diff --git a/doc/src/declarative/modules.qdoc b/doc/src/declarative/modules.qdoc
index 011eb63..8d23170 100644
--- a/doc/src/declarative/modules.qdoc
+++ b/doc/src/declarative/modules.qdoc
@@ -31,14 +31,14 @@
\section1 QML Modules
-A module is a set of QML content files that can be imported as a unit into a QML
+A module is a set of QML content files that can be imported as a unit into a QML
application. Modules can be used to organize QML content into independent units,
-and they can use a versioning mechanism that allows for independent
+and they can use a versioning mechanism that allows for independent
upgradability of the modules.
While QML component files within the same directory are automatically accessible
-within the global namespace, components defined elsewhere must be imported
-explicitly using the \c import statement to import them as modules. For
+within the global namespace, components defined elsewhere must be imported
+explicitly using the \c import statement to import them as modules. For
example, an \c import statement is required to use:
\list
@@ -54,13 +54,13 @@ This can be seen in the snippet commonly found at the top of QML files:
\qml
import QtQuick 1.0
\endqml
-
-This imports version 4.7 of the "Qt" module into the global namespace. (The QML
+
+This imports version 1.0 of the "QtQuick" module into the global namespace. (The QML
library itself must be imported to use any of the \l {QML Elements}, as they
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:
+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).
@@ -87,8 +87,8 @@ directory using a relative or absolute path, like this:
MyQMLProject
|- MyComponents
|- Slider.qml
- |- CheckBox.qml
- |- Main
+ |- CheckBox.qml
+ |- Main
|- application.qml
\endcode
@@ -112,7 +112,7 @@ be imported like this:
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
+\l {#qmldirexample}{example} below. The qmldir file is optional for modules on
the local filesystem.
@@ -121,8 +121,8 @@ the local filesystem.
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
+local filesystem within the QML import path, or modules defined in C++
+application code. When importing an installed module, an un-quoted URI is
used, with a mandatory version number:
\code
@@ -131,7 +131,7 @@ used, with a mandatory version number:
\endcode
Installed modules that are installed into the import path or created
-as a \l{QDeclarativeExtensionPlugin}{QML C++ plugin} must define a
+as a \l{QDeclarativeExtensionPlugin}{QML C++ plugin} must define a
\l{Writing a qmldir file}{qmldir file}.
@@ -142,7 +142,7 @@ The default import path includes:
\list
\o The directory of the current file
-\o The location specified by QLibraryInfo::ImportsPath
+\o The location specified by QLibraryInfo::ImportsPath
\o Paths specified by the \c QML_IMPORT_PATH environment variable
\endlist
@@ -153,10 +153,10 @@ When running the \l {QML Viewer}, use the \c -I option to add paths to the impor
\section2 Creating installed modules in C++
-C++ applications can dynamically define installed modules using
-qmlRegisterType().
+C++ applications can dynamically define installed modules using
+qmlRegisterType().
-For \l{QDeclarativeExtensionPlugin}{QML C++ plugins}, the
+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
@@ -167,7 +167,7 @@ in QML, like this:
import com.nokia.TimeExample 1.0
\endcode
-A \l{QDeclarativeExtensionPlugin}{QML C++ plugin} also requires a
+A \l{QDeclarativeExtensionPlugin}{QML C++ plugin} also requires a
\l{Writing a qmldir file}{qmldir file} to make it available to the
QML engine.
@@ -190,9 +190,9 @@ Types from these modules can then only be used when qualified by the namespace:
\qml
QtLibrary.Rectangle { ... }
-
+
MyComponents.Slider { ... }
-
+
MyModule.SomeComponent { ... }
\endqml
@@ -209,19 +209,21 @@ JavaScript files must always be imported with a named import:
\qml
import "somescript.js" as MyScript
-
+
Item {
//...
Component.onCompleted: MyScript.doSomething()
}
\endqml
+The qualifier ("MyScript" in the above example) must be unique within the QML document.
+Unlike ordinary modules, multiple scripts cannot be imported into the same namespace.
\section1 Writing a qmldir file
-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
+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.
It is defined by a plain text file named "qmldir" that contains one or more lines of the form:
@@ -237,7 +239,7 @@ plugin <Name> [<Path>]
\bold {<TypeName> [<InitialVersion>] <File>} lines are used to add QML files as types.
<TypeName> is the type being made available, the optional <InitialVersion> is a version
-number, and <File> is the (relative) file name of the QML file defining the type.
+number, and <File> is the (relative) file name of the QML file defining the type.
Installed files do not need to import the module of which they are a part, as they can refer
to the other QML files in the module as relative (local) files, but
@@ -264,10 +266,10 @@ provide those identifiers.
\bold {plugin <Name> [<Path>]} lines are used to add \l{QDeclarativeExtensionPlugin}{QML C++ plugins} to the module. <Name> is the name of the library. It is usually not the same as the file name
of the plugin binary, which is platform dependent; e.g. the library \c MyAppTypes would produce
-\c libMyAppTypes.so on Linux and \c MyAppTypes.dll on Windows.
+\c libMyAppTypes.so on Linux and \c MyAppTypes.dll on Windows.
<Path> is an optional argument specifying either an absolute path to the directory containing the
-plugin file, or a relative path from the directory containing the \c qmldir file to the directory
+plugin file, or a relative path from the directory containing the \c qmldir file to the directory
containing the plugin file. By default the engine searches for the plugin library in the directory that contains the \c qmldir
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.
@@ -275,7 +277,7 @@ file. The plugin search path can be queried with QDeclarativeEngine::pluginPathL
\target qmldirexample
\section2 Example
-If the components in the \c MyComponents directory from the
+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:
@@ -284,7 +286,7 @@ ComponentA 1.0 ComponentA.qml
ComponentB 1.0 ComponentB.qml
\endcode
-The \c MyComponents directory could then be imported as a module using:
+The \c MyComponents directory could then be imported as a module using:
\code
import "http://the-server-name.com/MyComponents"
@@ -298,15 +300,15 @@ 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
+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
-when there are problems with finding and loading modules. See
+when there are problems with finding and loading modules. See
\l{Debugging module imports} for more information.
diff --git a/doc/src/declarative/pics/qml-extending-types.png b/doc/src/declarative/pics/qml-extending-types.png
new file mode 100644
index 0000000..6990d7c
--- /dev/null
+++ b/doc/src/declarative/pics/qml-extending-types.png
Binary files differ
diff --git a/doc/src/declarative/qdeclarativeintro.qdoc b/doc/src/declarative/qdeclarativeintro.qdoc
index 1d807e3..4e41fda 100644
--- a/doc/src/declarative/qdeclarativeintro.qdoc
+++ b/doc/src/declarative/qdeclarativeintro.qdoc
@@ -186,7 +186,7 @@ Item {
\section3 The \c id property
Each object can be given a special unique property called an \e id. No other object within the
-same \l{QML Documents}{QML document} can have the same \c id value. Assigning an id enables the object
+same QML component (see \l{QML Documents}) can have the same \c id value. Assigning an id enables the object
to be referred to by other objects and scripts.
The first Rectangle element below has an \e id, "myRect". The second Rectangle element defines its
@@ -233,6 +233,10 @@ Image {
}
\endcode
+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
Each object type can specify one of its list or object properties as its default property.
diff --git a/doc/src/declarative/qdeclarativereference.qdoc b/doc/src/declarative/qdeclarativereference.qdoc
deleted file mode 100644
index c2c5e91..0000000
--- a/doc/src/declarative/qdeclarativereference.qdoc
+++ /dev/null
@@ -1,81 +0,0 @@
-/****************************************************************************
-**
-** 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:FDL$
-** 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 Free Documentation License
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of this
-** file.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page qdeclarativereference.html
- \title QML Reference
-
- \target qtdeclarativemainpage
-
- QML is a language for building the animation rich,
- highly fluid user interfaces that are becoming common in portable consumer
- electronics devices such as mobile phones, media players, set-top boxes and
- netbooks. It is also appropriate for highly custom desktop
- user interfaces, or special elements in more traditional desktop user interfaces.
-
- Building fluid applications is done declaratively, rather than procedurally.
- That is, you specify \e what the UI should look like and how it should behave
- rather than specifying step-by-step \e how to build it. Specifying a UI declaratively
- does not just include the layout of the interface items, but also the way each
- individual item looks and behaves and the overall flow of the application.
-
- The QML elements provide a sophisticated set of graphical and behavioral building
- blocks. These different elements are combined together in \l {QML Documents}{QML documents} to build components
- ranging in complexity from simple buttons and sliders, to complete
- internet-enabled applications like a \l {http://www.flickr.com}{Flickr} photo browser.
-
- Getting Started:
- \list
- \o \l {Introduction to the QML language}
- \o \l {QML Tutorial}{Tutorial: 'Hello World'}
- \o \l {QML Advanced Tutorial}{Advanced Tutorial: 'Same Game'}
- \o \l {QML Examples and Demos}
- \endlist
-
- \section1 Core QML Features:
- \list
- \o \l {QML Documents}
- \o \l {Property Binding}
- \o \l {Integrating JavaScript}
- \o \l {QML Scope}
- \o \l {Network Transparency}
- \o \l {qmlmodels}{Data Models}
- \o \l {anchor-layout}{Anchor-based Layout}
- \o \l {qmlstates}{States}
- \o \l {qdeclarativeanimation.html}{Animation}
- \o \l {qdeclarativemodules.html}{Modules}
- \o \l {qmlfocus}{Keyboard Focus}
- \o \l {Extending types from QML}
- \endlist
-
- QML Reference:
- \list
- \o \l {elements}{QML Elements}
- \o \l {QML Global Object}
- \o \l {QML Internationalization}
- \endlist
-*/
diff --git a/doc/src/declarative/qmlinuse.qdoc b/doc/src/declarative/qmlinuse.qdoc
index 90ce02c..1127b4c 100644
--- a/doc/src/declarative/qmlinuse.qdoc
+++ b/doc/src/declarative/qmlinuse.qdoc
@@ -7,11 +7,11 @@
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:FDL$
-** Commercial Usage
-** Licensees holding valid Qt Commercial licenses may use this file 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.
+** 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 Free Documentation License
** Alternatively, this file may be used under the terms of the GNU Free
diff --git a/doc/src/declarative/qtbinding.qdoc b/doc/src/declarative/qtbinding.qdoc
index c3ce6d0..04b8ca6 100644
--- a/doc/src/declarative/qtbinding.qdoc
+++ b/doc/src/declarative/qtbinding.qdoc
@@ -230,7 +230,7 @@ Also see the QDeclarativeContext documentation for more information.
\section2 Defining new QML elements
-While new QML elements can be \l {Defining new Components}{defined in QML}, they can also be
+While new QML elements can be \l {Defining New Components}{defined in QML}, they can also be
defined by C++ classes; in fact, many of the core \l {QML Elements} are implemented through
C++ classes. When you create a QML object using one of these elements, you are simply creating an
instance of a QObject-based C++ class and setting its properties.
@@ -426,6 +426,7 @@ By default, QML recognizes the following data types:
\o QSize, QSizeF
\o QRect, QRectF
\o QVariant
+\o QVariantList, QVariantMap
\o QObject*
\o Enumerations declared with Q_ENUMS()
\endlist
@@ -434,6 +435,37 @@ To allow a custom C++ type to be created or used in QML, the C++ class must be r
type using qmlRegisterType(), as shown in the \l {Defining new QML elements} section above.
+\section2 JavaScript arrays and objects
+
+There is built-in support for automatic type conversion between QVariantList and JavaScript
+arrays, and QVariantMap and JavaScript objects.
+
+For example, the function defined in QML below left expects two arguments, an array and an object, and prints
+their contents using the standard JavaScript syntax for array and object item access. The C++ code
+below right calls this function, passing a QVariantList and a QVariantMap, which are automatically
+converted to JavaScript array and object values, repectively:
+
+\table
+\row
+\o \snippet doc/src/snippets/declarative/qtbinding/variantlistmap/MyItem.qml 0
+\o \snippet doc/src/snippets/declarative/qtbinding/variantlistmap/main.cpp 0
+\endtable
+
+This produces output like:
+
+\code
+Array item: 10
+Array item: #00ff00
+Array item: bottles
+Object item: language = QML
+Object item: released = Tue Sep 21 2010 00:00:00 GMT+1000 (EST)
+\endcode
+
+Similarly, if a C++ type uses a QVariantList or QVariantMap type for a property or method
+parameter, the value can be created as a JavaScript array or object in the QML
+side, and is automatically converted to a QVariantList or QVariantMap when it is passed to C++.
+
+
\section2 Using enumerations of a custom type
To use an enumeration from a custom C++ component, the enumeration must be declared with Q_ENUMS() to
@@ -455,7 +487,7 @@ See the \l {Tutorial: Writing QML extensions with C++}{Writing QML extensions wi
the \l {Extending QML in C++} reference documentation for more information.
-\section2 Automatic type conversion
+\section2 Automatic type conversion from strings
As a convenience, some basic types can be specified in QML using format strings to make it easier to
pass simple values from QML to C++.
diff --git a/doc/src/declarative/qtdeclarative.qdoc b/doc/src/declarative/qtdeclarative.qdoc
index f2b2032..b0c6e06 100644
--- a/doc/src/declarative/qtdeclarative.qdoc
+++ b/doc/src/declarative/qtdeclarative.qdoc
@@ -57,6 +57,8 @@
\relates QDeclarativeEngine
Equivalent to \c Q_DECLARE_METATYPE(TYPE) and \c Q_DECLARE_METATYPE(QDeclarativeListProperty<TYPE>)
+
+ #include <QtDeclarative> to use this macro.
*/
/*!
@@ -68,6 +70,8 @@
Current the only supported type info is \c QML_HAS_ATTACHED_PROPERTIES which
declares that the \a Type supports \l {Attached Properties}.
+
+ #include <QtDeclarative> to use this macro.
*/
@@ -86,6 +90,10 @@
"com.mycompany.qmlcomponents":
\code
+ #include <QtDeclarative>
+
+ ...
+
qmlRegisterType<MySliderItem>("com.mycompany.qmlcomponents", 1, 0, "Slider");
\endcode
@@ -119,6 +127,8 @@
Returns the QML type id.
+ #include <QtDeclarative> to use this function.
+
\sa qmlRegisterTypeNotAvailable()
*/
@@ -154,6 +164,8 @@
Without this, a generic "Game is not a type" message would be given.
+ #include <QtDeclarative> to use this function.
+
\sa qmlRegisterUncreatableType()
*/
@@ -166,6 +178,8 @@
system. Instances of this type cannot be created from the QML
system.
+ #include <QtDeclarative> to use this function.
+
Returns the QML type id.
*/
@@ -176,5 +190,7 @@
This template function registers the C++ type in the QML system
under the name \a typeName.
+ #include <QtDeclarative> to use this function.
+
Returns the QML type id.
*/
diff --git a/doc/src/declarative/tutorial.qdoc b/doc/src/declarative/tutorial.qdoc
index 8467478..d8139b4 100644
--- a/doc/src/declarative/tutorial.qdoc
+++ b/doc/src/declarative/tutorial.qdoc
@@ -124,7 +124,7 @@ Our color picker is made of six cells with different colors.
To avoid writing the same code multiple times for each cell, we create a new \c Cell component.
A component provides a way of defining a new type that we can re-use in other QML files.
A QML component is like a black-box and interacts with the outside world through properties, signals and functions and is generally
-defined in its own QML file. (For more details, see \l {Defining new Components}).
+defined in its own QML file. (For more details, see \l {Defining New Components}).
The component's filename must always start with a capital letter.
Here is the QML code for \c Cell.qml:
@@ -144,7 +144,7 @@ An \l Item is the most basic visual element in QML and is often used as a contai
We declare a \c cellColor property. This property is accessible from \e outside our component, this allows us
to instantiate the cells with different colors.
-This property is just an alias to an existing property - the color of the rectangle that compose the cell (see \l{Adding new properties}).
+This property is just an alias to an existing property - the color of the rectangle that compose the cell (see \l{Adding Properties}).
\snippet examples/declarative/tutorials/helloworld/Cell.qml 5
diff --git a/doc/src/development/qtestlib.qdoc b/doc/src/development/qtestlib.qdoc
index e53957f..08fdfc6 100644
--- a/doc/src/development/qtestlib.qdoc
+++ b/doc/src/development/qtestlib.qdoc
@@ -245,10 +245,10 @@
\endtable
In short, walltime is always available but requires many repetitions to
- get a useful result.
- Tick counters are usually available and can provide
- results with fewer repetitions, but can be susceptible to CPU frequency
- scaling issues.
+ get a useful result.
+ Tick counters are usually available and can provide
+ results with fewer repetitions, but can be susceptible to CPU frequency
+ scaling issues.
Valgrind provides exact results, but does not take
I/O waits into account, and is only available on a limited number of
platforms.
@@ -264,7 +264,7 @@
See the chapter 5 in the \l{QTestLib Tutorial} for more benchmarking examples.
\section1 Using QTestLib remotely on Windows CE
- \c cetest is a convenience application which helps the user to launch an
+ \c cetest is a convenience application which helps the user to launch an
application remotely on a Windows CE device or emulator.
It needs to be executed after the unit test has been successfully compiled.
@@ -717,15 +717,15 @@
\section1 Writing a Benchmark
To create a benchmark we extend a test function with a QBENCHMARK macro.
- A benchmark test function will then typically consist of setup code and
+ A benchmark test function will then typically consist of setup code and
a QBENCHMARK macro that contains the code to be measured. This test
function benchmarks QString::localeAwareCompare().
\snippet examples/qtestlib/tutorial5/benchmarking.cpp 0
- Setup can be done at the beginning of the function, the clock is not
+ Setup can be done at the beginning of the function, the clock is not
running at this point. The code inside the QBENCHMARK macro will be
- measured, and possibly repeated several times in order to get an
+ measured, and possibly repeated several times in order to get an
accurate measurement.
Several \l {testlib-benchmarking-measurement}{back-ends} are available
@@ -733,7 +733,7 @@
\section1 Data Functions
- Data functions are useful for creating benchmarks that compare
+ Data functions are useful for creating benchmarks that compare
multiple data inputs, for example locale aware compare against standard
compare.
@@ -743,20 +743,19 @@
\snippet examples/qtestlib/tutorial5/benchmarking.cpp 2
- The "if(useLocaleCompare)" switch is placed outside the QBENCHMARK
+ The "if(useLocaleCompare)" switch is placed outside the QBENCHMARK
macro to avoid measuring its overhead. Each benchmark test function
- can have one active QBENCHMARK macro.
+ can have one active QBENCHMARK macro.
\section1 External Tools
Tools for handling and visualizing test data are available as part of
- the qtestlib-tools project on the
- \l{http://labs.qt.nokia.com/}{http://labs.qt.nokia.com/}Qt Labs Web site.
+ the \l {qtestlib-tools} project in the \l{Qt Labs} web site.
These include a tool for comparing performance data obtained from test
runs and a utility to generate Web-based graphs of performance data.
- See the \l{qtestlib-tools Announcement} for more information on these
- tools and a simple graphing example.
+ See the \l{qtestlib-tools Announcement}{qtestlib-tools announcement}
+ for more information on these tools and a simple graphing example.
*/
diff --git a/doc/src/examples/diagramscene.qdoc b/doc/src/examples/diagramscene.qdoc
index 98bc983..d5cc4e3 100644
--- a/doc/src/examples/diagramscene.qdoc
+++ b/doc/src/examples/diagramscene.qdoc
@@ -195,7 +195,7 @@
This function returns a QWidget containing a QToolButton with
an image of one of the \c DiagramItems, i.e., flowchart shapes.
The image is created by the \c DiagramItem through the \c image()
- function. The QButtonGroup class lets us attach a QVariant with
+ function. The QButtonGroup class lets us attach an id (int) with
each button; we store the diagram's type, i.e., the
DiagramItem::DiagramType enum. We use the stored diagram type when
we create new diagram items for the scene. The widgets created
diff --git a/doc/src/examples/multicastreceiver.qdoc b/doc/src/examples/multicastreceiver.qdoc
index f769705..9c4dda4 100644
--- a/doc/src/examples/multicastreceiver.qdoc
+++ b/doc/src/examples/multicastreceiver.qdoc
@@ -7,11 +7,11 @@
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:FDL$
-** Commercial Usage
-** Licensees holding valid Qt Commercial licenses may use this file 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.
+** 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 Free Documentation License
** Alternatively, this file may be used under the terms of the GNU Free
diff --git a/doc/src/examples/multicastsender.qdoc b/doc/src/examples/multicastsender.qdoc
index 271be60..be5fb6a 100644
--- a/doc/src/examples/multicastsender.qdoc
+++ b/doc/src/examples/multicastsender.qdoc
@@ -7,11 +7,11 @@
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:FDL$
-** Commercial Usage
-** Licensees holding valid Qt Commercial licenses may use this file 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.
+** 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 Free Documentation License
** Alternatively, this file may be used under the terms of the GNU Free
diff --git a/doc/src/examples/qml-examples.qdoc b/doc/src/examples/qml-examples.qdoc
index ca24c66..0834527 100644
--- a/doc/src/examples/qml-examples.qdoc
+++ b/doc/src/examples/qml-examples.qdoc
@@ -663,7 +663,8 @@
\example declarative/ui-components/tabwidget
This example shows how to create a tab widget. It also demonstrates how
- \l {Setting default properties}{default properties} can be used to collect and
+ \l {Property aliases}{property aliases} and
+ \l {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/wheel.qdoc b/doc/src/examples/wheel.qdoc
new file mode 100644
index 0000000..992aba6
--- /dev/null
+++ b/doc/src/examples/wheel.qdoc
@@ -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 documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** 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 Free Documentation License
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of this
+** file.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example scroller/wheel
+ \title Wheel Scroller Example
+
+ The Wheel Scroller Example shows how to use QScroller, QScrollEvent
+ and QScrollPrepareEvent to implement smooth scrolling for a
+ custom Widget.
+
+ \section1 Basics
+
+ The QScroller class is the main part of the smooth scrolling
+ mechanism in Qt. It keeps track of the current scroll position and
+ speed and updates the object through events.
+ QScroller will get touch events via the QFlickGesture.
+ It will query the target object through a QScrollPrepareEvent for
+ the scroll area and other information.
+ QScroller will send QScrollEvents to inform the target object about
+ the current scroll position.
+ The target object (usually a QWidget or a QGraphicsObject) will
+ then need to update it's graphical representation to reflect the
+ new scroll position.
+
+ \section1 The Wheel Widget class
+
+ To demonstrate how to use the QScroller we implement a QWidget that
+ looks and works like the wheel of a slot machine.
+ The wheel can be started via touch events and will continue getting
+ slower.
+ Additionally the wheel should appear as if no border exists (which
+ would seem unnatural) and the scrolling should snap to center one
+ item.
+
+ In the widget we need to grab the QFlickGesture. The gesture itself
+ will setAcceptTouchEvents for us, so we don't need to do that here.
+
+ \snippet examples/scroller/wheel/wheelwidget.cpp 0
+
+ The widget will get gesture events but in addition we also will
+ get the events from QScroller.
+ We will need to accept the QScrollPrepareEvent to indicate that
+ a scrolling should really be started from the given position.
+
+ \snippet examples/scroller/wheel/wheelwidget.cpp 1
+
+ We should call all three set functions form QScrollPrepareEvent.
+
+ \list
+ \o \c setViewportSize to indicate our viewport size. Actually the
+ given code could be improved by giving our size minus the borders.
+ \o \c setMaxContentPos to indicate the maximum values for the scroll
+ position. The minimum values are implicitely set to 0.
+ In our example we give a very high number here and hope that the user
+ is not patient enough to scroll until the very end.
+ \o \c setContentPos to indicate the current scroll position.
+ We give a position in the middle of the huge scroll area.
+ Actually we give this position every time a new scroll is started so
+ the user will only reach the end if he continuously scrolls in one
+ direction which is not very likely.
+ \endlist
+
+ The handling of the QScrollEvent is a lengthly code not fully shown here.
+ \snippet examples/scroller/wheel/wheelwidget.cpp 2
+
+ In principle it does three steps.
+ \list
+ \o It calculates and updates the current scroll position as given by
+ QScroller.
+ \o It repaints the widget so that the new position is shown.
+ \o It centers the item as soon as the scrolling stopps.
+ \endlist
+
+ The following code does the centering.
+ \snippet examples/scroller/wheel/wheelwidget.cpp 3
+
+ We check if the scrolling is finished which is indicated in the
+ QScrollEvent by the \c isLast flag.
+ We then check if the item is not already centered and if not start a new
+ scroll by calling QScroller::scrollTo.
+
+ As you can see the QScroller can be used for other things besides simple
+ scroll areas.
+*/
diff --git a/doc/src/external-resources.qdoc b/doc/src/external-resources.qdoc
index 8eeaeb1..9bc3b1c 100644
--- a/doc/src/external-resources.qdoc
+++ b/doc/src/external-resources.qdoc
@@ -448,3 +448,8 @@
\externalpage https://developer.mozilla.org/en/JavaScript/About_JavaScript
\title About JavaScript
*/
+
+/*!
+ \externalpage http://www.libusb.org/
+ \title libusb
+*/
diff --git a/doc/src/frameworks-technologies/threads.qdoc b/doc/src/frameworks-technologies/threads.qdoc
index 001b29d..2a0cc1a 100644
--- a/doc/src/frameworks-technologies/threads.qdoc
+++ b/doc/src/frameworks-technologies/threads.qdoc
@@ -213,10 +213,10 @@
/*!
\page threads-reentrancy.html
\title Reentrancy and Thread-Safety
-
+
\keyword reentrant
\keyword thread-safe
-
+
\previouspage Synchronizing Threads
\contentspage Thread Support in Qt
\nextpage Threads and QObjects
@@ -243,6 +243,15 @@
from multiple threads, even if all the threads use the \e{same}
instance of the class.
+ \note Qt classes are only documented as \e{thread-safe} if they
+ are intended to be used by multiple threads. If a function is not
+ marked as thread-safe or reentrant, it should not be used from
+ different threads. If a class is not marked as thread-safe or
+ reentrant then a specific instance of that class should not be
+ accessed from different threads.
+
+ \section1 Reentrancy
+
C++ classes are often reentrant, simply because they only access
their own member data. Any thread can call a member function on an
instance of a reentrant class, as long as no other thread can call
@@ -268,6 +277,8 @@
end up overwriting each other, and the variable is incremented
only once!
+ \section1 Thread-Safety
+
Clearly, the access must be serialized: Thread A must perform
steps 1, 2, 3 without interruption (atomically) before thread B
can perform the same steps; or vice versa. An easy way to make
@@ -284,6 +295,8 @@
declared with the \c mutable qualifier because we need to lock
and unlock the mutex in \c value(), which is a const function.
+ \section1 Notes on Qt Classes
+
Many Qt classes are \e{reentrant}, but they are not made
\e{thread-safe}, because making them thread-safe would incur the
extra overhead of repeatedly locking and unlocking a QMutex. For
@@ -297,9 +310,6 @@
the thread-related classes (e.g. QMutex) and fundamental functions
(e.g. QCoreApplication::postEvent()).
- \note Qt Classes are only documented as \e{thread-safe} if they
- are intended to be used by multiple threads.
-
\note Terminology in the multithreading domain isn't entirely
standardized. POSIX uses definitions of reentrant and thread-safe
that are somewhat different for its C APIs. When using other
diff --git a/doc/src/getting-started/gettingstartedqml.qdoc b/doc/src/getting-started/gettingstartedqml.qdoc
index b767587..e3977bb 100644
--- a/doc/src/getting-started/gettingstartedqml.qdoc
+++ b/doc/src/getting-started/gettingstartedqml.qdoc
@@ -148,7 +148,7 @@
\code
Rectangle {
- id:Button
+ id: button
...
property color buttonColor: "lightblue"
diff --git a/doc/src/getting-started/installation.qdoc b/doc/src/getting-started/installation.qdoc
index a68310c..aa10aaf 100644
--- a/doc/src/getting-started/installation.qdoc
+++ b/doc/src/getting-started/installation.qdoc
@@ -684,7 +684,7 @@ Binary Package} document.
We hope you will enjoy using Qt.
*/
-/*! \page install-Symbian-linux.html
+/*! \page install-symbian-linux.html
\title Installing Qt for the Symbian platform using Linux (experimental)
\ingroup installation
\ingroup qtsymbian
diff --git a/doc/src/images/declarative-qmlfocus1.png b/doc/src/images/declarative-qmlfocus1.png
new file mode 100644
index 0000000..317b34b
--- /dev/null
+++ b/doc/src/images/declarative-qmlfocus1.png
Binary files differ
diff --git a/doc/src/images/declarative-qmlfocus2.png b/doc/src/images/declarative-qmlfocus2.png
new file mode 100644
index 0000000..e3f9643
--- /dev/null
+++ b/doc/src/images/declarative-qmlfocus2.png
Binary files differ
diff --git a/doc/src/images/declarative-qmlfocus3.png b/doc/src/images/declarative-qmlfocus3.png
new file mode 100644
index 0000000..a5897ce
--- /dev/null
+++ b/doc/src/images/declarative-qmlfocus3.png
Binary files differ
diff --git a/doc/src/images/declarative-qmlfocus4.png b/doc/src/images/declarative-qmlfocus4.png
new file mode 100644
index 0000000..f2e64cd
--- /dev/null
+++ b/doc/src/images/declarative-qmlfocus4.png
Binary files differ
diff --git a/doc/src/images/declarative-qmlfocus5.png b/doc/src/images/declarative-qmlfocus5.png
new file mode 100644
index 0000000..ec7307b
--- /dev/null
+++ b/doc/src/images/declarative-qmlfocus5.png
Binary files differ
diff --git a/doc/src/legal/3rdparty.qdoc b/doc/src/legal/3rdparty.qdoc
index 8b3d5f2..9cc83a6 100644
--- a/doc/src/legal/3rdparty.qdoc
+++ b/doc/src/legal/3rdparty.qdoc
@@ -683,36 +683,57 @@
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.
-
+
\hr
- jquery 1.4.2.js Copyright 2010 John Resig
- This software is dual licensed under the MIT or GPL version 2 licenses.
- Nokia has used the software herein under the MIT license.
-
- jquery includes Sizzle.js Copyright 2010 The Dojo Foundaton and is
- licensed under the MIT, BSD and GPL licenses. Nokia has used this
- software herein under the MIT license.
-
- The MIT License
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
-
-
+ jquery 1.4.2.js Copyright 2010 John Resig
+ This software is dual licensed under the MIT or GPL version 2 licenses.
+ Nokia has used the software herein under the MIT license.
+
+ jquery includes Sizzle.js Copyright 2010 The Dojo Foundaton and is
+ licensed under the MIT, BSD and GPL licenses. Nokia has used this
+ software herein under the MIT license.
+
+ The MIT License
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+
+
+ \section1 The Public Suffix List
+
+ \e{The Public Suffix List is an initiative of the Mozilla Project, but is
+ maintained as a community resource. It is available for use in any
+ software, but was originally created to meet the needs of browser
+ manufacturers. It allows browsers to, for example:}
+ \list
+ \o \e{Avoid privacy-damaging "supercookies" being set for high-level
+ domain name suffixes}
+ \o \e{Highlight the most important part of a domain name in the user
+ interface}
+ \o \e{Accurately sort history entries by site}
+ \endlist
+ -- quoted from \l{publicsuffix.org}.
+
+ The public suffix list is used inside Qt to avoid such "supercookies"
+ mentioned above being set in the cookie jar supported by Qt (by the
+ QNetworkCookieJar class).
+
+ See \c src/network/access/qnetworkcookiejartlds_p.h.INFO for more
+ information about how the list is used.
*/
diff --git a/doc/src/network-programming/bearermanagement.qdoc b/doc/src/network-programming/bearermanagement.qdoc
index 98de5bf..12da55b 100644
--- a/doc/src/network-programming/bearermanagement.qdoc
+++ b/doc/src/network-programming/bearermanagement.qdoc
@@ -26,11 +26,11 @@
****************************************************************************/
/*!
- \page bearer-management.html
+\page bearer-management.html
- \title Bearer Management
- \ingroup qt-network
- \brief An API to control the system's connectivity state.
+\title Bearer Management
+\ingroup qt-network
+\brief An API to control the system's connectivity state.
Bearer Management controls the connectivity state of the system so that
the user can start or stop interfaces or roam transparently between
diff --git a/doc/src/platforms/emb-envvars.qdoc b/doc/src/platforms/emb-envvars.qdoc
index 1d109b4..3f318eb 100644
--- a/doc/src/platforms/emb-envvars.qdoc
+++ b/doc/src/platforms/emb-envvars.qdoc
@@ -112,7 +112,7 @@
device, e.g., \c /dev/mouse for mouse devices and \c /dev/ts for
touch panels.
- Multiple keyboard drivers can be specified in one go:
+ Multiple mouse drivers can be specified in one go:
\snippet doc/src/snippets/code/doc_src_emb-envvars.qdoc 3
diff --git a/doc/src/platforms/platform-notes.qdoc b/doc/src/platforms/platform-notes.qdoc
index 9c5f3c8..b745867 100644
--- a/doc/src/platforms/platform-notes.qdoc
+++ b/doc/src/platforms/platform-notes.qdoc
@@ -81,14 +81,11 @@
\header \o \o Concurrent \o XmlPatterns \o WebKit(*) \o CLucene \o Phonon
\row \o g++ 3.3 \o \o \bold{X} \o \o \bold{X} \o \bold{X}
\row \o g++ 3.4 and up \o \bold{X} \o \bold{X} \o \bold{X} \o \bold{X} \o \bold{X}
- \row
\row \o SunCC 5.5 \o \o \o \o \bold{X} \o \bold{X}
- \row
\row \o aCC series 3 \o \o \o \o \bold{X} \o \bold{X}
\row \o aCC series 6 \o \bold{X} \o \bold{X} \o \bold{X} \o \bold{X} \o \bold{X}
\row \o xlC 6 \o \o \o \o \bold{X} \o \bold{X}
\row \o Intel CC 10 \o \bold{X} \o \bold{X} \o \bold{X} \o \bold{X} \o \bold{X}
- \row
\row \o MSVC 2003 \o \bold{X} \o \bold{X} \o \o \bold{X} \o \bold{X}
\row \o MSVC 2005 and up \o \bold{X} \o \bold{X} \o \bold{X} \o \bold{X} \o \bold{X}
\endtable
@@ -737,18 +734,23 @@
\o \c PowerMgmt if QProcess::kill(...) or QProcess::terminate(...) is called.
\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.
+ \row \o QtNetwork
+ \o \c NetworkServices is automatically added for this module.
\row \o QtNetwork
- \o \c NetworkServices is basically always required for this module.
\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),
without this capability only the CA certs built into the phone are used.
\row \o QtMultiMedia
\o \c UserEnvironment if QAudioInput is used.
+ \row \o QtWebkit
+ \o \c NetworkServices is automatically added for this module.
\endtable
- Note that some modules rely on other modules. If your application uses
- QtXmlPatterns, QtWebkit or QtScript it may still require \c NetworkServices
- as these modules rely on QtNetwork to go online.
+ \note Some modules rely on other modules. E.g. QtWebkit and QtDeclarative
+ depend on QtNetwork and therefore any application that
+ depends on these modules is also likely to need \c NetworkServices capability.
For more information see the documentation of the individual Qt classes. If
a class does not mention Symbian capabilities, it requires none.
diff --git a/doc/src/platforms/symbian-introduction.qdoc b/doc/src/platforms/symbian-introduction.qdoc
index 7bc5303..cce2be3 100644
--- a/doc/src/platforms/symbian-introduction.qdoc
+++ b/doc/src/platforms/symbian-introduction.qdoc
@@ -144,8 +144,17 @@
Smart installer will attempt to download
missing dependencies in addition to
just installing the application.
+ Note: The application \c .sis contained in smart installer \c .sis
+ will be recreated and signed with same certificates as
+ smart installer \c .sis.
+ \row \o \c ok_installer_sis \o Otherwise similar to \c installer_sis target, except
+ the application sis will not be recreated. This is useful
+ when application \c .sis needs to be separately signed before
+ including it into smart installer \c .sis.
\row \o \c unsigned_installer_sis \o Create unsigned \l{Smart Installer}{smart installer}
\c .sis file for project.
+ Note: The application \c .sis contained in smart installer
+ \c .sis will also be unsigned.
\row \o \c stub_sis \o Create a stub sis to allow upgradability of projects
that are deployed in ROM
\endtable
@@ -222,6 +231,7 @@
\row \o -s \o Generates stub sis for ROM.
\row \o -n <name> \o Specifies the final sis name.
\row \o -g \o Treat gcce platform as armv5.
+ \row \o -d \o Skip automatic patching of the package when default certificate is used.
\endtable
Execute the \c{createpackage.pl} script without any
diff --git a/doc/src/qt-webpages.qdoc b/doc/src/qt-webpages.qdoc
index 05817df..0a03157 100644
--- a/doc/src/qt-webpages.qdoc
+++ b/doc/src/qt-webpages.qdoc
@@ -201,11 +201,6 @@
*/
/*!
- \externalpage http://labs.qt.nokia.com/gitweb?p=qtestlib-tools;a=summary
- \title qtestlib-tools
-*/
-
-/*!
\externalpage http://qt.nokia.com/products/library/modular-class-library#info_scripting
\title Qt Script for Applications (QSA)
*/
@@ -239,3 +234,13 @@
\externalpage http://get.qt.nokia.com/nokiasmartinstaller/
\title Smart Installer
*/
+
+/*!
+ \externalpage http://qt.gitorious.org/qt-labs/qtestlib-tools
+ \title qtestlib-tools
+*/
+
+/*!
+ \externalpage http://labs.qt.nokia.com
+ \title Qt Labs
+*/
diff --git a/doc/src/qt4-intro.qdoc b/doc/src/qt4-intro.qdoc
index 62decbb..7325e27 100644
--- a/doc/src/qt4-intro.qdoc
+++ b/doc/src/qt4-intro.qdoc
@@ -60,7 +60,53 @@
\section1 Recent Additions to Qt 4
- The following features have been added to Qt since the first release of Qt 4:
+ The following features have been added to Qt since the first release of Qt 4.
+
+ In Qt 4.7:
+ \list
+ \o Declarative UI Development with \l{Qt Quick}, technologies for creating
+ fluid, dynamic user interfaces.
+ \o Support for \l{Bearer Management}{network bearer management}, enabling
+ features such as control over network interfaces and support for roaming
+ between networks.
+ \o Feature and performance improvements in QtWebKit, including a new tiled
+ backing store, control over scroll bars used in frames and framesets,
+ accelerated compositing and \l{The QtWebKit Bridge}{support for hybrid
+ development}.
+ \o General performance improvements, including the use of "alien widgets"
+ on Mac OS X, the QStaticText class for optimized text rendering, a new
+ \l{QPainter::drawPixmapFragments()}{API for rendering pixmap fragments}
+ and an updated version of the JavaScriptCore engine for the QtScript
+ module with improved performance.
+ \endlist
+
+ In Qt 4.6:
+ \list
+ \o Support for \l{The Symbian platform - Introduction to Qt}{the Symbian Platform}
+ as a mainstream Qt platform, with integration into the S60 framework.
+ \o The \l{The Animation Framework}{animation framework} allows animations to be
+ created using both widgets and graphics items.
+ \o The \l{The State Machine Framework}{state machine framework} provides a robust
+ state chart implementation based on Harel statecharts and SCXML.
+ \o Support for \l{QTouchEvent}{touch input} and \l{Gestures Programming}{gestures}
+ enable developers to create intuitive user interfaces for touch-based devices.
+ \o A \l{QWebElement}{DOM access API} for QtWebKit provides a cleaner and safer way
+ to access elements and structures of Web pages without the use of JavaScript.
+ \o A collection of performance improvements, covering QGraphicsView, QPixmapCache,
+ QNetworkAccessManager, QContiguousCache class, hardware-accelerated rendering
+ support through \l{OpenVG Rendering in Qt}{OpenVG}, and the removal of Win9x
+ support.
+ \o A collection of \l{QGraphicsEffect}{graphics effects} make it easy to apply
+ and simple effects to graphics items and combine them to produce more complex
+ effects.
+ \o Support for XML schema validation in the QtXmlPatterns module covering
+ large parts of version 1.0 of the specification.
+ \o Qt3D enablers, including math primitives for \l{QMatrix4x4}{matrix multiplication},
+ \l{QVector3D}{vectors}, \l{QQuaternion}{quaternions} (client-side), and an API
+ for \l{QGLShader}{vertex and fragment shaders}, GLSL/ES.
+ \o \l{QtMultimedia Module}{Multimedia services} providing low-level access to the
+ system's audio system.
+ \endlist
In Qt 4.5:
\list
@@ -209,7 +255,7 @@
\row \o \l{Qt3Support} \o Qt 3 support classes
\row \o \l{QAxContainer} \o ActiveQt client extension
\row \o \l{QAxServer} \o ActiveQt server extension
- \row \o \l{QtHelp} \o Classes for integrating online documentation
+ \row \o \l{QtHelp} \o Classes for integrating online documentation
\row \o \l{QtDesigner} \o Classes for extending and embedding Qt Designer
\row \o \l{QtUiTools} \o Classes for dynamic GUI generation
\row \o \l{QtTest} \o Tool classes for unit testing
@@ -451,7 +497,7 @@
A list of other Qt 4 features can be found on the \bold{\l{What's
New in Qt 4}} page.
- \section1 Declarative UI development with Qt Quick
+ \section1 Declarative UI Development with Qt Quick
\image quick_screens.png
@@ -508,7 +554,7 @@
For hybrid QtWebKit and C++ projects, Qt 4.7 has added support for
transporting \l{QPixmap}s between Qt C++ and WebKit. We have also
- improved the documentation hybrid development. Read more here:
+ improved the documentation for hybrid development. Read more here:
\l{The QtWebKit Bridge}.
\section1 QtWebKit Performance Benchmarks
@@ -680,7 +726,7 @@
See the QTouchEvent class documentation for more information on touch
input and QGestureEvent for gestures.
- \section1 DOM access API
+ \section1 DOM Access API
Web pages and XML both have very complex document object models.
The W3C selector API provides a very simple way to access and
@@ -699,7 +745,7 @@
\list
\o Rewritten the QGraphicsView rendering algorithm.
- \o Made QPixmapCache support efficient Key datastructure.
+ \o Made QPixmapCache support efficient Key data structure.
\o Reduced overhead in QNetworkAccessManager.
\o Added the QContiguousCache class, which provides efficient caching of
contiguous data.
@@ -740,7 +786,7 @@
See the \l{XML Processing} and QXmlSchema class documentation for more
information.
- \section1 Qt3D enablers
+ \section1 Qt3D Enablers
As more of Qt, and more of the applications built on Qt go 3D,
API's should be provided to simplify this. Mainly, the new API
@@ -750,7 +796,7 @@
The main features of the Qt3D enablers are currently: Math
primitives for matrix multiplication, vectors, quaternions
- (client-side), and API for vertex and fragment shaders, GLSL/ES.
+ (client-side), and an API for vertex and fragment shaders, GLSL/ES.
Future research will, among other things include stencils,
scissors, vertex buffers and arrays, texture manipulation, and
geometry shaders.
diff --git a/doc/src/snippets/declarative/codingconventions/private.qml b/doc/src/snippets/declarative/codingconventions/private.qml
new file mode 100644
index 0000000..1d3dda8
--- /dev/null
+++ b/doc/src/snippets/declarative/codingconventions/private.qml
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+//! [0]
+Item {
+ id: component
+ width: 40; height: 50
+ property real __area: width * height * 0.5 //not meant for outside use
+}
+//! [0]
diff --git a/doc/src/snippets/declarative/comments.qml b/doc/src/snippets/declarative/comments.qml
index a8e47ad..97659a5 100644
--- a/doc/src/snippets/declarative/comments.qml
+++ b/doc/src/snippets/declarative/comments.qml
@@ -38,7 +38,6 @@
**
****************************************************************************/
-//![0]
import QtQuick 1.0
//![0]
diff --git a/doc/src/snippets/declarative/focus/advancedFocus.qml b/doc/src/snippets/declarative/focus/advancedFocus.qml
new file mode 100644
index 0000000..274f54f
--- /dev/null
+++ b/doc/src/snippets/declarative/focus/advancedFocus.qml
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** 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 FOO module 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
+
+//! [FocusScope delegate]
+Rectangle {
+ color: "lightsteelblue"; width: 100; height: 50
+
+ ListView {
+ anchors.fill: parent
+ focus: true
+
+ model: ListModel {
+ ListElement { name: "Bob" }
+ ListElement { name: "John" }
+ ListElement { name: "Michael" }
+ }
+
+ delegate: FocusScope {
+ width: childrenRect.width; height: childrenRect.height
+ x:childrenRect.x; y: childrenRect.y
+ TextInput {
+ focus: true
+ text: name
+ Keys.onReturnPressed: console.log(name)
+ }
+ }
+ }
+}
+//! [FocusScope delegate]
diff --git a/doc/src/snippets/declarative/focus/basicwidget.qml b/doc/src/snippets/declarative/focus/basicwidget.qml
new file mode 100644
index 0000000..71e75ff
--- /dev/null
+++ b/doc/src/snippets/declarative/focus/basicwidget.qml
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** 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 FOO module 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
+
+//! [focus true]
+Rectangle {
+ color: "lightsteelblue"; width: 240; height: 25
+ Text { id: myText }
+ Item {
+ id: keyHandler
+ focus: true
+ Keys.onPressed: {
+ if (event.key == Qt.Key_A)
+ myText.text = 'Key A was pressed'
+ else if (event.key == Qt.Key_B)
+ myText.text = 'Key B was pressed'
+ else if (event.key == Qt.Key_C)
+ myText.text = 'Key C was pressed'
+ }
+ }
+}
+//! [focus true]
diff --git a/doc/src/snippets/declarative/focus/clickablewidget.qml b/doc/src/snippets/declarative/focus/clickablewidget.qml
new file mode 100644
index 0000000..34b0d87
--- /dev/null
+++ b/doc/src/snippets/declarative/focus/clickablewidget.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 FOO module 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
+
+//! [clickable window]
+Rectangle {
+ id: window
+
+ color: "white"; width: 240; height: 150
+
+ Column {
+ anchors.centerIn: parent; spacing: 15
+
+ MyClickableWidget {
+ focus: true //set this MyWidget to receive the focus
+ color: "lightblue"
+ }
+ MyClickableWidget {
+ color: "palegreen"
+ }
+ }
+
+}
+//! [clickable window]
diff --git a/doc/src/snippets/declarative/focus/focusColumn.qml b/doc/src/snippets/declarative/focus/focusColumn.qml
new file mode 100644
index 0000000..42ee3da
--- /dev/null
+++ b/doc/src/snippets/declarative/focus/focusColumn.qml
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+import QtQuick 1.0
+
+Rectangle {
+ width: 200; height: 200
+
+ // Column {
+ FocusScope {
+ x: rect1.x; y:rect1.y; width: rect1.width; height: rect1.height
+ Rectangle {id: rect1; width: 50; height: 50; focus:true
+ color: focus ? "red":"blue"
+ }
+ Rectangle {id: rect2; width: 50; height: 50; focus:true
+ color: focus ? "red":"blue"
+ y: 75
+ }
+// }
+/*
+ FocusScope {
+ x: rect2.x; y:rect2.y; width: rect2.width; height: rect2.height
+ Rectangle {id: rect2; width: 50; height: 50; color: "red"}
+ }
+*/
+ }
+
+}
diff --git a/doc/src/snippets/declarative/focus/focusscopewidget.qml b/doc/src/snippets/declarative/focus/focusscopewidget.qml
new file mode 100644
index 0000000..48e5750
--- /dev/null
+++ b/doc/src/snippets/declarative/focus/focusscopewidget.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 FOO module 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
+
+//! [focusscope window]
+Rectangle {
+ id: window
+
+ color: "white"; width: 240; height: 150
+
+ Column {
+ anchors.centerIn: parent; spacing: 15
+
+ MyFocusScopeWidget {
+ focus: true //set this MyWidget to receive the focus
+ color: "lightblue"
+ }
+ MyFocusScopeWidget {
+ color: "palegreen"
+ }
+ }
+
+}
+//! [focusscope window]
diff --git a/doc/src/snippets/declarative/focus/myclickablewidget.qml b/doc/src/snippets/declarative/focus/myclickablewidget.qml
new file mode 100644
index 0000000..3294662
--- /dev/null
+++ b/doc/src/snippets/declarative/focus/myclickablewidget.qml
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** 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 FOO module 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
+
+//! [clickable in focusscope]
+FocusScope {
+
+ id: scope
+
+ //FocusScope needs to bind to visual properties of the children
+ property alias color: rectangle.color
+ x: rectangle.x; y: rectangle.y
+ width: rectangle.width; height: rectangle.height
+
+ Rectangle {
+ id: rectangle
+ anchors.centerIn: parent
+ color: "lightsteelblue"; width: 175; height: 25; radius: 10; smooth: true
+ Text { id: label; anchors.centerIn: parent }
+ focus: true
+ Keys.onPressed: {
+ if (event.key == Qt.Key_A)
+ label.text = 'Key A was pressed'
+ else if (event.key == Qt.Key_B)
+ label.text = 'Key B was pressed'
+ else if (event.key == Qt.Key_C)
+ label.text = 'Key C was pressed'
+ }
+ }
+ MouseArea { anchors.fill: parent; onClicked: { scope.focus = true } }
+}
+//! [clickable in focusscope]
diff --git a/doc/src/snippets/declarative/focus/myfocusscopewidget.qml b/doc/src/snippets/declarative/focus/myfocusscopewidget.qml
new file mode 100644
index 0000000..231ae3a
--- /dev/null
+++ b/doc/src/snippets/declarative/focus/myfocusscopewidget.qml
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** 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 FOO module 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
+
+//! [widget in focusscope]
+FocusScope {
+
+ //FocusScope needs to bind to visual properties of the children
+ property alias color: rectangle.color
+ x: rectangle.x; y: rectangle.y
+ width: rectangle.width; height: rectangle.height
+
+ Rectangle {
+ id: rectangle
+ anchors.centerIn: parent
+ color: "lightsteelblue"; width: 175; height: 25; radius: 10; smooth: true
+ Text { id: label; anchors.centerIn: parent }
+ focus: true
+ Keys.onPressed: {
+ if (event.key == Qt.Key_A)
+ label.text = 'Key A was pressed'
+ else if (event.key == Qt.Key_B)
+ label.text = 'Key B was pressed'
+ else if (event.key == Qt.Key_C)
+ label.text = 'Key C was pressed'
+ }
+ }
+}
+//! [widget in focusscope]
diff --git a/doc/src/snippets/declarative/focus/mywidget.qml b/doc/src/snippets/declarative/focus/mywidget.qml
new file mode 100644
index 0000000..bea723d
--- /dev/null
+++ b/doc/src/snippets/declarative/focus/mywidget.qml
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** 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 FOO module 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
+
+//! [mywidget]
+//MyWidget code
+Rectangle {
+ id: widget
+ color: "lightsteelblue"; width: 175; height: 25; radius: 10; smooth: true
+ Text { id: label; anchors.centerIn: parent}
+ focus: true
+ Keys.onPressed: {
+ if (event.key == Qt.Key_A)
+ label.text = 'Key A was pressed'
+ else if (event.key == Qt.Key_B)
+ label.text = 'Key B was pressed'
+ else if (event.key == Qt.Key_C)
+ label.text = 'Key C was pressed'
+ }
+}
+//! [mywidget]
diff --git a/doc/src/snippets/declarative/focus/qmldir b/doc/src/snippets/declarative/focus/qmldir
new file mode 100644
index 0000000..d0683b2
--- /dev/null
+++ b/doc/src/snippets/declarative/focus/qmldir
@@ -0,0 +1,4 @@
+MyWidget 1.0 mywidget.qml
+MyFocusScopeWidget 1.0 myfocusscopewidget.qml
+MyClickableWidget 1.0 myclickablewidget.qml
+
diff --git a/doc/src/snippets/declarative/focus/rectangle.qml b/doc/src/snippets/declarative/focus/rectangle.qml
new file mode 100644
index 0000000..01d1f0c
--- /dev/null
+++ b/doc/src/snippets/declarative/focus/rectangle.qml
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** 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 FOO module 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
+
+//! [simple key event]
+Rectangle {
+ width: 100; height: 100
+ focus: true
+ Keys.onPressed: {
+ if (event.key == Qt.Key_A) {
+ console.log('Key A was pressed');
+ event.accepted = true;
+ }
+ }
+//! [simple key event]
+
+//! [active focus]
+ Text {
+ text: activeFocus ? "I have active focus!" : "I do not have active focus"
+ }
+//! [active focus]
+
+//! [simple key event end]
+}
+//! [simple key event end]
diff --git a/doc/src/snippets/declarative/focus/widget.qml b/doc/src/snippets/declarative/focus/widget.qml
new file mode 100644
index 0000000..cef34c5
--- /dev/null
+++ b/doc/src/snippets/declarative/focus/widget.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 FOO module 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
+
+//! [window]
+
+//Window code that imports MyWidget
+Rectangle {
+ id: window
+ color: "white"; width: 240; height: 150
+
+ Column {
+ anchors.centerIn: parent; spacing: 15
+
+ MyWidget {
+ focus: true //set this MyWidget to receive the focus
+ color: "lightblue"
+ }
+ MyWidget {
+ color: "palegreen"
+ }
+ }
+}
+//! [window]
diff --git a/doc/src/snippets/declarative/gridview/gridview.qml b/doc/src/snippets/declarative/gridview/gridview.qml
index 73e58ec..87d70de 100644
--- a/doc/src/snippets/declarative/gridview/gridview.qml
+++ b/doc/src/snippets/declarative/gridview/gridview.qml
@@ -132,6 +132,32 @@ GridView {
}
//![highlightFollowsCurrentItem]
+//![isCurrentItem]
+GridView {
+ width: 300; height: 200
+ cellWidth: 80; cellHeight: 80
+
+ Component {
+ id: contactsDelegate
+ Rectangle {
+ id: wrapper
+ width: 80
+ height: 80
+ color: GridView.isCurrentItem ? "black" : "red"
+ Text {
+ id: contactInfo
+ text: name + ": " + number
+ color: wrapper.GridView.isCurrentItem ? "red" : "black"
+ }
+ }
+ }
+
+ model: ContactModel {}
+ delegate: contactsDelegate
+ focus: true
+}
+//![isCurrentItem]
+
}
}
diff --git a/doc/src/snippets/declarative/integrating-javascript/connectjs.qml b/doc/src/snippets/declarative/integrating-javascript/connectjs.qml
new file mode 100644
index 0000000..d84b827
--- /dev/null
+++ b/doc/src/snippets/declarative/integrating-javascript/connectjs.qml
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+//![0]
+import QtQuick 1.0
+import "script.js" as MyScript
+
+Item {
+ id: item
+ width: 200; height: 200
+
+ MouseArea {
+ id: mouseArea
+ anchors.fill: parent
+ }
+
+ Component.onCompleted: {
+ mouseArea.clicked.connect(MyScript.jsFunction)
+ }
+}
+//![0]
diff --git a/doc/src/snippets/declarative/integrating-javascript/includejs/app.qml b/doc/src/snippets/declarative/integrating-javascript/includejs/app.qml
new file mode 100644
index 0000000..2ecc475
--- /dev/null
+++ b/doc/src/snippets/declarative/integrating-javascript/includejs/app.qml
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+//![0]
+import QtQuick 1.0
+import "script.js" as MyScript
+
+Item {
+ width: 100; height: 100
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: {
+ MyScript.showCalculations(10)
+ console.log("Call factorial() from QML:",
+ MyScript.factorial(10))
+ }
+ }
+}
+//![0]
diff --git a/doc/src/snippets/declarative/integrating-javascript/includejs/factorial.js b/doc/src/snippets/declarative/integrating-javascript/includejs/factorial.js
new file mode 100644
index 0000000..0a01e9e
--- /dev/null
+++ b/doc/src/snippets/declarative/integrating-javascript/includejs/factorial.js
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+//![0]
+// factorial.js
+function factorial(a) {
+ a = parseInt(a);
+ if (a <= 0)
+ return 1;
+ else
+ return a * factorial(a - 1);
+}
+//![0]
diff --git a/doc/src/snippets/declarative/integrating-javascript/includejs/script.js b/doc/src/snippets/declarative/integrating-javascript/includejs/script.js
new file mode 100644
index 0000000..7380412
--- /dev/null
+++ b/doc/src/snippets/declarative/integrating-javascript/includejs/script.js
@@ -0,0 +1,48 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+//![0]
+// script.js
+Qt.include("factorial.js")
+
+function showCalculations(value) {
+ console.log("Call factorial() from script.js:",
+ factorial(value));
+}
+//![0]
diff --git a/doc/src/snippets/declarative/integrating-javascript/script.js b/doc/src/snippets/declarative/integrating-javascript/script.js
new file mode 100644
index 0000000..f7099f8
--- /dev/null
+++ b/doc/src/snippets/declarative/integrating-javascript/script.js
@@ -0,0 +1,47 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+//![0]
+// script.js
+
+function jsFunction() {
+ console.log("Called JavaScript function!")
+}
+//![0]
+
diff --git a/doc/src/snippets/declarative/keynavigation.qml b/doc/src/snippets/declarative/keynavigation.qml
new file mode 100644
index 0000000..e11cdf1
--- /dev/null
+++ b/doc/src/snippets/declarative/keynavigation.qml
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+//![0]
+import QtQuick 1.0
+
+Grid {
+ width: 100; height: 100
+ columns: 2
+
+ Rectangle {
+ id: topLeft
+ width: 50; height: 50
+ color: focus ? "red" : "lightgray"
+ focus: true
+
+ KeyNavigation.right: topRight
+ KeyNavigation.down: bottomLeft
+ }
+
+ Rectangle {
+ id: topRight
+ width: 50; height: 50
+ color: focus ? "red" : "lightgray"
+
+ KeyNavigation.left: topLeft
+ KeyNavigation.down: bottomRight
+ }
+
+ Rectangle {
+ id: bottomLeft
+ width: 50; height: 50
+ color: focus ? "red" : "lightgray"
+
+ KeyNavigation.right: bottomRight
+ KeyNavigation.up: topLeft
+ }
+
+ Rectangle {
+ id: bottomRight
+ width: 50; height: 50
+ color: focus ? "red" : "lightgray"
+
+ KeyNavigation.left: bottomLeft
+ KeyNavigation.up: topRight
+ }
+}
+//![0]
diff --git a/doc/src/snippets/declarative/listview/listview.qml b/doc/src/snippets/declarative/listview/listview.qml
index 8ba47a8..370429e 100644
--- a/doc/src/snippets/declarative/listview/listview.qml
+++ b/doc/src/snippets/declarative/listview/listview.qml
@@ -127,10 +127,16 @@ ListView {
Component {
id: contactsDelegate
- Text {
- id: contactInfo
- text: name + ": " + number
- color: contactInfo.ListView.isCurrentItem ? "red" : "black"
+ Rectangle {
+ id: wrapper
+ width: 180
+ height: contactInfo.height
+ color: ListView.isCurrentItem ? "black" : "red"
+ Text {
+ id: contactInfo
+ text: name + ": " + number
+ color: wrapper.ListView.isCurrentItem ? "red" : "black"
+ }
}
}
diff --git a/doc/src/snippets/declarative/pathview/pathattributes.qml b/doc/src/snippets/declarative/pathview/pathattributes.qml
index d6dacdb..be933e0 100644
--- a/doc/src/snippets/declarative/pathview/pathattributes.qml
+++ b/doc/src/snippets/declarative/pathview/pathattributes.qml
@@ -52,8 +52,8 @@ Rectangle {
scale: PathView.iconScale
opacity: PathView.iconOpacity
Column {
- Image { anchors.horizontalCenter: name.horizontalCenter; width: 64; height: 64; source: icon }
- Text { text: name; font.pointSize: 16}
+ Image { anchors.horizontalCenter: nameText.horizontalCenter; width: 64; height: 64; source: icon }
+ Text { id: nameText; text: name; font.pointSize: 16 }
}
}
}
diff --git a/doc/src/snippets/declarative/pathview/pathview.qml b/doc/src/snippets/declarative/pathview/pathview.qml
index 93298c4..e5e90a4 100644
--- a/doc/src/snippets/declarative/pathview/pathview.qml
+++ b/doc/src/snippets/declarative/pathview/pathview.qml
@@ -48,8 +48,18 @@ Rectangle {
Component {
id: delegate
Column {
- Image { anchors.horizontalCenter: name.horizontalCenter; width: 64; height: 64; source: icon }
- Text { text: name; font.pointSize: 16 }
+ id: wrapper
+ Image {
+ anchors.horizontalCenter: nameText.horizontalCenter
+ width: 64; height: 64
+ source: icon
+ }
+ Text {
+ id: nameText
+ text: name
+ font.pointSize: 16
+ color: wrapper.PathView.isCurrentItem ? "red" : "black"
+ }
}
}
//! [1]
diff --git a/doc/src/snippets/declarative/qml-extending-types/components/Button.qml b/doc/src/snippets/declarative/qml-extending-types/components/Button.qml
new file mode 100644
index 0000000..43fe0e2
--- /dev/null
+++ b/doc/src/snippets/declarative/qml-extending-types/components/Button.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$
+**
+****************************************************************************/
+//![0]
+// Button.qml
+import QtQuick 1.0
+
+Rectangle {
+ width: 100; height: 100
+ color: "red"
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: console.log("Button clicked!")
+ }
+}
+//![0]
diff --git a/doc/src/snippets/declarative/qml-extending-types/components/application.qml b/doc/src/snippets/declarative/qml-extending-types/components/application.qml
new file mode 100644
index 0000000..0c3b0df
--- /dev/null
+++ b/doc/src/snippets/declarative/qml-extending-types/components/application.qml
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+//![0]
+// application.qml
+import QtQuick 1.0
+
+Column {
+ Button { width: 50; height: 50 }
+ Button { x: 50; width: 100; height: 50; color: "blue" }
+ Button { width: 50; height: 50; radius: 8 }
+}
+//![0]
diff --git a/doc/src/snippets/declarative/qml-extending-types/methods/app.qml b/doc/src/snippets/declarative/qml-extending-types/methods/app.qml
new file mode 100644
index 0000000..3b5f008
--- /dev/null
+++ b/doc/src/snippets/declarative/qml-extending-types/methods/app.qml
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+import QtQuick 1.0
+//![0]
+Rectangle {
+ id: rect
+ width: 100; height: 100
+
+ function say(text) {
+ console.log("You said: " + text);
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: rect.say("Mouse clicked")
+ }
+}
+//![0]
diff --git a/doc/src/snippets/declarative/qml-extending-types/properties/ImageViewer.qml b/doc/src/snippets/declarative/qml-extending-types/properties/ImageViewer.qml
new file mode 100644
index 0000000..e37db9c
--- /dev/null
+++ b/doc/src/snippets/declarative/qml-extending-types/properties/ImageViewer.qml
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+//![0]
+// ImageViewer.qml
+import QtQuick 1.0
+
+Item {
+ id: item
+ width: 200; height: 200
+
+ property string currentImage: "default-image.png"
+
+ Image { source: item.currentImage }
+}
+//![0]
diff --git a/doc/src/snippets/declarative/qml-extending-types/properties/alias-override.qml b/doc/src/snippets/declarative/qml-extending-types/properties/alias-override.qml
new file mode 100644
index 0000000..aab2748
--- /dev/null
+++ b/doc/src/snippets/declarative/qml-extending-types/properties/alias-override.qml
@@ -0,0 +1,48 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+import QtQuick 1.0
+//![0]
+Rectangle {
+ property alias color: childRect.color
+ color: "red"
+
+ Rectangle { id: childRect }
+}
+//![0]
diff --git a/doc/src/snippets/declarative/qml-extending-types/properties/alias.qml b/doc/src/snippets/declarative/qml-extending-types/properties/alias.qml
new file mode 100644
index 0000000..1bda447
--- /dev/null
+++ b/doc/src/snippets/declarative/qml-extending-types/properties/alias.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$
+**
+****************************************************************************/
+//![0]
+// Button.qml
+import QtQuick 1.0
+
+Item {
+ property alias buttonText: textItem.text
+
+ width: 200; height: 50
+
+ Text { id: textItem }
+}
+//![0]
diff --git a/doc/src/snippets/declarative/qml-extending-types/properties/alias/ImageViewer.qml b/doc/src/snippets/declarative/qml-extending-types/properties/alias/ImageViewer.qml
new file mode 100644
index 0000000..7f50674
--- /dev/null
+++ b/doc/src/snippets/declarative/qml-extending-types/properties/alias/ImageViewer.qml
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+//![0]
+// ImageViewer.qml
+import QtQuick 1.0
+
+Item {
+ id: item
+ width: 200; height: 200
+
+ property alias currentImage: image
+
+ Image { id: image }
+}
+//![0]
diff --git a/doc/src/snippets/declarative/qml-extending-types/properties/alias/application.qml b/doc/src/snippets/declarative/qml-extending-types/properties/alias/application.qml
new file mode 100644
index 0000000..3592e60
--- /dev/null
+++ b/doc/src/snippets/declarative/qml-extending-types/properties/alias/application.qml
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+//![0]
+// application.qml
+import QtQuick 1.0
+
+ImageViewer {
+ id: viewer
+
+ currentImage.source: "http://qt.nokia.com/logo.png"
+ currentImage.width: width
+ currentImage.height: height
+ currentImage.fillMode: Image.Tile
+
+ Text { text: currentImage.source }
+}
+//![0]
diff --git a/doc/src/snippets/declarative/qml-extending-types/properties/application.qml b/doc/src/snippets/declarative/qml-extending-types/properties/application.qml
new file mode 100644
index 0000000..4978f05
--- /dev/null
+++ b/doc/src/snippets/declarative/qml-extending-types/properties/application.qml
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+//![0]
+import QtQuick 1.0
+
+ImageViewer {
+ id: viewer
+
+ currentImage: "http://qt.nokia.com/logo.png"
+
+ Text { text: viewer.currentImage }
+}
+//![0]
diff --git a/doc/src/snippets/declarative/qml-extending-types/properties/property-signals.qml b/doc/src/snippets/declarative/qml-extending-types/properties/property-signals.qml
new file mode 100644
index 0000000..1d1b325
--- /dev/null
+++ b/doc/src/snippets/declarative/qml-extending-types/properties/property-signals.qml
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+import QtQuick 1.0
+//![0]
+Item {
+ property int myNumber
+
+ onMyNumberChanged: { console.log("myNumber has changed:", myNumber); }
+
+ Component.onCompleted: myNumber = 100
+}
+//![0]
diff --git a/doc/src/snippets/declarative/qml-extending-types/signals/Button.qml b/doc/src/snippets/declarative/qml-extending-types/signals/Button.qml
new file mode 100644
index 0000000..9272572
--- /dev/null
+++ b/doc/src/snippets/declarative/qml-extending-types/signals/Button.qml
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+import QtQuick 1.0
+
+//![0]
+// Button.qml
+Rectangle {
+ id: rect
+ width: 100; height: 100
+
+ signal buttonClicked(int xPos, int yPos)
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: rect.buttonClicked(mouse.x, mouse.y)
+ }
+}
+//![0]
diff --git a/doc/src/snippets/declarative/qml-extending-types/signals/basic.qml b/doc/src/snippets/declarative/qml-extending-types/signals/basic.qml
new file mode 100644
index 0000000..272c972
--- /dev/null
+++ b/doc/src/snippets/declarative/qml-extending-types/signals/basic.qml
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+//![0]
+// Button.qml
+import QtQuick 1.0
+
+Rectangle {
+ id: rect
+ width: 100; height: 100
+
+ signal buttonClicked
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: rect.buttonClicked()
+ }
+}
+//![0]
diff --git a/doc/src/snippets/declarative/qml-extending-types/signals/connectdynamic.qml b/doc/src/snippets/declarative/qml-extending-types/signals/connectdynamic.qml
new file mode 100644
index 0000000..4b1f217
--- /dev/null
+++ b/doc/src/snippets/declarative/qml-extending-types/signals/connectdynamic.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$
+**
+****************************************************************************/
+import QtQuick 1.0
+//![0]
+Item {
+ id: item
+ width: 300; height: 100
+
+ function myMethod() {
+ console.log("Button was clicked!")
+ }
+
+ Row { id: row }
+
+ Component.onCompleted: {
+ var component = Qt.createComponent("Button.qml")
+ for (var i=0; i<3; i++) {
+ var button = component.createObject(row)
+ button.border.width = 1
+ button.buttonClicked.connect(myMethod)
+ }
+ }
+}
+//![0]
diff --git a/doc/src/snippets/declarative/qml-extending-types/signals/connectslots.qml b/doc/src/snippets/declarative/qml-extending-types/signals/connectslots.qml
new file mode 100644
index 0000000..ae14281
--- /dev/null
+++ b/doc/src/snippets/declarative/qml-extending-types/signals/connectslots.qml
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+import QtQuick 1.0
+//![0]
+Item {
+ id: item
+ width: 200; height: 200
+
+ function myMethod() {
+ console.log("Button was clicked!")
+ }
+
+ Button {
+ id: button
+ anchors.fill: parent
+ Component.onCompleted: buttonClicked.connect(item.myMethod)
+ }
+}
+//![0]
diff --git a/doc/src/snippets/declarative/qml-extending-types/signals/no-parameters.qml b/doc/src/snippets/declarative/qml-extending-types/signals/no-parameters.qml
new file mode 100644
index 0000000..742ab18
--- /dev/null
+++ b/doc/src/snippets/declarative/qml-extending-types/signals/no-parameters.qml
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+//![0]
+// application.qml
+import QtQuick 1.0
+
+Button {
+ width: 100; height: 100
+ onButtonClicked: console.log("Mouse was clicked")
+}
+//![0]
+
diff --git a/doc/src/snippets/declarative/qml-extending-types/signals/parameters.qml b/doc/src/snippets/declarative/qml-extending-types/signals/parameters.qml
new file mode 100644
index 0000000..f513f5f
--- /dev/null
+++ b/doc/src/snippets/declarative/qml-extending-types/signals/parameters.qml
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+import QtQuick 1.0
+//![0]
+// application.qml
+Button {
+ width: 100; height: 100
+ onButtonClicked: {
+ console.log("Mouse clicked at " + xPos + "," + yPos)
+ }
+}
+//![0]
+
diff --git a/doc/src/snippets/declarative/qtbinding/newelements/imageviewer.h b/doc/src/snippets/declarative/qtbinding/newelements/imageviewer.h
index fd9db5e..cec9757 100644
--- a/doc/src/snippets/declarative/qtbinding/newelements/imageviewer.h
+++ b/doc/src/snippets/declarative/qtbinding/newelements/imageviewer.h
@@ -37,10 +37,10 @@
** $QT_END_LICENSE$
**
****************************************************************************/
+//![0]
#include <QtCore>
#include <QtDeclarative>
-//![0]
class ImageViewer : public QDeclarativeItem
{
Q_OBJECT
diff --git a/doc/src/snippets/declarative/qtbinding/variantlistmap/MyItem.qml b/doc/src/snippets/declarative/qtbinding/variantlistmap/MyItem.qml
new file mode 100644
index 0000000..dd59fed
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/variantlistmap/MyItem.qml
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+import QtQuick 1.0
+
+//![0]
+// MyItem.qml
+Item {
+ function readValues(anArray, anObject) {
+ for (var i=0; i<anArray.length; i++)
+ console.log("Array item:", anArray[i])
+
+ for (var prop in anObject) {
+ console.log("Object item:", prop, "=", anObject[prop])
+ }
+ }
+}
+//![0]
diff --git a/doc/src/snippets/declarative/qtbinding/variantlistmap/main.cpp b/doc/src/snippets/declarative/qtbinding/variantlistmap/main.cpp
new file mode 100644
index 0000000..9986264
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/variantlistmap/main.cpp
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+#include <QtCore>
+#include <QtDeclarative>
+
+int main(int argc, char *argv[]) {
+ QApplication app(argc, argv);
+
+//![0]
+// C++
+QDeclarativeView view(QUrl::fromLocalFile("MyItem.qml"));
+
+QVariantList list;
+list << 10 << Qt::green << "bottles";
+
+QVariantMap map;
+map.insert("language", "QML");
+map.insert("released", QDate(2010, 9, 21));
+
+QMetaObject::invokeMethod(view.rootObject(), "readValues",
+ Q_ARG(QVariant, QVariant::fromValue(list)),
+ Q_ARG(QVariant, QVariant::fromValue(map)));
+//![0]
+
+ view.setSource(QUrl::fromLocalFile("MyItem.qml"));
+ view.show();
+
+ return app.exec();
+}
+
diff --git a/doc/src/snippets/declarative/qtbinding/variantlistmap/variantlistmap.pro b/doc/src/snippets/declarative/qtbinding/variantlistmap/variantlistmap.pro
new file mode 100644
index 0000000..68eeaf2
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/variantlistmap/variantlistmap.pro
@@ -0,0 +1,2 @@
+QT += declarative
+SOURCES += main.cpp
diff --git a/doc/src/widgets-and-layouts/gallery-cde.qdoc b/doc/src/widgets-and-layouts/gallery-cde.qdoc
index c783399..69287b9 100644
--- a/doc/src/widgets-and-layouts/gallery-cde.qdoc
+++ b/doc/src/widgets-and-layouts/gallery-cde.qdoc
@@ -34,345 +34,100 @@
This page shows some of the widgets available in Qt
when configured to use the "cde" style.
-\raw HTML
-<h2 align="center">Buttons</h2>
+\section2 Buttons
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-pushbutton.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cde-toolbutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QPushButton widget provides a command button.
-\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-checkbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cde-radiobutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QCheckBox widget provides a checkbox with a text label.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QRadioButton widget provides a radio button with a text or pixmap label.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Containers</h2>
+\table 100%
+\row
+\o \image cde-checkbox.png
+ \caption The QCheckBox widget provides a checkbox with a text label.
+\o \image cde-radiobutton.png
+ \caption The QRadioButton widget provides a radio button with a text or pixmap label.
+\o \image cde-pushbutton.png
+ \image cde-toolbutton.png
+ \caption The QPushButton widget provides a command button.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-groupbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cde-tabwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QGroupBox widget provides a group box frame with a title.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTabWidget class provides a stack of tabbed widgets.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-frame.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cde-toolbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFrame widget provides a simple decorated container for other widgets.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolBox class provides a column of tabbed widget items.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Item Views</h2>
+\section2 Containers
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-listview.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cde-treeview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-tableview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Display Widgets</h2>
+\table 100%
+\row
+\o \image cde-groupbox.png
+ The The QGroupBox widget provides a group box frame with a title.
+\o \image cde-tabwidget.png
+ The QTabWidget class provides a stack of tabbed widgets.
+\o \image cde-frame.png
+ The QFrame widget provides a simple decorated container for other widgets.
+\o \image cde-toolbox.png
+ The QToolBox class provides a column of tabbed widget items.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-progressbar.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cde-lcdnumber.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QProgressBar widget provides a horizontal progress bar.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLCDNumber widget displays a number with LCD-like digits.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-label.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QLabel widget provides a text or image display.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Input Widgets</h2>
+\section2 Item Views
+
+\table 100%
+\row
+\o \image cde-listview.png
+ The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.
+\o \image cde-treeview.png
+ The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.
+\o \image cde-tableview.png
+ The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\o
+\o
+\endtable
+
+\section2 Display Widgets
+
+\table 100%
+\row
+\o \image cde-progressbar.png
+ The QProgressBar widget provides a horizontal progress bar.
+\o \image cde-label.png
+ The QLabel widget provides a text or image display.
+\o \image cde-lcdnumber.png
+ The QLCDNumber widget displays a number with LCD-like digits.
+\endtable
+
+\section2 Input Widgets
+
+\table 100%
+\row
+\o \image cde-lineedit.png
+ The QLineEdit widget is a one-line text editor.
+\o \image cde-dateedit.png
+ The QDateEdit class provides a widget for editing dates.
+\o \image cde-timeedit.png
+ The QTimeEdit class provides a widget for editing times.
+\o \image cde-datetimeedit.png
+ The QDateTimeEdit class provides a widget for editing dates and times.
+\endtable
+
+\table 100%
+\row
+\o \image cde-slider.png
+ The QSlider widget provides a vertical or horizontal slider.
+\o \image cde-combobox.png
+ The QComboBox widget is a combined button and pop-up list.
+\o \image cde-spinbox.png
+ The QSpinBox class provides a spin box widget.
+\endtable
+
+\table 100%
+\row
+\o \image cde-fontcombobox.png
+ The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.
+\o \image cde-doublespinbox.png
+ The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.
+\o \image cde-horizontalscrollbar.png
+ The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.
+\endtable
+
+\table 100%
+\row
+\o \image cde-dial.png
+ The QDial class provides a rounded range control (like a speedometer or potentiometer).
+\o \image cde-textedit.png
+ The QTextEdit class provides a widget that is used to edit and display both plain and rich text.
+\o \image cde-calendarwidget.png
+ The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-slider.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cde-lineedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSlider widget provides a vertical or horizontal slider.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLineEdit widget is a one-line text editor.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-combobox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cde-doublespinbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QComboBox widget is a combined button and pop-up list.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-spinbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cde-timeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSpinBox class provides a spin box widget.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTimeEdit class provides a widget for editing times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-dateedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cde-datetimeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDateEdit class provides a widget for editing dates.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDateTimeEdit class provides a widget for editing dates and times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-textedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cde-horizontalscrollbar.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTextEdit class provides a widget that is used to edit and
- display both plain and rich text.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-dial.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cde-calendarwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDial class provides a rounded range control (like a
- speedometer or potentiometer).\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cde-fontcombobox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
*/
diff --git a/doc/src/widgets-and-layouts/gallery-cleanlooks.qdoc b/doc/src/widgets-and-layouts/gallery-cleanlooks.qdoc
index d03adc8..59e2934 100644
--- a/doc/src/widgets-and-layouts/gallery-cleanlooks.qdoc
+++ b/doc/src/widgets-and-layouts/gallery-cleanlooks.qdoc
@@ -34,345 +34,105 @@
This page shows some of the widgets available in Qt
when configured to use the "cleanlooks" style.
-\raw HTML
-<h2 align="center">Buttons</h2>
+\section2 Buttons
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-pushbutton.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-toolbutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QPushButton widget provides a command button.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolButton class provides a quick-access button to commands
- or options, usually used inside a QToolBar.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-checkbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-radiobutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QCheckBox widget provides a checkbox with a text label.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QRadioButton widget provides a radio button with a text or pixmap label.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Containers</h2>
+\table 100%
+\row
+\o \image cleanlooks-pushbutton.png
+ \caption The QPushButton widget provides a command button.
+\o \image cleanlooks-toolbutton.png
+ \caption The QToolButton class provides a quick-access button to commands
+ or options, usually used inside a QToolBar.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-groupbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-tabwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QGroupBox widget provides a group box frame with a title.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTabWidget class provides a stack of tabbed widgets.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-frame.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-toolbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFrame widget provides a simple decorated container for other widgets.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolBox class provides a column of tabbed widget items.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Item Views</h2>
+\table 100%
+\row
+\o \image cleanlooks-checkbox.png
+ \caption The QCheckBox widget provides a checkbox with a text label.
+\o \image cleanlooks-radiobutton.png
+ \caption The QRadioButton widget provides a radio button with a text or pixmap label.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-listview.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-treeview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-tableview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Display Widgets</h2>
+\section2 Containers
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-progressbar.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-lcdnumber.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QProgressBar widget provides a horizontal progress bar.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLCDNumber widget displays a number with LCD-like digits.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-label.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QLabel widget provides a text or image display.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Input Widgets</h2>
+\table 100%
+\row
+\o \image cleanlooks-groupbox.png
+ The The QGroupBox widget provides a group box frame with a title.
+\o \image cleanlooks-tabwidget.png
+ The QTabWidget class provides a stack of tabbed widgets.
+\o \image cleanlooks-frame.png
+ The QFrame widget provides a simple decorated container for other widgets.
+\o \image cleanlooks-toolbox.png
+ The QToolBox class provides a column of tabbed widget items.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-slider.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-lineedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSlider widget provides a vertical or horizontal slider.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLineEdit widget is a one-line text editor.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-combobox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-doublespinbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QComboBox widget is a combined button and pop-up list.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-spinbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-timeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSpinBox class provides a spin box widget.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTimeEdit class provides a widget for editing times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-dateedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-datetimeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDateEdit class provides a widget for editing dates.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDateTimeEdit class provides a widget for editing dates and times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-textedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-horizontalscrollbar.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTextEdit class provides a widget that is used to edit and
- display both plain and rich text.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-dial.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-calendarwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDial class provides a rounded range control (like a
- speedometer or potentiometer).\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage cleanlooks-fontcombobox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
+\section2 Item Views
+
+\table 100%
+\row
+\o \image cleanlooks-listview.png
+ The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.
+\o \image cleanlooks-treeview.png
+ The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.
+\o \image cleanlooks-tableview.png
+ The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\o
+\o
+\endtable
+
+\section2 Display Widgets
+
+\table 100%
+\row
+\o \image cleanlooks-progressbar.png
+ The QProgressBar widget provides a horizontal progress bar.
+\o \image cleanlooks-label.png
+ The QLabel widget provides a text or image display.
+\o \image cleanlooks-lcdnumber.png
+ The QLCDNumber widget displays a number with LCD-like digits.
+\endtable
+
+\section2 Input Widgets
+
+\table 100%
+\row
+\o \image cleanlooks-lineedit.png
+ The QLineEdit widget is a one-line text editor.
+\o \image cleanlooks-dateedit.png
+ The QDateEdit class provides a widget for editing dates.
+\o \image cleanlooks-timeedit.png
+ The QTimeEdit class provides a widget for editing times.
+\o \image cleanlooks-datetimeedit.png
+ The QDateTimeEdit class provides a widget for editing dates and times.
+\endtable
+
+\table 100%
+\row
+\o \image cleanlooks-slider.png
+ The QSlider widget provides a vertical or horizontal slider.
+\o \image cleanlooks-combobox.png
+ The QComboBox widget is a combined button and pop-up list.
+\o \image cleanlooks-spinbox.png
+ The QSpinBox class provides a spin box widget.
+\endtable
+
+\table 100%
+\row
+\o \image cleanlooks-fontcombobox.png
+ The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.
+\o \image cleanlooks-doublespinbox.png
+ The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.
+\o \image cleanlooks-horizontalscrollbar.png
+ The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.
+\endtable
+
+\table 100%
+\row
+\o \image cleanlooks-dial.png
+ The QDial class provides a rounded range control (like a speedometer or potentiometer).
+\o \image cleanlooks-textedit.png
+ The QTextEdit class provides a widget that is used to edit and display both plain and rich text.
+\o \image cleanlooks-calendarwidget.png
+ The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.
+\endtable
*/
diff --git a/doc/src/widgets-and-layouts/gallery-gtk.qdoc b/doc/src/widgets-and-layouts/gallery-gtk.qdoc
index b3a6372..b2f8458 100644
--- a/doc/src/widgets-and-layouts/gallery-gtk.qdoc
+++ b/doc/src/widgets-and-layouts/gallery-gtk.qdoc
@@ -37,349 +37,105 @@
Take a look at the \l{Qt Widget Gallery} to see how Qt
applications appear in other styles.
-\raw HTML
-<h2 align="center">Buttons</h2>
+\section2 Buttons
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-pushbutton.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage gtk-toolbutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td align="justify" valign="top">
-\endraw
-The QPushButton widget provides a command button.\raw HTML
-</td>
-<td align="justify" valign="top">
-\endraw
-The QToolButton class provides a quick-access button to commands
- or options, usually used inside a QToolBar.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-checkbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage gtk-radiobutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td align="justify" valign="top">
-\endraw
-The QCheckBox widget provides a checkbox with a text label.\raw HTML
-</td>
-<td align="justify" valign="top">
-\endraw
-The QRadioButton widget provides a radio button with a text or pixmap label.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Containers</h2>
+\table 100%
+\row
+\o \image gtk-pushbutton.png
+ \caption The QPushButton widget provides a command button.
+\o \image gtk-toolbutton.png
+ \caption The QToolButton class provides a quick-access button to commands
+ or options, usually used inside a QToolBar.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-groupbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage gtk-tabwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td align="justify" valign="top">
-\endraw
-The QGroupBox widget provides a group box frame with a title.\raw HTML
-</td>
-<td align="justify" valign="top">
-\endraw
-The QTabWidget class provides a stack of tabbed widgets.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-toolbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage gtk-frame.png
-\raw HTML
-</td>
-</tr><tr>
-<td align="justify" valign="top">
-\endraw
-The QToolBox class provides a column of tabbed widget items.\raw HTML
-</td>
-<td align="justify" valign="top">
-\endraw
-The QFrame widget provides a simple decorated container for other widgets.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Item Views</h2>
+\table 100%
+\row
+\o \image gtk-checkbox.png
+ \caption The QCheckBox widget provides a checkbox with a text label.
+\o \image gtk-radiobutton.png
+ \caption The QRadioButton widget provides a radio button with a text or pixmap label.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-listview.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage gtk-treeview.png
-\raw HTML
-</td>
-</tr><tr>
-<td align="justify" valign="top">
-\endraw
-The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.\raw HTML
-</td>
-<td align="justify" valign="top">
-\endraw
-The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-tableview.png
-\raw HTML
-</td>
-</tr><tr>
-<td align="justify" valign="top">
-\endraw
-The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\raw HTML
-</td>
-<td align="justify" valign="top">
-\endraw
-\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Display Widgets</h2>
+\section2 Containers
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-progressbar.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage gtk-lcdnumber.png
-\raw HTML
-</td>
-</tr><tr>
-<td align="justify" valign="top">
-\endraw
-The QProgressBar widget provides a horizontal progress bar.\raw HTML
-</td>
-<td align="justify" valign="top">
-\endraw
-The QLCDNumber widget displays a number with LCD-like digits.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-label.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QLabel widget provides a text or image display.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Input Widgets</h2>
+\table 100%
+\row
+\o \image gtk-groupbox.png
+ The The QGroupBox widget provides a group box frame with a title.
+\o \image gtk-tabwidget.png
+ The QTabWidget class provides a stack of tabbed widgets.
+\o \image gtk-frame.png
+ The QFrame widget provides a simple decorated container for other widgets.
+\o \image gtk-toolbox.png
+ The QToolBox class provides a column of tabbed widget items.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-slider.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage gtk-lineedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td align="justify" valign="top">
-\endraw
-The QSlider widget provides a vertical or horizontal slider.\raw HTML
-</td>
-<td align="justify" valign="top">
-\endraw
-The QLineEdit widget is a one-line text editor.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-combobox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage gtk-doublespinbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td align="justify" valign="top">
-\endraw
-The QComboBox widget is a combined button and pop-up list.\raw HTML
-</td>
-<td align="justify" valign="top">
-\endraw
-The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-spinbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage gtk-timeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td align="justify" valign="top">
-\endraw
-The QSpinBox class provides a spin box widget.\raw HTML
-</td>
-<td align="justify" valign="top">
-\endraw
-The QTimeEdit class provides a widget for editing times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-dateedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage gtk-datetimeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td align="justify" valign="top">
-\endraw
-The QDateEdit class provides a widget for editing dates.\raw HTML
-</td>
-<td align="justify" valign="top">
-\endraw
-The QDateTimeEdit class provides a widget for editing dates and times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-textedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage gtk-horizontalscrollbar.png
-\raw HTML
-</td>
-</tr><tr>
-<td align="justify" valign="top">
-\endraw
-The QTextEdit class provides a widget that is used to edit and
- display both plain and rich text.\raw HTML
-</td>
-<td align="justify" valign="top">
-\endraw
-The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-dial.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage gtk-calendarwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td align="justify" valign="top">
-\endraw
-The QDial class provides a rounded range control (like a
- speedometer or potentiometer).\raw HTML
-</td>
-<td align="justify" valign="top">
-\endraw
-The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage gtk-fontcombobox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
+\section2 Item Views
+
+\table 100%
+\row
+\o \image gtk-listview.png
+ The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.
+\o \image gtk-treeview.png
+ The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.
+\o \image gtk-tableview.png
+ The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\o
+\o
+\endtable
+
+\section2 Display Widgets
+
+\table 100%
+\row
+\o \image gtk-progressbar.png
+ The QProgressBar widget provides a horizontal progress bar.
+\o \image gtk-label.png
+ The QLabel widget provides a text or image display.
+\o \image gtk-lcdnumber.png
+ The QLCDNumber widget displays a number with LCD-like digits.
+\endtable
+
+\section2 Input Widgets
+
+\table 100%
+\row
+\o \image gtk-lineedit.png
+ The QLineEdit widget is a one-line text editor.
+\o \image gtk-dateedit.png
+ The QDateEdit class provides a widget for editing dates.
+\o \image gtk-timeedit.png
+ The QTimeEdit class provides a widget for editing times.
+\o \image gtk-datetimeedit.png
+ The QDateTimeEdit class provides a widget for editing dates and times.
+\endtable
+
+\table 100%
+\row
+\o \image gtk-slider.png
+ The QSlider widget provides a vertical or horizontal slider.
+\o \image gtk-combobox.png
+ The QComboBox widget is a combined button and pop-up list.
+\o \image gtk-spinbox.png
+ The QSpinBox class provides a spin box widget.
+\endtable
+
+\table 100%
+\row
+\o \image gtk-fontcombobox.png
+ The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.
+\o \image gtk-doublespinbox.png
+ The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.
+\o \image gtk-horizontalscrollbar.png
+ The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.
+\endtable
+
+\table 100%
+\row
+\o \image gtk-dial.png
+ The QDial class provides a rounded range control (like a speedometer or potentiometer).
+\o \image gtk-textedit.png
+ The QTextEdit class provides a widget that is used to edit and display both plain and rich text.
+\o \image gtk-calendarwidget.png
+ The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.
+\endtable
*/
diff --git a/doc/src/widgets-and-layouts/gallery-macintosh.qdoc b/doc/src/widgets-and-layouts/gallery-macintosh.qdoc
index 30a78ca..44d7eb9 100644
--- a/doc/src/widgets-and-layouts/gallery-macintosh.qdoc
+++ b/doc/src/widgets-and-layouts/gallery-macintosh.qdoc
@@ -34,345 +34,105 @@
This page shows some of the widgets available in Qt
when configured to use the "macintosh" style.
-\raw HTML
-<h2 align="center">Buttons</h2>
+\section2 Buttons
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-pushbutton.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage macintosh-toolbutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QPushButton widget provides a command button.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolButton class provides a quick-access button to commands
- or options, usually used inside a QToolBar.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-checkbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage macintosh-radiobutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QCheckBox widget provides a checkbox with a text label.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QRadioButton widget provides a radio button with a text or pixmap label.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Containers</h2>
+\table 100%
+\row
+\o \image macintosh-pushbutton.png
+ \caption The QPushButton widget provides a command button.
+\o \image macintosh-toolbutton.png
+ \caption The QToolButton class provides a quick-access button to commands
+ or options, usually used inside a QToolBar.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-groupbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage macintosh-tabwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QGroupBox widget provides a group box frame with a title.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTabWidget class provides a stack of tabbed widgets.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-frame.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage macintosh-toolbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFrame widget provides a simple decorated container for other widgets.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolBox class provides a column of tabbed widget items.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Item Views</h2>
+\table 100%
+\row
+\o \image macintosh-checkbox.png
+ \caption The QCheckBox widget provides a checkbox with a text label.
+\o \image macintosh-radiobutton.png
+ \caption The QRadioButton widget provides a radio button with a text or pixmap label.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-listview.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage macintosh-treeview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-tableview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Display Widgets</h2>
+\section2 Containers
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-progressbar.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage macintosh-lcdnumber.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QProgressBar widget provides a horizontal progress bar.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLCDNumber widget displays a number with LCD-like digits.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-label.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QLabel widget provides a text or image display.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Input Widgets</h2>
+\table 100%
+\row
+\o \image macintosh-groupbox.png
+ The The QGroupBox widget provides a group box frame with a title.
+\o \image macintosh-tabwidget.png
+ The QTabWidget class provides a stack of tabbed widgets.
+\o \image macintosh-frame.png
+ The QFrame widget provides a simple decorated container for other widgets.
+\o \image macintosh-toolbox.png
+ The QToolBox class provides a column of tabbed widget items.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-slider.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage macintosh-lineedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSlider widget provides a vertical or horizontal slider.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLineEdit widget is a one-line text editor.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-combobox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage macintosh-doublespinbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QComboBox widget is a combined button and pop-up list.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-spinbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage macintosh-timeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSpinBox class provides a spin box widget.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTimeEdit class provides a widget for editing times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-dateedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage macintosh-datetimeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDateEdit class provides a widget for editing dates.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDateTimeEdit class provides a widget for editing dates and times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-textedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage macintosh-horizontalscrollbar.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTextEdit class provides a widget that is used to edit and
- display both plain and rich text.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-dial.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage macintosh-calendarwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDial class provides a rounded range control (like a
- speedometer or potentiometer).\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage macintosh-fontcombobox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
+\section2 Item Views
+
+\table 100%
+\row
+\o \image macintosh-listview.png
+ The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.
+\o \image macintosh-treeview.png
+ The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.
+\o \image macintosh-tableview.png
+ The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\o
+\o
+\endtable
+
+\section2 Display Widgets
+
+\table 100%
+\row
+\o \image macintosh-progressbar.png
+ The QProgressBar widget provides a horizontal progress bar.
+\o \image macintosh-label.png
+ The QLabel widget provides a text or image display.
+\o \image macintosh-lcdnumber.png
+ The QLCDNumber widget displays a number with LCD-like digits.
+\endtable
+
+\section2 Input Widgets
+
+\table 100%
+\row
+\o \image macintosh-lineedit.png
+ The QLineEdit widget is a one-line text editor.
+\o \image macintosh-dateedit.png
+ The QDateEdit class provides a widget for editing dates.
+\o \image macintosh-timeedit.png
+ The QTimeEdit class provides a widget for editing times.
+\o \image macintosh-datetimeedit.png
+ The QDateTimeEdit class provides a widget for editing dates and times.
+\endtable
+
+\table 100%
+\row
+\o \image macintosh-slider.png
+ The QSlider widget provides a vertical or horizontal slider.
+\o \image macintosh-combobox.png
+ The QComboBox widget is a combined button and pop-up list.
+\o \image macintosh-spinbox.png
+ The QSpinBox class provides a spin box widget.
+\endtable
+
+\table 100%
+\row
+\o \image macintosh-fontcombobox.png
+ The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.
+\o \image macintosh-doublespinbox.png
+ The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.
+\o \image macintosh-horizontalscrollbar.png
+ The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.
+\endtable
+
+\table 100%
+\row
+\o \image macintosh-dial.png
+ The QDial class provides a rounded range control (like a speedometer or potentiometer).
+\o \image macintosh-textedit.png
+ The QTextEdit class provides a widget that is used to edit and display both plain and rich text.
+\o \image macintosh-calendarwidget.png
+ The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.
+\endtable
*/
diff --git a/doc/src/widgets-and-layouts/gallery-motif.qdoc b/doc/src/widgets-and-layouts/gallery-motif.qdoc
index 861c22a..b9c95c8 100644
--- a/doc/src/widgets-and-layouts/gallery-motif.qdoc
+++ b/doc/src/widgets-and-layouts/gallery-motif.qdoc
@@ -34,345 +34,105 @@
This page shows some of the widgets available in Qt
when configured to use the "motif" style.
-\raw HTML
-<h2 align="center">Buttons</h2>
+\section2 Buttons
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-pushbutton.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage motif-toolbutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QPushButton widget provides a command button.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolButton class provides a quick-access button to commands
- or options, usually used inside a QToolBar.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-checkbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage motif-radiobutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QCheckBox widget provides a checkbox with a text label.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QRadioButton widget provides a radio button with a text or pixmap label.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Containers</h2>
+\table 100%
+\row
+\o \image motif-pushbutton.png
+ \caption The QPushButton widget provides a command button.
+\o \image motif-toolbutton.png
+ \caption The QToolButton class provides a quick-access button to commands
+ or options, usually used inside a QToolBar.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-groupbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage motif-tabwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QGroupBox widget provides a group box frame with a title.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTabWidget class provides a stack of tabbed widgets.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-frame.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage motif-toolbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFrame widget provides a simple decorated container for other widgets.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolBox class provides a column of tabbed widget items.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Item Views</h2>
+\table 100%
+\row
+\o \image motif-checkbox.png
+ \caption The QCheckBox widget provides a checkbox with a text label.
+\o \image motif-radiobutton.png
+ \caption The QRadioButton widget provides a radio button with a text or pixmap label.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-listview.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage motif-treeview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-tableview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Display Widgets</h2>
+\section2 Containers
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-progressbar.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage motif-lcdnumber.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QProgressBar widget provides a horizontal progress bar.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLCDNumber widget displays a number with LCD-like digits.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-label.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QLabel widget provides a text or image display.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Input Widgets</h2>
+\table 100%
+\row
+\o \image motif-groupbox.png
+ The The QGroupBox widget provides a group box frame with a title.
+\o \image motif-tabwidget.png
+ The QTabWidget class provides a stack of tabbed widgets.
+\o \image motif-frame.png
+ The QFrame widget provides a simple decorated container for other widgets.
+\o \image motif-toolbox.png
+ The QToolBox class provides a column of tabbed widget items.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-slider.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage motif-lineedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSlider widget provides a vertical or horizontal slider.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLineEdit widget is a one-line text editor.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-combobox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage motif-doublespinbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QComboBox widget is a combined button and pop-up list.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-spinbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage motif-timeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSpinBox class provides a spin box widget.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTimeEdit class provides a widget for editing times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-dateedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage motif-datetimeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDateEdit class provides a widget for editing dates.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDateTimeEdit class provides a widget for editing dates and times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-textedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage motif-horizontalscrollbar.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTextEdit class provides a widget that is used to edit and
- display both plain and rich text.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-dial.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage motif-calendarwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDial class provides a rounded range control (like a
- speedometer or potentiometer).\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage motif-fontcombobox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
+\section2 Item Views
+
+\table 100%
+\row
+\o \image motif-listview.png
+ The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.
+\o \image motif-treeview.png
+ The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.
+\o \image motif-tableview.png
+ The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\o
+\o
+\endtable
+
+\section2 Display Widgets
+
+\table 100%
+\row
+\o \image motif-progressbar.png
+ The QProgressBar widget provides a horizontal progress bar.
+\o \image motif-label.png
+ The QLabel widget provides a text or image display.
+\o \image motif-lcdnumber.png
+ The QLCDNumber widget displays a number with LCD-like digits.
+\endtable
+
+\section2 Input Widgets
+
+\table 100%
+\row
+\o \image motif-lineedit.png
+ The QLineEdit widget is a one-line text editor.
+\o \image motif-dateedit.png
+ The QDateEdit class provides a widget for editing dates.
+\o \image motif-timeedit.png
+ The QTimeEdit class provides a widget for editing times.
+\o \image motif-datetimeedit.png
+ The QDateTimeEdit class provides a widget for editing dates and times.
+\endtable
+
+\table 100%
+\row
+\o \image motif-slider.png
+ The QSlider widget provides a vertical or horizontal slider.
+\o \image motif-combobox.png
+ The QComboBox widget is a combined button and pop-up list.
+\o \image motif-spinbox.png
+ The QSpinBox class provides a spin box widget.
+\endtable
+
+\table 100%
+\row
+\o \image motif-fontcombobox.png
+ The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.
+\o \image motif-doublespinbox.png
+ The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.
+\o \image motif-horizontalscrollbar.png
+ The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.
+\endtable
+
+\table 100%
+\row
+\o \image motif-dial.png
+ The QDial class provides a rounded range control (like a speedometer or potentiometer).
+\o \image motif-textedit.png
+ The QTextEdit class provides a widget that is used to edit and display both plain and rich text.
+\o \image motif-calendarwidget.png
+ The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.
+\endtable
*/
diff --git a/doc/src/widgets-and-layouts/gallery-plastique.qdoc b/doc/src/widgets-and-layouts/gallery-plastique.qdoc
index 0ea62ee..5f2a1ec 100644
--- a/doc/src/widgets-and-layouts/gallery-plastique.qdoc
+++ b/doc/src/widgets-and-layouts/gallery-plastique.qdoc
@@ -34,345 +34,105 @@
This page shows some of the widgets available in Qt
when configured to use the "plastique" style.
-\raw HTML
-<h2 align="center">Buttons</h2>
+\section2 Buttons
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-pushbutton.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage plastique-toolbutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QPushButton widget provides a command button.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolButton class provides a quick-access button to commands
- or options, usually used inside a QToolBar.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-checkbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage plastique-radiobutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QCheckBox widget provides a checkbox with a text label.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QRadioButton widget provides a radio button with a text or pixmap label.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Containers</h2>
+\table 100%
+\row
+\o \image plastique-pushbutton.png
+ \caption The QPushButton widget provides a command button.
+\o \image plastique-toolbutton.png
+ \caption The QToolButton class provides a quick-access button to commands
+ or options, usually used inside a QToolBar.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-groupbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage plastique-tabwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QGroupBox widget provides a group box frame with a title.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTabWidget class provides a stack of tabbed widgets.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-frame.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage plastique-toolbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFrame widget provides a simple decorated container for other widgets.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolBox class provides a column of tabbed widget items.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Item Views</h2>
+\table 100%
+\row
+\o \image plastique-checkbox.png
+ \caption The QCheckBox widget provides a checkbox with a text label.
+\o \image plastique-radiobutton.png
+ \caption The QRadioButton widget provides a radio button with a text or pixmap label.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-listview.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage plastique-treeview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-tableview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Display Widgets</h2>
+\section2 Containers
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-progressbar.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage plastique-lcdnumber.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QProgressBar widget provides a horizontal progress bar.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLCDNumber widget displays a number with LCD-like digits.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-label.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QLabel widget provides a text or image display.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Input Widgets</h2>
+\table 100%
+\row
+\o \image plastique-groupbox.png
+ The The QGroupBox widget provides a group box frame with a title.
+\o \image plastique-tabwidget.png
+ The QTabWidget class provides a stack of tabbed widgets.
+\o \image plastique-frame.png
+ The QFrame widget provides a simple decorated container for other widgets.
+\o \image plastique-toolbox.png
+ The QToolBox class provides a column of tabbed widget items.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-slider.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage plastique-lineedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSlider widget provides a vertical or horizontal slider.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLineEdit widget is a one-line text editor.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-combobox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage plastique-doublespinbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QComboBox widget is a combined button and pop-up list.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-spinbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage plastique-timeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSpinBox class provides a spin box widget.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTimeEdit class provides a widget for editing times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-dateedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage plastique-datetimeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDateEdit class provides a widget for editing dates.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDateTimeEdit class provides a widget for editing dates and times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-textedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage plastique-horizontalscrollbar.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTextEdit class provides a widget that is used to edit and
- display both plain and rich text.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-dial.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage plastique-calendarwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDial class provides a rounded range control (like a
- speedometer or potentiometer).\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage plastique-fontcombobox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
+\section2 Item Views
+
+\table 100%
+\row
+\o \image plastique-listview.png
+ The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.
+\o \image plastique-treeview.png
+ The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.
+\o \image plastique-tableview.png
+ The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\o
+\o
+\endtable
+
+\section2 Display Widgets
+
+\table 100%
+\row
+\o \image plastique-progressbar.png
+ The QProgressBar widget provides a horizontal progress bar.
+\o \image plastique-label.png
+ The QLabel widget provides a text or image display.
+\o \image plastique-lcdnumber.png
+ The QLCDNumber widget displays a number with LCD-like digits.
+\endtable
+
+\section2 Input Widgets
+
+\table 100%
+\row
+\o \image plastique-lineedit.png
+ The QLineEdit widget is a one-line text editor.
+\o \image plastique-dateedit.png
+ The QDateEdit class provides a widget for editing dates.
+\o \image plastique-timeedit.png
+ The QTimeEdit class provides a widget for editing times.
+\o \image plastique-datetimeedit.png
+ The QDateTimeEdit class provides a widget for editing dates and times.
+\endtable
+
+\table 100%
+\row
+\o \image plastique-slider.png
+ The QSlider widget provides a vertical or horizontal slider.
+\o \image plastique-combobox.png
+ The QComboBox widget is a combined button and pop-up list.
+\o \image plastique-spinbox.png
+ The QSpinBox class provides a spin box widget.
+\endtable
+
+\table 100%
+\row
+\o \image plastique-fontcombobox.png
+ The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.
+\o \image plastique-doublespinbox.png
+ The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.
+\o \image plastique-horizontalscrollbar.png
+ The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.
+\endtable
+
+\table 100%
+\row
+\o \image plastique-dial.png
+ The QDial class provides a rounded range control (like a speedometer or potentiometer).
+\o \image plastique-textedit.png
+ The QTextEdit class provides a widget that is used to edit and display both plain and rich text.
+\o \image plastique-calendarwidget.png
+ The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.
+\endtable
*/
diff --git a/doc/src/widgets-and-layouts/gallery-windows.qdoc b/doc/src/widgets-and-layouts/gallery-windows.qdoc
index d3464a0..fe38745 100644
--- a/doc/src/widgets-and-layouts/gallery-windows.qdoc
+++ b/doc/src/widgets-and-layouts/gallery-windows.qdoc
@@ -34,345 +34,105 @@
This page shows some of the widgets available in Qt
when configured to use the "windows" style.
-\raw HTML
-<h2 align="center">Buttons</h2>
+\section2 Buttons
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-pushbutton.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windows-toolbutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QPushButton widget provides a command button.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolButton class provides a quick-access button to commands
- or options, usually used inside a QToolBar.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-checkbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windows-radiobutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QCheckBox widget provides a checkbox with a text label.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QRadioButton widget provides a radio button with a text or pixmap label.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Containers</h2>
+\table 100%
+\row
+\o \image windows-pushbutton.png
+ \caption The QPushButton widget provides a command button.
+\o \image windows-toolbutton.png
+ \caption The QToolButton class provides a quick-access button to commands
+ or options, usually used inside a QToolBar.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-groupbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windows-tabwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QGroupBox widget provides a group box frame with a title.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTabWidget class provides a stack of tabbed widgets.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-frame.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windows-toolbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFrame widget provides a simple decorated container for other widgets.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolBox class provides a column of tabbed widget items.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Item Views</h2>
+\table 100%
+\row
+\o \image windows-checkbox.png
+ \caption The QCheckBox widget provides a checkbox with a text label.
+\o \image windows-radiobutton.png
+ \caption The QRadioButton widget provides a radio button with a text or pixmap label.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-listview.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windows-treeview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-tableview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Display Widgets</h2>
+\section2 Containers
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-progressbar.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windows-lcdnumber.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QProgressBar widget provides a horizontal progress bar.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLCDNumber widget displays a number with LCD-like digits.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-label.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QLabel widget provides a text or image display.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Input Widgets</h2>
+\table 100%
+\row
+\o \image windows-groupbox.png
+ The The QGroupBox widget provides a group box frame with a title.
+\o \image windows-tabwidget.png
+ The QTabWidget class provides a stack of tabbed widgets.
+\o \image windows-frame.png
+ The QFrame widget provides a simple decorated container for other widgets.
+\o \image windows-toolbox.png
+ The QToolBox class provides a column of tabbed widget items.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-slider.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windows-lineedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSlider widget provides a vertical or horizontal slider.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLineEdit widget is a one-line text editor.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-combobox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windows-doublespinbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QComboBox widget is a combined button and pop-up list.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-spinbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windows-timeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSpinBox class provides a spin box widget.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTimeEdit class provides a widget for editing times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-dateedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windows-datetimeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDateEdit class provides a widget for editing dates.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDateTimeEdit class provides a widget for editing dates and times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-textedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windows-horizontalscrollbar.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTextEdit class provides a widget that is used to edit and
- display both plain and rich text.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-dial.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windows-calendarwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDial class provides a rounded range control (like a
- speedometer or potentiometer).\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windows-fontcombobox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
+\section2 Item Views
+
+\table 100%
+\row
+\o \image windows-listview.png
+ The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.
+\o \image windows-treeview.png
+ The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.
+\o \image windows-tableview.png
+ The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\o
+\o
+\endtable
+
+\section2 Display Widgets
+
+\table 100%
+\row
+\o \image windows-progressbar.png
+ The QProgressBar widget provides a horizontal progress bar.
+\o \image windows-label.png
+ The QLabel widget provides a text or image display.
+\o \image windows-lcdnumber.png
+ The QLCDNumber widget displays a number with LCD-like digits.
+\endtable
+
+\section2 Input Widgets
+
+\table 100%
+\row
+\o \image windows-lineedit.png
+ The QLineEdit widget is a one-line text editor.
+\o \image windows-dateedit.png
+ The QDateEdit class provides a widget for editing dates.
+\o \image windows-timeedit.png
+ The QTimeEdit class provides a widget for editing times.
+\o \image windows-datetimeedit.png
+ The QDateTimeEdit class provides a widget for editing dates and times.
+\endtable
+
+\table 100%
+\row
+\o \image windows-slider.png
+ The QSlider widget provides a vertical or horizontal slider.
+\o \image windows-combobox.png
+ The QComboBox widget is a combined button and pop-up list.
+\o \image windows-spinbox.png
+ The QSpinBox class provides a spin box widget.
+\endtable
+
+\table 100%
+\row
+\o \image windows-fontcombobox.png
+ The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.
+\o \image windows-doublespinbox.png
+ The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.
+\o \image windows-horizontalscrollbar.png
+ The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.
+\endtable
+
+\table 100%
+\row
+\o \image windows-dial.png
+ The QDial class provides a rounded range control (like a speedometer or potentiometer).
+\o \image windows-textedit.png
+ The QTextEdit class provides a widget that is used to edit and display both plain and rich text.
+\o \image windows-calendarwidget.png
+ The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.
+\endtable
*/
diff --git a/doc/src/widgets-and-layouts/gallery-windowsvista.qdoc b/doc/src/widgets-and-layouts/gallery-windowsvista.qdoc
index 00afd52..e017a2c 100644
--- a/doc/src/widgets-and-layouts/gallery-windowsvista.qdoc
+++ b/doc/src/widgets-and-layouts/gallery-windowsvista.qdoc
@@ -34,345 +34,105 @@
This page shows some of the widgets available in Qt
when configured to use the "windowsvista" style.
-\raw HTML
-<h2 align="center">Buttons</h2>
+\section2 Buttons
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-pushbutton.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsvista-toolbutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QPushButton widget provides a command button.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolButton class provides a quick-access button to commands
- or options, usually used inside a QToolBar.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-checkbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsvista-radiobutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QCheckBox widget provides a checkbox with a text label.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QRadioButton widget provides a radio button with a text or pixmap label.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Containers</h2>
+\table 100%
+\row
+\o \image windowsvista-pushbutton.png
+ \caption The QPushButton widget provides a command button.
+\o \image windowsvista-toolbutton.png
+ \caption The QToolButton class provides a quick-access button to commands
+ or options, usually used inside a QToolBar.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-groupbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsvista-tabwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QGroupBox widget provides a group box frame with a title.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTabWidget class provides a stack of tabbed widgets.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-frame.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsvista-toolbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFrame widget provides a simple decorated container for other widgets.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolBox class provides a column of tabbed widget items.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Item Views</h2>
+\table 100%
+\row
+\o \image windowsvista-checkbox.png
+ \caption The QCheckBox widget provides a checkbox with a text label.
+\o \image windowsvista-radiobutton.png
+ \caption The QRadioButton widget provides a radio button with a text or pixmap label.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-listview.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsvista-treeview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-tableview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Display Widgets</h2>
+\section2 Containers
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-progressbar.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsvista-lcdnumber.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QProgressBar widget provides a horizontal progress bar.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLCDNumber widget displays a number with LCD-like digits.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-label.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QLabel widget provides a text or image display.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Input Widgets</h2>
+\table 100%
+\row
+\o \image windowsvista-groupbox.png
+ The The QGroupBox widget provides a group box frame with a title.
+\o \image windowsvista-tabwidget.png
+ The QTabWidget class provides a stack of tabbed widgets.
+\o \image windowsvista-frame.png
+ The QFrame widget provides a simple decorated container for other widgets.
+\o \image windowsvista-toolbox.png
+ The QToolBox class provides a column of tabbed widget items.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-slider.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsvista-lineedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSlider widget provides a vertical or horizontal slider.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLineEdit widget is a one-line text editor.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-combobox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsvista-doublespinbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QComboBox widget is a combined button and pop-up list.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-spinbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsvista-timeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSpinBox class provides a spin box widget.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTimeEdit class provides a widget for editing times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-dateedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsvista-datetimeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDateEdit class provides a widget for editing dates.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDateTimeEdit class provides a widget for editing dates and times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-textedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsvista-horizontalscrollbar.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTextEdit class provides a widget that is used to edit and
- display both plain and rich text.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-dial.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsvista-calendarwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDial class provides a rounded range control (like a
- speedometer or potentiometer).\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsvista-fontcombobox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
+\section2 Item Views
+
+\table 100%
+\row
+\o \image windowsvista-listview.png
+ The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.
+\o \image windowsvista-treeview.png
+ The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.
+\o \image windowsvista-tableview.png
+ The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\o
+\o
+\endtable
+
+\section2 Display Widgets
+
+\table 100%
+\row
+\o \image windowsvista-progressbar.png
+ The QProgressBar widget provides a horizontal progress bar.
+\o \image windowsvista-label.png
+ The QLabel widget provides a text or image display.
+\o \image windowsvista-lcdnumber.png
+ The QLCDNumber widget displays a number with LCD-like digits.
+\endtable
+
+\section2 Input Widgets
+
+\table 100%
+\row
+\o \image windowsvista-lineedit.png
+ The QLineEdit widget is a one-line text editor.
+\o \image windowsvista-dateedit.png
+ The QDateEdit class provides a widget for editing dates.
+\o \image windowsvista-timeedit.png
+ The QTimeEdit class provides a widget for editing times.
+\o \image windowsvista-datetimeedit.png
+ The QDateTimeEdit class provides a widget for editing dates and times.
+\endtable
+
+\table 100%
+\row
+\o \image windowsvista-slider.png
+ The QSlider widget provides a vertical or horizontal slider.
+\o \image windowsvista-combobox.png
+ The QComboBox widget is a combined button and pop-up list.
+\o \image windowsvista-spinbox.png
+ The QSpinBox class provides a spin box widget.
+\endtable
+
+\table 100%
+\row
+\o \image windowsvista-fontcombobox.png
+ The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.
+\o \image windowsvista-doublespinbox.png
+ The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.
+\o \image windowsvista-horizontalscrollbar.png
+ The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.
+\endtable
+
+\table 100%
+\row
+\o \image windowsvista-dial.png
+ The QDial class provides a rounded range control (like a speedometer or potentiometer).
+\o \image windowsvista-textedit.png
+ The QTextEdit class provides a widget that is used to edit and display both plain and rich text.
+\o \image windowsvista-calendarwidget.png
+ The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.
+\endtable
*/
diff --git a/doc/src/widgets-and-layouts/gallery-windowsxp.qdoc b/doc/src/widgets-and-layouts/gallery-windowsxp.qdoc
index 60c8ff0..f3c53ee 100644
--- a/doc/src/widgets-and-layouts/gallery-windowsxp.qdoc
+++ b/doc/src/widgets-and-layouts/gallery-windowsxp.qdoc
@@ -34,345 +34,105 @@
This page shows some of the widgets available in Qt
when configured to use the "windowsxp" style.
-\raw HTML
-<h2 align="center">Buttons</h2>
+\section2 Buttons
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-pushbutton.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsxp-toolbutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QPushButton widget provides a command button.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolButton class provides a quick-access button to commands
- or options, usually used inside a QToolBar.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-checkbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsxp-radiobutton.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QCheckBox widget provides a checkbox with a text label.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QRadioButton widget provides a radio button with a text or pixmap label.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Containers</h2>
+\table 100%
+\row
+\o \image windowsxp-pushbutton.png
+ \caption The QPushButton widget provides a command button.
+\o \image windowsxp-toolbutton.png
+ \caption The QToolButton class provides a quick-access button to commands
+ or options, usually used inside a QToolBar.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-groupbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsxp-tabwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QGroupBox widget provides a group box frame with a title.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTabWidget class provides a stack of tabbed widgets.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-frame.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsxp-toolbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFrame widget provides a simple decorated container for other widgets.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QToolBox class provides a column of tabbed widget items.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Item Views</h2>
+\table 100%
+\row
+\o \image windowsxp-checkbox.png
+ \caption The QCheckBox widget provides a checkbox with a text label.
+\o \image windowsxp-radiobutton.png
+ \caption The QRadioButton widget provides a radio button with a text or pixmap label.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-listview.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsxp-treeview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-tableview.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Display Widgets</h2>
+\section2 Containers
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-progressbar.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsxp-lcdnumber.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QProgressBar widget provides a horizontal progress bar.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLCDNumber widget displays a number with LCD-like digits.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-label.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QLabel widget provides a text or image display.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
-\raw HTML
-<h2 align="center">Input Widgets</h2>
+\table 100%
+\row
+\o \image windowsxp-groupbox.png
+ The The QGroupBox widget provides a group box frame with a title.
+\o \image windowsxp-tabwidget.png
+ The QTabWidget class provides a stack of tabbed widgets.
+\o \image windowsxp-frame.png
+ The QFrame widget provides a simple decorated container for other widgets.
+\o \image windowsxp-toolbox.png
+ The QToolBox class provides a column of tabbed widget items.
+\endtable
-<table align="center" cellspacing="20%" width="100%">
-<colgroup span="2">
- <col width="40%" />
- <col width="40%" />
-</colgroup>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-slider.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsxp-lineedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSlider widget provides a vertical or horizontal slider.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QLineEdit widget is a one-line text editor.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-combobox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsxp-doublespinbox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QComboBox widget is a combined button and pop-up list.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-spinbox.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsxp-timeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QSpinBox class provides a spin box widget.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QTimeEdit class provides a widget for editing times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-dateedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsxp-datetimeedit.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDateEdit class provides a widget for editing dates.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QDateTimeEdit class provides a widget for editing dates and times.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-textedit.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsxp-horizontalscrollbar.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QTextEdit class provides a widget that is used to edit and
- display both plain and rich text.\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-dial.png
-\raw HTML
-</td>
-<td align="center">
-\endraw
-\inlineimage windowsxp-calendarwidget.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QDial class provides a rounded range control (like a
- speedometer or potentiometer).\raw HTML
-</td>
-<td halign="justify" valign="top">
-\endraw
-The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.\raw HTML
-</td>
-</tr>
-<tr>
-<td align="center">
-\endraw
-\inlineimage windowsxp-fontcombobox.png
-\raw HTML
-</td>
-</tr><tr>
-<td halign="justify" valign="top">
-\endraw
-The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.\raw HTML
-</td>
-</tr>
-</table>
-\endraw
+\section2 Item Views
+
+\table 100%
+\row
+\o \image windowsxp-listview.png
+ The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.
+\o \image windowsxp-treeview.png
+ The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.
+\o \image windowsxp-tableview.png
+ The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\o
+\o
+\endtable
+
+\section2 Display Widgets
+
+\table 100%
+\row
+\o \image windowsxp-progressbar.png
+ The QProgressBar widget provides a horizontal progress bar.
+\o \image windowsxp-label.png
+ The QLabel widget provides a text or image display.
+\o \image windowsxp-lcdnumber.png
+ The QLCDNumber widget displays a number with LCD-like digits.
+\endtable
+
+\section2 Input Widgets
+
+\table 100%
+\row
+\o \image windowsxp-lineedit.png
+ The QLineEdit widget is a one-line text editor.
+\o \image windowsxp-dateedit.png
+ The QDateEdit class provides a widget for editing dates.
+\o \image windowsxp-timeedit.png
+ The QTimeEdit class provides a widget for editing times.
+\o \image windowsxp-datetimeedit.png
+ The QDateTimeEdit class provides a widget for editing dates and times.
+\endtable
+
+\table 100%
+\row
+\o \image windowsxp-slider.png
+ The QSlider widget provides a vertical or horizontal slider.
+\o \image windowsxp-combobox.png
+ The QComboBox widget is a combined button and pop-up list.
+\o \image windowsxp-spinbox.png
+ The QSpinBox class provides a spin box widget.
+\endtable
+
+\table 100%
+\row
+\o \image windowsxp-fontcombobox.png
+ The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.
+\o \image windowsxp-doublespinbox.png
+ The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.
+\o \image windowsxp-horizontalscrollbar.png
+ The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.
+\endtable
+
+\table 100%
+\row
+\o \image windowsxp-dial.png
+ The QDial class provides a rounded range control (like a speedometer or potentiometer).
+\o \image windowsxp-textedit.png
+ The QTextEdit class provides a widget that is used to edit and display both plain and rich text.
+\o \image windowsxp-calendarwidget.png
+ The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.
+\endtable
*/
diff --git a/doc/src/widgets-and-layouts/gallery.qdoc b/doc/src/widgets-and-layouts/gallery.qdoc
index 201817b..d11d9c8 100644
--- a/doc/src/widgets-and-layouts/gallery.qdoc
+++ b/doc/src/widgets-and-layouts/gallery.qdoc
@@ -34,103 +34,51 @@
with the native desktop enviroment. Below, you can find links to the various
widget styles that are supplied with Qt 4.
- \raw HTML
- <table align="center" cellspacing="20%" width="100%">
- <colgroup span="2">
- <col width="40%" />
- <col width="40%" />
- </colgroup>
- <tr>
- <td align="center">
- \endraw
- \image plastique-tabwidget.png Plastique Style Widget Gallery
-
- \bold{\l{Plastique Style Widget Gallery}}
+ \table
+ \row
+ \o \image plastique-tabwidget.png Plastique Style Widget Gallery
+ \caption \l{Plastique Style Widget Gallery}
The Plastique style is provided by QPlastiqueStyle.
- \raw HTML
- </td>
- <td align="center">
- \endraw
- \image windowsxp-tabwidget.png Windows XP Style Widget Gallery
-
- \bold{\l{Windows XP Style Widget Gallery}}
+ \o \image windowsxp-tabwidget.png Windows XP Style Widget Gallery
+ \caption \l{Windows XP Style Widget Gallery}
The Windows XP style is provided by QWindowsXPStyle.
- \raw HTML
- </td>
- </tr>
- <tr>
- <td align="center">
- \endraw
- \image gtk-tabwidget.png GTK Style Widget Gallery
+ \o \image windows-tabwidget.png Windows Style Widget Gallery
+ \caption \l{Windows Style Widget Gallery}
- \bold{\l{GTK Style Widget Gallery}}
-
- The GTK style is provided by QGtkStyle.
- \raw HTML
- </td>
- <td align="center">
- \endraw
- \image macintosh-tabwidget.png Macintosh Style Widget Gallery
+ The Windows style is provided by QWindowsStyle.
+ \endtable
- \bold{\l{Macintosh Style Widget Gallery}}
+ \table
+ \row
+ \o \image macintosh-tabwidget.png Macintosh Style Widget Gallery
+ \caption \l{Macintosh Style Widget Gallery}
The Macintosh style is provided by QMacStyle.
- \raw HTML
- </td>
- </tr>
- <tr>
- <td align="center">
- \endraw
- \image cleanlooks-tabwidget.png Cleanlooks Style Widget Gallery
-
- \bold{\l{Cleanlooks Style Widget Gallery}}
+ \o \image cleanlooks-tabwidget.png Cleanlooks Style Widget Gallery
+ \caption \l{Cleanlooks Style Widget Gallery}
The Cleanlooks style is provided by QCleanlooksStyle.
- \raw HTML
- </td>
- <td align="center">
- \endraw
- \image windowsvista-tabwidget.png Windows Vista Style Widget Gallery
-
- \bold{\l{Windows Vista Style Widget Gallery}}
+ \o \image windowsvista-tabwidget.png Windows Vista Style Widget Gallery
+ \caption \l{Windows Vista Style Widget Gallery}
The Windows Vista style is provided by QWindowsVistaStyle.
- \raw HTML
- </td>
- </tr>
- <tr>
- <td align="center">
- \endraw
- \image motif-tabwidget.png Motif Style Widget Gallery
+ \endtable
- \bold{\l{Motif Style Widget Gallery}}
+ \table
+ \row
+ \o \image gtk-tabwidget.png GTK Style Widget Gallery
+ \caption \l{GTK Style Widget Gallery}
- The Motif style is provided by QMotifStyle.
- \raw HTML
- </td>
- <td align="center">
- \endraw
- \image windows-tabwidget.png Windows Style Widget Gallery
-
- \bold{\l{Windows Style Widget Gallery}}
-
- The Windows style is provided by QWindowsStyle.
- \raw HTML
- </td>
- </tr>
- <tr>
- <td align="center">
- \endraw
- \image cde-tabwidget.png CDE Style Widget Gallery
+ The GTK style is provided by QGtkStyle.
+ \o \image motif-tabwidget.png Motif Style Widget Gallery
+ \caption \l{Motif Style Widget Gallery}
- \bold{\l{CDE Style Widget Gallery}}
+ The Motif style is provided by QMotifStyle.
+ \o \image cde-tabwidget.png CDE Style Widget Gallery
+ \caption \l{CDE Style Widget Gallery}
The Common Desktop Environment style is provided by QCDEStyle.
- \raw HTML
- </td>
- </tr>
- </table>
- \endraw
+ \endtable
*/
diff --git a/examples/declarative/cppextensions/imageprovider/imageprovider.pro b/examples/declarative/cppextensions/imageprovider/imageprovider.pro
index f6e09a2..f700f0b 100644
--- a/examples/declarative/cppextensions/imageprovider/imageprovider.pro
+++ b/examples/declarative/cppextensions/imageprovider/imageprovider.pro
@@ -24,5 +24,5 @@ symbian:{
importFiles.files = ImageProviderCore/qmlimageproviderplugin.dll ImageProviderCore/qmldir
importFiles.path = ImageProviderCore
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
}
diff --git a/examples/declarative/cppextensions/qwidgets/qwidgets.pro b/examples/declarative/cppextensions/qwidgets/qwidgets.pro
index 0f5398b..d92e072 100644
--- a/examples/declarative/cppextensions/qwidgets/qwidgets.pro
+++ b/examples/declarative/cppextensions/qwidgets/qwidgets.pro
@@ -20,5 +20,5 @@ symbian:{
importFiles.files = QWidgets/qmlqwidgetsplugin.dll QWidgets/qmldir
importFiles.path = QWidgets
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
}
diff --git a/examples/declarative/modelviews/visualitemmodel/visualitemmodel.qml b/examples/declarative/modelviews/visualitemmodel/visualitemmodel.qml
index 15f2f11..f6564f7 100644
--- a/examples/declarative/modelviews/visualitemmodel/visualitemmodel.qml
+++ b/examples/declarative/modelviews/visualitemmodel/visualitemmodel.qml
@@ -55,16 +55,22 @@ Rectangle {
width: view.width; height: view.height
color: "#FFFEF0"
Text { text: "Page 1"; font.bold: true; anchors.centerIn: parent }
+
+ Component.onDestruction: print("destroyed 1")
}
Rectangle {
width: view.width; height: view.height
color: "#F0FFF7"
Text { text: "Page 2"; font.bold: true; anchors.centerIn: parent }
+
+ Component.onDestruction: print("destroyed 2")
}
Rectangle {
width: view.width; height: view.height
color: "#F4F0FF"
Text { text: "Page 3"; font.bold: true; anchors.centerIn: parent }
+
+ Component.onDestruction: print("destroyed 3")
}
}
@@ -76,6 +82,7 @@ Rectangle {
highlightRangeMode: ListView.StrictlyEnforceRange
orientation: ListView.Horizontal
snapMode: ListView.SnapOneItem; flickDeceleration: 2000
+ cacheBuffer: 200
}
Rectangle {
diff --git a/examples/declarative/ui-components/tabwidget/TabWidget.qml b/examples/declarative/ui-components/tabwidget/TabWidget.qml
index f066fd2..2a74c46 100644
--- a/examples/declarative/ui-components/tabwidget/TabWidget.qml
+++ b/examples/declarative/ui-components/tabwidget/TabWidget.qml
@@ -45,8 +45,8 @@ Item {
// Setting the default property to stack.children means any child items
// of the TabWidget are actually added to the 'stack' item's children.
- // See the "Extending Types from QML" documentation for details on default
- // properties.
+ // See the "Writing QML Components: Properties, Methods and Signals"
+ // documentation for details on default properties.
default property alias content: stack.children
property int current: 0
diff --git a/examples/examples.pro b/examples/examples.pro
index f233aba..968740d 100644
--- a/examples/examples.pro
+++ b/examples/examples.pro
@@ -20,6 +20,7 @@ SUBDIRS = \
mainwindows \
painting \
richtext \
+ scroller \
sql \
tools \
tutorials \
diff --git a/examples/network/bearermonitor/bearermonitor.cpp b/examples/network/bearermonitor/bearermonitor.cpp
index 75ffb01..bfa3d1f 100644
--- a/examples/network/bearermonitor/bearermonitor.cpp
+++ b/examples/network/bearermonitor/bearermonitor.cpp
@@ -226,7 +226,7 @@ void BearerMonitor::updateConfigurations()
if (defaultConfiguration.type() == QNetworkConfiguration::ServiceNetwork)
updateSnapConfiguration(defaultItem, defaultConfiguration);
- } else {
+ } else if (defaultConfiguration.isValid()) {
configurationAdded(defaultConfiguration);
}
diff --git a/examples/script/customclass/main.cpp b/examples/script/customclass/main.cpp
index cc79d6e..a9e8ba9 100644
--- a/examples/script/customclass/main.cpp
+++ b/examples/script/customclass/main.cpp
@@ -38,6 +38,8 @@
**
****************************************************************************/
+#include <QCoreApplication>
+#include <QtDebug>
#include <QtScript>
#include "bytearrayclass.h"
diff --git a/examples/script/helloscript/main.cpp b/examples/script/helloscript/main.cpp
index 3013e7c..6eac741 100644
--- a/examples/script/helloscript/main.cpp
+++ b/examples/script/helloscript/main.cpp
@@ -39,8 +39,11 @@
****************************************************************************/
#include <QApplication>
+#include <QFile>
#include <QMessageBox>
#include <QPushButton>
+#include <QTextStream>
+#include <QTranslator>
#include <QtScript>
//! [0]
diff --git a/examples/scroller/graphicsview/graphicsview.pro b/examples/scroller/graphicsview/graphicsview.pro
new file mode 100644
index 0000000..dcebe62
--- /dev/null
+++ b/examples/scroller/graphicsview/graphicsview.pro
@@ -0,0 +1,8 @@
+TEMPLATE = app
+SOURCES = main.cpp
+
+# install
+target.path = $$[QT_INSTALL_EXAMPLES]/scroller/graphicsview
+sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS graphicsview.pro
+sources.path = $$[QT_INSTALL_EXAMPLES]/scroller/graphicsview
+INSTALLS += target sources
diff --git a/examples/scroller/graphicsview/main.cpp b/examples/scroller/graphicsview/main.cpp
new file mode 100644
index 0000000..e28978f
--- /dev/null
+++ b/examples/scroller/graphicsview/main.cpp
@@ -0,0 +1,292 @@
+/****************************************************************************
+**
+** 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:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore>
+#include <QtGui>
+
+#define NUM_ITEMS 100
+#define NUM_LISTS 10
+
+/*!
+ \class RectObject
+ Note that it needs to be a QGraphicsObject or else the gestures will not work correctly.
+*/
+class RectObject : public QGraphicsObject
+{
+ Q_OBJECT
+
+public:
+
+ RectObject(const QString &text, qreal x, qreal y, qreal width, qreal height, QBrush brush, QGraphicsItem *parent = 0)
+ : QGraphicsObject(parent)
+ , m_text(text)
+ , m_rect(x, y, width, height)
+ , m_pen(brush.color().lighter(), 3.0)
+ , m_brush(brush)
+ {
+ setFlag(QGraphicsItem::ItemClipsToShape, true);
+ }
+
+ QRectF boundingRect() const
+ {
+ // here we only want the size of the children and not the size of the children of the children...
+ qreal halfpw = m_pen.widthF() / 2;
+ QRectF rect = m_rect;
+ if (halfpw > 0.0)
+ rect.adjust(-halfpw, -halfpw, halfpw, halfpw);
+
+ return rect;
+ }
+
+ void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
+ {
+ Q_UNUSED(option);
+ Q_UNUSED(widget);
+ painter->setPen(m_pen);
+ painter->setBrush(m_brush);
+ painter->drawRect(m_rect);
+
+ painter->setPen(Qt::black);
+ QFont f;
+ f.setPixelSize(m_rect.height());
+ painter->setFont(f);
+ painter->drawText(m_rect, Qt::AlignCenter, m_text);
+ }
+
+ QString m_text;
+ QRectF m_rect;
+ QPen m_pen;
+ QBrush m_brush;
+};
+
+class ViewObject : public QGraphicsObject
+{
+ Q_OBJECT
+public:
+ ViewObject(QGraphicsObject *parent)
+ : QGraphicsObject(parent)
+ { }
+
+ QRectF boundingRect() const
+ {
+ QRectF rect;
+ foreach (QGraphicsItem *item, childItems())
+ rect |= item->boundingRect().translated(item->pos());
+ return rect;
+ }
+
+ void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*)
+ { }
+};
+
+class ListObject : public QGraphicsObject
+{
+ Q_OBJECT
+
+public:
+ ListObject(const QSizeF &size, bool useTouch)
+ {
+ m_size = size;
+ setFlag(QGraphicsItem::ItemClipsChildrenToShape, true);
+ // grab gesture via Touch or Mouse events
+ QScroller::grabGesture(this, useTouch ? QScroller::TouchGesture : QScroller::LeftMouseButtonGesture);
+
+ // this needs to be QGraphicsOBJECT - otherwise gesture recognition
+ // will not work for the parent of the viewport (in this case the
+ // list)
+ m_viewport = new ViewObject(this);
+
+ }
+
+ QGraphicsObject *viewport() const
+ {
+ return m_viewport;
+ }
+
+ bool event(QEvent *e)
+ {
+ switch (e->type()) {
+// ![2]
+ case QEvent::ScrollPrepare: {
+ QScrollPrepareEvent *se = static_cast<QScrollPrepareEvent *>(e);
+ se->setViewportSize(m_size);
+ QRectF br = m_viewport->boundingRect();
+ se->setContentPosRange(QRectF(0, 0,
+ qMax(qreal(0), br.width() - m_size.width()),
+ qMax(qreal(0), br.height() - m_size.height())));
+ se->setContentPos(-m_viewport->pos());
+ se->accept();
+ return true;
+ }
+// ![1]
+// ![2]
+ case QEvent::Scroll: {
+ QScrollEvent *se = static_cast<QScrollEvent *>(e);
+ m_viewport->setPos(-se->contentPos() - se->overshootDistance());
+ return true;
+ }
+// ![2]
+ default:
+ break;
+ }
+ return QGraphicsObject::event(e);
+ }
+
+ bool sceneEvent(QEvent *e)
+ {
+ switch (e->type()) {
+ case QEvent::TouchBegin: {
+ // We need to return true for the TouchBegin here in the
+ // top-most graphics object - otherwise gestures in our parent
+ // objects will NOT work at all (the accept() flag is already
+ // set due to our setAcceptTouchEvents(true) call in the c'tor
+ return true;
+
+ }
+ case QEvent::GraphicsSceneMousePress: {
+ // We need to return true for the MousePress here in the
+ // top-most graphics object - otherwise gestures in our parent
+ // objects will NOT work at all (the accept() flag is already
+ // set to true by Qt)
+ return true;
+
+ }
+ default:
+ break;
+ }
+ return QGraphicsObject::sceneEvent(e);
+ }
+
+ QRectF boundingRect() const
+ {
+ return QRectF(0, 0, m_size.width() + 3, m_size.height());
+ }
+
+ void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
+ {
+ Q_UNUSED(option);
+ Q_UNUSED(widget);
+ painter->setPen(QPen(QColor(100, 100, 100), 3.0));
+ painter->drawRect(QRect(1.5, 1.5, m_size.width() - 3, m_size.height() - 3));
+ }
+
+ QSizeF m_size;
+ ViewObject *m_viewport;
+};
+
+class MainWindow : public QMainWindow
+{
+ Q_OBJECT
+
+public:
+ MainWindow(bool useTouch)
+ {
+ m_scene = new QGraphicsScene();
+
+ // -- make the main list
+ ListObject *mainList = new ListObject(QSizeF(780, 400), useTouch);
+ mainList->setObjectName(QLatin1String("MainList"));
+ m_scene->addItem(mainList);
+// ![3]
+ for (int i=0; i<NUM_LISTS; i++) {
+ ListObject *childList = new ListObject(QSizeF(mainList->m_size.width()/3, mainList->m_size.height()), useTouch);
+ childList->setObjectName(QString("ChildList %1").arg(i));
+ fillList(childList);
+ childList->setParentItem(mainList->viewport());
+ childList->setPos(i*mainList->m_size.width()/3, 0);
+ }
+ mainList->viewport()->setPos(0, 0);
+
+
+ /*
+ list1->setTransformOriginPoint(200, 200);
+ list1->setRotation(135);
+ list1->setPos(20 + 200 * .41, 20 + 200 * .41);
+ */
+// ![3]
+
+ m_view = new QGraphicsView(m_scene);
+ setCentralWidget(m_view);
+ setWindowTitle(tr("Gesture example"));
+ m_scene->setSceneRect(0, 0, m_view->viewport()->width(), m_view->viewport()->height());
+ }
+
+ /**
+ * Fills the list object \a list with RectObjects.
+ */
+ void fillList(ListObject *list)
+ {
+ qreal h = list->m_size.height() / 10;
+ for (int i=0; i<NUM_ITEMS; i++) {
+ QColor color = QColor(255*i/NUM_ITEMS, 255*(NUM_ITEMS-i)/NUM_ITEMS, 127*(i%2)+64*(i/2%2));
+ QString text = QLatin1String("Item #") + QString::number(i);
+ QGraphicsItem *rect = new RectObject(text, 0, 0, list->m_size.width() - 6, h - 3, QBrush(color), list->viewport());
+ rect->setPos(3, h*i+3);
+ }
+ list->viewport()->setPos(0, 0);
+ }
+
+
+protected:
+ void resizeEvent(QResizeEvent *e)
+ {
+ // resize the scene according to our own size to prevent scrolling
+ m_scene->setSceneRect(0, 0, m_view->viewport()->width(), m_view->viewport()->height());
+ QMainWindow::resizeEvent(e);
+ }
+
+ QGraphicsScene *m_scene;
+ QGraphicsView *m_view;
+};
+
+int main(int argc, char *argv[])
+{
+ QApplication app(argc, argv);
+ bool useTouch = (app.arguments().contains(QLatin1String("--touch")));
+ MainWindow mw(useTouch);
+ mw.show();
+#ifdef Q_WS_MAC
+ mw.raise();
+#endif
+ return app.exec();
+}
+
+#include "main.moc"
diff --git a/examples/scroller/plot/main.cpp b/examples/scroller/plot/main.cpp
new file mode 100644
index 0000000..acf83ee
--- /dev/null
+++ b/examples/scroller/plot/main.cpp
@@ -0,0 +1,223 @@
+/****************************************************************************
+**
+** 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 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 <QApplication>
+#include <QListWidget>
+#include <QListWidgetItem>
+#include <QSplitter>
+#include <QStackedWidget>
+#include <QSignalMapper>
+#include <QMainWindow>
+#include <QMenuBar>
+#include <QActionGroup>
+#include <QWebView>
+#include <QTimer>
+#include <QScroller>
+
+#include <QtDebug>
+
+#include <QGesture>
+
+#include "settingswidget.h"
+#include "plotwidget.h"
+
+
+class MainWindow : public QMainWindow
+{
+ Q_OBJECT
+public:
+ MainWindow(bool smallscreen, bool touch)
+ : QMainWindow(), m_touch(touch)
+ {
+ m_list = new QListWidget();
+ m_list->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
+ m_list_scroller = installKineticScroller(m_list);
+
+ for (int i = 0; i < 1000; ++i)
+ new QListWidgetItem(QString("This is a test text %1 %2").arg(i).arg(QString("--------").left(i % 8)), m_list);
+
+ connect(m_list, SIGNAL(itemActivated(QListWidgetItem*)), this, SLOT(listItemActivated(QListWidgetItem*)));
+ connect(m_list, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(listItemClicked(QListWidgetItem*)));
+ connect(m_list, SIGNAL(itemPressed(QListWidgetItem*)), this, SLOT(listItemPressed(QListWidgetItem*)));
+ connect(m_list, SIGNAL(itemSelectionChanged()), this, SLOT(listItemSelectionChanged()));
+ connect(m_list, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), this, SLOT(listItemCurrentChanged(QListWidgetItem*)));
+
+ m_web = new QWebView();
+ m_web_scroller = installKineticScroller(m_web);
+
+ QTimer::singleShot(1000, this, SLOT(loadUrl()));
+
+ m_settings = new SettingsWidget(smallscreen);
+ installKineticScroller(m_settings);
+ m_plot = new PlotWidget(smallscreen);
+
+ QStackedWidget *stack = new QStackedWidget();
+ stack->addWidget(m_list);
+ stack->addWidget(m_web);
+
+ QActionGroup *pages = new QActionGroup(this);
+ pages->setExclusive(true);
+ QSignalMapper *mapper = new QSignalMapper(this);
+ connect(mapper, SIGNAL(mapped(int)), stack, SLOT(setCurrentIndex(int)));
+
+ createAction("List", pages, mapper, 0, true);
+ createAction("Web", pages, mapper, 1);
+
+ if (smallscreen) {
+ stack->addWidget(m_settings);
+ stack->addWidget(m_plot);
+
+ createAction("Settings", pages, mapper, 2);
+ createAction("Plot", pages, mapper, 3);
+
+ setCentralWidget(stack);
+ } else {
+ QSplitter *split = new QSplitter();
+ m_settings->setMinimumWidth(m_settings->sizeHint().width());
+ split->addWidget(stack);
+ split->addWidget(m_settings);
+ split->addWidget(m_plot);
+ setCentralWidget(split);
+ }
+ menuBar()->addMenu(QLatin1String("Pages"))->addActions(pages->actions());
+ connect(stack, SIGNAL(currentChanged(int)), this, SLOT(pageChanged(int)));
+ pageChanged(0);
+ }
+
+private slots:
+ void pageChanged(int page)
+ {
+ if (page < 0 || page > 1)
+ return;
+ switch (page) {
+ case 0:
+ m_settings->setScroller(m_list);
+ m_plot->setScroller(m_list);
+ break;
+ case 1:
+ m_settings->setScroller(m_web);
+ m_plot->setScroller(m_web);
+ break;
+ default:
+ break;
+ }
+ }
+
+ void loadUrl()
+ {
+ m_web->load(QUrl("http://www.google.com"));
+ }
+
+ void listItemActivated(QListWidgetItem *lwi) { qWarning() << "Item ACTIVATED: " << lwi->text(); }
+ void listItemClicked(QListWidgetItem *lwi) { qWarning() << "Item CLICKED: " << lwi->text(); }
+ void listItemPressed(QListWidgetItem *lwi) { qWarning() << "Item PRESSED: " << lwi->text(); }
+ void listItemCurrentChanged(QListWidgetItem *lwi) { qWarning() << "Item CURRENT: " << (lwi ? lwi->text() : QString("(none)")); }
+ void listItemSelectionChanged()
+ {
+ int n = m_list->selectedItems().count();
+ qWarning("Item%s SELECTED: %d", n == 1 ? "" : "s", n);
+ foreach (QListWidgetItem *lwi, m_list->selectedItems())
+ qWarning() << " " << lwi->text();
+ }
+
+private:
+ QAction *createAction(const char *text, QActionGroup *group, QSignalMapper *mapper, int mapping, bool checked = false)
+ {
+ QAction *a = new QAction(QLatin1String(text), group);
+ a->setCheckable(true);
+ a->setChecked(checked);
+#if defined(Q_WS_MAC)
+ a->setMenuRole(QAction::NoRole);
+#endif
+ mapper->setMapping(a, mapping);
+ connect(a, SIGNAL(toggled(bool)), mapper, SLOT(map()));
+ return a;
+ }
+
+ QScroller *installKineticScroller(QWidget *w)
+ {
+ if (QAbstractScrollArea *area = qobject_cast<QAbstractScrollArea *>(w)) {
+ QScroller::grabGesture(area->viewport(), m_touch ? QScroller::TouchGesture : QScroller::LeftMouseButtonGesture);
+ return QScroller::scroller(area->viewport());
+ } else if (QWebView *web = qobject_cast<QWebView *>(w)) {
+ QScroller::grabGesture(web, m_touch ? QScroller::TouchGesture : QScroller::LeftMouseButtonGesture);
+ }
+ return QScroller::scroller(w);
+ }
+
+private:
+ QListWidget *m_list;
+ QWebView *m_web;
+ QScroller *m_list_scroller, *m_web_scroller;
+ SettingsWidget *m_settings;
+ PlotWidget *m_plot;
+ bool m_touch;
+};
+
+int main(int argc, char **argv)
+{
+ QApplication a(argc, argv);
+
+#if defined(Q_WS_MAEMO_5) || defined(Q_WS_S60) || defined(Q_WS_WINCE)
+ bool smallscreen = true;
+#else
+ bool smallscreen = false;
+#endif
+ bool touch = false;
+
+ if (a.arguments().contains(QLatin1String("--small")))
+ smallscreen = true;
+ if (a.arguments().contains(QLatin1String("--touch")))
+ touch = true;
+
+ MainWindow *mw = new MainWindow(smallscreen, touch);
+ if (smallscreen)
+ mw->showMaximized();
+ else
+ mw->show();
+#if defined(Q_WS_MAC)
+ mw->raise();
+#endif
+
+ return a.exec();
+}
+
+#include "main.moc"
diff --git a/examples/scroller/plot/plot.pro b/examples/scroller/plot/plot.pro
new file mode 100644
index 0000000..8c37b04
--- /dev/null
+++ b/examples/scroller/plot/plot.pro
@@ -0,0 +1,18 @@
+HEADERS = settingswidget.h \
+ plotwidget.h
+SOURCES = settingswidget.cpp \
+ plotwidget.cpp \
+ main.cpp
+
+QT += webkit
+
+# install
+target.path = $$[QT_INSTALL_EXAMPLES]/scroller/plot
+sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS plot.pro
+sources.path = $$[QT_INSTALL_EXAMPLES]/scroller/plot
+INSTALLS += target sources
+
+symbian {
+ TARGET.UID3 = 0xA000CF66
+ include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
+}
diff --git a/examples/scroller/plot/plotwidget.cpp b/examples/scroller/plot/plotwidget.cpp
new file mode 100644
index 0000000..5f0df67
--- /dev/null
+++ b/examples/scroller/plot/plotwidget.cpp
@@ -0,0 +1,205 @@
+/****************************************************************************
+**
+** 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 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 <QPushButton>
+#include <QTextStream>
+#include <QColor>
+#include <QPainter>
+#include <QLabel>
+#include <QResizeEvent>
+#include <QPlastiqueStyle>
+#include <QAbstractScrollArea>
+
+#include "plotwidget.h"
+#include "qscroller.h"
+
+PlotWidget::PlotWidget(bool /*smallscreen*/)
+ : QWidget(), m_widget(0)
+{
+ setWindowTitle(QLatin1String("Plot"));
+ m_clear = new QPushButton(QLatin1String("Clear"), this);
+#if defined(Q_WS_MAEMO_5)
+ m_clear->setStyle(new QPlastiqueStyle());
+ m_clear->setFixedHeight(55);
+#endif
+ connect(m_clear, SIGNAL(clicked()), this, SLOT(reset()));
+ m_legend = new QLabel(this);
+ QString legend;
+ QTextStream ts(&legend);
+ // ok. this wouldn't pass the w3c html verification...
+ ts << "<table style=\"color:#000;\" border=\"0\">";
+ ts << "<tr><td width=\"30\" bgcolor=\"" << QColor(Qt::red).light().name() << "\" /><td>Velocity X</td></tr>";
+ ts << "<tr><td width=\"30\" bgcolor=\"" << QColor(Qt::red).dark().name() << "\" /><td>Velocity Y</td></tr>";
+ ts << "<tr><td width=\"30\" bgcolor=\"" << QColor(Qt::green).light().name() << "\" /><td>Content Position X</td></tr>";
+ ts << "<tr><td width=\"30\" bgcolor=\"" << QColor(Qt::green).dark().name() << "\" /><td>Content Position Y</td></tr>";
+ ts << "<tr><td width=\"30\" bgcolor=\"" << QColor(Qt::blue).light().name() << "\" /><td>Overshoot Position X</td></tr>";
+ ts << "<tr><td width=\"30\" bgcolor=\"" << QColor(Qt::blue).dark().name() << "\" /><td>Overshoot Position Y</td></tr>";
+ ts << "</table>";
+ m_legend->setText(legend);
+}
+
+void PlotWidget::setScroller(QWidget *widget)
+{
+ if (QAbstractScrollArea *area = qobject_cast<QAbstractScrollArea *>(widget))
+ widget = area->viewport();
+
+ if (m_widget)
+ m_widget->removeEventFilter(this);
+ m_widget = widget;
+ reset();
+ if (m_widget)
+ m_widget->installEventFilter(this);
+}
+
+bool PlotWidget::eventFilter(QObject *obj, QEvent *ev)
+{
+ if (ev->type() == QEvent::Scroll) {
+ QScrollEvent *se = static_cast<QScrollEvent *>(ev);
+ QScroller *scroller = QScroller::scroller(m_widget);
+
+ QPointF v = scroller->velocity();
+ //v.rx() *= scroller->pixelPerMeter().x();
+ //v.ry() *= scroller->pixelPerMeter().y();
+
+ PlotItem pi = { v, se->contentPos(), se->overshootDistance() };
+ addPlotItem(pi);
+ }
+
+ return QWidget::eventFilter(obj, ev);
+}
+
+static inline void doMaxMin(const QPointF &v, qreal &minmaxv)
+{
+ minmaxv = qMax(minmaxv, qMax(qAbs(v.x()), qAbs(v.y())));
+}
+
+void PlotWidget::addPlotItem(const PlotItem &pi)
+{
+ m_plotitems.append(pi);
+ minMaxVelocity = minMaxPosition = 0;
+
+ while (m_plotitems.size() > 500)
+ m_plotitems.removeFirst();
+
+ foreach (const PlotItem &pi, m_plotitems) {
+ doMaxMin(pi.velocity, minMaxVelocity);
+ doMaxMin(pi.contentPosition, minMaxPosition);
+ doMaxMin(pi.overshootPosition, minMaxPosition);
+ }
+ update();
+}
+
+void PlotWidget::reset()
+{
+ m_plotitems.clear();
+ minMaxVelocity = minMaxPosition = 0;
+ update();
+}
+
+void PlotWidget::resizeEvent(QResizeEvent *)
+{
+ QSize cs = m_clear->sizeHint();
+ QSize ls = m_legend->sizeHint();
+ m_clear->setGeometry(4, 4, cs.width(), cs.height());
+ m_legend->setGeometry(4, height() - ls.height() - 4, ls.width(), ls.height());
+}
+
+void PlotWidget::paintEvent(QPaintEvent *)
+{
+#define SCALE(v, mm) ((qreal(1) - (v / mm)) * qreal(0.5) * height())
+
+ QColor rvColor = Qt::red;
+ QColor cpColor = Qt::green;
+ QColor opColor = Qt::blue;
+
+
+ QPainter p(this);
+ //p.setRenderHints(QPainter::Antialiasing); //too slow for 60fps
+ p.fillRect(rect(), Qt::white);
+
+ p.setPen(Qt::black);
+ p.drawLine(0, SCALE(0, 1), width(), SCALE(0, 1));
+
+ if (m_plotitems.isEmpty())
+ return;
+
+ int x = 2;
+ int offset = m_plotitems.size() - width() / 2;
+ QList<PlotItem>::const_iterator it = m_plotitems.constBegin();
+ if (offset > 0)
+ it += (offset - 1);
+
+ const PlotItem *last = &(*it++);
+
+ while (it != m_plotitems.constEnd()) {
+ p.setPen(rvColor.light());
+ p.drawLine(qreal(x - 2), SCALE(last->velocity.x(), minMaxVelocity),
+ qreal(x), SCALE(it->velocity.x(), minMaxVelocity));
+ p.setPen(rvColor.dark());
+ p.drawLine(qreal(x - 2), SCALE(last->velocity.y(), minMaxVelocity),
+ qreal(x), SCALE(it->velocity.y(), minMaxVelocity));
+
+ p.setPen(cpColor.light());
+ p.drawLine(qreal(x - 2), SCALE(last->contentPosition.x(), minMaxPosition),
+ qreal(x), SCALE(it->contentPosition.x(), minMaxPosition));
+ p.setPen(cpColor.dark());
+ p.drawLine(qreal(x - 2), SCALE(last->contentPosition.y(), minMaxPosition),
+ qreal(x), SCALE(it->contentPosition.y(), minMaxPosition));
+
+ p.setPen(opColor.light());
+ p.drawLine(qreal(x - 2), SCALE(last->overshootPosition.x(), minMaxPosition),
+ qreal(x), SCALE(it->overshootPosition.x(), minMaxPosition));
+ p.setPen(opColor.dark());
+ p.drawLine(qreal(x - 2), SCALE(last->overshootPosition.y(), minMaxPosition),
+ qreal(x), SCALE(it->overshootPosition.y(), minMaxPosition));
+
+ last = &(*it++);
+ x += 2;
+ }
+
+ QString toptext = QString("%1 [m/s] / %2 [pix]").arg(minMaxVelocity, 0, 'f', 2).arg(minMaxPosition, 0, 'f', 2);
+ QString bottomtext = QString("-%1 [m/s] / -%2 [pix]").arg(minMaxVelocity, 0, 'f', 2).arg(minMaxPosition, 0, 'f', 2);
+
+ p.setPen(Qt::black);
+ p.drawText(rect(), Qt::AlignTop | Qt::AlignHCenter, toptext);
+ p.drawText(rect(), Qt::AlignBottom | Qt::AlignHCenter, bottomtext);
+#undef SCALE
+}
diff --git a/examples/scroller/plot/plotwidget.h b/examples/scroller/plot/plotwidget.h
new file mode 100644
index 0000000..4987ebc
--- /dev/null
+++ b/examples/scroller/plot/plotwidget.h
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** 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 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 PLOTWIDGET_H
+#define PLOTWIDGET_H
+
+#include <QWidget>
+#include <QPointF>
+
+QT_BEGIN_NAMESPACE
+class QPushButton;
+class QLabel;
+class QScroller;
+QT_END_NAMESPACE
+
+class PlotWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ PlotWidget(bool smallscreen = false);
+
+ void setScroller(QWidget *widget);
+
+public slots:
+ void reset();
+
+protected:
+ void resizeEvent(QResizeEvent *);
+ void paintEvent(QPaintEvent *);
+
+ bool eventFilter(QObject *obj, QEvent *ev);
+
+private:
+
+ struct PlotItem {
+ QPointF velocity;
+ QPointF contentPosition;
+ QPointF overshootPosition;
+ };
+
+ void addPlotItem(const PlotItem &pi);
+
+ QWidget *m_widget;
+ QList<PlotItem> m_plotitems;
+ qreal minMaxVelocity, minMaxPosition;
+ QPushButton *m_clear;
+ QLabel *m_legend;
+};
+
+#endif
diff --git a/examples/scroller/plot/settingswidget.cpp b/examples/scroller/plot/settingswidget.cpp
new file mode 100644
index 0000000..840e3fc
--- /dev/null
+++ b/examples/scroller/plot/settingswidget.cpp
@@ -0,0 +1,690 @@
+/****************************************************************************
+**
+** 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 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 <QVariant>
+#include <QSlider>
+#include <QHBoxLayout>
+#include <QLabel>
+#include <QPushButton>
+#include <QComboBox>
+#include <QSpinBox>
+#include <QGroupBox>
+#include <QToolButton>
+#include <QCheckBox>
+#include <QScrollBar>
+#include <QPainter>
+#include <QScrollArea>
+#include <QScrollPrepareEvent>
+#include <QApplication>
+#include <QPlainTextEdit>
+#include <QTextBlock>
+#include <qnumeric.h>
+
+#include <QEasingCurve>
+
+#include <QDebug>
+
+#include "math.h"
+
+#include "settingswidget.h"
+#include "qscroller.h"
+#include "qscrollerproperties.h"
+
+class SnapOverlay : public QWidget
+{
+ Q_OBJECT
+public:
+ SnapOverlay(QWidget *w)
+ : QWidget(w)
+ {
+ setAttribute(Qt::WA_TransparentForMouseEvents);
+
+ if (QAbstractScrollArea *area = qobject_cast<QAbstractScrollArea *>(w)) {
+ connect(area->horizontalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(update()));
+ connect(area->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(update()));
+ area->viewport()->installEventFilter(this);
+ }
+ }
+ void clear(Qt::Orientation o)
+ {
+ m_snap[o].clear();
+ update();
+ }
+
+ void set(Qt::Orientation o, qreal first, qreal step)
+ {
+ m_snap[o] = QList<qreal>() << -Q_INFINITY << first << step;
+ update();
+ }
+
+ void set(Qt::Orientation o, const QList<qreal> &list)
+ {
+ m_snap[o] = list;
+ update();
+ }
+
+protected:
+ bool eventFilter(QObject *o, QEvent *e)
+ {
+ if (QAbstractScrollArea *area = qobject_cast<QAbstractScrollArea *>(parentWidget())) {
+ if (area->viewport() == o) {
+ if (e->type() == QEvent::Move || e->type() == QEvent::Resize) {
+ setGeometry(area->viewport()->rect());
+ }
+ }
+ }
+ return false;
+ }
+
+ void paintEvent(QPaintEvent *e)
+ {
+ if (QAbstractScrollArea *area = qobject_cast<QAbstractScrollArea *>(parentWidget())) {
+ int dx = area->horizontalScrollBar()->value();
+ int dy = area->verticalScrollBar()->value();
+
+ QPainter paint(this);
+ paint.fillRect(e->rect(), Qt::transparent);
+ paint.setPen(QPen(Qt::red, 9));
+
+ if (m_snap[Qt::Horizontal].isEmpty()) {
+ } else if (m_snap[Qt::Horizontal][0] == -Q_INFINITY) {
+ int start = int(m_snap[Qt::Horizontal][1]);
+ int step = int(m_snap[Qt::Horizontal][2]);
+ if (step > 0) {
+ for (int i = start; i < area->horizontalScrollBar()->maximum(); i += step)
+ paint.drawPoint(i - dx, 5);
+ }
+ } else {
+ foreach (qreal r, m_snap[Qt::Horizontal])
+ paint.drawPoint(int(r) - dx, 5);
+ }
+ paint.setPen(QPen(Qt::green, 9));
+ if (m_snap[Qt::Vertical].isEmpty()) {
+ } else if (m_snap[Qt::Vertical][0] == -Q_INFINITY) {
+ int start = int(m_snap[Qt::Vertical][1]);
+ int step = int(m_snap[Qt::Vertical][2]);
+ if (step > 0) {
+ for (int i = start; i < area->verticalScrollBar()->maximum(); i += step)
+ paint.drawPoint(5, i - dy);
+ }
+ } else {
+ foreach (qreal r, m_snap[Qt::Vertical])
+ paint.drawPoint(5, int(r) - dy);
+ }
+ }
+ }
+
+private:
+ QMap<Qt::Orientation, QList<qreal> > m_snap;
+};
+
+struct MetricItem
+{
+ QScrollerProperties::ScrollMetric metric;
+ const char *name;
+ int scaling;
+ const char *unit;
+ QVariant min, max;
+ QVariant step;
+};
+
+class MetricItemUpdater : public QObject
+{
+ Q_OBJECT
+public:
+ MetricItemUpdater(MetricItem *item)
+ : m_item(item)
+ , m_widget(0)
+ , m_slider(0)
+ , m_combo(0)
+ , m_valueLabel(0)
+ {
+ m_frameRateType = QVariant::fromValue(QScrollerProperties::Standard).userType();
+ m_overshootPolicyType = QVariant::fromValue(QScrollerProperties::OvershootWhenScrollable).userType();
+
+ if (m_item->min.type() == QVariant::EasingCurve) {
+ m_combo = new QComboBox();
+ m_combo->addItem("OutQuad", QEasingCurve::OutQuad);
+ m_combo->addItem("OutCubic", QEasingCurve::OutCubic);
+ m_combo->addItem("OutQuart", QEasingCurve::OutQuart);
+ m_combo->addItem("OutQuint", QEasingCurve::OutQuint);
+ m_combo->addItem("OutExpo", QEasingCurve::OutExpo);
+ m_combo->addItem("OutSine", QEasingCurve::OutSine);
+ m_combo->addItem("OutCirc", QEasingCurve::OutCirc);
+ } else if (m_item->min.userType() == m_frameRateType) {
+ m_combo = new QComboBox();
+ m_combo->addItem("Standard", QScrollerProperties::Standard);
+ m_combo->addItem("60 FPS", QScrollerProperties::Fps60);
+ m_combo->addItem("30 FPS", QScrollerProperties::Fps30);
+ m_combo->addItem("20 FPS", QScrollerProperties::Fps20);
+ } else if (m_item->min.userType() == m_overshootPolicyType) {
+ m_combo = new QComboBox();
+ m_combo->addItem("When Scrollable", QScrollerProperties::OvershootWhenScrollable);
+ m_combo->addItem("Always On", QScrollerProperties::OvershootAlwaysOn);
+ m_combo->addItem("Always Off", QScrollerProperties::OvershootAlwaysOff);
+ } else {
+ m_slider = new QSlider(Qt::Horizontal);
+ m_slider->setSingleStep(1);
+ m_slider->setMinimum(-1);
+ m_slider->setMaximum(qRound((m_item->max.toReal() - m_item->min.toReal()) / m_item->step.toReal()));
+ m_slider->setValue(-1);
+ m_valueLabel = new QLabel();
+ }
+ m_nameLabel = new QLabel(QLatin1String(m_item->name));
+ if (m_item->unit && m_item->unit[0])
+ m_nameLabel->setText(m_nameLabel->text() + QLatin1String(" [") + QLatin1String(m_item->unit) + QLatin1String("]"));
+ m_resetButton = new QToolButton();
+ m_resetButton->setText(QLatin1String("Reset"));
+ m_resetButton->setEnabled(false);
+
+ connect(m_resetButton, SIGNAL(clicked()), this, SLOT(reset()));
+ if (m_slider) {
+ connect(m_slider, SIGNAL(valueChanged(int)), this, SLOT(controlChanged(int)));
+ m_slider->setMinimum(0);
+ } else if (m_combo) {
+ connect(m_combo, SIGNAL(currentIndexChanged(int)), this, SLOT(controlChanged(int)));
+ }
+ }
+
+ void setScroller(QWidget *widget)
+ {
+ m_widget = widget;
+ QScroller *scroller = QScroller::scroller(widget);
+ QScrollerProperties properties = QScroller::scroller(widget)->scrollerProperties();
+
+ if (m_slider)
+ m_slider->setEnabled(scroller);
+ if (m_combo)
+ m_combo->setEnabled(scroller);
+ m_nameLabel->setEnabled(scroller);
+ if (m_valueLabel)
+ m_valueLabel->setEnabled(scroller);
+ m_resetButton->setEnabled(scroller);
+
+ if (!scroller)
+ return;
+
+ m_default_value = properties.scrollMetric(m_item->metric);
+ valueChanged(m_default_value);
+ }
+
+ QWidget *nameLabel() { return m_nameLabel; }
+ QWidget *valueLabel() { return m_valueLabel; }
+ QWidget *valueControl() { if (m_combo) return m_combo; else return m_slider; }
+ QWidget *resetButton() { return m_resetButton; }
+
+private slots:
+ void valueChanged(const QVariant &v)
+ {
+ m_value = v;
+ if (m_slider) {
+ switch (m_item->min.type()) {
+ case QMetaType::Float:
+ case QVariant::Double: {
+ m_slider->setValue(qRound((m_value.toReal() * m_item->scaling - m_item->min.toReal()) / m_item->step.toReal()));
+ break;
+ }
+ case QVariant::Int: {
+ m_slider->setValue(qRound((m_value.toInt() * m_item->scaling - m_item->min.toInt()) / m_item->step.toInt()));
+ break;
+ }
+ default: break;
+ }
+ } else if (m_combo) {
+ if (m_item->min.type() == QVariant::EasingCurve) {
+ m_combo->setCurrentIndex(m_combo->findData(v.toEasingCurve().type()));
+ } else if (m_item->min.userType() == m_overshootPolicyType) {
+ m_combo->setCurrentIndex(m_combo->findData(v.value<QScrollerProperties::OvershootPolicy>()));
+ } else if (m_item->min.userType() == m_frameRateType) {
+ m_combo->setCurrentIndex(m_combo->findData(v.value<QScrollerProperties::FrameRates>()));
+ }
+ }
+ }
+
+ void controlChanged(int value)
+ {
+ bool combo = (m_combo && (sender() == m_combo));
+ QString text;
+
+ if (m_slider && !combo) {
+ switch (m_item->min.type()) {
+ case QMetaType::Float:
+ case QVariant::Double: {
+ qreal d = m_item->min.toReal() + qreal(value) * m_item->step.toReal();
+ text = QString::number(d);
+ m_value = d / qreal(m_item->scaling);
+ break;
+ }
+ case QVariant::Int: {
+ int i = m_item->min.toInt() + qRound(qreal(value) * m_item->step.toReal());
+ text = QString::number(i);
+ m_value = i / m_item->scaling;
+ break;
+ }
+ default: break;
+ }
+ } else if (m_combo && combo) {
+ if (m_item->min.type() == QVariant::EasingCurve) {
+ m_value = QVariant(QEasingCurve(static_cast<QEasingCurve::Type>(m_combo->itemData(value).toInt())));
+ } else if (m_item->min.userType() == m_overshootPolicyType) {
+ m_value = QVariant::fromValue(static_cast<QScrollerProperties::OvershootPolicy>(m_combo->itemData(value).toInt()));
+ } else if (m_item->min.userType() == m_frameRateType) {
+ m_value = QVariant::fromValue(static_cast<QScrollerProperties::FrameRates>(m_combo->itemData(value).toInt()));
+ }
+ }
+ if (m_valueLabel)
+ m_valueLabel->setText(text);
+ if (m_widget && QScroller::scroller(m_widget)) {
+ QScrollerProperties properties = QScroller::scroller(m_widget)->scrollerProperties();
+ properties.setScrollMetric(m_item->metric, m_value);
+ QScroller::scroller(m_widget)->setScrollerProperties(properties);
+ }
+
+ m_resetButton->setEnabled(m_value != m_default_value);
+ }
+
+ void reset()
+ {
+ QScrollerProperties properties = QScroller::scroller(m_widget)->scrollerProperties();
+ properties.setScrollMetric(m_item->metric, m_value);
+ QScroller::scroller(m_widget)->setScrollerProperties(properties);
+ valueChanged(m_default_value);
+ }
+
+private:
+ MetricItem *m_item;
+ int m_frameRateType;
+ int m_overshootPolicyType;
+
+ QWidget *m_widget;
+ QSlider *m_slider;
+ QComboBox *m_combo;
+ QLabel *m_nameLabel, *m_valueLabel;
+ QToolButton *m_resetButton;
+
+ QVariant m_value, m_default_value;
+};
+
+#define METRIC(x) QScrollerProperties::x, #x
+
+MetricItem items[] = {
+ { METRIC(MousePressEventDelay), 1000, "ms", qreal(0), qreal(2000), qreal(10) },
+ { METRIC(DragStartDistance), 1000, "mm", qreal(1), qreal(20), qreal(0.1) },
+ { METRIC(DragVelocitySmoothingFactor), 1, "", qreal(0), qreal(1), qreal(0.1) },
+ { METRIC(AxisLockThreshold), 1, "", qreal(0), qreal(1), qreal(0.01) },
+
+ { METRIC(ScrollingCurve), 1, "", QEasingCurve(), 0, 0 },
+ { METRIC(DecelerationFactor), 1, "", qreal(0), qreal(3), qreal(0.01) },
+
+ { METRIC(MinimumVelocity), 1, "m/s", qreal(0), qreal(7), qreal(0.01) },
+ { METRIC(MaximumVelocity), 1, "m/s", qreal(0), qreal(7), qreal(0.01) },
+ { METRIC(MaximumClickThroughVelocity), 1, "m/s", qreal(0), qreal(7), qreal(0.01) },
+
+ { METRIC(AcceleratingFlickMaximumTime), 1000, "ms", qreal(100), qreal(5000), qreal(100) },
+ { METRIC(AcceleratingFlickSpeedupFactor), 1, "", qreal(1), qreal(7), qreal(0.1) },
+
+ { METRIC(SnapPositionRatio), 1, "", qreal(0.1), qreal(0.9), qreal(0.1) },
+ { METRIC(SnapTime), 1000, "ms", qreal(0), qreal(2000), qreal(10) },
+
+ { METRIC(OvershootDragResistanceFactor), 1, "", qreal(0), qreal(1), qreal(0.01) },
+ { METRIC(OvershootDragDistanceFactor), 1, "", qreal(0), qreal(1), qreal(0.01) },
+ { METRIC(OvershootScrollDistanceFactor), 1, "", qreal(0), qreal(1), qreal(0.01) },
+ { METRIC(OvershootScrollTime), 1000, "ms", qreal(0), qreal(2000), qreal(10) },
+
+ { METRIC(HorizontalOvershootPolicy), 1, "", QVariant::fromValue(QScrollerProperties::OvershootWhenScrollable), 0, 0 },
+ { METRIC(VerticalOvershootPolicy), 1, "", QVariant::fromValue(QScrollerProperties::OvershootWhenScrollable), 0, 0 },
+ { METRIC(FrameRate), 1, "", QVariant::fromValue(QScrollerProperties::Standard), 0, 0 },
+};
+
+#undef METRIC
+
+void SettingsWidget::addToGrid(QGridLayout *grid, QWidget *label, int widgetCount, ...)
+{
+ va_list args;
+ va_start(args, widgetCount);
+
+ int rows = grid->rowCount();
+ int cols = grid->columnCount();
+
+ if (label) {
+ if (m_smallscreen)
+ grid->addWidget(label, rows++, 0, 1, qMax(cols, widgetCount));
+ else
+ grid->addWidget(label, rows, 0);
+ }
+ for (int i = 0; i < widgetCount; i++) {
+ if (QWidget *w = va_arg(args, QWidget *))
+ grid->addWidget(w, rows, m_smallscreen ? i : i + 1);
+ }
+ va_end(args);
+}
+
+SettingsWidget::SettingsWidget(bool smallscreen)
+ : QScrollArea()
+ , m_widget(0)
+ , m_snapoverlay(0)
+ , m_smallscreen(smallscreen)
+{
+ setWindowTitle(QLatin1String("Settings"));
+ QWidget *view = new QWidget();
+ QVBoxLayout *layout = new QVBoxLayout(view);
+ QGroupBox *grp;
+ QGridLayout *grid;
+
+ // GROUP: SCROLL METRICS
+
+ grp = new QGroupBox(QLatin1String("Scroll Metrics"));
+ grid = new QGridLayout();
+ grid->setVerticalSpacing(m_smallscreen ? 4 : 2);
+
+ for (int i = 0; i < int(sizeof(items) / sizeof(items[0])); i++) {
+ MetricItemUpdater *u = new MetricItemUpdater(items + i);
+ u->setParent(this);
+ addToGrid(grid, u->nameLabel(), 3, u->valueControl(), u->valueLabel(), u->resetButton());
+ m_metrics.append(u);
+ }
+ grp->setLayout(grid);
+ layout->addWidget(grp);
+
+ // GROUP: SCROLL TO
+
+ grp = new QGroupBox(QLatin1String("Scroll To"));
+ grid = new QGridLayout();
+ grid->setVerticalSpacing(m_smallscreen ? 4 : 2);
+
+ m_scrollx = new QSpinBox();
+ m_scrolly = new QSpinBox();
+ m_scrolltime = new QSpinBox();
+ m_scrolltime->setRange(0, 10000);
+ m_scrolltime->setValue(1000);
+ m_scrolltime->setSuffix(QLatin1String(" ms"));
+ QPushButton *go = new QPushButton(QLatin1String("Go"));
+ connect(go, SIGNAL(clicked()), this, SLOT(scrollTo()));
+ connect(m_scrollx, SIGNAL(editingFinished()), this, SLOT(scrollTo()));
+ connect(m_scrolly, SIGNAL(editingFinished()), this, SLOT(scrollTo()));
+ connect(m_scrolltime, SIGNAL(editingFinished()), this, SLOT(scrollTo()));
+ grid->addWidget(new QLabel(QLatin1String("X:")), 0, 0);
+ grid->addWidget(m_scrollx, 0, 1);
+ grid->addWidget(new QLabel(QLatin1String("Y:")), 0, 2);
+ grid->addWidget(m_scrolly, 0, 3);
+ int row = smallscreen ? 1 : 0;
+ int col = smallscreen ? 0 : 4;
+ grid->addWidget(new QLabel(QLatin1String("in")), row, col++);
+ grid->addWidget(m_scrolltime, row, col++);
+ if (smallscreen) {
+ grid->addWidget(go, row, col + 1);
+ } else {
+ grid->addWidget(go, row, col);
+ grid->setColumnStretch(5, 1);
+ grid->setColumnStretch(6, 1);
+ }
+ grid->setColumnStretch(1, 1);
+ grid->setColumnStretch(3, 1);
+ grp->setLayout(grid);
+ layout->addWidget(grp);
+
+ QLayout *snapbox = new QHBoxLayout();
+
+ // GROUP: SNAP POINTS X
+
+ grp = new QGroupBox(QLatin1String("Snap Positions X"));
+ QBoxLayout *vbox = new QVBoxLayout();
+ vbox->setSpacing(m_smallscreen ? 4 : 2);
+ m_snapx = new QComboBox();
+ m_snapx->addItem(QLatin1String("No Snapping"), NoSnap);
+ m_snapx->addItem(QLatin1String("Snap to Interval"), SnapToInterval);
+ m_snapx->addItem(QLatin1String("Snap to List"), SnapToList);
+ connect(m_snapx, SIGNAL(currentIndexChanged(int)), this, SLOT(snapModeChanged(int)));
+ vbox->addWidget(m_snapx);
+
+ m_snapxinterval = new QWidget();
+ grid = new QGridLayout();
+ grid->setVerticalSpacing(m_smallscreen ? 4 : 2);
+ m_snapxfirst = new QSpinBox();
+ connect(m_snapxfirst, SIGNAL(valueChanged(int)), this, SLOT(snapPositionsChanged()));
+ grid->addWidget(new QLabel("First:"), 0, 0);
+ grid->addWidget(m_snapxfirst, 0, 1);
+ m_snapxstep = new QSpinBox();
+ connect(m_snapxstep, SIGNAL(valueChanged(int)), this, SLOT(snapPositionsChanged()));
+ grid->addWidget(new QLabel("Interval:"), 0, 2);
+ grid->addWidget(m_snapxstep, 0, 3);
+ m_snapxinterval->setLayout(grid);
+ vbox->addWidget(m_snapxinterval);
+ m_snapxinterval->hide();
+
+ m_snapxlist = new QPlainTextEdit();
+ m_snapxlist->setToolTip(QLatin1String("One snap position per line. Empty lines are ignored."));
+ m_snapxlist->installEventFilter(this);
+ connect(m_snapxlist, SIGNAL(textChanged()), this, SLOT(snapPositionsChanged()));
+ vbox->addWidget(m_snapxlist);
+ m_snapxlist->hide();
+
+ vbox->addStretch(100);
+ grp->setLayout(vbox);
+ snapbox->addWidget(grp);
+
+ // GROUP: SNAP POINTS Y
+
+ grp = new QGroupBox(QLatin1String("Snap Positions Y"));
+ vbox = new QVBoxLayout();
+ vbox->setSpacing(m_smallscreen ? 4 : 2);
+ m_snapy = new QComboBox();
+ m_snapy->addItem(QLatin1String("No Snapping"), NoSnap);
+ m_snapy->addItem(QLatin1String("Snap to Interval"), SnapToInterval);
+ m_snapy->addItem(QLatin1String("Snap to List"), SnapToList);
+ connect(m_snapy, SIGNAL(currentIndexChanged(int)), this, SLOT(snapModeChanged(int)));
+ vbox->addWidget(m_snapy);
+
+ m_snapyinterval = new QWidget();
+ grid = new QGridLayout();
+ grid->setVerticalSpacing(m_smallscreen ? 4 : 2);
+ m_snapyfirst = new QSpinBox();
+ connect(m_snapyfirst, SIGNAL(valueChanged(int)), this, SLOT(snapPositionsChanged()));
+ grid->addWidget(new QLabel("First:"), 0, 0);
+ grid->addWidget(m_snapyfirst, 0, 1);
+ m_snapystep = new QSpinBox();
+ connect(m_snapystep, SIGNAL(valueChanged(int)), this, SLOT(snapPositionsChanged()));
+ grid->addWidget(new QLabel("Interval:"), 0, 2);
+ grid->addWidget(m_snapystep, 0, 3);
+ m_snapyinterval->setLayout(grid);
+ vbox->addWidget(m_snapyinterval);
+ m_snapyinterval->hide();
+
+ m_snapylist = new QPlainTextEdit();
+ m_snapylist->setToolTip(QLatin1String("One snap position per line. Empty lines are ignored."));
+ m_snapylist->installEventFilter(this);
+ connect(m_snapylist, SIGNAL(textChanged()), this, SLOT(snapPositionsChanged()));
+ vbox->addWidget(m_snapylist);
+ m_snapylist->hide();
+
+ vbox->addStretch(100);
+ grp->setLayout(vbox);
+ snapbox->addWidget(grp);
+
+ layout->addLayout(snapbox);
+
+ layout->addStretch(100);
+ setWidget(view);
+ setWidgetResizable(true);
+}
+
+void SettingsWidget::setScroller(QWidget *widget)
+{
+ delete m_snapoverlay;
+ if (m_widget)
+ m_widget->removeEventFilter(this);
+ QAbstractScrollArea *area = qobject_cast<QAbstractScrollArea *>(widget);
+ if (area)
+ widget = area->viewport();
+ m_widget = widget;
+ m_widget->installEventFilter(this);
+ m_snapoverlay = new SnapOverlay(area);
+ QScrollerProperties properties = QScroller::scroller(widget)->scrollerProperties();
+
+ QMutableListIterator<MetricItemUpdater *> it(m_metrics);
+ while (it.hasNext())
+ it.next()->setScroller(widget);
+
+ if (!widget)
+ return;
+
+ updateScrollRanges();
+}
+
+bool SettingsWidget::eventFilter(QObject *o, QEvent *e)
+{
+ if (o == m_widget && e->type() == QEvent::Resize)
+ updateScrollRanges();
+ return false;
+}
+
+void SettingsWidget::updateScrollRanges()
+{
+ QScrollPrepareEvent spe(QPoint(0, 0));
+ QApplication::sendEvent(m_widget, &spe);
+
+ QSizeF vp = spe.viewportSize();
+ QRectF maxc = spe.contentPosRange();
+
+ m_scrollx->setRange(qRound(-vp.width()), qRound(maxc.width() + vp.width()));
+ m_scrolly->setRange(qRound(-vp.height()), qRound(maxc.height() + vp.height()));
+
+ m_snapxfirst->setRange(maxc.left(), maxc.right());
+ m_snapxstep->setRange(0, maxc.width());
+ m_snapyfirst->setRange(maxc.top(), maxc.bottom());
+ m_snapystep->setRange(0, maxc.height());
+}
+
+void SettingsWidget::scrollTo()
+{
+ if (QApplication::activePopupWidget())
+ return;
+ if ((sender() == m_scrollx) && !m_scrollx->hasFocus())
+ return;
+ if ((sender() == m_scrolly) && !m_scrolly->hasFocus())
+ return;
+ if ((sender() == m_scrolltime) && !m_scrolltime->hasFocus())
+ return;
+
+ if (QScroller *scroller = QScroller::scroller(m_widget))
+ scroller->scrollTo(QPointF(m_scrollx->value(), m_scrolly->value()), m_scrolltime->value());
+}
+
+void SettingsWidget::snapModeChanged(int mode)
+{
+ if (sender() == m_snapx) {
+ m_snapxmode = static_cast<SnapMode>(mode);
+ m_snapxinterval->setVisible(mode == SnapToInterval);
+ m_snapxlist->setVisible(mode == SnapToList);
+ snapPositionsChanged();
+ } else if (sender() == m_snapy) {
+ m_snapymode = static_cast<SnapMode>(mode);
+ m_snapyinterval->setVisible(mode == SnapToInterval);
+ m_snapylist->setVisible(mode == SnapToList);
+ snapPositionsChanged();
+ }
+}
+
+void SettingsWidget::snapPositionsChanged()
+{
+ QScroller *s = QScroller::scroller(m_widget);
+ if (!s)
+ return;
+
+ switch (m_snapxmode) {
+ case NoSnap:
+ s->setSnapPositionsX(QList<qreal>());
+ m_snapoverlay->clear(Qt::Horizontal);
+ break;
+ case SnapToInterval:
+ s->setSnapPositionsX(m_snapxfirst->value(), m_snapxstep->value());
+ m_snapoverlay->set(Qt::Horizontal, m_snapxfirst->value(), m_snapxstep->value());
+ break;
+ case SnapToList:
+ s->setSnapPositionsX(toPositionList(m_snapxlist, m_snapxfirst->minimum(), m_snapxfirst->maximum()));
+ m_snapoverlay->set(Qt::Horizontal, toPositionList(m_snapxlist, m_snapxfirst->minimum(), m_snapxfirst->maximum()));
+ break;
+ }
+ switch (m_snapymode) {
+ case NoSnap:
+ s->setSnapPositionsY(QList<qreal>());
+ m_snapoverlay->clear(Qt::Vertical);
+ break;
+ case SnapToInterval:
+ s->setSnapPositionsY(m_snapyfirst->value(), m_snapystep->value());
+ m_snapoverlay->set(Qt::Vertical, m_snapyfirst->value(), m_snapystep->value());
+ break;
+ case SnapToList:
+ s->setSnapPositionsY(toPositionList(m_snapylist, m_snapyfirst->minimum(), m_snapyfirst->maximum()));
+ m_snapoverlay->set(Qt::Vertical, toPositionList(m_snapylist, m_snapyfirst->minimum(), m_snapyfirst->maximum()));
+ break;
+ }
+}
+
+QList<qreal> SettingsWidget::toPositionList(QPlainTextEdit *list, int vmin, int vmax)
+{
+ QList<qreal> snaps;
+ QList<QTextEdit::ExtraSelection> extrasel;
+ QTextEdit::ExtraSelection uline;
+ uline.format.setUnderlineColor(Qt::red);
+ uline.format.setUnderlineStyle(QTextCharFormat::WaveUnderline);
+ int line = 0;
+
+ foreach (const QString &str, list->toPlainText().split(QLatin1Char('\n'))) {
+ ++line;
+ if (str.isEmpty())
+ continue;
+ bool ok = false;
+ double d = str.toDouble(&ok);
+ if (ok && d >= vmin && d <= vmax) {
+ snaps << d;
+ } else {
+ QTextEdit::ExtraSelection esel = uline;
+ esel.cursor = QTextCursor(list->document()->findBlockByLineNumber(line - 1));
+ esel.cursor.select(QTextCursor::LineUnderCursor);
+ extrasel << esel;
+ }
+ }
+ list->setExtraSelections(extrasel);
+ return snaps;
+}
+
+#include "settingswidget.moc"
diff --git a/examples/scroller/plot/settingswidget.h b/examples/scroller/plot/settingswidget.h
new file mode 100644
index 0000000..0ea201d
--- /dev/null
+++ b/examples/scroller/plot/settingswidget.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 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 SETTINGSWIDGET_H
+#define SETTINGSWIDGET_H
+
+#include <QScrollArea>
+
+QT_BEGIN_NAMESPACE
+class QScroller;
+class QGridLayout;
+class QSpinBox;
+class QComboBox;
+class QCheckBox;
+class QPlainTextEdit;
+QT_END_NAMESPACE
+
+class MetricItemUpdater;
+class SnapOverlay;
+
+class SettingsWidget : public QScrollArea
+{
+ Q_OBJECT
+
+public:
+ SettingsWidget(bool smallscreen = false);
+
+ void setScroller(QWidget *widget);
+
+protected:
+ bool eventFilter(QObject *, QEvent *);
+
+private slots:
+ void scrollTo();
+ void snapModeChanged(int);
+ void snapPositionsChanged();
+
+private:
+ enum SnapMode {
+ NoSnap,
+ SnapToInterval,
+ SnapToList
+ };
+
+ void addToGrid(QGridLayout *grid, QWidget *label, int widgetCount, ...);
+ QList<qreal> toPositionList(QPlainTextEdit *list, int vmin, int vmax);
+ void updateScrollRanges();
+
+ QWidget *m_widget;
+ QSpinBox *m_scrollx, *m_scrolly, *m_scrolltime;
+ QList<MetricItemUpdater *> m_metrics;
+
+ SnapMode m_snapxmode;
+ QComboBox *m_snapx;
+ QWidget *m_snapxinterval;
+ QPlainTextEdit *m_snapxlist;
+ QSpinBox *m_snapxfirst;
+ QSpinBox *m_snapxstep;
+
+ SnapMode m_snapymode;
+ QComboBox *m_snapy;
+ QWidget *m_snapyinterval;
+ QPlainTextEdit *m_snapylist;
+ QSpinBox *m_snapyfirst;
+ QSpinBox *m_snapystep;
+ SnapOverlay *m_snapoverlay;
+
+ bool m_smallscreen;
+};
+
+#endif
diff --git a/examples/scroller/scroller.pro b/examples/scroller/scroller.pro
new file mode 100644
index 0000000..e830745
--- /dev/null
+++ b/examples/scroller/scroller.pro
@@ -0,0 +1,11 @@
+TEMPLATE = subdirs
+SUBDIRS = graphicsview \
+ plot \
+ wheel
+
+# install
+sources.files = *.pro
+sources.path = $$[QT_INSTALL_EXAMPLES]/scroller
+INSTALLS += sources
+
+symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
diff --git a/examples/scroller/wheel/main.cpp b/examples/scroller/wheel/main.cpp
new file mode 100644
index 0000000..4264377
--- /dev/null
+++ b/examples/scroller/wheel/main.cpp
@@ -0,0 +1,119 @@
+/****************************************************************************
+**
+** 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 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 <QtGui>
+#include <qmath.h>
+
+#include "wheelwidget.h"
+
+class MainWindow : public QMainWindow
+{
+ Q_OBJECT
+public:
+ MainWindow(bool touch)
+ : QMainWindow()
+ {
+ makeSlotMachine(touch);
+ setCentralWidget(m_slotMachine);
+ }
+
+ void makeSlotMachine(bool touch)
+ {
+ if (QApplication::desktop()->width() > 1000) {
+ QFont f = font();
+ f.setPointSize(f.pointSize() * 2);
+ setFont(f);
+ }
+
+ m_slotMachine = new QWidget(this);
+ QGridLayout *grid = new QGridLayout(m_slotMachine);
+ grid->setSpacing(20);
+
+ QStringList colors;
+ colors << "Red" << "Magenta" << "Peach" << "Orange" << "Yellow" << "Citro" << "Green" << "Cyan" << "Blue" << "Violet";
+
+ m_wheel1 = new StringWheelWidget(touch);
+ m_wheel1->setItems( colors );
+ grid->addWidget( m_wheel1, 0, 0 );
+
+ m_wheel2 = new StringWheelWidget(touch);
+ m_wheel2->setItems( colors );
+ grid->addWidget( m_wheel2, 0, 1 );
+
+ m_wheel3 = new StringWheelWidget(touch);
+ m_wheel3->setItems( colors );
+ grid->addWidget( m_wheel3, 0, 2 );
+
+ QPushButton *shakeButton = new QPushButton(tr("Shake"));
+ connect(shakeButton, SIGNAL(clicked()), this, SLOT(rotateRandom()));
+
+ grid->addWidget( shakeButton, 1, 0, 1, 3 );
+ }
+
+private slots:
+ void rotateRandom()
+ {
+ m_wheel1->scrollTo(m_wheel1->currentIndex() + (qrand() % 200));
+ m_wheel2->scrollTo(m_wheel2->currentIndex() + (qrand() % 200));
+ m_wheel3->scrollTo(m_wheel3->currentIndex() + (qrand() % 200));
+ }
+
+private:
+ QWidget *m_slotMachine;
+
+ StringWheelWidget *m_wheel1;
+ StringWheelWidget *m_wheel2;
+ StringWheelWidget *m_wheel3;
+};
+
+int main(int argc, char **argv)
+{
+ QApplication a(argc, argv);
+
+ bool touch = a.arguments().contains(QLatin1String("--touch"));
+
+ MainWindow *mw = new MainWindow(touch);
+ mw->show();
+
+ return a.exec();
+}
+
+#include "main.moc"
diff --git a/examples/scroller/wheel/wheel.pro b/examples/scroller/wheel/wheel.pro
new file mode 100644
index 0000000..1f9b789
--- /dev/null
+++ b/examples/scroller/wheel/wheel.pro
@@ -0,0 +1,16 @@
+HEADERS = wheelwidget.h
+SOURCES = wheelwidget.cpp \
+ main.cpp
+
+QT += webkit
+
+# install
+target.path = $$[QT_INSTALL_EXAMPLES]/scroller/wheel
+sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS wheel.pro
+sources.path = $$[QT_INSTALL_EXAMPLES]/scroller/wheel
+INSTALLS += target sources
+
+symbian {
+ TARGET.UID3 = 0xA000CF66
+ include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
+}
diff --git a/examples/scroller/wheel/wheelwidget.cpp b/examples/scroller/wheel/wheelwidget.cpp
new file mode 100644
index 0000000..64a459b
--- /dev/null
+++ b/examples/scroller/wheel/wheelwidget.cpp
@@ -0,0 +1,276 @@
+/****************************************************************************
+**
+** 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 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 <QtGui>
+
+#include "wheelwidget.h"
+
+#define WHEEL_SCROLL_OFFSET 50000.0
+
+AbstractWheelWidget::AbstractWheelWidget(bool touch, QWidget *parent)
+ : QWidget(parent)
+ , m_currentItem(0)
+ , m_itemOffset(0)
+{
+// ![0]
+ QScroller::grabGesture(this, touch ? QScroller::TouchGesture : QScroller::LeftMouseButtonGesture);
+// ![0]
+}
+
+AbstractWheelWidget::~AbstractWheelWidget()
+{ }
+
+int AbstractWheelWidget::currentIndex() const
+{
+ return m_currentItem;
+}
+
+void AbstractWheelWidget::setCurrentIndex(int index)
+{
+ if (index >= 0 && index < itemCount()) {
+ m_currentItem = index;
+ m_itemOffset = 0;
+ update();
+ }
+}
+
+bool AbstractWheelWidget::event(QEvent *e)
+{
+ switch (e->type()) {
+// ![1]
+ case QEvent::ScrollPrepare:
+ {
+ // We set the snap positions as late as possible so that we are sure
+ // we get the correct itemHeight
+ QScroller *scroller = QScroller::scroller(this);
+ scroller->setSnapPositionsY( WHEEL_SCROLL_OFFSET, itemHeight() );
+
+ QScrollPrepareEvent *se = static_cast<QScrollPrepareEvent *>(e);
+ se->setViewportSize(QSizeF(size()));
+ // we claim a huge scrolling area and a huge content position and
+ // hope that the user doesn't notice that the scroll area is restricted
+ se->setContentPosRange(QRectF(0.0, 0.0, 0.0, WHEEL_SCROLL_OFFSET * 2));
+ se->setContentPos(QPointF(0.0, WHEEL_SCROLL_OFFSET + m_currentItem * itemHeight() + m_itemOffset));
+ se->accept();
+ return true;
+ }
+// ![1]
+// ![2]
+ case QEvent::Scroll:
+ {
+ QScrollEvent *se = static_cast<QScrollEvent *>(e);
+
+ qreal y = se->contentPos().y();
+ int iy = y - WHEEL_SCROLL_OFFSET;
+ int ih = itemHeight();
+
+// ![2]
+
+ // -- calculate the current item position and offset and redraw the widget
+ int ic = itemCount();
+ if (ic>0) {
+ m_currentItem = iy / ih % ic;
+ m_itemOffset = iy % ih;
+
+ // take care when scrolling backwards. Modulo returns negative numbers
+ if (m_itemOffset < 0) {
+ m_itemOffset += ih;
+ m_currentItem--;
+ }
+
+ if (m_currentItem < 0)
+ m_currentItem += ic;
+ }
+ // -- repaint
+ update();
+
+ se->accept();
+ return true;
+ }
+ default:
+ return QWidget::event(e);
+ }
+ return true;
+}
+
+void AbstractWheelWidget::paintEvent(QPaintEvent* event)
+{
+ Q_UNUSED( event );
+
+ // -- first calculate size and position.
+ int w = width();
+ int h = height();
+
+ QPainter painter(this);
+ QPalette palette = QApplication::palette();
+ QPalette::ColorGroup colorGroup = isEnabled() ? QPalette::Active : QPalette::Disabled;
+
+ // linear gradient brush
+ QLinearGradient grad(0.5, 0, 0.5, 1.0);
+ grad.setColorAt(0, palette.color(colorGroup, QPalette::ButtonText));
+ grad.setColorAt(0.2, palette.color(colorGroup, QPalette::Button));
+ grad.setColorAt(0.8, palette.color(colorGroup, QPalette::Button));
+ grad.setColorAt(1.0, palette.color(colorGroup, QPalette::ButtonText));
+ grad.setCoordinateMode( QGradient::ObjectBoundingMode );
+ QBrush gBrush( grad );
+
+ // paint a border and background
+ painter.setPen(palette.color(colorGroup, QPalette::ButtonText));
+ painter.setBrush(gBrush);
+ // painter.setBrushOrigin( QPointF( 0.0, 0.0 ) );
+ painter.drawRect( 0, 0, w-1, h-1 );
+
+ // paint inner border
+ painter.setPen(palette.color(colorGroup, QPalette::Button));
+ painter.setBrush(Qt::NoBrush);
+ painter.drawRect( 1, 1, w-3, h-3 );
+
+ // paint the items
+ painter.setClipRect( QRect( 3, 3, w-6, h-6 ) );
+ painter.setPen(palette.color(colorGroup, QPalette::ButtonText));
+
+ int iH = itemHeight();
+ int iC = itemCount();
+ if (iC > 0) {
+
+ m_itemOffset = m_itemOffset % iH;
+
+ for (int i=-h/2/iH; i<=h/2/iH+1; i++) {
+
+ int itemNum = m_currentItem + i;
+ while (itemNum < 0)
+ itemNum += iC;
+ while (itemNum >= iC)
+ itemNum -= iC;
+
+ paintItem(&painter, itemNum, QRect(6, h/2 +i*iH - m_itemOffset - iH/2, w-6, iH ));
+ }
+ }
+
+ // draw a transparent bar over the center
+ QColor highlight = palette.color(colorGroup, QPalette::Highlight);
+ highlight.setAlpha(150);
+
+ QLinearGradient grad2(0.5, 0, 0.5, 1.0);
+ grad2.setColorAt(0, highlight);
+ grad2.setColorAt(1.0, highlight.lighter());
+ grad2.setCoordinateMode( QGradient::ObjectBoundingMode );
+ QBrush gBrush2( grad2 );
+
+ QLinearGradient grad3(0.5, 0, 0.5, 1.0);
+ grad3.setColorAt(0, highlight);
+ grad3.setColorAt(1.0, highlight.darker());
+ grad3.setCoordinateMode( QGradient::ObjectBoundingMode );
+ QBrush gBrush3( grad3 );
+
+ painter.fillRect( QRect( 0, h/2 - iH/2, w, iH/2 ), gBrush2 );
+ painter.fillRect( QRect( 0, h/2, w, iH/2 ), gBrush3 );
+}
+
+/*!
+ Rotates the wheel widget to a given index.
+ You can also give an index greater than itemCount or less than zero in which
+ case the wheel widget will scroll in the given direction and end up with
+ (index % itemCount)
+*/
+void AbstractWheelWidget::scrollTo(int index)
+{
+ QScroller *scroller = QScroller::scroller(this);
+
+ scroller->scrollTo(QPointF(0, WHEEL_SCROLL_OFFSET + index * itemHeight()), 5000);
+}
+
+/*!
+ \class StringWheelWidget
+ \brief The StringWheelWidget class is an implementation of the AbstractWheelWidget class that draws QStrings as items.
+ \sa AbstractWheelWidget
+*/
+
+StringWheelWidget::StringWheelWidget(bool touch)
+ : AbstractWheelWidget(touch)
+{ }
+
+QStringList StringWheelWidget::items() const
+{
+ return m_items;
+}
+
+void StringWheelWidget::setItems( const QStringList &items )
+{
+ m_items = items;
+ if (m_currentItem >= items.count())
+ m_currentItem = items.count()-1;
+ update();
+}
+
+
+QSize StringWheelWidget::sizeHint() const
+{
+ // determine font size
+ QFontMetrics fm(font());
+
+ return QSize( fm.width("m") * 10 + 6, fm.height() * 7 + 6 );
+}
+
+QSize StringWheelWidget::minimumSizeHint() const
+{
+ QFontMetrics fm(font());
+
+ return QSize( fm.width("m") * 5 + 6, fm.height() * 3 + 6 );
+}
+
+void StringWheelWidget::paintItem(QPainter* painter, int index, const QRect &rect)
+{
+ painter->drawText(rect, Qt::AlignCenter, m_items.at(index));
+}
+
+int StringWheelWidget::itemHeight() const
+{
+ QFontMetrics fm(font());
+ return fm.height();
+}
+
+int StringWheelWidget::itemCount() const
+{
+ return m_items.count();
+}
+
+
diff --git a/examples/scroller/wheel/wheelwidget.h b/examples/scroller/wheel/wheelwidget.h
new file mode 100644
index 0000000..c50f951
--- /dev/null
+++ b/examples/scroller/wheel/wheelwidget.h
@@ -0,0 +1,104 @@
+/****************************************************************************
+**
+** 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 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 WHEELWIDGET_H
+#define WHEELWIDGET_H
+
+#include <QWidget>
+#include <QStringList>
+
+QT_BEGIN_NAMESPACE
+class QPainter;
+class QRect;
+QT_END_NAMESPACE
+
+class AbstractWheelWidget : public QWidget {
+ Q_OBJECT
+
+public:
+ AbstractWheelWidget(bool touch, QWidget *parent = 0);
+ virtual ~AbstractWheelWidget();
+
+ int currentIndex() const;
+ void setCurrentIndex(int index);
+
+ bool event(QEvent*);
+ void paintEvent(QPaintEvent *e);
+ virtual void paintItem(QPainter* painter, int index, const QRect &rect) = 0;
+
+ virtual int itemHeight() const = 0;
+ virtual int itemCount() const = 0;
+
+public slots:
+ void scrollTo(int index);
+
+signals:
+ void stopped(int index);
+
+protected:
+ int m_currentItem;
+ int m_itemOffset; // 0-itemHeight()
+ qreal m_lastY;
+};
+
+
+class StringWheelWidget : public AbstractWheelWidget {
+ Q_OBJECT
+
+public:
+ StringWheelWidget(bool touch);
+
+ QStringList items() const;
+ void setItems( const QStringList &items );
+
+ QSize sizeHint() const;
+ QSize minimumSizeHint() const;
+
+ void paintItem(QPainter* painter, int index, const QRect &rect);
+
+ int itemHeight() const;
+ int itemCount() const;
+
+private:
+ QStringList m_items;
+};
+
+#endif // WHEELWIDGET_H
diff --git a/examples/tools/echoplugin/echowindow/echowindow.pro b/examples/tools/echoplugin/echowindow/echowindow.pro
index c2abc6a..67c5237 100644
--- a/examples/tools/echoplugin/echowindow/echowindow.pro
+++ b/examples/tools/echoplugin/echowindow/echowindow.pro
@@ -6,8 +6,8 @@ SOURCES = echowindow.cpp \
TARGET = echoplugin
QMAKE_PROJECT_NAME = echopluginwindow
win32 {
- debug:DESTDIR = ../debug/
- release:DESTDIR = ../release/
+ CONFIG(debug, release|debug):DESTDIR = ../debug/
+ CONFIG(release, release|debug):DESTDIR = ../release/
} else {
DESTDIR = ../
}
diff --git a/examples/tools/styleplugin/plugin/plugin.pro b/examples/tools/styleplugin/plugin/plugin.pro
index 7cb0c97..54e266c 100644
--- a/examples/tools/styleplugin/plugin/plugin.pro
+++ b/examples/tools/styleplugin/plugin/plugin.pro
@@ -8,8 +8,8 @@ SOURCES = simplestyle.cpp \
TARGET = simplestyleplugin
#! [0]
win32 {
- debug:DESTDIR = ../debug/styles/
- release:DESTDIR = ../release/styles/
+ CONFIG(debug, release|debug):DESTDIR = ../debug/styles/
+ CONFIG(release, release|debug):DESTDIR = ../release/styles/
} else {
DESTDIR = ../styles/
}
diff --git a/mkspecs/common/symbian/symbian.conf b/mkspecs/common/symbian/symbian.conf
index 0b5c573..8c79d8b 100644
--- a/mkspecs/common/symbian/symbian.conf
+++ b/mkspecs/common/symbian/symbian.conf
@@ -3,7 +3,7 @@
#
TEMPLATE = app
-CONFIG += qt warn_on release incremental link_prl sis_targets run_on_phone
+CONFIG += prepend_includepath qt warn_on release incremental link_prl sis_targets run_on_phone
QT += core gui
QMAKE_INCREMENTAL_STYLE = sublib
@@ -70,12 +70,12 @@ QMAKE_LIBS_CORE = $$QMAKE_LIBS -lefsrv -lhal -lbafl
QMAKE_LIBS_GUI = $$QMAKE_LIBS_CORE -lfbscli -lbitgdi -lgdi -lws32 -lapgrfx -lcone -leikcore -lmediaclientaudio -lapparc -lcentralrepository
QMAKE_LIBS_NETWORK =
QMAKE_LIBS_EGL = -llibEGL
-QMAKE_LIBS_OPENGL = -llibglesv2
+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_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_OPENGL_ES2_QT = -llibGLESv2 -lcone -lws32
QMAKE_LIBS_OPENVG = -llibOpenVG -lfbscli -lbitgdi -lgdi
QMAKE_LIBS_THREAD = -llibpthread
QMAKE_LIBS_COMPAT =
@@ -139,11 +139,15 @@ SYMBIAN_SUPPORTED_LANGUAGES = \
mr mo mn nb pl pt pa ro ru sr \
si sk sl so es sw sv tl ta te \
th bo ti tr tk uk ur vi cy zu \
- nn
+ nn eu zh gl fa st en_US fr_BE \
+ pt_BR en_CA fr_CA el_CY tr_CY \
+ en_TW en_HK en_CN en_JP en_TH \
+ sv_FI zh_HK es_419 en_ZA fr_CH \
+ de_CH it_CH zh_TW
# These directories must match what configure uses for QT_INSTALL_PLUGINS and QT_INSTALL_IMPORTS
QT_PLUGINS_BASE_DIR = /resource/qt$${QT_LIBINFIX}/plugins
-QT_IMPORTS_BASE_DIR = /resource/qt/imports
+QT_IMPORTS_BASE_DIR = /resource/qt$${QT_LIBINFIX}/imports
load(symbian/platform_paths)
diff --git a/mkspecs/cygwin-g++/qmake.conf b/mkspecs/cygwin-g++/qmake.conf
index ddfceb0..c46384f 100644
--- a/mkspecs/cygwin-g++/qmake.conf
+++ b/mkspecs/cygwin-g++/qmake.conf
@@ -68,6 +68,9 @@ QMAKE_LIBS_X11SM = -lSM -lICE
QMAKE_LIBS_OPENGL = -lGL
QMAKE_LIBS_OPENGL_QT = -lGL
QMAKE_LIBS_THREAD = -lpthread
+QMAKE_PREFIX_SHLIB = lib
+QMAKE_PREFIX_STATICLIB = lib
+QMAKE_EXTENSION_STATICLIB = a
QMAKE_MOC = $$[QT_INSTALL_BINS]/moc
QMAKE_UIC = $$[QT_INSTALL_BINS]/uic
diff --git a/mkspecs/features/qt_functions.prf b/mkspecs/features/qt_functions.prf
index e5ef5a1..964e13b 100644
--- a/mkspecs/features/qt_functions.prf
+++ b/mkspecs/features/qt_functions.prf
@@ -49,16 +49,23 @@ defineTest(qtAddLibrary) {
isEqual(LIB_NAME, QtGui) {
# Needed for #include <QtGui> because qs60mainapplication.h includes aknapp.h
INCLUDEPATH *= $$MW_LAYER_SYSTEMINCLUDE
- }
- isEqual(LIB_NAME, QtWebKit) {
+ } else:isEqual(LIB_NAME, QtWebKit) {
# Needed for because relative inclusion problem in toolchain
INCLUDEPATH *= $$QMAKE_INCDIR_QT/QtXmlPatterns
INCLUDEPATH *= $$QMAKE_INCDIR_QT/QtNetwork
- }
- isEqual(LIB_NAME, QtXmlPatterns) {
+ 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
+ } else:isEqual(LIB_NAME, QtDeclarative) {
+ TARGET.CAPABILITY *= NetworkServices
+ isEmpty(TARGET.EPOCHEAPSIZE):TARGET.EPOCHEAPSIZE = 0x20000 0x2000000
}
+ export(TARGET.EPOCHEAPSIZE)
+ export(TARGET.CAPABILITY)
}
isEmpty(LINKAGE) {
if(!debug_and_release|build_pass):CONFIG(debug, debug|release) {
diff --git a/mkspecs/features/symbian/default_post.prf b/mkspecs/features/symbian/default_post.prf
index ec6ecd0..fffc481 100644
--- a/mkspecs/features/symbian/default_post.prf
+++ b/mkspecs/features/symbian/default_post.prf
@@ -10,11 +10,11 @@ contains(TEMPLATE, ".*app") {
}
contains(DESTDIR, "/.*") {
- default_bin_deployment.sources += $$DESTDIR/$$symbianRemoveSpecialCharacters($$basename(TARGET)).exe
+ default_bin_deployment.files += $$DESTDIR/$$symbianRemoveSpecialCharacters($$basename(TARGET)).exe
} else:isEmpty(DESTDIR) {
- default_bin_deployment.sources += $$OUT_PWD/$$symbianRemoveSpecialCharacters($$basename(TARGET)).exe
+ default_bin_deployment.files += $$OUT_PWD/$$symbianRemoveSpecialCharacters($$basename(TARGET)).exe
} else {
- default_bin_deployment.sources += $$OUT_PWD/$$DESTDIR/$$symbianRemoveSpecialCharacters($$basename(TARGET)).exe
+ default_bin_deployment.files += $$OUT_PWD/$$DESTDIR/$$symbianRemoveSpecialCharacters($$basename(TARGET)).exe
}
default_bin_deployment.path += /sys/bin
@@ -53,6 +53,38 @@ isEmpty(TARGET.UID2) {
}
}
+# Add dependency to Qt package to all other projects besides Qt libs.
+# Note: Qt libs package with full capabilities has UID3 of 0x2001E61C,
+# while self-signed version typically has temporary UID3 of 0xE001E61C.
+contains(CONFIG, qt):!contains(TARGET.UID3, 0x2001E61C):!contains(TARGET.UID3, 0xE001E61C):isEmpty(QT_LIBINFIX) {
+ qt_pkg_name = Qt
+ pkg_depends_qt += \
+ "; Default dependency to Qt libraries" \
+ "(0x2001E61C), $${QT_MAJOR_VERSION}, $${QT_MINOR_VERSION}, $${QT_PATCH_VERSION}, {$$addLanguageDependentPkgItem(qt_pkg_name)}"
+
+ # Projects linking to webkit need dependency to webkit
+ contains(QT, webkit): {
+ # these can be overridden by mkspecs/modules/qt_webkit.pri
+ isEmpty(QT_WEBKIT_MAJOR_VERSION) {
+ QT_WEBKIT_MAJOR_VERSION = $${QT_MAJOR_VERSION}
+ QT_WEBKIT_MINOR_VERSION = $${QT_MINOR_VERSION}
+ QT_WEBKIT_PATCH_VERSION = $${QT_PATCH_VERSION}
+ }
+
+ webkit_pkg_name = QtWebKit
+ pkg_depends_webkit += \
+ "; Dependency to Qt Webkit" \
+ "(0x200267C2), $${QT_WEBKIT_MAJOR_VERSION}, $${QT_WEBKIT_MINOR_VERSION}, $${QT_WEBKIT_PATCH_VERSION}, {$$addLanguageDependentPkgItem(webkit_pkg_name)}"
+ } else {
+ default_deployment.pkg_prerules -= pkg_depends_webkit
+ }
+} else {
+ default_deployment.pkg_prerules -= pkg_depends_webkit pkg_depends_qt
+}
+
+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
platform_product_id = S60ProductID
platform_product_id = $$addLanguageDependentPkgItem(platform_product_id)
diff --git a/mkspecs/features/symbian/localize_deployment.prf b/mkspecs/features/symbian/localize_deployment.prf
index 5f52dbc..26a254b 100644
--- a/mkspecs/features/symbian/localize_deployment.prf
+++ b/mkspecs/features/symbian/localize_deployment.prf
@@ -3,11 +3,13 @@ SYMBIAN_LANG.sq = 35 #Albanian
SYMBIAN_LANG.am = 36 #Amharic
SYMBIAN_LANG.ar = 37 #Arabic
SYMBIAN_LANG.hy = 38 #Armenian
+SYMBIAN_LANG.eu = 102 #Basque
SYMBIAN_LANG.bn = 41 #Bengali
SYMBIAN_LANG.bg = 42 #Bulgarian
SYMBIAN_LANG.my = 43 #Burmese
SYMBIAN_LANG.be = 40 #Byelorussian
SYMBIAN_LANG.ca = 44 #Catalan
+SYMBIAN_LANG.zh = 31 #Chinese
SYMBIAN_LANG.hr = 45 #Croatian
SYMBIAN_LANG.cs = 25 #Czech
SYMBIAN_LANG.da = 07 #Danish
@@ -17,6 +19,7 @@ SYMBIAN_LANG.et = 49 #Estonian
SYMBIAN_LANG.fi = 09 #Finnish
SYMBIAN_LANG.fr = 02 #French
SYMBIAN_LANG.gd = 52 #Gaelic
+SYMBIAN_LANG.gl = 103 #Galician
SYMBIAN_LANG.ka = 53 #Georgian
SYMBIAN_LANG.de = 03 #German
SYMBIAN_LANG.el = 54 #Greek
@@ -42,6 +45,8 @@ SYMBIAN_LANG.mr = 72 #Marathi
SYMBIAN_LANG.mo = 73 #Moldavian
SYMBIAN_LANG.mn = 74 #Mongolian
SYMBIAN_LANG.nb = 08 #Norwegian
+SYMBIAN_LANG.nn = 75 #Nynorsk
+SYMBIAN_LANG.fa = 50 #Persian
SYMBIAN_LANG.pl = 27 #Polish
SYMBIAN_LANG.pt = 13 #Portuguese
SYMBIAN_LANG.pa = 77 #Punjabi
@@ -52,6 +57,7 @@ SYMBIAN_LANG.si = 80 #Singhalese
SYMBIAN_LANG.sk = 26 #Slovak
SYMBIAN_LANG.sl = 28 #Slovenian
SYMBIAN_LANG.so = 81 #Somali
+SYMBIAN_LANG.st = 101 #South Sotho/Sesotho
SYMBIAN_LANG.es = 04 #Spanish
SYMBIAN_LANG.sw = 84 #Swahili
SYMBIAN_LANG.sv = 06 #Swedish
@@ -68,7 +74,28 @@ SYMBIAN_LANG.ur = 94 #Urdu
SYMBIAN_LANG.vi = 96 #Vietnamese
SYMBIAN_LANG.cy = 97 #Welsh
SYMBIAN_LANG.zu = 98 #Zulu
-SYMBIAN_LANG.nn = 75 #Nynorsk
+
+# Regional dialects
+SYMBIAN_LANG.en_US = 10 #American English
+SYMBIAN_LANG.fr_BE = 21 #Belgian French
+SYMBIAN_LANG.pt_BR = 76 #Brazilian Portuguese
+SYMBIAN_LANG.en_CA = 46 #Canadian English
+SYMBIAN_LANG.fr_CA = 51 #Canadian French
+SYMBIAN_LANG.el_CY = 55 #Cyprus Greek
+SYMBIAN_LANG.tr_CY = 91 #Cyprus Turkish
+SYMBIAN_LANG.en_TW = 157 #English as appropriate for use in Taiwan
+SYMBIAN_LANG.en_HK = 158 #English as appropriate for use in Hong Kong
+SYMBIAN_LANG.en_CN = 159 #English as appropriate for use in the Peoples Republic of China
+SYMBIAN_LANG.en_JP = 160 #English as appropriate for use in Japan
+SYMBIAN_LANG.en_TH = 161 #English as appropriate for use in Thailand
+SYMBIAN_LANG.sv_FI = 85 #Finland Swedish
+SYMBIAN_LANG.zh_HK = 30 #HongKong Chinese
+SYMBIAN_LANG.es_419 = 83 #Latin American Spanish
+SYMBIAN_LANG.en_ZA = 48 #South African English
+SYMBIAN_LANG.fr_CH = 11 #Swiss French
+SYMBIAN_LANG.de_CH = 12 #Swiss German
+SYMBIAN_LANG.it_CH = 61 #Swiss Italian
+SYMBIAN_LANG.zh_TW = 29 #Taiwan Chinese
isEmpty(SYMBIAN_MATCHED_LANGUAGES) {
matchSymbianLanguages()
diff --git a/mkspecs/features/symbian/prepend_includepath.prf b/mkspecs/features/symbian/prepend_includepath.prf
new file mode 100644
index 0000000..d9fd4fe
--- /dev/null
+++ b/mkspecs/features/symbian/prepend_includepath.prf
@@ -0,0 +1,14 @@
+# Allow .pro files to specify include path(s) to be prepended to the list.
+#
+# This allows the project to override the default ordering, whereby paths
+# relative to $$QMAKE_INCDIR_QT always come first. This ordering can cause
+# problems when both the epoc32/include tree and a Qt include directory
+# contain a header of the same name - in this case, the Qt header is always
+# included by virtue of its path appearing first in the SYSTEMINCLUDE
+# directives in the generated MMP file.
+#
+# To work around this situation, the following line can be added to the .pro
+# file:
+# PREPEND_INCLUDEPATH = /epoc32/include
+#
+INCLUDEPATH = $$PREPEND_INCLUDEPATH $$INCLUDEPATH
diff --git a/mkspecs/features/symbian/qt.prf b/mkspecs/features/symbian/qt.prf
index c8f97aa..c376b64 100644
--- a/mkspecs/features/symbian/qt.prf
+++ b/mkspecs/features/symbian/qt.prf
@@ -6,53 +6,6 @@ CONFIG += qtmain
load(qt)
-# Allow .pro files to specify include path(s) to be prepended to the list.
-#
-# This allows the project to override the default ordering, whereby paths
-# relative to $$QMAKE_INCDIR_QT always come first. This ordering can cause
-# problems when both the epoc32/include tree and a Qt include directory
-# contain a header of the same name - in this case, the Qt header is always
-# included by virtue of its path appearing first in the SYSTEMINCLUDE
-# directives in the generated MMP file.
-#
-# To work around this situation, the following line can be added to the .pro
-# file:
-# PREPEND_INCLUDEPATH = /epoc32/include
-#
-INCLUDEPATH = $$PREPEND_INCLUDEPATH $$INCLUDEPATH
-
-# Add dependency to Qt package to all other projects besides Qt libs.
-# Note: Qt libs package with full capabilities has UID3 of 0x2001E61C,
-# while self-signed version typically has temporary UID3 of 0xE001E61C.
-contains(CONFIG, qt):!contains(TARGET.UID3, 0x2001E61C):!contains(TARGET.UID3, 0xE001E61C):isEmpty(QT_LIBINFIX) {
- qt_pkg_name = Qt
- pkg_depends_qt += \
- "; Default dependency to Qt libraries" \
- "(0x2001E61C), $${QT_MAJOR_VERSION}, $${QT_MINOR_VERSION}, $${QT_PATCH_VERSION}, {$$addLanguageDependentPkgItem(qt_pkg_name)}"
-
- # Projects linking to webkit need dependency to webkit
- contains(QT, webkit): {
- # these can be overridden by mkspecs/modules/qt_webkit.pri
- isEmpty(QT_WEBKIT_MAJOR_VERSION) {
- QT_WEBKIT_MAJOR_VERSION = $${QT_MAJOR_VERSION}
- QT_WEBKIT_MINOR_VERSION = $${QT_MINOR_VERSION}
- QT_WEBKIT_PATCH_VERSION = $${QT_PATCH_VERSION}
- }
-
- webkit_pkg_name = QtWebKit
- pkg_depends_webkit += \
- "; Dependency to Qt Webkit" \
- "(0x200267C2), $${QT_WEBKIT_MAJOR_VERSION}, $${QT_WEBKIT_MINOR_VERSION}, $${QT_WEBKIT_PATCH_VERSION}, {$$addLanguageDependentPkgItem(webkit_pkg_name)}"
- } else {
- default_deployment.pkg_prerules -= pkg_depends_webkit
- }
-} else {
- default_deployment.pkg_prerules -= pkg_depends_webkit pkg_depends_qt
-}
-
-isEmpty(TARGET.EPOCSTACKSIZE):TARGET.EPOCSTACKSIZE = 0x14000
-isEmpty(TARGET.EPOCHEAPSIZE):TARGET.EPOCHEAPSIZE = 0x020000 0x800000
-
# Workaround for the fact that Gnupoc and Symbian chose different approaches to
# the letter casing of headers.
contains(CONFIG, is_using_gnupoc) {
diff --git a/mkspecs/features/symbian/sis_targets.prf b/mkspecs/features/symbian/sis_targets.prf
index 7456deb..d94693d 100644
--- a/mkspecs/features/symbian/sis_targets.prf
+++ b/mkspecs/features/symbian/sis_targets.prf
@@ -34,19 +34,16 @@ equals(GENERATE_SIS_TARGETS, true) {
make_cache_name = .make.cache
sis_target.target = sis
- sis_target.commands = $(if $(wildcard $${baseTarget}_template.pkg), \
- $(if $(wildcard $$make_cache_name), \
- $(MAKE) -f $(MAKEFILE) ok_sis MAKEFILES=$$make_cache_name \
+ sis_target.commands = $(if $(wildcard $$make_cache_name), \
+ $(MAKE) -f $(MAKEFILE) ok_sis MAKEFILES=$$make_cache_name \
+ , \
+ $(if $(QT_SIS_TARGET), \
+ $(MAKE) -f $(MAKEFILE) ok_sis \
, \
- $(if $(QT_SIS_TARGET), \
- $(MAKE) -f $(MAKEFILE) ok_sis \
- , \
- $(MAKE) -f $(MAKEFILE) fail_sis_nocache \
- ) \
+ $(MAKE) -f $(MAKEFILE) fail_sis_nocache \
) \
- , \
- $(MAKE) -f $(MAKEFILE) fail_sis_nopkg \
)
+
sis_target.depends += $${baseTarget}_template.pkg
ok_sis_target.target = ok_sis
@@ -54,19 +51,16 @@ equals(GENERATE_SIS_TARGETS, true) {
$(QT_SIS_TARGET) $(QT_SIS_CERTIFICATE) $(QT_SIS_KEY) $(QT_SIS_PASSPHRASE)
unsigned_sis_target.target = unsigned_sis
- unsigned_sis_target.commands = $(if $(wildcard $${baseTarget}_template.pkg), \
- $(if $(wildcard $$make_cache_name), \
- $(MAKE) -f $(MAKEFILE) ok_unsigned_sis MAKEFILES=$$make_cache_name \
- , \
- $(if $(QT_SIS_TARGET), \
- $(MAKE) -f $(MAKEFILE) ok_unsigned_sis \
+ unsigned_sis_target.commands = $(if $(wildcard $$make_cache_name), \
+ $(MAKE) -f $(MAKEFILE) ok_unsigned_sis MAKEFILES=$$make_cache_name \
, \
- $(MAKE) -f $(MAKEFILE) fail_sis_nocache \
- ) \
- ) \
- , \
- $(MAKE) -f $(MAKEFILE) fail_sis_nopkg \
- )
+ $(if $(QT_SIS_TARGET), \
+ $(MAKE) -f $(MAKEFILE) ok_unsigned_sis \
+ , \
+ $(MAKE) -f $(MAKEFILE) fail_sis_nocache \
+ ) \
+ )
+
unsigned_sis_target.depends += $${baseTarget}_template.pkg
ok_unsigned_sis_target.target = ok_unsigned_sis
@@ -75,49 +69,39 @@ equals(GENERATE_SIS_TARGETS, true) {
target_sis_target.target = $${baseTarget}.sis
target_sis_target.commands = $(MAKE) -f $(MAKEFILE) sis
+ # The installer_sis target has dependency to sis target, so it will regenerate sis package.
+ # To create smart installer wrapper for for an existing sis package, use ok_installer_sis target directly.
installer_sis_target.target = installer_sis
- installer_sis_target.commands = $(if $(wildcard $${baseTarget}_installer.pkg), \
- $(MAKE) -f $(MAKEFILE) ok_installer_sis \
- , \
- $(MAKE) -f $(MAKEFILE) fail_sis_nopkg \
- )
+ installer_sis_target.commands = $(MAKE) -f $(MAKEFILE) ok_installer_sis
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 - \
$(QT_SIS_CERTIFICATE) $(QT_SIS_KEY) $(QT_SIS_PASSPHRASE)
+ ok_installer_sis_target.depends = $${baseTarget}_installer.pkg
unsigned_installer_sis_target.target = unsigned_installer_sis
- unsigned_installer_sis_target.commands = $(if $(wildcard $${baseTarget}_installer.pkg), \
- $(MAKE) -f $(MAKEFILE) ok_unsigned_installer_sis \
- , \
- $(MAKE) -f $(MAKEFILE) fail_sis_nopkg \
- )
+ unsigned_installer_sis_target.commands = $(MAKE) -f $(MAKEFILE) ok_unsigned_installer_sis
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
-
- fail_sis_nopkg_target.target = fail_sis_nopkg
- fail_sis_nopkg_target.commands = "$(error PKG file does not exist, 'sis' and 'installer_sis' target are only supported for executables or projects with DEPLOYMENT statement)"
+ ok_unsigned_installer_sis_target.depends = $${baseTarget}_installer.pkg
fail_sis_nocache_target.target = fail_sis_nocache
fail_sis_nocache_target.commands = "$(error Project has to be built or QT_SIS_TARGET environment variable has to be set before calling 'SIS' target)"
stub_sis_target.target = stub_sis
- stub_sis_target.commands = $(if $(wildcard $${baseTarget}_template.pkg), \
- $(if $(wildcard $$make_cache_name), \
- $(MAKE) -f $(MAKEFILE) ok_stub_sis MAKEFILES=$$make_cache_name \
+ stub_sis_target.commands = $(if $(wildcard $$make_cache_name), \
+ $(MAKE) -f $(MAKEFILE) ok_stub_sis MAKEFILES=$$make_cache_name \
+ , \
+ $(if $(QT_SIS_TARGET), \
+ $(MAKE) -f $(MAKEFILE) ok_stub_sis \
, \
- $(if $(QT_SIS_TARGET), \
- $(MAKE) -f $(MAKEFILE) ok_stub_sis \
- , \
- $(MAKE) -f $(MAKEFILE) fail_sis_nocache \
- ) \
+ $(MAKE) -f $(MAKEFILE) fail_sis_nocache \
) \
- , \
- $(MAKE) -f $(MAKEFILE) fail_sis_nopkg \
)
+
stub_sis_target.depends += $${baseTarget}_stub.pkg
ok_stub_sis_target.target = ok_stub_sis
@@ -133,7 +117,6 @@ equals(GENERATE_SIS_TARGETS, true) {
ok_installer_sis_target \
unsigned_installer_sis_target \
ok_unsigned_installer_sis_target \
- fail_sis_nopkg_target \
fail_sis_nocache_target \
stub_sis_target \
ok_stub_sis_target
@@ -179,10 +162,14 @@ equals(GENERATE_SIS_TARGETS, true) {
target_sis_target.commands = $(MAKE) -f $(MAKEFILE) sis
installer_sis_target.target = installer_sis
- installer_sis_target.commands = $$QMAKE_CREATEPACKAGE $(QT_SIS_OPTIONS) $${baseTarget}_installer.pkg - \
- $(QT_SIS_CERTIFICATE) $(QT_SIS_KEY) $(QT_SIS_PASSPHRASE)
+ installer_sis_target.commands = $(MAKE) -f $(MAKEFILE) ok_installer_sis
installer_sis_target.depends = $${baseTarget}_installer.pkg sis
+ ok_installer_sis_target.target = ok_installer_sis
+ 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
+
unsigned_installer_sis_target.target = unsigned_installer_sis
unsigned_installer_sis_target.commands = $$QMAKE_CREATEPACKAGE $(QT_SIS_OPTIONS) -o $${baseTarget}_installer.pkg
unsigned_installer_sis_target.depends = $${baseTarget}_installer.pkg unsigned_sis
@@ -198,6 +185,7 @@ equals(GENERATE_SIS_TARGETS, true) {
unsigned_sis_target \
target_sis_target \
installer_sis_target \
+ ok_installer_sis_target \
unsigned_installer_sis_target
QMAKE_DISTCLEAN += $${sis_destdir}/$${baseTarget}.sis
diff --git a/mkspecs/linux-icc/qmake.conf b/mkspecs/linux-icc/qmake.conf
index 6867d86..38916ec 100644
--- a/mkspecs/linux-icc/qmake.conf
+++ b/mkspecs/linux-icc/qmake.conf
@@ -23,7 +23,7 @@ QMAKE_YACC = yacc
QMAKE_YACCFLAGS = -d
QMAKE_CFLAGS = -falign-stack=maintain-16-byte
QMAKE_CFLAGS_DEPS = -M
-QMAKE_CFLAGS_WARN_ON = -w1 -Wcheck -wd654,1572,411,873,1125
+QMAKE_CFLAGS_WARN_ON = -w1 -Wcheck -wd654,1572,411,873,1125,2259
QMAKE_CFLAGS_WARN_OFF = -w
QMAKE_CFLAGS_RELEASE = -O2 -falign-functions=16 -ansi-alias -fstrict-aliasing
QMAKE_CFLAGS_DEBUG = -O0 -g
diff --git a/mkspecs/win32-msvc2005/qmake.conf b/mkspecs/win32-msvc2005/qmake.conf
index aa58e30..0c79561 100644
--- a/mkspecs/win32-msvc2005/qmake.conf
+++ b/mkspecs/win32-msvc2005/qmake.conf
@@ -1,7 +1,7 @@
#
# qmake configuration for win32-msvc2005
#
-# Written for Microsoft VC2005.NET
+# Written for Microsoft Visual C++ 2005
#
MAKEFILE_GENERATOR = MSVC.NET
@@ -53,12 +53,12 @@ QMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ $<
QMAKE_RUN_CXX_IMP_BATCH = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ @<<
QMAKE_LINK = link
-QMAKE_LFLAGS = /NOLOGO
+QMAKE_LFLAGS = /NOLOGO \"/MANIFESTDEPENDENCY:type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\' processorArchitecture=\'*\'\"
QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO
QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO = /DEBUG /OPT:REF
QMAKE_LFLAGS_DEBUG = /DEBUG
QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE
-QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS \"/MANIFESTDEPENDENCY:type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\' processorArchitecture=\'*\'\"
+QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS
QMAKE_LFLAGS_DLL = /DLL
QMAKE_LFLAGS_LTCG = /LTCG
diff --git a/mkspecs/win32-msvc2008/qmake.conf b/mkspecs/win32-msvc2008/qmake.conf
index ee7b99a..24a0486 100644
--- a/mkspecs/win32-msvc2008/qmake.conf
+++ b/mkspecs/win32-msvc2008/qmake.conf
@@ -1,7 +1,7 @@
#
# qmake configuration for win32-msvc2008
#
-# Written for Microsoft VC2005.NET
+# Written for Microsoft Visual C++ 2008
#
MAKEFILE_GENERATOR = MSVC.NET
@@ -55,12 +55,12 @@ QMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ $<
QMAKE_RUN_CXX_IMP_BATCH = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ @<<
QMAKE_LINK = link
-QMAKE_LFLAGS = /NOLOGO
+QMAKE_LFLAGS = /NOLOGO \"/MANIFESTDEPENDENCY:type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\' processorArchitecture=\'*\'\"
QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO
QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO = /DEBUG /OPT:REF
QMAKE_LFLAGS_DEBUG = /DEBUG
QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE
-QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS \"/MANIFESTDEPENDENCY:type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\' processorArchitecture=\'*\'\"
+QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS
QMAKE_LFLAGS_DLL = /DLL
QMAKE_LFLAGS_LTCG = /LTCG
diff --git a/mkspecs/win32-msvc2010/qmake.conf b/mkspecs/win32-msvc2010/qmake.conf
index 44e460e..c08a74d 100644
--- a/mkspecs/win32-msvc2010/qmake.conf
+++ b/mkspecs/win32-msvc2010/qmake.conf
@@ -1,7 +1,7 @@
#
# qmake configuration for win32-msvc2010
#
-# Written for Microsoft VC2005.NET
+# Written for Microsoft Visual C++ 2010
#
MAKEFILE_GENERATOR = MSBUILD
@@ -55,12 +55,12 @@ QMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ $<
QMAKE_RUN_CXX_IMP_BATCH = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ @<<
QMAKE_LINK = link
-QMAKE_LFLAGS = /NOLOGO
+QMAKE_LFLAGS = /NOLOGO \"/MANIFESTDEPENDENCY:type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\' processorArchitecture=\'*\'\"
QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO
QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO = /DEBUG /OPT:REF
QMAKE_LFLAGS_DEBUG = /DEBUG
QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE
-QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS \"/MANIFESTDEPENDENCY:type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\' processorArchitecture=\'*\'\"
+QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS
QMAKE_LFLAGS_DLL = /DLL
QMAKE_LFLAGS_LTCG = /LTCG
diff --git a/qmake/Makefile.unix b/qmake/Makefile.unix
index b9e281b..a24076e 100644
--- a/qmake/Makefile.unix
+++ b/qmake/Makefile.unix
@@ -16,10 +16,11 @@ OBJS=project.o property.o main.o makefile.o unixmake2.o unixmake.o \
#qt code
QOBJS=qtextcodec.o qutfcodec.o qstring.o qtextstream.o qiodevice.o qmalloc.o qglobal.o \
qbytearray.o qbytearraymatcher.o qdatastream.o qbuffer.o qlist.o qfile.o \
- qfsfileengine_unix.o qfsfileengine_iterator_unix.o qfsfileengine.o \
+ qfilesystementry.o qfilesystemengine_unix.o qfilesystemengine.o qfilesystemiterator_unix.o \
+ qfsfileengine_unix.o qfsfileengine.o \
qfsfileengine_iterator.o qregexp.o qvector.o qbitarray.o qdir.o qdiriterator.o quuid.o qhash.o \
qfileinfo.o qdatetime.o qstringlist.o qabstractfileengine.o qtemporaryfile.o \
- qmap.o qmetatype.o qsettings.o qlibraryinfo.o qvariant.o qvsnprintf.o \
+ qmap.o qmetatype.o qsettings.o qsystemerror.o qlibraryinfo.o qvariant.o qvsnprintf.o \
qlocale.o qlinkedlist.o qurl.o qnumeric.o qcryptographichash.o qxmlstream.o qxmlutils.o \
$(QTOBJS)
@@ -44,8 +45,11 @@ DEPEND_SRC=project.cpp property.cpp meta.cpp main.cpp generators/makefile.cpp ge
$(SOURCE_PATH)/src/corelib/global/qglobal.cpp $(SOURCE_PATH)/src/corelib/tools/qregexp.cpp \
$(SOURCE_PATH)/src/corelib/tools/qbytearray.cpp $(SOURCE_PATH)/src/corelib/tools/qbytearraymatcher.cpp \
$(SOURCE_PATH)/src/corelib/io/qdatastream.cpp $(SOURCE_PATH)/src/corelib/io/qbuffer.cpp \
+ $(SOURCE_PATH)/src/corelib/io/qfilesystementry.cpp $(SOURCE_PATH)/src/corelib/io/qfilesystemengine_unix.cpp \
+ $(SOURCE_PATH)/src/corelib/io/qfilesystemengine_mac.cpp \
+ $(SOURCE_PATH)/src/corelib/io/qfilesystemengine.cpp $(SOURCE_PATH)/src/corelib/io/qfilesystemiterator_unix.cpp \
$(SOURCE_PATH)/src/corelib/io/qfsfileengine_unix.cpp $(SOURCE_PATH)/src/corelib/io/qabstractfileengine.cpp \
- $(SOURCE_PATH)/src/corelib/io/qfsfileengine_iterator_unix.cpp $(SOURCE_PATH)/src/corelib/io/qfsfileengine_iterator.cpp \
+ $(SOURCE_PATH)/src/corelib/io/qfsfileengine_iterator.cpp \
$(SOURCE_PATH)/src/corelib/io/qfsfileengine.cpp $(SOURCE_PATH)/src/corelib/tools/qlist.cpp \
$(SOURCE_PATH)/src/corelib/tools/qvector.cpp $(SOURCE_PATH)/src/corelib/tools/qbitarray.cpp \
$(SOURCE_PATH)/src/corelib/io/qdiriterator.cpp \
@@ -61,6 +65,7 @@ DEPEND_SRC=project.cpp property.cpp meta.cpp main.cpp generators/makefile.cpp ge
$(SOURCE_PATH)/src/corelib/tools/qvsnprintf.cpp $(SOURCE_PATH)/src/corelib/global/qnumeric.cpp \
$(SOURCE_PATH)/src/corelib/xml/qxmlstream.cpp \
$(SOURCE_PATH)/src/corelib/xml/qxmlutils.cpp \
+ $(SOURCE_PATH)/src/corelib/kernel/qsystemerror.cpp \
$(QTSRCS)
CPPFLAGS = -I. -Igenerators -Igenerators/unix -Igenerators/win32 -Igenerators/mac -Igenerators/symbian \
@@ -100,6 +105,9 @@ qvariant.o: $(SOURCE_PATH)/src/corelib/kernel/qvariant.cpp
qsettings.o: $(SOURCE_PATH)/src/corelib/io/qsettings.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qsettings.cpp
+qsystemerror.o: $(SOURCE_PATH)/src/corelib/kernel/qsystemerror.cpp
+ $(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/kernel/qsystemerror.cpp
+
qlibraryinfo.o: $(SOURCE_PATH)/src/corelib/global/qlibraryinfo.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/global/qlibraryinfo.cpp
@@ -160,6 +168,21 @@ qlist.o: $(SOURCE_PATH)/src/corelib/tools/qlist.cpp
qfile.o: $(SOURCE_PATH)/src/corelib/io/qfile.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qfile.cpp
+qfilesystementry.o: $(SOURCE_PATH)/src/corelib/io/qfilesystementry.cpp
+ $(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qfilesystementry.cpp
+
+qfilesystemengine.o: $(SOURCE_PATH)/src/corelib/io/qfilesystemengine.cpp
+ $(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qfilesystemengine.cpp
+
+qfilesystemengine_unix.o: $(SOURCE_PATH)/src/corelib/io/qfilesystemengine_unix.cpp
+ $(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qfilesystemengine_unix.cpp
+
+qfilesystemengine_mac.o: $(SOURCE_PATH)/src/corelib/io/qfilesystemengine_mac.cpp
+ $(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qfilesystemengine_mac.cpp
+
+qfilesystemiterator_unix.o: $(SOURCE_PATH)/src/corelib/io/qfilesystemiterator_unix.cpp
+ $(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qfilesystemiterator_unix.cpp
+
qfsfileengine.o: $(SOURCE_PATH)/src/corelib/io/qfsfileengine.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qfsfileengine.cpp
@@ -169,9 +192,6 @@ qfsfileengine_iterator.o: $(SOURCE_PATH)/src/corelib/io/qfsfileengine_iterator.c
qfsfileengine_unix.o: $(SOURCE_PATH)/src/corelib/io/qfsfileengine_unix.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qfsfileengine_unix.cpp
-qfsfileengine_iterator_unix.o: $(SOURCE_PATH)/src/corelib/io/qfsfileengine_iterator_unix.cpp
- $(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qfsfileengine_iterator_unix.cpp
-
qabstractfileengine.o: $(SOURCE_PATH)/src/corelib/io/qabstractfileengine.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qabstractfileengine.cpp
diff --git a/qmake/Makefile.win32 b/qmake/Makefile.win32
index c04bcb2..4d29537 100644
--- a/qmake/Makefile.win32
+++ b/qmake/Makefile.win32
@@ -73,6 +73,10 @@ QTOBJS= \
qbitarray.obj \
qbuffer.obj \
qcryptographichash.obj \
+ qfilesystementry.obj \
+ qfilesystemengine.obj \
+ qfilesystemengine_win.obj \
+ qfilesystemiterator_win.obj \
qfsfileengine.obj \
qfsfileengine_iterator.obj \
qbytearray.obj \
@@ -86,7 +90,6 @@ QTOBJS= \
qabstractfileengine.obj \
qfsfileengine_win.obj \
qsystemlibrary.obj \
- qfsfileengine_iterator_win.obj \
qfileinfo.obj \
qglobal.obj \
qhash.obj \
@@ -101,6 +104,7 @@ QTOBJS= \
qutfcodec.obj \
qstring.obj \
qstringlist.obj \
+ qsystemerror.obj \
qtextstream.obj \
qdatastream.obj \
quuid.obj \
diff --git a/qmake/Makefile.win32-g++ b/qmake/Makefile.win32-g++
index 29fbd0a..59ac8c2 100644
--- a/qmake/Makefile.win32-g++
+++ b/qmake/Makefile.win32-g++
@@ -61,10 +61,13 @@ QTOBJS= \
qtemporaryfile.o \
qfileinfo.o \
qabstractfileengine.o \
+ qfilesystementry.o \
+ qfilesystemengine.o \
+ qfilesystemengine_win.o \
+ qfilesystemiterator_win.o \
qfsfileengine.o \
qfsfileengine_iterator.o \
qfsfileengine_win.o \
- qfsfileengine_iterator_win.o \
qglobal.o \
qhash.o \
qiodevice.o \
@@ -79,6 +82,7 @@ QTOBJS= \
qutfcodec.o \
qstring.o \
qstringlist.o \
+ qsystemerror.o \
qsystemlibrary.o \
qtextstream.o \
quuid.o \
@@ -193,12 +197,21 @@ qtemporaryfile.o: $(SOURCE_PATH)/src/corelib/io/qtemporaryfile.cpp
qabstractfileengine.o: $(SOURCE_PATH)/src/corelib/io/qabstractfileengine.cpp
$(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qabstractfileengine.cpp
+qfilesystementry.o: $(SOURCE_PATH)/src/corelib/io/qfilesystementry.cpp
+ $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qfilesystementry.cpp
+
+qfilesystemengine.o: $(SOURCE_PATH)/src/corelib/io/qfilesystemengine.cpp
+ $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qfilesystemengine.cpp
+
+qfilesystemengine_win.o: $(SOURCE_PATH)/src/corelib/io/qfilesystemengine_win.cpp
+ $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qfilesystemengine_win.cpp
+
+qfilesystemiterator_win.o: $(SOURCE_PATH)/src/corelib/io/qfilesystemiterator_win.cpp
+ $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qfilesystemiterator_win.cpp
+
qfsfileengine_win.o: $(SOURCE_PATH)/src/corelib/io/qfsfileengine_win.cpp
$(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qfsfileengine_win.cpp
-qfsfileengine_iterator_win.o: $(SOURCE_PATH)/src/corelib/io/qfsfileengine_iterator_win.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qfsfileengine_iterator_win.cpp
-
qfsfileengine.o: $(SOURCE_PATH)/src/corelib/io/qfsfileengine.cpp
$(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qfsfileengine.cpp
@@ -235,6 +248,9 @@ qdatetime.o: $(SOURCE_PATH)/src/corelib/tools/qdatetime.cpp
qstringlist.o: $(SOURCE_PATH)/src/corelib/tools/qstringlist.cpp
$(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/tools/qstringlist.cpp
+qsystemerror.o: $(SOURCE_PATH)/src/corelib/kernel/qsystemerror.cpp
+ $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/kernel/qsystemerror.cpp
+
qsystemlibrary.o: $(SOURCE_PATH)/src/corelib/plugin/qsystemlibrary.cpp
$(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/plugin/qsystemlibrary.cpp
diff --git a/qmake/Makefile.win32-g++-sh b/qmake/Makefile.win32-g++-sh
index 9c7942c..a84b3f6 100644
--- a/qmake/Makefile.win32-g++-sh
+++ b/qmake/Makefile.win32-g++-sh
@@ -61,10 +61,13 @@ QTOBJS= \
qtemporaryfile.o \
qfileinfo.o \
qabstractfileengine.o \
+ qfilesystementry.o \
+ qfilesystemengine.o \
+ qfilesystemengine_win.o \
+ qfilesystemiterator_win.o \
qfsfileengine.o \
qfsfileengine_iterator.o \
qfsfileengine_win.o \
- qfsfileengine_iterator_win.o \
qglobal.o \
qhash.o \
qiodevice.o \
@@ -80,6 +83,7 @@ QTOBJS= \
qstring.o \
qstringlist.o \
qsystemlibrary.o \
+ qsystemerror.o \
qtextstream.o \
quuid.o \
qvector.o \
@@ -192,12 +196,21 @@ qtemporaryfile.o: $(SOURCE_PATH)/src/corelib/io/qtemporaryfile.cpp
qabstractfileengine.o: $(SOURCE_PATH)/src/corelib/io/qabstractfileengine.cpp
$(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qabstractfileengine.cpp
+qfilesystementry.o: $(SOURCE_PATH)/src/corelib/io/qfilesystementry.cpp
+ $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qfilesystementry.cpp
+
+qfilesystemengine.o: $(SOURCE_PATH)/src/corelib/io/qfilesystemengine.cpp
+ $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qfilesystemengine.cpp
+
+qfilesystemengine_win.o: $(SOURCE_PATH)/src/corelib/io/qfilesystemengine_win.cpp
+ $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qfilesystemengine_win.cpp
+
+qfilesystemiterator_win.o: $(SOURCE_PATH)/src/corelib/io/qfilesystemiterator_win.cpp
+ $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qfilesystemiterator_win.cpp
+
qfsfileengine_win.o: $(SOURCE_PATH)/src/corelib/io/qfsfileengine_win.cpp
$(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qfsfileengine_win.cpp
-qfsfileengine_iterator_win.o: $(SOURCE_PATH)/src/corelib/io/qfsfileengine_iterator_win.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qfsfileengine_iterator_win.cpp
-
qfsfileengine.o: $(SOURCE_PATH)/src/corelib/io/qfsfileengine.cpp
$(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/io/qfsfileengine.cpp
@@ -234,6 +247,9 @@ qdatetime.o: $(SOURCE_PATH)/src/corelib/tools/qdatetime.cpp
qstringlist.o: $(SOURCE_PATH)/src/corelib/tools/qstringlist.cpp
$(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/tools/qstringlist.cpp
+qsystemerror.o: $(SOURCE_PATH)/src/corelib/kernel/qsystemerror.cpp
+ $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/kernel/qsystemerror.cpp
+
qsystemlibrary.o: $(SOURCE_PATH)/src/corelib/plugin/qsystemlibrary.cpp
$(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/plugin/qsystemlibrary.cpp
diff --git a/qmake/generators/symbian/symbiancommon.cpp b/qmake/generators/symbian/symbiancommon.cpp
index 602bcc2..8747f5a 100644
--- a/qmake/generators/symbian/symbiancommon.cpp
+++ b/qmake/generators/symbian/symbiancommon.cpp
@@ -408,8 +408,8 @@ void SymbianCommonGenerator::generatePkgFile(const QString &iconFile,
// ### FIXME: remove epocBuild check once makefile based mkspecs support localized resource generation
if (epocBuild && symbianLocalizationList.size()) {
// Add localized resources to DEPLOYMENT if default resource deployment is done
- addLocalizedResourcesToDeployment("default_resource_deployment.sources", symbianLocalizationList);
- addLocalizedResourcesToDeployment("default_reg_deployment.sources", symbianLocalizationList);
+ addLocalizedResourcesToDeployment("default_resource_deployment.files", symbianLocalizationList);
+ addLocalizedResourcesToDeployment("default_reg_deployment.files", symbianLocalizationList);
}
// deploy files specified by DEPLOYMENT variable
@@ -977,7 +977,7 @@ bool SymbianCommonGenerator::parseTsContent(const QString &tsFilename, SymbianLo
QXmlStreamReader xml(&tsFile);
- while (xml.name() != tsElement)
+ while (!xml.atEnd() && xml.name() != tsElement)
xml.readNextStartElement();
while (xml.readNextStartElement()) {
diff --git a/qmake/generators/symbian/symmake_sbsv2.cpp b/qmake/generators/symbian/symmake_sbsv2.cpp
index c4b51f2..c219f1d 100644
--- a/qmake/generators/symbian/symmake_sbsv2.cpp
+++ b/qmake/generators/symbian/symmake_sbsv2.cpp
@@ -377,7 +377,6 @@ void SymbianSbsv2MakefileGenerator::writeWrapperMakefile(QFile& wrapperFile, boo
t << qmakeCmd << endl;
t << endl;
- QString currentClause;
QString locFileDep = generateLocFileTarget(t, qmakeCmd);
t << "debug: " << locFileDep << BLD_INF_FILENAME << endl;
diff --git a/qmake/generators/win32/msbuild_objectmodel.cpp b/qmake/generators/win32/msbuild_objectmodel.cpp
index 76df854..f093e90 100644
--- a/qmake/generators/win32/msbuild_objectmodel.cpp
+++ b/qmake/generators/win32/msbuild_objectmodel.cpp
@@ -328,30 +328,46 @@ void XTreeNode::generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString
if (children.size()) {
// Filter
+ QString tempFilterName;
ChildrenMap::ConstIterator it, end = children.constEnd();
if (!tagName.isEmpty()) {
+ tempFilterName.append(filter);
+ tempFilterName.append("\\");
+ tempFilterName.append(tagName);
+ xmlFilter << tag(_ItemGroup);
xmlFilter << tag("Filter")
- << attrTag("Include", tagName)
- << attrTagS("Extensions", "");
+ << attrTag("Include", tempFilterName)
+ << closetag();
+ xmlFilter << closetag();
}
// First round, do nested filters
for (it = children.constBegin(); it != end; ++it)
if ((*it)->children.size())
- (*it)->generateXML(xml, xmlFilter, it.key(), tool, filter);
+ {
+ if ( !tempFilterName.isEmpty() )
+ (*it)->generateXML(xml, xmlFilter, it.key(), tool, tempFilterName);
+ else
+ (*it)->generateXML(xml, xmlFilter, it.key(), tool, filter);
+ }
// Second round, do leafs
for (it = children.constBegin(); it != end; ++it)
if (!(*it)->children.size())
- (*it)->generateXML(xml, xmlFilter, it.key(), tool, filter);
-
- if (!tagName.isEmpty())
- xml << closetag("Filter");
+ {
+ if ( !tempFilterName.isEmpty() )
+ (*it)->generateXML(xml, xmlFilter, it.key(), tool, tempFilterName);
+ else
+ (*it)->generateXML(xml, xmlFilter, it.key(), tool, filter);
+ }
} else {
// Leaf
+ xml << tag(_ItemGroup);
+ xmlFilter << tag(_ItemGroup);
VCXProjectWriter::outputFileConfigs(tool, xml, xmlFilter, info, filter);
+ xmlFilter << closetag();
+ xml << closetag();
}
}
-
// Flat file generation ---------------------------------------------
void XFlatNode::generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString &/*tagName*/, VCProject &tool, const QString &filter) {
if (children.size()) {
diff --git a/qmake/project.cpp b/qmake/project.cpp
index 38b47e0..6d43147 100644
--- a/qmake/project.cpp
+++ b/qmake/project.cpp
@@ -1813,11 +1813,10 @@ QMakeProject::doProjectExpand(QString func, QList<QStringList> args_list,
for(int i = 0; i < args_list.size(); ++i)
args += args_list[i].join(QString(Option::field_sep));
- QString lfunc = func.toLower();
- if (!lfunc.isSharedWith(func))
+ ExpandFunc func_t = qmake_expandFunctions().value(func);
+ if (!func_t && (func_t = qmake_expandFunctions().value(func.toLower())))
warn_msg(WarnDeprecated, "%s:%d: Using uppercased builtin functions is deprecated.",
parser.file.toLatin1().constData(), parser.line_no);
- ExpandFunc func_t = qmake_expandFunctions().value(lfunc);
debug_msg(1, "Running project expand: %s(%s) [%d]",
func.toLatin1().constData(), args.join("::").toLatin1().constData(), func_t);
@@ -2174,7 +2173,7 @@ QMakeProject::doProjectExpand(QString func, QList<QStringList> args_list,
const QRegExp regex(r, Qt::CaseSensitive, QRegExp::Wildcard);
for(int d = 0; d < dirs.count(); d++) {
QString dir = dirs[d];
- if(!dir.isEmpty() && !dir.endsWith(Option::dir_sep))
+ if(!dir.isEmpty() && !dir.endsWith(QDir::separator()))
dir += "/";
QDir qdir(dir);
@@ -2390,7 +2389,7 @@ QMakeProject::doProjectTest(QString func, QList<QStringList> args_list, QMap<QSt
return true;
//regular expression I guess
QString dirstr = qmake_getpwd();
- int slsh = file.lastIndexOf(Option::dir_sep);
+ int slsh = file.lastIndexOf(QDir::separator());
if(slsh != -1) {
dirstr = file.left(slsh+1);
file = file.right(file.length() - slsh - 1);
diff --git a/qmake/qmake.pri b/qmake/qmake.pri
index 8f46a2e..bc7ddb8 100644
--- a/qmake/qmake.pri
+++ b/qmake/qmake.pri
@@ -57,6 +57,8 @@ bootstrap { #Qt code
qfile.cpp \
qabstractfileengine.cpp \
qfileinfo.cpp \
+ qfilesystementry.cpp \
+ qfilesystemengine.cpp \
qfsfileengine.cpp \
qfsfileengine_iterator.cpp \
qglobal.cpp \
@@ -80,6 +82,7 @@ bootstrap { #Qt code
quuid.cpp \
qsettings.cpp \
qlibraryinfo.cpp \
+ qsystemerror.cpp \
qvariant.cpp \
qvector.cpp \
qvsnprintf.cpp \
@@ -96,6 +99,7 @@ bootstrap { #Qt code
qdatetime.h \
qdatetime_p.h \
qdir.h \
+ qdir_p.h \
qdiriterator.h \
qfile.h \
qabstractfileengine.h \
@@ -116,6 +120,7 @@ bootstrap { #Qt code
qstring.h \
qstringlist.h \
qstringmatcher.h \
+ qsystemerror_p.h \
qtemporaryfile.h \
qtextstream.h \
qurl.h \
@@ -125,14 +130,15 @@ bootstrap { #Qt code
qxmlutils.h
unix {
- SOURCES += qfsfileengine_unix.cpp qfsfileengine_iterator_unix.cpp
+ SOURCES += qfilesystemengine_unix.cpp qfilesystemiterator_unix.cpp qfsfileengine_unix.cpp
mac {
+ SOURCES += qfilesystemengine_mac.cpp
SOURCES += qcore_mac.cpp qsettings_mac.cpp
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.4 #enables weak linking for 10.4 (exported)
LIBS += -framework ApplicationServices
}
} else:win32 {
- SOURCES += qfsfileengine_win.cpp qfsfileengine_iterator_win.cpp qsettings_win.cpp \
+ SOURCES += qfilesystemengine_win.cpp qfsfileengine_win.cpp qfilesystemiterator_win.cpp qsettings_win.cpp \
qsystemlibrary.cpp
win32-msvc*:LIBS += ole32.lib advapi32.lib
win32-g++*:LIBS += -lole32 -luuid
diff --git a/src/3rdparty/phonon/ds9/videorenderer_evr.cpp b/src/3rdparty/phonon/ds9/videorenderer_evr.cpp
index de3f46f..ff39eccc4 100644
--- a/src/3rdparty/phonon/ds9/videorenderer_evr.cpp
+++ b/src/3rdparty/phonon/ds9/videorenderer_evr.cpp
@@ -62,19 +62,21 @@ namespace Phonon
VideoRendererEVR::VideoRendererEVR(QWidget *target) : m_target(target)
{
+ if (QSysInfo::WindowsVersion < QSysInfo::WV_VISTA)
+ return;
m_filter = Filter(CLSID_EnhancedVideoRenderer, IID_IBaseFilter);
if (!m_filter) {
return;
}
ComPointer<IMFVideoDisplayControl> filterControl = getService<IMFVideoDisplayControl>(m_filter, MR_VIDEO_RENDER_SERVICE, IID_IMFVideoDisplayControl);
- if (!filterControl) {
+ if (!filterControl ||
+ FAILED(filterControl->SetVideoWindow(reinterpret_cast<HWND>(target->winId()))) ||
+ FAILED(filterControl->SetAspectRatioMode(MFVideoARMode_None)) || // We're in control of the size
+ !getService<IMFVideoMixerControl>(m_filter, MR_VIDEO_MIXER_SERVICE, IID_IMFVideoMixerControl) ||
+ !getService<IMFVideoProcessor>(m_filter, MR_VIDEO_MIXER_SERVICE, IID_IMFVideoProcessor)) {
m_filter = Filter(); //will release the interface
- return;
}
-
- filterControl->SetVideoWindow(reinterpret_cast<HWND>(target->winId()));
- filterControl->SetAspectRatioMode(MFVideoARMode_None); // We're in control of the size
}
QImage VideoRendererEVR::snapshot() const
diff --git a/src/3rdparty/phonon/mmf/abstractaudioeffect.h b/src/3rdparty/phonon/mmf/abstractaudioeffect.h
index 8879636..70adcf6 100644
--- a/src/3rdparty/phonon/mmf/abstractaudioeffect.h
+++ b/src/3rdparty/phonon/mmf/abstractaudioeffect.h
@@ -21,7 +21,7 @@ along with this library. If not, see <http://www.gnu.org/licenses/>.
#include <QScopedPointer>
-#include <audioeffectbase.h>
+#include <AudioEffectBase.h>
#include <phonon/effectinterface.h>
diff --git a/src/3rdparty/phonon/mmf/audioequalizer.cpp b/src/3rdparty/phonon/mmf/audioequalizer.cpp
index 28433f6..1d2bbd4 100644
--- a/src/3rdparty/phonon/mmf/audioequalizer.cpp
+++ b/src/3rdparty/phonon/mmf/audioequalizer.cpp
@@ -16,7 +16,7 @@ along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <audioequalizerbase.h>
+#include <AudioEqualizerBase.h>
#include "audioequalizer.h"
QT_BEGIN_NAMESPACE
diff --git a/src/3rdparty/phonon/mmf/bassboost.cpp b/src/3rdparty/phonon/mmf/bassboost.cpp
index 81d9208..67076f6 100644
--- a/src/3rdparty/phonon/mmf/bassboost.cpp
+++ b/src/3rdparty/phonon/mmf/bassboost.cpp
@@ -16,7 +16,7 @@ along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <bassboostbase.h>
+#include <BassBoostBase.h>
#include "bassboost.h"
QT_BEGIN_NAMESPACE
diff --git a/src/3rdparty/phonon/mmf/environmentalreverb.cpp b/src/3rdparty/phonon/mmf/environmentalreverb.cpp
index c500385..d4f5223 100644
--- a/src/3rdparty/phonon/mmf/environmentalreverb.cpp
+++ b/src/3rdparty/phonon/mmf/environmentalreverb.cpp
@@ -16,7 +16,7 @@ along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <environmentalreverbbase.h>
+#include <EnvironmentalReverbBase.h>
#include "environmentalreverb.h"
QT_BEGIN_NAMESPACE
diff --git a/src/3rdparty/phonon/mmf/loudness.cpp b/src/3rdparty/phonon/mmf/loudness.cpp
index 22d7518..ca05ab0 100644
--- a/src/3rdparty/phonon/mmf/loudness.cpp
+++ b/src/3rdparty/phonon/mmf/loudness.cpp
@@ -16,7 +16,7 @@ along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <loudnessbase.h>
+#include <LoudnessBase.h>
#include "loudness.h"
QT_BEGIN_NAMESPACE
diff --git a/src/3rdparty/phonon/mmf/stereowidening.cpp b/src/3rdparty/phonon/mmf/stereowidening.cpp
index e452160..f90651b 100644
--- a/src/3rdparty/phonon/mmf/stereowidening.cpp
+++ b/src/3rdparty/phonon/mmf/stereowidening.cpp
@@ -16,7 +16,7 @@ along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <stereowideningbase.h>
+#include <StereoWideningBase.h>
#include "stereowidening.h"
QT_BEGIN_NAMESPACE
diff --git a/src/3rdparty/phonon/phonon/effectwidget.cpp b/src/3rdparty/phonon/phonon/effectwidget.cpp
index a2fe50f..edcbe1f 100644
--- a/src/3rdparty/phonon/phonon/effectwidget.cpp
+++ b/src/3rdparty/phonon/phonon/effectwidget.cpp
@@ -112,7 +112,7 @@ void EffectWidgetPrivate::autogenerateUi()
#endif
QWidget *control = 0;
- switch (para.type()) {
+ switch (int(para.type())) {
case QVariant::String:
{
QComboBox *cb = new QComboBox(q);
diff --git a/src/3rdparty/phonon/phonon/globalconfig.cpp b/src/3rdparty/phonon/phonon/globalconfig.cpp
index be751ce..f83ebc4 100644
--- a/src/3rdparty/phonon/phonon/globalconfig.cpp
+++ b/src/3rdparty/phonon/phonon/globalconfig.cpp
@@ -97,7 +97,7 @@ static void filter(ObjectDescriptionType type, BackendInterface *backendIface, Q
static QList<int> sortDevicesByCategoryPriority(const GlobalConfig *config, const QSettingsGroup *backendConfig, ObjectDescriptionType type, Phonon::Category category, QList<int> &defaultList)
{
- Q_ASSERT(config);
+ Q_ASSERT(config); Q_UNUSED(config);
Q_ASSERT(backendConfig);
Q_ASSERT(type == AudioOutputDeviceType || type == AudioCaptureDeviceType);
diff --git a/src/3rdparty/phonon/phonon/mediacontroller.cpp b/src/3rdparty/phonon/phonon/mediacontroller.cpp
index 9f651d6..3dc22b7 100644
--- a/src/3rdparty/phonon/phonon/mediacontroller.cpp
+++ b/src/3rdparty/phonon/phonon/mediacontroller.cpp
@@ -76,9 +76,9 @@ MediaController::~MediaController()
MediaController::Features MediaController::supportedFeatures() const
{
if (!d || !d->media) {
- return false;
+ return Features();
}
- IFACE false;
+ IFACE Features();
Features ret;
if (iface->hasInterface(AddonInterface::AngleInterface)) {
ret |= Angles;
diff --git a/src/3rdparty/phonon/phonon/pulsesupport.cpp b/src/3rdparty/phonon/phonon/pulsesupport.cpp
index 642843f..b1ba196 100644
--- a/src/3rdparty/phonon/phonon/pulsesupport.cpp
+++ b/src/3rdparty/phonon/phonon/pulsesupport.cpp
@@ -56,7 +56,7 @@ static int debugLevel() {
static int level = -1;
if (level < 1) {
level = 0;
- QString pulseenv = qgetenv("PHONON_PULSEAUDIO_DEBUG");
+ QByteArray pulseenv = qgetenv("PHONON_PULSEAUDIO_DEBUG");
int l = pulseenv.toInt();
if (l > 0)
level = (l > 2 ? 2 : l);
@@ -71,18 +71,18 @@ static void logMessage(const QString &message, int priority, QObject *obj)
QString output;
if (obj) {
// Strip away namespace from className
- QString className(obj->metaObject()->className());
+ QByteArray className(obj->metaObject()->className());
int nameLength = className.length() - className.lastIndexOf(':') - 1;
className = className.right(nameLength);
output.sprintf("%s %s (%s %p)", message.toLatin1().constData(),
obj->objectName().toLatin1().constData(),
- className.toLatin1().constData(), obj);
+ className.constData(), obj);
}
else {
output = message;
}
if (priority <= debugLevel()) {
- qDebug() << QString("PulseSupport(%1): %2").arg(priority).arg(output);
+ qDebug() << QString::fromLatin1("PulseSupport(%1): %2").arg(priority).arg(output);
}
}
}
@@ -96,7 +96,7 @@ class AudioDevice
: pulseName(name), pulseIndex(index)
{
properties["name"] = desc;
- properties["description"] = ""; // We don't have descriptions (well we do, but we use them as the name!)
+ properties["description"] = QLatin1String(""); // We don't have descriptions (well we do, but we use them as the name!)
properties["icon"] = icon;
properties["available"] = (index != PA_INVALID_INDEX);
properties["isAdvanced"] = false; // Nothing is advanced!
@@ -158,8 +158,8 @@ static void createGenericDevices()
s_outputDevices.clear();
s_outputDevicePriorities.clear();
index = s_deviceIndexCounter++;
- s_outputDeviceIndexes.insert("sink:default", index);
- s_outputDevices.insert(index, AudioDevice("sink:default", QObject::tr("PulseAudio Sound Server").toUtf8(), "audio-backend-pulseaudio", 0));
+ s_outputDeviceIndexes.insert(QLatin1String("sink:default"), index);
+ s_outputDevices.insert(index, AudioDevice(QLatin1String("sink:default"), QObject::tr("PulseAudio Sound Server"), QLatin1String("audio-backend-pulseaudio"), 0));
for (int i = Phonon::NoCategory; i <= Phonon::LastCategory; ++i) {
Phonon::Category cat = static_cast<Phonon::Category>(i);
s_outputDevicePriorities[cat].insert(0, index);
@@ -169,8 +169,8 @@ static void createGenericDevices()
s_captureDevices.clear();
s_captureDevicePriorities.clear();
index = s_deviceIndexCounter++;
- s_captureDeviceIndexes.insert("source:default", index);
- s_captureDevices.insert(index, AudioDevice("source:default", QObject::tr("PulseAudio Sound Server").toUtf8(), "audio-backend-pulseaudio", 0));
+ s_captureDeviceIndexes.insert(QLatin1String("source:default"), index);
+ s_captureDevices.insert(index, AudioDevice(QLatin1String("source:default"), QObject::tr("PulseAudio Sound Server"), QLatin1String("audio-backend-pulseaudio"), 0));
for (int i = Phonon::NoCategory; i <= Phonon::LastCategory; ++i) {
Phonon::Category cat = static_cast<Phonon::Category>(i);
s_captureDevicePriorities[cat].insert(0, index);
@@ -397,7 +397,7 @@ void sink_input_cb(pa_context *c, const pa_sink_input_info *i, int eol, void *us
if (pa_context_errno(c) == PA_ERR_NOENTITY)
return;
- logMessage(QString("Sink input callback failure"));
+ logMessage(QLatin1String("Sink input callback failure"));
return;
}
@@ -409,8 +409,8 @@ void sink_input_cb(pa_context *c, const pa_sink_input_info *i, int eol, void *us
// loop through (*i) and extract phonon->streamindex...
const char *t;
if ((t = pa_proplist_gets(i->proplist, "phonon.streamid"))) {
- logMessage(QString("Found PulseAudio stream index %1 for Phonon Output Stream %2").arg(i->index).arg(t));
- s_outputStreamIndexMap[QString(t)] = i->index;
+ logMessage(QString::fromLatin1("Found PulseAudio stream index %1 for Phonon Output Stream %2").arg(i->index).arg(QLatin1String(t)));
+ s_outputStreamIndexMap[QLatin1String(t)] = i->index;
// Find the sink's phonon index and notify whoever cares...
if (PA_INVALID_INDEX != i->sink) {
@@ -426,8 +426,8 @@ void sink_input_cb(pa_context *c, const pa_sink_input_info *i, int eol, void *us
}
if (found) {
// OK so we just emit our signal
- logMessage(QString("Letting the rest of phonon know about this"));
- s_instance->emitUsingDevice(QString(t), device);
+ logMessage(QLatin1String("Letting the rest of phonon know about this"));
+ s_instance->emitUsingDevice(QLatin1String(t), device);
}
}
}
@@ -441,7 +441,7 @@ void source_output_cb(pa_context *c, const pa_source_output_info *i, int eol, vo
if (pa_context_errno(c) == PA_ERR_NOENTITY)
return;
- logMessage(QString("Source output callback failure"));
+ logMessage(QLatin1String("Source output callback failure"));
return;
}
@@ -453,8 +453,8 @@ void source_output_cb(pa_context *c, const pa_source_output_info *i, int eol, vo
// loop through (*i) and extract phonon->streamindex...
const char *t;
if ((t = pa_proplist_gets(i->proplist, "phonon.streamid"))) {
- logMessage(QString("Found PulseAudio stream index %1 for Phonon Capture Stream %2").arg(i->index).arg(t));
- s_captureStreamIndexMap[QString(t)] = i->index;
+ logMessage(QString::fromLatin1("Found PulseAudio stream index %1 for Phonon Capture Stream %2").arg(i->index).arg(QLatin1String(t)));
+ s_captureStreamIndexMap[QLatin1String(t)] = i->index;
// Find the source's phonon index and notify whoever cares...
if (PA_INVALID_INDEX != i->source) {
@@ -470,8 +470,8 @@ void source_output_cb(pa_context *c, const pa_source_output_info *i, int eol, vo
}
if (found) {
// OK so we just emit our signal
- logMessage(QString("Letting the rest of phonon know about this"));
- s_instance->emitUsingDevice(QString(t), device);
+ logMessage(QLatin1String("Letting the rest of phonon know about this"));
+ s_instance->emitUsingDevice(QLatin1String(t), device);
}
}
}
@@ -486,17 +486,17 @@ static void subscribe_cb(pa_context *c, pa_subscription_event_type_t t, uint32_t
QString phononid = s_outputStreamIndexMap.key(index);
if (!phononid.isEmpty()) {
if (s_outputStreamIndexMap.contains(phononid)) {
- logMessage(QString("Phonon Output Stream %1 is gone at the PA end. Marking it as invalid in our cache as we may reuse it.").arg(phononid));
+ logMessage(QString::fromLatin1("Phonon Output Stream %1 is gone at the PA end. Marking it as invalid in our cache as we may reuse it.").arg(phononid));
s_outputStreamIndexMap[phononid] = PA_INVALID_INDEX;
} else {
- logMessage(QString("Removing Phonon Output Stream %1 (it's gone!)").arg(phononid));
+ logMessage(QString::fromLatin1("Removing Phonon Output Stream %1 (it's gone!)").arg(phononid));
s_outputStreamIndexMap.remove(phononid);
}
}
} else {
pa_operation *o;
if (!(o = pa_context_get_sink_input_info(c, index, sink_input_cb, NULL))) {
- logMessage(QString("pa_context_get_sink_input_info() failed"));
+ logMessage(QLatin1String("pa_context_get_sink_input_info() failed"));
return;
}
pa_operation_unref(o);
@@ -508,17 +508,17 @@ static void subscribe_cb(pa_context *c, pa_subscription_event_type_t t, uint32_t
QString phononid = s_captureStreamIndexMap.key(index);
if (!phononid.isEmpty()) {
if (s_captureStreamIndexMap.contains(phononid)) {
- logMessage(QString("Phonon Capture Stream %1 is gone at the PA end. Marking it as invalid in our cache as we may reuse it.").arg(phononid));
+ logMessage(QString::fromLatin1("Phonon Capture Stream %1 is gone at the PA end. Marking it as invalid in our cache as we may reuse it.").arg(phononid));
s_captureStreamIndexMap[phononid] = PA_INVALID_INDEX;
} else {
- logMessage(QString("Removing Phonon Capture Stream %1 (it's gone!)").arg(phononid));
+ logMessage(QString::fromLatin1("Removing Phonon Capture Stream %1 (it's gone!)").arg(phononid));
s_captureStreamIndexMap.remove(phononid);
}
}
} else {
pa_operation *o;
if (!(o = pa_context_get_source_output_info(c, index, source_output_cb, NULL))) {
- logMessage(QString("pa_context_get_sink_input_info() failed"));
+ logMessage(QLatin1String("pa_context_get_sink_input_info() failed"));
return;
}
pa_operation_unref(o);
@@ -528,29 +528,27 @@ static void subscribe_cb(pa_context *c, pa_subscription_event_type_t t, uint32_t
}
-static const char* statename(pa_context_state_t state)
+static QString statename(pa_context_state_t state)
{
switch (state)
{
- case PA_CONTEXT_UNCONNECTED: return "Unconnected";
- case PA_CONTEXT_CONNECTING: return "Connecting";
- case PA_CONTEXT_AUTHORIZING: return "Authorizing";
- case PA_CONTEXT_SETTING_NAME: return "Setting Name";
- case PA_CONTEXT_READY: return "Ready";
- case PA_CONTEXT_FAILED: return "Failed";
- case PA_CONTEXT_TERMINATED: return "Terminated";
+ case PA_CONTEXT_UNCONNECTED: return QLatin1String("Unconnected");
+ case PA_CONTEXT_CONNECTING: return QLatin1String("Connecting");
+ case PA_CONTEXT_AUTHORIZING: return QLatin1String("Authorizing");
+ case PA_CONTEXT_SETTING_NAME: return QLatin1String("Setting Name");
+ case PA_CONTEXT_READY: return QLatin1String("Ready");
+ case PA_CONTEXT_FAILED: return QLatin1String("Failed");
+ case PA_CONTEXT_TERMINATED: return QLatin1String("Terminated");
}
- static QString unknown;
- unknown = QString("Unknown state: %0").arg(state);
- return unknown.toAscii().constData();
+ return QString::fromLatin1("Unknown state: %0").arg(state);
}
static void context_state_callback(pa_context *c, void *)
{
Q_ASSERT(c);
- logMessage(QString("context_state_callback %1").arg(statename(pa_context_get_state(c))));
+ logMessage(QString::fromLatin1("context_state_callback %1").arg(statename(pa_context_get_state(c))));
pa_context_state_t state = pa_context_get_state(c);
if (state == PA_CONTEXT_READY) {
// We've connected to PA, so it is active
@@ -566,7 +564,7 @@ static void context_state_callback(pa_context *c, void *)
if (!(o = pa_context_subscribe(c, (pa_subscription_mask_t)
(PA_SUBSCRIPTION_MASK_SINK_INPUT|
PA_SUBSCRIPTION_MASK_SOURCE_OUTPUT), NULL, NULL))) {
- logMessage(QString("pa_context_subscribe() failed"));
+ logMessage(QLatin1String("pa_context_subscribe() failed"));
return;
}
pa_operation_unref(o);
@@ -639,27 +637,27 @@ PulseSupport::PulseSupport()
{
#ifdef HAVE_PULSEAUDIO
// Initialise our map (is there a better way to do this?)
- s_roleCategoryMap["none"] = Phonon::NoCategory;
- s_roleCategoryMap["video"] = Phonon::VideoCategory;
- s_roleCategoryMap["music"] = Phonon::MusicCategory;
- s_roleCategoryMap["game"] = Phonon::GameCategory;
- s_roleCategoryMap["event"] = Phonon::NotificationCategory;
- s_roleCategoryMap["phone"] = Phonon::CommunicationCategory;
- //s_roleCategoryMap["animation"]; // No Mapping
- //s_roleCategoryMap["production"]; // No Mapping
- s_roleCategoryMap["a11y"] = Phonon::AccessibilityCategory;
+ s_roleCategoryMap[QLatin1String("none")] = Phonon::NoCategory;
+ s_roleCategoryMap[QLatin1String("video")] = Phonon::VideoCategory;
+ s_roleCategoryMap[QLatin1String("music")] = Phonon::MusicCategory;
+ s_roleCategoryMap[QLatin1String("game")] = Phonon::GameCategory;
+ s_roleCategoryMap[QLatin1String("event")] = Phonon::NotificationCategory;
+ s_roleCategoryMap[QLatin1String("phone")] = Phonon::CommunicationCategory;
+ //s_roleCategoryMap[QLatin1String("animation")]; // No Mapping
+ //s_roleCategoryMap[QLatin1String("production")]; // No Mapping
+ s_roleCategoryMap[QLatin1String("a11y")] = Phonon::AccessibilityCategory;
// To allow for easy debugging, give an easy way to disable this pulseaudio check
- QString pulseenv = qgetenv("PHONON_PULSEAUDIO_DISABLE");
+ QByteArray pulseenv = qgetenv("PHONON_PULSEAUDIO_DISABLE");
if (pulseenv.toInt()) {
- logMessage("PulseAudio support disabled: PHONON_PULSEAUDIO_DISABLE is set");
+ logMessage(QLatin1String("PulseAudio support disabled: PHONON_PULSEAUDIO_DISABLE is set"));
return;
}
// We require a glib event loop
- if (QLatin1String(QAbstractEventDispatcher::instance()->metaObject()->className())
- != "QGuiEventDispatcherGlib") {
- logMessage("Disabling PulseAudio integration for lack of GLib event loop.");
+ if (strcmp(QAbstractEventDispatcher::instance()->metaObject()->className(),
+ "QGuiEventDispatcherGlib") != 0) {
+ logMessage(QLatin1String("Disabling PulseAudio integration for lack of GLib event loop."));
return;
}
@@ -667,21 +665,21 @@ PulseSupport::PulseSupport()
// use a fully async integrated mainloop method to connect and get proper support.
pa_mainloop *p_test_mainloop;
if (!(p_test_mainloop = pa_mainloop_new())) {
- logMessage("PulseAudio support disabled: Unable to create mainloop");
+ logMessage(QLatin1String("PulseAudio support disabled: Unable to create mainloop"));
return;
}
pa_context *p_test_context;
if (!(p_test_context = pa_context_new(pa_mainloop_get_api(p_test_mainloop), "libphonon-probe"))) {
- logMessage("PulseAudio support disabled: Unable to create context");
+ logMessage(QLatin1String("PulseAudio support disabled: Unable to create context"));
pa_mainloop_free(p_test_mainloop);
return;
}
- logMessage("Probing for PulseAudio...");
+ logMessage(QLatin1String("Probing for PulseAudio..."));
// (cg) Convert to PA_CONTEXT_NOFLAGS when PulseAudio 0.9.19 is required
if (pa_context_connect(p_test_context, NULL, static_cast<pa_context_flags_t>(0), NULL) < 0) {
- logMessage(QString("PulseAudio support disabled: %1").arg(pa_strerror(pa_context_errno(p_test_context))));
+ logMessage(QString::fromLatin1("PulseAudio support disabled: %1").arg(QString::fromLocal8Bit(pa_strerror(pa_context_errno(p_test_context)))));
pa_context_disconnect(p_test_context);
pa_context_unref(p_test_context);
pa_mainloop_free(p_test_mainloop);
@@ -693,7 +691,7 @@ PulseSupport::PulseSupport()
pa_mainloop_iterate(p_test_mainloop, 1, NULL);
if (!PA_CONTEXT_IS_GOOD(pa_context_get_state(p_test_context))) {
- logMessage("PulseAudio probe complete.");
+ logMessage(QLatin1String("PulseAudio probe complete."));
break;
}
}
@@ -702,12 +700,12 @@ PulseSupport::PulseSupport()
pa_mainloop_free(p_test_mainloop);
if (!s_pulseActive) {
- logMessage("PulseAudio support is not available.");
+ logMessage(QLatin1String("PulseAudio support is not available."));
return;
}
// If we're still here, PA is available.
- logMessage("PulseAudio support enabled");
+ logMessage(QLatin1String("PulseAudio support enabled"));
// Now we connect for real using a proper main loop that we can forget
// all about processing.
@@ -856,7 +854,7 @@ static void setDevicePriority(Category category, QStringList list)
if (role.isEmpty())
return;
- logMessage(QString("Reindexing %1: %2").arg(role).arg(list.join(", ")));
+ logMessage(QString::fromLatin1("Reindexing %1: %2").arg(role).arg(list.join(QLatin1String(", "))));
char **devices;
devices = pa_xnew(char *, list.size()+1);
@@ -926,7 +924,7 @@ void PulseSupport::setStreamPropList(Category category, QString streamUuid)
if (role.isEmpty())
return;
- logMessage(QString("Setting role to %1 for streamindex %2").arg(role).arg(streamUuid));
+ logMessage(QString::fromLatin1("Setting role to %1 for streamindex %2").arg(role).arg(streamUuid));
setenv("PULSE_PROP_media.role", role.toLatin1().constData(), 1);
setenv("PULSE_PROP_phonon.streamid", streamUuid.toLatin1().constData(), 1);
#endif
@@ -952,30 +950,30 @@ bool PulseSupport::setOutputDevice(QString streamUuid, int device) {
return true;
if (!s_outputDevices.contains(device)) {
- logMessage(QString("Attempting to set Output Device for invalid device id %1.").arg(device));
+ logMessage(QString::fromLatin1("Attempting to set Output Device for invalid device id %1.").arg(device));
return false;
}
const QVariant var = s_outputDevices[device].properties["name"];
- logMessage(QString("Attempting to set Output Device to '%1' for Output Stream %2").arg(var.toString()).arg(streamUuid));
+ logMessage(QString::fromLatin1("Attempting to set Output Device to '%1' for Output Stream %2").arg(var.toString()).arg(streamUuid));
// Attempt to look up the pulse stream index.
if (s_outputStreamIndexMap.contains(streamUuid) && s_outputStreamIndexMap[streamUuid] != PA_INVALID_INDEX) {
- logMessage(QString("... Found in map. Moving now"));
+ logMessage(QLatin1String("... Found in map. Moving now"));
uint32_t pulse_device_index = s_outputDevices[device].pulseIndex;
uint32_t pulse_stream_index = s_outputStreamIndexMap[streamUuid];
- logMessage(QString("Moving Pulse Sink Input %1 to '%2' (Pulse Sink %3)").arg(pulse_stream_index).arg(var.toString()).arg(pulse_device_index));
+ logMessage(QString::fromLatin1("Moving Pulse Sink Input %1 to '%2' (Pulse Sink %3)").arg(pulse_stream_index).arg(var.toString()).arg(pulse_device_index));
/// @todo Find a way to move the stream without saving it... We don't want to pollute the stream restore db.
pa_operation* o;
if (!(o = pa_context_move_sink_input_by_index(s_context, pulse_stream_index, pulse_device_index, NULL, NULL))) {
- logMessage(QString("pa_context_move_sink_input_by_index() failed"));
+ logMessage(QLatin1String("pa_context_move_sink_input_by_index() failed"));
return false;
}
pa_operation_unref(o);
} else {
- logMessage(QString("... Not found in map. We will be notified of the device when the stream appears and we can process any moves needed then"));
+ logMessage(QLatin1String("... Not found in map. We will be notified of the device when the stream appears and we can process any moves needed then"));
}
return true;
#endif
@@ -991,30 +989,30 @@ bool PulseSupport::setCaptureDevice(QString streamUuid, int device) {
return true;
if (!s_captureDevices.contains(device)) {
- logMessage(QString("Attempting to set Capture Device for invalid device id %1.").arg(device));
+ logMessage(QString::fromLatin1("Attempting to set Capture Device for invalid device id %1.").arg(device));
return false;
}
const QVariant var = s_captureDevices[device].properties["name"];
- logMessage(QString("Attempting to set Capture Device to '%1' for Capture Stream %2").arg(var.toString()).arg(streamUuid));
+ logMessage(QString::fromLatin1("Attempting to set Capture Device to '%1' for Capture Stream %2").arg(var.toString()).arg(streamUuid));
// Attempt to look up the pulse stream index.
if (s_captureStreamIndexMap.contains(streamUuid) && s_captureStreamIndexMap[streamUuid] == PA_INVALID_INDEX) {
- logMessage(QString("... Found in map. Moving now"));
+ logMessage(QString::fromLatin1("... Found in map. Moving now"));
uint32_t pulse_device_index = s_captureDevices[device].pulseIndex;
uint32_t pulse_stream_index = s_captureStreamIndexMap[streamUuid];
- logMessage(QString("Moving Pulse Source Output %1 to '%2' (Pulse Sink %3)").arg(pulse_stream_index).arg(var.toString()).arg(pulse_device_index));
+ logMessage(QString::fromLatin1("Moving Pulse Source Output %1 to '%2' (Pulse Sink %3)").arg(pulse_stream_index).arg(var.toString()).arg(pulse_device_index));
/// @todo Find a way to move the stream without saving it... We don't want to pollute the stream restore db.
pa_operation* o;
if (!(o = pa_context_move_source_output_by_index(s_context, pulse_stream_index, pulse_device_index, NULL, NULL))) {
- logMessage(QString("pa_context_move_source_output_by_index() failed"));
+ logMessage(QString::fromLatin1("pa_context_move_source_output_by_index() failed"));
return false;
}
pa_operation_unref(o);
} else {
- logMessage(QString("... Not found in map. We will be notified of the device when the stream appears and we can process any moves needed then"));
+ logMessage(QString::fromLatin1("... Not found in map. We will be notified of the device when the stream appears and we can process any moves needed then"));
}
return true;
#endif
@@ -1025,7 +1023,7 @@ void PulseSupport::clearStreamCache(QString streamUuid) {
Q_UNUSED(streamUuid);
return;
#else
- logMessage(QString("Clearing stream cache for stream %1").arg(streamUuid));
+ logMessage(QString::fromLatin1("Clearing stream cache for stream %1").arg(streamUuid));
s_outputStreamIndexMap.remove(streamUuid);
s_captureStreamIndexMap.remove(streamUuid);
#endif
diff --git a/src/corelib/global/qendian.h b/src/corelib/global/qendian.h
index e0e946b..d7c5ee7 100644
--- a/src/corelib/global/qendian.h
+++ b/src/corelib/global/qendian.h
@@ -44,9 +44,8 @@
#include <QtCore/qglobal.h>
-#ifdef Q_OS_LINUX
-# include <features.h>
-#endif
+// include stdlib.h and hope that it defines __GLIBC__ for glibc-based systems
+#include <stdlib.h>
#ifdef __GLIBC__
#include <byteswap.h>
diff --git a/src/corelib/io/io.pri b/src/corelib/io/io.pri
index cfb40bc..4d4ae21 100644
--- a/src/corelib/io/io.pri
+++ b/src/corelib/io/io.pri
@@ -9,6 +9,7 @@ HEADERS += \
io/qdataurl_p.h \
io/qdebug.h \
io/qdir.h \
+ io/qdir_p.h \
io/qdiriterator.h \
io/qfile.h \
io/qfileinfo.h \
@@ -29,7 +30,11 @@ HEADERS += \
io/qfsfileengine_p.h \
io/qfsfileengine_iterator_p.h \
io/qfilesystemwatcher.h \
- io/qfilesystemwatcher_p.h
+ io/qfilesystemwatcher_p.h \
+ io/qfilesystementry_p.h \
+ io/qfilesystemengine_p.h \
+ io/qfilesystemmetadata_p.h \
+ io/qfilesystemiterator_p.h
SOURCES += \
io/qabstractfileengine.cpp \
@@ -52,25 +57,35 @@ SOURCES += \
io/qsettings.cpp \
io/qfsfileengine.cpp \
io/qfsfileengine_iterator.cpp \
- io/qfilesystemwatcher.cpp
+ io/qfilesystemwatcher.cpp \
+ io/qfilesystementry.cpp \
+ io/qfilesystemengine.cpp
win32 {
SOURCES += io/qsettings_win.cpp
SOURCES += io/qprocess_win.cpp
SOURCES += io/qfsfileengine_win.cpp
- SOURCES += io/qfsfileengine_iterator_win.cpp
SOURCES += io/qfilesystemwatcher_win.cpp
HEADERS += io/qfilesystemwatcher_win_p.h
HEADERS += io/qwindowspipewriter_p.h
SOURCES += io/qwindowspipewriter.cpp
+ SOURCES += io/qfilesystemengine_win.cpp
+ SOURCES += io/qfilesystemiterator_win.cpp
} else:unix {
SOURCES += io/qfsfileengine_unix.cpp
- SOURCES += io/qfsfileengine_iterator_unix.cpp
- symbian:SOURCES += io/qprocess_symbian.cpp
- else:SOURCES += io/qprocess_unix.cpp
+ symbian {
+ SOURCES += io/qfilesystemengine_symbian.cpp
+ SOURCES += io/qprocess_symbian.cpp
+ SOURCES += io/qfilesystemiterator_symbian.cpp
+ } else {
+ SOURCES += io/qfilesystemengine_unix.cpp
+ SOURCES += io/qprocess_unix.cpp
+ SOURCES += io/qfilesystemiterator_unix.cpp
+ }
!nacl:macx-*: {
HEADERS += io/qfilesystemwatcher_fsevents_p.h
+ SOURCES += io/qfilesystemengine_mac.cpp
SOURCES += io/qsettings_mac.cpp io/qfilesystemwatcher_fsevents.cpp
}
diff --git a/src/corelib/io/qabstractfileengine.cpp b/src/corelib/io/qabstractfileengine.cpp
index 37a093c..67109aa 100644
--- a/src/corelib/io/qabstractfileengine.cpp
+++ b/src/corelib/io/qabstractfileengine.cpp
@@ -52,6 +52,10 @@
#include "qdiriterator.h"
#include "qstringbuilder.h"
+#include <QtCore/private/qfilesystementry_p.h>
+#include <QtCore/private/qfilesystemmetadata_p.h>
+#include <QtCore/private/qfilesystemengine_p.h>
+
QT_BEGIN_NAMESPACE
/*!
@@ -149,6 +153,29 @@ QAbstractFileEngineHandler::~QAbstractFileEngineHandler()
}
}
+/*
+ \ìnternal
+
+ Handles calls to custom file engine handlers.
+*/
+QAbstractFileEngine *qt_custom_file_engine_handler_create(const QString &path)
+{
+ QAbstractFileEngine *engine = 0;
+
+ if (qt_file_engine_handlers_in_use) {
+ QReadLocker locker(fileEngineHandlerMutex());
+
+ // check for registered handlers that can load the file
+ QAbstractFileEngineHandlerList *handlers = fileEngineHandlers();
+ for (int i = 0; i < handlers->size(); i++) {
+ if ((engine = handlers->at(i)->create(path)))
+ break;
+ }
+ }
+
+ return engine;
+}
+
/*!
\fn QAbstractFileEngine *QAbstractFileEngineHandler::create(const QString &fileName) const
@@ -177,57 +204,17 @@ QAbstractFileEngineHandler::~QAbstractFileEngineHandler()
*/
QAbstractFileEngine *QAbstractFileEngine::create(const QString &fileName)
{
- if (qt_file_engine_handlers_in_use) {
- QReadLocker locker(fileEngineHandlerMutex());
-
- // check for registered handlers that can load the file
- QAbstractFileEngineHandlerList *handlers = fileEngineHandlers();
- for (int i = 0; i < handlers->size(); i++) {
- if (QAbstractFileEngine *ret = handlers->at(i)->create(fileName))
- return ret;
- }
- }
-
-#ifdef QT_BUILD_CORE_LIB
- for (int prefixSeparator = 0; prefixSeparator < fileName.size(); ++prefixSeparator) {
- QChar const ch = fileName[prefixSeparator];
- if (ch == QLatin1Char('/'))
- break;
-
- if (ch == QLatin1Char(':')) {
- if (prefixSeparator == 0)
- return new QResourceFileEngine(fileName);
-
- if (prefixSeparator == 1)
- break;
-
- const QStringList &paths = QDir::searchPaths(fileName.left(prefixSeparator));
- for (int i = 0; i < paths.count(); i++) {
- QAbstractFileEngine *engine = create(paths.at(i) % QLatin1Char('/') % fileName.mid(prefixSeparator + 1));
- if (engine && (engine->fileFlags(QAbstractFileEngine::FlagsMask) & QAbstractFileEngine::ExistsFlag)) {
- return engine;
- }
- delete engine;
- }
-
- break;
- }
-
- // There's no need to fully validate the prefix here. Consulting the
- // unicode tables could be expensive and validation is already
- // performed in QDir::setSearchPaths.
- //
- // if (!ch.isLetterOrNumber())
- // break;
- }
+ QFileSystemEntry entry(fileName);
+ QFileSystemMetaData metaData;
+ QAbstractFileEngine *engine = QFileSystemEngine::resolveEntryAndCreateLegacyEngine(entry, metaData);
+
+#ifndef QT_NO_FSFILEENGINE
+ if (!engine)
+ // fall back to regular file engine
+ return new QFSFileEngine(entry.filePath());
#endif
-#ifdef QT_NO_FSFILEENGINE
- return 0;
-#else
- // fall back to regular file engine
- return new QFSFileEngine(fileName);
-#endif
+ return engine;
}
/*!
diff --git a/src/corelib/io/qabstractfileengine_p.h b/src/corelib/io/qabstractfileengine_p.h
index e1eba30..075ec81 100644
--- a/src/corelib/io/qabstractfileengine_p.h
+++ b/src/corelib/io/qabstractfileengine_p.h
@@ -74,6 +74,8 @@ public:
Q_DECLARE_PUBLIC(QAbstractFileEngine)
};
+QAbstractFileEngine *qt_custom_file_engine_handler_create(const QString &path);
+
QT_END_NAMESPACE
#endif // QABSTRACTFILEENGINE_P_H
diff --git a/src/corelib/io/qdatastream.cpp b/src/corelib/io/qdatastream.cpp
index 58f0190..73ce490 100644
--- a/src/corelib/io/qdatastream.cpp
+++ b/src/corelib/io/qdatastream.cpp
@@ -223,6 +223,7 @@ QT_BEGIN_NAMESPACE
\value ReadPastEnd The data stream has read past the end of the
data in the underlying device.
\value ReadCorruptData The data stream has read corrupt data.
+ \value WriteFailed The data stream cannot write to the underlying device.
*/
/*****************************************************************************
@@ -243,6 +244,11 @@ QT_BEGIN_NAMESPACE
}
#endif
+#define CHECK_STREAM_WRITE_PRECOND(retVal) \
+ CHECK_STREAM_PRECOND(retVal) \
+ if (q_status != Ok) \
+ return retVal;
+
enum {
DefaultStreamVersion = QDataStream::Qt_4_6
};
@@ -495,6 +501,9 @@ void QDataStream::resetStatus()
/*!
Sets the status of the data stream to the \a status given.
+ Subsequent calls to setStatus() are ignored until resetStatus()
+ is called.
+
\sa Status status() resetStatus()
*/
void QDataStream::setStatus(Status status)
@@ -992,8 +1001,9 @@ int QDataStream::readRawData(char *s, int len)
QDataStream &QDataStream::operator<<(qint8 i)
{
- CHECK_STREAM_PRECOND(*this)
- dev->putChar(i);
+ CHECK_STREAM_WRITE_PRECOND(*this)
+ if (!dev->putChar(i))
+ q_status = WriteFailed;
return *this;
}
@@ -1015,11 +1025,12 @@ QDataStream &QDataStream::operator<<(qint8 i)
QDataStream &QDataStream::operator<<(qint16 i)
{
- CHECK_STREAM_PRECOND(*this)
+ CHECK_STREAM_WRITE_PRECOND(*this)
if (!noswap) {
i = qbswap(i);
}
- dev->write((char *)&i, sizeof(qint16));
+ if (dev->write((char *)&i, sizeof(qint16)) != sizeof(qint16))
+ q_status = WriteFailed;
return *this;
}
@@ -1032,11 +1043,12 @@ QDataStream &QDataStream::operator<<(qint16 i)
QDataStream &QDataStream::operator<<(qint32 i)
{
- CHECK_STREAM_PRECOND(*this)
+ CHECK_STREAM_WRITE_PRECOND(*this)
if (!noswap) {
i = qbswap(i);
}
- dev->write((char *)&i, sizeof(qint32));
+ if (dev->write((char *)&i, sizeof(qint32)) != sizeof(qint32))
+ q_status = WriteFailed;
return *this;
}
@@ -1057,7 +1069,7 @@ QDataStream &QDataStream::operator<<(qint32 i)
QDataStream &QDataStream::operator<<(qint64 i)
{
- CHECK_STREAM_PRECOND(*this)
+ CHECK_STREAM_WRITE_PRECOND(*this)
if (version() < 6) {
quint32 i1 = i & 0xffffffff;
quint32 i2 = i >> 32;
@@ -1066,7 +1078,8 @@ QDataStream &QDataStream::operator<<(qint64 i)
if (!noswap) {
i = qbswap(i);
}
- dev->write((char *)&i, sizeof(qint64));
+ if (dev->write((char *)&i, sizeof(qint64)) != sizeof(qint64))
+ q_status = WriteFailed;
}
return *this;
}
@@ -1086,8 +1099,9 @@ QDataStream &QDataStream::operator<<(qint64 i)
QDataStream &QDataStream::operator<<(bool i)
{
- CHECK_STREAM_PRECOND(*this)
- dev->putChar(qint8(i));
+ CHECK_STREAM_WRITE_PRECOND(*this)
+ if (!dev->putChar(qint8(i)))
+ q_status = WriteFailed;
return *this;
}
@@ -1108,7 +1122,7 @@ QDataStream &QDataStream::operator<<(float f)
return *this;
}
- CHECK_STREAM_PRECOND(*this)
+ CHECK_STREAM_WRITE_PRECOND(*this)
float g = f; // fixes float-on-stack problem
if (!noswap) {
union {
@@ -1119,7 +1133,8 @@ QDataStream &QDataStream::operator<<(float f)
x.val2 = qbswap(x.val2);
g = x.val1;
}
- dev->write((char *)&g, sizeof(float));
+ if (dev->write((char *)&g, sizeof(float)) != sizeof(float))
+ q_status = WriteFailed;
return *this;
}
@@ -1141,10 +1156,11 @@ QDataStream &QDataStream::operator<<(double f)
return *this;
}
- CHECK_STREAM_PRECOND(*this)
+ CHECK_STREAM_WRITE_PRECOND(*this)
#ifndef Q_DOUBLE_FORMAT
if (noswap) {
- dev->write((char *)&f, sizeof(double));
+ if (dev->write((char *)&f, sizeof(double)) != sizeof(double))
+ q_status = WriteFailed;
} else {
union {
double val1;
@@ -1152,7 +1168,8 @@ QDataStream &QDataStream::operator<<(double f)
} x;
x.val1 = f;
x.val2 = qbswap(x.val2);
- dev->write((char *)&x.val2, sizeof(double));
+ if (dev->write((char *)&x.val2, sizeof(double)) != sizeof(double))
+ q_status = WriteFailed;
}
#else
union {
@@ -1181,7 +1198,8 @@ QDataStream &QDataStream::operator<<(double f)
b[Q_DF(1)] = *p++;
b[Q_DF(0)] = *p;
}
- dev->write(b, 8);
+ if (dev->write(b, 8) != 8)
+ q_status = WriteFailed;
#endif
return *this;
}
@@ -1221,7 +1239,7 @@ QDataStream &QDataStream::operator<<(const char *s)
QDataStream &QDataStream::writeBytes(const char *s, uint len)
{
- CHECK_STREAM_PRECOND(*this)
+ CHECK_STREAM_WRITE_PRECOND(*this)
*this << (quint32)len; // write length specifier
if (len)
writeRawData(s, len);
@@ -1239,8 +1257,11 @@ QDataStream &QDataStream::writeBytes(const char *s, uint len)
int QDataStream::writeRawData(const char *s, int len)
{
- CHECK_STREAM_PRECOND(-1)
- return dev->write(s, len);
+ CHECK_STREAM_WRITE_PRECOND(-1)
+ int ret = dev->write(s, len);
+ if (ret != len)
+ q_status = WriteFailed;
+ return ret;
}
/*!
diff --git a/src/corelib/io/qdatastream.h b/src/corelib/io/qdatastream.h
index 774c4bc..05248ac 100644
--- a/src/corelib/io/qdatastream.h
+++ b/src/corelib/io/qdatastream.h
@@ -101,7 +101,8 @@ public:
enum Status {
Ok,
ReadPastEnd,
- ReadCorruptData
+ ReadCorruptData,
+ WriteFailed
};
enum FloatingPointPrecision {
diff --git a/src/corelib/io/qdir.cpp b/src/corelib/io/qdir.cpp
index 426f61e..2f97c3a 100644
--- a/src/corelib/io/qdir.cpp
+++ b/src/corelib/io/qdir.cpp
@@ -41,6 +41,7 @@
#include "qplatformdefs.h"
#include "qdir.h"
+#include "qdir_p.h"
#include "qabstractfileengine.h"
#ifndef QT_NO_DEBUG_STREAM
#include "qdebug.h"
@@ -53,6 +54,10 @@
#include "qvector.h"
#include "qalgorithms.h"
#include "qvarlengtharray.h"
+#include "qfilesystementry_p.h"
+#include "qfilesystemmetadata_p.h"
+#include "qfilesystemengine_p.h"
+#include <qstringbuilder.h>
#ifdef QT_BUILD_CORE_LIB
# include "qresource.h"
@@ -81,129 +86,123 @@ static QString driveSpec(const QString &path)
}
//************* QDirPrivate
-class QDirPrivate
- : public QSharedData
-{
-public:
- QDirPrivate(const QString &path,
- const QStringList &nameFilters_ = QStringList(),
- QDir::SortFlags sort_ = QDir::SortFlags(QDir::Name | QDir::IgnoreCase),
- QDir::Filters filters_ = QDir::AllEntries)
- : QSharedData()
- , nameFilters(nameFilters_)
- , sort(sort_)
- , filters(filters_)
+QDirPrivate::QDirPrivate(const QString &path, const QStringList &nameFilters_, QDir::SortFlags sort_, QDir::Filters filters_)
+ : QSharedData()
+ , nameFilters(nameFilters_)
+ , sort(sort_)
+ , filters(filters_)
#ifdef QT3_SUPPORT
- , filterSepChar(0)
- , matchAllDirs(false)
+ , filterSepChar(0)
+ , matchAllDirs(false)
#endif
- , fileListsInitialized(false)
- {
- setPath(path.isEmpty() ? QString::fromLatin1(".") : path);
-
- bool empty = nameFilters.isEmpty();
- if (!empty) {
- empty = true;
- for (int i = 0; i < nameFilters.size(); ++i) {
- if (!nameFilters.at(i).isEmpty()) {
- empty = false;
- break;
- }
+ , fileListsInitialized(false)
+{
+ setPath(path.isEmpty() ? QString::fromLatin1(".") : path);
+
+ bool empty = nameFilters.isEmpty();
+ if (!empty) {
+ empty = true;
+ for (int i = 0; i < nameFilters.size(); ++i) {
+ if (!nameFilters.at(i).isEmpty()) {
+ empty = false;
+ break;
}
}
- if (empty)
- nameFilters = QStringList(QString::fromLatin1("*"));
}
+ if (empty)
+ nameFilters = QStringList(QString::fromLatin1("*"));
+}
- QDirPrivate(const QDirPrivate &copy)
- : QSharedData(copy)
- , path(copy.path)
- , nameFilters(copy.nameFilters)
- , sort(copy.sort)
- , filters(copy.filters)
+QDirPrivate::QDirPrivate(const QDirPrivate &copy)
+ : QSharedData(copy)
+ , nameFilters(copy.nameFilters)
+ , sort(copy.sort)
+ , filters(copy.filters)
#ifdef QT3_SUPPORT
- , filterSepChar(copy.filterSepChar)
- , matchAllDirs(copy.matchAllDirs)
+ , filterSepChar(copy.filterSepChar)
+ , matchAllDirs(copy.matchAllDirs)
#endif
- , fileListsInitialized(false)
- {
- }
+ , fileListsInitialized(false)
+ , dirEntry(copy.dirEntry)
+ , metaData(copy.metaData)
+{
+}
- bool exists() const
- {
- const QAbstractFileEngine::FileFlags info =
- fileEngine->fileFlags(QAbstractFileEngine::DirectoryType
- | QAbstractFileEngine::ExistsFlag
- | QAbstractFileEngine::Refresh);
- if (!(info & QAbstractFileEngine::DirectoryType))
- return false;
- return info & QAbstractFileEngine::ExistsFlag;
+bool QDirPrivate::exists() const
+{
+ if (fileEngine.isNull()) {
+ QFileSystemEngine::fillMetaData(dirEntry, metaData,
+ QFileSystemMetaData::ExistsAttribute | QFileSystemMetaData::DirectoryType); // always stat
+ return metaData.exists() && metaData.isDirectory();
}
+ const QAbstractFileEngine::FileFlags info =
+ fileEngine->fileFlags(QAbstractFileEngine::DirectoryType
+ | QAbstractFileEngine::ExistsFlag
+ | QAbstractFileEngine::Refresh);
+ if (!(info & QAbstractFileEngine::DirectoryType))
+ return false;
+ return info & QAbstractFileEngine::ExistsFlag;
+}
- void initFileEngine();
- void initFileLists() const;
-
- static void sortFileList(QDir::SortFlags, QFileInfoList &, QStringList *, QFileInfoList *);
-
- static inline QChar getFilterSepChar(const QString &nameFilter)
- {
- QChar sep(QLatin1Char(';'));
- int i = nameFilter.indexOf(sep, 0);
- if (i == -1 && nameFilter.indexOf(QLatin1Char(' '), 0) != -1)
- sep = QChar(QLatin1Char(' '));
- return sep;
- }
+// static
+inline QChar QDirPrivate::getFilterSepChar(const QString &nameFilter)
+{
+ QChar sep(QLatin1Char(';'));
+ int i = nameFilter.indexOf(sep, 0);
+ if (i == -1 && nameFilter.indexOf(QLatin1Char(' '), 0) != -1)
+ sep = QChar(QLatin1Char(' '));
+ return sep;
+}
- static inline QStringList splitFilters(const QString &nameFilter, QChar sep = 0)
- {
- if (sep == 0)
- sep = getFilterSepChar(nameFilter);
- QStringList ret = nameFilter.split(sep);
- for (int i = 0; i < ret.count(); ++i)
- ret[i] = ret[i].trimmed();
- return ret;
- }
+// static
+inline QStringList QDirPrivate::splitFilters(const QString &nameFilter, QChar sep)
+{
+ if (sep == 0)
+ sep = getFilterSepChar(nameFilter);
+ QStringList ret = nameFilter.split(sep);
+ for (int i = 0; i < ret.count(); ++i)
+ ret[i] = ret[i].trimmed();
+ return ret;
+}
- inline void setPath(QString p)
- {
- if ((p.endsWith(QLatin1Char('/')) || p.endsWith(QLatin1Char('\\')))
- && p.length() > 1) {
+inline void QDirPrivate::setPath(const QString &path)
+{
+ QString p = QDir::fromNativeSeparators(path);
+ if (p.endsWith(QLatin1Char('/'))
+ && p.length() > 1
#if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
- if (!(p.length() == 3 && p.at(1) == QLatin1Char(':')))
+ && (!(p.length() == 3 && p.at(1).unicode() == ':' && p.at(0).isLetter()))
#endif
- p.truncate(p.length() - 1);
- }
-
- path = p;
- initFileEngine();
-
- // set the path to be the qt friendly version so then we can operate on it using just /
- path = fileEngine->fileName(QAbstractFileEngine::DefaultName);
- clearFileLists();
+ ) {
+ p.truncate(p.length() - 1);
}
- inline void clearFileLists() {
- fileListsInitialized = false;
- files.clear();
- fileInfos.clear();
- }
-
- QString path;
- QStringList nameFilters;
- QDir::SortFlags sort;
- QDir::Filters filters;
+ dirEntry = QFileSystemEntry(p, QFileSystemEntry::FromInternalPath());
+ metaData.clear();
+ initFileEngine();
+ clearFileLists();
+ absoluteDirEntry = QFileSystemEntry();
+}
-#ifdef QT3_SUPPORT
- QChar filterSepChar;
- bool matchAllDirs;
-#endif
+inline void QDirPrivate::clearFileLists()
+{
+ fileListsInitialized = false;
+ files.clear();
+ fileInfos.clear();
+}
- QScopedPointer<QAbstractFileEngine> fileEngine;
+inline void QDirPrivate::resolveAbsoluteEntry() const
+{
+ if (!absoluteDirEntry.isEmpty() || dirEntry.isEmpty())
+ return;
- mutable bool fileListsInitialized;
- mutable QStringList files;
- mutable QFileInfoList fileInfos;
-};
+ if (dirEntry.isRelative()) {
+ QFileSystemEntry answer = QFileSystemEngine::absoluteName(dirEntry);
+ absoluteDirEntry = QFileSystemEntry(QDir::cleanPath(answer.filePath()), QFileSystemEntry::FromInternalPath());
+ } else {
+ absoluteDirEntry = dirEntry;
+ }
+}
/* For sorting */
struct QDirSortItem
@@ -315,12 +314,11 @@ inline void QDirPrivate::sortFileList(QDir::SortFlags sort, QFileInfoList &l,
}
}
}
-
-inline void QDirPrivate::initFileLists() const
+inline void QDirPrivate::initFileLists(const QDir &dir) const
{
if (!fileListsInitialized) {
QFileInfoList l;
- QDirIterator it(path, nameFilters, filters);
+ QDirIterator it(dir);
while (it.hasNext()) {
it.next();
l.append(it.fileInfo());
@@ -332,7 +330,7 @@ inline void QDirPrivate::initFileLists() const
inline void QDirPrivate::initFileEngine()
{
- fileEngine.reset(QAbstractFileEngine::create(path));
+ fileEngine.reset(QFileSystemEngine::resolveEntryAndCreateLegacyEngine(dirEntry, metaData));
}
/*!
@@ -597,7 +595,7 @@ void QDir::setPath(const QString &path)
QString QDir::path() const
{
const QDirPrivate* d = d_ptr.constData();
- return d->path;
+ return d->dirEntry.filePath();
}
/*!
@@ -611,10 +609,8 @@ QString QDir::path() const
QString QDir::absolutePath() const
{
const QDirPrivate* d = d_ptr.constData();
- QString ret = d->path;
- if (QDir::isRelativePath(ret))
- ret = absoluteFilePath(QString::fromLatin1(""));
- return cleanPath(ret);
+ d->resolveAbsoluteEntry();
+ return d->absoluteDirEntry.filePath();
}
/*!
@@ -635,7 +631,12 @@ QString QDir::absolutePath() const
*/
QString QDir::canonicalPath() const
{
- return cleanPath(d_ptr->fileEngine->fileName(QAbstractFileEngine::CanonicalName));
+ const QDirPrivate* d = d_ptr.constData();
+ if (d->fileEngine.isNull()) {
+ QFileSystemEntry answer = QFileSystemEngine::canonicalName(d->dirEntry, d->metaData);
+ return answer.filePath();
+ }
+ return d->fileEngine->fileName(QAbstractFileEngine::CanonicalName);
}
/*!
@@ -652,10 +653,7 @@ QString QDir::canonicalPath() const
QString QDir::dirName() const
{
const QDirPrivate* d = d_ptr.constData();
- int pos = d->path.lastIndexOf(QLatin1Char('/'));
- if (pos == -1)
- return d->path;
- return d->path.mid(pos + 1);
+ return d->dirEntry.fileName();
}
/*!
@@ -673,7 +671,7 @@ QString QDir::filePath(const QString &fileName) const
if (isAbsolutePath(fileName))
return QString(fileName);
- QString ret = d->path;
+ QString ret = d->dirEntry.filePath();
if (!fileName.isEmpty()) {
if (!ret.isEmpty() && ret[(int)ret.length()-1] != QLatin1Char('/') && fileName[0] != QLatin1Char('/'))
ret += QLatin1Char('/');
@@ -696,22 +694,12 @@ QString QDir::absoluteFilePath(const QString &fileName) const
if (isAbsolutePath(fileName))
return fileName;
- QString ret;
-#ifndef QT_NO_FSFILEENGINE
- if (isRelativePath(d->path)) //get pwd
- ret = QFSFileEngine::currentPath(fileName);
-#endif
- if (!d->path.isEmpty() && d->path != QLatin1String(".")) {
- if (!ret.isEmpty() && !ret.endsWith(QLatin1Char('/')))
- ret += QLatin1Char('/');
- ret += d->path;
- }
- if (!fileName.isEmpty()) {
- if (!ret.isEmpty() && !ret.endsWith(QLatin1Char('/')))
- ret += QLatin1Char('/');
- ret += fileName;
- }
- return ret;
+ d->resolveAbsoluteEntry();
+ if (fileName.isEmpty())
+ return d->absoluteDirEntry.filePath();
+ if (!d->absoluteDirEntry.isRoot())
+ return d->absoluteDirEntry.filePath() % QLatin1Char('/') % fileName;
+ return d->absoluteDirEntry.filePath() % fileName;
}
/*!
@@ -723,7 +711,7 @@ QString QDir::absoluteFilePath(const QString &fileName) const
*/
QString QDir::relativeFilePath(const QString &fileName) const
{
- QString dir = absolutePath();
+ QString dir = cleanPath(absolutePath());
QString file = cleanPath(fileName);
if (isRelativePath(file) || isRelativePath(dir))
@@ -859,21 +847,22 @@ bool QDir::cd(const QString &dirName)
if (dirName.isEmpty() || dirName == QLatin1String("."))
return true;
- QString newPath = d->path;
+ QString newPath;
if (isAbsolutePath(dirName)) {
newPath = cleanPath(dirName);
} else {
if (isRoot()) {
if (dirName == QLatin1String(".."))
return false;
+ newPath = d->dirEntry.filePath();
} else {
- newPath += QLatin1Char('/');
+ newPath = d->dirEntry.filePath() % QLatin1Char('/');
}
newPath += dirName;
if (dirName.indexOf(QLatin1Char('/')) >= 0
- || d->path == QLatin1String(".")
- || dirName == QLatin1String("..")) {
+ || dirName == QLatin1String("..")
+ || d->dirEntry.filePath() == QLatin1String(".")) {
newPath = cleanPath(newPath);
/*
If newPath starts with .., we convert it to absolute to
@@ -891,7 +880,6 @@ bool QDir::cd(const QString &dirName)
QScopedPointer<QDirPrivate> dir(new QDirPrivate(*d_ptr.constData()));
dir->setPath(newPath);
-
if (!dir->exists())
return false;
@@ -1204,7 +1192,7 @@ void QDir::setSorting(SortFlags sort)
uint QDir::count() const
{
const QDirPrivate* d = d_ptr.constData();
- d->initFileLists();
+ d->initFileLists(*this);
return d->files.count();
}
@@ -1218,7 +1206,7 @@ uint QDir::count() const
QString QDir::operator[](int pos) const
{
const QDirPrivate* d = d_ptr.constData();
- d->initFileLists();
+ d->initFileLists(*this);
return d->files[pos];
}
@@ -1301,12 +1289,12 @@ QStringList QDir::entryList(const QStringList &nameFilters, Filters filters,
sort = d->sort;
if (filters == d->filters && sort == d->sort && nameFilters == d->nameFilters) {
- d->initFileLists();
+ d->initFileLists(*this);
return d->files;
}
QFileInfoList l;
- QDirIterator it(d->path, nameFilters, filters);
+ QDirIterator it(d->dirEntry.filePath(), nameFilters, filters);
while (it.hasNext()) {
it.next();
l.append(it.fileInfo());
@@ -1347,12 +1335,12 @@ QFileInfoList QDir::entryInfoList(const QStringList &nameFilters, Filters filter
sort = d->sort;
if (filters == d->filters && sort == d->sort && nameFilters == d->nameFilters) {
- d->initFileLists();
+ d->initFileLists(*this);
return d->fileInfos;
}
QFileInfoList l;
- QDirIterator it(d->path, nameFilters, filters);
+ QDirIterator it(d->dirEntry.filePath(), nameFilters, filters);
while (it.hasNext()) {
it.next();
l.append(it.fileInfo());
@@ -1367,8 +1355,11 @@ QFileInfoList QDir::entryInfoList(const QStringList &nameFilters, Filters filter
Returns true on success; otherwise returns false.
+ If the directory already exists when this function is called, it will return false.
+
\sa rmdir()
*/
+// ### Qt5: behaviour when directory already exists should be made consistent for mkdir and mkpath
bool QDir::mkdir(const QString &dirName) const
{
const QDirPrivate* d = d_ptr.constData();
@@ -1379,6 +1370,8 @@ bool QDir::mkdir(const QString &dirName) const
}
QString fn = filePath(dirName);
+ if (d->fileEngine.isNull())
+ return QFileSystemEngine::createDirectory(QFileSystemEntry(fn), false);
return d->fileEngine->mkdir(fn, false);
}
@@ -1401,6 +1394,9 @@ bool QDir::rmdir(const QString &dirName) const
}
QString fn = filePath(dirName);
+ if (d->fileEngine.isNull())
+ return QFileSystemEngine::removeDirectory(QFileSystemEntry(fn), false);
+
return d->fileEngine->rmdir(fn, false);
}
@@ -1412,8 +1408,11 @@ bool QDir::rmdir(const QString &dirName) const
Returns true if successful; otherwise returns false.
+ If the path already exists when this function is called, it will return true.
+
\sa rmpath()
*/
+// ### Qt5: behaviour when directory already exists should be made consistent for mkdir and mkpath
bool QDir::mkpath(const QString &dirPath) const
{
const QDirPrivate* d = d_ptr.constData();
@@ -1424,6 +1423,8 @@ bool QDir::mkpath(const QString &dirPath) const
}
QString fn = filePath(dirPath);
+ if (d->fileEngine.isNull())
+ return QFileSystemEngine::createDirectory(QFileSystemEntry(fn), true);
return d->fileEngine->mkdir(fn, true);
}
@@ -1448,6 +1449,8 @@ bool QDir::rmpath(const QString &dirPath) const
}
QString fn = filePath(dirPath);
+ if (d->fileEngine.isNull())
+ return QFileSystemEngine::removeDirectory(QFileSystemEntry(fn), true);
return d->fileEngine->rmdir(fn, true);
}
@@ -1464,6 +1467,13 @@ bool QDir::isReadable() const
{
const QDirPrivate* d = d_ptr.constData();
+ if (d->fileEngine.isNull()) {
+ if (!d->metaData.hasFlags(QFileSystemMetaData::UserReadPermission))
+ QFileSystemEngine::fillMetaData(d->dirEntry, d->metaData, QFileSystemMetaData::UserReadPermission);
+
+ return (d->metaData.permissions() & QFile::ReadUser) != 0;
+ }
+
const QAbstractFileEngine::FileFlags info =
d->fileEngine->fileFlags(QAbstractFileEngine::DirectoryType
| QAbstractFileEngine::PermsMask);
@@ -1502,6 +1512,8 @@ bool QDir::exists() const
*/
bool QDir::isRoot() const
{
+ if (d_ptr->fileEngine.isNull())
+ return d_ptr->dirEntry.isRoot();
return d_ptr->fileEngine->fileFlags(QAbstractFileEngine::FlagsMask) & QAbstractFileEngine::RootFlag;
}
@@ -1532,6 +1544,8 @@ bool QDir::isRoot() const
*/
bool QDir::isRelative() const
{
+ if (d_ptr->fileEngine.isNull())
+ return d_ptr->dirEntry.isRelative();
return d_ptr->fileEngine->isRelativePath();
}
@@ -1543,20 +1557,23 @@ bool QDir::isRelative() const
\sa isAbsolute() isAbsolutePath() isRelative() cleanPath()
*/
-bool QDir::makeAbsolute() // ### What do the return values signify?
+bool QDir::makeAbsolute()
{
- QString absolutePath = d_ptr.constData()->fileEngine->fileName(QAbstractFileEngine::AbsoluteName);
- if (QDir::isRelativePath(absolutePath))
- return false;
-
- QScopedPointer<QDirPrivate> dir(new QDirPrivate(*d_ptr.constData()));
- dir->setPath(absolutePath);
-
- d_ptr = dir.take();
-
- if (!(d_ptr->fileEngine->fileFlags(QAbstractFileEngine::TypesMask) & QAbstractFileEngine::DirectoryType))
- return false;
+ const QDirPrivate *d = d_ptr.constData();
+ QScopedPointer<QDirPrivate> dir;
+ if (!d->fileEngine.isNull()) {
+ QString absolutePath = d->fileEngine->fileName(QAbstractFileEngine::AbsoluteName);
+ if (QDir::isRelativePath(absolutePath))
+ return false;
+ dir.reset(new QDirPrivate(*d_ptr.constData()));
+ dir->setPath(absolutePath);
+ } else { // native FS
+ d->resolveAbsoluteEntry();
+ dir.reset(new QDirPrivate(*d_ptr.constData()));
+ dir->setPath(d->absoluteDirEntry.filePath());
+ }
+ d_ptr = dir.take(); // actually detach
return true;
}
@@ -1576,17 +1593,24 @@ bool QDir::operator==(const QDir &dir) const
if (d == other)
return true;
- if (d->fileEngine->caseSensitive() != other->fileEngine->caseSensitive())
- return false;
+ Qt::CaseSensitivity sensitive;
+ if (d->fileEngine.isNull() || other->fileEngine.isNull()) {
+ if (d->fileEngine.data() != other->fileEngine.data()) // one is native, the other is a custom file-engine
+ return false;
+
+ sensitive = QFileSystemEngine::isCaseSensitive() ? Qt::CaseSensitive : Qt::CaseInsensitive;
+ } else {
+ if (d->fileEngine->caseSensitive() != other->fileEngine->caseSensitive())
+ return false;
+ sensitive = d->fileEngine->caseSensitive() ? Qt::CaseSensitive : Qt::CaseInsensitive;
+ }
+
if (d->filters == other->filters
&& d->sort == other->sort
&& d->nameFilters == other->nameFilters) {
- QString dir1 = absolutePath(), dir2 = dir.absolutePath();
- if (!other->fileEngine->caseSensitive())
- return (dir1.toLower() == dir2.toLower());
-
- return (dir1 == dir2);
-
+ d->resolveAbsoluteEntry();
+ other->resolveAbsoluteEntry();
+ return d->absoluteDirEntry.filePath().compare(other->absoluteDirEntry.filePath(), sensitive) == 0;
}
return false;
}
@@ -1735,12 +1759,7 @@ QChar QDir::separator()
*/
bool QDir::setCurrent(const QString &path)
{
-#ifdef QT_NO_FSFILEENGINE
- Q_UNUSED(path);
- return false;
-#else
- return QFSFileEngine::setCurrentPath(path);
-#endif
+ return QFileSystemEngine::setCurrentPath(QFileSystemEntry(path));
}
/*!
@@ -1761,11 +1780,7 @@ bool QDir::setCurrent(const QString &path)
*/
QString QDir::currentPath()
{
-#ifdef QT_NO_FSFILEENGINE
- return QString();
-#else
- return QFSFileEngine::currentPath();
-#endif
+ return QFileSystemEngine::currentPath().filePath();
}
/*!
@@ -1823,11 +1838,7 @@ QString QDir::currentPath()
*/
QString QDir::homePath()
{
-#ifdef QT_NO_FSFILEENGINE
- return QString();
-#else
- return cleanPath(QFSFileEngine::homePath());
-#endif
+ return QFileSystemEngine::homePath();
}
/*!
@@ -1866,11 +1877,7 @@ QString QDir::homePath()
*/
QString QDir::tempPath()
{
-#ifdef QT_NO_FSFILEENGINE
- return QString();
-#else
- return cleanPath(QFSFileEngine::tempPath());
-#endif
+ return QFileSystemEngine::tempPath();
}
/*!
@@ -1897,11 +1904,7 @@ QString QDir::tempPath()
*/
QString QDir::rootPath()
{
-#ifdef QT_NO_FSFILEENGINE
- return QString();
-#else
- return QFSFileEngine::rootPath();
-#endif
+ return QFileSystemEngine::rootPath();
}
/*!
@@ -2098,6 +2101,7 @@ bool QDir::isRelativePath(const QString &path)
void QDir::refresh() const
{
QDirPrivate *d = const_cast<QDir*>(this)->d_ptr.data();
+ d->metaData.clear();
d->initFileEngine();
d->clearFileLists();
}
diff --git a/src/corelib/io/qdir_p.h b/src/corelib/io/qdir_p.h
new file mode 100644
index 0000000..5f97c1f
--- /dev/null
+++ b/src/corelib/io/qdir_p.h
@@ -0,0 +1,98 @@
+/****************************************************************************
+**
+** 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 QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDIR_PRIVATE_H
+#define QDIR_PRIVATE_H
+
+#include "qfilesystementry_p.h"
+#include "qfilesystemmetadata_p.h"
+
+QT_BEGIN_NAMESPACE
+
+class QDirPrivate : public QSharedData
+{
+public:
+ QDirPrivate(const QString &path, const QStringList &nameFilters_ = QStringList(),
+ QDir::SortFlags sort_ = QDir::SortFlags(QDir::Name | QDir::IgnoreCase),
+ QDir::Filters filters_ = QDir::AllEntries);
+
+ QDirPrivate(const QDirPrivate &copy);
+
+ bool exists() const;
+
+ void initFileEngine();
+ void initFileLists(const QDir &dir) const;
+
+ static void sortFileList(QDir::SortFlags, QFileInfoList &, QStringList *, QFileInfoList *);
+
+ static inline QChar getFilterSepChar(const QString &nameFilter);
+
+ static inline QStringList splitFilters(const QString &nameFilter, QChar sep = 0);
+
+ inline void setPath(const QString &path);
+
+ inline void clearFileLists();
+
+ inline void resolveAbsoluteEntry() const;
+
+ QStringList nameFilters;
+ QDir::SortFlags sort;
+ QDir::Filters filters;
+
+#ifdef QT3_SUPPORT
+ QChar filterSepChar;
+ bool matchAllDirs;
+#endif
+
+ QScopedPointer<QAbstractFileEngine> fileEngine;
+
+ mutable bool fileListsInitialized;
+ mutable QStringList files;
+ mutable QFileInfoList fileInfos;
+
+ QFileSystemEntry dirEntry;
+ mutable QFileSystemEntry absoluteDirEntry;
+ mutable QFileSystemMetaData metaData;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/corelib/io/qdiriterator.cpp b/src/corelib/io/qdiriterator.cpp
index fd4b9c1..be392c4 100644
--- a/src/corelib/io/qdiriterator.cpp
+++ b/src/corelib/io/qdiriterator.cpp
@@ -90,6 +90,7 @@
*/
#include "qdiriterator.h"
+#include "qdir_p.h"
#include "qabstractfileengine.h"
@@ -97,36 +98,41 @@
#include <QtCore/qstack.h>
#include <QtCore/qvariant.h>
+#include <QtCore/private/qfilesystemiterator_p.h>
+#include <QtCore/private/qfilesystementry_p.h>
+#include <QtCore/private/qfilesystemmetadata_p.h>
+#include <QtCore/private/qfilesystemengine_p.h>
+#include <QtCore/qfsfileengine.h>
+#include <QtCore/private/qfileinfo_p.h>
+
QT_BEGIN_NAMESPACE
-class QDirIteratorPrivateIteratorStack : public QStack<QAbstractFileEngineIterator *>
+template <class Iterator>
+class QDirIteratorPrivateIteratorStack : public QStack<Iterator *>
{
public:
- ~QDirIteratorPrivateIteratorStack();
+ ~QDirIteratorPrivateIteratorStack()
+ {
+ qDeleteAll(*this);
+ }
};
-QDirIteratorPrivateIteratorStack::~QDirIteratorPrivateIteratorStack()
-{
- qDeleteAll(*this);
-}
-
-
class QDirIteratorPrivate
{
public:
- QDirIteratorPrivate(const QString &path, const QStringList &nameFilters,
- QDir::Filters filters, QDirIterator::IteratorFlags flags);
- ~QDirIteratorPrivate();
+ QDirIteratorPrivate(const QFileSystemEntry &entry, const QStringList &nameFilters,
+ QDir::Filters filters, QDirIterator::IteratorFlags flags, bool resolveEngine = true);
void advance();
+ bool entryMatches(const QString & fileName, const QFileInfo &fileInfo);
void pushDirectory(const QFileInfo &fileInfo);
void checkAndPushDirectory(const QFileInfo &);
bool matchesFilters(const QString &fileName, const QFileInfo &fi) const;
QScopedPointer<QAbstractFileEngine> engine;
- const QString path;
+ QFileSystemEntry dirEntry;
const QStringList nameFilters;
const QDir::Filters filters;
const QDirIterator::IteratorFlags iteratorFlags;
@@ -135,23 +141,22 @@ public:
QVector<QRegExp> nameRegExps;
#endif
- QDirIteratorPrivateIteratorStack fileEngineIterators;
+ QDirIteratorPrivateIteratorStack<QAbstractFileEngineIterator> fileEngineIterators;
+ QDirIteratorPrivateIteratorStack<QFileSystemIterator> nativeIterators;
+
QFileInfo currentFileInfo;
QFileInfo nextFileInfo;
// Loop protection
QSet<QString> visitedLinks;
-
- QDirIterator *q;
};
/*!
\internal
*/
-QDirIteratorPrivate::QDirIteratorPrivate(const QString &path, const QStringList &nameFilters,
- QDir::Filters filters, QDirIterator::IteratorFlags flags)
- : engine(QAbstractFileEngine::create(path))
- , path(path)
+QDirIteratorPrivate::QDirIteratorPrivate(const QFileSystemEntry &entry, const QStringList &nameFilters,
+ QDir::Filters filters, QDirIterator::IteratorFlags flags, bool resolveEngine)
+ : dirEntry(entry)
, nameFilters(nameFilters.contains(QLatin1String("*")) ? QStringList() : nameFilters)
, filters(QDir::NoFilter == filters ? QDir::AllEntries : filters)
, iteratorFlags(flags)
@@ -164,22 +169,19 @@ QDirIteratorPrivate::QDirIteratorPrivate(const QString &path, const QStringList
(filters & QDir::CaseSensitive) ? Qt::CaseSensitive : Qt::CaseInsensitive,
QRegExp::Wildcard));
#endif
+ QFileSystemMetaData metaData;
+ if (resolveEngine)
+ engine.reset(QFileSystemEngine::resolveEntryAndCreateLegacyEngine(dirEntry, metaData));
+ QFileInfo fileInfo(new QFileInfoPrivate(dirEntry, metaData));
// Populate fields for hasNext() and next()
- pushDirectory(QFileInfo(path));
+ pushDirectory(fileInfo);
advance();
}
/*!
\internal
*/
-QDirIteratorPrivate::~QDirIteratorPrivate()
-{
-}
-
-/*!
- \internal
-*/
void QDirIteratorPrivate::pushDirectory(const QFileInfo &fileInfo)
{
QString path = fileInfo.filePath();
@@ -201,34 +203,63 @@ void QDirIteratorPrivate::pushDirectory(const QFileInfo &fileInfo)
} else {
// No iterator; no entry list.
}
+ } else {
+ QFileSystemIterator *it = new QFileSystemIterator(fileInfo.d_ptr->fileEntry,
+ filters, nameFilters, iteratorFlags);
+ nativeIterators << it;
}
}
-/*!
- \internal
-*/
-void QDirIteratorPrivate::advance()
+inline bool QDirIteratorPrivate::entryMatches(const QString & fileName, const QFileInfo &fileInfo)
{
- while (!fileEngineIterators.isEmpty()) {
+ checkAndPushDirectory(fileInfo);
- // Find the next valid iterator that matches the filters.
- while (fileEngineIterators.top()->hasNext()) {
- QAbstractFileEngineIterator *it = fileEngineIterators.top();
- it->next();
+ if (matchesFilters(fileName, fileInfo)) {
+ currentFileInfo = nextFileInfo;
+ nextFileInfo = fileInfo;
- const QFileInfo info = it->currentFileInfo();
- checkAndPushDirectory(it->currentFileInfo());
+ //We found a matching entry.
+ return true;
+ }
- if (matchesFilters(it->currentFileName(), info)) {
- currentFileInfo = nextFileInfo;
- nextFileInfo = info;
+ return false;
+}
- //We found a matching entry.
- return;
+/*!
+ \internal
+*/
+void QDirIteratorPrivate::advance()
+{
+ if (engine) {
+ while (!fileEngineIterators.isEmpty()) {
+ // Find the next valid iterator that matches the filters.
+ QAbstractFileEngineIterator *it;
+ while (it = fileEngineIterators.top(), it->hasNext()) {
+ it->next();
+ if (entryMatches(it->currentFileName(), it->currentFileInfo()))
+ return;
}
+
+ fileEngineIterators.pop();
+ delete it;
}
+ } else {
+ QFileSystemEntry nextEntry;
+ QFileSystemMetaData nextMetaData;
+
+ while (!nativeIterators.isEmpty()) {
+ // Find the next valid iterator that matches the filters.
+ QFileSystemIterator *it;
+ while (it = nativeIterators.top(), it->advance(nextEntry, nextMetaData)) {
+ QFileInfo info(new QFileInfoPrivate(nextEntry, nextMetaData));
+
+ if (entryMatches(nextEntry.fileName(), info))
+ return;
+ }
- delete fileEngineIterators.pop();
+ nativeIterators.pop();
+ delete it;
+ }
}
currentFileInfo = nextFileInfo;
@@ -262,7 +293,8 @@ void QDirIteratorPrivate::checkAndPushDirectory(const QFileInfo &fileInfo)
return;
// Stop link loops
- if (visitedLinks.contains(fileInfo.canonicalFilePath()))
+ if (!visitedLinks.isEmpty() &&
+ visitedLinks.contains(fileInfo.canonicalFilePath()))
return;
pushDirectory(fileInfo);
@@ -373,9 +405,11 @@ bool QDirIteratorPrivate::matchesFilters(const QString &fileName, const QFileInf
\sa hasNext(), next(), IteratorFlags
*/
QDirIterator::QDirIterator(const QDir &dir, IteratorFlags flags)
- : d(new QDirIteratorPrivate(dir.path(), dir.nameFilters(), dir.filter(), flags))
{
- d->q = this;
+ // little trick to get hold of the QDirPrivate while there is no API on QDir to give it to us
+ class MyQDir : public QDir { public: const QDirPrivate *priv() const { return d_ptr.constData(); } };
+ const QDirPrivate *other = static_cast<const MyQDir*>(&dir)->priv();
+ d.reset(new QDirIteratorPrivate(other->dirEntry, other->nameFilters, other->filters, flags, !other->fileEngine.isNull()));
}
/*!
@@ -389,15 +423,11 @@ QDirIterator::QDirIterator(const QDir &dir, IteratorFlags flags)
\note To list symlinks that point to non existing files, QDir::System must be
passed to the flags.
- \warning This constructor expects \a flags to be left at its default value. Use
- the constructors that do not take the \a filters argument instead.
-
\sa hasNext(), next(), IteratorFlags
*/
QDirIterator::QDirIterator(const QString &path, QDir::Filters filters, IteratorFlags flags)
- : d(new QDirIteratorPrivate(path, QStringList(), filters, flags))
+ : d(new QDirIteratorPrivate(QFileSystemEntry(path), QStringList(), filters, flags))
{
- d->q = this;
}
/*!
@@ -413,9 +443,8 @@ QDirIterator::QDirIterator(const QString &path, QDir::Filters filters, IteratorF
\sa hasNext(), next(), IteratorFlags
*/
QDirIterator::QDirIterator(const QString &path, IteratorFlags flags)
- : d(new QDirIteratorPrivate(path, QStringList(), QDir::NoFilter, flags))
+ : d(new QDirIteratorPrivate(QFileSystemEntry(path), QStringList(), QDir::NoFilter, flags))
{
- d->q = this;
}
/*!
@@ -429,16 +458,12 @@ QDirIterator::QDirIterator(const QString &path, IteratorFlags flags)
\note To list symlinks that point to non existing files, QDir::System must be
passed to the flags.
- \warning This constructor expects \c flags to be left at its default value. Use the
- constructors that do not take the \a filters argument instead.
-
\sa hasNext(), next(), IteratorFlags
*/
QDirIterator::QDirIterator(const QString &path, const QStringList &nameFilters,
QDir::Filters filters, IteratorFlags flags)
- : d(new QDirIteratorPrivate(path, nameFilters, filters, flags))
+ : d(new QDirIteratorPrivate(QFileSystemEntry(path), nameFilters, filters, flags))
{
- d->q = this;
}
/*!
@@ -472,7 +497,10 @@ QString QDirIterator::next()
*/
bool QDirIterator::hasNext() const
{
- return !d->fileEngineIterators.isEmpty();
+ if (d->engine)
+ return !d->fileEngineIterators.isEmpty();
+ else
+ return !d->nativeIterators.isEmpty();
}
/*!
@@ -515,7 +543,7 @@ QFileInfo QDirIterator::fileInfo() const
*/
QString QDirIterator::path() const
{
- return d->path;
+ return d->dirEntry.filePath();
}
QT_END_NAMESPACE
diff --git a/src/corelib/io/qfile.cpp b/src/corelib/io/qfile.cpp
index 50e9a8f..85e78a6 100644
--- a/src/corelib/io/qfile.cpp
+++ b/src/corelib/io/qfile.cpp
@@ -48,6 +48,7 @@
#include "qfileinfo.h"
#include "private/qiodevice_p.h"
#include "private/qfile_p.h"
+#include "private/qsystemerror_p.h"
#if defined(QT_BUILD_CORE_LIB)
# include "qcoreapplication.h"
#endif
@@ -992,8 +993,14 @@ bool QFile::open(OpenMode mode)
return false;
}
+#ifdef Q_OS_SYMBIAN
+ // For symbian, the unbuffered flag is used to control write-behind cache behaviour
+ if (fileEngine()->open(mode))
+#else
// QIODevice provides the buffering, so there's no need to request it from the file engine.
- if (fileEngine()->open(mode | QIODevice::Unbuffered)) {
+ if (fileEngine()->open(mode | QIODevice::Unbuffered))
+#endif
+ {
QIODevice::open(mode);
if (mode & Append)
seek(size());
@@ -1223,6 +1230,7 @@ bool QFile::unmap(uchar *address)
d->setError(d->fileEngine->error(), d->fileEngine->errorString());
return success;
}
+ d->setError(PermissionsError, tr("No file engine available or engine does not support UnMapExtension"));
return false;
}
@@ -1477,7 +1485,17 @@ bool QFile::atEnd() const
}
/*!
- \reimp
+ For random-access devices, this function sets the current position
+ to \a pos, returning true on success, or false if an error occurred.
+ For sequential devices, the default behavior is to do nothing and
+ return false.
+
+ Seeking beyond the end of a file:
+ If the position is beyond the end of a file, then seek() shall not
+ immediately extend the file. If a write is performed at this position,
+ then the file shall be extended. The content of the file between the
+ previous end of file and the newly written data is UNDEFINED and
+ varies between platforms and file systems.
*/
bool QFile::seek(qint64 off)
diff --git a/src/corelib/io/qfileinfo.cpp b/src/corelib/io/qfileinfo.cpp
index 7eca212..9041c94 100644
--- a/src/corelib/io/qfileinfo.cpp
+++ b/src/corelib/io/qfileinfo.cpp
@@ -51,7 +51,47 @@ QString QFileInfoPrivate::getFileName(QAbstractFileEngine::FileName name) const
{
if (cache_enabled && !fileNames[(int)name].isNull())
return fileNames[(int)name];
- QString ret = fileEngine->fileName(name);
+
+ QString ret;
+ if (fileEngine == 0) { // local file; use the QFileSystemEngine directly
+ switch (name) {
+ case QAbstractFileEngine::CanonicalName:
+ case QAbstractFileEngine::CanonicalPathName: {
+ QFileSystemEntry entry = QFileSystemEngine::canonicalName(fileEntry, metaData);
+ if (cache_enabled) { // be smart and store both
+ fileNames[QAbstractFileEngine::CanonicalName] = entry.filePath();
+ fileNames[QAbstractFileEngine::CanonicalPathName] = entry.path();
+ }
+ if (name == QAbstractFileEngine::CanonicalName)
+ ret = entry.filePath();
+ else
+ ret = entry.path();
+ break;
+ }
+ case QAbstractFileEngine::LinkName:
+ ret = QFileSystemEngine::getLinkTarget(fileEntry, metaData).filePath();
+ break;
+ case QAbstractFileEngine::BundleName:
+ ret = QFileSystemEngine::bundleName(fileEntry);
+ break;
+ case QAbstractFileEngine::AbsoluteName:
+ case QAbstractFileEngine::AbsolutePathName: {
+ QFileSystemEntry entry = QFileSystemEngine::absoluteName(fileEntry);
+ if (cache_enabled) { // be smart and store both
+ fileNames[QAbstractFileEngine::AbsoluteName] = entry.filePath();
+ fileNames[QAbstractFileEngine::AbsolutePathName] = entry.path();
+ }
+ if (name == QAbstractFileEngine::AbsoluteName)
+ ret = entry.filePath();
+ else
+ ret = entry.path();
+ break;
+ }
+ default: break;
+ }
+ } else {
+ ret = fileEngine->fileName(name);
+ }
if (ret.isNull())
ret = QLatin1String("");
if (cache_enabled)
@@ -63,7 +103,19 @@ QString QFileInfoPrivate::getFileOwner(QAbstractFileEngine::FileOwner own) const
{
if (cache_enabled && !fileOwners[(int)own].isNull())
return fileOwners[(int)own];
- QString ret = fileEngine->owner(own);
+ QString ret;
+ if (fileEngine == 0) {
+ switch (own) {
+ case QAbstractFileEngine::OwnerUser:
+ ret = QFileSystemEngine::resolveUserName(fileEntry, metaData);
+ break;
+ case QAbstractFileEngine::OwnerGroup:
+ ret = QFileSystemEngine::resolveGroupName(fileEntry, metaData);
+ break;
+ }
+ } else {
+ ret = fileEngine->owner(own);
+ }
if (ret.isNull())
ret = QLatin1String("");
if (cache_enabled)
@@ -73,6 +125,7 @@ QString QFileInfoPrivate::getFileOwner(QAbstractFileEngine::FileOwner own) const
uint QFileInfoPrivate::getFileFlags(QAbstractFileEngine::FileFlags request) const
{
+ Q_ASSERT(fileEngine); // should never be called when using the native FS
// We split the testing into tests for for LinkType, BundleType, PermsMask
// and the rest.
// Tests for file permissions on Windows can be slow, expecially on network
@@ -133,6 +186,7 @@ uint QFileInfoPrivate::getFileFlags(QAbstractFileEngine::FileFlags request) cons
QDateTime &QFileInfoPrivate::getFileTime(QAbstractFileEngine::FileTime request) const
{
+ Q_ASSERT(fileEngine); // should never be called when using the native FS
if (!cache_enabled)
clearFlags();
uint cf;
@@ -237,6 +291,13 @@ QDateTime &QFileInfoPrivate::getFileTime(QAbstractFileEngine::FileTime request)
*/
/*!
+ \internal
+*/
+QFileInfo::QFileInfo(QFileInfoPrivate *p) : d_ptr(p)
+{
+}
+
+/*!
Constructs an empty QFileInfo object.
Note that an empty QFileInfo object contain no file reference.
@@ -330,23 +391,22 @@ bool QFileInfo::operator==(const QFileInfo &fileinfo) const
return true;
if (d->isDefaultConstructed || fileinfo.d_ptr->isDefaultConstructed)
return false;
- if (d->fileEngine->caseSensitive() != fileinfo.d_ptr->fileEngine->caseSensitive())
- return false;
- if (fileinfo.size() == size()) { //if the size isn't the same...
- QString file1 = canonicalFilePath(),
- file2 = fileinfo.canonicalFilePath();
- if (file1.length() == file2.length()) {
- if (!fileinfo.d_ptr->fileEngine->caseSensitive()) {
- for (int i = 0; i < file1.length(); i++) {
- if (file1.at(i).toLower() != file2.at(i).toLower())
- return false;
- }
- return true;
- }
- return (file1 == file2);
- }
+ Qt::CaseSensitivity sensitive;
+ if (d->fileEngine == 0 || fileinfo.d_ptr->fileEngine == 0) {
+ if (d->fileEngine != fileinfo.d_ptr->fileEngine) // one is native, the other is a custom file-engine
+ return false;
+
+ sensitive = QFileSystemEngine::isCaseSensitive() ? Qt::CaseSensitive : Qt::CaseInsensitive;
+ } else {
+ if (d->fileEngine->caseSensitive() != fileinfo.d_ptr->fileEngine->caseSensitive())
+ return false;
+ sensitive = d->fileEngine->caseSensitive() ? Qt::CaseSensitive : Qt::CaseInsensitive;
}
- return false;
+
+ if (fileinfo.size() != size()) //if the size isn't the same...
+ return false;
+
+ return canonicalFilePath().compare(fileinfo.canonicalFilePath(), sensitive) == 0;
}
/*!
@@ -502,7 +562,7 @@ QString QFileInfo::absolutePath() const
if (d->isDefaultConstructed) {
return QLatin1String("");
- } else if (d->fileName.isEmpty()) {
+ } else if (d->fileEntry.isEmpty()) {
qWarning("QFileInfo::absolutePath: Constructed with empty filename");
return QLatin1String("");
}
@@ -539,7 +599,7 @@ QString QFileInfo::path() const
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
return QLatin1String("");
- return d->getFileName(QAbstractFileEngine::PathName);
+ return d->fileEntry.path();
}
/*!
@@ -563,6 +623,8 @@ bool QFileInfo::isRelative() const
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
return true;
+ if (d->fileEngine == 0)
+ return d->fileEntry.isRelative();
return d->fileEngine->isRelativePath();
}
@@ -576,12 +638,10 @@ bool QFileInfo::isRelative() const
bool QFileInfo::makeAbsolute()
{
if (d_ptr.constData()->isDefaultConstructed
- || !d_ptr.constData()->fileEngine->isRelativePath())
+ || !d_ptr.constData()->fileEntry.isRelative())
return false;
- QString absFileName = d_ptr.constData()->getFileName(QAbstractFileEngine::AbsoluteName);
- // QSharedDataPointer::operator->() will detach.
- setFile(absFileName);
+ setFile(absoluteFilePath());
return true;
}
@@ -596,6 +656,11 @@ bool QFileInfo::exists() const
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
return false;
+ if (d->fileEngine == 0) {
+ if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::ExistsAttribute))
+ QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::ExistsAttribute);
+ return d->metaData.exists();
+ }
return d->getFileFlags(QAbstractFileEngine::ExistsFlag);
}
@@ -623,7 +688,7 @@ QString QFileInfo::filePath() const
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
return QLatin1String("");
- return d->getFileName(QAbstractFileEngine::DefaultName);
+ return d->fileEntry.filePath();
}
/*!
@@ -642,7 +707,7 @@ QString QFileInfo::fileName() const
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
return QLatin1String("");
- return d->getFileName(QAbstractFileEngine::BaseName);
+ return d->fileEntry.fileName();
}
/*!
@@ -686,7 +751,7 @@ QString QFileInfo::baseName() const
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
return QLatin1String("");
- return d->getFileName(QAbstractFileEngine::BaseName).section(QLatin1Char('.'), 0, 0);
+ return d->fileEntry.baseName();
}
/*!
@@ -705,9 +770,7 @@ QString QFileInfo::completeBaseName() const
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
return QLatin1String("");
- QString name = d->getFileName(QAbstractFileEngine::BaseName);
- int index = name.lastIndexOf(QLatin1Char('.'));
- return (index == -1) ? name : name.left(index);
+ return d->fileEntry.completeBaseName();
}
/*!
@@ -726,11 +789,7 @@ QString QFileInfo::completeSuffix() const
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
return QLatin1String("");
- QString fileName = d->getFileName(QAbstractFileEngine::BaseName);
- int firstDot = fileName.indexOf(QLatin1Char('.'));
- if (firstDot == -1)
- return QLatin1String("");
- return fileName.mid(firstDot + 1);
+ return d->fileEntry.completeSuffix();
}
/*!
@@ -753,11 +812,7 @@ QString QFileInfo::suffix() const
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
return QLatin1String("");
- QString fileName = d->getFileName(QAbstractFileEngine::BaseName);
- int lastDot = fileName.lastIndexOf(QLatin1Char('.'));
- if (lastDot == -1)
- return QLatin1String("");
- return fileName.mid(lastDot + 1);
+ return d->fileEntry.suffix();
}
@@ -781,8 +836,9 @@ QString QFileInfo::suffix() const
*/
QDir QFileInfo::dir() const
{
+ Q_D(const QFileInfo);
// ### Qt5: Maybe rename this to parentDirectory(), considering what it actually do?
- return QDir(path());
+ return QDir(d->fileEntry.path());
}
/*!
@@ -818,6 +874,11 @@ bool QFileInfo::isReadable() const
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
return false;
+ if (d->fileEngine == 0) {
+ if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::UserReadPermission))
+ QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::UserReadPermission);
+ return (d->metaData.permissions() & QFile::ReadUser) != 0;
+ }
return d->getFileFlags(QAbstractFileEngine::ReadUserPerm);
}
@@ -831,6 +892,11 @@ bool QFileInfo::isWritable() const
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
return false;
+ if (d->fileEngine == 0) {
+ if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::UserWritePermission))
+ QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::UserWritePermission);
+ return (d->metaData.permissions() & QFile::WriteUser) != 0;
+ }
return d->getFileFlags(QAbstractFileEngine::WriteUserPerm);
}
@@ -844,6 +910,11 @@ bool QFileInfo::isExecutable() const
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
return false;
+ if (d->fileEngine == 0) {
+ if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::UserExecutePermission))
+ QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::UserExecutePermission);
+ return (d->metaData.permissions() & QFile::ExeUser) != 0;
+ }
return d->getFileFlags(QAbstractFileEngine::ExeUserPerm);
}
@@ -858,6 +929,11 @@ bool QFileInfo::isHidden() const
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
return false;
+ if (d->fileEngine == 0) {
+ if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::HiddenAttribute))
+ QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::HiddenAttribute);
+ return d->metaData.isHidden();
+ }
return d->getFileFlags(QAbstractFileEngine::HiddenFlag);
}
@@ -873,6 +949,11 @@ bool QFileInfo::isFile() const
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
return false;
+ if (d->fileEngine == 0) {
+ if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::FileType))
+ QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::FileType);
+ return d->metaData.isFile();
+ }
return d->getFileFlags(QAbstractFileEngine::FileType);
}
@@ -887,6 +968,11 @@ bool QFileInfo::isDir() const
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
return false;
+ if (d->fileEngine == 0) {
+ if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::DirectoryType))
+ QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::DirectoryType);
+ return d->metaData.isDirectory();
+ }
return d->getFileFlags(QAbstractFileEngine::DirectoryType);
}
@@ -903,6 +989,11 @@ bool QFileInfo::isBundle() const
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
return false;
+ if (d->fileEngine == 0) {
+ if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::BundleType))
+ QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::BundleType);
+ return d->metaData.isBundle();
+ }
return d->getFileFlags(QAbstractFileEngine::BundleType);
}
@@ -928,6 +1019,11 @@ bool QFileInfo::isSymLink() const
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
return false;
+ if (d->fileEngine == 0) {
+ if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::LegacyLinkType))
+ QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::LegacyLinkType);
+ return d->metaData.isLegacyLink();
+ }
return d->getFileFlags(QAbstractFileEngine::LinkType);
}
@@ -941,6 +1037,20 @@ bool QFileInfo::isRoot() const
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
return true;
+ if (d->fileEngine == 0) {
+ if (d->fileEntry.isRoot()) {
+#if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
+ //the path is a drive root, but the drive may not exist
+ //for backward compatibility, return true only if the drive exists
+ if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::ExistsAttribute))
+ QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::ExistsAttribute);
+ return d->metaData.exists();
+#else
+ return true;
+#endif
+ }
+ return false;
+ }
return d->getFileFlags(QAbstractFileEngine::RootFlag);
}
@@ -1003,6 +1113,11 @@ uint QFileInfo::ownerId() const
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
return 0;
+ if (d->fileEngine == 0) {
+ if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::UserId))
+ QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::UserId);
+ return d->metaData.userId();
+ }
return d->fileEngine->ownerId(QAbstractFileEngine::OwnerUser);
}
@@ -1037,6 +1152,11 @@ uint QFileInfo::groupId() const
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
return 0;
+ if (d->fileEngine == 0) {
+ if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::GroupId))
+ QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::GroupId);
+ return d->metaData.groupId();
+ }
return d->fileEngine->ownerId(QAbstractFileEngine::OwnerGroup);
}
@@ -1058,6 +1178,13 @@ bool QFileInfo::permission(QFile::Permissions permissions) const
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
return false;
+ if (d->fileEngine == 0) {
+ // the QFileSystemMetaData::MetaDataFlag and QFile::Permissions overlap, so just static cast.
+ QFileSystemMetaData::MetaDataFlag permissionFlags = static_cast<QFileSystemMetaData::MetaDataFlag>((int)permissions);
+ if (!d->cache_enabled || !d->metaData.hasFlags(permissionFlags))
+ QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, permissionFlags);
+ return (d->metaData.permissions() & permissions) == permissions;
+ }
return d->getFileFlags(QAbstractFileEngine::FileFlags((int)permissions)) == (uint)permissions;
}
@@ -1070,6 +1197,11 @@ QFile::Permissions QFileInfo::permissions() const
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
return 0;
+ if (d->fileEngine == 0) {
+ if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::Permissions))
+ QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::Permissions);
+ return d->metaData.permissions();
+ }
return QFile::Permissions(d->getFileFlags(QAbstractFileEngine::PermsMask) & QAbstractFileEngine::PermsMask);
}
@@ -1085,6 +1217,11 @@ qint64 QFileInfo::size() const
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
return 0;
+ if (d->fileEngine == 0) {
+ if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::SizeAttribute))
+ QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::SizeAttribute);
+ return d->metaData.size();
+ }
if (!d->getCachedFlag(QFileInfoPrivate::CachedSize)) {
d->setCachedFlag(QFileInfoPrivate::CachedSize);
d->fileSize = d->fileEngine->size();
@@ -1110,6 +1247,11 @@ QDateTime QFileInfo::created() const
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
return QDateTime();
+ if (d->fileEngine == 0) {
+ if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::CreationTime))
+ QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::CreationTime);
+ return d->metaData.creationTime();
+ }
return d->getFileTime(QAbstractFileEngine::CreationTime);
}
@@ -1123,6 +1265,11 @@ QDateTime QFileInfo::lastModified() const
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
return QDateTime();
+ if (d->fileEngine == 0) {
+ if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::ModificationTime))
+ QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::ModificationTime);
+ return d->metaData.modificationTime();
+ }
return d->getFileTime(QAbstractFileEngine::ModificationTime);
}
@@ -1139,6 +1286,11 @@ QDateTime QFileInfo::lastRead() const
Q_D(const QFileInfo);
if (d->isDefaultConstructed)
return QDateTime();
+ if (d->fileEngine == 0) {
+ if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::AccessTime))
+ QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::AccessTime);
+ return d->metaData.accessTime();
+ }
return d->getFileTime(QAbstractFileEngine::AccessTime);
}
diff --git a/src/corelib/io/qfileinfo.h b/src/corelib/io/qfileinfo.h
index aec7543..3eff208 100644
--- a/src/corelib/io/qfileinfo.h
+++ b/src/corelib/io/qfileinfo.h
@@ -53,12 +53,16 @@ QT_BEGIN_NAMESPACE
QT_MODULE(Core)
class QDir;
+class QDirIteratorPrivate;
class QDateTime;
class QFileInfoPrivate;
class Q_CORE_EXPORT QFileInfo
{
+ friend class QDirIteratorPrivate;
public:
+ explicit QFileInfo(QFileInfoPrivate *d);
+
QFileInfo();
QFileInfo(const QString &file);
QFileInfo(const QFile &file);
diff --git a/src/corelib/io/qfileinfo_p.h b/src/corelib/io/qfileinfo_p.h
index b9b1092..869a7a6 100644
--- a/src/corelib/io/qfileinfo_p.h
+++ b/src/corelib/io/qfileinfo_p.h
@@ -58,13 +58,16 @@
#include "qdatetime.h"
#include "qatomic.h"
#include "qshareddata.h"
+#include "qfilesystemengine_p.h"
+
+#include <QtCore/private/qfilesystementry_p.h>
+#include <QtCore/private/qfilesystemmetadata_p.h>
QT_BEGIN_NAMESPACE
class QFileInfoPrivate : public QSharedData
{
public:
-
enum { CachedFileFlags=0x01, CachedLinkTypeFlag=0x02, CachedBundleTypeFlag=0x04,
CachedMTime=0x10, CachedCTime=0x20, CachedATime=0x40,
CachedSize =0x08, CachedPerms=0x80 };
@@ -76,8 +79,10 @@ public:
cache_enabled(true), fileFlags(0), fileSize(0)
{}
inline QFileInfoPrivate(const QFileInfoPrivate &copy)
- : QSharedData(copy), fileEngine(QAbstractFileEngine::create(copy.fileName)),
- fileName(copy.fileName),
+ : QSharedData(copy),
+ fileEntry(copy.fileEntry),
+ metaData(copy.metaData),
+ fileEngine(QFileSystemEngine::resolveEntryAndCreateLegacyEngine(fileEntry, metaData)),
cachedFlags(0),
#ifndef QT_NO_FSFILEENGINE
isDefaultConstructed(false),
@@ -87,8 +92,8 @@ public:
cache_enabled(copy.cache_enabled), fileFlags(0), fileSize(0)
{}
inline QFileInfoPrivate(const QString &file)
- : QSharedData(), fileEngine(QAbstractFileEngine::create(file)),
- fileName(file),
+ : fileEntry(QDir::fromNativeSeparators(file)),
+ fileEngine(QFileSystemEngine::resolveEntryAndCreateLegacyEngine(fileEntry, metaData)),
cachedFlags(0),
#ifndef QT_NO_FSFILEENGINE
isDefaultConstructed(false),
@@ -99,6 +104,16 @@ public:
{
}
+ inline QFileInfoPrivate(const QFileSystemEntry &file, const QFileSystemMetaData &data)
+ : QSharedData(),
+ fileEntry(file),
+ metaData(data),
+ cachedFlags(0),
+ isDefaultConstructed(false),
+ cache_enabled(true), fileFlags(0), fileSize(0)
+ {
+ }
+
inline void clearFlags() const {
fileFlags = 0;
cachedFlags = 0;
@@ -106,6 +121,7 @@ public:
(void)fileEngine->fileFlags(QAbstractFileEngine::Refresh);
}
inline void clear() {
+ metaData.clear();
clearFlags();
for (int i = QAbstractFileEngine::NFileNames - 1 ; i >= 0 ; --i)
fileNames[i].clear();
@@ -118,9 +134,11 @@ public:
QString getFileName(QAbstractFileEngine::FileName) const;
QString getFileOwner(QAbstractFileEngine::FileOwner own) const;
+ QFileSystemEntry fileEntry;
+ mutable QFileSystemMetaData metaData;
+
QScopedPointer<QAbstractFileEngine> const fileEngine;
- mutable QString fileName;
mutable QString fileNames[QAbstractFileEngine::NFileNames];
mutable QString fileOwners[2];
@@ -134,6 +152,7 @@ public:
{ return cache_enabled ? (cachedFlags & c) : 0; }
inline void setCachedFlag(uint c) const
{ if (cache_enabled) cachedFlags |= c; }
+
};
QT_END_NAMESPACE
diff --git a/src/corelib/io/qfilesystemengine.cpp b/src/corelib/io/qfilesystemengine.cpp
new file mode 100644
index 0000000..d9d802e
--- /dev/null
+++ b/src/corelib/io/qfilesystemengine.cpp
@@ -0,0 +1,385 @@
+/****************************************************************************
+**
+** 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 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 "qfilesystemengine_p.h"
+#include <QtCore/qdir.h>
+#include <QtCore/qset.h>
+#include <QtCore/qstringbuilder.h>
+#include <QtCore/private/qabstractfileengine_p.h>
+#ifdef QT_BUILD_CORE_LIB
+#include <QtCore/private/qresource_p.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \internal
+
+ Returns the canonicalized form of \a path (i.e., with all symlinks
+ resolved, and all redundant path elements removed.
+*/
+QString QFileSystemEngine::slowCanonicalized(const QString &path)
+{
+ if (path.isEmpty())
+ return path;
+
+ QFileInfo fi;
+ const QChar slash(QLatin1Char('/'));
+ QString tmpPath = path;
+ int separatorPos = 0;
+ QSet<QString> nonSymlinks;
+ QSet<QString> known;
+
+ known.insert(path);
+ do {
+#ifdef Q_OS_WIN
+ if (separatorPos == 0) {
+ if (tmpPath.size() >= 2 && tmpPath.at(0) == slash && tmpPath.at(1) == slash) {
+ // UNC, skip past the first two elements
+ separatorPos = tmpPath.indexOf(slash, 2);
+ } else if (tmpPath.size() >= 3 && tmpPath.at(1) == QLatin1Char(':') && tmpPath.at(2) == slash) {
+ // volume root, skip since it can not be a symlink
+ separatorPos = 2;
+ }
+ }
+ if (separatorPos != -1)
+#endif
+ separatorPos = tmpPath.indexOf(slash, separatorPos + 1);
+ QString prefix = separatorPos == -1 ? tmpPath : tmpPath.left(separatorPos);
+ if (
+#ifdef Q_OS_SYMBIAN
+ // Symbian doesn't support directory symlinks, so do not check for link unless we
+ // are handling the last path element. This not only slightly improves performance,
+ // but also saves us from lot of unnecessary platform security check failures
+ // when dealing with files under *:/private directories.
+ separatorPos == -1 &&
+#endif
+ !nonSymlinks.contains(prefix)) {
+ fi.setFile(prefix);
+ if (fi.isSymLink()) {
+ QString target = fi.symLinkTarget();
+ if(QFileInfo(target).isRelative())
+ target = fi.absolutePath() + slash + target;
+ if (separatorPos != -1) {
+ if (fi.isDir() && !target.endsWith(slash))
+ target.append(slash);
+ target.append(tmpPath.mid(separatorPos));
+ }
+ tmpPath = QDir::cleanPath(target);
+ separatorPos = 0;
+
+ if (known.contains(tmpPath))
+ return QString();
+ known.insert(tmpPath);
+ } else {
+ nonSymlinks.insert(prefix);
+ }
+ }
+ } while (separatorPos != -1);
+
+ return QDir::cleanPath(tmpPath);
+}
+
+static inline bool _q_checkEntry(QFileSystemEntry &entry, QFileSystemMetaData &data, bool resolvingEntry)
+{
+ if (resolvingEntry) {
+ if (!QFileSystemEngine::fillMetaData(entry, data, QFileSystemMetaData::ExistsAttribute)
+ || !data.exists()) {
+ data.clear();
+ return false;
+ }
+ }
+
+ return true;
+}
+
+static inline bool _q_checkEntry(QAbstractFileEngine *&engine, bool resolvingEntry)
+{
+ if (resolvingEntry) {
+ if (!(engine->fileFlags(QAbstractFileEngine::FlagsMask) & QAbstractFileEngine::ExistsFlag)) {
+ delete engine;
+ engine = 0;
+ return false;
+ }
+ }
+
+ return true;
+}
+
+static bool _q_resolveEntryAndCreateLegacyEngine_recursive(QFileSystemEntry &entry, QFileSystemMetaData &data,
+ QAbstractFileEngine *&engine, bool resolvingEntry = false)
+{
+ QString const &filePath = entry.filePath();
+ if ((engine = qt_custom_file_engine_handler_create(filePath)))
+ return _q_checkEntry(engine, resolvingEntry);
+
+#if defined(QT_BUILD_CORE_LIB)
+ for (int prefixSeparator = 0; prefixSeparator < filePath.size(); ++prefixSeparator) {
+ QChar const ch = filePath[prefixSeparator];
+ if (ch == QLatin1Char('/'))
+ break;
+
+ if (ch == QLatin1Char(':')) {
+ if (prefixSeparator == 0) {
+ engine = new QResourceFileEngine(filePath);
+ return _q_checkEntry(engine, resolvingEntry);
+ }
+
+ if (prefixSeparator == 1)
+ break;
+
+ 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));
+ // Recurse!
+ if (_q_resolveEntryAndCreateLegacyEngine_recursive(entry, data, engine, true))
+ return true;
+ }
+
+ // entry may have been clobbered at this point.
+ return false;
+ }
+
+ // There's no need to fully validate the prefix here. Consulting the
+ // unicode tables could be expensive and validation is already
+ // performed in QDir::setSearchPaths.
+ //
+ // if (!ch.isLetterOrNumber())
+ // break;
+ }
+#endif // defined(QT_BUILD_CORE_LIB)
+
+ return _q_checkEntry(entry, data, resolvingEntry);
+}
+
+/*!
+ \internal
+
+ Resolves the \a entry (see QDir::searchPaths) and returns an engine for
+ it, but never a QFSFileEngine.
+
+ \returns a file engine that can be used to access the entry. Returns 0 if
+ QFileSystemEngine API should be used to query and interact with the file
+ system object.
+*/
+QAbstractFileEngine *QFileSystemEngine::resolveEntryAndCreateLegacyEngine(
+ QFileSystemEntry &entry, QFileSystemMetaData &data) {
+ QFileSystemEntry copy = entry;
+ QAbstractFileEngine *engine = 0;
+
+ if (_q_resolveEntryAndCreateLegacyEngine_recursive(copy, data, engine))
+ // Reset entry to resolved copy.
+ entry = copy;
+ else
+ data.clear();
+
+ return engine;
+}
+
+//these unix functions are in this file, because they are shared by symbian port
+//for open C file handles.
+#ifdef Q_OS_UNIX
+//static
+bool QFileSystemEngine::fillMetaData(int fd, QFileSystemMetaData &data)
+{
+ data.entryFlags &= ~QFileSystemMetaData::PosixStatFlags;
+ data.knownFlagsMask |= QFileSystemMetaData::PosixStatFlags;
+
+ QT_STATBUF statBuffer;
+ if (QT_FSTAT(fd, &statBuffer) == 0) {
+ data.fillFromStatBuf(statBuffer);
+ return true;
+ }
+
+ return false;
+}
+
+void QFileSystemMetaData::fillFromStatBuf(const QT_STATBUF &statBuffer)
+{
+ // Permissions
+ if (statBuffer.st_mode & S_IRUSR)
+ entryFlags |= QFileSystemMetaData::OwnerReadPermission;
+ if (statBuffer.st_mode & S_IWUSR)
+ entryFlags |= QFileSystemMetaData::OwnerWritePermission;
+ if (statBuffer.st_mode & S_IXUSR)
+ entryFlags |= QFileSystemMetaData::OwnerExecutePermission;
+
+ if (statBuffer.st_mode & S_IRGRP)
+ entryFlags |= QFileSystemMetaData::GroupReadPermission;
+ if (statBuffer.st_mode & S_IWGRP)
+ entryFlags |= QFileSystemMetaData::GroupWritePermission;
+ if (statBuffer.st_mode & S_IXGRP)
+ entryFlags |= QFileSystemMetaData::GroupExecutePermission;
+
+ if (statBuffer.st_mode & S_IROTH)
+ entryFlags |= QFileSystemMetaData::OtherReadPermission;
+ if (statBuffer.st_mode & S_IWOTH)
+ entryFlags |= QFileSystemMetaData::OtherWritePermission;
+ if (statBuffer.st_mode & S_IXOTH)
+ entryFlags |= QFileSystemMetaData::OtherExecutePermission;
+
+ // Type
+ if ((statBuffer.st_mode & S_IFMT) == S_IFREG)
+ entryFlags |= QFileSystemMetaData::FileType;
+ else if ((statBuffer.st_mode & S_IFMT) == S_IFDIR)
+ entryFlags |= QFileSystemMetaData::DirectoryType;
+ else
+ entryFlags |= QFileSystemMetaData::SequentialType;
+
+ // Attributes
+ entryFlags |= QFileSystemMetaData::ExistsAttribute;
+ size_ = statBuffer.st_size;
+#if !defined(QWS) && !defined(Q_WS_QPA) && defined(Q_OS_MAC) \
+ && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+ if (statBuffer.st_flags & UF_HIDDEN) {
+ entryFlags |= QFileSystemMetaData::HiddenAttribute;
+ knownFlagsMask |= QFileSystemMetaData::HiddenAttribute;
+ }
+#endif
+
+ // Times
+#ifdef Q_OS_SYMBIAN
+ modificationTime_ = qt_symbian_time_t_To_TTime(statBuffer.st_mtime);
+#else
+ creationTime_ = statBuffer.st_ctime ? statBuffer.st_ctime : statBuffer.st_mtime;
+ modificationTime_ = statBuffer.st_mtime;
+ accessTime_ = statBuffer.st_atime;
+ userId_ = statBuffer.st_uid;
+ groupId_ = statBuffer.st_gid;
+#endif
+}
+
+void QFileSystemMetaData::fillFromDirEnt(const QT_DIRENT &entry)
+{
+ // ### This will clear all entry flags and knownFlagsMask
+ switch (entry.d_type)
+ {
+ case DT_DIR:
+ knownFlagsMask = QFileSystemMetaData::LinkType
+ | QFileSystemMetaData::FileType
+ | QFileSystemMetaData::DirectoryType
+ | QFileSystemMetaData::SequentialType
+ | QFileSystemMetaData::ExistsAttribute;
+
+ entryFlags = QFileSystemMetaData::DirectoryType
+ | QFileSystemMetaData::ExistsAttribute;
+
+ break;
+
+ case DT_BLK:
+ case DT_CHR:
+ case DT_FIFO:
+ case DT_SOCK:
+ // ### System attribute
+ knownFlagsMask = QFileSystemMetaData::LinkType
+ | QFileSystemMetaData::FileType
+ | QFileSystemMetaData::DirectoryType
+ | QFileSystemMetaData::BundleType
+ | QFileSystemMetaData::AliasType
+ | QFileSystemMetaData::SequentialType
+ | QFileSystemMetaData::ExistsAttribute;
+
+ entryFlags = QFileSystemMetaData::SequentialType
+ | QFileSystemMetaData::ExistsAttribute;
+
+ break;
+
+ case DT_LNK:
+ knownFlagsMask = QFileSystemMetaData::LinkType;
+ entryFlags = QFileSystemMetaData::LinkType;
+ break;
+
+ case DT_REG:
+ knownFlagsMask = QFileSystemMetaData::LinkType
+ | QFileSystemMetaData::FileType
+ | QFileSystemMetaData::DirectoryType
+ | QFileSystemMetaData::BundleType
+ | QFileSystemMetaData::SequentialType
+ | QFileSystemMetaData::ExistsAttribute;
+
+ entryFlags = QFileSystemMetaData::FileType
+ | QFileSystemMetaData::ExistsAttribute;
+
+ break;
+
+ case DT_UNKNOWN:
+ default:
+ clear();
+ }
+}
+
+#endif
+
+//static
+QString QFileSystemEngine::resolveUserName(const QFileSystemEntry &entry, QFileSystemMetaData &metaData)
+{
+#if defined (Q_OS_SYMBIAN)
+ Q_UNUSED(entry);
+ Q_UNUSED(metaData);
+ return QString();
+#elif defined(Q_OS_WIN)
+ Q_UNUSED(metaData);
+ return QFileSystemEngine::owner(entry, QAbstractFileEngine::OwnerUser);
+#else //(Q_OS_UNIX)
+ if (!metaData.hasFlags(QFileSystemMetaData::UserId))
+ QFileSystemEngine::fillMetaData(entry, metaData, QFileSystemMetaData::UserId);
+ return resolveUserName(metaData.userId());
+#endif
+}
+
+//static
+QString QFileSystemEngine::resolveGroupName(const QFileSystemEntry &entry, QFileSystemMetaData &metaData)
+{
+#if defined (Q_OS_SYMBIAN)
+ Q_UNUSED(entry);
+ Q_UNUSED(metaData);
+ return QString();
+#elif defined(Q_OS_WIN)
+ Q_UNUSED(metaData);
+ return QFileSystemEngine::owner(entry, QAbstractFileEngine::OwnerGroup);
+#else //(Q_OS_UNIX)
+ if (!metaData.hasFlags(QFileSystemMetaData::GroupId))
+ QFileSystemEngine::fillMetaData(entry, metaData, QFileSystemMetaData::GroupId);
+ return resolveGroupName(metaData.groupId());
+#endif
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/io/qfilesystemengine_mac.cpp b/src/corelib/io/qfilesystemengine_mac.cpp
new file mode 100644
index 0000000..30d7fa5
--- /dev/null
+++ b/src/corelib/io/qfilesystemengine_mac.cpp
@@ -0,0 +1,48 @@
+/****************************************************************************
+**
+** 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 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 "qfilesystemengine_p.h"
+
+QT_BEGIN_NAMESPACE
+
+// Mac-specific implementations only!
+
+QT_END_NAMESPACE
diff --git a/src/corelib/io/qfilesystemengine_p.h b/src/corelib/io/qfilesystemengine_p.h
new file mode 100644
index 0000000..a3ec0ab
--- /dev/null
+++ b/src/corelib/io/qfilesystemengine_p.h
@@ -0,0 +1,133 @@
+/****************************************************************************
+**
+** 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 QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QFILESYSTEMENGINE_P_H_INCLUDED
+#define QFILESYSTEMENGINE_P_H_INCLUDED
+
+//
+// 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 "qfile.h"
+#include "qfilesystementry_p.h"
+#include "qfilesystemmetadata_p.h"
+#include <QtCore/private/qsystemerror_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QFileSystemEngine
+{
+public:
+ static bool isCaseSensitive();
+
+ static QFileSystemEntry getLinkTarget(const QFileSystemEntry &link, QFileSystemMetaData &data);
+ static QFileSystemEntry canonicalName(const QFileSystemEntry &entry, QFileSystemMetaData &data);
+ static QFileSystemEntry absoluteName(const QFileSystemEntry &entry);
+ static QString resolveUserName(const QFileSystemEntry &entry, QFileSystemMetaData &data);
+ static QString resolveGroupName(const QFileSystemEntry &entry, QFileSystemMetaData &data);
+
+#if defined(Q_OS_UNIX) && !defined(Q_OS_SYMBIAN)
+ static QString resolveUserName(uint userId);
+ static QString resolveGroupName(uint groupId);
+#endif
+
+#if !defined(QWS) && !defined(Q_WS_QPA) && defined(Q_OS_MAC)
+ static QString bundleName(const QFileSystemEntry &entry);
+#else
+ static QString bundleName(const QFileSystemEntry &entry) { Q_UNUSED(entry) return QString(); }
+#endif
+
+ static bool fillMetaData(const QFileSystemEntry &entry, QFileSystemMetaData &data,
+ QFileSystemMetaData::MetaDataFlags what);
+#if defined(Q_OS_UNIX)
+ static bool fillMetaData(int fd, QFileSystemMetaData &data); // what = PosixStatFlags
+#endif
+#if defined(Q_OS_WIN)
+
+ static bool uncListSharesOnServer(const QString &server, QStringList *list); //Used also by QFSFileEngineIterator::hasNext()
+ static bool fillMetaData(int fd, QFileSystemMetaData &data,
+ QFileSystemMetaData::MetaDataFlags what);
+ static bool fillMetaData(HANDLE fHandle, QFileSystemMetaData &data,
+ QFileSystemMetaData::MetaDataFlags what);
+ static bool fillPermissions(const QFileSystemEntry &entry, QFileSystemMetaData &data,
+ QFileSystemMetaData::MetaDataFlags what);
+ static QString owner(const QFileSystemEntry &entry, QAbstractFileEngine::FileOwner own);
+ static QString nativeAbsoluteFilePath(const QString &path);
+#endif
+ //homePath, rootPath and tempPath shall return clean paths
+ static QString homePath();
+ static QString rootPath();
+ static QString tempPath();
+
+ static bool createDirectory(const QFileSystemEntry &entry, bool createParents);
+ static bool removeDirectory(const QFileSystemEntry &entry, bool removeEmptyParents);
+
+ static bool createLink(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error);
+
+ static bool copyFile(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error);
+ static bool renameFile(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error);
+ static bool removeFile(const QFileSystemEntry &entry, QSystemError &error);
+
+ static bool setPermissions(const QFileSystemEntry &entry, QFile::Permissions permissions, QSystemError &error,
+ QFileSystemMetaData *data = 0);
+
+ static bool setCurrentPath(const QFileSystemEntry &entry);
+ static QFileSystemEntry currentPath();
+
+ static QAbstractFileEngine *resolveEntryAndCreateLegacyEngine(QFileSystemEntry &entry,
+ QFileSystemMetaData &data);
+private:
+ static QString slowCanonicalized(const QString &path);
+#if defined(Q_OS_WIN)
+ static void clearWinStatData(QFileSystemMetaData &data);
+#endif
+};
+
+QT_END_NAMESPACE
+
+#endif // include guard
diff --git a/src/corelib/io/qfilesystemengine_symbian.cpp b/src/corelib/io/qfilesystemengine_symbian.cpp
new file mode 100644
index 0000000..84c3aa1
--- /dev/null
+++ b/src/corelib/io/qfilesystemengine_symbian.cpp
@@ -0,0 +1,408 @@
+/****************************************************************************
+**
+** 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 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 "qfilesystemengine_p.h"
+#include "qfsfileengine.h"
+#include <QtCore/private/qcore_symbian_p.h>
+#include <QtCore/qcoreapplication.h>
+
+#include <f32file.h>
+#include <pathinfo.h>
+#include <wchar.h>
+
+QT_BEGIN_NAMESPACE
+
+bool QFileSystemEngine::isCaseSensitive()
+{
+ return false;
+}
+
+//TODO: resolve this with QDir::cleanPath, without breaking the behaviour of that
+//function which is documented only by autotest
+//input: a dirty absolute path, e.g. c:/../../foo/./
+//output: a clean absolute path, e.g. c:/foo/
+static QString symbianCleanAbsolutePath(const QString& path)
+{
+ bool isDir = path.endsWith(QLatin1Char('/'));
+ //using SkipEmptyParts flag to eliminate duplicated slashes
+ QStringList components = path.split(QLatin1Char('/'), QString::SkipEmptyParts);
+ int cdups = 0;
+ for(int i=components.count() - 1; i>=0; --i) {
+ if(components.at(i) == QLatin1String("..")) {
+ components.removeAt(i);
+ cdups++;
+ }
+ else if(components.at(i) == QLatin1String(".")) {
+ components.removeAt(i);
+ }
+ else if(cdups && i > 0) {
+ --cdups;
+ components.removeAt(i);
+ }
+ }
+ QString result = components.join(QLatin1String("/"));
+ if ((isDir&& !result.endsWith(QLatin1Char('/')))
+ || (result.length() == 2 && result.at(1).unicode() == ':'))
+ result.append(QLatin1Char('/'));
+ return result;
+}
+
+//static
+QFileSystemEntry QFileSystemEngine::getLinkTarget(const QFileSystemEntry &link, QFileSystemMetaData &data)
+{
+ Q_UNUSED(data);
+ return link;
+}
+
+//static
+QFileSystemEntry QFileSystemEngine::canonicalName(const QFileSystemEntry &entry, QFileSystemMetaData &data)
+{
+ if (entry.isEmpty() || entry.isRoot())
+ return entry;
+
+ QFileSystemEntry result = absoluteName(entry);
+ if (!data.hasFlags(QFileSystemMetaData::ExistsAttribute))
+ fillMetaData(result, data, QFileSystemMetaData::ExistsAttribute);
+ if (!data.exists()) {
+ // file doesn't exist
+ return QFileSystemEntry();
+ } else {
+ return result;
+ }
+}
+
+//static
+QFileSystemEntry QFileSystemEngine::absoluteName(const QFileSystemEntry &entry)
+{
+ QString orig = entry.filePath();
+ const bool isAbsolute = entry.isAbsolute();
+ const bool isDirty = (orig.contains(QLatin1String("/../")) || orig.contains(QLatin1String("/./")) ||
+ orig.contains(QLatin1String("//")) ||
+ orig.endsWith(QLatin1String("/..")) || orig.endsWith(QLatin1String("/.")));
+ if (isAbsolute && !isDirty)
+ return entry;
+
+ const bool isRelative = entry.isRelative();
+ const bool needsDrive = (!orig.isEmpty() && orig.at(0).unicode() == '/');
+ const bool isDriveLetter = !needsDrive && !isAbsolute && !isRelative && orig.length() == 2;
+ const bool isDriveRelative = !needsDrive && !isAbsolute && !isRelative && orig.length() > 2;
+
+ QString result;
+ if (needsDrive || isDriveLetter || isDriveRelative || !isAbsolute || orig.isEmpty()) {
+ QFileSystemEntry cur(currentPath());
+ if(needsDrive)
+ result = cur.filePath().left(2);
+ else if(isDriveRelative && cur.filePath().at(0) != orig.at(0))
+ result = orig.left(2); // for BC, see tst_QFileInfo::absolutePath(<not current drive>:my.dll)
+ else
+ result = cur.filePath();
+ if(isDriveLetter) {
+ result[0] = orig.at(0); //copy drive letter
+ orig.clear();
+ }
+ if(isDriveRelative) {
+ orig = orig.mid(2); //discard the drive specifier from orig
+ }
+ }
+ if (!orig.isEmpty() && !(orig.length() == 1 && orig.at(0).unicode() == '.')) {
+ if (!result.isEmpty() && !result.endsWith(QLatin1Char('/')))
+ result.append(QLatin1Char('/'));
+ result.append(orig);
+ }
+
+ return QFileSystemEntry(symbianCleanAbsolutePath(result), QFileSystemEntry::FromInternalPath());
+}
+
+void QFileSystemMetaData::fillFromTEntry(const TEntry& entry)
+{
+ entryFlags &= ~(QFileSystemMetaData::SymbianTEntryFlags);
+ knownFlagsMask |= QFileSystemMetaData::SymbianTEntryFlags;
+ //Symbian doesn't have unix type file permissions
+ entryFlags |= QFileSystemMetaData::ReadPermissions;
+ if(!entry.IsReadOnly()) {
+ entryFlags |= QFileSystemMetaData::WritePermissions;
+ }
+ //set the type
+ if(entry.IsDir())
+ entryFlags |= (QFileSystemMetaData::DirectoryType | QFileSystemMetaData::ExecutePermissions);
+ else
+ entryFlags |= QFileSystemMetaData::FileType;
+
+ //set the attributes
+ entryFlags |= QFileSystemMetaData::ExistsAttribute;
+ if(entry.IsHidden())
+ entryFlags |= QFileSystemMetaData::HiddenAttribute;
+
+#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
+ size_ = entry.FileSize();
+#else
+ size_ = (TUint)(entry.iSize);
+#endif
+
+ modificationTime_ = entry.iModified;
+}
+
+void QFileSystemMetaData::fillFromVolumeInfo(const TVolumeInfo& info)
+{
+ entryFlags &= ~(QFileSystemMetaData::SymbianTEntryFlags);
+ knownFlagsMask |= QFileSystemMetaData::SymbianTEntryFlags;
+ entryFlags |= QFileSystemMetaData::ExistsAttribute;
+ entryFlags |= QFileSystemMetaData::Permissions;
+ if(info.iDrive.iDriveAtt & KDriveAttRom) {
+ entryFlags &= ~(QFileSystemMetaData::WritePermissions);
+ }
+ entryFlags |= QFileSystemMetaData::DirectoryType;
+ size_ = info.iSize;
+ modificationTime_ = qt_symbian_time_t_To_TTime(0);
+}
+
+//static
+bool QFileSystemEngine::fillMetaData(const QFileSystemEntry &entry, QFileSystemMetaData &data, QFileSystemMetaData::MetaDataFlags what)
+{
+ if (what & QFileSystemMetaData::SymbianTEntryFlags) {
+ RFs& fs(qt_s60GetRFs());
+ TInt err;
+ QFileSystemEntry absentry(absoluteName(entry));
+ if (entry.isEmpty()) {
+ err = KErrNotFound;
+ } else if (absentry.isRoot()) {
+ //Root directories don't have an entry, and Entry() returns KErrBadName.
+ //Therefore get information about the volume instead.
+ TInt drive;
+ err = RFs::CharToDrive(TChar(absentry.nativeFilePath().at(0).unicode()), drive);
+ if (!err) {
+ TVolumeInfo info;
+ err = fs.Volume(info, drive);
+ if (!err)
+ data.fillFromVolumeInfo(info);
+ }
+ } else {
+ TEntry ent;
+ err = fs.Entry(qt_QString2TPtrC(absentry.nativeFilePath()), ent);
+ if (!err)
+ data.fillFromTEntry(ent);
+ }
+ if (err) {
+ data.size_ = 0;
+ data.modificationTime_ = TTime(0);
+ data.entryFlags &= ~(QFileSystemMetaData::SymbianTEntryFlags);
+ }
+ //files in /sys/bin on any drive are executable, even though we don't normally have permission to check whether they exist or not
+ if(absentry.filePath().midRef(1,10).compare(QLatin1String(":/sys/bin/"), Qt::CaseInsensitive) == 0)
+ data.entryFlags |= QFileSystemMetaData::ExecutePermissions;
+ }
+ return data.hasFlags(what);
+}
+
+//static
+bool QFileSystemEngine::createDirectory(const QFileSystemEntry &entry, bool createParents)
+{
+ QString abspath = absoluteName(entry).nativeFilePath();
+ if (!abspath.endsWith(QLatin1Char('\\')))
+ abspath.append(QLatin1Char('\\'));
+ TInt r;
+ if (createParents)
+ r = qt_s60GetRFs().MkDirAll(qt_QString2TPtrC(abspath));
+ else
+ r = qt_s60GetRFs().MkDir(qt_QString2TPtrC(abspath));
+ if (createParents && r == KErrAlreadyExists)
+ return true; //# Qt5 - QDir::mkdir returns false for existing dir, QDir::mkpath returns true (should be made consistent in Qt 5)
+ return (r == KErrNone);
+}
+
+//static
+bool QFileSystemEngine::removeDirectory(const QFileSystemEntry &entry, bool removeEmptyParents)
+{
+ QString abspath = absoluteName(entry).nativeFilePath();
+ if (!abspath.endsWith(QLatin1Char('\\')))
+ abspath.append(QLatin1Char('\\'));
+ TPtrC dir(qt_QString2TPtrC(abspath));
+ RFs& fs = qt_s60GetRFs();
+ bool ok = false;
+ //behaviour of FS file engine:
+ //returns true if the directory could be removed
+ //success/failure of removing parent directories does not matter
+ while (KErrNone == fs.RmDir(dir)) {
+ ok = true;
+ if (!removeEmptyParents)
+ break;
+ //RFs::RmDir treats "c:\foo\bar" and "c:\foo\" the same, so it is sufficient to remove the last \ to the end
+ dir.Set(dir.Left(dir.LocateReverse(TChar('\\'))));
+ }
+ return ok;
+}
+
+//static
+bool QFileSystemEngine::createLink(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error)
+{
+ Q_UNUSED(source)
+ Q_UNUSED(target)
+ error = QSystemError(KErrNotSupported, QSystemError::NativeError);
+ return false;
+}
+
+//static
+bool QFileSystemEngine::copyFile(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error)
+{
+ //CFileMan is allocated each time because it is not thread-safe
+ CFileMan *fm = 0;
+ TRAPD(err, fm = CFileMan::NewL(qt_s60GetRFs()));
+ if (err == KErrNone) {
+ err = fm->Copy(qt_QString2TPtrC(absoluteName(source).nativeFilePath()), qt_QString2TPtrC(absoluteName(target).nativeFilePath()), 0);
+ delete fm;
+ }
+ if (err == KErrNone)
+ return true;
+ error = QSystemError(err, QSystemError::NativeError);
+ return false;
+}
+
+//static
+bool QFileSystemEngine::renameFile(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error)
+{
+ QString sourcepath = absoluteName(source).nativeFilePath();
+ QString targetpath = absoluteName(target).nativeFilePath();
+ RFs& fs(qt_s60GetRFs());
+ TInt err = fs.Rename(qt_QString2TPtrC(sourcepath), qt_QString2TPtrC(targetpath));
+ if (err == KErrNone)
+ return true;
+ error = QSystemError(err, QSystemError::NativeError);
+ return false;
+}
+
+//static
+bool QFileSystemEngine::removeFile(const QFileSystemEntry &entry, QSystemError &error)
+{
+ QString targetpath = absoluteName(entry).nativeFilePath();
+ RFs& fs(qt_s60GetRFs());
+ TInt err = fs.Delete(qt_QString2TPtrC(targetpath));
+ if (err == KErrNone)
+ return true;
+ error = QSystemError(err, QSystemError::NativeError);
+ return false;
+}
+
+//static
+bool QFileSystemEngine::setPermissions(const QFileSystemEntry &entry, QFile::Permissions permissions, QSystemError &error, QFileSystemMetaData *data)
+{
+ QString targetpath = absoluteName(entry).nativeFilePath();
+ TUint setmask = 0;
+ TUint clearmask = 0;
+ RFs& fs(qt_s60GetRFs());
+ if (permissions & (QFile::WriteOwner | QFile::WriteUser | QFile::WriteGroup | QFile::WriteOther))
+ clearmask = KEntryAttReadOnly; //if anyone can write, it's not read-only
+ else
+ setmask = KEntryAttReadOnly;
+ TInt err = fs.SetAtt(qt_QString2TPtrC(targetpath), setmask, clearmask);
+ if (data && !err) {
+ data->entryFlags &= ~QFileSystemMetaData::Permissions;
+ data->entryFlags |= QFileSystemMetaData::MetaDataFlag(uint(permissions));
+ data->knownFlagsMask |= QFileSystemMetaData::Permissions;
+ }
+ if (err == KErrNone)
+ return true;
+ error = QSystemError(err, QSystemError::NativeError);
+ return false;
+}
+
+QString QFileSystemEngine::homePath()
+{
+ QString home = QDir::fromNativeSeparators(qt_TDesC2QString(PathInfo::PhoneMemoryRootPath()));
+ if(home.endsWith(QLatin1Char('/')))
+ home.chop(1);
+ return home;
+}
+
+QString QFileSystemEngine::rootPath()
+{
+ TChar drive;
+ TInt err = RFs::DriveToChar(RFs::GetSystemDrive(), drive); //RFs::GetSystemDriveChar not supported on S60 3.1
+ Q_ASSERT(err == KErrNone); //RFs::GetSystemDrive() shall always return a convertible drive number on a valid OS configuration
+ return QString(QChar(drive)).append(QLatin1String(":/"));
+}
+
+QString QFileSystemEngine::tempPath()
+{
+ return rootPath().append(QLatin1String("system/temp"));
+}
+
+//static
+bool QFileSystemEngine::setCurrentPath(const QFileSystemEntry &entry)
+{
+ QFileSystemMetaData meta;
+ QFileSystemEntry absname = absoluteName(entry);
+ fillMetaData(absname, meta, QFileSystemMetaData::ExistsAttribute | QFileSystemMetaData::DirectoryType);
+ if(!(meta.exists() && meta.isDirectory()))
+ return false;
+
+ RFs& fs = qt_s60GetRFs();
+ QString abspath = absname.nativeFilePath();
+ if(!abspath.endsWith(QLatin1Char('\\')))
+ abspath.append(QLatin1Char('\\'));
+ TInt r = fs.SetSessionPath(qt_QString2TPtrC(abspath));
+ //SetSessionPath succeeds for non existent directory, which is why it's checked above
+ if (r == KErrNone) {
+ __ASSERT_COMPILE(sizeof(wchar_t) == sizeof(unsigned short));
+ //attempt to set open C to the same path
+ r = ::wchdir(reinterpret_cast<const wchar_t *>(absname.filePath().utf16()));
+ if (r < 0)
+ qWarning("failed to sync path to open C");
+ return true;
+ }
+ return false;
+}
+
+//static
+QFileSystemEntry QFileSystemEngine::currentPath()
+{
+ TFileName fn;
+ QFileSystemEntry ret;
+ TInt r = qt_s60GetRFs().SessionPath(fn);
+ if(r == KErrNone) {
+ //remove terminating slash from non root paths (session path is clean, absolute and always ends in a \)
+ if(fn.Length() > 3 && fn[fn.Length() - 1] == '\\')
+ fn.SetLength(fn.Length() - 1);
+ ret = QFileSystemEntry(qt_TDesC2QString(fn), QFileSystemEntry::FromNativePath());
+ }
+ return ret;
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/io/qfilesystemengine_unix.cpp b/src/corelib/io/qfilesystemengine_unix.cpp
new file mode 100644
index 0000000..40fb0c0
--- /dev/null
+++ b/src/corelib/io/qfilesystemengine_unix.cpp
@@ -0,0 +1,655 @@
+/****************************************************************************
+**
+** 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 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 "qplatformdefs.h"
+#include "qfilesystemengine_p.h"
+#include "qplatformdefs.h"
+#include "qfsfileengine.h"
+#include "qfile.h"
+
+#include <QtCore/qvarlengtharray.h>
+
+#include <stdlib.h> // for realpath()
+#include <unistd.h>
+#include <stdio.h>
+#include <errno.h>
+
+
+#if defined(Q_OS_MAC)
+# include <QtCore/private/qcore_mac_p.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+#if !defined(QWS) && !defined(Q_WS_QPA) && defined(Q_OS_MAC)
+static inline bool _q_isMacHidden(const char *nativePath)
+{
+ OSErr err;
+
+ FSRef fsRef;
+ err = FSPathMakeRefWithOptions(reinterpret_cast<const UInt8 *>(nativePath),
+ kFSPathMakeRefDoNotFollowLeafSymlink, &fsRef, 0);
+ if (err != noErr)
+ return false;
+
+ FSCatalogInfo catInfo;
+ err = FSGetCatalogInfo(&fsRef, kFSCatInfoFinderInfo, &catInfo, NULL, NULL, NULL);
+ if (err != noErr)
+ return false;
+
+ FileInfo * const fileInfo = reinterpret_cast<FileInfo*>(&catInfo.finderInfo);
+ return (fileInfo->finderFlags & kIsInvisible);
+}
+#else
+static inline bool _q_isMacHidden(const char *nativePath)
+{
+ Q_UNUSED(nativePath);
+ // no-op
+ return false;
+}
+#endif
+
+bool QFileSystemEngine::isCaseSensitive()
+{
+ return true;
+}
+
+//static
+QFileSystemEntry QFileSystemEngine::getLinkTarget(const QFileSystemEntry &link, QFileSystemMetaData &data)
+{
+#if defined(__GLIBC__) && !defined(PATH_MAX)
+#define PATH_CHUNK_SIZE 256
+ char *s = 0;
+ int len = -1;
+ int size = PATH_CHUNK_SIZE;
+
+ while (1) {
+ s = (char *) ::realloc(s, size);
+ Q_CHECK_PTR(s);
+ len = ::readlink(link.nativeFilePath().constData(), s, size);
+ if (len < 0) {
+ ::free(s);
+ break;
+ }
+ if (len < size) {
+ break;
+ }
+ size *= 2;
+ }
+#else
+ char s[PATH_MAX+1];
+ int len = readlink(link.nativeFilePath().constData(), s, PATH_MAX);
+#endif
+ if (len > 0) {
+ QString ret;
+ if (!data.hasFlags(QFileSystemMetaData::DirectoryType))
+ fillMetaData(link, data, QFileSystemMetaData::DirectoryType);
+ if (data.isDirectory() && s[0] != '/') {
+ QDir parent(link.filePath());
+ parent.cdUp();
+ ret = parent.path();
+ if (!ret.isEmpty() && !ret.endsWith(QLatin1Char('/')))
+ ret += QLatin1Char('/');
+ }
+ s[len] = '\0';
+ ret += QFile::decodeName(QByteArray(s));
+#if defined(__GLIBC__) && !defined(PATH_MAX)
+ ::free(s);
+#endif
+
+ if (!ret.startsWith(QLatin1Char('/'))) {
+ if (link.filePath().startsWith(QLatin1Char('/'))) {
+ ret.prepend(link.filePath().left(link.filePath().lastIndexOf(QLatin1Char('/')))
+ + QLatin1Char('/'));
+ } else {
+ ret.prepend(QDir::currentPath() + QLatin1Char('/'));
+ }
+ }
+ ret = QDir::cleanPath(ret);
+ if (ret.size() > 1 && ret.endsWith(QLatin1Char('/')))
+ ret.chop(1);
+ return QFileSystemEntry(ret);
+ }
+#if !defined(QWS) && !defined(Q_WS_QPA) && defined(Q_OS_MAC)
+ {
+ FSRef fref;
+ if (FSPathMakeRef((const UInt8 *)QFile::encodeName(QDir::cleanPath(link.filePath())).data(), &fref, 0) == noErr) {
+ // TODO get the meta data info from the QFileSystemMetaData object
+ Boolean isAlias, isFolder;
+ if (FSResolveAliasFile(&fref, true, &isFolder, &isAlias) == noErr && isAlias) {
+ AliasHandle alias;
+ if (FSNewAlias(0, &fref, &alias) == noErr && alias) {
+ QCFString cfstr;
+ if (FSCopyAliasInfo(alias, 0, 0, &cfstr, 0, 0) == noErr)
+ return QFileSystemEntry(QCFString::toQString(cfstr));
+ }
+ }
+ }
+ }
+#endif
+ return QFileSystemEntry();
+}
+
+//static
+QFileSystemEntry QFileSystemEngine::canonicalName(const QFileSystemEntry &entry, QFileSystemMetaData &data)
+{
+ if (entry.isEmpty() || entry.isRoot())
+ return entry;
+
+#ifdef __UCLIBC__
+ return QFileSystemEntry::slowCanonicalName(entry);
+#else
+ char *ret = 0;
+# if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
+ // Mac OS X 10.5.x doesn't support the realpath(X,0) extension we use here.
+ if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_6) {
+ ret = realpath(entry.nativeFilePath().constData(), (char*)0);
+ } else {
+ // on 10.5 we can use FSRef to resolve the file path.
+ QString path = QDir::cleanPath(entry.filePath());
+ FSRef fsref;
+ if (FSPathMakeRef((const UInt8 *)path.toUtf8().data(), &fsref, 0) == noErr) {
+ CFURLRef urlref = CFURLCreateFromFSRef(NULL, &fsref);
+ CFStringRef canonicalPath = CFURLCopyFileSystemPath(urlref, kCFURLPOSIXPathStyle);
+ QString ret = QCFString::toQString(canonicalPath);
+ CFRelease(canonicalPath);
+ CFRelease(urlref);
+ return QFileSystemEntry(ret);
+ }
+ }
+# else
+ ret = realpath(entry.nativeFilePath().constData(), (char*)0);
+# endif
+ if (ret) {
+ data.knownFlagsMask |= QFileSystemMetaData::ExistsAttribute;
+ data.entryFlags |= QFileSystemMetaData::ExistsAttribute;
+ QString canonicalPath = QDir::cleanPath(QString::fromLocal8Bit(ret));
+ free(ret);
+ return QFileSystemEntry(canonicalPath);
+ } else if (errno == ENOENT) { // file doesn't exist
+ data.knownFlagsMask |= QFileSystemMetaData::ExistsAttribute;
+ data.entryFlags &= ~(QFileSystemMetaData::ExistsAttribute);
+ return QFileSystemEntry();
+ }
+ return entry;
+#endif
+}
+
+//static
+QFileSystemEntry QFileSystemEngine::absoluteName(const QFileSystemEntry &entry)
+{
+ if (entry.isAbsolute())
+ return entry;
+
+ QByteArray orig = entry.nativeFilePath();
+ QByteArray result;
+ if (orig.isEmpty() || !orig.startsWith('/')) {
+ QFileSystemEntry cur(currentPath());
+ result = cur.nativeFilePath();
+ }
+ if (!orig.isEmpty() && !(orig.length() == 1 && orig[0] == '.')) {
+ if (!result.isEmpty() && !result.endsWith('/'))
+ result.append('/');
+ result.append(orig);
+ }
+
+ if (result.length() == 1 && result[0] == '/')
+ return QFileSystemEntry(result, QFileSystemEntry::FromNativePath());
+ const bool isDir = result.endsWith('/');
+
+ /* as long as QDir::cleanPath() operates on a QString we have to convert to a string here.
+ * ideally we never convert to a string since that loses information. Please fix after
+ * we get a QByteArray version of QDir::cleanPath()
+ */
+ QFileSystemEntry resultingEntry(result, QFileSystemEntry::FromNativePath());
+ QString stringVersion = QDir::cleanPath(resultingEntry.filePath());
+ if (isDir)
+ stringVersion.append(QLatin1Char('/'));
+ return QFileSystemEntry(stringVersion);
+}
+
+//static
+QString QFileSystemEngine::resolveUserName(uint userId)
+{
+#if !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_OPENBSD)
+ int size_max = sysconf(_SC_GETPW_R_SIZE_MAX);
+ if (size_max == -1)
+ size_max = 1024;
+ QVarLengthArray<char, 1024> buf(size_max);
+#endif
+
+ struct passwd *pw = 0;
+#if !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_OPENBSD)
+ struct passwd entry;
+ getpwuid_r(userId, &entry, buf.data(), buf.size(), &pw);
+#else
+ pw = getpwuid(userId);
+#endif
+ if (pw)
+ return QFile::decodeName(QByteArray(pw->pw_name));
+ return QString();
+}
+
+//static
+QString QFileSystemEngine::resolveGroupName(uint groupId)
+{
+#if !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_OPENBSD)
+ int size_max = sysconf(_SC_GETPW_R_SIZE_MAX);
+ if (size_max == -1)
+ size_max = 1024;
+ QVarLengthArray<char, 1024> buf(size_max);
+#endif
+
+ struct group *gr = 0;
+#if !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_OPENBSD)
+ size_max = sysconf(_SC_GETGR_R_SIZE_MAX);
+ if (size_max == -1)
+ size_max = 1024;
+ buf.resize(size_max);
+ struct group entry;
+ // Some large systems have more members than the POSIX max size
+ // Loop over by doubling the buffer size (upper limit 250k)
+ for (unsigned size = size_max; size < 256000; size += size)
+ {
+ buf.resize(size);
+ // ERANGE indicates that the buffer was too small
+ if (!getgrgid_r(groupId, &entry, buf.data(), buf.size(), &gr)
+ || errno != ERANGE)
+ break;
+ }
+#else
+ gr = getgrgid(groupId);
+#endif
+ if (gr)
+ return QFile::decodeName(QByteArray(gr->gr_name));
+ return QString();
+}
+
+#if !defined(QWS) && !defined(Q_WS_QPA) && defined(Q_OS_MAC)
+//static
+QString QFileSystemEngine::bundleName(const QFileSystemEntry &entry)
+{
+ QCFType<CFURLRef> url = CFURLCreateWithFileSystemPath(0, QCFString(entry.filePath()),
+ kCFURLPOSIXPathStyle, true);
+ if (QCFType<CFDictionaryRef> dict = CFBundleCopyInfoDictionaryForURL(url)) {
+ if (CFTypeRef name = (CFTypeRef)CFDictionaryGetValue(dict, kCFBundleNameKey)) {
+ if (CFGetTypeID(name) == CFStringGetTypeID())
+ return QCFString::toQString((CFStringRef)name);
+ }
+ }
+ return QString();
+}
+#endif
+
+//static
+bool QFileSystemEngine::fillMetaData(const QFileSystemEntry &entry, QFileSystemMetaData &data,
+ QFileSystemMetaData::MetaDataFlags what)
+{
+#if !defined(QWS) && !defined(Q_WS_QPA) && defined(Q_OS_MAC)
+ if (what & QFileSystemMetaData::BundleType) {
+ if (!data.hasFlags(QFileSystemMetaData::DirectoryType))
+ what |= QFileSystemMetaData::DirectoryType;
+ }
+#endif
+
+#if !defined(QWS) && !defined(Q_WS_QPA) && defined(Q_OS_MAC) \
+ && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+ if (what & QFileSystemMetaData::HiddenAttribute) {
+ // Mac OS >= 10.5: st_flags & UF_HIDDEN
+ what |= QFileSystemMetaData::PosixStatFlags;
+ }
+#endif
+
+ if (what & QFileSystemMetaData::PosixStatFlags)
+ what |= QFileSystemMetaData::PosixStatFlags;
+
+ if (what & QFileSystemMetaData::ExistsAttribute) {
+ // FIXME: Would other queries being performed provide this bit?
+ what |= QFileSystemMetaData::PosixStatFlags;
+ }
+
+ data.entryFlags &= ~what;
+
+ const char * nativeFilePath;
+ int nativeFilePathLength;
+ {
+ const QByteArray &path = entry.nativeFilePath();
+ nativeFilePath = path.constData();
+ nativeFilePathLength = path.size();
+ }
+
+ bool entryExists = true; // innocent until proven otherwise
+
+ QT_STATBUF statBuffer;
+ bool statBufferValid = false;
+ if (what & QFileSystemMetaData::LinkType) {
+ if (QT_LSTAT(nativeFilePath, &statBuffer) == 0) {
+ if (S_ISLNK(statBuffer.st_mode)) {
+ data.entryFlags |= QFileSystemMetaData::LinkType;
+ } else {
+ statBufferValid = true;
+ data.entryFlags &= ~QFileSystemMetaData::PosixStatFlags;
+ }
+ } else {
+ entryExists = false;
+ }
+
+ data.knownFlagsMask |= QFileSystemMetaData::LinkType;
+ }
+
+ if (statBufferValid || (what & QFileSystemMetaData::PosixStatFlags)) {
+ if (entryExists && !statBufferValid)
+ statBufferValid = (QT_STAT(nativeFilePath, &statBuffer) == 0);
+
+ if (statBufferValid)
+ data.fillFromStatBuf(statBuffer);
+ else {
+ entryExists = false;
+ data.creationTime_ = 0;
+ data.modificationTime_ = 0;
+ data.accessTime_ = 0;
+ data.size_ = 0;
+ data.userId_ = (uint) -2;
+ data.groupId_ = (uint) -2;
+ }
+
+ // reset the mask
+ data.knownFlagsMask |= QFileSystemMetaData::PosixStatFlags
+ | QFileSystemMetaData::ExistsAttribute;
+ }
+
+#if !defined(QWS) && !defined(Q_WS_QPA) && defined(Q_OS_MAC)
+ if (what & QFileSystemMetaData::AliasType)
+ {
+ if (entryExists) {
+ FSRef fref;
+ if (FSPathMakeRef((const UInt8 *)nativeFilePath, &fref, NULL) == noErr) {
+ Boolean isAlias, isFolder;
+ if (FSIsAliasFile(&fref, &isAlias, &isFolder) == noErr) {
+ if (isAlias)
+ data.entryFlags |= QFileSystemMetaData::AliasType;
+ }
+ }
+ }
+ data.knownFlagsMask |= QFileSystemMetaData::AliasType;
+ }
+#endif
+
+ if (what & QFileSystemMetaData::UserPermissions) {
+ // calculate user permissions
+
+ if (entryExists) {
+ if (what & QFileSystemMetaData::UserReadPermission) {
+ if (QT_ACCESS(nativeFilePath, R_OK) == 0)
+ data.entryFlags |= QFileSystemMetaData::UserReadPermission;
+ }
+ if (what & QFileSystemMetaData::UserWritePermission) {
+ if (QT_ACCESS(nativeFilePath, W_OK) == 0)
+ data.entryFlags |= QFileSystemMetaData::UserWritePermission;
+ }
+ if (what & QFileSystemMetaData::UserExecutePermission) {
+ if (QT_ACCESS(nativeFilePath, X_OK) == 0)
+ data.entryFlags |= QFileSystemMetaData::UserExecutePermission;
+ }
+ }
+ data.knownFlagsMask |= (what & QFileSystemMetaData::UserPermissions);
+ }
+
+ if (what & QFileSystemMetaData::HiddenAttribute
+ && !data.isHidden()) {
+ QString fileName = entry.fileName();
+ if ((fileName.size() > 0 && fileName.at(0) == QLatin1Char('.'))
+ || (entryExists && _q_isMacHidden(nativeFilePath)))
+ data.entryFlags |= QFileSystemMetaData::HiddenAttribute;
+ data.knownFlagsMask |= QFileSystemMetaData::HiddenAttribute;
+ }
+
+#if !defined(QWS) && !defined(Q_WS_QPA) && defined(Q_OS_MAC)
+ if (what & QFileSystemMetaData::BundleType) {
+ if (entryExists && data.isDirectory()) {
+ QCFType<CFStringRef> path = CFStringCreateWithBytes(0,
+ (const UInt8*)nativeFilePath, nativeFilePathLength,
+ kCFStringEncodingUTF8, false);
+ QCFType<CFURLRef> url = CFURLCreateWithFileSystemPath(0, path,
+ kCFURLPOSIXPathStyle, true);
+
+ UInt32 type, creator;
+ if (CFBundleGetPackageInfoInDirectory(url, &type, &creator))
+ data.entryFlags |= QFileSystemMetaData::BundleType;
+ }
+
+ data.knownFlagsMask |= QFileSystemMetaData::BundleType;
+ }
+#endif
+
+ return data.hasFlags(what);
+}
+
+//static
+bool QFileSystemEngine::createDirectory(const QFileSystemEntry &entry, bool createParents)
+{
+ QString dirName = entry.filePath();
+ if (createParents) {
+ dirName = QDir::cleanPath(dirName);
+ for (int oldslash = -1, slash=0; slash != -1; oldslash = slash) {
+ slash = dirName.indexOf(QDir::separator(), oldslash+1);
+ if (slash == -1) {
+ if (oldslash == dirName.length())
+ break;
+ slash = dirName.length();
+ }
+ if (slash) {
+ QByteArray chunk = QFile::encodeName(dirName.left(slash));
+ QT_STATBUF st;
+ if (QT_STAT(chunk, &st) != -1) {
+ if ((st.st_mode & S_IFMT) != S_IFDIR)
+ return false;
+ } else if (QT_MKDIR(chunk, 0777) != 0) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+#if defined(Q_OS_DARWIN) // Mac X doesn't support trailing /'s
+ if (dirName.endsWith(QLatin1Char('/')))
+ dirName.chop(1);
+#endif
+ return (QT_MKDIR(QFile::encodeName(dirName), 0777) == 0);
+}
+
+//static
+bool QFileSystemEngine::removeDirectory(const QFileSystemEntry &entry, bool removeEmptyParents)
+{
+ if (removeEmptyParents) {
+ QString dirName = QDir::cleanPath(entry.filePath());
+ for (int oldslash = 0, slash=dirName.length(); slash > 0; oldslash = slash) {
+ QByteArray chunk = QFile::encodeName(dirName.left(slash));
+ QT_STATBUF st;
+ if (QT_STAT(chunk, &st) != -1) {
+ if ((st.st_mode & S_IFMT) != S_IFDIR)
+ return false;
+ if (::rmdir(chunk) != 0)
+ return oldslash != 0;
+ } else {
+ return false;
+ }
+ slash = dirName.lastIndexOf(QDir::separator(), oldslash-1);
+ }
+ return true;
+ }
+ return rmdir(QFile::encodeName(entry.filePath())) == 0;
+}
+
+//static
+bool QFileSystemEngine::createLink(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error)
+{
+ if (::symlink(source.nativeFilePath().constData(), target.nativeFilePath().constData()) == 0)
+ return true;
+ error = QSystemError(errno, QSystemError::StandardLibraryError);
+ return false;
+}
+
+//static
+bool QFileSystemEngine::copyFile(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error)
+{
+ 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.
+ return false;
+}
+
+//static
+bool QFileSystemEngine::renameFile(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error)
+{
+ if (::rename(source.nativeFilePath().constData(), target.nativeFilePath().constData()) == 0)
+ return true;
+ error = QSystemError(errno, QSystemError::StandardLibraryError);
+ return false;
+}
+
+//static
+bool QFileSystemEngine::removeFile(const QFileSystemEntry &entry, QSystemError &error)
+{
+ if (unlink(entry.nativeFilePath().constData()) == 0)
+ return true;
+ error = QSystemError(errno, QSystemError::StandardLibraryError);
+ return false;
+
+}
+
+//static
+bool QFileSystemEngine::setPermissions(const QFileSystemEntry &entry, QFile::Permissions permissions, QSystemError &error, QFileSystemMetaData *data)
+{
+ mode_t mode = 0;
+ if (permissions & QFile::ReadOwner)
+ mode |= S_IRUSR;
+ if (permissions & QFile::WriteOwner)
+ mode |= S_IWUSR;
+ if (permissions & QFile::ExeOwner)
+ mode |= S_IXUSR;
+ if (permissions & QFile::ReadUser)
+ mode |= S_IRUSR;
+ if (permissions & QFile::WriteUser)
+ mode |= S_IWUSR;
+ if (permissions & QFile::ExeUser)
+ mode |= S_IXUSR;
+ if (permissions & QFile::ReadGroup)
+ mode |= S_IRGRP;
+ if (permissions & QFile::WriteGroup)
+ mode |= S_IWGRP;
+ if (permissions & QFile::ExeGroup)
+ mode |= S_IXGRP;
+ if (permissions & QFile::ReadOther)
+ mode |= S_IROTH;
+ if (permissions & QFile::WriteOther)
+ mode |= S_IWOTH;
+ if (permissions & QFile::ExeOther)
+ mode |= S_IXOTH;
+
+ bool success = ::chmod(entry.nativeFilePath().constData(), mode) == 0;
+ if (success && data) {
+ data->entryFlags &= ~QFileSystemMetaData::Permissions;
+ data->entryFlags |= QFileSystemMetaData::MetaDataFlag(uint(permissions));
+ data->knownFlagsMask |= QFileSystemMetaData::Permissions;
+ }
+ if (!success)
+ error = QSystemError(errno, QSystemError::StandardLibraryError);
+ return success;
+}
+
+QString QFileSystemEngine::homePath()
+{
+ QString home = QFile::decodeName(qgetenv("HOME"));
+ if (home.isNull())
+ home = rootPath();
+ return QDir::cleanPath(home);
+}
+
+QString QFileSystemEngine::rootPath()
+{
+ return QLatin1String("/");
+}
+
+QString QFileSystemEngine::tempPath()
+{
+ QString temp = QFile::decodeName(qgetenv("TMPDIR"));
+ if (temp.isEmpty())
+ temp = QLatin1String("/tmp/");
+ return QDir::cleanPath(temp);
+}
+
+bool QFileSystemEngine::setCurrentPath(const QFileSystemEntry &path)
+{
+ int r;
+ r = QT_CHDIR(path.nativeFilePath());
+ return r >= 0;
+}
+
+QFileSystemEntry QFileSystemEngine::currentPath()
+{
+ QFileSystemEntry result;
+ QT_STATBUF st;
+ if (QT_STAT(".", &st) == 0) {
+#if defined(__GLIBC__) && !defined(PATH_MAX)
+ char *currentName = ::get_current_dir_name();
+ if (currentName) {
+ result = QFile::decodeName(QByteArray(currentName));
+ ::free(currentName);
+ }
+#else
+ char currentName[PATH_MAX+1];
+ if (::getcwd(currentName, PATH_MAX))
+ result = QFileSystemEntry(QByteArray(currentName), QFileSystemEntry::FromNativePath());
+# if defined(QT_DEBUG)
+ if (result.isEmpty())
+ qWarning("QFSFileEngine::currentPath: getcwd() failed");
+# endif
+#endif
+ } else {
+# if defined(QT_DEBUG)
+ qWarning("QFSFileEngine::currentPath: stat(\".\") failed");
+# endif
+ }
+ return result;
+}
+QT_END_NAMESPACE
diff --git a/src/corelib/io/qfilesystemengine_win.cpp b/src/corelib/io/qfilesystemengine_win.cpp
new file mode 100644
index 0000000..19c94e5
--- /dev/null
+++ b/src/corelib/io/qfilesystemengine_win.cpp
@@ -0,0 +1,1218 @@
+/****************************************************************************
+**
+** 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 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 "qfilesystemengine_p.h"
+
+#define _POSIX_
+#include "qplatformdefs.h"
+#include "qabstractfileengine.h"
+#include "private/qfsfileengine_p.h"
+#include <private/qsystemlibrary_p.h>
+#include <qdebug.h>
+
+#include "qfile.h"
+#include "qdir.h"
+#include "private/qmutexpool_p.h"
+#include "qvarlengtharray.h"
+#include "qdatetime.h"
+#include "qt_windows.h"
+
+#if !defined(Q_OS_WINCE)
+# include <sys/types.h>
+# include <direct.h>
+# include <winioctl.h>
+#else
+# include <types.h>
+#endif
+#include <objbase.h>
+#include <shlobj.h>
+#include <initguid.h>
+#include <accctrl.h>
+#include <ctype.h>
+#include <limits.h>
+#define SECURITY_WIN32
+#include <security.h>
+
+#ifndef SPI_GETPLATFORMTYPE
+#define SPI_GETPLATFORMTYPE 257
+#endif
+
+#ifndef PATH_MAX
+#define PATH_MAX FILENAME_MAX
+#endif
+
+#ifndef _INTPTR_T_DEFINED
+#ifdef _WIN64
+typedef __int64 intptr_t;
+#else
+#ifdef _W64
+typedef _W64 int intptr_t;
+#else
+typedef INT_PTR intptr_t;
+#endif
+#endif
+#define _INTPTR_T_DEFINED
+#endif
+
+#ifndef INVALID_FILE_ATTRIBUTES
+# define INVALID_FILE_ATTRIBUTES (DWORD (-1))
+#endif
+
+#if !defined(Q_OS_WINCE)
+# if !defined(REPARSE_DATA_BUFFER_HEADER_SIZE)
+typedef struct _REPARSE_DATA_BUFFER {
+ ULONG ReparseTag;
+ USHORT ReparseDataLength;
+ USHORT Reserved;
+ union {
+ struct {
+ USHORT SubstituteNameOffset;
+ USHORT SubstituteNameLength;
+ USHORT PrintNameOffset;
+ USHORT PrintNameLength;
+ ULONG Flags;
+ WCHAR PathBuffer[1];
+ } SymbolicLinkReparseBuffer;
+ struct {
+ USHORT SubstituteNameOffset;
+ USHORT SubstituteNameLength;
+ USHORT PrintNameOffset;
+ USHORT PrintNameLength;
+ WCHAR PathBuffer[1];
+ } MountPointReparseBuffer;
+ struct {
+ UCHAR DataBuffer[1];
+ } GenericReparseBuffer;
+ };
+} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
+# define REPARSE_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer)
+# endif // !defined(REPARSE_DATA_BUFFER_HEADER_SIZE)
+
+# ifndef MAXIMUM_REPARSE_DATA_BUFFER_SIZE
+# define MAXIMUM_REPARSE_DATA_BUFFER_SIZE 16384
+# endif
+# ifndef IO_REPARSE_TAG_SYMLINK
+# define IO_REPARSE_TAG_SYMLINK (0xA000000CL)
+# endif
+# ifndef FSCTL_GET_REPARSE_POINT
+# define FSCTL_GET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 42, METHOD_BUFFERED, FILE_ANY_ACCESS)
+# endif
+#endif // !defined(Q_OS_WINCE)
+
+QT_BEGIN_NAMESPACE
+
+Q_CORE_EXPORT int qt_ntfs_permission_lookup = 0;
+
+#if defined(Q_OS_WINCE)
+static QString qfsPrivateCurrentDir = QLatin1String("");
+// As none of the functions we try to resolve do exist on Windows CE
+// we use QT_NO_LIBRARY to shorten everything up a little bit.
+#define QT_NO_LIBRARY 1
+#endif
+
+#if !defined(QT_NO_LIBRARY)
+QT_BEGIN_INCLUDE_NAMESPACE
+typedef DWORD (WINAPI *PtrGetNamedSecurityInfoW)(LPWSTR, SE_OBJECT_TYPE, SECURITY_INFORMATION, PSID*, PSID*, PACL*, PACL*, PSECURITY_DESCRIPTOR*);
+static PtrGetNamedSecurityInfoW ptrGetNamedSecurityInfoW = 0;
+typedef BOOL (WINAPI *PtrLookupAccountSidW)(LPCWSTR, PSID, LPWSTR, LPDWORD, LPWSTR, LPDWORD, PSID_NAME_USE);
+static PtrLookupAccountSidW ptrLookupAccountSidW = 0;
+typedef VOID (WINAPI *PtrBuildTrusteeWithSidW)(PTRUSTEE_W, PSID);
+static PtrBuildTrusteeWithSidW ptrBuildTrusteeWithSidW = 0;
+typedef DWORD (WINAPI *PtrGetEffectiveRightsFromAclW)(PACL, PTRUSTEE_W, OUT PACCESS_MASK);
+static PtrGetEffectiveRightsFromAclW ptrGetEffectiveRightsFromAclW = 0;
+static TRUSTEE_W currentUserTrusteeW;
+static TRUSTEE_W worldTrusteeW;
+
+typedef BOOL (WINAPI *PtrGetUserProfileDirectoryW)(HANDLE, LPWSTR, LPDWORD);
+static PtrGetUserProfileDirectoryW ptrGetUserProfileDirectoryW = 0;
+typedef BOOL (WINAPI *PtrGetVolumePathNamesForVolumeNameW)(LPCWSTR,LPWSTR,DWORD,PDWORD);
+static PtrGetVolumePathNamesForVolumeNameW ptrGetVolumePathNamesForVolumeNameW = 0;
+QT_END_INCLUDE_NAMESPACE
+
+
+static void resolveLibs()
+{
+ static bool triedResolve = false;
+ if (!triedResolve) {
+ // need to resolve the security info functions
+
+ // protect initialization
+#ifndef QT_NO_THREAD
+ QMutexLocker locker(QMutexPool::globalInstanceGet(&triedResolve));
+ // check triedResolve again, since another thread may have already
+ // done the initialization
+ if (triedResolve) {
+ // another thread did initialize the security function pointers,
+ // so we shouldn't do it again.
+ return;
+ }
+#endif
+
+ triedResolve = true;
+#if !defined(Q_OS_WINCE)
+ HINSTANCE advapiHnd = QSystemLibrary::load(L"advapi32");
+ if (advapiHnd) {
+ ptrGetNamedSecurityInfoW = (PtrGetNamedSecurityInfoW)GetProcAddress(advapiHnd, "GetNamedSecurityInfoW");
+ ptrLookupAccountSidW = (PtrLookupAccountSidW)GetProcAddress(advapiHnd, "LookupAccountSidW");
+ ptrBuildTrusteeWithSidW = (PtrBuildTrusteeWithSidW)GetProcAddress(advapiHnd, "BuildTrusteeWithSidW");
+ ptrGetEffectiveRightsFromAclW = (PtrGetEffectiveRightsFromAclW)GetProcAddress(advapiHnd, "GetEffectiveRightsFromAclW");
+ }
+ if (ptrBuildTrusteeWithSidW) {
+ // Create TRUSTEE for current user
+ HANDLE hnd = ::GetCurrentProcess();
+ HANDLE token = 0;
+ if (::OpenProcessToken(hnd, TOKEN_QUERY, &token)) {
+ TOKEN_USER tu;
+ DWORD retsize;
+ if (::GetTokenInformation(token, TokenUser, &tu, sizeof(tu), &retsize))
+ ptrBuildTrusteeWithSidW(&currentUserTrusteeW, tu.User.Sid);
+ ::CloseHandle(token);
+ }
+
+ typedef BOOL (WINAPI *PtrAllocateAndInitializeSid)(PSID_IDENTIFIER_AUTHORITY, BYTE, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, PSID*);
+ PtrAllocateAndInitializeSid ptrAllocateAndInitializeSid = (PtrAllocateAndInitializeSid)GetProcAddress(advapiHnd, "AllocateAndInitializeSid");
+ typedef PVOID (WINAPI *PtrFreeSid)(PSID);
+ PtrFreeSid ptrFreeSid = (PtrFreeSid)GetProcAddress(advapiHnd, "FreeSid");
+ if (ptrAllocateAndInitializeSid && ptrFreeSid) {
+ // Create TRUSTEE for Everyone (World)
+ SID_IDENTIFIER_AUTHORITY worldAuth = { SECURITY_WORLD_SID_AUTHORITY };
+ PSID pWorld = 0;
+ if (ptrAllocateAndInitializeSid(&worldAuth, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &pWorld))
+ ptrBuildTrusteeWithSidW(&worldTrusteeW, pWorld);
+ ptrFreeSid(pWorld);
+ }
+ }
+ HINSTANCE userenvHnd = QSystemLibrary::load(L"userenv");
+ if (userenvHnd)
+ ptrGetUserProfileDirectoryW = (PtrGetUserProfileDirectoryW)GetProcAddress(userenvHnd, "GetUserProfileDirectoryW");
+ HINSTANCE kernel32 = LoadLibrary(L"kernel32");
+ if(kernel32)
+ ptrGetVolumePathNamesForVolumeNameW = (PtrGetVolumePathNamesForVolumeNameW)GetProcAddress(kernel32, "GetVolumePathNamesForVolumeNameW");
+#endif
+ }
+}
+#endif // QT_NO_LIBRARY
+
+typedef DWORD (WINAPI *PtrNetShareEnum)(LPWSTR, DWORD, LPBYTE*, DWORD, LPDWORD, LPDWORD, LPDWORD);
+static PtrNetShareEnum ptrNetShareEnum = 0;
+typedef DWORD (WINAPI *PtrNetApiBufferFree)(LPVOID);
+static PtrNetApiBufferFree ptrNetApiBufferFree = 0;
+typedef struct _SHARE_INFO_1 {
+ LPWSTR shi1_netname;
+ DWORD shi1_type;
+ LPWSTR shi1_remark;
+} SHARE_INFO_1;
+
+
+static bool resolveUNCLibs()
+{
+ static bool triedResolve = false;
+ if (!triedResolve) {
+#ifndef QT_NO_THREAD
+ QMutexLocker locker(QMutexPool::globalInstanceGet(&triedResolve));
+ if (triedResolve) {
+ return ptrNetShareEnum && ptrNetApiBufferFree;
+ }
+#endif
+ triedResolve = true;
+#if !defined(Q_OS_WINCE)
+ HINSTANCE hLib = QSystemLibrary::load(L"Netapi32");
+ if (hLib) {
+ ptrNetShareEnum = (PtrNetShareEnum)GetProcAddress(hLib, "NetShareEnum");
+ if (ptrNetShareEnum)
+ ptrNetApiBufferFree = (PtrNetApiBufferFree)GetProcAddress(hLib, "NetApiBufferFree");
+ }
+#endif
+ }
+ return ptrNetShareEnum && ptrNetApiBufferFree;
+}
+
+static QString readSymLink(const QFileSystemEntry &link)
+{
+ QString result;
+#if !defined(Q_OS_WINCE)
+ HANDLE handle = CreateFile((wchar_t*)link.nativeFilePath().utf16(),
+ FILE_READ_EA,
+ FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
+ 0,
+ OPEN_EXISTING,
+ FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT,
+ 0);
+ if (handle != INVALID_HANDLE_VALUE) {
+ DWORD bufsize = MAXIMUM_REPARSE_DATA_BUFFER_SIZE;
+ REPARSE_DATA_BUFFER *rdb = (REPARSE_DATA_BUFFER*)qMalloc(bufsize);
+ DWORD retsize = 0;
+ if (::DeviceIoControl(handle, FSCTL_GET_REPARSE_POINT, 0, 0, rdb, bufsize, &retsize, 0)) {
+ if (rdb->ReparseTag == IO_REPARSE_TAG_MOUNT_POINT) {
+ int length = rdb->MountPointReparseBuffer.SubstituteNameLength / sizeof(wchar_t);
+ int offset = rdb->MountPointReparseBuffer.SubstituteNameOffset / sizeof(wchar_t);
+ const wchar_t* PathBuffer = &rdb->MountPointReparseBuffer.PathBuffer[offset];
+ result = QString::fromWCharArray(PathBuffer, length);
+ } else if (rdb->ReparseTag == IO_REPARSE_TAG_SYMLINK) {
+ int length = rdb->SymbolicLinkReparseBuffer.SubstituteNameLength / sizeof(wchar_t);
+ int offset = rdb->SymbolicLinkReparseBuffer.SubstituteNameOffset / sizeof(wchar_t);
+ const wchar_t* PathBuffer = &rdb->SymbolicLinkReparseBuffer.PathBuffer[offset];
+ result = QString::fromWCharArray(PathBuffer, length);
+ }
+ // cut-off "//?/" and "/??/"
+ if (result.size() > 4 && result.at(0) == QLatin1Char('\\') && result.at(2) == QLatin1Char('?') && result.at(3) == QLatin1Char('\\'))
+ result = result.mid(4);
+ }
+ qFree(rdb);
+ CloseHandle(handle);
+
+#if !defined(QT_NO_LIBRARY)
+ resolveLibs();
+ if (ptrGetVolumePathNamesForVolumeNameW) {
+ QRegExp matchVolName(QLatin1String("^Volume\\{([a-z]|[0-9]|-)+\\}\\\\"), Qt::CaseInsensitive);
+ if(matchVolName.indexIn(result) == 0) {
+ DWORD len;
+ wchar_t buffer[MAX_PATH];
+ QString volumeName = result.mid(0, matchVolName.matchedLength()).prepend(QLatin1String("\\\\?\\"));
+ if(ptrGetVolumePathNamesForVolumeNameW((wchar_t*)volumeName.utf16(), buffer, MAX_PATH, &len) != 0)
+ result.replace(0,matchVolName.matchedLength(), QString::fromWCharArray(buffer));
+ }
+ }
+#endif
+ }
+#else
+ Q_UNUSED(link);
+#endif // Q_OS_WINCE
+ return result;
+}
+
+static QString readLink(const QFileSystemEntry &link)
+{
+#if !defined(Q_OS_WINCE)
+#if !defined(QT_NO_LIBRARY) && !defined(Q_CC_MWERKS)
+ QString ret;
+
+ bool neededCoInit = false;
+ IShellLink *psl; // pointer to IShellLink i/f
+ WIN32_FIND_DATA wfd;
+ wchar_t szGotPath[MAX_PATH];
+
+ // Get pointer to the IShellLink interface.
+ HRESULT hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID *)&psl);
+
+ if (hres == CO_E_NOTINITIALIZED) { // COM was not initialized
+ neededCoInit = true;
+ CoInitialize(NULL);
+ hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
+ IID_IShellLink, (LPVOID *)&psl);
+ }
+ if (SUCCEEDED(hres)) { // Get pointer to the IPersistFile interface.
+ IPersistFile *ppf;
+ hres = psl->QueryInterface(IID_IPersistFile, (LPVOID *)&ppf);
+ if (SUCCEEDED(hres)) {
+ hres = ppf->Load((LPOLESTR)link.nativeFilePath().utf16(), STGM_READ);
+ //The original path of the link is retrieved. If the file/folder
+ //was moved, the return value still have the old path.
+ if (SUCCEEDED(hres)) {
+ if (psl->GetPath(szGotPath, MAX_PATH, &wfd, SLGP_UNCPRIORITY) == NOERROR)
+ ret = QString::fromWCharArray(szGotPath);
+ }
+ ppf->Release();
+ }
+ psl->Release();
+ }
+ if (neededCoInit)
+ CoUninitialize();
+
+ return ret;
+#else
+ Q_UNUSED(link);
+ return QString();
+#endif // QT_NO_LIBRARY
+#else
+ wchar_t target[MAX_PATH];
+ QString result;
+ if (SHGetShortcutTarget((wchar_t*)QFileInfo(link.filePath()).absoluteFilePath().replace(QLatin1Char('/'),QLatin1Char('\\')).utf16(), target, MAX_PATH)) {
+ result = QString::fromWCharArray(target);
+ if (result.startsWith(QLatin1Char('"')))
+ result.remove(0,1);
+ if (result.endsWith(QLatin1Char('"')))
+ result.remove(result.size()-1,1);
+ }
+ return result;
+#endif // Q_OS_WINCE
+}
+
+static bool uncShareExists(const QString &server)
+{
+ // This code assumes the UNC path is always like \\?\UNC\server...
+ QStringList parts = server.split(QLatin1Char('\\'), QString::SkipEmptyParts);
+ if (parts.count() >= 3) {
+ QStringList shares;
+ if (QFileSystemEngine::uncListSharesOnServer(QLatin1String("\\\\") + parts.at(2), &shares))
+ return parts.count() >= 4 ? shares.contains(parts.at(3), Qt::CaseInsensitive) : true;
+ }
+ return false;
+}
+
+static inline bool getFindData(QString path, WIN32_FIND_DATA &findData)
+{
+ // path should not end with a trailing slash
+ while (path.endsWith(QLatin1Char('\\')))
+ path.chop(1);
+
+ // can't handle drives
+ if (!path.endsWith(QLatin1Char(':'))) {
+ HANDLE hFind = ::FindFirstFile((wchar_t*)path.utf16(), &findData);
+ if (hFind != INVALID_HANDLE_VALUE) {
+ ::FindClose(hFind);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool QFileSystemEngine::uncListSharesOnServer(const QString &server, QStringList *list)
+{
+ if (resolveUNCLibs()) {
+ SHARE_INFO_1 *BufPtr, *p;
+ DWORD res;
+ DWORD er = 0, tr = 0, resume = 0, i;
+ do {
+ res = ptrNetShareEnum((wchar_t*)server.utf16(), 1, (LPBYTE *)&BufPtr, DWORD(-1), &er, &tr, &resume);
+ if (res == ERROR_SUCCESS || res == ERROR_MORE_DATA) {
+ p = BufPtr;
+ for (i = 1; i <= er; ++i) {
+ if (list && p->shi1_type == 0)
+ list->append(QString::fromWCharArray(p->shi1_netname));
+ p++;
+ }
+ }
+ ptrNetApiBufferFree(BufPtr);
+ } while (res == ERROR_MORE_DATA);
+ return res == ERROR_SUCCESS;
+ }
+ return false;
+}
+
+void QFileSystemEngine::clearWinStatData(QFileSystemMetaData &data)
+{
+ data.size_ = 0;
+ data.fileAttribute_ = 0;
+ data.creationTime_ = FILETIME();
+ data.lastAccessTime_ = FILETIME();
+ data.lastWriteTime_ = FILETIME();
+}
+
+bool QFileSystemEngine::isCaseSensitive()
+{
+ return false;
+}
+
+//static
+QFileSystemEntry QFileSystemEngine::getLinkTarget(const QFileSystemEntry &link,
+ QFileSystemMetaData &data)
+{
+ if (data.missingFlags(QFileSystemMetaData::LinkType))
+ QFileSystemEngine::fillMetaData(link, data, QFileSystemMetaData::LinkType);
+
+ QString ret;
+ if (data.isLnkFile())
+ ret = readLink(link);
+ else if (data.isLink())
+ ret = readSymLink(link);
+ return QFileSystemEntry(ret);
+}
+
+//static
+QFileSystemEntry QFileSystemEngine::canonicalName(const QFileSystemEntry &entry, QFileSystemMetaData &data)
+{
+ if (data.missingFlags(QFileSystemMetaData::ExistsAttribute))
+ QFileSystemEngine::fillMetaData(entry, data, QFileSystemMetaData::ExistsAttribute);
+
+ if (data.exists())
+ return QFileSystemEntry(slowCanonicalized(absoluteName(entry).filePath()));
+ else
+ return QFileSystemEntry();
+}
+
+//static
+QString QFileSystemEngine::nativeAbsoluteFilePath(const QString &path)
+{
+ // can be //server or //server/share
+ QString absPath;
+#if !defined(Q_OS_WINCE)
+ QVarLengthArray<wchar_t, MAX_PATH> buf(qMax(MAX_PATH, path.size() + 1));
+ wchar_t *fileName = 0;
+ DWORD retLen = GetFullPathName((wchar_t*)path.utf16(), buf.size(), buf.data(), &fileName);
+ if (retLen > (DWORD)buf.size()) {
+ buf.resize(retLen);
+ retLen = GetFullPathName((wchar_t*)path.utf16(), buf.size(), buf.data(), &fileName);
+ }
+ if (retLen != 0)
+ absPath = QString::fromWCharArray(buf.data(), retLen);
+#else
+ if (path.startsWith(QLatin1Char('/')) || path.startsWith(QLatin1Char('\\')))
+ absPath = QDir::toNativeSeparators(path);
+ else
+ absPath = QDir::toNativeSeparators(QDir::cleanPath(qfsPrivateCurrentDir + QLatin1Char('/') + path));
+#endif
+ // This is really ugly, but GetFullPathName strips off whitespace at the end.
+ // If you for instance write ". " in the lineedit of QFileDialog,
+ // (which is an invalid filename) this function will strip the space off and viola,
+ // the file is later reported as existing. Therefore, we re-add the whitespace that
+ // was at the end of path in order to keep the filename invalid.
+ if (!path.isEmpty() && path.at(path.size() - 1) == QLatin1Char(' '))
+ absPath.append(QLatin1Char(' '));
+ return absPath;
+}
+
+//static
+QFileSystemEntry QFileSystemEngine::absoluteName(const QFileSystemEntry &entry)
+{
+ QString ret;
+
+ if (!entry.isRelative()) {
+#if !defined(Q_OS_WINCE)
+ if (entry.isAbsolute()
+ && !entry.filePath().contains(QLatin1String("/../"))
+ && !entry.filePath().contains(QLatin1String("/./"))
+ && !entry.filePath().endsWith(QLatin1String("/.."))
+ && !entry.filePath().endsWith(QLatin1String("/."))) {
+ ret = entry.filePath();
+ } else {
+ ret = QDir::fromNativeSeparators(nativeAbsoluteFilePath(entry.filePath()));
+ }
+#else
+ ret = entry.filePath();
+#endif
+ } else {
+ ret = QDir::cleanPath(QDir::currentPath() + QLatin1Char('/') + entry.filePath());
+ }
+
+ // The path should be absolute at this point.
+ // From the docs :
+ // Absolute paths begin with the directory separator "/"
+ // (optionally preceded by a drive specification under Windows).
+ if (ret.at(0) != QLatin1Char('/')) {
+ Q_ASSERT(ret.length() >= 2);
+ Q_ASSERT(ret.at(0).isLetter());
+ Q_ASSERT(ret.at(1) == QLatin1Char(':'));
+
+ // Force uppercase drive letters.
+ ret[0] = ret.at(0).toUpper();
+ }
+ return QFileSystemEntry(ret);
+}
+
+//static
+QString QFileSystemEngine::owner(const QFileSystemEntry &entry, QAbstractFileEngine::FileOwner own)
+{
+ QString name;
+#if !defined(QT_NO_LIBRARY)
+ extern int qt_ntfs_permission_lookup;
+ if((qt_ntfs_permission_lookup > 0) && (QSysInfo::WindowsVersion & QSysInfo::WV_NT_based)) {
+ resolveLibs();
+ if (ptrGetNamedSecurityInfoW && ptrLookupAccountSidW) {
+ PSID pOwner = 0;
+ PSECURITY_DESCRIPTOR pSD;
+ if (ptrGetNamedSecurityInfoW((wchar_t*)entry.nativeFilePath().utf16(), SE_FILE_OBJECT,
+ own == QAbstractFileEngine::OwnerGroup ? GROUP_SECURITY_INFORMATION : OWNER_SECURITY_INFORMATION,
+ own == QAbstractFileEngine::OwnerUser ? &pOwner : 0, own == QAbstractFileEngine::OwnerGroup ? &pOwner : 0,
+ 0, 0, &pSD) == ERROR_SUCCESS) {
+ DWORD lowner = 64;
+ DWORD ldomain = 64;
+ QVarLengthArray<wchar_t, 64> owner(lowner);
+ QVarLengthArray<wchar_t, 64> domain(ldomain);
+ SID_NAME_USE use = SidTypeUnknown;
+ // First call, to determine size of the strings (with '\0').
+ if (!ptrLookupAccountSidW(NULL, pOwner, (LPWSTR)owner.data(), &lowner,
+ (LPWSTR)domain.data(), &ldomain, (SID_NAME_USE*)&use)) {
+ if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
+ if (lowner > (DWORD)owner.size())
+ owner.resize(lowner);
+ if (ldomain > (DWORD)domain.size())
+ domain.resize(ldomain);
+ // Second call, try on resized buf-s
+ if (!ptrLookupAccountSidW(NULL, pOwner, (LPWSTR)owner.data(), &lowner,
+ (LPWSTR)domain.data(), &ldomain, (SID_NAME_USE*)&use)) {
+ lowner = 0;
+ }
+ } else {
+ lowner = 0;
+ }
+ }
+ if (lowner != 0)
+ name = QString::fromWCharArray(owner.data());
+ LocalFree(pSD);
+ }
+ }
+ }
+#else
+ Q_UNUSED(own);
+#endif
+ return name;
+}
+
+//static
+bool QFileSystemEngine::fillPermissions(const QFileSystemEntry &entry, QFileSystemMetaData &data,
+ QFileSystemMetaData::MetaDataFlags what)
+{
+ QAbstractFileEngine::FileFlags ret = 0;
+
+#if !defined(QT_NO_LIBRARY)
+ if((qt_ntfs_permission_lookup > 0) && (QSysInfo::WindowsVersion & QSysInfo::WV_NT_based)) {
+ resolveLibs();
+ if(ptrGetNamedSecurityInfoW && ptrBuildTrusteeWithSidW && ptrGetEffectiveRightsFromAclW) {
+ enum { ReadMask = 0x00000001, WriteMask = 0x00000002, ExecMask = 0x00000020 };
+
+ QString fname = entry.filePath();
+ PSID pOwner = 0;
+ PSID pGroup = 0;
+ PACL pDacl;
+ PSECURITY_DESCRIPTOR pSD;
+ DWORD res = ptrGetNamedSecurityInfoW((wchar_t*)fname.utf16(), SE_FILE_OBJECT,
+ OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION,
+ &pOwner, &pGroup, &pDacl, 0, &pSD);
+ if(res == ERROR_SUCCESS) {
+ ACCESS_MASK access_mask;
+ TRUSTEE_W trustee;
+ if (what & QFileSystemMetaData::UserPermissions) { // user
+ data.knownFlagsMask |= QFileSystemMetaData::UserPermissions;
+ if(ptrGetEffectiveRightsFromAclW(pDacl, &currentUserTrusteeW, &access_mask) != ERROR_SUCCESS)
+ access_mask = (ACCESS_MASK)-1;
+ if(access_mask & ReadMask)
+ data.entryFlags |= QFileSystemMetaData::UserReadPermission;
+ if(access_mask & WriteMask)
+ data.entryFlags|= QFileSystemMetaData::UserWritePermission;
+ if(access_mask & ExecMask)
+ data.entryFlags|= QFileSystemMetaData::UserExecutePermission;
+ }
+ if (what & QFileSystemMetaData::OwnerPermissions) { // owner
+ data.knownFlagsMask |= QFileSystemMetaData::OwnerPermissions;
+ ptrBuildTrusteeWithSidW(&trustee, pOwner);
+ if(ptrGetEffectiveRightsFromAclW(pDacl, &trustee, &access_mask) != ERROR_SUCCESS)
+ access_mask = (ACCESS_MASK)-1;
+ if(access_mask & ReadMask)
+ data.entryFlags |= QFileSystemMetaData::OwnerReadPermission;
+ if(access_mask & WriteMask)
+ data.entryFlags |= QFileSystemMetaData::OwnerWritePermission;
+ if(access_mask & ExecMask)
+ data.entryFlags |= QFileSystemMetaData::OwnerExecutePermission;
+ }
+ if (what & QFileSystemMetaData::GroupPermissions) { // group
+ data.knownFlagsMask |= QFileSystemMetaData::GroupPermissions;
+ ptrBuildTrusteeWithSidW(&trustee, pGroup);
+ if(ptrGetEffectiveRightsFromAclW(pDacl, &trustee, &access_mask) != ERROR_SUCCESS)
+ access_mask = (ACCESS_MASK)-1;
+ if(access_mask & ReadMask)
+ data.entryFlags |= QFileSystemMetaData::GroupReadPermission;
+ if(access_mask & WriteMask)
+ data.entryFlags |= QFileSystemMetaData::GroupWritePermission;
+ if(access_mask & ExecMask)
+ data.entryFlags |= QFileSystemMetaData::GroupExecutePermission;
+ }
+ if (what & QFileSystemMetaData::OtherPermissions) { // other (world)
+ data.knownFlagsMask |= QFileSystemMetaData::OtherPermissions;
+ if(ptrGetEffectiveRightsFromAclW(pDacl, &worldTrusteeW, &access_mask) != ERROR_SUCCESS)
+ access_mask = (ACCESS_MASK)-1; // ###
+ if(access_mask & ReadMask)
+ data.entryFlags |= QFileSystemMetaData::OtherReadPermission;
+ if(access_mask & WriteMask)
+ data.entryFlags |= QFileSystemMetaData::OtherWritePermission;
+ if(access_mask & ExecMask)
+ data.entryFlags |= QFileSystemMetaData::OwnerExecutePermission;
+ }
+ LocalFree(pSD);
+ }
+ }
+ } else
+#endif
+ {
+ //### what to do with permissions if we don't use NTFS
+ // for now just add all permissions and what about exe missions ??
+ // also qt_ntfs_permission_lookup is now not set by default ... should it ?
+ data.entryFlags |= QFileSystemMetaData::OwnerReadPermission
+ | QFileSystemMetaData::GroupReadPermission
+ | QFileSystemMetaData::OtherReadPermission;
+
+ if (!(data.fileAttribute_ & FILE_ATTRIBUTE_READONLY)) {
+ data.entryFlags |= QFileSystemMetaData::OwnerWritePermission
+ | QFileSystemMetaData::GroupWritePermission
+ | QFileSystemMetaData::OtherWritePermission;
+ }
+
+ QString fname = entry.filePath();
+ QString ext = fname.right(4).toLower();
+ if (data.isDirectory() ||
+ ext == QLatin1String(".exe") || ext == QLatin1String(".com") || ext == QLatin1String(".bat") ||
+ ext == QLatin1String(".pif") || ext == QLatin1String(".cmd")) {
+ data.entryFlags |= QFileSystemMetaData::OwnerExecutePermission | QFileSystemMetaData::GroupExecutePermission
+ | QFileSystemMetaData::OtherExecutePermission | QFileSystemMetaData::UserExecutePermission;
+ }
+ data.knownFlagsMask |= QFileSystemMetaData::OwnerPermissions | QFileSystemMetaData::GroupPermissions
+ | QFileSystemMetaData::OtherPermissions | QFileSystemMetaData::UserExecutePermission;
+ // calculate user permissions
+ if (what & QFileSystemMetaData::UserReadPermission) {
+ if (::_waccess((wchar_t*)entry.nativeFilePath().utf16(), R_OK) == 0)
+ data.entryFlags |= QFileSystemMetaData::UserReadPermission;
+ data.knownFlagsMask |= QFileSystemMetaData::UserReadPermission;
+ }
+ if (what & QFileSystemMetaData::UserWritePermission) {
+ if (::_waccess((wchar_t*)entry.nativeFilePath().utf16(), W_OK) == 0)
+ data.entryFlags |= QFileSystemMetaData::UserWritePermission;
+ data.knownFlagsMask |= QFileSystemMetaData::UserReadPermission;
+ }
+ }
+
+ return data.hasFlags(what);
+}
+
+static bool tryDriveUNCFallback(const QFileSystemEntry &fname, QFileSystemMetaData &data)
+{
+ bool entryExists = false;
+ DWORD fileAttrib = 0;
+#if !defined(Q_OS_WINCE)
+ if (fname.isDriveRoot()) {
+ // a valid drive ??
+ DWORD drivesBitmask = ::GetLogicalDrives();
+ int drivebit = 1 << (fname.filePath().at(0).toUpper().unicode() - QLatin1Char('A').unicode());
+ if (drivesBitmask & drivebit) {
+ fileAttrib = FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_SYSTEM;
+ entryExists = true;
+ }
+ } else {
+#endif
+ const QString &path = fname.nativeFilePath();
+ bool is_dir = false;
+ if (path.startsWith(QLatin1String("\\\\?\\UNC"))) {
+ // UNC - stat doesn't work for all cases (Windows bug)
+ int s = path.indexOf(path.at(0),7);
+ if (s > 0) {
+ // "\\?\UNC\server\..."
+ s = path.indexOf(path.at(0),s+1);
+ if (s > 0) {
+ // "\\?\UNC\server\share\..."
+ if (s == path.size() - 1) {
+ // "\\?\UNC\server\share\"
+ is_dir = true;
+ } else {
+ // "\\?\UNC\server\share\notfound"
+ }
+ } else {
+ // "\\?\UNC\server\share"
+ is_dir = true;
+ }
+ } else {
+ // "\\?\UNC\server"
+ is_dir = true;
+ }
+ }
+ if (is_dir && uncShareExists(path)) {
+ // looks like a UNC dir, is a dir.
+ fileAttrib = FILE_ATTRIBUTE_DIRECTORY;
+ entryExists = true;
+ }
+#if !defined(Q_OS_WINCE)
+ }
+#endif
+ if (entryExists)
+ data.fillFromFileAttribute(fileAttrib);
+ return entryExists;
+}
+
+static bool tryFindFallback(const QFileSystemEntry &fname, QFileSystemMetaData &data)
+{
+ bool filledData = false;
+ // This assumes the last call to a Windows API failed.
+ int errorCode = GetLastError();
+ if (errorCode == ERROR_ACCESS_DENIED || errorCode == ERROR_SHARING_VIOLATION) {
+ WIN32_FIND_DATA findData;
+ if (getFindData(fname.nativeFilePath(), findData)
+ && findData.dwFileAttributes != INVALID_FILE_ATTRIBUTES) {
+ data.fillFromFindData(findData, true, fname.isDriveRoot());
+ filledData = true;
+ }
+ }
+ return filledData;
+}
+
+#if !defined(Q_OS_WINCE)
+//static
+bool QFileSystemEngine::fillMetaData(int fd, QFileSystemMetaData &data,
+ QFileSystemMetaData::MetaDataFlags what)
+{
+ HANDLE fHandle = (HANDLE)_get_osfhandle(fd);
+ if (fHandle != INVALID_HANDLE_VALUE) {
+ return fillMetaData(fHandle, data, what);
+ }
+ return false;
+}
+#endif
+
+//static
+bool QFileSystemEngine::fillMetaData(HANDLE fHandle, QFileSystemMetaData &data,
+ QFileSystemMetaData::MetaDataFlags what)
+{
+ data.entryFlags &= ~what;
+ clearWinStatData(data);
+ BY_HANDLE_FILE_INFORMATION fileInfo;
+ UINT oldmode = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);
+ if (GetFileInformationByHandle(fHandle , &fileInfo)) {
+ data.fillFromFindInfo(fileInfo);
+ }
+ SetErrorMode(oldmode);
+ return data.hasFlags(what);
+}
+
+//static
+bool QFileSystemEngine::fillMetaData(const QFileSystemEntry &entry, QFileSystemMetaData &data,
+ QFileSystemMetaData::MetaDataFlags what)
+{
+ what |= QFileSystemMetaData::WinLnkType | QFileSystemMetaData::WinStatFlags;
+ data.entryFlags &= ~what;
+
+ QFileSystemEntry fname;
+ data.knownFlagsMask |= QFileSystemMetaData::WinLnkType;
+ if(entry.filePath().endsWith(QLatin1String(".lnk"))) {
+ data.entryFlags |= QFileSystemMetaData::WinLnkType;
+ fname = QFileSystemEntry(readLink(entry));
+ } else {
+ fname = entry;
+ }
+
+ if (fname.isEmpty()) {
+ data.knownFlagsMask |= what;
+ clearWinStatData(data);
+ return false;
+ }
+
+ if (what & QFileSystemMetaData::WinStatFlags) {
+ UINT oldmode = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);
+ clearWinStatData(data);
+ WIN32_FIND_DATA findData;
+ // The memory structure for WIN32_FIND_DATA is same as WIN32_FILE_ATTRIBUTE_DATA
+ // for all members used by fillFindData().
+ bool ok = ::GetFileAttributesEx((wchar_t*)fname.nativeFilePath().utf16(), GetFileExInfoStandard,
+ reinterpret_cast<WIN32_FILE_ATTRIBUTE_DATA *>(&findData));
+ if (ok) {
+ data.fillFromFindData(findData, false, fname.isDriveRoot());
+ } else {
+ if (!tryFindFallback(fname, data))
+ tryDriveUNCFallback(fname, data);
+ }
+ SetErrorMode(oldmode);
+ }
+
+ if (what & QFileSystemMetaData::Permissions)
+ fillPermissions(fname, data, what);
+ if ((what & QFileSystemMetaData::LinkType)
+ && data.missingFlags(QFileSystemMetaData::LinkType)) {
+ data.knownFlagsMask |= QFileSystemMetaData::LinkType;
+ if (data.fileAttribute_ & FILE_ATTRIBUTE_REPARSE_POINT) {
+ WIN32_FIND_DATA findData;
+ if (getFindData(fname.nativeFilePath(), findData))
+ data.fillFromFindData(findData, true);
+ }
+ }
+ data.knownFlagsMask |= what;
+ return data.hasFlags(what);
+}
+
+static inline bool mkDir(const QString &path)
+{
+#if defined(Q_OS_WINCE)
+ // Unfortunately CreateDirectory returns true for paths longer than
+ // 256, but does not create a directory. It starts to fail, when
+ // path length > MAX_PATH, which is 260 usually on CE.
+ // This only happens on a Windows Mobile device. Windows CE seems
+ // not to be affected by this.
+ static int platformId = 0;
+ if (platformId == 0) {
+ wchar_t platformString[64];
+ if (SystemParametersInfo(SPI_GETPLATFORMTYPE, sizeof(platformString)/sizeof(*platformString),platformString,0)) {
+ if (0 == wcscmp(platformString, L"PocketPC") || 0 == wcscmp(platformString, L"Smartphone"))
+ platformId = 1;
+ else
+ platformId = 2;
+ }
+ }
+ if (platformId == 1 && QFSFileEnginePrivate::longFileName(path).size() > 256)
+ return false;
+#endif
+ return ::CreateDirectory((wchar_t*)QFSFileEnginePrivate::longFileName(path).utf16(), 0);
+}
+
+static inline bool rmDir(const QString &path)
+{
+ return ::RemoveDirectory((wchar_t*)QFSFileEnginePrivate::longFileName(path).utf16());
+}
+
+static bool isDirPath(const QString &dirPath, bool *existed)
+{
+ QString path = dirPath;
+ if (path.length() == 2 && path.at(1) == QLatin1Char(':'))
+ path += QLatin1Char('\\');
+
+ DWORD fileAttrib = ::GetFileAttributes((wchar_t*)QFSFileEnginePrivate::longFileName(path).utf16());
+ if (fileAttrib == INVALID_FILE_ATTRIBUTES) {
+ int errorCode = GetLastError();
+ if (errorCode == ERROR_ACCESS_DENIED || errorCode == ERROR_SHARING_VIOLATION) {
+ WIN32_FIND_DATA findData;
+ if (getFindData(QFSFileEnginePrivate::longFileName(path), findData))
+ fileAttrib = findData.dwFileAttributes;
+ }
+ }
+
+ if (existed)
+ *existed = fileAttrib != INVALID_FILE_ATTRIBUTES;
+
+ if (fileAttrib == INVALID_FILE_ATTRIBUTES)
+ return false;
+
+ return fileAttrib & FILE_ATTRIBUTE_DIRECTORY;
+}
+
+//static
+bool QFileSystemEngine::createDirectory(const QFileSystemEntry &entry, bool createParents)
+{
+ QString dirName = entry.filePath();
+ if (createParents) {
+ dirName = QDir::toNativeSeparators(QDir::cleanPath(dirName));
+ // We spefically search for / so \ would break it..
+ int oldslash = -1;
+ if (dirName.startsWith(QLatin1String("\\\\"))) {
+ // Don't try to create the root path of a UNC path;
+ // CreateDirectory() will just return ERROR_INVALID_NAME.
+ for (int i = 0; i < dirName.size(); ++i) {
+ if (dirName.at(i) != QDir::separator()) {
+ oldslash = i;
+ break;
+ }
+ }
+ if (oldslash != -1)
+ oldslash = dirName.indexOf(QDir::separator(), oldslash);
+ }
+ for (int slash=0; slash != -1; oldslash = slash) {
+ slash = dirName.indexOf(QDir::separator(), oldslash+1);
+ if (slash == -1) {
+ if (oldslash == dirName.length())
+ break;
+ slash = dirName.length();
+ }
+ if (slash) {
+ QString chunk = dirName.left(slash);
+ bool existed = false;
+ if (!isDirPath(chunk, &existed)) {
+ if (!existed) {
+ if (!mkDir(chunk))
+ return false;
+ } else {
+ return false;
+ }
+ }
+ }
+ }
+ return true;
+ }
+ return mkDir(entry.filePath());
+}
+
+//static
+bool QFileSystemEngine::removeDirectory(const QFileSystemEntry &entry, bool removeEmptyParents)
+{
+ QString dirName = entry.filePath();
+ if (removeEmptyParents) {
+ dirName = QDir::toNativeSeparators(QDir::cleanPath(dirName));
+ for (int oldslash = 0, slash=dirName.length(); slash > 0; oldslash = slash) {
+ QString chunk = dirName.left(slash);
+ if (chunk.length() == 2 && chunk.at(0).isLetter() && chunk.at(1) == QLatin1Char(':'))
+ break;
+ if (!isDirPath(chunk, 0))
+ return false;
+ if (!rmDir(chunk))
+ return oldslash != 0;
+ slash = dirName.lastIndexOf(QDir::separator(), oldslash-1);
+ }
+ return true;
+ }
+ return rmDir(entry.filePath());
+}
+
+//static
+QString QFileSystemEngine::rootPath()
+{
+#if defined(Q_OS_WINCE)
+ QString ret = QLatin1String("/");
+#elif defined(Q_FS_FAT)
+ QString ret = QString::fromLatin1(qgetenv("SystemDrive").constData());
+ if (ret.isEmpty())
+ ret = QLatin1String("c:");
+ ret.append(QLatin1Char('/'));
+#elif defined(Q_OS_OS2EMX)
+ char dir[4];
+ _abspath(dir, QLatin1String("/"), _MAX_PATH);
+ QString ret(dir);
+#endif
+ return ret;
+}
+
+//static
+QString QFileSystemEngine::homePath()
+{
+ QString ret;
+#if !defined(QT_NO_LIBRARY)
+ resolveLibs();
+ if (ptrGetUserProfileDirectoryW) {
+ HANDLE hnd = ::GetCurrentProcess();
+ HANDLE token = 0;
+ BOOL ok = ::OpenProcessToken(hnd, TOKEN_QUERY, &token);
+ if (ok) {
+ DWORD dwBufferSize = 0;
+ // First call, to determine size of the strings (with '\0').
+ ok = ptrGetUserProfileDirectoryW(token, NULL, &dwBufferSize);
+ if (!ok && dwBufferSize != 0) { // We got the required buffer size
+ wchar_t *userDirectory = new wchar_t[dwBufferSize];
+ // Second call, now we can fill the allocated buffer.
+ ok = ptrGetUserProfileDirectoryW(token, userDirectory, &dwBufferSize);
+ if (ok)
+ ret = QString::fromWCharArray(userDirectory);
+ delete [] userDirectory;
+ }
+ ::CloseHandle(token);
+ }
+ }
+#endif
+ if (ret.isEmpty() || !QFile::exists(ret)) {
+ ret = QString::fromLocal8Bit(qgetenv("USERPROFILE").constData());
+ if (ret.isEmpty() || !QFile::exists(ret)) {
+ ret = QString::fromLocal8Bit(qgetenv("HOMEDRIVE").constData())
+ + QString::fromLocal8Bit(qgetenv("HOMEPATH").constData());
+ if (ret.isEmpty() || !QFile::exists(ret)) {
+ ret = QString::fromLocal8Bit(qgetenv("HOME").constData());
+ if (ret.isEmpty() || !QFile::exists(ret)) {
+#if defined(Q_OS_WINCE)
+ ret = QLatin1String("\\My Documents");
+ if (!QFile::exists(ret))
+#endif
+ ret = rootPath();
+ }
+ }
+ }
+ }
+ return QDir::fromNativeSeparators(ret);
+}
+
+QString QFileSystemEngine::tempPath()
+{
+ QString ret;
+ wchar_t tempPath[MAX_PATH];
+ DWORD len = GetTempPath(MAX_PATH, tempPath);
+ if (len)
+ ret = QString::fromWCharArray(tempPath, len);
+ if (!ret.isEmpty()) {
+ while (ret.endsWith(QLatin1Char('\\')))
+ ret.chop(1);
+ ret = QDir::fromNativeSeparators(ret);
+ }
+ if (ret.isEmpty()) {
+#if !defined(Q_OS_WINCE)
+ ret = QLatin1String("c:/tmp");
+#else
+ ret = QLatin1String("/Temp");
+#endif
+ }
+ return ret;
+}
+
+bool QFileSystemEngine::setCurrentPath(const QFileSystemEntry &entry)
+{
+ QFileSystemMetaData meta;
+ fillMetaData(entry, meta, QFileSystemMetaData::ExistsAttribute | QFileSystemMetaData::DirectoryType);
+ if(!(meta.exists() && meta.isDirectory()))
+ return false;
+
+#if !defined(Q_OS_WINCE)
+ //TODO: this should really be using nativeFilePath(), but that returns a path in long format \\?\c:\foo
+ //which causes many problems later on when it's returned through currentPath()
+ return ::SetCurrentDirectory(reinterpret_cast<const wchar_t*>(QDir::toNativeSeparators(entry.filePath()).utf16())) != 0;
+#else
+ qfsPrivateCurrentDir = entry.filePath();
+ return true;
+#endif
+}
+
+QFileSystemEntry QFileSystemEngine::currentPath()
+{
+ QString ret;
+#if !defined(Q_OS_WINCE)
+ DWORD size = 0;
+ wchar_t currentName[PATH_MAX];
+ size = ::GetCurrentDirectory(PATH_MAX, currentName);
+ if (size != 0) {
+ if (size > PATH_MAX) {
+ wchar_t *newCurrentName = new wchar_t[size];
+ if (::GetCurrentDirectory(PATH_MAX, newCurrentName) != 0)
+ ret = QString::fromWCharArray(newCurrentName, size);
+ delete [] newCurrentName;
+ } else {
+ ret = QString::fromWCharArray(currentName, size);
+ }
+ }
+ if (ret.length() >= 2 && ret[1] == QLatin1Char(':'))
+ ret[0] = ret.at(0).toUpper(); // Force uppercase drive letters.
+#else
+ Q_UNUSED(fileName);
+ //TODO - a race condition exists when using currentPath / setCurrentPath from multiple threads
+ if (qfsPrivateCurrentDir.isEmpty())
+ qfsPrivateCurrentDir = QCoreApplication::applicationDirPath();
+
+ ret = qfsPrivateCurrentDir;
+#endif
+ return QFileSystemEntry(ret, QFileSystemEntry::FromNativePath());
+}
+
+//static
+bool QFileSystemEngine::createLink(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error)
+{
+ Q_ASSERT(false);
+ Q_UNUSED(source)
+ Q_UNUSED(target)
+ Q_UNUSED(error)
+
+ return false; // TODO implement; - code needs to be moved from qfsfileengine_win.cpp
+}
+
+//static
+bool QFileSystemEngine::copyFile(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error)
+{
+ bool ret = ::CopyFile((wchar_t*)source.nativeFilePath().utf16(),
+ (wchar_t*)target.nativeFilePath().utf16(), true) != 0;
+ if(!ret)
+ error = QSystemError(::GetLastError(), QSystemError::NativeError);
+ return ret;
+}
+
+//static
+bool QFileSystemEngine::renameFile(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error)
+{
+ bool ret = ::MoveFile((wchar_t*)source.nativeFilePath().utf16(),
+ (wchar_t*)target.nativeFilePath().utf16()) != 0;
+ if(!ret)
+ error = QSystemError(::GetLastError(), QSystemError::NativeError);
+ return ret;
+}
+
+//static
+bool QFileSystemEngine::removeFile(const QFileSystemEntry &entry, QSystemError &error)
+{
+ bool ret = ::DeleteFile((wchar_t*)entry.nativeFilePath().utf16()) != 0;
+ if(!ret)
+ error = QSystemError(::GetLastError(), QSystemError::NativeError);
+ return ret;
+}
+
+//static
+bool QFileSystemEngine::setPermissions(const QFileSystemEntry &entry, QFile::Permissions permissions, QSystemError &error,
+ QFileSystemMetaData *data)
+{
+ Q_UNUSED(data);
+ int mode = 0;
+
+ if (permissions & QFile::ReadOwner || permissions & QFile::ReadUser
+ || permissions & QFile::ReadGroup || permissions & QFile::ReadOther)
+ mode |= _S_IREAD;
+ if (permissions & QFile::WriteOwner || permissions & QFile::WriteUser
+ || permissions & QFile::WriteGroup || permissions & QFile::WriteOther)
+ mode |= _S_IWRITE;
+
+ if (mode == 0) // not supported
+ return false;
+
+ bool ret = (::_wchmod((wchar_t*)entry.nativeFilePath().utf16(), mode) == 0);
+ if(!ret)
+ error = QSystemError(errno, QSystemError::StandardLibraryError);
+ return ret;
+}
+
+static inline QDateTime fileTimeToQDateTime(const FILETIME *time)
+{
+ QDateTime ret;
+
+#if defined(Q_OS_WINCE)
+ SYSTEMTIME systime;
+ FILETIME ftime;
+ systime.wYear = 1970;
+ systime.wMonth = 1;
+ systime.wDay = 1;
+ systime.wHour = 0;
+ systime.wMinute = 0;
+ systime.wSecond = 0;
+ systime.wMilliseconds = 0;
+ systime.wDayOfWeek = 4;
+ SystemTimeToFileTime(&systime, &ftime);
+ unsigned __int64 acttime = (unsigned __int64)time->dwHighDateTime << 32 | time->dwLowDateTime;
+ FileTimeToSystemTime(time, &systime);
+ unsigned __int64 time1970 = (unsigned __int64)ftime.dwHighDateTime << 32 | ftime.dwLowDateTime;
+ unsigned __int64 difftime = acttime - time1970;
+ difftime /= 10000000;
+ ret.setTime_t((unsigned int)difftime);
+#else
+ SYSTEMTIME sTime, lTime;
+ FileTimeToSystemTime(time, &sTime);
+ SystemTimeToTzSpecificLocalTime(0, &sTime, &lTime);
+ ret.setDate(QDate(lTime.wYear, lTime.wMonth, lTime.wDay));
+ ret.setTime(QTime(lTime.wHour, lTime.wMinute, lTime.wSecond, lTime.wMilliseconds));
+#endif
+
+ return ret;
+}
+
+QDateTime QFileSystemMetaData::creationTime() const
+{
+ return fileTimeToQDateTime(&creationTime_);
+}
+QDateTime QFileSystemMetaData::modificationTime() const
+{
+ return fileTimeToQDateTime(&lastWriteTime_);
+}
+QDateTime QFileSystemMetaData::accessTime() const
+{
+ return fileTimeToQDateTime(&lastAccessTime_);
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/io/qfilesystementry.cpp b/src/corelib/io/qfilesystementry.cpp
new file mode 100644
index 0000000..d4c6d0a
--- /dev/null
+++ b/src/corelib/io/qfilesystementry.cpp
@@ -0,0 +1,383 @@
+/****************************************************************************
+**
+** 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 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 "qfilesystementry_p.h"
+
+#include <QtCore/qdir.h>
+#include <QtCore/qfile.h>
+#include <QtCore/private/qfsfileengine_p.h>
+#ifdef Q_OS_WIN
+#include <QtCore/qstringbuilder.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+#ifdef Q_OS_WIN
+static bool isUncRoot(const QString &server)
+{
+ QString localPath = QDir::toNativeSeparators(server);
+ if (!localPath.startsWith(QLatin1String("\\\\")))
+ return false;
+
+ int idx = localPath.indexOf(QLatin1Char('\\'), 2);
+ if (idx == -1 || idx + 1 == localPath.length())
+ return true;
+
+ localPath = localPath.right(localPath.length() - idx - 1).trimmed();
+ return localPath.isEmpty();
+}
+
+static inline QString fixIfRelativeUncPath(const QString &path)
+{
+ QString currentPath = QDir::currentPath();
+ if (currentPath.startsWith(QLatin1String("//")))
+ return currentPath % QChar(QLatin1Char('/')) % path;
+ return path;
+}
+#endif
+
+QFileSystemEntry::QFileSystemEntry()
+ : m_lastSeparator(0),
+ m_firstDotInFileName(0),
+ m_lastDotInFileName(0)
+{
+}
+
+/*!
+ \internal
+ Use this constructor when the path is supplied by user code, as it may contain a mix
+ of '/' and the native separator.
+ */
+QFileSystemEntry::QFileSystemEntry(const QString &filePath)
+ : m_filePath(QDir::fromNativeSeparators(filePath)),
+ m_lastSeparator(-2),
+ m_firstDotInFileName(-2),
+ m_lastDotInFileName(0)
+{
+}
+
+/*!
+ \internal
+ Use this constructor when the path is guaranteed to be in internal format, i.e. all
+ directory separators are '/' and not the native separator.
+ */
+QFileSystemEntry::QFileSystemEntry(const QString &filePath, FromInternalPath /* dummy */)
+ : m_filePath(filePath),
+ m_lastSeparator(-2),
+ m_firstDotInFileName(-2),
+ m_lastDotInFileName(0)
+{
+}
+
+/*!
+ \internal
+ Use this constructor when the path comes from a native API
+ */
+QFileSystemEntry::QFileSystemEntry(const NativePath &nativeFilePath, FromNativePath /* dummy */)
+ : m_nativeFilePath(nativeFilePath),
+ m_lastSeparator(-2),
+ m_firstDotInFileName(-2),
+ m_lastDotInFileName(0)
+{
+}
+
+QFileSystemEntry::QFileSystemEntry(const QString &filePath, const NativePath &nativeFilePath)
+ : m_filePath(QDir::fromNativeSeparators(filePath)),
+ m_nativeFilePath(nativeFilePath),
+ m_lastSeparator(-2),
+ m_firstDotInFileName(-2),
+ m_lastDotInFileName(0)
+{
+}
+
+QString QFileSystemEntry::filePath() const
+{
+ resolveFilePath();
+ return m_filePath;
+}
+
+QFileSystemEntry::NativePath QFileSystemEntry::nativeFilePath() const
+{
+ resolveNativeFilePath();
+ return m_nativeFilePath;
+}
+
+void QFileSystemEntry::resolveFilePath() const
+{
+ if (m_filePath.isEmpty() && !m_nativeFilePath.isEmpty()) {
+#if defined(QFILESYSTEMENTRY_NATIVE_PATH_IS_UTF16)
+ m_filePath = QDir::fromNativeSeparators(m_nativeFilePath);
+#ifdef Q_OS_WIN
+ if (m_filePath.startsWith(QLatin1String("//?/UNC/")))
+ m_filePath = m_filePath.remove(2,6);
+ if (m_filePath.startsWith(QLatin1String("//?/")))
+ m_filePath = m_filePath.remove(0,4);
+#endif
+#else
+ m_filePath = QDir::fromNativeSeparators(QFile::decodeName(m_nativeFilePath));
+#endif
+ }
+}
+
+void QFileSystemEntry::resolveNativeFilePath() const
+{
+ if (!m_filePath.isEmpty() && m_nativeFilePath.isEmpty()) {
+#ifdef Q_OS_WIN
+ QString filePath = m_filePath;
+ if (isRelative())
+ filePath = fixIfRelativeUncPath(m_filePath);
+ m_nativeFilePath = QFSFileEnginePrivate::longFileName(QDir::toNativeSeparators(filePath));
+#elif defined(QFILESYSTEMENTRY_NATIVE_PATH_IS_UTF16)
+ m_nativeFilePath = QDir::toNativeSeparators(m_filePath);
+#else
+ m_nativeFilePath = QFile::encodeName(QDir::toNativeSeparators(m_filePath));
+#endif
+ }
+}
+
+QString QFileSystemEntry::fileName() const
+{
+ findLastSeparator();
+#if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
+ if (m_lastSeparator == -1 && m_filePath.length() >= 2 && m_filePath.at(1) == QLatin1Char(':'))
+ return m_filePath.mid(2);
+#endif
+ return m_filePath.mid(m_lastSeparator + 1);
+}
+
+QString QFileSystemEntry::path() const
+{
+ findLastSeparator();
+ if (m_lastSeparator == -1) {
+#if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
+ if (m_filePath.length() >= 2 && m_filePath.at(1) == QLatin1Char(':'))
+ return m_filePath.left(2);
+#endif
+ return QString(QLatin1Char('.'));
+ }
+ if (m_lastSeparator == 0)
+ return QString(QLatin1Char('/'));
+#if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
+ if (m_lastSeparator == 2 && m_filePath.at(1) == QLatin1Char(':'))
+ return m_filePath.left(m_lastSeparator + 1);
+#endif
+ return m_filePath.left(m_lastSeparator);
+}
+
+QString QFileSystemEntry::baseName() const
+{
+ findFileNameSeparators();
+#if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
+ if (m_lastSeparator == -1 && m_filePath.length() >= 2 && m_filePath.at(1) == QLatin1Char(':'))
+ return m_filePath.mid(2);
+#endif
+ int length = -1;
+ if (m_firstDotInFileName >= 0) {
+ length = m_firstDotInFileName;
+ if (m_lastSeparator != -1) // avoid off by one
+ length--;
+ }
+ return m_filePath.mid(m_lastSeparator + 1, length);
+}
+
+QString QFileSystemEntry::completeBaseName() const
+{
+ findFileNameSeparators();
+#if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
+ if (m_lastSeparator == -1 && m_filePath.length() >= 2 && m_filePath.at(1) == QLatin1Char(':'))
+ return m_filePath.mid(2);
+#endif
+ int length = -1;
+ if (m_firstDotInFileName >= 0) {
+ length = m_firstDotInFileName + m_lastDotInFileName;
+ if (m_lastSeparator != -1) // avoid off by one
+ length--;
+ }
+ return m_filePath.mid(m_lastSeparator + 1, length);
+}
+
+QString QFileSystemEntry::suffix() const
+{
+ findFileNameSeparators();
+
+ if (m_lastDotInFileName == -1)
+ return QString();
+
+ return m_filePath.mid(qMax((qint16)0, m_lastSeparator) + m_firstDotInFileName + m_lastDotInFileName + 1);
+}
+
+QString QFileSystemEntry::completeSuffix() const
+{
+ findFileNameSeparators();
+ if (m_firstDotInFileName == -1)
+ return QString();
+
+ return m_filePath.mid(qMax((qint16)0, m_lastSeparator) + m_firstDotInFileName + 1);
+}
+
+#if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
+bool QFileSystemEntry::isRelative() const
+{
+ resolveFilePath();
+ return (m_filePath.isEmpty() || (!m_filePath.isEmpty() && (m_filePath[0].unicode() != '/')
+ && (!(m_filePath.length() >= 2 && m_filePath[1].unicode() == ':'))));
+}
+
+bool QFileSystemEntry::isAbsolute() const
+{
+ resolveFilePath();
+ return (!m_filePath.isEmpty() && ((m_filePath.length() >= 3
+ && (m_filePath[0].isLetter() && m_filePath[1].unicode() == ':' && m_filePath[2].unicode() == '/'))
+#ifdef Q_OS_WIN
+ || (m_filePath.length() >= 2 && (m_filePath.at(0) == QLatin1Char('/') && m_filePath.at(1) == QLatin1Char('/')))
+#endif
+ ));
+}
+#else
+bool QFileSystemEntry::isRelative() const
+{
+ return !isAbsolute();
+}
+
+bool QFileSystemEntry::isAbsolute() const
+{
+ resolveFilePath();
+ return (!m_filePath.isEmpty() && (m_filePath[0].unicode() == '/'));
+}
+#endif
+
+#if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
+bool QFileSystemEntry::isDriveRoot() const
+{
+ resolveFilePath();
+ return (m_filePath.length() == 3
+ && m_filePath.at(0).isLetter() && m_filePath.at(1) == QLatin1Char(':')
+ && m_filePath.at(2) == QLatin1Char('/'));
+}
+#endif
+
+bool QFileSystemEntry::isRoot() const
+{
+ resolveFilePath();
+ if (m_filePath == QLatin1String("/")
+#if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
+ || isDriveRoot()
+#if defined(Q_OS_WIN)
+ || isUncRoot(m_filePath)
+#endif
+#endif
+ )
+ return true;
+
+ return false;
+}
+
+bool QFileSystemEntry::isEmpty() const
+{
+ resolveNativeFilePath();
+ return m_nativeFilePath.isEmpty();
+}
+
+// private methods
+
+void QFileSystemEntry::findLastSeparator() const
+{
+ if (m_lastSeparator == -2) {
+ resolveFilePath();
+ m_lastSeparator = -1;
+ for (int i = m_filePath.size() - 1; i >= 0; --i) {
+ if (m_filePath[i].unicode() == '/') {
+ m_lastSeparator = i;
+ break;
+ }
+ }
+ }
+}
+
+void QFileSystemEntry::findFileNameSeparators() const
+{
+ if (m_firstDotInFileName == -2) {
+ resolveFilePath();
+ int firstDotInFileName = -1;
+ int lastDotInFileName = -1;
+ int lastSeparator = m_lastSeparator;
+
+ int stop;
+ if (lastSeparator < 0) {
+ lastSeparator = -1;
+ stop = 0;
+ } else {
+ stop = lastSeparator;
+ }
+
+ int i = m_filePath.size() - 1;
+ for (; i >= stop; --i) {
+ if (m_filePath[i].unicode() == '.') {
+ firstDotInFileName = lastDotInFileName = i;
+ break;
+ } else if (m_filePath[i].unicode() == '/') {
+ lastSeparator = i;
+ break;
+ }
+ }
+
+ if (lastSeparator != i) {
+ for (--i; i >= stop; --i) {
+ if (m_filePath[i].unicode() == '.')
+ firstDotInFileName = i;
+ else if (m_filePath[i].unicode() == '/') {
+ lastSeparator = i;
+ break;
+ }
+ }
+ }
+ m_lastSeparator = lastSeparator;
+ m_firstDotInFileName = firstDotInFileName == -1 ? -1 : firstDotInFileName - qMax(0, lastSeparator);
+ if (lastDotInFileName == -1)
+ m_lastDotInFileName = -1;
+ else if (firstDotInFileName == lastDotInFileName)
+ m_lastDotInFileName = 0;
+ else
+ m_lastDotInFileName = lastDotInFileName - firstDotInFileName;
+ }
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/io/qfilesystementry_p.h b/src/corelib/io/qfilesystementry_p.h
new file mode 100644
index 0000000..2ce0a83
--- /dev/null
+++ b/src/corelib/io/qfilesystementry_p.h
@@ -0,0 +1,126 @@
+/****************************************************************************
+**
+** 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 QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QFILESYSTEMENTRY_P_H_INCLUDED
+#define QFILESYSTEMENTRY_P_H_INCLUDED
+
+//
+// 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 <QtCore/qstring.h>
+#include <QtCore/qbytearray.h>
+
+#if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
+#define QFILESYSTEMENTRY_NATIVE_PATH_IS_UTF16
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class QFileSystemEntry
+{
+public:
+
+#ifndef QFILESYSTEMENTRY_NATIVE_PATH_IS_UTF16
+ typedef QByteArray NativePath;
+#else
+ typedef QString NativePath;
+#endif
+ struct FromNativePath{};
+ struct FromInternalPath{};
+
+ QFileSystemEntry();
+ explicit QFileSystemEntry(const QString &filePath);
+
+ QFileSystemEntry(const QString &filePath, FromInternalPath dummy);
+ QFileSystemEntry(const NativePath &nativeFilePath, FromNativePath dummy);
+ QFileSystemEntry(const QString &filePath, const NativePath &nativeFilePath);
+
+ QString filePath() const;
+ QString fileName() const;
+ QString path() const;
+ NativePath nativeFilePath() const;
+ QString baseName() const;
+ QString completeBaseName() const;
+ QString suffix() const;
+ QString completeSuffix() const;
+ bool isAbsolute() const;
+ bool isRelative() const;
+
+#if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
+ bool isDriveRoot() const;
+#endif
+ bool isRoot() const;
+
+ bool isEmpty() const;
+ void clear()
+ {
+ *this = QFileSystemEntry();
+ }
+
+private:
+ // creates the QString version out of the bytearray version
+ void resolveFilePath() const;
+ // creates the bytearray version out of the QString version
+ void resolveNativeFilePath() const;
+ // resolves the separator
+ void findLastSeparator() const;
+ // resolves the dots and the separator
+ void findFileNameSeparators() const;
+
+ mutable QString m_filePath; // always has slashes as separator
+ mutable NativePath m_nativeFilePath; // native encoding and separators
+
+ mutable qint16 m_lastSeparator; // index in m_filePath of last separator
+ mutable qint16 m_firstDotInFileName; // index after m_filePath for first dot (.)
+ mutable qint16 m_lastDotInFileName; // index after m_firstDotInFileName for last dot (.)
+};
+
+QT_END_NAMESPACE
+
+#endif // include guard
diff --git a/src/corelib/io/qfilesystemiterator_p.h b/src/corelib/io/qfilesystemiterator_p.h
new file mode 100644
index 0000000..66f4b1e
--- /dev/null
+++ b/src/corelib/io/qfilesystemiterator_p.h
@@ -0,0 +1,115 @@
+/****************************************************************************
+**
+** 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 QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QFILESYSTEMITERATOR_P_H_INCLUDED
+#define QFILESYSTEMITERATOR_P_H_INCLUDED
+
+//
+// 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 <QtCore/qglobal.h>
+#include <QtCore/qdir.h>
+#include <QtCore/qdiriterator.h>
+#include <QtCore/qstringlist.h>
+
+#include <QtCore/private/qfilesystementry_p.h>
+#include <QtCore/private/qfilesystemmetadata_p.h>
+
+// Platform-specific headers
+#if defined(Q_OS_WIN)
+#elif defined (Q_OS_SYMBIAN)
+#include <f32file.h>
+#else
+#include <QtCore/qscopedpointer.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class QFileSystemIterator
+{
+public:
+ QFileSystemIterator(const QFileSystemEntry &entry, QDir::Filters filters,
+ const QStringList &nameFilters, QDirIterator::IteratorFlags flags
+ = QDirIterator::FollowSymlinks | QDirIterator::Subdirectories);
+ ~QFileSystemIterator();
+
+ bool advance(QFileSystemEntry &fileEntry, QFileSystemMetaData &metaData);
+
+private:
+ QFileSystemEntry::NativePath nativePath;
+
+ // Platform-specific data
+#if defined(Q_OS_WIN)
+ QFileSystemEntry::NativePath dirPath;
+ HANDLE findFileHandle;
+ QStringList uncShares;
+ bool uncFallback;
+ int uncShareIndex;
+ bool onlyDirs;
+#elif defined (Q_OS_SYMBIAN)
+ RDir dirHandle;
+ TEntryArray entries;
+ TInt lastError;
+ TInt entryIndex;
+#else
+ QT_DIR *dir;
+ QT_DIRENT *dirEntry;
+#if defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_CYGWIN)
+ // for readdir_r
+ QScopedPointer<QT_DIRENT, QScopedPointerPodDeleter> mt_file;
+#endif
+ int lastError;
+#endif
+
+ Q_DISABLE_COPY(QFileSystemIterator)
+};
+
+QT_END_NAMESPACE
+
+#endif // include guard
diff --git a/src/corelib/io/qfilesystemiterator_symbian.cpp b/src/corelib/io/qfilesystemiterator_symbian.cpp
new file mode 100644
index 0000000..e316526
--- /dev/null
+++ b/src/corelib/io/qfilesystemiterator_symbian.cpp
@@ -0,0 +1,129 @@
+/****************************************************************************
+**
+** 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 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 "qfilesystemiterator_p.h"
+#include "qfilesystemengine_p.h"
+#include <QtCore/private/qcore_symbian_p.h>
+
+QT_BEGIN_NAMESPACE
+
+QFileSystemIterator::QFileSystemIterator(const QFileSystemEntry &path, QDir::Filters filters,
+ const QStringList &nameFilters, QDirIterator::IteratorFlags iteratorFlags)
+ : lastError(KErrNone), entryIndex(-1)
+{
+ RFs& fs = qt_s60GetRFs();
+
+ nativePath = path.nativeFilePath();
+ if (!nativePath.endsWith(QLatin1Char('\\')))
+ nativePath.append(QLatin1Char('\\'));
+
+ QString absPath = QFileSystemEngine::absoluteName(path).nativeFilePath();
+
+ if (!absPath.endsWith(QLatin1Char('\\')))
+ absPath.append(QLatin1Char('\\'));
+
+ int pathLen = absPath.length();
+ if (pathLen > KMaxFileName) {
+ lastError = KErrBadName;
+ return;
+ }
+
+ //set up server side filtering to reduce IPCs
+ //RDir won't accept all valid name filters e.g. "*. bar"
+ if (nameFilters.count() == 1 && !(filters & QDir::AllDirs) && iteratorFlags
+ == QDirIterator::NoIteratorFlags && pathLen + nameFilters[0].length()
+ <= KMaxFileName) {
+ //server side supports one mask - skip this for recursive mode or if only files should be filtered
+ absPath.append(nameFilters[0]);
+ }
+
+ TUint symbianMask = 0;
+ if ((filters & QDir::Dirs) || (filters & QDir::AllDirs) || (iteratorFlags
+ & QDirIterator::Subdirectories))
+ symbianMask |= KEntryAttDir; //include directories
+ if (filters & QDir::Hidden)
+ symbianMask |= KEntryAttHidden;
+ if (filters & QDir::System)
+ symbianMask |= KEntryAttSystem;
+ if (((filters & QDir::Files) == 0) && symbianMask == KEntryAttDir)
+ symbianMask |= KEntryAttMatchExclusive; //exclude non-directories
+ else if (symbianMask == 0) {
+ if ((filters & QDir::PermissionMask) == QDir::Writable)
+ symbianMask = KEntryAttMatchExclude | KEntryAttReadOnly;
+ else if ((filters & QDir::PermissionMask) == QDir::Readable)
+ symbianMask = KEntryAttMatchExclusive | KEntryAttReadOnly;
+ }
+
+ lastError = dirHandle.Open(fs, qt_QString2TPtrC(absPath), symbianMask);
+}
+
+QFileSystemIterator::~QFileSystemIterator()
+{
+ dirHandle.Close();
+}
+
+bool QFileSystemIterator::advance(QFileSystemEntry &fileEntry, QFileSystemMetaData &metaData)
+{
+ //1st time, lastError is result of dirHandle.Open(), entries.Count() is 0 and entryIndex is -1 so initial read is triggered
+ //subsequent times, read is triggered each time we reach the end of the entry list
+ //final time, lastError is KErrEof so we don't need to read anymore.
+ ++entryIndex;
+ if (lastError == KErrNone && entryIndex >= entries.Count()) {
+ lastError = dirHandle.Read(entries);
+ entryIndex = 0;
+ }
+
+ //each call to advance() gets the next entry from the entry list.
+ //from the final (or only) read call, KErrEof is returned together with a full buffer so we still need to go through the list
+ if ((lastError == KErrNone || lastError == KErrEof) && entryIndex < entries.Count()) {
+ Q_ASSERT(entryIndex >= 0);
+ const TEntry &entry(entries[entryIndex]);
+ fileEntry = QFileSystemEntry(nativePath + qt_TDesC2QString(entry.iName), QFileSystemEntry::FromNativePath());
+ metaData.fillFromTEntry(entry);
+ return true;
+ }
+
+ //TODO: error reporting, to allow user to distinguish empty directory from error condition.
+
+ return false;
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/io/qfilesystemiterator_unix.cpp b/src/corelib/io/qfilesystemiterator_unix.cpp
new file mode 100644
index 0000000..00ccd41
--- /dev/null
+++ b/src/corelib/io/qfilesystemiterator_unix.cpp
@@ -0,0 +1,113 @@
+/****************************************************************************
+**
+** 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 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 "qplatformdefs.h"
+#include "qfilesystemiterator_p.h"
+
+#include <stdlib.h>
+#include <errno.h>
+
+QT_BEGIN_NAMESPACE
+
+QFileSystemIterator::QFileSystemIterator(const QFileSystemEntry &entry, QDir::Filters filters,
+ const QStringList &nameFilters, QDirIterator::IteratorFlags flags)
+ : nativePath(entry.nativeFilePath())
+ , dir(0)
+ , dirEntry(0)
+ , lastError(0)
+{
+ Q_UNUSED(filters)
+ Q_UNUSED(nameFilters)
+ Q_UNUSED(flags)
+
+ if ((dir = QT_OPENDIR(nativePath.constData())) == 0) {
+ lastError = errno;
+ } else {
+
+ if (!nativePath.endsWith('/'))
+ nativePath.append('/');
+
+#if defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_CYGWIN)
+ // ### Race condition; we should use fpathconf and dirfd().
+ size_t maxPathName = ::pathconf(nativePath.constData(), _PC_NAME_MAX);
+ if (maxPathName == size_t(-1))
+ maxPathName = FILENAME_MAX;
+ maxPathName += sizeof(QT_DIRENT) + 1;
+
+ QT_DIRENT *p = reinterpret_cast<QT_DIRENT*>(::malloc(maxPathName));
+ Q_CHECK_PTR(p);
+
+ mt_file.reset(p);
+#endif
+ }
+}
+
+QFileSystemIterator::~QFileSystemIterator()
+{
+ if (dir)
+ QT_CLOSEDIR(dir);
+}
+
+bool QFileSystemIterator::advance(QFileSystemEntry &fileEntry, QFileSystemMetaData &metaData)
+{
+ if (!dir)
+ return false;
+
+#if defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_CYGWIN)
+ lastError = QT_READDIR_R(dir, mt_file.data(), &dirEntry);
+ if (lastError)
+ return false;
+#else
+ // ### add local lock to prevent breaking reentrancy
+ dirEntry = QT_READDIR(dir);
+#endif // _POSIX_THREAD_SAFE_FUNCTIONS
+
+ if (dirEntry) {
+ fileEntry = QFileSystemEntry(nativePath + QByteArray(dirEntry->d_name), QFileSystemEntry::FromNativePath());
+ metaData.fillFromDirEnt(*dirEntry);
+ return true;
+ }
+
+ lastError = errno;
+ return false;
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/io/qfilesystemiterator_win.cpp b/src/corelib/io/qfilesystemiterator_win.cpp
new file mode 100644
index 0000000..b5fce12
--- /dev/null
+++ b/src/corelib/io/qfilesystemiterator_win.cpp
@@ -0,0 +1,148 @@
+/****************************************************************************
+**
+** 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 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$
+**
+****************************************************************************/
+
+#if _WIN32_WINNT < 0x0500
+#undef _WIN32_WINNT
+#define _WIN32_WINNT 0x0500
+#endif
+
+#include "qfilesystemiterator_p.h"
+#include "qfilesystemengine_p.h"
+#include "qplatformdefs.h"
+
+#include <QtCore/qt_windows.h>
+
+QT_BEGIN_NAMESPACE
+
+bool done = true;
+
+QFileSystemIterator::QFileSystemIterator(const QFileSystemEntry &entry, QDir::Filters filters,
+ const QStringList &nameFilters, QDirIterator::IteratorFlags flags)
+ : nativePath(entry.nativeFilePath())
+ , dirPath(entry.filePath())
+ , findFileHandle(INVALID_HANDLE_VALUE)
+ , uncFallback(false)
+ , uncShareIndex(0)
+ , onlyDirs(false)
+{
+ Q_UNUSED(nameFilters)
+ Q_UNUSED(flags)
+ if (nativePath.endsWith(QLatin1String(".lnk"))) {
+ QFileSystemMetaData metaData;
+ QFileSystemEntry link = QFileSystemEngine::getLinkTarget(entry, metaData);
+ nativePath = link.nativeFilePath();
+ }
+ if (!nativePath.endsWith(QLatin1Char('\\')))
+ nativePath.append(QLatin1Char('\\'));
+ nativePath.append(QLatin1Char('*'));
+ if (!dirPath.endsWith(QLatin1Char('/')))
+ dirPath.append(QLatin1Char('/'));
+ if ((filters & (QDir::Dirs|QDir::Drives)) && (!(filters & (QDir::Files))))
+ onlyDirs = true;
+}
+
+QFileSystemIterator::~QFileSystemIterator()
+{
+ if (findFileHandle != INVALID_HANDLE_VALUE)
+ FindClose(findFileHandle);
+}
+
+bool QFileSystemIterator::advance(QFileSystemEntry &fileEntry, QFileSystemMetaData &metaData)
+{
+ bool haveData = false;
+ WIN32_FIND_DATA findData;
+
+ if (findFileHandle == INVALID_HANDLE_VALUE && !uncFallback) {
+ haveData = true;
+ int infoLevel = 0 ; // FindExInfoStandard;
+ DWORD dwAdditionalFlags = 0;
+ if (QSysInfo::windowsVersion() >= QSysInfo::WV_WINDOWS7) {
+ dwAdditionalFlags = 2; // FIND_FIRST_EX_LARGE_FETCH
+ infoLevel = 1 ; // FindExInfoBasic;
+ }
+ int searchOps = 0; // FindExSearchNameMatch
+ if (onlyDirs)
+ searchOps = 1 ; // FindExSearchLimitToDirectories
+ findFileHandle = FindFirstFileEx((const wchar_t *)nativePath.utf16(), FINDEX_INFO_LEVELS(infoLevel), &findData,
+ FINDEX_SEARCH_OPS(searchOps), 0, dwAdditionalFlags);
+ if (findFileHandle == INVALID_HANDLE_VALUE) {
+ if (nativePath.startsWith(QLatin1String("\\\\?\\UNC\\"))) {
+ QStringList parts = nativePath.split(QLatin1Char('\\'), QString::SkipEmptyParts);
+ if (parts.count() == 4 && QFileSystemEngine::uncListSharesOnServer(
+ QLatin1String("\\\\") + parts.at(2), &uncShares)) {
+ if (uncShares.isEmpty())
+ return false; // No shares found in the server
+ else
+ uncFallback = true;
+ }
+ }
+ }
+ }
+ if (findFileHandle == INVALID_HANDLE_VALUE && !uncFallback)
+ return false;
+ // Retrieve the new file information.
+ if (!haveData) {
+ if (uncFallback) {
+ if (++uncShareIndex >= uncShares.count())
+ return false;
+ } else {
+ if (!FindNextFile(findFileHandle, &findData))
+ return false;
+ }
+ }
+ // Create the new file system entry & meta data.
+ if (uncFallback) {
+ fileEntry = QFileSystemEntry(dirPath + uncShares.at(uncShareIndex));
+ metaData.fillFromFileAttribute(FILE_ATTRIBUTE_DIRECTORY);
+ return true;
+ } else {
+ QString fileName = QString::fromWCharArray(findData.cFileName);
+ fileEntry = QFileSystemEntry(dirPath + fileName);
+ metaData = QFileSystemMetaData();
+ if (!fileName.endsWith(QLatin1String(".lnk"))) {
+ metaData.fillFromFindData(findData, true);
+ }
+ return true;
+ }
+ return false;
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/io/qfilesystemmetadata_p.h b/src/corelib/io/qfilesystemmetadata_p.h
new file mode 100644
index 0000000..7f75b05
--- /dev/null
+++ b/src/corelib/io/qfilesystemmetadata_p.h
@@ -0,0 +1,400 @@
+/****************************************************************************
+**
+** 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 QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QFILESYSTEMMETADATA_P_H_INCLUDED
+#define QFILESYSTEMMETADATA_P_H_INCLUDED
+
+//
+// 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 "qplatformdefs.h"
+#include <QtCore/qglobal.h>
+#include <QtCore/qdatetime.h>
+#include <QtCore/qabstractfileengine.h>
+
+// Platform-specific includes
+#if defined(Q_OS_WIN)
+#ifndef IO_REPARSE_TAG_SYMLINK
+#define IO_REPARSE_TAG_SYMLINK (0xA000000CL)
+#endif
+#elif defined(Q_OS_SYMBIAN)
+#include <f32file.h>
+#include <QtCore/private/qdatetime_p.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class QFileSystemEngine;
+
+class QFileSystemMetaData
+{
+public:
+ QFileSystemMetaData()
+ : knownFlagsMask(0)
+ {
+ }
+
+ enum MetaDataFlag {
+ // Permissions, overlaps with QFile::Permissions
+ OtherReadPermission = 0x00000004, OtherWritePermission = 0x00000002, OtherExecutePermission = 0x00000001,
+ GroupReadPermission = 0x00000040, GroupWritePermission = 0x00000020, GroupExecutePermission = 0x00000010,
+ UserReadPermission = 0x00000400, UserWritePermission = 0x00000200, UserExecutePermission = 0x00000100,
+ OwnerReadPermission = 0x00004000, OwnerWritePermission = 0x00002000, OwnerExecutePermission = 0x00001000,
+
+ OtherPermissions = OtherReadPermission | OtherWritePermission | OtherExecutePermission,
+ GroupPermissions = GroupReadPermission | GroupWritePermission | GroupExecutePermission,
+ UserPermissions = UserReadPermission | UserWritePermission | UserExecutePermission,
+ OwnerPermissions = OwnerReadPermission | OwnerWritePermission | OwnerExecutePermission,
+
+ ReadPermissions = OtherReadPermission | GroupReadPermission | UserReadPermission | OwnerReadPermission,
+ WritePermissions = OtherWritePermission | GroupWritePermission | UserWritePermission | OwnerWritePermission,
+ ExecutePermissions = OtherExecutePermission | GroupExecutePermission | UserExecutePermission | OwnerExecutePermission,
+
+ Permissions = OtherPermissions | GroupPermissions | UserPermissions | OwnerPermissions,
+
+ // Type
+#ifdef Q_OS_SYMBIAN
+ LinkType = 0,
+#else
+ LinkType = 0x00010000,
+#endif
+ FileType = 0x00020000,
+ DirectoryType = 0x00040000,
+#if !defined(QWS) && !defined(Q_WS_QPA) && defined(Q_OS_MAC)
+ BundleType = 0x00080000,
+ AliasType = 0x08000000,
+#else
+ BundleType = 0x0,
+ AliasType = 0x0,
+#endif
+#if defined(Q_OS_WIN)
+ WinLnkType = 0x08000000, // Note: Uses the same position for AliasType on Mac
+#else
+ WinLnkType = 0x0,
+#endif
+ SequentialType = 0x00800000, // Note: overlaps with QAbstractFileEngine::RootFlag
+
+ LegacyLinkType = LinkType | AliasType | WinLnkType,
+
+ Type = LinkType | FileType | DirectoryType | BundleType | SequentialType | AliasType,
+
+ // Attributes
+ HiddenAttribute = 0x00100000,
+ SizeAttribute = 0x00200000, // Note: overlaps with QAbstractFileEngine::LocalDiskFlag
+ ExistsAttribute = 0x00400000,
+
+ Attributes = HiddenAttribute | SizeAttribute | ExistsAttribute,
+
+ // Times
+ CreationTime = 0x01000000, // Note: overlaps with QAbstractFileEngine::Refresh
+ ModificationTime = 0x02000000,
+ AccessTime = 0x04000000,
+
+ Times = CreationTime | ModificationTime | AccessTime,
+
+ // Owner IDs
+ UserId = 0x10000000,
+ GroupId = 0x20000000,
+
+ OwnerIds = UserId | GroupId,
+
+ PosixStatFlags = QFileSystemMetaData::OtherPermissions
+ | QFileSystemMetaData::GroupPermissions
+ | QFileSystemMetaData::OwnerPermissions
+ | QFileSystemMetaData::FileType
+ | QFileSystemMetaData::DirectoryType
+ | QFileSystemMetaData::SequentialType
+ | QFileSystemMetaData::SizeAttribute
+ | QFileSystemMetaData::Times
+ | QFileSystemMetaData::OwnerIds,
+
+ SymbianTEntryFlags = QFileSystemMetaData::Permissions
+ | QFileSystemMetaData::FileType
+ | QFileSystemMetaData::DirectoryType
+ | QFileSystemMetaData::SequentialType
+ | QFileSystemMetaData::Attributes
+ | QFileSystemMetaData::Times,
+#if defined(Q_OS_WIN)
+ WinStatFlags = QFileSystemMetaData::FileType
+ | QFileSystemMetaData::DirectoryType
+ | QFileSystemMetaData::HiddenAttribute
+ | QFileSystemMetaData::ExistsAttribute
+ | QFileSystemMetaData::SizeAttribute
+ | QFileSystemMetaData::Times,
+#endif
+
+ AllMetaDataFlags = 0xFFFFFFFF
+
+ };
+ Q_DECLARE_FLAGS(MetaDataFlags, MetaDataFlag)
+
+ bool hasFlags(MetaDataFlags flags) const
+ {
+ return ((knownFlagsMask & flags) == flags);
+ }
+
+ MetaDataFlags missingFlags(MetaDataFlags flags)
+ {
+ return flags & ~knownFlagsMask;
+ }
+
+ void clear()
+ {
+ knownFlagsMask = 0;
+ }
+
+ void clearFlags(MetaDataFlags flags = AllMetaDataFlags)
+ {
+ knownFlagsMask &= ~flags;
+ }
+
+ bool exists() const { return (entryFlags & ExistsAttribute); }
+
+ bool isLink() const { return (entryFlags & LinkType); }
+ bool isFile() const { return (entryFlags & FileType); }
+ bool isDirectory() const { return (entryFlags & DirectoryType); }
+ bool isBundle() const;
+ bool isAlias() const;
+ bool isLegacyLink() const { return (entryFlags & LegacyLinkType); }
+ bool isSequential() const { return (entryFlags & SequentialType); }
+ bool isHidden() const { return (entryFlags & HiddenAttribute); }
+#if defined(Q_OS_WIN)
+ bool isLnkFile() const { return (entryFlags & WinLnkType); }
+#else
+ bool isLnkFile() const { return false; }
+#endif
+
+ qint64 size() const { return size_; }
+
+ QFile::Permissions permissions() const { return QFile::Permissions(Permissions & entryFlags); }
+
+ QDateTime creationTime() const;
+ QDateTime modificationTime() const;
+ QDateTime accessTime() const;
+
+ QDateTime fileTime(QAbstractFileEngine::FileTime time) const;
+ uint userId() const;
+ uint groupId() const;
+ uint ownerId(QAbstractFileEngine::FileOwner owner) const;
+
+#ifdef Q_OS_UNIX
+ void fillFromStatBuf(const QT_STATBUF &statBuffer);
+ void fillFromDirEnt(const QT_DIRENT &statBuffer);
+#endif
+#ifdef Q_OS_SYMBIAN
+ void fillFromTEntry(const TEntry& entry);
+ void fillFromVolumeInfo(const TVolumeInfo& info);
+#endif
+
+#if defined(Q_OS_WIN)
+ inline void fillFromFileAttribute(DWORD fileAttribute, bool isDriveRoot = false);
+ inline void fillFromFindData(WIN32_FIND_DATA &findData, bool setLinkType = false, bool isDriveRoot = false);
+ inline void fillFromFindInfo(BY_HANDLE_FILE_INFORMATION &fileInfo);
+#endif
+private:
+ friend class QFileSystemEngine;
+
+ MetaDataFlags knownFlagsMask;
+ MetaDataFlags entryFlags;
+
+ qint64 size_;
+
+ // Platform-specific data goes here:
+#if defined(Q_OS_WIN)
+ DWORD fileAttribute_;
+ FILETIME creationTime_;
+ FILETIME lastAccessTime_;
+ FILETIME lastWriteTime_;
+#elif defined(Q_OS_SYMBIAN)
+ TTime modificationTime_;
+#else
+ time_t creationTime_;
+ time_t modificationTime_;
+ time_t accessTime_;
+
+ uint userId_;
+ uint groupId_;
+#endif
+
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(QFileSystemMetaData::MetaDataFlags)
+
+#if !defined(QWS) && !defined(Q_WS_QPA) && defined(Q_OS_MAC)
+inline bool QFileSystemMetaData::isBundle() const { return (entryFlags & BundleType); }
+inline bool QFileSystemMetaData::isAlias() const { return (entryFlags & AliasType); }
+#else
+inline bool QFileSystemMetaData::isBundle() const { return false; }
+inline bool QFileSystemMetaData::isAlias() const { return false; }
+#endif
+
+#if (defined(Q_OS_UNIX) && !defined (Q_OS_SYMBIAN)) || defined (Q_OS_WIN)
+inline QDateTime QFileSystemMetaData::fileTime(QAbstractFileEngine::FileTime time) const
+{
+ switch (time) {
+ case QAbstractFileEngine::ModificationTime:
+ return modificationTime();
+
+ case QAbstractFileEngine::AccessTime:
+ return accessTime();
+
+ case QAbstractFileEngine::CreationTime:
+ return creationTime();
+ }
+
+ return QDateTime();
+}
+#endif
+
+#if defined(Q_OS_UNIX) && !defined (Q_OS_SYMBIAN)
+inline QDateTime QFileSystemMetaData::creationTime() const { return QDateTime::fromTime_t(creationTime_); }
+inline QDateTime QFileSystemMetaData::modificationTime() const { return QDateTime::fromTime_t(modificationTime_); }
+inline QDateTime QFileSystemMetaData::accessTime() const { return QDateTime::fromTime_t(accessTime_); }
+
+inline uint QFileSystemMetaData::userId() const { return userId_; }
+inline uint QFileSystemMetaData::groupId() const { return groupId_; }
+
+inline uint QFileSystemMetaData::ownerId(QAbstractFileEngine::FileOwner owner) const
+{
+ if (owner == QAbstractFileEngine::OwnerUser)
+ return userId();
+ else
+ return groupId();
+}
+#endif
+
+#ifdef Q_OS_SYMBIAN
+inline QDateTime QFileSystemMetaData::creationTime() const { return modificationTime(); }
+inline QDateTime QFileSystemMetaData::modificationTime() const { return qt_symbian_TTime_To_QDateTime(modificationTime_); }
+inline QDateTime QFileSystemMetaData::accessTime() const { return modificationTime(); }
+
+inline QDateTime QFileSystemMetaData::fileTime(QAbstractFileEngine::FileTime time) const
+{
+ Q_UNUSED(time);
+ return modificationTime();
+}
+inline uint QFileSystemMetaData::userId() const { return (uint) -2; }
+inline uint QFileSystemMetaData::groupId() const { return (uint) -2; }
+inline uint QFileSystemMetaData::ownerId(QAbstractFileEngine::FileOwner owner) const
+{
+ Q_UNUSED(owner);
+ return (uint) -2;
+}
+#endif
+
+#if defined(Q_OS_WIN)
+inline uint QFileSystemMetaData::userId() const { return (uint) -2; }
+inline uint QFileSystemMetaData::groupId() const { return (uint) -2; }
+inline uint QFileSystemMetaData::ownerId(QAbstractFileEngine::FileOwner owner) const
+{
+ if (owner == QAbstractFileEngine::OwnerUser)
+ return userId();
+ else
+ return groupId();
+}
+
+inline void QFileSystemMetaData::fillFromFileAttribute(DWORD fileAttribute,bool isDriveRoot)
+{
+ fileAttribute_ = fileAttribute;
+ // Ignore the hidden attribute for drives.
+ if (!isDriveRoot && (fileAttribute_ & FILE_ATTRIBUTE_HIDDEN))
+ entryFlags |= HiddenAttribute;
+ entryFlags |= ((fileAttribute & FILE_ATTRIBUTE_DIRECTORY) ? DirectoryType: FileType);
+ entryFlags |= ExistsAttribute;
+ knownFlagsMask |= FileType | DirectoryType | HiddenAttribute | ExistsAttribute;
+}
+
+inline void QFileSystemMetaData::fillFromFindData(WIN32_FIND_DATA &findData, bool setLinkType, bool isDriveRoot)
+{
+ fillFromFileAttribute(findData.dwFileAttributes, isDriveRoot);
+ creationTime_ = findData.ftCreationTime;
+ lastAccessTime_ = findData.ftLastAccessTime;
+ lastWriteTime_ = findData.ftLastWriteTime;
+ if (fileAttribute_ & FILE_ATTRIBUTE_DIRECTORY) {
+ size_ = 0;
+ } else {
+ size_ = findData.nFileSizeHigh;
+ size_ <<= 32;
+ size_ += findData.nFileSizeLow;
+ }
+ knownFlagsMask |= Times | SizeAttribute;
+ if (setLinkType) {
+ knownFlagsMask |= LinkType;
+ entryFlags &= ~LinkType;
+#if !defined(Q_OS_WINCE)
+ if ((fileAttribute_ & FILE_ATTRIBUTE_REPARSE_POINT)
+ && (findData.dwReserved0 == IO_REPARSE_TAG_SYMLINK
+ || findData.dwReserved0 == IO_REPARSE_TAG_MOUNT_POINT)) {
+ entryFlags |= LinkType;
+ }
+#endif
+
+ }
+}
+
+inline void QFileSystemMetaData::fillFromFindInfo(BY_HANDLE_FILE_INFORMATION &fileInfo)
+{
+ fillFromFileAttribute(fileInfo.dwFileAttributes);
+ creationTime_ = fileInfo.ftCreationTime;
+ lastAccessTime_ = fileInfo.ftLastAccessTime;
+ lastWriteTime_ = fileInfo.ftLastWriteTime;
+ if (fileAttribute_ & FILE_ATTRIBUTE_DIRECTORY) {
+ size_ = 0;
+ } else {
+ size_ = fileInfo.nFileSizeHigh;
+ size_ <<= 32;
+ size_ += fileInfo.nFileSizeLow;
+ }
+ knownFlagsMask |= Times | SizeAttribute;
+}
+#endif
+
+QT_END_NAMESPACE
+
+#endif // include guard
diff --git a/src/corelib/io/qfsfileengine.cpp b/src/corelib/io/qfsfileengine.cpp
index 62b9981..ae301f7 100644
--- a/src/corelib/io/qfsfileengine.cpp
+++ b/src/corelib/io/qfsfileengine.cpp
@@ -41,6 +41,7 @@
#include "qfsfileengine_p.h"
#include "qfsfileengine_iterator_p.h"
+#include "qfilesystemengine_p.h"
#include "qdatetime.h"
#include "qdiriterator.h"
#include "qset.h"
@@ -119,6 +120,9 @@ void QFSFileEnginePrivate::init()
openMode = QIODevice::NotOpen;
fd = -1;
fh = 0;
+#ifdef Q_OS_SYMBIAN
+ fileHandleForMaps = -1;
+#endif
lastIOCommand = IOFlushCommand;
lastFlushFailed = false;
closeFileHandle = false;
@@ -133,117 +137,13 @@ void QFSFileEnginePrivate::init()
}
/*!
- \internal
-
- Returns the canonicalized form of \a path (i.e., with all symlinks
- resolved, and all redundant path elements removed.
-*/
-QString QFSFileEnginePrivate::canonicalized(const QString &path)
-{
- if (path.isEmpty())
- return path;
-
- // FIXME let's see if this stuff works, then we might be able to remove some of the other code.
-#if defined(Q_OS_UNIX) && !defined(Q_OS_SYMBIAN)
- if (path.size() == 1 && path.at(0) == QLatin1Char('/'))
- return path;
-#endif
-#if defined(Q_OS_LINUX) || defined(Q_OS_SYMBIAN) || defined(Q_OS_MAC)
- // ... but Linux with uClibc does not have it
-#if !defined(__UCLIBC__)
- char *ret = 0;
-#if defined(Q_OS_MAC) && !defined(QT_NO_CORESERVICES)
- // Mac OS X 10.5.x doesn't support the realpath(X,0) extension we use here.
- if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_6) {
- ret = realpath(path.toLocal8Bit().constData(), (char*)0);
- } else {
- // on 10.5 we can use FSRef to resolve the file path.
- FSRef fsref;
- if (FSPathMakeRef((const UInt8 *)QDir::cleanPath(path).toUtf8().data(), &fsref, 0) == noErr) {
- CFURLRef urlref = CFURLCreateFromFSRef(NULL, &fsref);
- CFStringRef canonicalPath = CFURLCopyFileSystemPath(urlref, kCFURLPOSIXPathStyle);
- QString ret = QCFString::toQString(canonicalPath);
- CFRelease(canonicalPath);
- CFRelease(urlref);
- return ret;
- }
- }
-#else
- ret = realpath(path.toLocal8Bit().constData(), (char*)0);
-#endif
- if (ret) {
- QString canonicalPath = QDir::cleanPath(QString::fromLocal8Bit(ret));
- free(ret);
- return canonicalPath;
- }
-#endif
-#endif
-
- QFileInfo fi;
- const QChar slash(QLatin1Char('/'));
- QString tmpPath = path;
- int separatorPos = 0;
- QSet<QString> nonSymlinks;
- QSet<QString> known;
-
- known.insert(path);
- do {
-#ifdef Q_OS_WIN
- if (separatorPos == 0) {
- if (tmpPath.size() >= 2 && tmpPath.at(0) == slash && tmpPath.at(1) == slash) {
- // UNC, skip past the first two elements
- separatorPos = tmpPath.indexOf(slash, 2);
- } else if (tmpPath.size() >= 3 && tmpPath.at(1) == QLatin1Char(':') && tmpPath.at(2) == slash) {
- // volume root, skip since it can not be a symlink
- separatorPos = 2;
- }
- }
- if (separatorPos != -1)
-#endif
- separatorPos = tmpPath.indexOf(slash, separatorPos + 1);
- QString prefix = separatorPos == -1 ? tmpPath : tmpPath.left(separatorPos);
- if (
-#ifdef Q_OS_SYMBIAN
- // Symbian doesn't support directory symlinks, so do not check for link unless we
- // are handling the last path element. This not only slightly improves performance,
- // but also saves us from lot of unnecessary platform security check failures
- // when dealing with files under *:/private directories.
- separatorPos == -1 &&
-#endif
- !nonSymlinks.contains(prefix)) {
- fi.setFile(prefix);
- if (fi.isSymLink()) {
- QString target = fi.symLinkTarget();
- if(QFileInfo(target).isRelative())
- target = fi.absolutePath() + slash + target;
- if (separatorPos != -1) {
- if (fi.isDir() && !target.endsWith(slash))
- target.append(slash);
- target.append(tmpPath.mid(separatorPos));
- }
- tmpPath = QDir::cleanPath(target);
- separatorPos = 0;
-
- if (known.contains(tmpPath))
- return QString();
- known.insert(tmpPath);
- } else {
- nonSymlinks.insert(prefix);
- }
- }
- } while (separatorPos != -1);
-
- return QDir::cleanPath(tmpPath);
-}
-
-/*!
Constructs a QFSFileEngine for the file name \a file.
*/
-QFSFileEngine::QFSFileEngine(const QString &file) : QAbstractFileEngine(*new QFSFileEnginePrivate)
+QFSFileEngine::QFSFileEngine(const QString &file)
+ : QAbstractFileEngine(*new QFSFileEnginePrivate)
{
Q_D(QFSFileEngine);
- d->filePath = QDir::fromNativeSeparators(file);
- d->nativeInitFileName();
+ d->fileEntry = QFileSystemEntry(file);
}
/*!
@@ -292,8 +192,7 @@ void QFSFileEngine::setFileName(const QString &file)
{
Q_D(QFSFileEngine);
d->init();
- d->filePath = QDir::fromNativeSeparators(file);
- d->nativeInitFileName();
+ d->fileEntry = QFileSystemEntry(file);
}
/*!
@@ -302,7 +201,7 @@ void QFSFileEngine::setFileName(const QString &file)
bool QFSFileEngine::open(QIODevice::OpenMode openMode)
{
Q_D(QFSFileEngine);
- if (d->filePath.isEmpty()) {
+ if (d->fileEntry.isEmpty()) {
qWarning("QFSFileEngine::open: No file name specified");
setError(QFile::OpenError, QLatin1String("No file name specified"));
return false;
@@ -344,8 +243,7 @@ bool QFSFileEngine::open(QIODevice::OpenMode openMode, FILE *fh)
d->openMode = openMode;
d->lastFlushFailed = false;
d->closeFileHandle = false;
- d->nativeFilePath.clear();
- d->filePath.clear();
+ d->fileEntry.clear();
d->tried_stat = 0;
d->fd = -1;
@@ -401,8 +299,7 @@ bool QFSFileEngine::open(QIODevice::OpenMode openMode, int fd)
d->openMode = openMode;
d->lastFlushFailed = false;
d->closeFileHandle = false;
- d->nativeFilePath.clear();
- d->filePath.clear();
+ d->fileEntry.clear();
d->fh = 0;
d->fd = -1;
d->tried_stat = 0;
@@ -458,7 +355,12 @@ bool QFSFileEngine::close()
bool QFSFileEnginePrivate::closeFdFh()
{
Q_Q(QFSFileEngine);
- if (fd == -1 && !fh)
+ if (fd == -1 && !fh
+#ifdef Q_OS_SYMBIAN
+ && !symbianFile.SubSessionHandle()
+ && fileHandleForMaps == -1
+#endif
+ )
return false;
// Flush the file if it's buffered, and if the last flush didn't fail.
@@ -466,10 +368,24 @@ bool QFSFileEnginePrivate::closeFdFh()
bool closed = true;
tried_stat = 0;
+#ifdef Q_OS_SYMBIAN
+ // Map handle is always owned by us so always close it
+ if (fileHandleForMaps >= 0) {
+ QT_CLOSE(fileHandleForMaps);
+ fileHandleForMaps = -1;
+ }
+#endif
+
// Close the file if we created the handle.
if (closeFileHandle) {
int ret;
do {
+#ifdef Q_OS_SYMBIAN
+ if (symbianFile.SubSessionHandle()) {
+ symbianFile.Close();
+ ret = 0;
+ } else
+#endif
if (fh) {
// Close buffered file.
ret = fclose(fh) != 0 ? -1 : 0;
@@ -549,28 +465,19 @@ qint64 QFSFileEngine::size() const
/*!
\internal
*/
+#ifndef Q_OS_WIN
qint64 QFSFileEnginePrivate::sizeFdFh() const
{
Q_Q(const QFSFileEngine);
- // ### Fix this function, it should not stat unless the file is closed.
- QT_STATBUF st;
- int ret = 0;
const_cast<QFSFileEngine *>(q)->flush();
- if (fh && nativeFilePath.isEmpty()) {
- // Buffered stdlib mode.
- // ### This should really be an ftell
- ret = QT_FSTAT(QT_FILENO(fh), &st);
- } else if (fd == -1) {
- // Stateless stat.
- ret = QT_STAT(nativeFilePath.constData(), &st);
- } else {
- // Unbuffered stdio mode.
- ret = QT_FSTAT(fd, &st);
- }
- if (ret == -1)
+
+ tried_stat = 0;
+ metaData.clearFlags(QFileSystemMetaData::SizeAttribute);
+ if (!doStat(QFileSystemMetaData::SizeAttribute))
return 0;
- return st.st_size;
+ return metaData.size();
}
+#endif
/*!
\reimp
@@ -877,18 +784,14 @@ bool QFSFileEngine::isSequential() const
/*!
\internal
*/
+#ifdef Q_OS_UNIX
bool QFSFileEnginePrivate::isSequentialFdFh() const
{
- if (!tried_stat)
- doStat();
- if (could_stat) {
-#ifdef Q_OS_UNIX
- return (st.st_mode & S_IFMT) != S_IFREG;
- // ### WINDOWS!
-#endif
- }
+ if (doStat(QFileSystemMetaData::SequentialType))
+ return metaData.isSequential();
return true;
}
+#endif
/*!
\reimp
diff --git a/src/corelib/io/qfsfileengine_iterator.cpp b/src/corelib/io/qfsfileengine_iterator.cpp
index 7e7d70a..f6f08c7 100644
--- a/src/corelib/io/qfsfileengine_iterator.cpp
+++ b/src/corelib/io/qfsfileengine_iterator.cpp
@@ -40,6 +40,7 @@
****************************************************************************/
#include "qfsfileengine_iterator_p.h"
+#include "qfileinfo_p.h"
#include "qvariant.h"
#ifndef QT_NO_FSFILEENGINE
@@ -48,13 +49,23 @@ QT_BEGIN_NAMESPACE
QFSFileEngineIterator::QFSFileEngineIterator(QDir::Filters filters, const QStringList &filterNames)
: QAbstractFileEngineIterator(filters, filterNames)
+ , done(false)
{
- newPlatformSpecifics();
}
QFSFileEngineIterator::~QFSFileEngineIterator()
{
- deletePlatformSpecifics();
+}
+
+bool QFSFileEngineIterator::hasNext() const
+{
+ if (!done && !nativeIterator) {
+ nativeIterator.reset(new QFileSystemIterator(QFileSystemEntry(path()),
+ filters(), nameFilters()));
+ advance();
+ }
+
+ return !done;
}
QString QFSFileEngineIterator::next()
@@ -66,14 +77,28 @@ QString QFSFileEngineIterator::next()
return currentFilePath();
}
+void QFSFileEngineIterator::advance() const
+{
+ currentInfo = nextInfo;
+
+ QFileSystemEntry entry;
+ QFileSystemMetaData data;
+ if (nativeIterator->advance(entry, data)) {
+ nextInfo = QFileInfo(new QFileInfoPrivate(entry, data));
+ } else {
+ done = true;
+ nativeIterator.reset();
+ }
+}
+
QString QFSFileEngineIterator::currentFileName() const
{
- return currentEntry;
+ return currentInfo.fileName();
}
QFileInfo QFSFileEngineIterator::currentFileInfo() const
{
- return QAbstractFileEngineIterator::currentFileInfo();
+ return currentInfo;
}
QT_END_NAMESPACE
diff --git a/src/corelib/io/qfsfileengine_iterator_p.h b/src/corelib/io/qfsfileengine_iterator_p.h
index be670e0..ac9598d 100644
--- a/src/corelib/io/qfsfileengine_iterator_p.h
+++ b/src/corelib/io/qfsfileengine_iterator_p.h
@@ -54,6 +54,7 @@
//
#include "qabstractfileengine.h"
+#include "qfilesystemiterator_p.h"
#include "qdir.h"
#ifndef QT_NO_FSFILEENGINE
@@ -76,13 +77,11 @@ public:
QFileInfo currentFileInfo() const;
private:
- QFSFileEngineIteratorPlatformSpecificData *platform;
- friend class QFSFileEngineIteratorPlatformSpecificData;
- void newPlatformSpecifics();
- void deletePlatformSpecifics();
- void advance();
-
- QString currentEntry;
+ void advance() const;
+ mutable QScopedPointer<QFileSystemIterator> nativeIterator;
+ mutable QFileInfo currentInfo;
+ mutable QFileInfo nextInfo;
+ mutable bool done;
};
QT_END_NAMESPACE
diff --git a/src/corelib/io/qfsfileengine_iterator_unix.cpp b/src/corelib/io/qfsfileengine_iterator_unix.cpp
deleted file mode 100644
index bfdb03e..0000000
--- a/src/corelib/io/qfsfileengine_iterator_unix.cpp
+++ /dev/null
@@ -1,140 +0,0 @@
-/****************************************************************************
-**
-** 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 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 "qplatformdefs.h"
-#include "qfsfileengine_iterator_p.h"
-
-#include <QtCore/qvariant.h>
-
-#ifndef QT_NO_FSFILEENGINE
-
-QT_BEGIN_NAMESPACE
-
-class QFSFileEngineIteratorPlatformSpecificData
-{
-public:
- inline QFSFileEngineIteratorPlatformSpecificData()
- : dir(0), dirEntry(0), done(false)
-#if defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_CYGWIN) && !defined(Q_OS_SYMBIAN)
- , mt_file(0)
-#endif
- {}
-
- QT_DIR *dir;
- QT_DIRENT *dirEntry;
- bool done;
-
-#if defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_CYGWIN) && !defined(Q_OS_SYMBIAN)
- // for readdir_r
- QT_DIRENT *mt_file;
-#endif
-};
-
-void QFSFileEngineIterator::advance()
-{
- currentEntry = platform->dirEntry ? QFile::decodeName(QByteArray(platform->dirEntry->d_name)) : QString();
-
- if (!platform->dir)
- return;
-
-#if defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_CYGWIN) && !defined(Q_OS_SYMBIAN)
- if (QT_READDIR_R(platform->dir, platform->mt_file, &platform->dirEntry) != 0)
- platform->done = true;
-#else
- // ### add local lock to prevent breaking reentrancy
- platform->dirEntry = QT_READDIR(platform->dir);
-#endif // _POSIX_THREAD_SAFE_FUNCTIONS
- if (!platform->dirEntry) {
- QT_CLOSEDIR(platform->dir);
- platform->dir = 0;
- platform->done = true;
-#if defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_CYGWIN) && !defined(Q_OS_SYMBIAN)
- delete [] platform->mt_file;
- platform->mt_file = 0;
-#endif
- }
-}
-
-void QFSFileEngineIterator::newPlatformSpecifics()
-{
- platform = new QFSFileEngineIteratorPlatformSpecificData;
-}
-
-void QFSFileEngineIterator::deletePlatformSpecifics()
-{
- if (platform->dir) {
- QT_CLOSEDIR(platform->dir);
-#if defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_CYGWIN) && !defined(Q_OS_SYMBIAN)
- delete [] platform->mt_file;
- platform->mt_file = 0;
-#endif
- }
- delete platform;
- platform = 0;
-}
-
-bool QFSFileEngineIterator::hasNext() const
-{
- if (!platform->done && !platform->dir) {
- QFSFileEngineIterator *that = const_cast<QFSFileEngineIterator *>(this);
- if ((that->platform->dir = QT_OPENDIR(QFile::encodeName(path()).data())) == 0) {
- that->platform->done = true;
- } else {
- // ### Race condition; we should use fpathconf and dirfd().
- long maxPathName = ::pathconf(QFile::encodeName(path()).data(), _PC_NAME_MAX);
- if ((int) maxPathName == -1)
- maxPathName = FILENAME_MAX;
- maxPathName += sizeof(QT_DIRENT) + 1;
-#if defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_CYGWIN) && !defined(Q_OS_SYMBIAN)
- if (that->platform->mt_file)
- delete [] that->platform->mt_file;
- that->platform->mt_file = (QT_DIRENT *)new char[maxPathName];
-#endif
-
- that->advance();
- }
- }
- return !platform->done;
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_FSFILEENGINE
diff --git a/src/corelib/io/qfsfileengine_iterator_win.cpp b/src/corelib/io/qfsfileengine_iterator_win.cpp
deleted file mode 100644
index 7181025..0000000
--- a/src/corelib/io/qfsfileengine_iterator_win.cpp
+++ /dev/null
@@ -1,161 +0,0 @@
-/****************************************************************************
-**
-** 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 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 "qfsfileengine_iterator_p.h"
-#include "qfsfileengine_p.h"
-#include "qplatformdefs.h"
-
-#include <QtCore/qvariant.h>
-
-QT_BEGIN_NAMESPACE
-
-class QFSFileEngineIteratorPlatformSpecificData
-{
-public:
- inline QFSFileEngineIteratorPlatformSpecificData()
- : uncShareIndex(-1), findFileHandle(INVALID_HANDLE_VALUE),
- done(false), uncFallback(false)
- {}
-
- QFSFileEngineIterator *it;
-
- QStringList uncShares;
- int uncShareIndex;
-
- HANDLE findFileHandle;
- WIN32_FIND_DATA findData;
- bool done;
- bool uncFallback;
-
- void saveCurrentFileName();
-};
-
-void QFSFileEngineIteratorPlatformSpecificData::saveCurrentFileName()
-{
- if (uncFallback) {
- // Windows share / UNC path
- it->currentEntry = uncShares.at(uncShareIndex - 1);
- } else {
- // Local directory
- it->currentEntry = QString::fromWCharArray(findData.cFileName);
- }
-}
-
-void QFSFileEngineIterator::advance()
-{
- platform->saveCurrentFileName();
-
- if (platform->done)
- return;
-
- if (platform->uncFallback) {
- ++platform->uncShareIndex;
- } else if (platform->findFileHandle != INVALID_HANDLE_VALUE) {
- if (!FindNextFile(platform->findFileHandle, &platform->findData)) {
- platform->done = true;
- FindClose(platform->findFileHandle);
- }
- }
-}
-
-void QFSFileEngineIterator::newPlatformSpecifics()
-{
- platform = new QFSFileEngineIteratorPlatformSpecificData;
- platform->it = this;
-}
-
-void QFSFileEngineIterator::deletePlatformSpecifics()
-{
- delete platform;
- platform = 0;
-}
-
-bool QFSFileEngineIterator::hasNext() const
-{
- if (platform->done)
- return false;
-
- if (platform->uncFallback)
- return platform->uncShareIndex > 0 && platform->uncShareIndex <= platform->uncShares.size();
-
- if (platform->findFileHandle == INVALID_HANDLE_VALUE) {
- QString path = this->path();
- // Local directory
- if (path.endsWith(QLatin1String(".lnk")))
- path = QFileInfo(path).readLink();
-
- if (!path.endsWith(QLatin1Char('/')))
- path.append(QLatin1Char('/'));
- path.append(QLatin1String("*.*"));
-
- QString fileName = QFSFileEnginePrivate::longFileName(path);
- platform->findFileHandle = FindFirstFile((const wchar_t *)fileName.utf16(), &platform->findData);
-
- if (platform->findFileHandle == INVALID_HANDLE_VALUE) {
- if (path.startsWith(QLatin1String("//"))) {
- path = this->path();
- // UNC
- QStringList parts = QDir::toNativeSeparators(path).split(QLatin1Char('\\'), QString::SkipEmptyParts);
-
- if (parts.count() == 1 && QFSFileEnginePrivate::uncListSharesOnServer(QLatin1String("\\\\") + parts.at(0),
- &platform->uncShares)) {
- if (platform->uncShares.isEmpty()) {
- platform->done = true;
- } else {
- platform->uncShareIndex = 1;
- }
- platform->uncFallback = true;
- } else {
- platform->done = true;
- }
- } else {
- platform->done = true;
- }
- }
-
- if (!platform->done && (!platform->uncFallback || !platform->uncShares.isEmpty()))
- platform->saveCurrentFileName();
- }
-
- return !platform->done;
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/io/qfsfileengine_p.h b/src/corelib/io/qfsfileengine_p.h
index e9e55f3..7c088b8 100644
--- a/src/corelib/io/qfsfileengine_p.h
+++ b/src/corelib/io/qfsfileengine_p.h
@@ -56,8 +56,14 @@
#include "qplatformdefs.h"
#include "QtCore/qfsfileengine.h"
#include "private/qabstractfileengine_p.h"
+#include <QtCore/private/qfilesystementry_p.h>
+#include <QtCore/private/qfilesystemmetadata_p.h>
#include <qhash.h>
+#ifdef Q_OS_SYMBIAN
+#include <f32file.h>
+#endif
+
#ifndef QT_NO_FSFILEENGINE
QT_BEGIN_NAMESPACE
@@ -74,13 +80,10 @@ public:
#ifdef Q_WS_WIN
static QString longFileName(const QString &path);
#endif
- static QString canonicalized(const QString &path);
- QString filePath;
- QByteArray nativeFilePath;
+ QFileSystemEntry fileEntry;
QIODevice::OpenMode openMode;
- void nativeInitFileName();
bool nativeOpen(QIODevice::OpenMode openMode);
bool openFh(QIODevice::OpenMode flags, FILE *fh);
bool openFd(QIODevice::OpenMode flags, int fd);
@@ -89,7 +92,9 @@ public:
bool nativeFlush();
bool flushFh();
qint64 nativeSize() const;
+#ifndef Q_OS_WIN
qint64 sizeFdFh() const;
+#endif
qint64 nativePos() const;
qint64 posFdFh() const;
bool nativeSeek(qint64);
@@ -102,12 +107,42 @@ public:
qint64 writeFdFh(const char *data, qint64 len);
int nativeHandle() const;
bool nativeIsSequential() const;
+#ifndef Q_OS_WIN
bool isSequentialFdFh() const;
+#endif
uchar *map(qint64 offset, qint64 size, QFile::MemoryMapFlags flags);
bool unmap(uchar *ptr);
+ mutable QFileSystemMetaData metaData;
+
FILE *fh;
+#ifdef Q_OS_SYMBIAN
+#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
+ RFile64 symbianFile;
+ TInt64 symbianFilePos;
+#else
+ RFile symbianFile;
+
+ /**
+ * The cursor position in the underlying file. This differs
+ * from devicePos because the latter is updated on calls to
+ * writeData, even if no data was physically transferred to
+ * the file, but instead stored in the write buffer.
+ *
+ * iFilePos is updated on calls to RFile::Read and
+ * RFile::Write. It is also updated on calls to seek() but
+ * RFile::Seek is not called when that happens because
+ * Symbian supports positioned reads and writes, saving a file
+ * server call, and because Symbian does not support seeking
+ * past the end of a file.
+ */
+ TInt symbianFilePos;
+#endif
+ mutable int fileHandleForMaps;
+ int getMapHandle();
+#endif
+
#ifdef Q_WS_WIN
HANDLE fileHandle;
HANDLE mapHandle;
@@ -120,7 +155,6 @@ public:
mutable DWORD fileAttrib;
#else
QHash<uchar *, QPair<int /*offset % PageSize*/, size_t /*length + offset % PageSize*/> > maps;
- mutable QT_STATBUF st;
#endif
int fd;
@@ -142,23 +176,17 @@ public:
mutable uint is_link : 1;
#endif
- bool doStat() const;
+#if defined(Q_OS_WIN)
+ bool doStat(QFileSystemMetaData::MetaDataFlags flags) const;
+#else
+ bool doStat(QFileSystemMetaData::MetaDataFlags flags = QFileSystemMetaData::PosixStatFlags) const;
+#endif
bool isSymlink() const;
#if defined(Q_OS_WIN32)
int sysOpen(const QString &, int flags);
#endif
-#if defined(Q_OS_WIN32) || defined(Q_OS_WINCE)
- static void resolveLibs();
- static bool resolveUNCLibs();
- static bool uncListSharesOnServer(const QString &server, QStringList *list);
-#endif
-
-#ifdef Q_OS_SYMBIAN
- void setSymbianError(int symbianError, QFile::FileError defaultError, QString defaultString);
-#endif
-
protected:
QFSFileEnginePrivate();
diff --git a/src/corelib/io/qfsfileengine_unix.cpp b/src/corelib/io/qfsfileengine_unix.cpp
index 03e7283..1e1b35b 100644
--- a/src/corelib/io/qfsfileengine_unix.cpp
+++ b/src/corelib/io/qfsfileengine_unix.cpp
@@ -43,6 +43,8 @@
#include "qabstractfileengine.h"
#include "private/qfsfileengine_p.h"
#include "private/qcore_unix_p.h"
+#include "qfilesystementry_p.h"
+#include "qfilesystemengine_p.h"
#ifndef QT_NO_FSFILEENGINE
@@ -67,7 +69,6 @@
QT_BEGIN_NAMESPACE
-
#if defined(Q_OS_SYMBIAN)
/*!
\internal
@@ -82,56 +83,25 @@ static bool isRelativePathSymbian(const QString& fileName)
|| (fileName.at(0) == QLatin1Char('/') && fileName.at(1) == QLatin1Char('/')))));
}
-/*!
- \internal
- convert symbian error code to the one suitable for setError.
- example usage: setSymbianError(err, QFile::CopyError, QLatin1String("copy error"))
-*/
-void QFSFileEnginePrivate::setSymbianError(int symbianError, QFile::FileError defaultError, QString defaultString)
-{
- Q_Q(QFSFileEngine);
- switch (symbianError) {
- case KErrNone:
- q->setError(QFile::NoError, QLatin1String(""));
- break;
- case KErrAccessDenied:
- q->setError(QFile::PermissionsError, QLatin1String("access denied"));
- break;
- case KErrPermissionDenied:
- q->setError(QFile::PermissionsError, QLatin1String("permission denied"));
- break;
- case KErrAbort:
- q->setError(QFile::AbortError, QLatin1String("aborted"));
- break;
- case KErrCancel:
- q->setError(QFile::AbortError, QLatin1String("cancelled"));
- break;
- case KErrTimedOut:
- q->setError(QFile::TimeOutError, QLatin1String("timed out"));
- break;
- default:
- q->setError(defaultError, defaultString);
- break;
- }
-}
-
#endif
+#ifndef Q_OS_SYMBIAN
/*!
\internal
Returns the stdlib open string corresponding to a QIODevice::OpenMode.
*/
-static inline QByteArray openModeToFopenMode(QIODevice::OpenMode flags, const QByteArray &fileName)
+static inline QByteArray openModeToFopenMode(QIODevice::OpenMode flags, const QFileSystemEntry &fileEntry,
+ QFileSystemMetaData &metaData)
{
QByteArray mode;
if ((flags & QIODevice::ReadOnly) && !(flags & QIODevice::Truncate)) {
mode = "rb";
if (flags & QIODevice::WriteOnly) {
- QT_STATBUF statBuf;
- if (!fileName.isEmpty()
- && QT_STAT(fileName, &statBuf) == 0
- && (statBuf.st_mode & S_IFMT) == S_IFREG) {
+ metaData.clearFlags(QFileSystemMetaData::FileType);
+ if (!fileEntry.isEmpty()
+ && QFileSystemEngine::fillMetaData(fileEntry, metaData, QFileSystemMetaData::FileType)
+ && metaData.isFile()) {
mode += '+';
} else {
mode = "wb+";
@@ -155,6 +125,7 @@ static inline QByteArray openModeToFopenMode(QIODevice::OpenMode flags, const QB
return mode;
}
+#endif
/*!
\internal
@@ -184,6 +155,7 @@ static inline int openModeToOpenFlags(QIODevice::OpenMode mode)
return oflags;
}
+#ifndef Q_OS_SYMBIAN
/*!
\internal
@@ -194,15 +166,92 @@ static inline bool setCloseOnExec(int fd)
{
return fd != -1 && fcntl(fd, F_SETFD, FD_CLOEXEC) != -1;
}
+#endif
+#ifdef Q_OS_SYMBIAN
/*!
\internal
*/
-void QFSFileEnginePrivate::nativeInitFileName()
+bool QFSFileEnginePrivate::nativeOpen(QIODevice::OpenMode openMode)
{
- nativeFilePath = QFile::encodeName(filePath);
-}
+ Q_Q(QFSFileEngine);
+
+ fh = 0;
+ fd = -1;
+
+ QString fn(QFileSystemEngine::absoluteName(fileEntry).nativeFilePath());
+ RFs& fs = qt_s60GetRFs();
+
+ TUint symbianMode = 0;
+
+ if(openMode & QIODevice::ReadOnly)
+ symbianMode |= EFileRead;
+ if(openMode & QIODevice::WriteOnly)
+ symbianMode |= EFileWrite;
+ if(openMode & QIODevice::Text)
+ symbianMode |= EFileStreamText;
+
+ // pre Symbian 9.4, file I/O is always unbuffered, and the enum values don't exist
+ if(QSysInfo::symbianVersion() >= QSysInfo::SV_9_4) {
+ if (openMode & QFile::Unbuffered) {
+ if (openMode & QIODevice::WriteOnly)
+ symbianMode |= 0x00001000; //EFileWriteDirectIO;
+ // ### Unbuffered read is not used, because it prevents file open in /resource
+ // ### and has no obvious benefits
+ } else {
+ if (openMode & QIODevice::WriteOnly)
+ symbianMode |= 0x00000800; //EFileWriteBuffered;
+ // use implementation defaults for read buffering
+ }
+ }
+
+ // Until Qt supports file sharing, we can't support EFileShareReadersOrWriters safely,
+ // but Qt does this on other platforms and autotests rely on it.
+ // The reason is that Unix locks are only advisory - the application needs to test the
+ // lock after opening the file. Symbian and Windows locks are mandatory - opening a
+ // locked file will fail.
+ symbianMode |= EFileShareReadersOrWriters;
+
+ TInt r;
+ //note QIODevice::Truncate only has meaning for read/write access
+ //write-only files are always truncated unless append is specified
+ //reference openModeToOpenFlags in qfsfileengine_unix.cpp
+ if ((openMode & QIODevice::Truncate) || (!(openMode & QIODevice::ReadOnly) && !(openMode & QIODevice::Append))) {
+ r = symbianFile.Replace(fs, qt_QString2TPtrC(fn), symbianMode);
+ } else {
+ r = symbianFile.Open(fs, qt_QString2TPtrC(fn), symbianMode);
+ if (r == KErrNotFound && (openMode & QIODevice::WriteOnly)) {
+ r = symbianFile.Create(fs, qt_QString2TPtrC(fn), symbianMode);
+ }
+ }
+
+ if (r == KErrNone) {
+#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
+ TInt64 size;
+#else
+ TInt size;
+#endif
+ r = symbianFile.Size(size);
+ if (r==KErrNone) {
+ if (openMode & QIODevice::Append)
+ symbianFilePos = size;
+ else
+ symbianFilePos = 0;
+ //TODO: port this (QFileSystemMetaData in open?)
+ //cachedSize = size;
+ }
+ }
+ if (r != KErrNone) {
+ q->setError(QFile::OpenError, QSystemError(r, QSystemError::NativeError).toString());
+ symbianFile.Close();
+ return false;
+ }
+
+ closeFileHandle = true;
+ return true;
+}
+#else
/*!
\internal
*/
@@ -215,7 +264,7 @@ bool QFSFileEnginePrivate::nativeOpen(QIODevice::OpenMode openMode)
// Try to open the file in unbuffered mode.
do {
- fd = QT_OPEN(nativeFilePath.constData(), flags, 0666);
+ fd = QT_OPEN(fileEntry.nativeFilePath().constData(), flags, 0666);
} while (fd == -1 && errno == EINTR);
// On failure, return and report the error.
@@ -228,13 +277,11 @@ bool QFSFileEnginePrivate::nativeOpen(QIODevice::OpenMode openMode)
if (!(openMode & QIODevice::WriteOnly)) {
// we don't need this check if we tried to open for writing because then
// we had received EISDIR anyway.
- QT_STATBUF statBuf;
- if (QT_FSTAT(fd, &statBuf) != -1) {
- if ((statBuf.st_mode & S_IFMT) == S_IFDIR) {
- q->setError(QFile::OpenError, QLatin1String("file to open is a directory"));
- QT_CLOSE(fd);
- return false;
- }
+ if (QFileSystemEngine::fillMetaData(fd, metaData)
+ && metaData.isDirectory()) {
+ q->setError(QFile::OpenError, QLatin1String("file to open is a directory"));
+ QT_CLOSE(fd);
+ return false;
}
}
@@ -254,11 +301,11 @@ bool QFSFileEnginePrivate::nativeOpen(QIODevice::OpenMode openMode)
fh = 0;
} else {
- QByteArray fopenMode = openModeToFopenMode(openMode, nativeFilePath.constData());
+ QByteArray fopenMode = openModeToFopenMode(openMode, fileEntry, metaData);
// Try to open the file in buffered mode.
do {
- fh = QT_FOPEN(nativeFilePath.constData(), fopenMode.constData());
+ fh = QT_FOPEN(fileEntry.nativeFilePath().constData(), fopenMode.constData());
} while (!fh && errno == EINTR);
// On failure, return and report the error.
@@ -271,13 +318,11 @@ bool QFSFileEnginePrivate::nativeOpen(QIODevice::OpenMode openMode)
if (!(openMode & QIODevice::WriteOnly)) {
// we don't need this check if we tried to open for writing because then
// we had received EISDIR anyway.
- QT_STATBUF statBuf;
- if (QT_FSTAT(fileno(fh), &statBuf) != -1) {
- if ((statBuf.st_mode & S_IFMT) == S_IFDIR) {
- q->setError(QFile::OpenError, QLatin1String("file to open is a directory"));
- fclose(fh);
- return false;
- }
+ if (QFileSystemEngine::fillMetaData(QT_FILENO(fh), metaData)
+ && metaData.isDirectory()) {
+ q->setError(QFile::OpenError, QLatin1String("file to open is a directory"));
+ fclose(fh);
+ return false;
}
}
@@ -303,6 +348,7 @@ bool QFSFileEnginePrivate::nativeOpen(QIODevice::OpenMode openMode)
closeFileHandle = true;
return true;
}
+#endif
/*!
\internal
@@ -318,6 +364,10 @@ bool QFSFileEnginePrivate::nativeClose()
*/
bool QFSFileEnginePrivate::nativeFlush()
{
+#ifdef Q_OS_SYMBIAN
+ if (symbianFile.SubSessionHandle())
+ return (KErrNone == symbianFile.Flush());
+#endif
return fh ? flushFh() : fd != -1;
}
@@ -328,6 +378,24 @@ qint64 QFSFileEnginePrivate::nativeRead(char *data, qint64 len)
{
Q_Q(QFSFileEngine);
+#ifdef Q_OS_SYMBIAN
+ if (symbianFile.SubSessionHandle()) {
+ if(len > KMaxTInt) {
+ //this check is more likely to catch a corrupt length, since it isn't possible to allocate 2GB buffers (yet..)
+ q->setError(QFile::ReadError, QLatin1String("Maximum 2GB in single read on this platform"));
+ return -1;
+ }
+ TPtr8 ptr(reinterpret_cast<TUint8*>(data), static_cast<TInt>(len));
+ TInt r = symbianFile.Read(symbianFilePos, ptr);
+ if (r != KErrNone)
+ {
+ q->setError(QFile::ReadError, QSystemError(r, QSystemError::NativeError).toString());
+ return -1;
+ }
+ symbianFilePos += ptr.Length();
+ return qint64(ptr.Length());
+ }
+#endif
if (fh && nativeIsSequential()) {
size_t readBytes = 0;
int oldFlags = fcntl(QT_FILENO(fh), F_GETFL);
@@ -395,6 +463,40 @@ qint64 QFSFileEnginePrivate::nativeReadLine(char *data, qint64 maxlen)
*/
qint64 QFSFileEnginePrivate::nativeWrite(const char *data, qint64 len)
{
+#ifdef Q_OS_SYMBIAN
+ Q_Q(QFSFileEngine);
+ if (symbianFile.SubSessionHandle()) {
+ if(len > KMaxTInt) {
+ //this check is more likely to catch a corrupt length, since it isn't possible to allocate 2GB buffers (yet..)
+ q->setError(QFile::WriteError, QLatin1String("Maximum 2GB in single write on this platform"));
+ return -1;
+ }
+ const TPtrC8 ptr(reinterpret_cast<const TUint8*>(data), static_cast<TInt>(len));
+#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
+ TInt64 eofpos = 0;
+#else
+ TInt eofpos = 0;
+#endif
+ //The end of file position is not cached because QFile is read/write sharable, therefore another
+ //process may have altered the file size.
+ TInt r = symbianFile.Seek(ESeekEnd, eofpos);
+ if (r == KErrNone && symbianFilePos > eofpos) {
+ //seek position is beyond end of file so file needs to be extended before write.
+ //note that SetSize does not zero-initialise (c.f. posix lseek)
+ r = symbianFile.SetSize(symbianFilePos);
+ }
+ if (r == KErrNone) {
+ //write to specific position in the file (i.e. use our own cursor rather than calling seek)
+ r = symbianFile.Write(symbianFilePos, ptr);
+ }
+ if (r != KErrNone) {
+ q->setError(QFile::WriteError, QSystemError(r, QSystemError::NativeError).toString());
+ return -1;
+ }
+ symbianFilePos += len;
+ return len;
+ }
+#endif
return writeFdFh(data, len);
}
@@ -403,6 +505,12 @@ qint64 QFSFileEnginePrivate::nativeWrite(const char *data, qint64 len)
*/
qint64 QFSFileEnginePrivate::nativePos() const
{
+#ifdef Q_OS_SYMBIAN
+ const Q_Q(QFSFileEngine);
+ if (symbianFile.SubSessionHandle()) {
+ return symbianFilePos;
+ }
+#endif
return posFdFh();
}
@@ -411,6 +519,19 @@ qint64 QFSFileEnginePrivate::nativePos() const
*/
bool QFSFileEnginePrivate::nativeSeek(qint64 pos)
{
+#ifdef Q_OS_SYMBIAN
+ Q_Q(QFSFileEngine);
+ if (symbianFile.SubSessionHandle()) {
+#ifndef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
+ if(pos > KMaxTInt) {
+ q->setError(QFile::PositionError, QLatin1String("Maximum 2GB file position on this platform"));
+ return false;
+ }
+#endif
+ symbianFilePos = pos;
+ return true;
+ }
+#endif
return seekFdFh(pos);
}
@@ -422,139 +543,110 @@ int QFSFileEnginePrivate::nativeHandle() const
return fh ? fileno(fh) : fd;
}
+#ifdef Q_OS_SYMBIAN
+int QFSFileEnginePrivate::getMapHandle()
+{
+ if (symbianFile.SubSessionHandle()) {
+ // Symbian file handle can't be used for open C mmap() so open the file with open C as well.
+ if (fileHandleForMaps < 0) {
+ int flags = openModeToOpenFlags(openMode);
+ flags &= ~(O_CREAT | O_TRUNC);
+ fileHandleForMaps = ::wopen((wchar_t*)(fileEntry.nativeFilePath().utf16()), flags, 0666);
+ }
+ return fileHandleForMaps;
+ }
+ return nativeHandle();
+}
+#endif
+
/*!
\internal
*/
bool QFSFileEnginePrivate::nativeIsSequential() const
{
+#ifdef Q_OS_SYMBIAN
+ if (symbianFile.SubSessionHandle())
+ return false;
+#endif
return isSequentialFdFh();
}
bool QFSFileEngine::remove()
{
Q_D(QFSFileEngine);
- bool ret = unlink(d->nativeFilePath.constData()) == 0;
- if (!ret)
- setError(QFile::RemoveError, qt_error_string(errno));
+ QSystemError error;
+ bool ret = QFileSystemEngine::removeFile(d->fileEntry, error);
+ d->metaData.clear();
+ if (!ret) {
+ setError(QFile::RemoveError, error.toString());
+ }
return ret;
}
bool QFSFileEngine::copy(const QString &newName)
{
-#if defined(Q_OS_SYMBIAN)
Q_D(QFSFileEngine);
- RFs rfs = qt_s60GetRFs();
- CFileMan* fm = NULL;
- QString oldNative(QDir::toNativeSeparators(d->filePath));
- TPtrC oldPtr(qt_QString2TPtrC(oldNative));
- QFileInfo fi(newName);
- QString absoluteNewName = fi.absoluteFilePath();
- QString newNative(QDir::toNativeSeparators(absoluteNewName));
- TPtrC newPtr(qt_QString2TPtrC(newNative));
- TRAPD (err,
- fm = CFileMan::NewL(rfs);
- RFile rfile;
- err = rfile.Open(rfs, oldPtr, EFileShareReadersOrWriters);
- if (err == KErrNone) {
- err = fm->Copy(rfile, newPtr);
- rfile.Close();
- }
- ) // End TRAP
- delete fm;
- if (err == KErrNone)
- return true;
- d->setSymbianError(err, QFile::CopyError, QLatin1String("copy error"));
- return false;
-#else
- Q_UNUSED(newName);
- // ### Add copy code for Unix here
- setError(QFile::UnspecifiedError, QLatin1String("Not implemented!"));
- return false;
-#endif
+ QSystemError error;
+ bool ret = QFileSystemEngine::copyFile(d->fileEntry, QFileSystemEntry(newName), error);
+ if (!ret) {
+ setError(QFile::CopyError, error.toString());
+ }
+ return ret;
}
bool QFSFileEngine::rename(const QString &newName)
{
Q_D(QFSFileEngine);
- bool ret = ::rename(d->nativeFilePath.constData(), QFile::encodeName(newName).constData()) == 0;
- if (!ret)
- setError(QFile::RenameError, qt_error_string(errno));
+ QSystemError error;
+ bool ret = QFileSystemEngine::renameFile(d->fileEntry, QFileSystemEntry(newName), error);
+
+ if (!ret) {
+ setError(QFile::RenameError, error.toString());
+ }
+
return ret;
}
bool QFSFileEngine::link(const QString &newName)
{
Q_D(QFSFileEngine);
- bool ret = ::symlink(d->nativeFilePath.constData(), QFile::encodeName(newName).constData()) == 0;
- if (!ret)
- setError(QFile::RenameError, qt_error_string(errno));
+ QSystemError error;
+ bool ret = QFileSystemEngine::createLink(d->fileEntry, QFileSystemEntry(newName), error);
+ if (!ret) {
+ setError(QFile::RenameError, error.toString());
+ }
return ret;
}
qint64 QFSFileEnginePrivate::nativeSize() const
{
+#ifdef Q_OS_SYMBIAN
+ const Q_Q(QFSFileEngine);
+ if (symbianFile.SubSessionHandle()) {
+#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
+ qint64 size;
+#else
+ TInt size;
+#endif
+ TInt err = symbianFile.Size(size);
+ if(err != KErrNone) {
+ const_cast<QFSFileEngine*>(q)->setError(QFile::PositionError, QSystemError(err, QSystemError::NativeError).toString());
+ return 0;
+ }
+ return size;
+ }
+#endif
return sizeFdFh();
}
bool QFSFileEngine::mkdir(const QString &name, bool createParentDirectories) const
{
- QString dirName = name;
- if (createParentDirectories) {
- dirName = QDir::cleanPath(dirName);
-#if defined(Q_OS_SYMBIAN)
- dirName = QDir::toNativeSeparators(dirName);
-#endif
- for(int oldslash = -1, slash=0; slash != -1; oldslash = slash) {
- slash = dirName.indexOf(QDir::separator(), oldslash+1);
- if (slash == -1) {
- if (oldslash == dirName.length())
- break;
- slash = dirName.length();
- }
- if (slash) {
- QByteArray chunk = QFile::encodeName(dirName.left(slash));
- QT_STATBUF st;
- if (QT_STAT(chunk, &st) != -1) {
- if ((st.st_mode & S_IFMT) != S_IFDIR)
- return false;
- } else if (QT_MKDIR(chunk, 0777) != 0) {
- return false;
- }
- }
- }
- return true;
- }
-#if defined(Q_OS_DARWIN) // Mac X doesn't support trailing /'s
- if (dirName.endsWith(QLatin1Char('/')))
- dirName.chop(1);
-#endif
- return (QT_MKDIR(QFile::encodeName(dirName), 0777) == 0);
+ return QFileSystemEngine::createDirectory(QFileSystemEntry(name), createParentDirectories);
}
bool QFSFileEngine::rmdir(const QString &name, bool recurseParentDirectories) const
{
- QString dirName = name;
- if (recurseParentDirectories) {
- dirName = QDir::cleanPath(dirName);
-#if defined(Q_OS_SYMBIAN)
- dirName = QDir::toNativeSeparators(dirName);
-#endif
- for(int oldslash = 0, slash=dirName.length(); slash > 0; oldslash = slash) {
- QByteArray chunk = QFile::encodeName(dirName.left(slash));
- QT_STATBUF st;
- if (QT_STAT(chunk, &st) != -1) {
- if ((st.st_mode & S_IFMT) != S_IFDIR)
- return false;
- if (::rmdir(chunk) != 0)
- return oldslash != 0;
- } else {
- return false;
- }
- slash = dirName.lastIndexOf(QDir::separator(), oldslash-1);
- }
- return true;
- }
- return ::rmdir(QFile::encodeName(dirName)) == 0;
+ return QFileSystemEngine::removeDirectory(QFileSystemEntry(name), recurseParentDirectories);
}
bool QFSFileEngine::caseSensitive() const
@@ -568,94 +660,27 @@ bool QFSFileEngine::caseSensitive() const
bool QFSFileEngine::setCurrentPath(const QString &path)
{
- int r;
- r = QT_CHDIR(QFile::encodeName(path));
- return r >= 0;
+ return QFileSystemEngine::setCurrentPath(QFileSystemEntry(path));
}
QString QFSFileEngine::currentPath(const QString &)
{
- QString result;
- QT_STATBUF st;
-#if defined(Q_OS_SYMBIAN)
- char nativeCurrentName[PATH_MAX+1];
- if (::getcwd(nativeCurrentName, PATH_MAX))
- result = QDir::fromNativeSeparators(QFile::decodeName(QByteArray(nativeCurrentName)));
- if (result.isEmpty()) {
-# if defined(QT_DEBUG)
- qWarning("QFSFileEngine::currentPath: getcwd() failed");
-# endif
- } else
-#endif
- if (QT_STAT(".", &st) == 0) {
-#if defined(__GLIBC__) && !defined(PATH_MAX)
- char *currentName = ::get_current_dir_name();
- if (currentName) {
- result = QFile::decodeName(QByteArray(currentName));
- ::free(currentName);
- }
-#elif !defined(Q_OS_SYMBIAN)
- char currentName[PATH_MAX+1];
- if (::getcwd(currentName, PATH_MAX))
- result = QFile::decodeName(QByteArray(currentName));
-# if defined(QT_DEBUG)
- if (result.isNull())
- qWarning("QFSFileEngine::currentPath: getcwd() failed");
-# endif
-#endif
- } else {
-#if defined(Q_OS_SYMBIAN)
- // If current dir returned by Open C doesn't exist,
- // try to create it (can happen with application private dirs)
- // Ignore mkdir failures; we want to be consistent with Open C
- // current path regardless.
- QT_MKDIR(QFile::encodeName(QLatin1String(nativeCurrentName)), 0777);
-#else
-# if defined(QT_DEBUG)
- qWarning("QFSFileEngine::currentPath: stat(\".\") failed");
-# endif
-#endif
- }
- return result;
+ return QFileSystemEngine::currentPath().filePath();
}
QString QFSFileEngine::homePath()
{
-#if defined(Q_OS_SYMBIAN)
- QString home = rootPath();
-#else
- QString home = QFile::decodeName(qgetenv("HOME"));
- if (home.isNull())
- home = rootPath();
-#endif
- return home;
+ return QFileSystemEngine::homePath();
}
QString QFSFileEngine::rootPath()
{
-#if defined(Q_OS_SYMBIAN)
- TFileName symbianPath = PathInfo::PhoneMemoryRootPath();
- return QDir::cleanPath(QDir::fromNativeSeparators(qt_TDesC2QString(symbianPath)));
-#else
- return QLatin1String("/");
-#endif
+ return QFileSystemEngine::rootPath();
}
QString QFSFileEngine::tempPath()
{
-#if defined(Q_OS_SYMBIAN)
- TFileName symbianPath = PathInfo::PhoneMemoryRootPath();
- QString temp = QDir::fromNativeSeparators(qt_TDesC2QString(symbianPath));
- temp += QLatin1String( "temp/");
-
- // Just to verify that folder really exist on hardware
- QT_MKDIR(QFile::encodeName(temp), 0777);
-#else
- QString temp = QFile::decodeName(qgetenv("TMPDIR"));
- if (temp.isEmpty())
- temp = QLatin1String("/tmp/");
-#endif
- return temp;
+ return QFileSystemEngine::tempPath();
}
QFileInfoList QFSFileEngine::drives()
@@ -683,123 +708,30 @@ QFileInfoList QFSFileEngine::drives()
return ret;
}
-bool QFSFileEnginePrivate::doStat() const
+bool QFSFileEnginePrivate::doStat(QFileSystemMetaData::MetaDataFlags flags) const
{
- if (!tried_stat) {
- tried_stat = true;
- could_stat = false;
-
- if (fh && nativeFilePath.isEmpty()) {
- // ### actually covers two cases: d->fh and when the file is not open
- could_stat = (QT_FSTAT(QT_FILENO(fh), &st) == 0);
- } else if (fd == -1) {
- // ### actually covers two cases: d->fh and when the file is not open
-#if defined(Q_OS_SYMBIAN)
- // Optimization for Symbian where fileFlags() calls both doStat() and isSymlink(), but rarely on real links.
- // When the filename is not a link, lstat will return the same info as stat, but this also removes
- // any need for a further call to lstat to check if the file is a link.
- need_lstat = false;
- could_stat = (QT_LSTAT(nativeFilePath.constData(), &st) == 0);
- is_link = could_stat ? S_ISLNK(st.st_mode) : false;
- // if it turns out this was a link, we can call stat too.
- if (is_link)
-#endif
- could_stat = (QT_STAT(nativeFilePath.constData(), &st) == 0);
- } else {
- could_stat = (QT_FSTAT(fd, &st) == 0);
- }
- }
- return could_stat;
-}
+ if (!tried_stat || !metaData.hasFlags(flags)) {
+ tried_stat = 1;
-bool QFSFileEnginePrivate::isSymlink() const
-{
- if (need_lstat) {
- need_lstat = false;
+ int localFd = fd;
+ if (fh && fileEntry.isEmpty())
+ localFd = QT_FILENO(fh);
+ if (localFd != -1)
+ QFileSystemEngine::fillMetaData(localFd, metaData);
- QT_STATBUF st; // don't clobber our main one
- is_link = (QT_LSTAT(nativeFilePath.constData(), &st) == 0) ? S_ISLNK(st.st_mode) : false;
+ if (metaData.missingFlags(flags) && !fileEntry.isEmpty())
+ QFileSystemEngine::fillMetaData(fileEntry, metaData, metaData.missingFlags(flags));
}
- return is_link;
-}
-#if defined(Q_OS_SYMBIAN)
-static bool _q_isSymbianHidden(const QString &path, bool isDir)
-{
- RFs rfs = qt_s60GetRFs();
- QFileInfo fi(path);
- QString absPath = fi.absoluteFilePath();
- if (isDir && !absPath.endsWith(QLatin1Char('/')))
- absPath.append(QLatin1Char('/'));
- QString native(QDir::toNativeSeparators(absPath));
- TPtrC ptr(qt_QString2TPtrC(native));
- TUint attributes;
- TInt err = rfs.Att(ptr, attributes);
- return (err == KErrNone && (attributes & KEntryAttHidden));
-}
-#endif
-
-#if !defined(QWS) && !defined(Q_WS_QPA) && defined(Q_OS_MAC)
-static bool _q_isMacHidden(const QString &path)
-{
- OSErr err = noErr;
-
- FSRef fsRef;
-
- err = FSPathMakeRefWithOptions(reinterpret_cast<const UInt8 *>(QFile::encodeName(QDir::cleanPath(path)).constData()),
- kFSPathMakeRefDoNotFollowLeafSymlink, &fsRef, 0);
- if (err != noErr)
- return false;
-
- FSCatalogInfo catInfo;
- err = FSGetCatalogInfo(&fsRef, kFSCatInfoFinderInfo, &catInfo, NULL, NULL, NULL);
- if (err != noErr)
- return false;
-
- FileInfo * const fileInfo = reinterpret_cast<FileInfo*>(&catInfo.finderInfo);
- bool result = (fileInfo->finderFlags & kIsInvisible);
- return result;
+ return metaData.exists();
}
-#endif
-QAbstractFileEngine::FileFlags QFSFileEnginePrivate::getPermissions(QAbstractFileEngine::FileFlags type) const
+bool QFSFileEnginePrivate::isSymlink() const
{
- QAbstractFileEngine::FileFlags ret = 0;
-
- if (st.st_mode & S_IRUSR)
- ret |= QAbstractFileEngine::ReadOwnerPerm;
- if (st.st_mode & S_IWUSR)
- ret |= QAbstractFileEngine::WriteOwnerPerm;
- if (st.st_mode & S_IXUSR)
- ret |= QAbstractFileEngine::ExeOwnerPerm;
- if (st.st_mode & S_IRGRP)
- ret |= QAbstractFileEngine::ReadGroupPerm;
- if (st.st_mode & S_IWGRP)
- ret |= QAbstractFileEngine::WriteGroupPerm;
- if (st.st_mode & S_IXGRP)
- ret |= QAbstractFileEngine::ExeGroupPerm;
- if (st.st_mode & S_IROTH)
- ret |= QAbstractFileEngine::ReadOtherPerm;
- if (st.st_mode & S_IWOTH)
- ret |= QAbstractFileEngine::WriteOtherPerm;
- if (st.st_mode & S_IXOTH)
- ret |= QAbstractFileEngine::ExeOtherPerm;
-
- // calculate user permissions
- if (type & QAbstractFileEngine::ReadUserPerm) {
- if (QT_ACCESS(nativeFilePath.constData(), R_OK) == 0)
- ret |= QAbstractFileEngine::ReadUserPerm;
- }
- if (type & QAbstractFileEngine::WriteUserPerm) {
- if (QT_ACCESS(nativeFilePath.constData(), W_OK) == 0)
- ret |= QAbstractFileEngine::WriteUserPerm;
- }
- if (type & QAbstractFileEngine::ExeUserPerm) {
- if (QT_ACCESS(nativeFilePath.constData(), X_OK) == 0)
- ret |= QAbstractFileEngine::ExeUserPerm;
- }
+ if (!metaData.hasFlags(QFileSystemMetaData::LinkType))
+ QFileSystemEngine::fillMetaData(fileEntry, metaData, QFileSystemMetaData::LinkType);
- return ret;
+ return metaData.isLink();
}
/*!
@@ -808,364 +740,111 @@ QAbstractFileEngine::FileFlags QFSFileEnginePrivate::getPermissions(QAbstractFil
QAbstractFileEngine::FileFlags QFSFileEngine::fileFlags(FileFlags type) const
{
Q_D(const QFSFileEngine);
- // Force a stat, so that we're guaranteed to get up-to-date results
- if (type & Refresh) {
- d->tried_stat = 0;
- d->need_lstat = 1;
- }
+
+ if (type & Refresh)
+ d->metaData.clear();
QAbstractFileEngine::FileFlags ret = 0;
+
if (type & FlagsMask)
ret |= LocalDiskFlag;
- bool exists = d->doStat();
- if (!exists && !d->isSymlink())
+
+ bool exists;
+ {
+ QFileSystemMetaData::MetaDataFlags queryFlags = 0;
+
+ queryFlags |= QFileSystemMetaData::MetaDataFlags(uint(type))
+ & QFileSystemMetaData::Permissions;
+
+ if (type & TypesMask)
+ queryFlags |= QFileSystemMetaData::AliasType
+ | QFileSystemMetaData::LinkType
+ | QFileSystemMetaData::FileType
+ | QFileSystemMetaData::DirectoryType
+ | QFileSystemMetaData::BundleType;
+
+ if (type & FlagsMask)
+ queryFlags |= QFileSystemMetaData::HiddenAttribute
+ | QFileSystemMetaData::ExistsAttribute;
+
+ queryFlags |= QFileSystemMetaData::LinkType;
+
+ exists = d->doStat(queryFlags);
+ }
+
+ if (!exists && !d->metaData.isLink())
return ret;
if (exists && (type & PermsMask))
- ret |= d->getPermissions(type);
+ ret |= FileFlags(uint(d->metaData.permissions()));
+
if (type & TypesMask) {
-#if !defined(QWS) && !defined(Q_WS_QPA) && defined(Q_OS_MAC)
- bool foundAlias = false;
- {
- FSRef fref;
- if (FSPathMakeRef((const UInt8 *)QFile::encodeName(QDir::cleanPath(d->filePath)).data(),
- &fref, NULL) == noErr) {
- Boolean isAlias, isFolder;
- if (FSIsAliasFile(&fref, &isAlias, &isFolder) == noErr && isAlias) {
- foundAlias = true;
- ret |= LinkType;
- }
- }
- }
- if (!foundAlias)
-#endif
- {
- if ((type & LinkType) && d->isSymlink())
+ if (d->metaData.isAlias()) {
+ ret |= LinkType;
+ } else {
+ if ((type & LinkType) && d->metaData.isLink())
ret |= LinkType;
- if (exists && (d->st.st_mode & S_IFMT) == S_IFREG)
- ret |= FileType;
- else if (exists && (d->st.st_mode & S_IFMT) == S_IFDIR)
- ret |= DirectoryType;
-#if !defined(QWS) && defined(Q_OS_MAC)
- if ((ret & DirectoryType) && (type & BundleType)) {
- QCFType<CFURLRef> url = CFURLCreateWithFileSystemPath(0, QCFString(d->filePath),
- kCFURLPOSIXPathStyle, true);
- UInt32 type, creator;
- if (CFBundleGetPackageInfoInDirectory(url, &type, &creator))
- ret |= BundleType;
+ if (exists) {
+ if (d->metaData.isFile()) {
+ ret |= FileType;
+ } else if (d->metaData.isDirectory()) {
+ ret |= DirectoryType;
+ if ((type & BundleType) && d->metaData.isBundle())
+ ret |= BundleType;
+ }
}
-#endif
}
}
+
if (type & FlagsMask) {
if (exists)
ret |= ExistsFlag;
-#if defined(Q_OS_SYMBIAN)
- if (d->filePath == QLatin1String("/")
- || (d->filePath.length() == 3 && d->filePath.at(0).isLetter()
- && d->filePath.at(1) == QLatin1Char(':') && d->filePath.at(2) == QLatin1Char('/'))) {
+ if (d->fileEntry.isRoot())
ret |= RootFlag;
- } else {
- // In Symbian, all symlinks have hidden attribute for some reason;
- // lets make them visible for better compatibility with other platforms.
- // If somebody actually wants a hidden link, then they are out of luck.
- if (!d->isSymlink() && _q_isSymbianHidden(d->filePath, ret & DirectoryType))
- ret |= HiddenFlag;
- }
-#else
- if (d->filePath == QLatin1String("/")) {
- ret |= RootFlag;
- } else {
- QString baseName = fileName(BaseName);
- if ((baseName.size() > 0 && baseName.at(0) == QLatin1Char('.'))
-# if !defined(QWS) && !defined(Q_WS_QPA) && defined(Q_OS_MAC)
- || _q_isMacHidden(d->filePath)
-# if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
- || d->st.st_flags & UF_HIDDEN
-# endif // MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
-# endif
- ) {
- ret |= HiddenFlag;
- }
- }
-#endif
+ else if (d->metaData.isHidden())
+ ret |= HiddenFlag;
}
- return ret;
-}
-
-#if defined(Q_OS_SYMBIAN)
-QString QFSFileEngine::fileName(FileName file) const
-{
- Q_D(const QFSFileEngine);
- const QLatin1Char slashChar('/');
- if(file == BaseName) {
- int slash = d->filePath.lastIndexOf(slashChar);
- if(slash == -1) {
- int colon = d->filePath.lastIndexOf(QLatin1Char(':'));
- if(colon != -1)
- return d->filePath.mid(colon + 1);
- return d->filePath;
- }
- return d->filePath.mid(slash + 1);
- } else if(file == PathName) {
- if(!d->filePath.size())
- return d->filePath;
-
- int slash = d->filePath.lastIndexOf(slashChar);
- if(slash == -1) {
- if(d->filePath.length() >= 2 && d->filePath.at(1) == QLatin1Char(':'))
- return d->filePath.left(2);
- return QLatin1String(".");
- } else {
- if(!slash)
- return QLatin1String("/");
- if(slash == 2 && d->filePath.length() >= 2 && d->filePath.at(1) == QLatin1Char(':'))
- slash++;
- return d->filePath.left(slash);
- }
- } else if(file == AbsoluteName || file == AbsolutePathName) {
- QString ret;
- if (!isRelativePathSymbian(d->filePath)) {
- if (d->filePath.size() > 2 && d->filePath.at(1) == QLatin1Char(':')
- && d->filePath.at(2) != slashChar){
- // It's a drive-relative path, so C:a.txt -> C:/currentpath/a.txt,
- // or if it's different drive than current, Z:a.txt -> Z:/a.txt
- QString currentPath = QDir::currentPath();
- if (0 == currentPath.left(1).compare(d->filePath.left(1), Qt::CaseInsensitive))
- ret = currentPath + slashChar + d->filePath.mid(2);
- else
- ret = d->filePath.left(2) + slashChar + d->filePath.mid(2);
- } else if (d->filePath.startsWith(slashChar)) {
- // It's a absolute path to the current drive, so /a.txt -> C:/a.txt
- ret = QDir::currentPath().left(2) + d->filePath;
- } else {
- ret = d->filePath;
- }
- } else {
- ret = QDir::currentPath() + slashChar + d->filePath;
- }
-
- // The path should be absolute at this point.
- // From the docs :
- // Absolute paths begin with the directory separator "/"
- // (optionally preceded by a drive specification under Windows).
- if (ret.at(0) != slashChar) {
- Q_ASSERT(ret.length() >= 2);
- Q_ASSERT(ret.at(0).isLetter());
- Q_ASSERT(ret.at(1) == QLatin1Char(':'));
-
- // Force uppercase drive letters.
- ret[0] = ret.at(0).toUpper();
- }
-
- // Clean up the path
- bool isDir = ret.endsWith(slashChar);
- ret = QDir::cleanPath(ret);
- if (isDir && !ret.endsWith(slashChar))
- ret += slashChar;
- if (file == AbsolutePathName) {
- int slash = ret.lastIndexOf(slashChar);
- if (slash < 0)
- return ret;
- else if (ret.at(0) != slashChar && slash == 2)
- return ret.left(3); // include the slash
- else
- return ret.left(slash > 0 ? slash : 1);
- }
- return ret;
- } else if(file == CanonicalName || file == CanonicalPathName) {
- if (!(fileFlags(ExistsFlag) & ExistsFlag))
- return QString();
-
- QString ret = QFSFileEnginePrivate::canonicalized(fileName(AbsoluteName));
- if (file == CanonicalPathName && !ret.isEmpty()) {
- int slash = ret.lastIndexOf(slashChar);
- if (slash == -1)
- ret = QDir::fromNativeSeparators(QDir::currentPath());
- else if (slash == 0)
- ret = QLatin1String("/");
- ret = ret.left(slash);
- }
- return ret;
- } else if(file == LinkName) {
- if (d->isSymlink()) {
- char s[PATH_MAX+1];
- int len = readlink(d->nativeFilePath.constData(), s, PATH_MAX);
- if (len > 0) {
- s[len] = '\0';
- QString ret = QFile::decodeName(QByteArray(s));
-
- if (isRelativePathSymbian(ret)) {
- if (!isRelativePathSymbian(d->filePath)) {
- ret.prepend(d->filePath.left(d->filePath.lastIndexOf(slashChar))
- + slashChar);
- } else {
- ret.prepend(QDir::currentPath() + slashChar);
- }
- }
- ret = QDir::cleanPath(ret);
- if (ret.size() > 1 && ret.endsWith(slashChar))
- ret.chop(1);
- return ret;
- }
- }
- return QString();
- } else if(file == BundleName) {
- return QString();
- }
- return d->filePath;
+ return ret;
}
-#else
-
QString QFSFileEngine::fileName(FileName file) const
{
Q_D(const QFSFileEngine);
if (file == BundleName) {
-#if !defined(QWS) && defined(Q_OS_MAC)
- QCFType<CFURLRef> url = CFURLCreateWithFileSystemPath(0, QCFString(d->filePath),
- kCFURLPOSIXPathStyle, true);
- if (QCFType<CFDictionaryRef> dict = CFBundleCopyInfoDictionaryForURL(url)) {
- if (CFTypeRef name = (CFTypeRef)CFDictionaryGetValue(dict, kCFBundleNameKey)) {
- if (CFGetTypeID(name) == CFStringGetTypeID())
- return QCFString::toQString((CFStringRef)name);
- }
- }
-#endif
- return QString();
+ return QFileSystemEngine::bundleName(d->fileEntry);
} else if (file == BaseName) {
- int slash = d->filePath.lastIndexOf(QLatin1Char('/'));
- if (slash != -1)
- return d->filePath.mid(slash + 1);
+ return d->fileEntry.fileName();
} else if (file == PathName) {
- int slash = d->filePath.lastIndexOf(QLatin1Char('/'));
- if (slash == -1)
- return QLatin1String(".");
- else if (!slash)
- return QLatin1String("/");
- return d->filePath.left(slash);
+ return d->fileEntry.path();
} else if (file == AbsoluteName || file == AbsolutePathName) {
- QString ret;
- if (d->filePath.isEmpty() || !d->filePath.startsWith(QLatin1Char('/')))
- ret = QDir::currentPath();
- if (!d->filePath.isEmpty() && d->filePath != QLatin1String(".")) {
- if (!ret.isEmpty() && !ret.endsWith(QLatin1Char('/')))
- ret += QLatin1Char('/');
- ret += d->filePath;
- }
- if (ret == QLatin1String("/"))
- return ret;
- bool isDir = ret.endsWith(QLatin1Char('/'));
- ret = QDir::cleanPath(ret);
- if (isDir)
- ret += QLatin1Char('/');
+ QFileSystemEntry entry(QFileSystemEngine::absoluteName(d->fileEntry));
if (file == AbsolutePathName) {
- int slash = ret.lastIndexOf(QLatin1Char('/'));
- if (slash == -1)
- return QDir::currentPath();
- else if (!slash)
- return QLatin1String("/");
- return ret.left(slash);
+ return entry.path();
}
- return ret;
+ return entry.filePath();
} else if (file == CanonicalName || file == CanonicalPathName) {
- if (!(fileFlags(ExistsFlag) & ExistsFlag))
- return QString();
-
- QString ret = QFSFileEnginePrivate::canonicalized(fileName(AbsoluteName));
- if (file == CanonicalPathName && !ret.isEmpty()) {
- int slash = ret.lastIndexOf(QLatin1Char('/'));
- if (slash == -1)
- ret = QDir::currentPath();
- else if (slash == 0)
- ret = QLatin1String("/");
- ret = ret.left(slash);
- }
- return ret;
+ QFileSystemEntry entry(QFileSystemEngine::canonicalName(d->fileEntry, d->metaData));
+ if (file == CanonicalPathName)
+ return entry.path();
+ return entry.filePath();
} else if (file == LinkName) {
if (d->isSymlink()) {
-#if defined(__GLIBC__) && !defined(PATH_MAX)
-#define PATH_CHUNK_SIZE 256
- char *s = 0;
- int len = -1;
- int size = PATH_CHUNK_SIZE;
-
- while (1) {
- s = (char *) ::realloc(s, size);
- Q_CHECK_PTR(s);
- len = ::readlink(d->nativeFilePath.constData(), s, size);
- if (len < 0) {
- ::free(s);
- break;
- }
- if (len < size) {
- break;
- }
- size *= 2;
- }
-#else
- char s[PATH_MAX+1];
- int len = readlink(d->nativeFilePath.constData(), s, PATH_MAX);
-#endif
- if (len > 0) {
- QString ret;
- if (d->doStat() && S_ISDIR(d->st.st_mode) && s[0] != '/') {
- QDir parent(d->filePath);
- parent.cdUp();
- ret = parent.path();
- if (!ret.isEmpty() && !ret.endsWith(QLatin1Char('/')))
- ret += QLatin1Char('/');
- }
- s[len] = '\0';
- ret += QFile::decodeName(QByteArray(s));
-#if defined(__GLIBC__) && !defined(PATH_MAX)
- ::free(s);
-#endif
-
- if (!ret.startsWith(QLatin1Char('/'))) {
- if (d->filePath.startsWith(QLatin1Char('/'))) {
- ret.prepend(d->filePath.left(d->filePath.lastIndexOf(QLatin1Char('/')))
- + QLatin1Char('/'));
- } else {
- ret.prepend(QDir::currentPath() + QLatin1Char('/'));
- }
- }
- ret = QDir::cleanPath(ret);
- if (ret.size() > 1 && ret.endsWith(QLatin1Char('/')))
- ret.chop(1);
- return ret;
- }
- }
-#if !defined(QWS) && !defined(Q_WS_QPA) && defined(Q_OS_MAC)
- {
- FSRef fref;
- if (FSPathMakeRef((const UInt8 *)QFile::encodeName(QDir::cleanPath(d->filePath)).data(), &fref, 0) == noErr) {
- Boolean isAlias, isFolder;
- if (FSResolveAliasFile(&fref, true, &isFolder, &isAlias) == noErr && isAlias) {
- AliasHandle alias;
- if (FSNewAlias(0, &fref, &alias) == noErr && alias) {
- QCFString cfstr;
- if (FSCopyAliasInfo(alias, 0, 0, &cfstr, 0, 0) == noErr)
- return QCFString::toQString(cfstr);
- }
- }
- }
+ QFileSystemEntry entry = QFileSystemEngine::getLinkTarget(d->fileEntry, d->metaData);
+ return entry.filePath();
}
-#endif
return QString();
}
- return d->filePath;
+ return d->fileEntry.filePath();
}
-#endif // Q_OS_SYMBIAN
bool QFSFileEngine::isRelativePath() const
{
Q_D(const QFSFileEngine);
#if defined(Q_OS_SYMBIAN)
- return isRelativePathSymbian(d->filePath);
+ return isRelativePathSymbian(d->fileEntry.filePath());
#else
- return d->filePath.length() ? d->filePath[0] != QLatin1Char('/') : true;
+ return d->fileEntry.filePath().length() ? d->fileEntry.filePath()[0] != QLatin1Char('/') : true;
#endif
}
@@ -1173,101 +852,73 @@ uint QFSFileEngine::ownerId(FileOwner own) const
{
Q_D(const QFSFileEngine);
static const uint nobodyID = (uint) -2;
- if (d->doStat()) {
- if (own == OwnerUser)
- return d->st.st_uid;
- else
- return d->st.st_gid;
- }
+
+ if (d->doStat(QFileSystemMetaData::OwnerIds))
+ return d->metaData.ownerId(own);
+
return nobodyID;
}
QString QFSFileEngine::owner(FileOwner own) const
{
-#if !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_OPENBSD)
- int size_max = sysconf(_SC_GETPW_R_SIZE_MAX);
- if (size_max == -1)
- size_max = 1024;
- QVarLengthArray<char, 1024> buf(size_max);
-#endif
-
- if (own == OwnerUser) {
- struct passwd *pw = 0;
-#if !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_OPENBSD)
- struct passwd entry;
- getpwuid_r(ownerId(own), &entry, buf.data(), buf.size(), &pw);
-#else
- pw = getpwuid(ownerId(own));
-#endif
- if (pw)
- return QFile::decodeName(QByteArray(pw->pw_name));
- } else if (own == OwnerGroup) {
-#if !defined(Q_OS_SYMBIAN)
- struct group *gr = 0;
-#if !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_OPENBSD)
- size_max = sysconf(_SC_GETGR_R_SIZE_MAX);
- if (size_max == -1)
- size_max = 1024;
- buf.resize(size_max);
- struct group entry;
- // Some large systems have more members than the POSIX max size
- // Loop over by doubling the buffer size (upper limit 250k)
- for (unsigned size = size_max; size < 256000; size += size)
- {
- buf.resize(size);
- // ERANGE indicates that the buffer was too small
- if (!getgrgid_r(ownerId(own), &entry, buf.data(), buf.size(), &gr)
- || errno != ERANGE)
- break;
- }
+#ifndef Q_OS_SYMBIAN
+ if (own == OwnerUser)
+ return QFileSystemEngine::resolveUserName(ownerId(own));
+ return QFileSystemEngine::resolveGroupName(ownerId(own));
#else
- gr = getgrgid(ownerId(own));
-#endif
- if (gr)
- return QFile::decodeName(QByteArray(gr->gr_name));
-#endif
- }
return QString();
+#endif
}
bool QFSFileEngine::setPermissions(uint perms)
{
Q_D(QFSFileEngine);
+ QSystemError error;
+ if (!QFileSystemEngine::setPermissions(d->fileEntry, QFile::Permissions(perms), error, 0)) {
+ setError(QFile::PermissionsError, error.toString());
+ return false;
+ }
+ return true;
+}
+
+#ifdef Q_OS_SYMBIAN
+bool QFSFileEngine::setSize(qint64 size)
+{
+ Q_D(QFSFileEngine);
bool ret = false;
- mode_t mode = 0;
- if (perms & ReadOwnerPerm)
- mode |= S_IRUSR;
- if (perms & WriteOwnerPerm)
- mode |= S_IWUSR;
- if (perms & ExeOwnerPerm)
- mode |= S_IXUSR;
- if (perms & ReadUserPerm)
- mode |= S_IRUSR;
- if (perms & WriteUserPerm)
- mode |= S_IWUSR;
- if (perms & ExeUserPerm)
- mode |= S_IXUSR;
- if (perms & ReadGroupPerm)
- mode |= S_IRGRP;
- if (perms & WriteGroupPerm)
- mode |= S_IWGRP;
- if (perms & ExeGroupPerm)
- mode |= S_IXGRP;
- if (perms & ReadOtherPerm)
- mode |= S_IROTH;
- if (perms & WriteOtherPerm)
- mode |= S_IWOTH;
- if (perms & ExeOtherPerm)
- mode |= S_IXOTH;
- if (d->fd != -1)
- ret = fchmod(d->fd, mode) == 0;
- else
- ret = ::chmod(d->nativeFilePath.constData(), mode) == 0;
- if (!ret)
- setError(QFile::PermissionsError, qt_error_string(errno));
+ TInt err = KErrNone;
+ if (d->symbianFile.SubSessionHandle()) {
+ TInt err = d->symbianFile.SetSize(size);
+ ret = (err == KErrNone);
+ if (ret && d->symbianFilePos > size)
+ d->symbianFilePos = size;
+ }
+ else if (d->fd != -1)
+ ret = QT_FTRUNCATE(d->fd, size) == 0;
+ else if (d->fh)
+ ret = QT_FTRUNCATE(QT_FILENO(d->fh), size) == 0;
+ else {
+ RFile tmp;
+ QString symbianFilename(d->fileEntry.nativeFilePath());
+ err = tmp.Open(qt_s60GetRFs(), qt_QString2TPtrC(symbianFilename), EFileWrite);
+ if (err == KErrNone)
+ {
+ err = tmp.SetSize(size);
+ tmp.Close();
+ }
+ ret = (err == KErrNone);
+ }
+ if (!ret) {
+ QSystemError error;
+ if (err)
+ error = QSystemError(err, QSystemError::NativeError);
+ else
+ error = QSystemError(errno, QSystemError::StandardLibraryError);
+ setError(QFile::ResizeError, error.toString());
+ }
return ret;
}
-
+#else
bool QFSFileEngine::setSize(qint64 size)
{
Q_D(QFSFileEngine);
@@ -1277,25 +928,21 @@ bool QFSFileEngine::setSize(qint64 size)
else if (d->fh)
ret = QT_FTRUNCATE(QT_FILENO(d->fh), size) == 0;
else
- ret = QT_TRUNCATE(d->nativeFilePath.constData(), size) == 0;
+ ret = QT_TRUNCATE(d->fileEntry.nativeFilePath().constData(), size) == 0;
if (!ret)
setError(QFile::ResizeError, qt_error_string(errno));
return ret;
}
+#endif
QDateTime QFSFileEngine::fileTime(FileTime time) const
{
Q_D(const QFSFileEngine);
- QDateTime ret;
- if (d->doStat()) {
- if (time == CreationTime)
- ret.setTime_t(d->st.st_ctime ? d->st.st_ctime : d->st.st_mtime);
- else if (time == ModificationTime)
- ret.setTime_t(d->st.st_mtime);
- else if (time == AccessTime)
- ret.setTime_t(d->st.st_atime);
- }
- return ret;
+
+ if (d->doStat(QFileSystemMetaData::Times))
+ return d->metaData.fileTime(time);
+
+ return QDateTime();
}
uchar *QFSFileEnginePrivate::map(qint64 offset, qint64 size, QFile::MemoryMapFlags flags)
@@ -1315,8 +962,8 @@ uchar *QFSFileEnginePrivate::map(qint64 offset, qint64 size, QFile::MemoryMapFla
// If we know the mapping will extend beyond EOF, fail early to avoid
// undefined behavior. Otherwise, let mmap have its say.
- if (doStat()
- && (QT_OFF_T(size) > st.st_size - QT_OFF_T(offset)))
+ if (doStat(QFileSystemMetaData::SizeAttribute)
+ && (QT_OFF_T(size) > metaData.size() - QT_OFF_T(offset)))
qWarning("QFSFileEngine::map: Mapping a file beyond its size is not portable");
int access = 0;
@@ -1338,7 +985,7 @@ uchar *QFSFileEnginePrivate::map(qint64 offset, qint64 size, QFile::MemoryMapFla
#ifdef Q_OS_SYMBIAN
void *mapAddress;
TRAPD(err, mapAddress = QT_MMAP((void*)0, realSize,
- access, MAP_SHARED, nativeHandle(), realOffset));
+ access, MAP_SHARED, getMapHandle(), realOffset));
if (err != KErrNone) {
qWarning("OpenC bug: leave from mmap %d", err);
mapAddress = MAP_FAILED;
diff --git a/src/corelib/io/qfsfileengine_win.cpp b/src/corelib/io/qfsfileengine_win.cpp
index 71b10b4..3b6e80c 100644
--- a/src/corelib/io/qfsfileengine_win.cpp
+++ b/src/corelib/io/qfsfileengine_win.cpp
@@ -43,7 +43,7 @@
#include "qplatformdefs.h"
#include "qabstractfileengine.h"
#include "private/qfsfileengine_p.h"
-#include <private/qsystemlibrary_p.h>
+#include "qfilesystemengine_p.h"
#include <qdebug.h>
#include "qfile.h"
@@ -69,239 +69,12 @@
#define SECURITY_WIN32
#include <security.h>
-#ifndef SPI_GETPLATFORMTYPE
-#define SPI_GETPLATFORMTYPE 257
-#endif
-
#ifndef PATH_MAX
#define PATH_MAX FILENAME_MAX
#endif
-#ifndef _INTPTR_T_DEFINED
-#ifdef _WIN64
-typedef __int64 intptr_t;
-#else
-#ifdef _W64
-typedef _W64 int intptr_t;
-#else
-typedef INT_PTR intptr_t;
-#endif
-#endif
-#define _INTPTR_T_DEFINED
-#endif
-
-#ifndef INVALID_FILE_ATTRIBUTES
-# define INVALID_FILE_ATTRIBUTES (DWORD (-1))
-#endif
-
-#if !defined(Q_OS_WINCE)
-# if !defined(REPARSE_DATA_BUFFER_HEADER_SIZE)
-typedef struct _REPARSE_DATA_BUFFER {
- ULONG ReparseTag;
- USHORT ReparseDataLength;
- USHORT Reserved;
- union {
- struct {
- USHORT SubstituteNameOffset;
- USHORT SubstituteNameLength;
- USHORT PrintNameOffset;
- USHORT PrintNameLength;
- ULONG Flags;
- WCHAR PathBuffer[1];
- } SymbolicLinkReparseBuffer;
- struct {
- USHORT SubstituteNameOffset;
- USHORT SubstituteNameLength;
- USHORT PrintNameOffset;
- USHORT PrintNameLength;
- WCHAR PathBuffer[1];
- } MountPointReparseBuffer;
- struct {
- UCHAR DataBuffer[1];
- } GenericReparseBuffer;
- };
-} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
-# define REPARSE_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer)
-# endif // !defined(REPARSE_DATA_BUFFER_HEADER_SIZE)
-
-# ifndef MAXIMUM_REPARSE_DATA_BUFFER_SIZE
-# define MAXIMUM_REPARSE_DATA_BUFFER_SIZE 16384
-# endif
-# ifndef IO_REPARSE_TAG_SYMLINK
-# define IO_REPARSE_TAG_SYMLINK (0xA000000CL)
-# endif
-# ifndef FSCTL_GET_REPARSE_POINT
-# define FSCTL_GET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 42, METHOD_BUFFERED, FILE_ANY_ACCESS)
-# endif
-#endif // !defined(Q_OS_WINCE)
-
QT_BEGIN_NAMESPACE
-static QString readLink(const QString &link);
-
-Q_CORE_EXPORT int qt_ntfs_permission_lookup = 0;
-
-#if defined(Q_OS_WINCE)
-static QString qfsPrivateCurrentDir = QLatin1String("");
-// As none of the functions we try to resolve do exist on Windows CE
-// we use QT_NO_LIBRARY to shorten everything up a little bit.
-#define QT_NO_LIBRARY 1
-#endif
-
-#if !defined(QT_NO_LIBRARY)
-QT_BEGIN_INCLUDE_NAMESPACE
-typedef DWORD (WINAPI *PtrGetNamedSecurityInfoW)(LPWSTR, SE_OBJECT_TYPE, SECURITY_INFORMATION, PSID*, PSID*, PACL*, PACL*, PSECURITY_DESCRIPTOR*);
-static PtrGetNamedSecurityInfoW ptrGetNamedSecurityInfoW = 0;
-typedef BOOL (WINAPI *PtrLookupAccountSidW)(LPCWSTR, PSID, LPWSTR, LPDWORD, LPWSTR, LPDWORD, PSID_NAME_USE);
-static PtrLookupAccountSidW ptrLookupAccountSidW = 0;
-typedef VOID (WINAPI *PtrBuildTrusteeWithSidW)(PTRUSTEE_W, PSID);
-static PtrBuildTrusteeWithSidW ptrBuildTrusteeWithSidW = 0;
-typedef DWORD (WINAPI *PtrGetEffectiveRightsFromAclW)(PACL, PTRUSTEE_W, OUT PACCESS_MASK);
-static PtrGetEffectiveRightsFromAclW ptrGetEffectiveRightsFromAclW = 0;
-static TRUSTEE_W currentUserTrusteeW;
-static TRUSTEE_W worldTrusteeW;
-
-typedef BOOL (WINAPI *PtrGetUserProfileDirectoryW)(HANDLE, LPWSTR, LPDWORD);
-static PtrGetUserProfileDirectoryW ptrGetUserProfileDirectoryW = 0;
-typedef BOOL (WINAPI *PtrGetVolumePathNamesForVolumeNameW)(LPCWSTR,LPWSTR,DWORD,PDWORD);
-static PtrGetVolumePathNamesForVolumeNameW ptrGetVolumePathNamesForVolumeNameW = 0;
-QT_END_INCLUDE_NAMESPACE
-
-
-void QFSFileEnginePrivate::resolveLibs()
-{
- static bool triedResolve = false;
- if (!triedResolve) {
- // need to resolve the security info functions
-
- // protect initialization
-#ifndef QT_NO_THREAD
- QMutexLocker locker(QMutexPool::globalInstanceGet(&triedResolve));
- // check triedResolve again, since another thread may have already
- // done the initialization
- if (triedResolve) {
- // another thread did initialize the security function pointers,
- // so we shouldn't do it again.
- return;
- }
-#endif
-
- triedResolve = true;
-#if !defined(Q_OS_WINCE)
- HINSTANCE advapiHnd = QSystemLibrary::load(L"advapi32");
- if (advapiHnd) {
- ptrGetNamedSecurityInfoW = (PtrGetNamedSecurityInfoW)GetProcAddress(advapiHnd, "GetNamedSecurityInfoW");
- ptrLookupAccountSidW = (PtrLookupAccountSidW)GetProcAddress(advapiHnd, "LookupAccountSidW");
- ptrBuildTrusteeWithSidW = (PtrBuildTrusteeWithSidW)GetProcAddress(advapiHnd, "BuildTrusteeWithSidW");
- ptrGetEffectiveRightsFromAclW = (PtrGetEffectiveRightsFromAclW)GetProcAddress(advapiHnd, "GetEffectiveRightsFromAclW");
- }
- if (ptrBuildTrusteeWithSidW) {
- // Create TRUSTEE for current user
- HANDLE hnd = ::GetCurrentProcess();
- HANDLE token = 0;
- if (::OpenProcessToken(hnd, TOKEN_QUERY, &token)) {
- TOKEN_USER tu;
- DWORD retsize;
- if (::GetTokenInformation(token, TokenUser, &tu, sizeof(tu), &retsize))
- ptrBuildTrusteeWithSidW(&currentUserTrusteeW, tu.User.Sid);
- ::CloseHandle(token);
- }
-
- typedef BOOL (WINAPI *PtrAllocateAndInitializeSid)(PSID_IDENTIFIER_AUTHORITY, BYTE, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, PSID*);
- PtrAllocateAndInitializeSid ptrAllocateAndInitializeSid = (PtrAllocateAndInitializeSid)GetProcAddress(advapiHnd, "AllocateAndInitializeSid");
- typedef PVOID (WINAPI *PtrFreeSid)(PSID);
- PtrFreeSid ptrFreeSid = (PtrFreeSid)GetProcAddress(advapiHnd, "FreeSid");
- if (ptrAllocateAndInitializeSid && ptrFreeSid) {
- // Create TRUSTEE for Everyone (World)
- SID_IDENTIFIER_AUTHORITY worldAuth = { SECURITY_WORLD_SID_AUTHORITY };
- PSID pWorld = 0;
- if (ptrAllocateAndInitializeSid(&worldAuth, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &pWorld))
- ptrBuildTrusteeWithSidW(&worldTrusteeW, pWorld);
- ptrFreeSid(pWorld);
- }
- }
- HINSTANCE userenvHnd = QSystemLibrary::load(L"userenv");
- if (userenvHnd)
- ptrGetUserProfileDirectoryW = (PtrGetUserProfileDirectoryW)GetProcAddress(userenvHnd, "GetUserProfileDirectoryW");
- HINSTANCE kernel32 = LoadLibrary(L"kernel32");
- if(kernel32)
- ptrGetVolumePathNamesForVolumeNameW = (PtrGetVolumePathNamesForVolumeNameW)GetProcAddress(kernel32, "GetVolumePathNamesForVolumeNameW");
-#endif
- }
-}
-#endif // QT_NO_LIBRARY
-
-typedef DWORD (WINAPI *PtrNetShareEnum)(LPWSTR, DWORD, LPBYTE*, DWORD, LPDWORD, LPDWORD, LPDWORD);
-static PtrNetShareEnum ptrNetShareEnum = 0;
-typedef DWORD (WINAPI *PtrNetApiBufferFree)(LPVOID);
-static PtrNetApiBufferFree ptrNetApiBufferFree = 0;
-typedef struct _SHARE_INFO_1 {
- LPWSTR shi1_netname;
- DWORD shi1_type;
- LPWSTR shi1_remark;
-} SHARE_INFO_1;
-
-
-bool QFSFileEnginePrivate::resolveUNCLibs()
-{
- static bool triedResolve = false;
- if (!triedResolve) {
-#ifndef QT_NO_THREAD
- QMutexLocker locker(QMutexPool::globalInstanceGet(&triedResolve));
- if (triedResolve) {
- return ptrNetShareEnum && ptrNetApiBufferFree;
- }
-#endif
- triedResolve = true;
-#if !defined(Q_OS_WINCE)
- HINSTANCE hLib = QSystemLibrary::load(L"Netapi32");
- if (hLib) {
- ptrNetShareEnum = (PtrNetShareEnum)GetProcAddress(hLib, "NetShareEnum");
- if (ptrNetShareEnum)
- ptrNetApiBufferFree = (PtrNetApiBufferFree)GetProcAddress(hLib, "NetApiBufferFree");
- }
-#endif
- }
- return ptrNetShareEnum && ptrNetApiBufferFree;
-}
-
-bool QFSFileEnginePrivate::uncListSharesOnServer(const QString &server, QStringList *list)
-{
- if (resolveUNCLibs()) {
- SHARE_INFO_1 *BufPtr, *p;
- DWORD res;
- DWORD er = 0, tr = 0, resume = 0, i;
- do {
- res = ptrNetShareEnum((wchar_t*)server.utf16(), 1, (LPBYTE *)&BufPtr, DWORD(-1), &er, &tr, &resume);
- if (res == ERROR_SUCCESS || res == ERROR_MORE_DATA) {
- p = BufPtr;
- for (i = 1; i <= er; ++i) {
- if (list && p->shi1_type == 0)
- list->append(QString::fromWCharArray(p->shi1_netname));
- p++;
- }
- }
- ptrNetApiBufferFree(BufPtr);
- } while (res == ERROR_MORE_DATA);
- return res == ERROR_SUCCESS;
- }
- return false;
-}
-
-static bool isUncRoot(const QString &server)
-{
- QString localPath = QDir::toNativeSeparators(server);
- if (!localPath.startsWith(QLatin1String("\\\\")))
- return false;
-
- int idx = localPath.indexOf(QLatin1Char('\\'), 2);
- if (idx == -1 || idx + 1 == localPath.length())
- return true;
-
- localPath = localPath.right(localPath.length() - idx - 1).trimmed();
- return localPath.isEmpty();
-}
-
#if !defined(Q_OS_WINCE)
static inline bool isUncPath(const QString &path)
{
@@ -311,73 +84,6 @@ static inline bool isUncPath(const QString &path)
}
#endif
-static inline bool isRelativePath(const QString &path)
-{
- // drive, e.g. "a:", or UNC root, e.q. "//"
- return !(path.startsWith(QLatin1Char('/'))
- || (path.length() >= 2
- && ((path.at(0).isLetter() && path.at(1) == QLatin1Char(':'))
- || (path.at(0) == QLatin1Char('/') && path.at(1) == QLatin1Char('/')))));
-}
-
-static QString fixIfRelativeUncPath(const QString &path)
-{
- if (isRelativePath(path)) {
- QString currentPath = QDir::currentPath() + QLatin1Char('/');
- if (currentPath.startsWith(QLatin1String("//")))
- return QString(path).prepend(currentPath);
- }
- return path;
-}
-
-// can be //server or //server/share
-static bool uncShareExists(const QString &server)
-{
- QStringList parts = server.split(QLatin1Char('\\'), QString::SkipEmptyParts);
- if (parts.count()) {
- QStringList shares;
- if (QFSFileEnginePrivate::uncListSharesOnServer(QLatin1String("\\\\") + parts.at(0), &shares))
- return parts.count() >= 2 ? shares.contains(parts.at(1), Qt::CaseInsensitive) : true;
- }
- return false;
-}
-
-static inline bool isDriveRoot(const QString &path)
-{
- return (path.length() == 3
- && path.at(0).isLetter() && path.at(1) == QLatin1Char(':')
- && path.at(2) == QLatin1Char('/'));
-}
-
-static QString nativeAbsoluteFilePath(const QString &path)
-{
- QString absPath;
-#if !defined(Q_OS_WINCE)
- QVarLengthArray<wchar_t, MAX_PATH> buf(qMax(MAX_PATH, path.size() + 1));
- wchar_t *fileName = 0;
- DWORD retLen = GetFullPathName((wchar_t*)path.utf16(), buf.size(), buf.data(), &fileName);
- if (retLen > (DWORD)buf.size()) {
- buf.resize(retLen);
- retLen = GetFullPathName((wchar_t*)path.utf16(), buf.size(), buf.data(), &fileName);
- }
- if (retLen != 0)
- absPath = QString::fromWCharArray(buf.data(), retLen);
-#else
- if (path.startsWith(QLatin1Char('/')) || path.startsWith(QLatin1Char('\\')))
- absPath = QDir::toNativeSeparators(path);
- else
- absPath = QDir::toNativeSeparators(QDir::cleanPath(qfsPrivateCurrentDir + QLatin1Char('/') + path));
-#endif
- // This is really ugly, but GetFullPathName strips off whitespace at the end.
- // If you for instance write ". " in the lineedit of QFileDialog,
- // (which is an invalid filename) this function will strip the space off and viola,
- // the file is later reported as existing. Therefore, we re-add the whitespace that
- // was at the end of path in order to keep the filename invalid.
- if (!path.isEmpty() && path.at(path.size() - 1) == QLatin1Char(' '))
- absPath.append(QLatin1Char(' '));
- return absPath;
-}
-
/*!
\internal
*/
@@ -386,7 +92,7 @@ QString QFSFileEnginePrivate::longFileName(const QString &path)
if (path.startsWith(QLatin1String("\\\\.\\")))
return path;
- QString absPath = nativeAbsoluteFilePath(path);
+ QString absPath = QFileSystemEngine::nativeAbsoluteFilePath(path);
#if !defined(Q_OS_WINCE)
QString prefix = QLatin1String("\\\\?\\");
if (isUncPath(absPath)) {
@@ -402,15 +108,6 @@ QString QFSFileEnginePrivate::longFileName(const QString &path)
/*
\internal
*/
-void QFSFileEnginePrivate::nativeInitFileName()
-{
- QString path = longFileName(QDir::toNativeSeparators(fixIfRelativeUncPath(filePath)));
- nativeFilePath = QByteArray((const char *)path.utf16(), path.size() * 2 + 1);
-}
-
-/*
- \internal
-*/
bool QFSFileEnginePrivate::nativeOpen(QIODevice::OpenMode openMode)
{
Q_Q(QFSFileEngine);
@@ -428,9 +125,8 @@ bool QFSFileEnginePrivate::nativeOpen(QIODevice::OpenMode openMode)
// WriteOnly can create files, ReadOnly cannot.
DWORD creationDisp = (openMode & QIODevice::WriteOnly) ? OPEN_ALWAYS : OPEN_EXISTING;
-
// Create the file handle.
- fileHandle = CreateFile((const wchar_t*)nativeFilePath.constData(),
+ fileHandle = CreateFile((const wchar_t*)fileEntry.nativeFilePath().utf16(),
accessRights,
shareMode,
&securityAtts,
@@ -520,17 +216,9 @@ qint64 QFSFileEnginePrivate::nativeSize() const
// ### Don't flush; for buffered files, we should get away with ftell.
thatQ->flush();
-#if !defined(Q_OS_WINCE)
- // stdlib/stdio mode.
- if (fh || fd != -1) {
- qint64 fileSize = _filelengthi64(fh ? QT_FILENO(fh) : fd);
- if (fileSize == -1) {
- fileSize = 0;
- thatQ->setError(QFile::UnspecifiedError, qt_error_string(errno));
- }
- return fileSize;
- }
-#else // Q_OS_WINCE
+ // Always retrive the current information
+ metaData.clearFlags(QFileSystemMetaData::SizeAttribute);
+#if defined(Q_OS_WINCE)
// Buffered stdlib mode.
if (fh) {
QT_OFF_T oldPos = QT_FTELL(fh);
@@ -543,70 +231,22 @@ qint64 QFSFileEnginePrivate::nativeSize() const
}
return fileSize;
}
-#endif
-
- // Not-open mode, where the file name is known: We'll check the
- // file system directly.
- if (openMode == QIODevice::NotOpen && !nativeFilePath.isEmpty()) {
- WIN32_FILE_ATTRIBUTE_DATA attribData;
- bool ok = ::GetFileAttributesEx((const wchar_t*)nativeFilePath.constData(),
- GetFileExInfoStandard, &attribData);
- if (!ok) {
- int errorCode = GetLastError();
- if (errorCode == ERROR_ACCESS_DENIED || errorCode == ERROR_SHARING_VIOLATION) {
- QByteArray path = nativeFilePath;
- // path for the FindFirstFile should not end with a trailing slash
- while (!path.isEmpty() && reinterpret_cast<const wchar_t *>(
- path.constData() + path.length())[-1] == '\\')
- path.chop(2);
-
- // FindFirstFile can not handle drives
- if (!path.isEmpty() && reinterpret_cast<const wchar_t *>(
- path.constData() + path.length())[-1] != ':') {
- WIN32_FIND_DATA findData;
- HANDLE hFind = ::FindFirstFile((const wchar_t*)path.constData(),
- &findData);
- if (hFind != INVALID_HANDLE_VALUE) {
- ::FindClose(hFind);
- ok = true;
- attribData.nFileSizeHigh = findData.nFileSizeHigh;
- attribData.nFileSizeLow = findData.nFileSizeLow;
- }
- }
- }
- }
- if (ok) {
- qint64 size = attribData.nFileSizeHigh;
- size <<= 32;
- size += attribData.nFileSizeLow;
- return size;
- }
- thatQ->setError(QFile::UnspecifiedError, qt_error_string());
- return 0;
- }
-
-#if defined(Q_OS_WINCE)
- // Unbuffed stdio mode
if (fd != -1) {
thatQ->setError(QFile::UnspecifiedError, QLatin1String("Not implemented!"));
return 0;
}
#endif
+ bool filled = false;
+ if (fileHandle != INVALID_HANDLE_VALUE && openMode != QIODevice::NotOpen )
+ filled = QFileSystemEngine::fillMetaData(fileHandle, metaData,
+ QFileSystemMetaData::SizeAttribute);
+ else
+ filled = doStat(QFileSystemMetaData::SizeAttribute);
- // Windows native mode.
- if (fileHandle == INVALID_HANDLE_VALUE)
- return 0;
-
- BY_HANDLE_FILE_INFORMATION fileInfo;
- if (!GetFileInformationByHandle(fileHandle, &fileInfo)) {
- thatQ->setError(QFile::UnspecifiedError, qt_error_string());
- return 0;
+ if (!filled) {
+ thatQ->setError(QFile::UnspecifiedError, qt_error_string(errno));
}
-
- qint64 size = fileInfo.nFileSizeHigh;
- size <<= 32;
- size += fileInfo.nFileSizeLow;
- return size;
+ return metaData.size();
}
/*
@@ -840,159 +480,41 @@ bool QFSFileEnginePrivate::nativeIsSequential() const
bool QFSFileEngine::remove()
{
Q_D(QFSFileEngine);
- bool ret = ::DeleteFile((wchar_t*)QFSFileEnginePrivate::longFileName(d->filePath).utf16()) != 0;
+ QSystemError error;
+ bool ret = QFileSystemEngine::removeFile(d->fileEntry, error);
if (!ret)
- setError(QFile::RemoveError, qt_error_string());
+ setError(QFile::RemoveError, error.toString());
return ret;
}
bool QFSFileEngine::copy(const QString &copyName)
{
Q_D(QFSFileEngine);
- bool ret = ::CopyFile((wchar_t*)QFSFileEnginePrivate::longFileName(d->filePath).utf16(),
- (wchar_t*)QFSFileEnginePrivate::longFileName(copyName).utf16(), true) != 0;
+ QSystemError error;
+ bool ret = QFileSystemEngine::copyFile(d->fileEntry, QFileSystemEntry(copyName), error);
if (!ret)
- setError(QFile::CopyError, qt_error_string());
+ setError(QFile::CopyError, error.toString());
return ret;
}
bool QFSFileEngine::rename(const QString &newName)
{
Q_D(QFSFileEngine);
- bool ret = ::MoveFile((wchar_t*)QFSFileEnginePrivate::longFileName(d->filePath).utf16(),
- (wchar_t*)QFSFileEnginePrivate::longFileName(newName).utf16()) != 0;
+ QSystemError error;
+ bool ret = QFileSystemEngine::renameFile(d->fileEntry, QFileSystemEntry(newName), error);
if (!ret)
- setError(QFile::RenameError, qt_error_string());
+ setError(QFile::RenameError, error.toString());
return ret;
}
-static inline bool mkDir(const QString &path)
-{
-#if defined(Q_OS_WINCE)
- // Unfortunately CreateDirectory returns true for paths longer than
- // 256, but does not create a directory. It starts to fail, when
- // path length > MAX_PATH, which is 260 usually on CE.
- // This only happens on a Windows Mobile device. Windows CE seems
- // not to be affected by this.
- static int platformId = 0;
- if (platformId == 0) {
- wchar_t platformString[64];
- if (SystemParametersInfo(SPI_GETPLATFORMTYPE, sizeof(platformString)/sizeof(*platformString),platformString,0)) {
- if (0 == wcscmp(platformString, L"PocketPC") || 0 == wcscmp(platformString, L"Smartphone"))
- platformId = 1;
- else
- platformId = 2;
- }
- }
- if (platformId == 1 && QFSFileEnginePrivate::longFileName(path).size() > 256)
- return false;
-#endif
- return ::CreateDirectory((wchar_t*)QFSFileEnginePrivate::longFileName(path).utf16(), 0);
-}
-
-static inline bool rmDir(const QString &path)
-{
- return ::RemoveDirectory((wchar_t*)QFSFileEnginePrivate::longFileName(path).utf16());
-}
-
-static bool isDirPath(const QString &dirPath, bool *existed)
-{
- QString path = dirPath;
- if (path.length() == 2 && path.at(1) == QLatin1Char(':'))
- path += QLatin1Char('\\');
-
- DWORD fileAttrib = ::GetFileAttributes((wchar_t*)QFSFileEnginePrivate::longFileName(path).utf16());
- if (fileAttrib == INVALID_FILE_ATTRIBUTES) {
- int errorCode = GetLastError();
- if (errorCode == ERROR_ACCESS_DENIED || errorCode == ERROR_SHARING_VIOLATION) {
- // path for the FindFirstFile should not end with a trailing slash
- while (path.endsWith(QLatin1Char('\\')))
- path.chop(1);
-
- // FindFirstFile can not handle drives
- if (!path.endsWith(QLatin1Char(':'))) {
- WIN32_FIND_DATA findData;
- HANDLE hFind = ::FindFirstFile((wchar_t*)QFSFileEnginePrivate::longFileName(path).utf16(),
- &findData);
- if (hFind != INVALID_HANDLE_VALUE) {
- ::FindClose(hFind);
- fileAttrib = findData.dwFileAttributes;
- }
- }
- }
- }
-
- if (existed)
- *existed = fileAttrib != INVALID_FILE_ATTRIBUTES;
-
- if (fileAttrib == INVALID_FILE_ATTRIBUTES)
- return false;
-
- return fileAttrib & FILE_ATTRIBUTE_DIRECTORY;
-}
-
bool QFSFileEngine::mkdir(const QString &name, bool createParentDirectories) const
{
- QString dirName = name;
- if (createParentDirectories) {
- dirName = QDir::toNativeSeparators(QDir::cleanPath(dirName));
- // We spefically search for / so \ would break it..
- int oldslash = -1;
- if (dirName.startsWith(QLatin1String("\\\\"))) {
- // Don't try to create the root path of a UNC path;
- // CreateDirectory() will just return ERROR_INVALID_NAME.
- for (int i = 0; i < dirName.size(); ++i) {
- if (dirName.at(i) != QDir::separator()) {
- oldslash = i;
- break;
- }
- }
- if (oldslash != -1)
- oldslash = dirName.indexOf(QDir::separator(), oldslash);
- }
- for (int slash=0; slash != -1; oldslash = slash) {
- slash = dirName.indexOf(QDir::separator(), oldslash+1);
- if (slash == -1) {
- if (oldslash == dirName.length())
- break;
- slash = dirName.length();
- }
- if (slash) {
- QString chunk = dirName.left(slash);
- bool existed = false;
- if (!isDirPath(chunk, &existed)) {
- if (!existed) {
- if (!mkDir(chunk))
- return false;
- } else {
- return false;
- }
- }
- }
- }
- return true;
- }
- return mkDir(name);
+ return QFileSystemEngine::createDirectory(QFileSystemEntry(name), createParentDirectories);
}
bool QFSFileEngine::rmdir(const QString &name, bool recurseParentDirectories) const
{
- QString dirName = name;
- if (recurseParentDirectories) {
- dirName = QDir::toNativeSeparators(QDir::cleanPath(dirName));
- for (int oldslash = 0, slash=dirName.length(); slash > 0; oldslash = slash) {
- QString chunk = dirName.left(slash);
- if (chunk.length() == 2 && chunk.at(0).isLetter() && chunk.at(1) == QLatin1Char(':'))
- break;
- if (!isDirPath(chunk, 0))
- return false;
- if (!rmDir(chunk))
- return oldslash != 0;
- slash = dirName.lastIndexOf(QDir::separator(), oldslash-1);
- }
- return true;
- }
- return rmDir(name);
+ return QFileSystemEngine::removeDirectory(QFileSystemEntry(name), recurseParentDirectories);
}
bool QFSFileEngine::caseSensitive() const
@@ -1002,15 +524,7 @@ bool QFSFileEngine::caseSensitive() const
bool QFSFileEngine::setCurrentPath(const QString &path)
{
- if (!QDir(path).exists())
- return false;
-
-#if !defined(Q_OS_WINCE)
- return ::SetCurrentDirectory((wchar_t*)path.utf16()) != 0;
-#else
- qfsPrivateCurrentDir = QFSFileEnginePrivate::longFileName(path);
- return true;
-#endif
+ return QFileSystemEngine::setCurrentPath(QFileSystemEntry(path));
}
QString QFSFileEngine::currentPath(const QString &fileName)
@@ -1029,115 +543,30 @@ QString QFSFileEngine::currentPath(const QString &fileName)
}
if (ret.isEmpty()) {
//just the pwd
- DWORD size = 0;
- wchar_t currentName[PATH_MAX];
- size = ::GetCurrentDirectory(PATH_MAX, currentName);
- if (size != 0) {
- if (size > PATH_MAX) {
- wchar_t *newCurrentName = new wchar_t[size];
- if (::GetCurrentDirectory(PATH_MAX, newCurrentName) != 0)
- ret = QString::fromWCharArray(newCurrentName);
- delete [] newCurrentName;
- } else {
- ret = QString::fromWCharArray(currentName);
- }
- }
+ ret = QFileSystemEngine::currentPath().filePath();
}
if (ret.length() >= 2 && ret[1] == QLatin1Char(':'))
ret[0] = ret.at(0).toUpper(); // Force uppercase drive letters.
- return QDir::fromNativeSeparators(ret);
+ return ret;
#else
Q_UNUSED(fileName);
- if (qfsPrivateCurrentDir.isEmpty())
- qfsPrivateCurrentDir = QCoreApplication::applicationDirPath();
-
- return QDir::fromNativeSeparators(qfsPrivateCurrentDir);
+ return QFileSystemEngine::currentPath();
#endif
}
QString QFSFileEngine::homePath()
{
- QString ret;
-#if !defined(QT_NO_LIBRARY)
- QFSFileEnginePrivate::resolveLibs();
- if (ptrGetUserProfileDirectoryW) {
- HANDLE hnd = ::GetCurrentProcess();
- HANDLE token = 0;
- BOOL ok = ::OpenProcessToken(hnd, TOKEN_QUERY, &token);
- if (ok) {
- DWORD dwBufferSize = 0;
- // First call, to determine size of the strings (with '\0').
- ok = ptrGetUserProfileDirectoryW(token, NULL, &dwBufferSize);
- if (!ok && dwBufferSize != 0) { // We got the required buffer size
- wchar_t *userDirectory = new wchar_t[dwBufferSize];
- // Second call, now we can fill the allocated buffer.
- ok = ptrGetUserProfileDirectoryW(token, userDirectory, &dwBufferSize);
- if (ok)
- ret = QString::fromWCharArray(userDirectory);
-
- delete [] userDirectory;
- }
- ::CloseHandle(token);
- }
- }
-#endif
- if (ret.isEmpty() || !QFile::exists(ret)) {
- ret = QString::fromLocal8Bit(qgetenv("USERPROFILE").constData());
- if (ret.isEmpty() || !QFile::exists(ret)) {
- ret = QString::fromLocal8Bit(qgetenv("HOMEDRIVE").constData()) + QString::fromLocal8Bit(qgetenv("HOMEPATH").constData());
- if (ret.isEmpty() || !QFile::exists(ret)) {
- ret = QString::fromLocal8Bit(qgetenv("HOME").constData());
- if (ret.isEmpty() || !QFile::exists(ret)) {
-#if defined(Q_OS_WINCE)
- ret = QLatin1String("\\My Documents");
- if (!QFile::exists(ret))
-#endif
- ret = rootPath();
- }
- }
- }
- }
- return QDir::fromNativeSeparators(ret);
+ return QFileSystemEngine::homePath();
}
QString QFSFileEngine::rootPath()
{
-#if defined(Q_OS_WINCE)
- QString ret = QLatin1String("/");
-#elif defined(Q_FS_FAT)
- QString ret = QString::fromLatin1(qgetenv("SystemDrive").constData());
- if (ret.isEmpty())
- ret = QLatin1String("c:");
- ret.append(QLatin1Char('/'));
-#elif defined(Q_OS_OS2EMX)
- char dir[4];
- _abspath(dir, QLatin1String("/"), _MAX_PATH);
- QString ret(dir);
-#endif
- return ret;
+ return QFileSystemEngine::rootPath();
}
QString QFSFileEngine::tempPath()
{
- QString ret;
- {
- wchar_t tempPath[MAX_PATH];
- if (GetTempPath(MAX_PATH, tempPath))
- ret = QString::fromWCharArray(tempPath);
- if (!ret.isEmpty()) {
- while (ret.endsWith(QLatin1Char('\\')))
- ret.chop(1);
- ret = QDir::fromNativeSeparators(ret);
- }
- }
- if (ret.isEmpty()) {
-#if !defined(Q_OS_WINCE)
- ret = QLatin1String("c:/tmp");
-#else
- ret = QLatin1String("/Temp");
-#endif
- }
- return ret;
+ return QFileSystemEngine::tempPath();
}
QFileInfoList QFSFileEngine::drives()
@@ -1167,232 +596,25 @@ QFileInfoList QFSFileEngine::drives()
#endif
}
-bool QFSFileEnginePrivate::doStat() const
+bool QFSFileEnginePrivate::doStat(QFileSystemMetaData::MetaDataFlags flags) const
{
- if (!tried_stat) {
+ if (!tried_stat || !metaData.hasFlags(flags)) {
tried_stat = true;
- could_stat = false;
-
- if (filePath.isEmpty())
- return could_stat;
-
- QString fname;
- if(filePath.endsWith(QLatin1String(".lnk"))) {
- fname = readLink(filePath);
- if(fname.isEmpty())
- return could_stat;
- }
- else
- fname = filePath;
- fname = fixIfRelativeUncPath(fname);
-
- UINT oldmode = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);
-
- if (fd != -1) {
-#if !defined(Q_OS_WINCE)
- HANDLE fh = (HANDLE)_get_osfhandle(fd);
- if (fh != INVALID_HANDLE_VALUE) {
- BY_HANDLE_FILE_INFORMATION fileInfo;
- if (GetFileInformationByHandle(fh, &fileInfo)) {
- could_stat = true;
- fileAttrib = fileInfo.dwFileAttributes;
- }
- }
-#else
- DWORD tmpAttributes = GetFileAttributes((wchar_t*)QFSFileEnginePrivate::longFileName(fname).utf16());
- if (tmpAttributes != -1) {
- fileAttrib = tmpAttributes;
- could_stat = true;
- }
-#endif
- } else {
- fileAttrib = GetFileAttributes((wchar_t*)QFSFileEnginePrivate::longFileName(fname).utf16());
- if (fileAttrib == INVALID_FILE_ATTRIBUTES) {
- int errorCode = GetLastError();
- if (errorCode == ERROR_ACCESS_DENIED || errorCode == ERROR_SHARING_VIOLATION) {
- QString path = QDir::toNativeSeparators(fname);
- // path for the FindFirstFile should not end with a trailing slash
- while (path.endsWith(QLatin1Char('\\')))
- path.chop(1);
-
- // FindFirstFile can not handle drives
- if (!path.endsWith(QLatin1Char(':'))) {
- WIN32_FIND_DATA findData;
- HANDLE hFind = ::FindFirstFile((wchar_t*)QFSFileEnginePrivate::longFileName(path).utf16(),
- &findData);
- if (hFind != INVALID_HANDLE_VALUE) {
- ::FindClose(hFind);
- fileAttrib = findData.dwFileAttributes;
- }
- }
- }
- }
- could_stat = fileAttrib != INVALID_FILE_ATTRIBUTES;
- if (!could_stat) {
#if !defined(Q_OS_WINCE)
- if (isDriveRoot(fname)) {
- // a valid drive ??
- DWORD drivesBitmask = ::GetLogicalDrives();
- int drivebit = 1 << (fname.at(0).toUpper().unicode() - QLatin1Char('A').unicode());
- if (drivesBitmask & drivebit) {
- fileAttrib = FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_SYSTEM;
- could_stat = true;
- }
- } else {
+ int localFd = fd;
+ if (fh && fileEntry.isEmpty())
+ localFd = QT_FILENO(fh);
+ if (localFd != -1)
+ QFileSystemEngine::fillMetaData(localFd, metaData, flags);
#endif
- QString path = QDir::toNativeSeparators(fname);
- bool is_dir = false;
- if (path.startsWith(QLatin1String("\\\\"))) {
- // UNC - stat doesn't work for all cases (Windows bug)
- int s = path.indexOf(path.at(0),2);
- if (s > 0) {
- // "\\server\..."
- s = path.indexOf(path.at(0),s+1);
- if (s > 0) {
- // "\\server\share\..."
- if (s == path.size() - 1) {
- // "\\server\share\"
- is_dir = true;
- } else {
- // "\\server\share\notfound"
- }
- } else {
- // "\\server\share"
- is_dir = true;
- }
- } else {
- // "\\server"
- is_dir = true;
- }
- }
- if (is_dir && uncShareExists(path)) {
- // looks like a UNC dir, is a dir.
- fileAttrib = FILE_ATTRIBUTE_DIRECTORY;
- could_stat = true;
- }
-#if !defined(Q_OS_WINCE)
- }
-#endif
- }
- }
-
- SetErrorMode(oldmode);
+ if (metaData.missingFlags(flags) && !fileEntry.isEmpty())
+ QFileSystemEngine::fillMetaData(fileEntry, metaData, metaData.missingFlags(flags));
}
- return could_stat;
-}
-
-static QString readSymLink(const QString &link)
-{
- QString result;
-#if !defined(Q_OS_WINCE)
- HANDLE handle = CreateFile((wchar_t*)QFSFileEnginePrivate::longFileName(link).utf16(),
- FILE_READ_EA,
- FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
- 0,
- OPEN_EXISTING,
- FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT,
- 0);
- if (handle != INVALID_HANDLE_VALUE) {
- DWORD bufsize = MAXIMUM_REPARSE_DATA_BUFFER_SIZE;
- REPARSE_DATA_BUFFER *rdb = (REPARSE_DATA_BUFFER*)qMalloc(bufsize);
- DWORD retsize = 0;
- if (::DeviceIoControl(handle, FSCTL_GET_REPARSE_POINT, 0, 0, rdb, bufsize, &retsize, 0)) {
- if (rdb->ReparseTag == IO_REPARSE_TAG_MOUNT_POINT) {
- int length = rdb->MountPointReparseBuffer.SubstituteNameLength / sizeof(wchar_t);
- int offset = rdb->MountPointReparseBuffer.SubstituteNameOffset / sizeof(wchar_t);
- const wchar_t* PathBuffer = &rdb->MountPointReparseBuffer.PathBuffer[offset];
- result = QString::fromWCharArray(PathBuffer, length);
- } else if (rdb->ReparseTag == IO_REPARSE_TAG_SYMLINK) {
- int length = rdb->SymbolicLinkReparseBuffer.SubstituteNameLength / sizeof(wchar_t);
- int offset = rdb->SymbolicLinkReparseBuffer.SubstituteNameOffset / sizeof(wchar_t);
- const wchar_t* PathBuffer = &rdb->SymbolicLinkReparseBuffer.PathBuffer[offset];
- result = QString::fromWCharArray(PathBuffer, length);
- }
- // cut-off "//?/" and "/??/"
- if (result.size() > 4 && result.at(0) == QLatin1Char('\\') && result.at(2) == QLatin1Char('?') && result.at(3) == QLatin1Char('\\'))
- result = result.mid(4);
- }
- qFree(rdb);
- CloseHandle(handle);
-
-#if !defined(QT_NO_LIBRARY)
- QFSFileEnginePrivate::resolveLibs();
- if (ptrGetVolumePathNamesForVolumeNameW) {
- QRegExp matchVolName(QLatin1String("^Volume\\{([a-z]|[0-9]|-)+\\}\\\\"), Qt::CaseInsensitive);
- if(matchVolName.indexIn(result) == 0) {
- DWORD len;
- wchar_t buffer[MAX_PATH];
- QString volumeName = result.mid(0, matchVolName.matchedLength()).prepend(QLatin1String("\\\\?\\"));
- if(ptrGetVolumePathNamesForVolumeNameW((wchar_t*)volumeName.utf16(), buffer, MAX_PATH, &len) != 0)
- result.replace(0,matchVolName.matchedLength(), QString::fromWCharArray(buffer));
- }
- }
-#endif
- }
-#else
- Q_UNUSED(link);
-#endif // Q_OS_WINCE
- return result;
+ return metaData.exists();
}
-static QString readLink(const QString &link)
-{
-#if !defined(Q_OS_WINCE)
-#if !defined(QT_NO_LIBRARY) && !defined(Q_CC_MWERKS)
- QString ret;
-
- bool neededCoInit = false;
- IShellLink *psl; // pointer to IShellLink i/f
- WIN32_FIND_DATA wfd;
- wchar_t szGotPath[MAX_PATH];
-
- // Get pointer to the IShellLink interface.
- HRESULT hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID *)&psl);
-
- if (hres == CO_E_NOTINITIALIZED) { // COM was not initialized
- neededCoInit = true;
- CoInitialize(NULL);
- hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
- IID_IShellLink, (LPVOID *)&psl);
- }
- if (SUCCEEDED(hres)) { // Get pointer to the IPersistFile interface.
- IPersistFile *ppf;
- hres = psl->QueryInterface(IID_IPersistFile, (LPVOID *)&ppf);
- if (SUCCEEDED(hres)) {
- hres = ppf->Load((LPOLESTR)link.utf16(), STGM_READ);
- //The original path of the link is retrieved. If the file/folder
- //was moved, the return value still have the old path.
- if (SUCCEEDED(hres)) {
- if (psl->GetPath(szGotPath, MAX_PATH, &wfd, SLGP_UNCPRIORITY) == NOERROR)
- ret = QString::fromWCharArray(szGotPath);
- }
- ppf->Release();
- }
- psl->Release();
- }
- if (neededCoInit)
- CoUninitialize();
-
- return ret;
-#else
- Q_UNUSED(link);
- return QString();
-#endif // QT_NO_LIBRARY
-#else
- wchar_t target[MAX_PATH];
- QString result;
- if (SHGetShortcutTarget((wchar_t*)QFileInfo(link).absoluteFilePath().replace(QLatin1Char('/'),QLatin1Char('\\')).utf16(), target, MAX_PATH)) {
- result = QString::fromWCharArray(target);
- if (result.startsWith(QLatin1Char('"')))
- result.remove(0,1);
- if (result.endsWith(QLatin1Char('"')))
- result.remove(result.size()-1,1);
- }
- return result;
-#endif // Q_OS_WINCE
-}
bool QFSFileEngine::link(const QString &newName)
{
@@ -1457,191 +679,63 @@ bool QFSFileEngine::link(const QString &newName)
#endif // Q_OS_WINCE
}
-QAbstractFileEngine::FileFlags QFSFileEnginePrivate::getPermissions(QAbstractFileEngine::FileFlags type) const
+/*!
+ \reimp
+*/
+QAbstractFileEngine::FileFlags QFSFileEngine::fileFlags(QAbstractFileEngine::FileFlags type) const
{
+ Q_D(const QFSFileEngine);
+
+ if (type & Refresh)
+ d->metaData.clear();
+
QAbstractFileEngine::FileFlags ret = 0;
-#if !defined(QT_NO_LIBRARY)
- if((qt_ntfs_permission_lookup > 0) && (QSysInfo::WindowsVersion & QSysInfo::WV_NT_based)) {
- resolveLibs();
- if(ptrGetNamedSecurityInfoW && ptrBuildTrusteeWithSidW && ptrGetEffectiveRightsFromAclW) {
- enum { ReadMask = 0x00000001, WriteMask = 0x00000002, ExecMask = 0x00000020 };
-
- QString fname = filePath.endsWith(QLatin1String(".lnk")) ? readLink(filePath) : filePath;
- PSID pOwner = 0;
- PSID pGroup = 0;
- PACL pDacl;
- PSECURITY_DESCRIPTOR pSD;
- DWORD res = ptrGetNamedSecurityInfoW((wchar_t*)fname.utf16(), SE_FILE_OBJECT,
- OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION,
- &pOwner, &pGroup, &pDacl, 0, &pSD);
- if(res == ERROR_SUCCESS) {
- ACCESS_MASK access_mask;
- TRUSTEE_W trustee;
- if (type & 0x0700) { // user
- if(ptrGetEffectiveRightsFromAclW(pDacl, &currentUserTrusteeW, &access_mask) != ERROR_SUCCESS)
- access_mask = (ACCESS_MASK)-1;
- if(access_mask & ReadMask)
- ret |= QAbstractFileEngine::ReadUserPerm;
- if(access_mask & WriteMask)
- ret |= QAbstractFileEngine::WriteUserPerm;
- if(access_mask & ExecMask)
- ret |= QAbstractFileEngine::ExeUserPerm;
- }
- if (type & 0x7000) { // owner
- ptrBuildTrusteeWithSidW(&trustee, pOwner);
- if(ptrGetEffectiveRightsFromAclW(pDacl, &trustee, &access_mask) != ERROR_SUCCESS)
- access_mask = (ACCESS_MASK)-1;
- if(access_mask & ReadMask)
- ret |= QAbstractFileEngine::ReadOwnerPerm;
- if(access_mask & WriteMask)
- ret |= QAbstractFileEngine::WriteOwnerPerm;
- if(access_mask & ExecMask)
- ret |= QAbstractFileEngine::ExeOwnerPerm;
- }
- if (type & 0x0070) { // group
- ptrBuildTrusteeWithSidW(&trustee, pGroup);
- if(ptrGetEffectiveRightsFromAclW(pDacl, &trustee, &access_mask) != ERROR_SUCCESS)
- access_mask = (ACCESS_MASK)-1;
- if(access_mask & ReadMask)
- ret |= QAbstractFileEngine::ReadGroupPerm;
- if(access_mask & WriteMask)
- ret |= QAbstractFileEngine::WriteGroupPerm;
- if(access_mask & ExecMask)
- ret |= QAbstractFileEngine::ExeGroupPerm;
- }
- if (type & 0x0007) { // other (world)
- if(ptrGetEffectiveRightsFromAclW(pDacl, &worldTrusteeW, &access_mask) != ERROR_SUCCESS)
- access_mask = (ACCESS_MASK)-1; // ###
- if(access_mask & ReadMask)
- ret |= QAbstractFileEngine::ReadOtherPerm;
- if(access_mask & WriteMask)
- ret |= QAbstractFileEngine::WriteOtherPerm;
- if(access_mask & ExecMask)
- ret |= QAbstractFileEngine::ExeOtherPerm;
- }
- LocalFree(pSD);
- }
- }
- } else
-#endif
+ if (type & FlagsMask)
+ ret |= LocalDiskFlag;
+
+ bool exists;
{
- //### what to do with permissions if we don't use NTFS
- // for now just add all permissions and what about exe missions ??
- // also qt_ntfs_permission_lookup is now not set by default ... should it ?
- ret |= QAbstractFileEngine::ReadOwnerPerm | QAbstractFileEngine::ReadGroupPerm
- | QAbstractFileEngine::ReadOtherPerm;
-
- if (!(fileAttrib & FILE_ATTRIBUTE_READONLY)) {
- ret |= QAbstractFileEngine::WriteOwnerPerm | QAbstractFileEngine::WriteGroupPerm
- | QAbstractFileEngine::WriteOtherPerm;
- }
+ QFileSystemMetaData::MetaDataFlags queryFlags = 0;
- QString fname = filePath.endsWith(QLatin1String(".lnk")) ? readLink(filePath) : filePath;
- QString ext = fname.right(4).toLower();
- if ((fileAttrib & FILE_ATTRIBUTE_DIRECTORY) ||
- ext == QLatin1String(".exe") || ext == QLatin1String(".com") || ext == QLatin1String(".bat") ||
- ext == QLatin1String(".pif") || ext == QLatin1String(".cmd")) {
- ret |= QAbstractFileEngine::ExeOwnerPerm | QAbstractFileEngine::ExeGroupPerm
- | QAbstractFileEngine::ExeOtherPerm | QAbstractFileEngine::ExeUserPerm;
- }
+ queryFlags |= QFileSystemMetaData::MetaDataFlags(uint(type))
+ & QFileSystemMetaData::Permissions;
- // calculate user permissions
- if (type & QAbstractFileEngine::ReadUserPerm) {
- if (::_waccess((wchar_t*)longFileName(fname).utf16(), R_OK) == 0)
- ret |= QAbstractFileEngine::ReadUserPerm;
- }
- if (type & QAbstractFileEngine::WriteUserPerm) {
- if (::_waccess((wchar_t*)longFileName(fname).utf16(), W_OK) == 0)
- ret |= QAbstractFileEngine::WriteUserPerm;
- }
- }
- return ret;
-}
+ // AliasType and BundleType are 0x0
+ if (type & TypesMask)
+ queryFlags |= QFileSystemMetaData::AliasType
+ | QFileSystemMetaData::LinkType
+ | QFileSystemMetaData::FileType
+ | QFileSystemMetaData::DirectoryType
+ | QFileSystemMetaData::BundleType;
-/*!
- \internal
-*/
-bool QFSFileEnginePrivate::isSymlink() const
-{
-#if !defined(Q_OS_WINCE)
- if (need_lstat) {
- need_lstat = false;
- is_link = false;
-
- if (fileAttrib & FILE_ATTRIBUTE_REPARSE_POINT) {
- QString path = QDir::toNativeSeparators(filePath);
- // path for the FindFirstFile should not end with a trailing slash
- while (path.endsWith(QLatin1Char('\\')))
- path.chop(1);
-
- WIN32_FIND_DATA findData;
- HANDLE hFind = ::FindFirstFile((wchar_t*)QFSFileEnginePrivate::longFileName(path).utf16(),
- &findData);
- if (hFind != INVALID_HANDLE_VALUE) {
- ::FindClose(hFind);
- if ((findData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)
- && (findData.dwReserved0 == IO_REPARSE_TAG_SYMLINK || findData.dwReserved0 == IO_REPARSE_TAG_MOUNT_POINT)) {
- is_link = true;
- }
- }
- }
- }
- return is_link;
-#else
- return false;
-#endif // Q_OS_WINCE
-}
+ if (type & FlagsMask)
+ queryFlags |= QFileSystemMetaData::HiddenAttribute
+ | QFileSystemMetaData::ExistsAttribute;
-/*!
- \reimp
-*/
-QAbstractFileEngine::FileFlags QFSFileEngine::fileFlags(QAbstractFileEngine::FileFlags type) const
-{
- Q_D(const QFSFileEngine);
- QAbstractFileEngine::FileFlags ret = 0;
- // Force a stat, so that we're guaranteed to get up-to-date results
- if (type & Refresh) {
- d->tried_stat = 0;
-#if !defined(Q_OS_WINCE)
- d->need_lstat = 1;
-#endif
- }
+ queryFlags |= QFileSystemMetaData::LinkType;
- if (type & PermsMask) {
- if (d->doStat()) {
- ret |= ExistsFlag;
- ret |= d->getPermissions(type);
- }
+ exists = d->doStat(queryFlags);
}
+
+ if (exists && (type & PermsMask))
+ ret |= FileFlags(uint(d->metaData.permissions()));
+
if (type & TypesMask) {
- if (d->filePath.endsWith(QLatin1String(".lnk"))) {
+ if ((type & LinkType) && d->metaData.isLegacyLink())
ret |= LinkType;
- QString l = readLink(d->filePath);
- if (!l.isEmpty()) {
- bool existed = false;
- if (isDirPath(l, &existed) && existed)
- ret |= DirectoryType;
- else if (existed)
- ret |= FileType;
- }
- } else if (d->doStat()) {
- if ((type & LinkType) && d->isSymlink())
- ret |= LinkType;
- if (d->fileAttrib & FILE_ATTRIBUTE_DIRECTORY) {
- ret |= DirectoryType;
- } else {
- ret |= FileType;
- }
+ if (d->metaData.isDirectory()) {
+ ret |= DirectoryType;
+ } else {
+ ret |= FileType;
}
}
if (type & FlagsMask) {
- ret |= LocalDiskFlag;
- if (d->doStat()) {
+ if (d->metaData.exists()) {
ret |= ExistsFlag;
- if (d->filePath == QLatin1String("/") || isDriveRoot(d->filePath) || isUncRoot(d->filePath))
+ if (d->fileEntry.isRoot())
ret |= RootFlag;
- else if (d->fileAttrib & FILE_ATTRIBUTE_HIDDEN)
+ else if (d->metaData.isHidden())
ret |= HiddenFlag;
}
}
@@ -1652,50 +746,28 @@ QString QFSFileEngine::fileName(FileName file) const
{
Q_D(const QFSFileEngine);
if (file == BaseName) {
- int slash = d->filePath.lastIndexOf(QLatin1Char('/'));
- if (slash == -1) {
- int colon = d->filePath.lastIndexOf(QLatin1Char(':'));
- if (colon != -1)
- return d->filePath.mid(colon + 1);
- return d->filePath;
- }
- return d->filePath.mid(slash + 1);
+ return d->fileEntry.fileName();
} else if (file == PathName) {
- if (!d->filePath.size())
- return d->filePath;
-
- int slash = d->filePath.lastIndexOf(QLatin1Char('/'));
- if (slash == -1) {
- if (d->filePath.length() >= 2 && d->filePath.at(1) == QLatin1Char(':'))
- return d->filePath.left(2);
- return QString(QLatin1Char('.'));
- } else {
- if (!slash)
- return QString(QLatin1Char('/'));
- if (slash == 2 && d->filePath.length() >= 2 && d->filePath.at(1) == QLatin1Char(':'))
- slash++;
- return d->filePath.left(slash);
- }
+ return d->fileEntry.path();
} else if (file == AbsoluteName || file == AbsolutePathName) {
QString ret;
if (!isRelativePath()) {
#if !defined(Q_OS_WINCE)
- if (d->filePath.startsWith(QLatin1Char('/')) || // It's a absolute path to the current drive, so \a.txt -> Z:\a.txt
- d->filePath.size() == 2 || // It's a drive letter that needs to get a working dir appended
- (d->filePath.size() > 2 && d->filePath.at(2) != QLatin1Char('/')) || // It's a drive-relative path, so Z:a.txt -> Z:\currentpath\a.txt
- d->filePath.contains(QLatin1String("/../")) || d->filePath.contains(QLatin1String("/./")) ||
- d->filePath.endsWith(QLatin1String("/..")) || d->filePath.endsWith(QLatin1String("/.")))
+ if (d->fileEntry.filePath().startsWith(QLatin1Char('/')) || // It's a absolute path to the current drive, so \a.txt -> Z:\a.txt
+ d->fileEntry.filePath().size() == 2 || // It's a drive letter that needs to get a working dir appended
+ (d->fileEntry.filePath().size() > 2 && d->fileEntry.filePath().at(2) != QLatin1Char('/')) || // It's a drive-relative path, so Z:a.txt -> Z:\currentpath\a.txt
+ d->fileEntry.filePath().contains(QLatin1String("/../")) || d->fileEntry.filePath().contains(QLatin1String("/./")) ||
+ d->fileEntry.filePath().endsWith(QLatin1String("/..")) || d->fileEntry.filePath().endsWith(QLatin1String("/.")))
{
- ret = QDir::fromNativeSeparators(nativeAbsoluteFilePath(d->filePath));
- } else {
- ret = d->filePath;
- }
-#else
- ret = d->filePath;
+ ret = QDir::fromNativeSeparators(QFileSystemEngine::nativeAbsoluteFilePath(d->fileEntry.filePath()));
+ } else
#endif
+ {
+ ret = d->fileEntry.filePath();
+ }
} else {
- ret = QDir::cleanPath(QDir::currentPath() + QLatin1Char('/') + d->filePath);
+ ret = QDir::cleanPath(QDir::currentPath() + QLatin1Char('/') + d->fileEntry.filePath());
}
// The path should be absolute at this point.
@@ -1724,38 +796,24 @@ QString QFSFileEngine::fileName(FileName file) const
} else if (file == CanonicalName || file == CanonicalPathName) {
if (!(fileFlags(ExistsFlag) & ExistsFlag))
return QString();
+ QFileSystemEntry entry(QFileSystemEngine::canonicalName(QFileSystemEntry(fileName(AbsoluteName)), d->metaData));
- QString ret = QFSFileEnginePrivate::canonicalized(fileName(AbsoluteName));
- if (!ret.isEmpty() && file == CanonicalPathName) {
- int slash = ret.lastIndexOf(QLatin1Char('/'));
- if (slash == -1)
- ret = QDir::currentPath();
- else if (slash == 0)
- ret = QString(QLatin1Char('/'));
- ret = ret.left(slash);
- }
- return ret;
+ if (file == CanonicalPathName)
+ return entry.path();
+ return entry.filePath();
} else if (file == LinkName) {
- QString ret;
- if (d->filePath.endsWith(QLatin1String(".lnk")))
- ret = readLink(d->filePath);
- else if (d->doStat() && d->isSymlink())
- ret = readSymLink(d->filePath);
- return QDir::fromNativeSeparators(ret);
+ return QFileSystemEngine::getLinkTarget(d->fileEntry, d->metaData).filePath();
} else if (file == BundleName) {
return QString();
}
- return d->filePath;
+ return d->fileEntry.filePath();
}
bool QFSFileEngine::isRelativePath() const
{
Q_D(const QFSFileEngine);
// drive, e.g. "a:", or UNC root, e.q. "//"
- return !(d->filePath.startsWith(QLatin1Char('/'))
- || (d->filePath.length() >= 2
- && ((d->filePath.at(0).isLetter() && d->filePath.at(1) == QLatin1Char(':'))
- || (d->filePath.at(0) == QLatin1Char('/') && d->filePath.at(1) == QLatin1Char('/')))));
+ return d->fileEntry.isRelative();
}
uint QFSFileEngine::ownerId(FileOwner /*own*/) const
@@ -1766,69 +824,17 @@ uint QFSFileEngine::ownerId(FileOwner /*own*/) const
QString QFSFileEngine::owner(FileOwner own) const
{
- QString name;
-#if !defined(QT_NO_LIBRARY)
Q_D(const QFSFileEngine);
- if((qt_ntfs_permission_lookup > 0) && (QSysInfo::WindowsVersion & QSysInfo::WV_NT_based)) {
- QFSFileEnginePrivate::resolveLibs();
- if (ptrGetNamedSecurityInfoW && ptrLookupAccountSidW) {
- PSID pOwner = 0;
- PSECURITY_DESCRIPTOR pSD;
- if (ptrGetNamedSecurityInfoW((wchar_t*)d->filePath.utf16(), SE_FILE_OBJECT,
- own == OwnerGroup ? GROUP_SECURITY_INFORMATION : OWNER_SECURITY_INFORMATION,
- own == OwnerUser ? &pOwner : 0, own == OwnerGroup ? &pOwner : 0,
- 0, 0, &pSD) == ERROR_SUCCESS) {
- DWORD lowner = 64;
- DWORD ldomain = 64;
- QVarLengthArray<wchar_t, 64> owner(lowner);
- QVarLengthArray<wchar_t, 64> domain(ldomain);
- SID_NAME_USE use = SidTypeUnknown;
- // First call, to determine size of the strings (with '\0').
- if (!ptrLookupAccountSidW(NULL, pOwner, (LPWSTR)owner.data(), &lowner,
- (LPWSTR)domain.data(), &ldomain, (SID_NAME_USE*)&use)) {
- if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
- if (lowner > (DWORD)owner.size())
- owner.resize(lowner);
- if (ldomain > (DWORD)domain.size())
- domain.resize(ldomain);
- // Second call, try on resized buf-s
- if (!ptrLookupAccountSidW(NULL, pOwner, (LPWSTR)owner.data(), &lowner,
- (LPWSTR)domain.data(), &ldomain, (SID_NAME_USE*)&use)) {
- lowner = 0;
- }
- } else {
- lowner = 0;
- }
- }
- if (lowner != 0)
- name = QString::fromWCharArray(owner.data());
- LocalFree(pSD);
- }
- }
- }
-#else
- Q_UNUSED(own);
-#endif
- return name;
+ return QFileSystemEngine::owner(d->fileEntry, own);
}
bool QFSFileEngine::setPermissions(uint perms)
{
Q_D(QFSFileEngine);
- bool ret = false;
- int mode = 0;
-
- if (perms & QFile::ReadOwner || perms & QFile::ReadUser || perms & QFile::ReadGroup || perms & QFile::ReadOther)
- mode |= _S_IREAD;
- if (perms & QFile::WriteOwner || perms & QFile::WriteUser || perms & QFile::WriteGroup || perms & QFile::WriteOther)
- mode |= _S_IWRITE;
-
- if (mode == 0) // not supported
- return false;
-
- ret = ::_wchmod((wchar_t*)QFSFileEnginePrivate::longFileName(d->filePath).utf16(), mode) == 0;
+ QSystemError error;
+ bool ret = QFileSystemEngine::setPermissions(d->fileEntry, QFile::Permissions(perms), error);
if (!ret)
- setError(QFile::PermissionsError, qt_error_string(errno));
+ setError(QFile::PermissionsError, error.toString());
return ret;
}
@@ -1836,12 +842,16 @@ bool QFSFileEngine::setSize(qint64 size)
{
Q_D(QFSFileEngine);
- if (d->fileHandle != INVALID_HANDLE_VALUE || d->fd != -1) {
+ if (d->fileHandle != INVALID_HANDLE_VALUE || d->fd != -1 || d->fh) {
// resize open file
HANDLE fh = d->fileHandle;
#if !defined(Q_OS_WINCE)
- if (fh == INVALID_HANDLE_VALUE)
- fh = (HANDLE)_get_osfhandle(d->fd);
+ if (fh == INVALID_HANDLE_VALUE) {
+ if (d->fh)
+ fh = (HANDLE)_get_osfhandle(QT_FILENO(d->fh));
+ else
+ fh = (HANDLE)_get_osfhandle(d->fd);
+ }
#endif
if (fh == INVALID_HANDLE_VALUE)
return false;
@@ -1856,9 +866,9 @@ bool QFSFileEngine::setSize(qint64 size)
return false;
}
- if (!d->nativeFilePath.isEmpty()) {
+ if (!d->fileEntry.isEmpty()) {
// resize file on disk
- QFile file(d->filePath);
+ QFile file(d->fileEntry.filePath());
if (file.open(QFile::ReadWrite)) {
bool ret = file.resize(size);
if (!ret)
@@ -1870,94 +880,14 @@ bool QFSFileEngine::setSize(qint64 size)
}
-static inline QDateTime fileTimeToQDateTime(const FILETIME *time)
-{
- QDateTime ret;
-
-#if defined(Q_OS_WINCE)
- SYSTEMTIME systime;
- FILETIME ftime;
- systime.wYear = 1970;
- systime.wMonth = 1;
- systime.wDay = 1;
- systime.wHour = 0;
- systime.wMinute = 0;
- systime.wSecond = 0;
- systime.wMilliseconds = 0;
- systime.wDayOfWeek = 4;
- SystemTimeToFileTime(&systime, &ftime);
- unsigned __int64 acttime = (unsigned __int64)time->dwHighDateTime << 32 | time->dwLowDateTime;
- FileTimeToSystemTime(time, &systime);
- unsigned __int64 time1970 = (unsigned __int64)ftime.dwHighDateTime << 32 | ftime.dwLowDateTime;
- unsigned __int64 difftime = acttime - time1970;
- difftime /= 10000000;
- ret.setTime_t((unsigned int)difftime);
-#else
- SYSTEMTIME sTime, lTime;
- FileTimeToSystemTime(time, &sTime);
- SystemTimeToTzSpecificLocalTime(0, &sTime, &lTime);
- ret.setDate(QDate(lTime.wYear, lTime.wMonth, lTime.wDay));
- ret.setTime(QTime(lTime.wHour, lTime.wMinute, lTime.wSecond, lTime.wMilliseconds));
-#endif
-
- return ret;
-}
-
QDateTime QFSFileEngine::fileTime(FileTime time) const
{
Q_D(const QFSFileEngine);
- QDateTime ret;
- if (d->fd != -1) {
-#if !defined(Q_OS_WINCE)
- HANDLE fh = (HANDLE)_get_osfhandle(d->fd);
- if (fh != INVALID_HANDLE_VALUE) {
- FILETIME creationTime, lastAccessTime, lastWriteTime;
- if (GetFileTime(fh, &creationTime, &lastAccessTime, &lastWriteTime)) {
- if(time == CreationTime)
- ret = fileTimeToQDateTime(&creationTime);
- else if(time == ModificationTime)
- ret = fileTimeToQDateTime(&lastWriteTime);
- else if(time == AccessTime)
- ret = fileTimeToQDateTime(&lastAccessTime);
- }
- }
-#endif
- } else {
- WIN32_FILE_ATTRIBUTE_DATA attribData;
- bool ok = ::GetFileAttributesEx((wchar_t*)QFSFileEnginePrivate::longFileName(d->filePath).utf16(), GetFileExInfoStandard, &attribData);
- if (!ok) {
- int errorCode = GetLastError();
- if (errorCode == ERROR_ACCESS_DENIED || errorCode == ERROR_SHARING_VIOLATION) {
- QString path = QDir::toNativeSeparators(d->filePath);
- // path for the FindFirstFile should not end with a trailing slash
- while (path.endsWith(QLatin1Char('\\')))
- path.chop(1);
-
- // FindFirstFile can not handle drives
- if (!path.endsWith(QLatin1Char(':'))) {
- WIN32_FIND_DATA findData;
- HANDLE hFind = ::FindFirstFile((wchar_t*)QFSFileEnginePrivate::longFileName(path).utf16(),
- &findData);
- if (hFind != INVALID_HANDLE_VALUE) {
- ::FindClose(hFind);
- ok = true;
- attribData.ftCreationTime = findData.ftCreationTime;
- attribData.ftLastWriteTime = findData.ftLastWriteTime;
- attribData.ftLastAccessTime = findData.ftLastAccessTime;
- }
- }
- }
- }
- if (ok) {
- if(time == CreationTime)
- ret = fileTimeToQDateTime(&attribData.ftCreationTime);
- else if(time == ModificationTime)
- ret = fileTimeToQDateTime(&attribData.ftLastWriteTime);
- else if(time == AccessTime)
- ret = fileTimeToQDateTime(&attribData.ftLastAccessTime);
- }
- }
- return ret;
+
+ if (d->doStat(QFileSystemMetaData::Times))
+ return d->metaData.fileTime(time);
+
+ return QDateTime();
}
uchar *QFSFileEnginePrivate::map(qint64 offset, qint64 size,
@@ -1986,7 +916,7 @@ uchar *QFSFileEnginePrivate::map(qint64 offset, qint64 size,
#ifdef Q_USE_DEPRECATED_MAP_API
nativeClose();
// handle automatically closed by kernel with mapHandle (below).
- handle = ::CreateFileForMapping((const wchar_t*)nativeFilePath.constData(),
+ handle = ::CreateFileForMapping((const wchar_t*)fileEntry.nativeFilePath().utf16(),
GENERIC_READ | (openMode & QIODevice::WriteOnly ? GENERIC_WRITE : 0),
0,
NULL,
diff --git a/src/corelib/io/qprocess_symbian.cpp b/src/corelib/io/qprocess_symbian.cpp
index 003e781..5b283a5 100644
--- a/src/corelib/io/qprocess_symbian.cpp
+++ b/src/corelib/io/qprocess_symbian.cpp
@@ -1050,6 +1050,7 @@ bool QProcessPrivate::startDetached(const QString &program, const QStringList &a
newProc->Resume();
newProc->Close();
+ delete newProc;
return true;
}
diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp
index 216c382..e52d132 100644
--- a/src/corelib/io/qprocess_unix.cpp
+++ b/src/corelib/io/qprocess_unix.cpp
@@ -169,17 +169,27 @@ private:
Q_GLOBAL_STATIC(QMutex, processManagerGlobalMutex)
-static QProcessManager *processManager() {
+static QProcessManager *processManagerInstance = 0;
+
+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);
- static QProcessManager processManager;
- return &processManager;
+
+ if (!processManagerInstance)
+ QProcessPrivate::initializeProcessManager();
+
+ Q_ASSERT(processManagerInstance);
+ return processManagerInstance;
}
QProcessManager::QProcessManager()
{
+ // can only be called from main thread
+ Q_ASSERT(!qApp || qApp->thread() == QThread::currentThread());
+
#if defined (QPROCESS_DEBUG)
qDebug() << "QProcessManager::QProcessManager()";
#endif
@@ -198,6 +208,8 @@ 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()
@@ -226,6 +238,8 @@ QProcessManager::~QProcessManager()
if (oldAction.sa_handler != qt_sa_sigchld_handler) {
::sigaction(SIGCHLD, &oldAction, 0);
}
+
+ processManagerInstance = 0;
}
void QProcessManager::run()
@@ -1289,7 +1303,15 @@ bool QProcessPrivate::startDetached(const QString &program, const QStringList &a
void QProcessPrivate::initializeProcessManager()
{
- (void) processManager();
+ 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);
+ }
}
QT_END_NAMESPACE
diff --git a/src/corelib/io/qresource.cpp b/src/corelib/io/qresource.cpp
index 98b1dcc..72ab845 100644
--- a/src/corelib/io/qresource.cpp
+++ b/src/corelib/io/qresource.cpp
@@ -187,7 +187,7 @@ Q_GLOBAL_STATIC(QStringList, resourceSearchPaths)
A QResource can either be loaded with an absolute path, either treated
as a file system rooted with a \c{/} character, or in resource notation
rooted with a \c{:} character. A relative resource can also be opened
- which will be found through the searchPaths().
+ which will be found in the list of paths returned by QDir::searchPaths().
A QResource that is representing a file will have data backing it, this
data can possibly be compressed, in which case qUncompress() must be
diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp
index c34c4a4..79dfa35 100644
--- a/src/corelib/io/qtemporaryfile.cpp
+++ b/src/corelib/io/qtemporaryfile.cpp
@@ -295,7 +295,7 @@ public:
: QFSFileEngine(), filePathIsTemplate(fileIsTemplate)
{
Q_D(QFSFileEngine);
- d->filePath = file;
+ d->fileEntry = QFileSystemEntry(file);
if (!filePathIsTemplate)
QFSFileEngine::setFileName(file);
@@ -325,6 +325,9 @@ bool QTemporaryFileEngine::isReallyOpen()
Q_D(QFSFileEngine);
if (!((0 == d->fh) && (-1 == d->fd)
+#if defined (Q_OS_SYMBIAN)
+ && (0 == d->symbianFile.SubSessionHandle())
+#endif
#if defined Q_OS_WIN
&& (INVALID_HANDLE_VALUE == d->fileHandle)
#endif
@@ -346,7 +349,7 @@ void QTemporaryFileEngine::setFileTemplate(const QString &fileTemplate)
{
Q_D(QFSFileEngine);
if (filePathIsTemplate)
- d->filePath = fileTemplate;
+ d->fileEntry = QFileSystemEntry(fileTemplate);
}
bool QTemporaryFileEngine::open(QIODevice::OpenMode openMode)
@@ -359,7 +362,7 @@ bool QTemporaryFileEngine::open(QIODevice::OpenMode openMode)
if (!filePathIsTemplate)
return QFSFileEngine::open(openMode);
- QString qfilename = d->filePath;
+ QString qfilename = d->fileEntry.filePath();
if(!qfilename.contains(QLatin1String("XXXXXX")))
qfilename += QLatin1String(".XXXXXX");
@@ -377,9 +380,8 @@ bool QTemporaryFileEngine::open(QIODevice::OpenMode openMode)
d->closeFileHandle = true;
// Restore the file names (open() resets them).
- d->filePath = QString::fromLocal8Bit(filename); //changed now!
+ d->fileEntry = QFileSystemEntry(QString::fromLocal8Bit(filename)); //note that filename is NOT a native path
filePathIsTemplate = false;
- d->nativeInitFileName();
delete [] filename;
return true;
}
@@ -395,9 +397,8 @@ bool QTemporaryFileEngine::open(QIODevice::OpenMode openMode)
return false;
}
- QString template_ = d->filePath;
- d->filePath = QString::fromLocal8Bit(filename);
- d->nativeInitFileName();
+ QString template_ = d->fileEntry.filePath();
+ d->fileEntry = QFileSystemEntry(QString::fromLocal8Bit(filename));
delete [] filename;
if (QFSFileEngine::open(openMode)) {
@@ -405,8 +406,7 @@ bool QTemporaryFileEngine::open(QIODevice::OpenMode openMode)
return true;
}
- d->filePath = template_;
- d->nativeFilePath.clear();
+ d->fileEntry = QFileSystemEntry(template_);
return false;
#endif
}
@@ -418,7 +418,7 @@ bool QTemporaryFileEngine::remove()
// we must explicitly call QFSFileEngine::close() before we remove it.
QFSFileEngine::close();
if (QFSFileEngine::remove()) {
- d->filePath.clear();
+ d->fileEntry.clear();
return true;
}
return false;
diff --git a/src/corelib/io/qtextstream.cpp b/src/corelib/io/qtextstream.cpp
index 6091ec0..3bdbf32 100644
--- a/src/corelib/io/qtextstream.cpp
+++ b/src/corelib/io/qtextstream.cpp
@@ -224,6 +224,7 @@ static const int QTEXTSTREAM_BUFFERSIZE = 16384;
\value ReadPastEnd The text stream has read past the end of the
data in the underlying device.
\value ReadCorruptData The text stream has read corrupt data.
+ \value WriteFailed The text stream cannot write to the underlying device.
\sa status()
*/
@@ -396,19 +397,19 @@ public:
npsInvalidPrefix
};
- inline bool write(const QString &data);
inline bool getChar(QChar *ch);
inline void ungetChar(const QChar &ch);
NumberParsingStatus getNumber(qulonglong *l);
bool getReal(double *f);
- bool putNumber(qulonglong number, bool negative);
- inline bool putString(const QString &ch, bool number = false);
+ inline void write(const QString &data);
+ inline void putString(const QString &ch, bool number = false);
+ void putNumber(qulonglong number, bool negative);
// buffers
bool fillReadBuffer(qint64 maxBytes = -1);
void resetReadBuffer();
- bool flushWriteBuffer();
+ void flushWriteBuffer();
QString writeBuffer;
QString readBuffer;
int readBufferOffset;
@@ -642,14 +643,20 @@ void QTextStreamPrivate::resetReadBuffer()
/*! \internal
*/
-bool QTextStreamPrivate::flushWriteBuffer()
+void QTextStreamPrivate::flushWriteBuffer()
{
// no buffer next to the QString itself; this function should only
// be called internally, for devices.
if (string || !device)
- return false;
+ return;
+
+ // Stream went bye-bye already. Appending further data may succeed again,
+ // but would create a corrupted stream anyway.
+ if (status != QTextStream::Ok)
+ return;
+
if (writeBuffer.isEmpty())
- return true;
+ return;
#if defined (Q_OS_WIN)
// handle text translation and bypass the Text flag in the device.
@@ -681,8 +688,10 @@ bool QTextStreamPrivate::flushWriteBuffer()
qDebug("QTextStreamPrivate::flushWriteBuffer(), device->write(\"%s\") == %d",
qt_prettyDebug(data.constData(), qMin(data.size(),32), data.size()).constData(), int(bytesWritten));
#endif
- if (bytesWritten <= 0)
- return false;
+ if (bytesWritten <= 0) {
+ status = QTextStream::WriteFailed;
+ return;
+ }
#if defined (Q_OS_WIN)
// replace the text flag
@@ -693,7 +702,7 @@ bool QTextStreamPrivate::flushWriteBuffer()
// flush the file
#ifndef QT_NO_QOBJECT
QFile *file = qobject_cast<QFile *>(device);
- bool flushed = file && file->flush();
+ bool flushed = !file || file->flush();
#else
bool flushed = true;
#endif
@@ -702,7 +711,8 @@ bool QTextStreamPrivate::flushWriteBuffer()
qDebug("QTextStreamPrivate::flushWriteBuffer() wrote %d bytes",
int(bytesWritten));
#endif
- return flushed && bytesWritten == qint64(data.size());
+ if (!flushed || bytesWritten != qint64(data.size()))
+ status = QTextStream::WriteFailed;
}
QString QTextStreamPrivate::read(int maxlen)
@@ -908,7 +918,7 @@ inline void QTextStreamPrivate::restoreToSavedConverterState()
/*! \internal
*/
-inline bool QTextStreamPrivate::write(const QString &data)
+inline void QTextStreamPrivate::write(const QString &data)
{
if (string) {
// ### What about seek()??
@@ -916,9 +926,8 @@ inline bool QTextStreamPrivate::write(const QString &data)
} else {
writeBuffer += data;
if (writeBuffer.size() > QTEXTSTREAM_BUFFERSIZE)
- return flushWriteBuffer();
+ flushWriteBuffer();
}
- return true;
}
/*! \internal
@@ -959,7 +968,7 @@ inline void QTextStreamPrivate::ungetChar(const QChar &ch)
/*! \internal
*/
-inline bool QTextStreamPrivate::putString(const QString &s, bool number)
+inline void QTextStreamPrivate::putString(const QString &s, bool number)
{
QString tmp = s;
@@ -993,7 +1002,7 @@ inline bool QTextStreamPrivate::putString(const QString &s, bool number)
qt_prettyDebug(a.constData(), a.size(), qMax(16, a.size())).constData(),
qt_prettyDebug(b.constData(), b.size(), qMax(16, b.size())).constData());
#endif
- return write(tmp);
+ write(tmp);
}
/*!
@@ -1593,6 +1602,9 @@ void QTextStream::resetStatus()
Sets the status of the text stream to the \a status given.
+ Subsequent calls to setStatus() are ignored until resetStatus()
+ is called.
+
\sa Status status() resetStatus()
*/
void QTextStream::setStatus(Status status)
@@ -2267,7 +2279,7 @@ QTextStream &QTextStream::operator>>(char *c)
/*! \internal
*/
-bool QTextStreamPrivate::putNumber(qulonglong number, bool negative)
+void QTextStreamPrivate::putNumber(qulonglong number, bool negative)
{
QString result;
@@ -2307,7 +2319,7 @@ bool QTextStreamPrivate::putNumber(qulonglong number, bool negative)
result.prepend(QLatin1Char('0'));
}
}
- return putString(result, true);
+ putString(result, true);
}
/*!
diff --git a/src/corelib/io/qtextstream.h b/src/corelib/io/qtextstream.h
index d82da59..c635691 100644
--- a/src/corelib/io/qtextstream.h
+++ b/src/corelib/io/qtextstream.h
@@ -89,7 +89,8 @@ public:
enum Status {
Ok,
ReadPastEnd,
- ReadCorruptData
+ ReadCorruptData,
+ WriteFailed
};
enum NumberFlag {
ShowBase = 0x1,
diff --git a/src/corelib/kernel/kernel.pri b/src/corelib/kernel/kernel.pri
index 1e27c31..93818d1 100644
--- a/src/corelib/kernel/kernel.pri
+++ b/src/corelib/kernel/kernel.pri
@@ -1,81 +1,83 @@
# Qt core object module
HEADERS += \
- kernel/qabstracteventdispatcher.h \
+ kernel/qabstracteventdispatcher.h \
kernel/qabstractitemmodel.h \
kernel/qabstractitemmodel_p.h \
- kernel/qbasictimer.h \
- kernel/qeventloop.h\
- kernel/qpointer.h \
+ kernel/qbasictimer.h \
+ kernel/qeventloop.h\
+ kernel/qpointer.h \
kernel/qcorecmdlineargs_p.h \
- kernel/qcoreapplication.h \
- kernel/qcoreevent.h \
- kernel/qmetaobject.h \
- kernel/qmetatype.h \
- kernel/qmimedata.h \
- kernel/qobject.h \
- kernel/qobjectdefs.h \
- kernel/qsignalmapper.h \
- kernel/qsocketnotifier.h \
- kernel/qtimer.h \
- kernel/qtranslator.h \
+ kernel/qcoreapplication.h \
+ kernel/qcoreevent.h \
+ kernel/qmetaobject.h \
+ kernel/qmetatype.h \
+ kernel/qmimedata.h \
+ kernel/qobject.h \
+ kernel/qobjectdefs.h \
+ kernel/qsignalmapper.h \
+ kernel/qsocketnotifier.h \
+ kernel/qtimer.h \
+ kernel/qtranslator.h \
kernel/qtranslator_p.h \
kernel/qvariant.h \
- kernel/qabstracteventdispatcher_p.h \
- kernel/qcoreapplication_p.h \
- kernel/qobjectcleanuphandler.h \
+ kernel/qabstracteventdispatcher_p.h \
+ kernel/qcoreapplication_p.h \
+ kernel/qobjectcleanuphandler.h \
kernel/qvariant_p.h \
kernel/qmetaobject_p.h \
kernel/qobject_p.h \
- kernel/qcoreglobaldata_p.h \
- kernel/qsharedmemory.h \
+ kernel/qcoreglobaldata_p.h \
+ kernel/qsharedmemory.h \
kernel/qsharedmemory_p.h \
kernel/qsystemsemaphore.h \
kernel/qsystemsemaphore_p.h \
kernel/qfunctions_p.h \
- kernel/qmath.h
+ kernel/qmath.h \
+ kernel/qsystemerror_p.h
SOURCES += \
- kernel/qabstracteventdispatcher.cpp \
+ kernel/qabstracteventdispatcher.cpp \
kernel/qabstractitemmodel.cpp \
- kernel/qbasictimer.cpp \
- kernel/qeventloop.cpp \
- kernel/qcoreapplication.cpp \
- kernel/qcoreevent.cpp \
- kernel/qmetaobject.cpp \
- kernel/qmetatype.cpp \
- kernel/qmimedata.cpp \
- kernel/qobject.cpp \
- kernel/qobjectcleanuphandler.cpp \
- kernel/qsignalmapper.cpp \
- kernel/qsocketnotifier.cpp \
- kernel/qtimer.cpp \
- kernel/qtranslator.cpp \
- kernel/qvariant.cpp \
+ kernel/qbasictimer.cpp \
+ kernel/qeventloop.cpp \
+ kernel/qcoreapplication.cpp \
+ kernel/qcoreevent.cpp \
+ kernel/qmetaobject.cpp \
+ kernel/qmetatype.cpp \
+ kernel/qmimedata.cpp \
+ kernel/qobject.cpp \
+ kernel/qobjectcleanuphandler.cpp \
+ kernel/qsignalmapper.cpp \
+ kernel/qsocketnotifier.cpp \
+ kernel/qtimer.cpp \
+ kernel/qtranslator.cpp \
+ kernel/qvariant.cpp \
kernel/qcoreglobaldata.cpp \
kernel/qsharedmemory.cpp \
kernel/qsystemsemaphore.cpp \
kernel/qpointer.cpp \
- kernel/qmath.cpp
+ kernel/qmath.cpp \
+ kernel/qsystemerror.cpp
win32 {
- SOURCES += \
- kernel/qeventdispatcher_win.cpp \
- kernel/qcoreapplication_win.cpp \
- kernel/qwineventnotifier_p.cpp \
+ SOURCES += \
+ kernel/qeventdispatcher_win.cpp \
+ kernel/qcoreapplication_win.cpp \
+ kernel/qwineventnotifier_p.cpp \
kernel/qsharedmemory_win.cpp \
kernel/qsystemsemaphore_win.cpp
- HEADERS += \
- kernel/qeventdispatcher_win_p.h \
- kernel/qwineventnotifier_p.h
+ HEADERS += \
+ kernel/qeventdispatcher_win_p.h \
+ kernel/qwineventnotifier_p.h
}
wince*: {
- SOURCES += \
- kernel/qfunctions_wince.cpp
- HEADERS += \
- kernel/qfunctions_wince.h
+ SOURCES += \
+ kernel/qfunctions_wince.cpp
+ HEADERS += \
+ kernel/qfunctions_wince.h
}
mac:!embedded:!qpa{
@@ -85,18 +87,18 @@ mac:!embedded:!qpa{
mac:!nacl {
SOURCES += \
- kernel/qcore_mac.cpp
+ kernel/qcore_mac.cpp
}
unix:!symbian {
- SOURCES += \
+ SOURCES += \
kernel/qcore_unix.cpp \
kernel/qcrashhandler.cpp \
kernel/qsharedmemory_unix.cpp \
kernel/qsystemsemaphore_unix.cpp
- HEADERS += \
+ HEADERS += \
kernel/qcore_unix_p.h \
- kernel/qcrashhandler_p.h
+ kernel/qcrashhandler_p.h
contains(QT_CONFIG, glib) {
SOURCES += \
@@ -115,7 +117,7 @@ unix:!symbian {
}
symbian {
- SOURCES += \
+ SOURCES += \
kernel/qcore_unix.cpp \
kernel/qcrashhandler.cpp \
kernel/qeventdispatcher_symbian.cpp \
@@ -123,7 +125,7 @@ symbian {
kernel/qsharedmemory_symbian.cpp \
kernel/qsystemsemaphore_symbian.cpp
- HEADERS += \
+ HEADERS += \
kernel/qcore_unix_p.h \
kernel/qcrashhandler_p.h \
kernel/qeventdispatcher_symbian_p.h \
@@ -131,9 +133,9 @@ symbian {
}
vxworks {
- SOURCES += \
- kernel/qfunctions_vxworks.cpp
- HEADERS += \
- kernel/qfunctions_vxworks.h
+ SOURCES += \
+ kernel/qfunctions_vxworks.cpp
+ HEADERS += \
+ kernel/qfunctions_vxworks.h
}
diff --git a/src/corelib/kernel/qabstracteventdispatcher.cpp b/src/corelib/kernel/qabstracteventdispatcher.cpp
index bcf4477..bf675a7 100644
--- a/src/corelib/kernel/qabstracteventdispatcher.cpp
+++ b/src/corelib/kernel/qabstracteventdispatcher.cpp
@@ -77,10 +77,14 @@ Q_DESTRUCTOR_FUNCTION(timerIdsDestructorFunction)
static QBasicAtomicInt nextFreeTimerId = Q_BASIC_ATOMIC_INITIALIZER(1);
+static const int TimerIdMask = 0x00ffffff;
+static const int TimerSerialMask = ~TimerIdMask & ~0x80000000;
+static const int TimerSerialCounter = TimerIdMask + 1;
+
// avoid the ABA-problem by using 7 of the top 8 bits of the timerId as a serial number
static inline int prepareNewValueWithSerialNumber(int oldId, int newId)
{
- return (newId & 0x00FFFFFF) | ((oldId + 0x01000000) & 0x7f000000);
+ return (newId & TimerIdMask) | ((oldId + TimerSerialCounter) & TimerSerialMask);
}
static inline int bucketOffset(int timerId)
@@ -120,17 +124,32 @@ void QAbstractEventDispatcherPrivate::init()
}
}
+// Timer IDs are implemented using a free-list;
+// there's a vector initialized with:
+// X[i] = i + 1
+// and nextFreeTimerId starts with 1.
+//
+// Allocating a timer ID involves taking the ID from
+// X[nextFreeTimerId]
+// updating nextFreeTimerId to this value and returning the old value
+//
+// When the timer ID is allocated, its cell in the vector is unused (it's a
+// free list). As an added protection, we use the cell to store an invalid
+// (negative) value that we can later check for integrity.
+//
+// (continues below).
int QAbstractEventDispatcherPrivate::allocateTimerId()
{
int timerId, newTimerId;
+ int at, *b;
do {
- timerId = nextFreeTimerId;
+ timerId = nextFreeTimerId; //.loadAcquire(); // ### FIXME Proper memory ordering semantics
// which bucket are we looking in?
- int which = timerId & 0x00ffffff;
+ int which = timerId & TimerIdMask;
int bucket = bucketOffset(which);
- int at = bucketIndex(bucket, which);
- int *b = timerIds[bucket];
+ at = bucketIndex(bucket, which);
+ b = timerIds[bucket];
if (!b) {
// allocate a new bucket
@@ -142,23 +161,38 @@ int QAbstractEventDispatcherPrivate::allocateTimerId()
}
}
- newTimerId = b[at];
+ newTimerId = prepareNewValueWithSerialNumber(timerId, b[at]);
} while (!nextFreeTimerId.testAndSetRelaxed(timerId, newTimerId));
+ b[at] = -timerId;
+
return timerId;
}
+// Releasing a timer ID requires putting the current ID back in the vector;
+// we do it by setting:
+// X[timerId] = nextFreeTimerId;
+// then we update nextFreeTimerId to the timer we've just released
+//
+// The extra code in allocateTimerId and releaseTimerId are ABA prevention
+// and bucket memory. The buckets are simply to make sure we allocate only
+// the necessary number of timers. See above.
+//
+// ABA prevention simply adds a value to 7 of the top 8 bits when resetting
+// nextFreeTimerId.
void QAbstractEventDispatcherPrivate::releaseTimerId(int timerId)
{
- int which = timerId & 0x00ffffff;
+ int which = timerId & TimerIdMask;
int bucket = bucketOffset(which);
int at = bucketIndex(bucket, which);
int *b = timerIds[bucket];
+ Q_ASSERT(b[at] == -timerId);
+
int freeId, newTimerId;
do {
- freeId = nextFreeTimerId;
- b[at] = freeId & 0x00ffffff;
+ freeId = nextFreeTimerId;//.loadAcquire(); // ### FIXME Proper memory ordering semantics
+ b[at] = freeId & TimerIdMask;
newTimerId = prepareNewValueWithSerialNumber(freeId, timerId);
} while (!nextFreeTimerId.testAndSetRelease(freeId, newTimerId));
diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp
index a8dc491..799433b 100644
--- a/src/corelib/kernel/qcoreapplication.cpp
+++ b/src/corelib/kernel/qcoreapplication.cpp
@@ -71,6 +71,7 @@
# include <e32ldr.h>
# include "qeventdispatcher_symbian_p.h"
# include "private/qcore_symbian_p.h"
+# include "private/qfilesystemengine_p.h"
#elif defined(Q_OS_UNIX)
# if !defined(QT_NO_GLIB)
# include "qeventdispatcher_glib_p.h"
@@ -335,6 +336,16 @@ 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()
{
@@ -567,6 +578,12 @@ void QCoreApplication::init()
Q_ASSERT_X(!self, "QCoreApplication", "there should be only one application object");
QCoreApplication::self = this;
+#ifdef Q_OS_SYMBIAN
+ //ensure temp and working directories exist
+ QFileSystemEngine::createDirectory(QFileSystemEntry(QFileSystemEngine::tempPath()), true);
+ QFileSystemEngine::createDirectory(QFileSystemEntry(QFileSystemEngine::currentPath()), true);
+#endif
+
#ifndef QT_NO_THREAD
QThread::initialize();
#endif
@@ -593,12 +610,6 @@ 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);
@@ -2659,3 +2670,5 @@ 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 f1c7c26..17e784e 100644
--- a/src/corelib/kernel/qcoreapplication.h
+++ b/src/corelib/kernel/qcoreapplication.h
@@ -205,6 +205,7 @@ 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 2355c37..aafa821 100644
--- a/src/corelib/kernel/qcoreapplication_p.h
+++ b/src/corelib/kernel/qcoreapplication_p.h
@@ -82,6 +82,8 @@ 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/qcoreevent.cpp b/src/corelib/kernel/qcoreevent.cpp
index d23ea4c..4da5fa9 100644
--- a/src/corelib/kernel/qcoreevent.cpp
+++ b/src/corelib/kernel/qcoreevent.cpp
@@ -231,6 +231,8 @@ QT_BEGIN_NAMESPACE
\value WinIdChange The window system identifer for this native widget has changed
\value Gesture A gesture was triggered (QGestureEvent)
\value GestureOverride A gesture override was triggered (QGestureEvent)
+ \value ScrollPrepare The object needs to fill in its geometry information (QScrollPrepareEvent)
+ \value Scroll The object needs to scroll to the supplied position (QScrollEvent)
User events should have values between \c User and \c{MaxUser}:
diff --git a/src/corelib/kernel/qcoreevent.h b/src/corelib/kernel/qcoreevent.h
index 4c91aaf..08b751c 100644
--- a/src/corelib/kernel/qcoreevent.h
+++ b/src/corelib/kernel/qcoreevent.h
@@ -288,6 +288,9 @@ public:
Gesture = 198,
GestureOverride = 202,
#endif
+ ScrollPrepare = 204,
+ Scroll = 205,
+
// 512 reserved for Qt Jambi's MetaCall event
// 513 reserved for Qt Jambi's DeleteOnMainThread event
diff --git a/src/corelib/kernel/qeventdispatcher_unix.cpp b/src/corelib/kernel/qeventdispatcher_unix.cpp
index b2b9806..234c164 100644
--- a/src/corelib/kernel/qeventdispatcher_unix.cpp
+++ b/src/corelib/kernel/qeventdispatcher_unix.cpp
@@ -509,6 +509,7 @@ 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 91c20b5..a363874 100644
--- a/src/corelib/kernel/qeventdispatcher_win.cpp
+++ b/src/corelib/kernel/qeventdispatcher_win.cpp
@@ -492,7 +492,7 @@ LRESULT QT_WIN_CALLBACK qt_internal_proc(HWND hwnd, UINT message, WPARAM wp, LPA
// we also use a Windows timer to send posted events when the message queue is full
|| (message == WM_TIMER
&& d->sendPostedEventsWindowsTimerId != 0
- && wp == d->sendPostedEventsWindowsTimerId)) {
+ && wp == (uint)d->sendPostedEventsWindowsTimerId)) {
int localSerialNumber = d->serialNumber;
if (localSerialNumber != d->lastSerialNumber) {
d->lastSerialNumber = localSerialNumber;
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index 7fe9c52..c3102ea 100644
--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -408,6 +408,8 @@ void QMetaObject::removeGuard(QObject **ptr)
if (!hash || hash->isEmpty())
return;
QMutexLocker locker(guardHashLock());
+ if (!*ptr) //check again, under the lock
+ return;
GuardHash::iterator it = hash->find(*ptr);
const GuardHash::iterator end = hash->end();
bool more = false; //if the QObject has more pointer attached to it.
diff --git a/src/corelib/kernel/qsystemerror.cpp b/src/corelib/kernel/qsystemerror.cpp
new file mode 100644
index 0000000..953ed95
--- /dev/null
+++ b/src/corelib/kernel/qsystemerror.cpp
@@ -0,0 +1,220 @@
+/****************************************************************************
+**
+** 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 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 <qglobal.h>
+#include "qsystemerror_p.h"
+#if !defined(Q_OS_WINCE)
+# include <errno.h>
+# if defined(Q_CC_MSVC)
+# include <crtdbg.h>
+# endif
+#endif
+#ifdef Q_OS_WIN
+#include <windows.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+#if !defined(Q_OS_WIN) && !defined(QT_NO_THREAD) && !defined(Q_OS_INTEGRITY) && !defined(Q_OS_QNX) && \
+ defined(_POSIX_THREAD_SAFE_FUNCTIONS) && _POSIX_VERSION >= 200112L
+namespace {
+ // There are two incompatible versions of strerror_r:
+ // a) the XSI/POSIX.1 version, which returns an int,
+ // indicating success or not
+ // b) the GNU version, which returns a char*, which may or may not
+ // be the beginning of the buffer we used
+ // The GNU libc manpage for strerror_r says you should use the the XSI
+ // version in portable code. However, it's impossible to do that if
+ // _GNU_SOURCE is defined so we use C++ overloading to decide what to do
+ // depending on the return type
+ static inline QString fromstrerror_helper(int, const QByteArray &buf)
+ {
+ return QString::fromLocal8Bit(buf);
+ }
+ static inline QString fromstrerror_helper(const char *str, const QByteArray &)
+ {
+ return QString::fromLocal8Bit(str);
+ }
+}
+#endif
+
+static QString standardLibraryErrorString(int errorCode)
+{
+ const char *s = 0;
+ QString ret;
+ switch (errorCode) {
+ case 0:
+ break;
+ case EACCES:
+ s = QT_TRANSLATE_NOOP("QIODevice", "Permission denied");
+ break;
+ case EMFILE:
+ s = QT_TRANSLATE_NOOP("QIODevice", "Too many open files");
+ break;
+ case ENOENT:
+ s = QT_TRANSLATE_NOOP("QIODevice", "No such file or directory");
+ break;
+ case ENOSPC:
+ s = QT_TRANSLATE_NOOP("QIODevice", "No space left on device");
+ break;
+ default: {
+ #if !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && _POSIX_VERSION >= 200112L && !defined(Q_OS_INTEGRITY) && !defined(Q_OS_QNX)
+ QByteArray buf(1024, '\0');
+ ret = fromstrerror_helper(strerror_r(errorCode, buf.data(), buf.size()), buf);
+ #else
+ ret = QString::fromLocal8Bit(strerror(errorCode));
+ #endif
+ break; }
+ }
+ if (s) {
+ // ######## this breaks moc build currently
+ // ret = QCoreApplication::translate("QIODevice", s);
+ ret = QString::fromLatin1(s);
+ }
+ return ret.trimmed();
+}
+
+#ifdef Q_OS_WIN
+static QString windowsErrorString(int errorCode)
+{
+ QString ret;
+ wchar_t *string = 0;
+ FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL,
+ errorCode,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPWSTR)&string,
+ 0,
+ NULL);
+ ret = QString::fromWCharArray(string);
+ LocalFree((HLOCAL)string);
+
+ if (ret.isEmpty() && errorCode == ERROR_MOD_NOT_FOUND)
+ ret = QString::fromLatin1("The specified module could not be found.");
+ return ret;
+}
+#endif
+
+#ifdef Q_OS_SYMBIAN
+static QString symbianErrorString(int errorCode)
+{
+ switch (errorCode) {
+ case KErrNotFound:
+ return QLatin1String("not found");
+ case KErrCancel:
+ return QLatin1String("cancelled");
+ case KErrNoMemory:
+ return QLatin1String("out of memory");
+ case KErrNotSupported:
+ return QLatin1String("not supported");
+ case KErrBadHandle:
+ return QLatin1String("bad handle"); //KERN-EXEC 0 panic is more likely
+ case KErrAlreadyExists:
+ return QLatin1String("already exists");
+ case KErrPathNotFound:
+ return QLatin1String("path not found");
+ case KErrInUse:
+ return QLatin1String("in use");
+ case KErrNotReady:
+ return QLatin1String("not ready (e.g. FS dismounted, no memory card)");
+ case KErrCorrupt:
+ return QLatin1String("corrupt");
+ case KErrAccessDenied:
+ return QLatin1String("access denied");
+ case KErrLocked:
+ return QLatin1String("locked");
+ case KErrWrite:
+ return QLatin1String("incomplete write error");
+ case KErrDisMounted:
+ return QLatin1String("file system dismounted during operation"); //i.e. a forcible dismount was done while we had files open
+ case KErrEof:
+ return QLatin1String("end of file");
+ case KErrDiskFull:
+ return QLatin1String("no space in file system");
+ case KErrBadName:
+ return QLatin1String("invalid filename");
+ case KErrTimedOut:
+ return QLatin1String("timed out");
+ case KErrBadDescriptor:
+ return QLatin1String("bad descriptor (passed address on stack to async call?)");
+ case KErrAbort:
+ return QLatin1String("aborted");
+ case KErrTooBig:
+ return QLatin1String("too big"); //e.g. trying to open a >2GB file with 32 bit API
+ case KErrBadPower:
+ return QLatin1String("insufficient power");
+ case KErrDirFull:
+ return QLatin1String("no space in directory table");
+ case KErrHardwareNotAvailable:
+ return QLatin1String("hardware not available");
+ case KErrSessionClosed:
+ return QLatin1String("session closed");
+ case KErrPermissionDenied:
+ return QLatin1String("permission denied");
+ default:
+ return QString(QLatin1String("symbian error %d")).arg(errorCode);
+ }
+}
+#endif
+
+QString QSystemError::toString()
+{
+ switch(errorScope) {
+ case NativeError:
+#if defined (Q_OS_WIN)
+ return windowsErrorString(errorCode);
+#elif defined (Q_OS_SYMBIAN)
+ return symbianErrorString(errorCode);
+#else
+ //unix: fall through as native and standard library are the same
+#endif
+ case StandardLibraryError:
+ return standardLibraryErrorString(errorCode);
+ default:
+ qWarning("invalid error scope");
+ //fall through
+ case NoError:
+ return QLatin1String("No error");
+ }
+}
+
+QT_END_NAMESPACE
+
diff --git a/src/corelib/kernel/qsystemerror_p.h b/src/corelib/kernel/qsystemerror_p.h
new file mode 100644
index 0000000..c2a13a8
--- /dev/null
+++ b/src/corelib/kernel/qsystemerror_p.h
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** 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 QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSYSTEMERROR_P_H
+#define QSYSTEMERROR_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 <qstring.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_CORE_EXPORT QSystemError
+{
+public:
+ enum ErrorScope
+ {
+ NoError,
+ StandardLibraryError,
+ NativeError
+ };
+
+ inline QSystemError(int error, ErrorScope scope);
+ inline QSystemError();
+
+ QString toString();
+ inline ErrorScope scope();
+ inline int error();
+
+ //data members
+ int errorCode;
+ ErrorScope errorScope;
+};
+
+QSystemError::QSystemError(int error, QSystemError::ErrorScope scope)
+: errorCode(error), errorScope(scope)
+{
+
+}
+
+QSystemError::QSystemError()
+: errorCode(0), errorScope(NoError)
+{
+
+}
+
+QSystemError::ErrorScope QSystemError::scope()
+{
+ return errorScope;
+}
+
+int QSystemError::error()
+{
+ return errorCode;
+}
+
+
+QT_END_NAMESPACE
+
+#endif // QSYSTEMERROR_P_H
diff --git a/src/corelib/thread/qmutex.cpp b/src/corelib/thread/qmutex.cpp
index b85a22d..1009f7b 100644
--- a/src/corelib/thread/qmutex.cpp
+++ b/src/corelib/thread/qmutex.cpp
@@ -45,6 +45,7 @@
#ifndef QT_NO_THREAD
#include "qatomic.h"
+#include "qelapsedtimer.h"
#include "qthread.h"
#include "qmutex_p.h"
@@ -157,15 +158,12 @@ void QMutex::lock()
return;
}
- bool isLocked = d->contenders.fetchAndAddAcquire(1) == 0;
+ bool isLocked = d->contenders.testAndSetAcquire(0, 1);
if (!isLocked) {
// didn't get the lock, wait for it
isLocked = d->wait();
Q_ASSERT_X(isLocked, "QMutex::lock",
"Internal error, infinite wait has timed out.");
-
- // don't need to wait for the lock anymore
- d->contenders.deref();
}
d->owner = self;
@@ -174,8 +172,7 @@ void QMutex::lock()
return;
}
-
- bool isLocked = d->contenders == 0 && d->contenders.testAndSetAcquire(0, 1);
+ bool isLocked = d->contenders.testAndSetAcquire(0, 1);
if (!isLocked) {
lockInternal();
}
@@ -211,7 +208,7 @@ bool QMutex::tryLock()
return true;
}
- bool isLocked = d->contenders == 0 && d->contenders.testAndSetAcquire(0, 1);
+ bool isLocked = d->contenders.testAndSetAcquire(0, 1);
if (!isLocked) {
// some other thread has the mutex locked, or we tried to
// recursively lock an non-recursive mutex
@@ -224,13 +221,7 @@ bool QMutex::tryLock()
return isLocked;
}
- bool isLocked = d->contenders == 0 && d->contenders.testAndSetAcquire(0, 1);
- if (!isLocked) {
- // some other thread has the mutex locked, or we tried to
- // recursively lock an non-recursive mutex
- return isLocked;
- }
- return isLocked;
+ return d->contenders.testAndSetAcquire(0, 1);
}
/*! \overload
@@ -269,13 +260,10 @@ bool QMutex::tryLock(int timeout)
return true;
}
- bool isLocked = d->contenders.fetchAndAddAcquire(1) == 0;
+ bool isLocked = d->contenders.testAndSetAcquire(0, 1);
if (!isLocked) {
// didn't get the lock, wait for it
isLocked = d->wait(timeout);
-
- // don't need to wait for the lock anymore
- d->contenders.deref();
if (!isLocked)
return false;
}
@@ -286,17 +274,9 @@ bool QMutex::tryLock(int timeout)
return true;
}
- bool isLocked = d->contenders.fetchAndAddAcquire(1) == 0;
- if (!isLocked) {
- // didn't get the lock, wait for it
- isLocked = d->wait(timeout);
-
- // don't need to wait for the lock anymore
- d->contenders.deref();
- if (!isLocked)
- return false;
- }
- return true;
+ return (d->contenders.testAndSetAcquire(0, 1)
+ // didn't get the lock, wait for it
+ || d->wait(timeout));
}
@@ -310,7 +290,6 @@ bool QMutex::tryLock(int timeout)
void QMutex::unlock()
{
QMutexPrivate *d = static_cast<QMutexPrivate *>(this->d);
-
if (d->recursive) {
if (!--d->count) {
d->owner = 0;
@@ -451,37 +430,57 @@ void QMutex::unlock()
void QMutex::lockInternal()
{
QMutexPrivate *d = static_cast<QMutexPrivate *>(this->d);
- int spinCount = 0;
- int lastSpinCount = d->lastSpinCount;
- enum { AdditionalSpins = 20, SpinCountPenalizationDivisor = 4 };
- const int maximumSpinCount = lastSpinCount + AdditionalSpins;
+ if (QThread::idealThreadCount() == 1) {
+ // don't spin on single cpu machines
+ bool isLocked = d->wait();
+ Q_ASSERT_X(isLocked, "QMutex::lock",
+ "Internal error, infinite wait has timed out.");
+ Q_UNUSED(isLocked);
+ return;
+ }
+ QElapsedTimer elapsedTimer;
+ elapsedTimer.start();
do {
- if (spinCount++ > maximumSpinCount) {
- // puts("spinning useless, sleeping");
- bool isLocked = d->contenders.fetchAndAddAcquire(1) == 0;
- if (!isLocked) {
-
- // didn't get the lock, wait for it
- isLocked = d->wait();
- Q_ASSERT_X(isLocked, "QMutex::lock",
- "Internal error, infinite wait has timed out.");
-
- // don't need to wait for the lock anymore
- d->contenders.deref();
+ qint64 spinTime = elapsedTimer.nsecsElapsed();
+ if (spinTime > d->maximumSpinTime) {
+ // didn't get the lock, wait for it, since we're not going to gain anything by spinning more
+ elapsedTimer.start();
+ bool isLocked = d->wait();
+ Q_ASSERT_X(isLocked, "QMutex::lock",
+ "Internal error, infinite wait has timed out.");
+ Q_UNUSED(isLocked);
+
+ qint64 maximumSpinTime = d->maximumSpinTime;
+ qint64 averageWaitTime = d->averageWaitTime;
+ qint64 actualWaitTime = elapsedTimer.nsecsElapsed();
+ if (actualWaitTime < (QMutexPrivate::MaximumSpinTimeThreshold * 3 / 2)) {
+ // measure the wait times
+ averageWaitTime = d->averageWaitTime = qMin((averageWaitTime + actualWaitTime) / 2, qint64(QMutexPrivate::MaximumSpinTimeThreshold));
}
- // decrease the lastSpinCount since we didn't actually get the lock by spinning
- spinCount = -d->lastSpinCount / SpinCountPenalizationDivisor;
- break;
+
+ // adjust the spin count when spinning does not benefit contention performance
+ if ((spinTime + actualWaitTime) - qint64(QMutexPrivate::MaximumSpinTimeThreshold) >= qint64(QMutexPrivate::MaximumSpinTimeThreshold)) {
+ // long waits, stop spinning
+ d->maximumSpinTime = 0;
+ } else {
+ // allow spinning if wait times decrease, but never spin more than the average wait time (otherwise we may perform worse)
+ d->maximumSpinTime = qBound(qint64(averageWaitTime * 3 / 2), maximumSpinTime / 2, qint64(QMutexPrivate::MaximumSpinTimeThreshold));
+ }
+ return;
}
+ // be a good citizen... yielding lets something else run if there is something to run, but may also relieve memory pressure if not
+ QThread::yieldCurrentThread();
} while (d->contenders != 0 || !d->contenders.testAndSetAcquire(0, 1));
- // adjust the last spin lock count
- lastSpinCount = d->lastSpinCount;
- d->lastSpinCount = spinCount >= 0
- ? qMax(lastSpinCount, spinCount)
- : lastSpinCount + spinCount;
+ // spinning is working, do not change the spin time (unless we are using much less time than allowed to spin)
+ qint64 maximumSpinTime = d->maximumSpinTime;
+ qint64 spinTime = elapsedTimer.nsecsElapsed();
+ if (spinTime < maximumSpinTime / 2) {
+ // we are using much less time than we need, adjust the limit
+ d->maximumSpinTime = qBound(qint64(d->averageWaitTime * 3 / 2), maximumSpinTime / 2, qint64(QMutexPrivate::MaximumSpinTimeThreshold));
+ }
}
/*!
diff --git a/src/corelib/thread/qmutex_p.h b/src/corelib/thread/qmutex_p.h
index 6126423..9d40bea 100644
--- a/src/corelib/thread/qmutex_p.h
+++ b/src/corelib/thread/qmutex_p.h
@@ -58,6 +58,10 @@
#include <QtCore/qnamespace.h>
#include <QtCore/qmutex.h>
+#if defined(Q_OS_MAC)
+# include <mach/semaphore.h>
+#endif
+
QT_BEGIN_NAMESPACE
class QMutexPrivate : public QMutexData {
@@ -65,15 +69,19 @@ public:
QMutexPrivate(QMutex::RecursionMode mode);
~QMutexPrivate();
- ulong self();
bool wait(int timeout = -1);
void wakeUp();
- volatile int lastSpinCount;
+ // 1ms = 1000000ns
+ enum { MaximumSpinTimeThreshold = 1000000 };
+ volatile qint64 maximumSpinTime;
+ volatile qint64 averageWaitTime;
Qt::HANDLE owner;
uint count;
-#if defined(Q_OS_UNIX)
+#if defined(Q_OS_MAC)
+ semaphore_t mach_semaphore;
+#elif defined(Q_OS_UNIX) && !defined(Q_OS_LINUX)
volatile bool wakeup;
pthread_mutex_t mutex;
pthread_cond_t cond;
diff --git a/src/corelib/thread/qmutex_unix.cpp b/src/corelib/thread/qmutex_unix.cpp
index 7e7ef22..0e09ea0 100644
--- a/src/corelib/thread/qmutex_unix.cpp
+++ b/src/corelib/thread/qmutex_unix.cpp
@@ -53,30 +53,116 @@
#undef wakeup
#endif
+#if defined(Q_OS_MAC)
+# include <mach/mach.h>
+# include <mach/task.h>
+#elif defined(Q_OS_LINUX)
+# include <linux/futex.h>
+# include <sys/syscall.h>
+# include <unistd.h>
+#endif
+
QT_BEGIN_NAMESPACE
+#if !defined(Q_OS_MAC) && !defined(Q_OS_LINUX)
static void report_error(int code, const char *where, const char *what)
{
if (code != 0)
qWarning("%s: %s failure: %s", where, what, qPrintable(qt_error_string(code)));
}
+#endif
QMutexPrivate::QMutexPrivate(QMutex::RecursionMode mode)
- : QMutexData(mode), lastSpinCount(0), owner(0), count(0), wakeup(false)
+ : QMutexData(mode), maximumSpinTime(MaximumSpinTimeThreshold), averageWaitTime(0), owner(0), count(0)
{
+#if defined(Q_OS_MAC)
+ kern_return_t r = semaphore_create(mach_task_self(), &mach_semaphore, SYNC_POLICY_FIFO, 0);
+ if (r != KERN_SUCCESS)
+ qWarning("QMutex: failed to create semaphore, error %d", r);
+#elif !defined(Q_OS_LINUX)
+ wakeup = false;
report_error(pthread_mutex_init(&mutex, NULL), "QMutex", "mutex init");
report_error(pthread_cond_init(&cond, NULL), "QMutex", "cv init");
+#endif
}
QMutexPrivate::~QMutexPrivate()
{
+#if defined(Q_OS_MAC)
+ kern_return_t r = semaphore_destroy(mach_task_self(), mach_semaphore);
+ if (r != KERN_SUCCESS)
+ qWarning("QMutex: failed to destroy semaphore, error %d", r);
+#elif !defined(Q_OS_LINUX)
report_error(pthread_cond_destroy(&cond), "QMutex", "cv destroy");
report_error(pthread_mutex_destroy(&mutex), "QMutex", "mutex destroy");
+#endif
+}
+
+#if defined(Q_OS_MAC)
+
+bool QMutexPrivate::wait(int timeout)
+{
+ if (contenders.fetchAndAddAcquire(1) == 0) {
+ // lock acquired without waiting
+ return true;
+ }
+ bool returnValue;
+ if (timeout < 0) {
+ returnValue = semaphore_wait(mach_semaphore) == KERN_SUCCESS;
+ } else {
+ mach_timespec_t ts;
+ ts.tv_nsec = ((timeout % 1000) * 1000) * 1000;
+ ts.tv_sec = (timeout / 1000);
+ kern_return_t r = semaphore_timedwait(mach_semaphore, ts);
+ returnValue = r == KERN_SUCCESS;
+ }
+ contenders.deref();
+ return returnValue;
+}
+
+void QMutexPrivate::wakeUp()
+{
+ semaphore_signal(mach_semaphore);
+}
+
+#elif defined(Q_OS_LINUX)
+
+static inline int _q_futex(volatile int *addr, int op, int val, const struct timespec *timeout, int *addr2, int val2)
+{
+ return syscall(SYS_futex, addr, op, val, timeout, addr2, val2);
}
bool QMutexPrivate::wait(int timeout)
{
+ while (contenders.fetchAndStoreAcquire(2) > 0) {
+ struct timespec ts, *pts = 0;
+ if (timeout >= 0) {
+ ts.tv_nsec = ((timeout % 1000) * 1000) * 1000;
+ ts.tv_sec = (timeout / 1000);
+ pts = &ts;
+ }
+ int r = _q_futex(&contenders._q_value, FUTEX_WAIT, 2, pts, 0, 0);
+ if (r != 0 && errno == ETIMEDOUT)
+ return false;
+ }
+ return true;
+}
+
+void QMutexPrivate::wakeUp()
+{
+ (void) contenders.fetchAndStoreRelease(0);
+ (void) _q_futex(&contenders._q_value, FUTEX_WAKE, 1, 0, 0, 0);
+}
+
+#else // !Q_OS_MAC && !Q_OS_LINUX
+
+bool QMutexPrivate::wait(int timeout)
+{
+ if (contenders.fetchAndAddAcquire(1) == 0) {
+ // lock acquired without waiting
+ return true;
+ }
report_error(pthread_mutex_lock(&mutex), "QMutex::lock", "mutex lock");
int errorCode = 0;
while (!wakeup) {
@@ -101,6 +187,7 @@ bool QMutexPrivate::wait(int timeout)
}
wakeup = false;
report_error(pthread_mutex_unlock(&mutex), "QMutex::lock", "mutex unlock");
+ contenders.deref();
return errorCode == 0;
}
@@ -112,6 +199,8 @@ void QMutexPrivate::wakeUp()
report_error(pthread_mutex_unlock(&mutex), "QMutex::unlock", "mutex unlock");
}
+#endif // !Q_OS_MAC && !Q_OS_LINUX
+
QT_END_NAMESPACE
#endif // QT_NO_THREAD
diff --git a/src/corelib/thread/qmutex_win.cpp b/src/corelib/thread/qmutex_win.cpp
index a810000..a759caa 100644
--- a/src/corelib/thread/qmutex_win.cpp
+++ b/src/corelib/thread/qmutex_win.cpp
@@ -48,7 +48,7 @@
QT_BEGIN_NAMESPACE
QMutexPrivate::QMutexPrivate(QMutex::RecursionMode mode)
- : QMutexData(mode), lastSpinCount(0), owner(0), count(0)
+ : QMutexData(mode), maximumSpinTime(MaximumSpinTimeThreshold), averageWaitTime(0), owner(0), count(0)
{
event = CreateEvent(0, FALSE, FALSE, 0);
if (!event)
@@ -60,7 +60,13 @@ QMutexPrivate::~QMutexPrivate()
bool QMutexPrivate::wait(int timeout)
{
- return WaitForSingleObject(event, timeout < 0 ? INFINITE : timeout) == WAIT_OBJECT_0;
+ if (contenders.fetchAndAddAcquire(1) == 0) {
+ // lock acquired without waiting
+ return true;
+ }
+ bool returnValue = (WaitForSingleObject(event, timeout < 0 ? INFINITE : timeout) == WAIT_OBJECT_0);
+ contenders.deref();
+ return returnValue;
}
void QMutexPrivate::wakeUp()
diff --git a/src/corelib/tools/qalgorithms.qdoc b/src/corelib/tools/qalgorithms.qdoc
index 898f940..cd33f28 100644
--- a/src/corelib/tools/qalgorithms.qdoc
+++ b/src/corelib/tools/qalgorithms.qdoc
@@ -266,7 +266,7 @@
\overload
- This is the same as qFind(\a{container}.begin(), \a{container}.end(), value);
+ This is the same as qFind(\a{container}.constBegin(), \a{container}.constEnd(), value);
*/
/*! \fn void qCount(InputIterator begin, InputIterator end, const T &value, Size &n)
diff --git a/src/corelib/tools/qdatetime.cpp b/src/corelib/tools/qdatetime.cpp
index c252e64..6a20c7a 100644
--- a/src/corelib/tools/qdatetime.cpp
+++ b/src/corelib/tools/qdatetime.cpp
@@ -5838,6 +5838,41 @@ bool operator==(const QDateTimeParser::SectionNode &s1, const QDateTimeParser::S
return (s1.type == s2.type) && (s1.pos == s2.pos) && (s1.count == s2.count);
}
+#ifdef Q_OS_SYMBIAN
+const static TTime UnixEpochOffset(I64LIT(0xdcddb30f2f8000));
+const static TInt64 MinimumMillisecondTime(KMinTInt64 / 1000);
+const static TInt64 MaximumMillisecondTime(KMaxTInt64 / 1000);
+QDateTime qt_symbian_TTime_To_QDateTime(const TTime& time)
+{
+ TTimeIntervalMicroSeconds absolute = time.MicroSecondsFrom(UnixEpochOffset);
+
+ return QDateTime::fromMSecsSinceEpoch(absolute.Int64() / 1000);
+}
+
+TTime qt_symbian_QDateTime_To_TTime(const QDateTime& datetime)
+{
+ qint64 absolute = datetime.toMSecsSinceEpoch();
+ if(absolute > MaximumMillisecondTime)
+ return TTime(KMaxTInt64);
+ if(absolute < MinimumMillisecondTime)
+ return TTime(KMinTInt64);
+ return TTime(absolute * 1000);
+}
+
+time_t qt_symbian_TTime_To_time_t(const TTime& time)
+{
+ TTimeIntervalSeconds interval;
+ TInt err = time.SecondsFrom(UnixEpochOffset, interval);
+ if (err || interval.Int() < 0)
+ return (time_t) 0;
+ return (time_t) interval.Int();
+}
+
+TTime qt_symbian_time_t_To_TTime(time_t time)
+{
+ return UnixEpochOffset + TTimeIntervalSeconds(time);
+}
+#endif //Q_OS_SYMBIAN
#endif // QT_BOOTSTRAPPED
diff --git a/src/corelib/tools/qdatetime_p.h b/src/corelib/tools/qdatetime_p.h
index f10785e..8355ef7 100644
--- a/src/corelib/tools/qdatetime_p.h
+++ b/src/corelib/tools/qdatetime_p.h
@@ -275,6 +275,12 @@ Q_CORE_EXPORT bool operator==(const QDateTimeParser::SectionNode &s1, const QDat
Q_DECLARE_OPERATORS_FOR_FLAGS(QDateTimeParser::Sections)
Q_DECLARE_OPERATORS_FOR_FLAGS(QDateTimeParser::FieldInfo)
+#ifdef Q_OS_SYMBIAN
+QDateTime qt_symbian_TTime_To_QDateTime(const TTime& time);
+TTime qt_symbian_QDateTime_To_TTime(const QDateTime& datetime);
+time_t qt_symbian_TTime_To_time_t(const TTime& time);
+TTime qt_symbian_time_t_To_TTime(time_t time);
+#endif //Q_OS_SYMBIAN
#endif // QT_BOOTSTRAPPED
diff --git a/src/corelib/tools/qelapsedtimer.h b/src/corelib/tools/qelapsedtimer.h
index b996f6a..4118389 100644
--- a/src/corelib/tools/qelapsedtimer.h
+++ b/src/corelib/tools/qelapsedtimer.h
@@ -68,6 +68,7 @@ public:
void invalidate();
bool isValid() const;
+ qint64 nsecsElapsed() const;
qint64 elapsed() const;
bool hasExpired(qint64 timeout) const;
diff --git a/src/corelib/tools/qelapsedtimer_generic.cpp b/src/corelib/tools/qelapsedtimer_generic.cpp
index 85986e6..740f496 100644
--- a/src/corelib/tools/qelapsedtimer_generic.cpp
+++ b/src/corelib/tools/qelapsedtimer_generic.cpp
@@ -103,6 +103,22 @@ qint64 QElapsedTimer::restart()
return t1 - old;
}
+/*! \since 4.8
+
+ Returns the number of nanoseconds since this QElapsedTimer was last
+ started. Calling this function in a QElapsedTimer that was invalidated
+ will result in undefined results.
+
+ On platforms that do not provide nanosecond resolution, the value returned
+ will be the best estimate available.
+
+ \sa start(), restart(), hasExpired(), invalidate()
+*/
+qint64 QElapsedTimer::nsecsElapsed() const
+{
+ return elapsed() * 1000000;
+}
+
/*!
Returns the number of milliseconds since this QElapsedTimer was last
started. Calling this function in a QElapsedTimer that was invalidated
diff --git a/src/corelib/tools/qelapsedtimer_mac.cpp b/src/corelib/tools/qelapsedtimer_mac.cpp
index 8fceb49..e51f8b3 100644
--- a/src/corelib/tools/qelapsedtimer_mac.cpp
+++ b/src/corelib/tools/qelapsedtimer_mac.cpp
@@ -97,6 +97,12 @@ qint64 QElapsedTimer::restart()
return absoluteToMSecs(t1 - old);
}
+qint64 QElapsedTimer::nsecsElapsed() const
+{
+ uint64_t cpu_time = mach_absolute_time();
+ return absoluteToNSecs(cpu_time - t1);
+}
+
qint64 QElapsedTimer::elapsed() const
{
uint64_t cpu_time = mach_absolute_time();
diff --git a/src/corelib/tools/qelapsedtimer_symbian.cpp b/src/corelib/tools/qelapsedtimer_symbian.cpp
index 038b102..7cd5f1e 100644
--- a/src/corelib/tools/qelapsedtimer_symbian.cpp
+++ b/src/corelib/tools/qelapsedtimer_symbian.cpp
@@ -64,11 +64,6 @@ static quint64 getMicrosecondFromTick()
return nanokernel_tick_period * (val | (quint64(highdword) << 32));
}
-static quint64 getMillisecondFromTick()
-{
- return getMicrosecondFromTick() / 1000;
-}
-
timeval qt_gettime()
{
timeval tv;
@@ -91,36 +86,41 @@ bool QElapsedTimer::isMonotonic()
void QElapsedTimer::start()
{
- t1 = getMillisecondFromTick();
+ t1 = getMicrosecondFromTick();
t2 = 0;
}
qint64 QElapsedTimer::restart()
{
qint64 oldt1 = t1;
- t1 = getMillisecondFromTick();
+ t1 = getMicrosecondFromTick();
t2 = 0;
return t1 - oldt1;
}
+qint64 QElapsedTimer::nsecsElapsed() const
+{
+ return (getMicrosecondFromTick() - t1) * 1000;
+}
+
qint64 QElapsedTimer::elapsed() const
{
- return getMillisecondFromTick() - t1;
+ return (getMicrosecondFromTick() - t1) / 1000;
}
qint64 QElapsedTimer::msecsSinceReference() const
{
- return t1;
+ return t1 / 1000;
}
qint64 QElapsedTimer::msecsTo(const QElapsedTimer &other) const
{
- return other.t1 - t1;
+ return (other.t1 - t1) / 1000;
}
qint64 QElapsedTimer::secsTo(const QElapsedTimer &other) const
{
- return msecsTo(other) / 1000;
+ return msecsTo(other) / 1000000;
}
bool operator<(const QElapsedTimer &v1, const QElapsedTimer &v2)
diff --git a/src/corelib/tools/qelapsedtimer_unix.cpp b/src/corelib/tools/qelapsedtimer_unix.cpp
index 633fa00..7407e1b 100644
--- a/src/corelib/tools/qelapsedtimer_unix.cpp
+++ b/src/corelib/tools/qelapsedtimer_unix.cpp
@@ -167,6 +167,17 @@ qint64 QElapsedTimer::restart()
return elapsedAndRestart(t1, t2, &t1, &t2);
}
+qint64 QElapsedTimer::nsecsElapsed() const
+{
+ qint64 sec, frac;
+ do_gettime(&sec, &frac);
+ sec = sec - t1;
+ frac = frac - t2;
+ if (!monotonicClockAvailable)
+ frac *= 1000;
+ return sec * Q_INT64_C(1000000000) + frac;
+}
+
qint64 QElapsedTimer::elapsed() const
{
qint64 sec, frac;
diff --git a/src/corelib/tools/qelapsedtimer_win.cpp b/src/corelib/tools/qelapsedtimer_win.cpp
index c77acaa..3f4acc1 100644
--- a/src/corelib/tools/qelapsedtimer_win.cpp
+++ b/src/corelib/tools/qelapsedtimer_win.cpp
@@ -79,14 +79,14 @@ static void resolveLibs()
done = true;
}
-static inline qint64 ticksToMilliseconds(qint64 ticks)
+static inline qint64 ticksToNanoseconds(qint64 ticks)
{
if (counterFrequency > 0) {
// QueryPerformanceCounter uses an arbitrary frequency
- return ticks * 1000 / counterFrequency;
+ return ticks * 1000000000 / counterFrequency;
} else {
// GetTickCount(64) return milliseconds
- return ticks;
+ return ticks * 1000000;
}
}
@@ -144,24 +144,30 @@ qint64 QElapsedTimer::restart()
qint64 oldt1 = t1;
t1 = getTickCount();
t2 = 0;
- return ticksToMilliseconds(t1 - oldt1);
+ return ticksToNanoseconds(t1 - oldt1) / 1000000;
+}
+
+qint64 QElapsedTimer::nsecsElapsed() const
+{
+ qint64 elapsed = getTickCount() - t1;
+ return ticksToNanoseconds(elapsed);
}
qint64 QElapsedTimer::elapsed() const
{
qint64 elapsed = getTickCount() - t1;
- return ticksToMilliseconds(elapsed);
+ return ticksToNanoseconds(elapsed) / 1000000;
}
qint64 QElapsedTimer::msecsSinceReference() const
{
- return ticksToMilliseconds(t1);
+ return ticksToNanoseconds(t1) / 1000000;
}
qint64 QElapsedTimer::msecsTo(const QElapsedTimer &other) const
{
qint64 difference = other.t1 - t1;
- return ticksToMilliseconds(difference);
+ return ticksToNanoseconds(difference) / 1000000;
}
qint64 QElapsedTimer::secsTo(const QElapsedTimer &other) const
diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index 83d6dcd..b817eb2 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -1576,8 +1576,6 @@ QDataStream &operator>>(QDataStream &ds, QLocale &l)
defaults to the default locale (see setDefault()).
\endlist
- The "C" locale is identical in behavior to \l{English}/\l{UnitedStates}.
-
Use language() and country() to determine the actual language and
country values used.
diff --git a/src/corelib/tools/qpoint.cpp b/src/corelib/tools/qpoint.cpp
index c297709..592a83d 100644
--- a/src/corelib/tools/qpoint.cpp
+++ b/src/corelib/tools/qpoint.cpp
@@ -187,7 +187,19 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn QPoint &QPoint::operator*=(qreal factor)
+ \fn QPoint &QPoint::operator*=(float factor)
+
+ Multiplies this point's coordinates by the given \a factor, and
+ returns a reference to this point.
+
+ Note that the result is rounded to the nearest integer as points are held as
+ integers. Use QPointF for floating point accuracy.
+
+ \sa operator/=()
+*/
+
+/*!
+ \fn QPoint &QPoint::operator*=(double factor)
Multiplies this point's coordinates by the given \a factor, and
returns a reference to this point. For example:
@@ -200,6 +212,14 @@ QT_BEGIN_NAMESPACE
\sa operator/=()
*/
+/*!
+ \fn QPoint &QPoint::operator*=(int factor)
+
+ Multiplies this point's coordinates by the given \a factor, and
+ returns a reference to this point.
+
+ \sa operator/=()
+*/
/*!
\fn bool operator==(const QPoint &p1, const QPoint &p2)
@@ -237,7 +257,7 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn const QPoint operator*(const QPoint &point, qreal factor)
+ \fn const QPoint operator*(const QPoint &point, float factor)
\relates QPoint
Returns a copy of the given \a point multiplied by the given \a factor.
@@ -249,7 +269,44 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn const QPoint operator*(qreal factor, const QPoint &point)
+ \fn const QPoint operator*(const QPoint &point, double factor)
+ \relates QPoint
+
+ Returns a copy of the given \a point multiplied by the given \a factor.
+
+ Note that the result is rounded to the nearest integer as points
+ are held as integers. Use QPointF for floating point accuracy.
+
+ \sa QPoint::operator*=()
+*/
+
+/*!
+ \fn const QPoint operator*(const QPoint &point, int factor)
+ \relates QPoint
+
+ Returns a copy of the given \a point multiplied by the given \a factor.
+
+ \sa QPoint::operator*=()
+*/
+
+/*!
+ \fn const QPoint operator*(float factor, const QPoint &point)
+ \overload
+ \relates QPoint
+
+ Returns a copy of the given \a point multiplied by the given \a factor.
+*/
+
+/*!
+ \fn const QPoint operator*(double factor, const QPoint &point)
+ \overload
+ \relates QPoint
+
+ Returns a copy of the given \a point multiplied by the given \a factor.
+*/
+
+/*!
+ \fn const QPoint operator*(int factor, const QPoint &point)
\overload
\relates QPoint
diff --git a/src/corelib/tools/qpoint.h b/src/corelib/tools/qpoint.h
index 79a7dd8..e57b0ed 100644
--- a/src/corelib/tools/qpoint.h
+++ b/src/corelib/tools/qpoint.h
@@ -70,15 +70,23 @@ public:
QPoint &operator+=(const QPoint &p);
QPoint &operator-=(const QPoint &p);
- QPoint &operator*=(qreal c);
+
+ QPoint &operator*=(float c);
+ QPoint &operator*=(double c);
+ QPoint &operator*=(int c);
+
QPoint &operator/=(qreal c);
friend inline bool operator==(const QPoint &, const QPoint &);
friend inline bool operator!=(const QPoint &, const QPoint &);
friend inline const QPoint operator+(const QPoint &, const QPoint &);
friend inline const QPoint operator-(const QPoint &, const QPoint &);
- friend inline const QPoint operator*(const QPoint &, qreal);
- friend inline const QPoint operator*(qreal, const QPoint &);
+ friend inline const QPoint operator*(const QPoint &, float);
+ friend inline const QPoint operator*(float, const QPoint &);
+ friend inline const QPoint operator*(const QPoint &, double);
+ friend inline const QPoint operator*(double, const QPoint &);
+ friend inline const QPoint operator*(const QPoint &, int);
+ friend inline const QPoint operator*(int, const QPoint &);
friend inline const QPoint operator-(const QPoint &);
friend inline const QPoint operator/(const QPoint &, qreal);
@@ -141,9 +149,15 @@ inline QPoint &QPoint::operator+=(const QPoint &p)
inline QPoint &QPoint::operator-=(const QPoint &p)
{ xp-=p.xp; yp-=p.yp; return *this; }
-inline QPoint &QPoint::operator*=(qreal c)
+inline QPoint &QPoint::operator*=(float c)
+{ xp = qRound(xp*c); yp = qRound(yp*c); return *this; }
+
+inline QPoint &QPoint::operator*=(double c)
{ xp = qRound(xp*c); yp = qRound(yp*c); return *this; }
+inline QPoint &QPoint::operator*=(int c)
+{ xp = xp*c; yp = yp*c; return *this; }
+
inline bool operator==(const QPoint &p1, const QPoint &p2)
{ return p1.xp == p2.xp && p1.yp == p2.yp; }
@@ -156,12 +170,24 @@ inline const QPoint operator+(const QPoint &p1, const QPoint &p2)
inline const QPoint operator-(const QPoint &p1, const QPoint &p2)
{ return QPoint(p1.xp-p2.xp, p1.yp-p2.yp); }
-inline const QPoint operator*(const QPoint &p, qreal c)
+inline const QPoint operator*(const QPoint &p, float c)
{ return QPoint(qRound(p.xp*c), qRound(p.yp*c)); }
-inline const QPoint operator*(qreal c, const QPoint &p)
+inline const QPoint operator*(const QPoint &p, double c)
{ return QPoint(qRound(p.xp*c), qRound(p.yp*c)); }
+inline const QPoint operator*(const QPoint &p, int c)
+{ return QPoint(p.xp*c, p.yp*c); }
+
+inline const QPoint operator*(float c, const QPoint &p)
+{ return QPoint(qRound(p.xp*c), qRound(p.yp*c)); }
+
+inline const QPoint operator*(double c, const QPoint &p)
+{ return QPoint(qRound(p.xp*c), qRound(p.yp*c)); }
+
+inline const QPoint operator*(int c, const QPoint &p)
+{ return QPoint(p.xp*c, p.yp*c); }
+
inline const QPoint operator-(const QPoint &p)
{ return QPoint(-p.xp, -p.yp); }
diff --git a/src/corelib/tools/qsimd.cpp b/src/corelib/tools/qsimd.cpp
index d44a9d0..f862fc5 100644
--- a/src/corelib/tools/qsimd.cpp
+++ b/src/corelib/tools/qsimd.cpp
@@ -290,7 +290,13 @@ static inline uint detectProcessorFeatures()
uint features = MMX|SSE|SSE2|CMOV;
uint feature_result = 0;
-#if defined(Q_CC_GNU)
+#if defined (Q_OS_WIN64)
+ {
+ int info[4];
+ __cpuid(info, 1);
+ feature_result = info[2];
+ }
+#elif defined(Q_CC_GNU)
quint64 tmp;
asm ("xchg %%rbx, %1\n"
"cpuid\n"
@@ -299,12 +305,6 @@ static inline uint detectProcessorFeatures()
: "a" (1)
: "%edx"
);
-#elif defined (Q_OS_WIN64)
- {
- int info[4];
- __cpuid(info, 1);
- feature_result = info[2];
- }
#endif
if (feature_result & (1u))
diff --git a/src/corelib/xml/qxmlstream.cpp b/src/corelib/xml/qxmlstream.cpp
index 91c3a19..64a9857 100644
--- a/src/corelib/xml/qxmlstream.cpp
+++ b/src/corelib/xml/qxmlstream.cpp
@@ -2941,6 +2941,9 @@ QStringRef QXmlStreamReader::documentEncoding() const
By default, QXmlStreamWriter encodes XML in UTF-8. Different
encodings can be enforced using setCodec().
+ If an error occurs while writing to the underlying device, hasError()
+ starts returning true and subsequent writes are ignored.
+
The \l{QXmlStream Bookmarks Example} illustrates how to use a
stream writer to write an XML bookmark file (XBEL) that
was previously read in by a QXmlStreamReader.
@@ -2965,7 +2968,8 @@ public:
void write(const QStringRef &);
void write(const QString &);
void writeEscaped(const QString &, bool escapeWhitespace = false);
- void write(const char *s);
+ void write(const char *s, int len);
+ template <int N> void write(const char (&s)[N]) { write(s, N - 1); }
bool finishStartElement(bool contents = true);
void writeStartElement(const QString &namespaceUri, const QString &name);
QIODevice *device;
@@ -2975,6 +2979,7 @@ public:
uint inEmptyElement :1;
uint lastWasStartElement :1;
uint wroteSomething :1;
+ uint hasError :1;
uint autoFormatting :1;
QByteArray autoFormattingIndent;
NamespaceDeclaration emptyNamespace;
@@ -3007,6 +3012,7 @@ QXmlStreamWriterPrivate::QXmlStreamWriterPrivate(QXmlStreamWriter *q)
#endif
inStartElement = inEmptyElement = false;
wroteSomething = false;
+ hasError = false;
lastWasStartElement = false;
lastNamespaceDeclaration = 1;
autoFormatting = false;
@@ -3016,11 +3022,15 @@ QXmlStreamWriterPrivate::QXmlStreamWriterPrivate(QXmlStreamWriter *q)
void QXmlStreamWriterPrivate::write(const QStringRef &s)
{
if (device) {
+ if (hasError)
+ return;
#ifdef QT_NO_TEXTCODEC
- device->write(s.toString().toLatin1(), s.size());
+ QByteArray bytes = s.toLatin1();
#else
- device->write(encoder->fromUnicode(s.constData(), s.size()));
+ QByteArray bytes = encoder->fromUnicode(s.constData(), s.size());
#endif
+ if (device->write(bytes) != bytes.size())
+ hasError = true;
}
else if (stringDevice)
s.appendTo(stringDevice);
@@ -3031,11 +3041,15 @@ void QXmlStreamWriterPrivate::write(const QStringRef &s)
void QXmlStreamWriterPrivate::write(const QString &s)
{
if (device) {
+ if (hasError)
+ return;
#ifdef QT_NO_TEXTCODEC
- device->write(s.toLatin1(), s.size());
+ QByteArray bytes = s.toLatin1();
#else
- device->write(encoder->fromUnicode(s));
+ QByteArray bytes = encoder->fromUnicode(s);
#endif
+ if (device->write(bytes) != bytes.size())
+ hasError = true;
}
else if (stringDevice)
stringDevice->append(s);
@@ -3070,31 +3084,19 @@ void QXmlStreamWriterPrivate::writeEscaped(const QString &s, bool escapeWhitespa
escaped += QChar(c);
}
}
- if (device) {
-#ifdef QT_NO_TEXTCODEC
- device->write(escaped.toLatin1(), escaped.size());
-#else
- device->write(encoder->fromUnicode(escaped));
-#endif
- }
- else if (stringDevice)
- stringDevice->append(escaped);
- else
- qWarning("QXmlStreamWriter: No device");
+ write(escaped);
}
-
-void QXmlStreamWriterPrivate::write(const char *s)
+// ASCII only!
+void QXmlStreamWriterPrivate::write(const char *s, int len)
{
if (device) {
-#ifndef QT_NO_TEXTCODEC
- if (codec->mibEnum() != 106)
- device->write(encoder->fromUnicode(QLatin1String(s)));
- else
-#endif
- device->write(s, strlen(s));
+ if (hasError)
+ return;
+ if (device->write(s, len) != len)
+ hasError = true;
} else if (stringDevice) {
- stringDevice->append(QLatin1String(s));
+ stringDevice->append(QString::fromLatin1(s, len));
} else
qWarning("QXmlStreamWriter: No device");
}
@@ -3172,7 +3174,7 @@ void QXmlStreamWriterPrivate::indent(int level)
{
write("\n");
for (int i = level; i > 0; --i)
- write(autoFormattingIndent.constData());
+ write(autoFormattingIndent.constData(), autoFormattingIndent.length());
}
@@ -3373,6 +3375,17 @@ int QXmlStreamWriter::autoFormattingIndent() const
return d->autoFormattingIndent.count(' ') - d->autoFormattingIndent.count('\t');
}
+/*!
+ Returns \c true if the stream failed to write to the underlying device.
+
+ The error status is never reset. Writes happening after the error
+ occurred are ignored, even if the error condition is cleared.
+ */
+bool QXmlStreamWriter::hasError() const
+{
+ Q_D(const QXmlStreamWriter);
+ return d->hasError;
+}
/*!
\overload
@@ -3759,7 +3772,7 @@ void QXmlStreamWriter::writeStartDocument(const QString &version)
#ifdef QT_NO_TEXTCODEC
d->write("iso-8859-1");
#else
- d->write(d->codec->name().constData());
+ d->write(d->codec->name().constData(), d->codec->name().length());
#endif
}
d->write("\"?>");
@@ -3782,12 +3795,13 @@ void QXmlStreamWriter::writeStartDocument(const QString &version, bool standalon
#ifdef QT_NO_TEXTCODEC
d->write("iso-8859-1");
#else
- d->write(d->codec->name().constData());
+ d->write(d->codec->name().constData(), d->codec->name().length());
#endif
}
- d->write("\" standalone=\"");
- d->write(standalone ? "yes" : "no");
- d->write("\"?>");
+ if (standalone)
+ d->write("\" standalone=\"yes\"?>");
+ else
+ d->write("\" standalone=\"no\"?>");
}
diff --git a/src/corelib/xml/qxmlstream.h b/src/corelib/xml/qxmlstream.h
index d7143bd..244d3d4 100644
--- a/src/corelib/xml/qxmlstream.h
+++ b/src/corelib/xml/qxmlstream.h
@@ -474,6 +474,8 @@ public:
void writeCurrentToken(const QXmlStreamReader &reader);
#endif
+ bool hasError() const;
+
private:
Q_DISABLE_COPY(QXmlStreamWriter)
Q_DECLARE_PRIVATE(QXmlStreamWriter)
diff --git a/src/dbus/qdbusconnection_p.h b/src/dbus/qdbusconnection_p.h
index 1bd00da..67145b8 100644
--- a/src/dbus/qdbusconnection_p.h
+++ b/src/dbus/qdbusconnection_p.h
@@ -203,6 +203,8 @@ public:
void disconnectRelay(const QString &service,
const QString &path, const QString &interface,
QDBusAbstractInterface *receiver, const char *signal);
+ void registerService(const QString &serviceName);
+ void unregisterService(const QString &serviceName);
bool handleMessage(const QDBusMessage &msg);
void waitForFinished(QDBusPendingCallPrivate *pcall);
@@ -247,9 +249,11 @@ public slots:
void socketWrite(int);
void objectDestroyed(QObject *o);
void relaySignal(QObject *obj, const QMetaObject *, int signalId, const QVariantList &args);
- void _q_serviceOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner);
- void registerService(const QString &serviceName);
- void unregisterService(const QString &serviceName);
+
+private slots:
+ void serviceOwnerChangedNoLock(const QString &name, const QString &oldOwner, const QString &newOwner);
+ void registerServiceNoLock(const QString &serviceName);
+ void unregisterServiceNoLock(const QString &serviceName);
signals:
void serviceOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner);
@@ -303,6 +307,9 @@ public:
QObject *receiver, const char *signal, int minMIdx,
bool buildSignature);
static DBusHandlerResult messageFilter(DBusConnection *, DBusMessage *, void *);
+ static bool checkReplyForDelivery(QDBusConnectionPrivate *target, QObject *object,
+ int idx, const QList<int> &metaTypes,
+ const QDBusMessage &msg);
static QDBusCallDeliveryEvent *prepareReply(QDBusConnectionPrivate *target, QObject *object,
int idx, const QList<int> &metaTypes,
const QDBusMessage &msg);
diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp
index c7f62aa..4118727 100644
--- a/src/dbus/qdbusintegrator.cpp
+++ b/src/dbus/qdbusintegrator.cpp
@@ -552,6 +552,9 @@ bool QDBusConnectionPrivate::handleMessage(const QDBusMessage &amsg)
(*(*list)[i])(amsg);
}
+ if (!ref)
+ return false;
+
switch (amsg.type()) {
case QDBusMessage::SignalMessage:
handleSignal(amsg);
@@ -713,6 +716,8 @@ static int findSlot(const QMetaObject *mo, const QByteArray &name, int flags,
return -1;
}
+static QDBusCallDeliveryEvent * const DIRECT_DELIVERY = (QDBusCallDeliveryEvent *)1;
+
QDBusCallDeliveryEvent* QDBusConnectionPrivate::prepareReply(QDBusConnectionPrivate *target,
QObject *object, int idx,
const QList<int> &metaTypes,
@@ -736,6 +741,8 @@ QDBusCallDeliveryEvent* QDBusConnectionPrivate::prepareReply(QDBusConnectionPriv
// we can deliver
// prepare for the call
+ if (target == object)
+ return DIRECT_DELIVERY;
return new QDBusCallDeliveryEvent(QDBusConnection(target), idx, target, msg, metaTypes);
}
@@ -750,6 +757,12 @@ void QDBusConnectionPrivate::activateSignal(const QDBusConnectionPrivate::Signal
// Slots can optionally have one final parameter that is a QDBusMessage
// Slots receive read-only copies of the message (i.e., pass by value or by const-ref)
QDBusCallDeliveryEvent *call = prepareReply(this, hook.obj, hook.midx, hook.params, msg);
+ if (call == DIRECT_DELIVERY) {
+ // short-circuit delivery
+ Q_ASSERT(this == hook.obj);
+ deliverCall(this, 0, msg, hook.params, hook.midx);
+ return;
+ }
if (call)
postEventToThread(ActivateSignalAction, hook.obj, call);
}
@@ -1207,11 +1220,11 @@ void QDBusConnectionPrivate::relaySignal(QObject *obj, const QMetaObject *mo, in
q_dbus_message_unref(msg);
}
-void QDBusConnectionPrivate::_q_serviceOwnerChanged(const QString &name,
- const QString &oldOwner, const QString &newOwner)
+void QDBusConnectionPrivate::serviceOwnerChangedNoLock(const QString &name,
+ const QString &oldOwner, const QString &newOwner)
{
Q_UNUSED(oldOwner);
- QDBusWriteLocker locker(UpdateSignalHookOwnerAction, this);
+// QDBusWriteLocker locker(UpdateSignalHookOwnerAction, this);
WatchedServicesHash::Iterator it = watchedServices.find(name);
if (it == watchedServices.end())
return;
@@ -1686,11 +1699,11 @@ void QDBusConnectionPrivate::setConnection(DBusConnection *dbc, const QDBusError
hook.obj = this;
hook.params << QMetaType::Void << QVariant::String; // both functions take a QString as parameter and return void
- hook.midx = staticMetaObject.indexOfSlot("registerService(QString)");
+ hook.midx = staticMetaObject.indexOfSlot("registerServiceNoLock(QString)");
Q_ASSERT(hook.midx != -1);
signalHooks.insert(QLatin1String("NameAcquired:" DBUS_INTERFACE_DBUS), hook);
- hook.midx = staticMetaObject.indexOfSlot("unregisterService(QString)");
+ hook.midx = staticMetaObject.indexOfSlot("unregisterServiceNoLock(QString)");
Q_ASSERT(hook.midx != -1);
signalHooks.insert(QLatin1String("NameLost:" DBUS_INTERFACE_DBUS), hook);
@@ -2081,7 +2094,7 @@ void QDBusConnectionPrivate::connectSignal(const QString &key, const SignalHook
// we need to watch for this service changing
connectSignal(dbusServiceString(), QString(), dbusInterfaceString(),
QLatin1String("NameOwnerChanged"), QStringList() << hook.service, QString(),
- this, SLOT(_q_serviceOwnerChanged(QString,QString,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 << ")";
@@ -2342,12 +2355,22 @@ QDBusConnectionPrivate::findMetaObject(const QString &service, const QString &pa
void QDBusConnectionPrivate::registerService(const QString &serviceName)
{
QDBusWriteLocker locker(RegisterServiceAction, this);
+ registerServiceNoLock(serviceName);
+}
+
+void QDBusConnectionPrivate::registerServiceNoLock(const QString &serviceName)
+{
serviceNames.append(serviceName);
}
void QDBusConnectionPrivate::unregisterService(const QString &serviceName)
{
QDBusWriteLocker locker(UnregisterServiceAction, this);
+ unregisterServiceNoLock(serviceName);
+}
+
+void QDBusConnectionPrivate::unregisterServiceNoLock(const QString &serviceName)
+{
serviceNames.removeAll(serviceName);
}
diff --git a/src/declarative/debugger/qdeclarativedebugservice.cpp b/src/declarative/debugger/qdeclarativedebugservice.cpp
index 8c86ae8..849df73 100644
--- a/src/declarative/debugger/qdeclarativedebugservice.cpp
+++ b/src/declarative/debugger/qdeclarativedebugservice.cpp
@@ -226,9 +226,11 @@ QDeclarativeDebugServer *QDeclarativeDebugServer::instance()
server->waitForConnection();
}
} else {
- qWarning(QString::fromAscii("QDeclarativeDebugServer: Ignoring \"-qmljsdebugger=%1\". "
- "Format is -qmljsdebugger=port:<port>[,block]").arg(
- appD->qmljsDebugArgumentsString()).toAscii().constData());
+ const QString message =
+ QString::fromAscii("QDeclarativeDebugServer: Ignoring \"-qmljsdebugger=%1\". "
+ "Format is -qmljsdebugger=port:<port>[,block]").
+ arg(appD->qmljsDebugArgumentsString());
+ qWarning("%s", qPrintable(message));
}
}
#endif
diff --git a/src/declarative/declarative.pro b/src/declarative/declarative.pro
index 299ca06..1ad888b 100644
--- a/src/declarative/declarative.pro
+++ b/src/declarative/declarative.pro
@@ -2,7 +2,6 @@ TARGET = QtDeclarative
QPRO_PWD = $$PWD
QT = core gui script network
contains(QT_CONFIG, svg): QT += svg
-contains(QT_CONFIG, opengl): QT += opengl
DEFINES += QT_BUILD_DECLARATIVE_LIB QT_NO_URL_CAST_FROM_STRING
win32-msvc*|win32-icc:QMAKE_LFLAGS += /BASE:0x66000000
solaris-cc*:QMAKE_CXXFLAGS_RELEASE -= -O2
@@ -25,7 +24,10 @@ include(graphicsitems/graphicsitems.pri)
include(qml/qml.pri)
include(debugger/debugger.pri)
-symbian:TARGET.UID3=0x2001E623
+symbian: {
+ TARGET.UID3=0x2001E623
+ LIBS += -lefsrv
+}
DEFINES += QT_NO_OPENTYPE
INCLUDEPATH += ../3rdparty/harfbuzz/src
diff --git a/src/declarative/graphicsitems/qdeclarativeborderimage.cpp b/src/declarative/graphicsitems/qdeclarativeborderimage.cpp
index 649c8fb..c0a7d72 100644
--- a/src/declarative/graphicsitems/qdeclarativeborderimage.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeborderimage.cpp
@@ -509,7 +509,7 @@ void QDeclarativeBorderImage::doUpdate()
void QDeclarativeBorderImage::paint(QPainter *p, const QStyleOptionGraphicsItem *, QWidget *)
{
Q_D(QDeclarativeBorderImage);
- if (d->pix.isNull())
+ if (d->pix.isNull() || d->width() <= 0.0 || d->height() <= 0.0)
return;
bool oldAA = p->testRenderHint(QPainter::Antialiasing);
@@ -518,7 +518,23 @@ void QDeclarativeBorderImage::paint(QPainter *p, const QStyleOptionGraphicsItem
p->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform, d->smooth);
const QDeclarativeScaleGrid *border = d->getScaleGrid();
- QMargins margins(border->left(), border->top(), border->right(), border->bottom());
+ int left = border->left();
+ int right = border->right();
+ qreal borderWidth = left + right;
+ if (borderWidth > 0.0 && d->width() < borderWidth) {
+ qreal diff = borderWidth - d->width() - 1;
+ left -= qRound(diff * qreal(left) / borderWidth);
+ right -= qRound(diff * qreal(right) / borderWidth);
+ }
+ int top = border->top();
+ int bottom = border->bottom();
+ qreal borderHeight = top + bottom;
+ if (borderHeight > 0.0 && d->height() < borderHeight) {
+ qreal diff = borderHeight - d->height() - 1;
+ top -= qRound(diff * qreal(top) / borderHeight);
+ bottom -= qRound(diff * qreal(bottom) / borderHeight);
+ }
+ QMargins margins(left, top, right, bottom);
QTileRules rules((Qt::TileRule)d->horizontalTileMode, (Qt::TileRule)d->verticalTileMode);
qDrawBorderPixmap(p, QRect(0, 0, (int)d->width(), (int)d->height()), margins, d->pix, d->pix.rect(), margins, rules);
if (d->smooth) {
diff --git a/src/declarative/graphicsitems/qdeclarativeevents.cpp b/src/declarative/graphicsitems/qdeclarativeevents.cpp
index 61fd562..4b5e777 100644
--- a/src/declarative/graphicsitems/qdeclarativeevents.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeevents.cpp
@@ -108,6 +108,34 @@ Item {
so that ancestor items do not also respond to the same event.
*/
+/*!
+ \qmlproperty int KeyEvent::modifiers
+
+ This property holds the keyboard modifier flags that existed immediately
+ before the event occurred.
+
+ It contains a bitwise combination of:
+ \list
+ \o Qt.NoModifier - No modifier key is pressed.
+ \o Qt.ShiftModifier - A Shift key on the keyboard is pressed.
+ \o Qt.ControlModifier - A Ctrl key on the keyboard is pressed.
+ \o Qt.AltModifier - An Alt key on the keyboard is pressed.
+ \o Qt.MetaModifier - A Meta key on the keyboard is pressed.
+ \o Qt.KeypadModifier - A keypad button is pressed.
+ \endlist
+
+ For example, to react to a Shift key + Enter key combination:
+ \qml
+ Item {
+ focus: true
+ Keys.onPressed: {
+ if ((event.key == Qt.Key_Enter) && (event.modifiers & Qt.ShiftModifier))
+ doSomething();
+ }
+ }
+ \endqml
+*/
+
/*!
\qmlclass MouseEvent QDeclarativeMouseEvent
@@ -199,7 +227,7 @@ Item {
\qml
MouseArea {
onClicked: {
- if (mouse.button == Qt.LeftButton && mouse.modifiers & Qt.ShiftModifier)
+ if ((mouse.button == Qt.LeftButton) && (mouse.modifiers & Qt.ShiftModifier))
doSomething();
}
}
diff --git a/src/declarative/graphicsitems/qdeclarativeflickable.cpp b/src/declarative/graphicsitems/qdeclarativeflickable.cpp
index 98c213c..2532b85 100644
--- a/src/declarative/graphicsitems/qdeclarativeflickable.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeflickable.cpp
@@ -671,10 +671,12 @@ 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))
stealMouse = true; // If we've been flicked then steal the click.
else
stealMouse = false;
+ q->setKeepMouseGrab(stealMouse);
pressed = true;
timeline.clear();
hData.velocity = 0;
@@ -700,8 +702,8 @@ void QDeclarativeFlickablePrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent
bool rejectY = false;
bool rejectX = false;
- bool stealY = false;
- bool stealX = false;
+ bool stealY = stealMouse;
+ bool stealX = stealMouse;
if (q->yflick()) {
int dy = int(event->pos().y() - pressPos.y());
@@ -769,6 +771,8 @@ void QDeclarativeFlickablePrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent
}
stealMouse = stealX || stealY;
+ if (stealMouse)
+ q->setKeepMouseGrab(true);
if (!lastPos.isNull()) {
qreal elapsed = qreal(QDeclarativeItemPrivate::restart(lastPosTime)) / 1000.;
@@ -848,8 +852,6 @@ void QDeclarativeFlickable::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
Q_D(QDeclarativeFlickable);
if (d->interactive) {
d->handleMouseMoveEvent(event);
- if (d->stealMouse)
- setKeepMouseGrab(true);
event->accept();
} else {
QDeclarativeItem::mouseMoveEvent(event);
diff --git a/src/declarative/graphicsitems/qdeclarativegridview.cpp b/src/declarative/graphicsitems/qdeclarativegridview.cpp
index 6f38f63..7ddf6a2 100644
--- a/src/declarative/graphicsitems/qdeclarativegridview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativegridview.cpp
@@ -219,12 +219,8 @@ public:
}
} else {
qreal pos = (modelIndex / columns) * rowSize();
- if (header) {
- qreal headerSize = flow == QDeclarativeGridView::LeftToRight
- ? header->item->height()
- : header->item->width();
- pos += headerSize;
- }
+ if (header)
+ pos += headerSize();
return pos;
}
return 0;
@@ -291,11 +287,9 @@ public:
if (item->index == -1)
continue;
qreal itemTop = item->rowPos();
- if (item->index == model->count()-1 || (itemTop+rowSize()/2 >= pos))
+ if (itemTop+rowSize()/2 >= pos && itemTop - rowSize()/2 <= pos)
return item;
}
- if (visibleItems.count() && visibleItems.first()->rowPos() <= pos)
- return visibleItems.first();
return 0;
}
@@ -315,6 +309,16 @@ public:
return index;
}
+ qreal headerSize() const {
+ if (!header)
+ return 0.0;
+
+ return flow == QDeclarativeGridView::LeftToRight
+ ? header->item->height()
+ : header->item->width();
+ }
+
+
virtual void itemGeometryChanged(QDeclarativeItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) {
Q_Q(const QDeclarativeGridView);
QDeclarativeFlickablePrivate::itemGeometryChanged(item, newGeometry, oldGeometry);
@@ -731,7 +735,7 @@ void QDeclarativeGridViewPrivate::createHighlight()
QDeclarative_setParent_noEvent(item, q->contentItem());
item->setParentItem(q->contentItem());
highlight = new FxGridItem(item, q);
- if (currentItem)
+ if (currentItem && autoHighlight)
highlight->setPosition(currentItem->colPos(), currentItem->rowPos());
highlightXAnimator = new QSmoothedAnimation(q);
highlightXAnimator->target = QDeclarativeProperty(highlight->item, QLatin1String("x"));
@@ -878,14 +882,11 @@ void QDeclarativeGridViewPrivate::updateHeader()
if (header) {
if (visibleItems.count()) {
qreal startPos = startPosition();
- qreal headerSize = flow == QDeclarativeGridView::LeftToRight
- ? header->item->height()
- : header->item->width();
if (visibleIndex == 0) {
- header->setPosition(0, startPos - headerSize);
+ header->setPosition(0, startPos - headerSize());
} else {
- if (position() <= startPos || header->rowPos() > startPos - headerSize)
- header->setPosition(0, startPos - headerSize);
+ if (position() <= startPos || header->rowPos() > startPos - headerSize())
+ header->setPosition(0, startPos - headerSize());
}
} else {
header->setPosition(0, 0);
@@ -920,10 +921,14 @@ void QDeclarativeGridViewPrivate::fixup(AxisData &data, qreal minExtent, qreal m
qreal bottomPos = qMax(bottomItem->rowPos() - highlightRangeEnd, -minExtent);
pos = qAbs(data.move + topPos) < qAbs(data.move + bottomPos) ? topPos : bottomPos;
} else if (topItem) {
- pos = qMax(qMin(topItem->rowPos() - highlightRangeStart, -maxExtent), -minExtent);
+ if (topItem->index == 0 && header && position()+highlightRangeStart < header->rowPos()+headerSize()/2)
+ pos = header->rowPos() - highlightRangeStart;
+ else
+ pos = qMax(qMin(topItem->rowPos() - highlightRangeStart, -maxExtent), -minExtent);
} else if (bottomItem) {
pos = qMax(qMin(bottomItem->rowPos() - highlightRangeStart, -maxExtent), -minExtent);
} else {
+ QDeclarativeFlickablePrivate::fixup(data, minExtent, maxExtent);
fixupDuration = oldDuration;
return;
}
@@ -1126,6 +1131,13 @@ void QDeclarativeGridViewPrivate::flick(AxisData &data, qreal minExtent, qreal m
Delegates are instantiated as needed and may be destroyed at any time.
State should \e never be stored in a delegate.
+ GridView attaches a number of properties to the root item of the delegate, for example
+ \c {GridView.isCurrentItem}. In the following example, the root delegate item can access
+ this attached property directly as \c GridView.isCurrentItem, while the child
+ \c contactInfo object must refer to this property as \c wrapper.GridView.isCurrentItem.
+
+ \snippet doc/src/snippets/declarative/gridview/gridview.qml isCurrentItem
+
\note Views do not set the \l{Item::}{clip} property automatically.
If the view is not clipped by another item or the screen, it will be necessary
to set this property to true in order to clip the items that are partially or
@@ -1162,6 +1174,8 @@ QDeclarativeGridView::~QDeclarativeGridView()
This attached property holds the view that manages this delegate instance.
It is attached to each instance of the delegate.
+
+ \snippet doc/src/snippets/declarative/gridview/gridview.qml isCurrentItem
*/
/*!
@@ -1248,7 +1262,8 @@ void QDeclarativeGridView::setModel(const QVariant &model)
d->moveReason = QDeclarativeGridViewPrivate::SetIndex;
d->updateCurrent(d->currentIndex);
if (d->highlight && d->currentItem) {
- d->highlight->setPosition(d->currentItem->colPos(), d->currentItem->rowPos());
+ if (d->autoHighlight)
+ d->highlight->setPosition(d->currentItem->colPos(), d->currentItem->rowPos());
d->updateTrackedItem();
}
d->moveReason = QDeclarativeGridViewPrivate::Other;
@@ -1316,7 +1331,8 @@ void QDeclarativeGridView::setDelegate(QDeclarativeComponent *delegate)
d->moveReason = QDeclarativeGridViewPrivate::SetIndex;
d->updateCurrent(d->currentIndex);
if (d->highlight && d->currentItem) {
- d->highlight->setPosition(d->currentItem->colPos(), d->currentItem->rowPos());
+ if (d->autoHighlight)
+ d->highlight->setPosition(d->currentItem->colPos(), d->currentItem->rowPos());
d->updateTrackedItem();
}
d->moveReason = QDeclarativeGridViewPrivate::Other;
@@ -1764,8 +1780,10 @@ void QDeclarativeGridView::setFooter(QDeclarativeComponent *footer)
d->footer = 0;
}
d->footerComponent = footer;
- d->updateFooter();
- d->updateGrid();
+ if (isComponentComplete()) {
+ d->updateFooter();
+ d->updateGrid();
+ }
emit footerChanged();
}
}
@@ -1794,9 +1812,11 @@ void QDeclarativeGridView::setHeader(QDeclarativeComponent *header)
d->header = 0;
}
d->headerComponent = header;
- d->updateHeader();
- d->updateFooter();
- d->updateGrid();
+ if (isComponentComplete()) {
+ d->updateHeader();
+ d->updateFooter();
+ d->updateGrid();
+ }
emit headerChanged();
}
}
@@ -2221,6 +2241,8 @@ void QDeclarativeGridView::componentComplete()
{
Q_D(QDeclarativeGridView);
QDeclarativeFlickable::componentComplete();
+ d->updateHeader();
+ d->updateFooter();
d->updateGrid();
if (d->isValid()) {
refill();
@@ -2230,7 +2252,8 @@ void QDeclarativeGridView::componentComplete()
else
d->updateCurrent(d->currentIndex);
if (d->highlight && d->currentItem) {
- d->highlight->setPosition(d->currentItem->colPos(), d->currentItem->rowPos());
+ if (d->autoHighlight)
+ d->highlight->setPosition(d->currentItem->colPos(), d->currentItem->rowPos());
d->updateTrackedItem();
}
d->moveReason = QDeclarativeGridViewPrivate::Other;
@@ -2638,7 +2661,8 @@ void QDeclarativeGridView::modelReset()
d->moveReason = QDeclarativeGridViewPrivate::SetIndex;
d->updateCurrent(d->currentIndex);
if (d->highlight && d->currentItem) {
- d->highlight->setPosition(d->currentItem->colPos(), d->currentItem->rowPos());
+ if (d->autoHighlight)
+ d->highlight->setPosition(d->currentItem->colPos(), d->currentItem->rowPos());
d->updateTrackedItem();
}
d->moveReason = QDeclarativeGridViewPrivate::Other;
diff --git a/src/declarative/graphicsitems/qdeclarativeimage.cpp b/src/declarative/graphicsitems/qdeclarativeimage.cpp
index 3b08a9b..aa74716 100644
--- a/src/declarative/graphicsitems/qdeclarativeimage.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeimage.cpp
@@ -461,7 +461,7 @@ QRectF QDeclarativeImage::boundingRect() const
void QDeclarativeImage::paint(QPainter *p, const QStyleOptionGraphicsItem *, QWidget *)
{
Q_D(QDeclarativeImage);
- if (d->pix.isNull())
+ if (d->pix.pixmap().isNull() )
return;
bool oldAA = p->testRenderHint(QPainter::Antialiasing);
diff --git a/src/declarative/graphicsitems/qdeclarativeitem.cpp b/src/declarative/graphicsitems/qdeclarativeitem.cpp
index e0df751..24d9b03 100644
--- a/src/declarative/graphicsitems/qdeclarativeitem.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeitem.cpp
@@ -421,58 +421,28 @@ void QDeclarativeItemKeyFilter::componentComplete()
\since 4.7
\brief The KeyNavigation attached property supports key navigation by arrow keys.
- It is common in key-based UIs to use arrow keys to navigate
- between focused items. The KeyNavigation property provides a
- convenient way of specifying which item will gain focus
- when an arrow key is pressed. The following example provides
- key navigation for a 2x2 grid of items.
-
- \code
- Grid {
- columns: 2
- width: 100; height: 100
- Rectangle {
- id: item1
- focus: true
- width: 50; height: 50
- color: focus ? "red" : "lightgray"
- KeyNavigation.right: item2
- KeyNavigation.down: item3
- }
- Rectangle {
- id: item2
- width: 50; height: 50
- color: focus ? "red" : "lightgray"
- KeyNavigation.left: item1
- KeyNavigation.down: item4
- }
- Rectangle {
- id: item3
- width: 50; height: 50
- color: focus ? "red" : "lightgray"
- KeyNavigation.right: item4
- KeyNavigation.up: item1
- }
- Rectangle {
- id: item4
- width: 50; height: 50
- color: focus ? "red" : "lightgray"
- KeyNavigation.left: item3
- KeyNavigation.up: item2
- }
- }
- \endcode
+ Key-based user interfaces commonly allow the use of arrow keys to navigate between
+ focusable items. The KeyNavigation attached property enables this behavior by providing a
+ convenient way to specify the item that should gain focus when an arrow or tab key is pressed.
+
+ The following example provides key navigation for a 2x2 grid of items:
- By default KeyNavigation receives key events after the item it is attached to.
- If the item accepts an arrow key event, the KeyNavigation
- attached property will not receive an event for that key. Setting the
- \l priority property to KeyNavigation.BeforeItem allows handling
- of the key events before normal item processing.
+ \snippet doc/src/snippets/declarative/keynavigation.qml 0
- If an item has been set for a direction and the KeyNavigation
- attached property receives the corresponding
- key press and release events, the events will be accepted by
- KeyNavigation and will not propagate any further.
+ The top-left item initially receives focus by setting \l {Item::}{focus} to
+ \c true. When an arrow key is pressed, the focus will move to the
+ appropriate item, as defined by the value that has been set for
+ the KeyNavigation \l left, \l right, \l up or \l down properties.
+
+ Note that if a KeyNavigation attached property receives the key press and release
+ events for a requested arrow or tab key, the event is accepted and does not
+ propagate any further.
+
+ By default, KeyNavigation receives key events after the item to which it is attached.
+ If the item accepts the key event, the KeyNavigation attached property will not
+ receive an event for that key. Setting the \l priority property to
+ \c KeyNavigation.BeforeItem allows the event to be used for key navigation
+ before the item, rather than after.
\sa {Keys}{Keys attached property}
*/
@@ -484,10 +454,18 @@ void QDeclarativeItemKeyFilter::componentComplete()
\qmlproperty Item KeyNavigation::down
These properties hold the item to assign focus to
- when Key_Left, Key_Right, Key_Up or Key_Down are
+ when the left, right, up or down cursor keys are
pressed.
*/
+/*!
+ \qmlproperty Item KeyNavigation::tab
+ \qmlproperty Item KeyNavigation::backtab
+
+ These properties hold the item to assign focus to
+ when the Tab key or Shift+Tab key combination (Backtab) are pressed.
+*/
+
QDeclarativeKeyNavigationAttached::QDeclarativeKeyNavigationAttached(QObject *parent)
: QObject(*(new QDeclarativeKeyNavigationAttachedPrivate), parent),
QDeclarativeItemKeyFilter(qobject_cast<QDeclarativeItem*>(parent))
@@ -599,7 +577,7 @@ void QDeclarativeKeyNavigationAttached::setBacktab(QDeclarativeItem *i)
\list
\o KeyNavigation.BeforeItem - process the key events before normal
- item key processing. If the event is accepted it will not
+ item key processing. If the event is used for key navigation, it will be accepted and will not
be passed on to the item.
\o KeyNavigation.AfterItem (default) - process the key events after normal item key
handling. If the item accepts the key event it will not be
@@ -941,6 +919,20 @@ void QDeclarativeKeyNavigationAttached::keyReleased(QKeyEvent *event, bool post)
*/
/*!
+ \qmlsignal Keys::onTabPressed(KeyEvent event)
+
+ This handler is called when the Tab key has been pressed. The \a event
+ parameter provides information about the event.
+*/
+
+/*!
+ \qmlsignal Keys::onBacktabPressed(KeyEvent event)
+
+ This handler is called when the Shift+Tab key combination (Backtab) has
+ been pressed. The \a event parameter provides information about the event.
+*/
+
+/*!
\qmlsignal Keys::onAsteriskPressed(KeyEvent event)
This handler is called when the Asterisk '*' has been pressed. The \a event
@@ -1839,9 +1831,9 @@ void QDeclarativeItem::setClip(bool c)
/*!
\qmlproperty real Item::z
- Sets the stacking order of the item. By default the stacking order is 0.
+ Sets the stacking order of sibling items. By default the stacking order is 0.
- Items with a higher stacking value are drawn on top of items with a
+ Items with a higher stacking value are drawn on top of siblings with a
lower stacking order. Items with the same stacking value are drawn
bottom up in the order they appear. Items with a negative stacking
value are drawn under their parent's content.
@@ -2142,6 +2134,8 @@ QDeclarativeAnchorLine QDeclarativeItemPrivate::baseline() const
Margins apply to top, bottom, left, right, and fill anchors.
The \c anchors.margins property can be used to set all of the various margins at once, to the same value.
+ Note that margins are anchor-specific and are not applied if an item does not
+ use anchors.
Offsets apply for horizontal center, vertical center, and baseline anchors.
diff --git a/src/declarative/graphicsitems/qdeclarativeitem_p.h b/src/declarative/graphicsitems/qdeclarativeitem_p.h
index f85fa27..a36ee34 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)
+ mWidth(0), mHeight(0), implicitWidth(0), implicitHeight(0), hadSubFocusItem(false)
{
QGraphicsItemPrivate::acceptedMouseButtons = 0;
isDeclarativeItem = 1;
@@ -259,7 +259,7 @@ public:
QDeclarativeStateGroup *_states();
QDeclarativeStateGroup *_stateGroup;
- QDeclarativeItem::TransformOrigin origin:4;
+ QDeclarativeItem::TransformOrigin origin:5;
bool widthValid:1;
bool heightValid:1;
bool componentComplete:1;
@@ -275,6 +275,8 @@ public:
qreal implicitWidth;
qreal implicitHeight;
+ bool hadSubFocusItem;
+
QPointF computeTransformOrigin() const;
virtual void setPosHelper(const QPointF &pos)
@@ -288,9 +290,11 @@ public:
// Reimplemented from QGraphicsItemPrivate
virtual void subFocusItemChange()
{
- if (flags & QGraphicsItem::ItemIsFocusScope || !parent)
- emit q_func()->activeFocusChanged(subFocusItem != 0);
+ bool hasSubFocusItem = subFocusItem != 0;
+ if (((flags & QGraphicsItem::ItemIsFocusScope) || !parent) && hasSubFocusItem != hadSubFocusItem)
+ emit q_func()->activeFocusChanged(hasSubFocusItem);
//see also QDeclarativeItemPrivate::focusChanged
+ hadSubFocusItem = hasSubFocusItem;
}
// Reimplemented from QGraphicsItemPrivate
diff --git a/src/declarative/graphicsitems/qdeclarativelistview.cpp b/src/declarative/graphicsitems/qdeclarativelistview.cpp
index 450b6af..702442b 100644
--- a/src/declarative/graphicsitems/qdeclarativelistview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativelistview.cpp
@@ -265,6 +265,8 @@ public:
}
}
pos = (*(--visibleItems.constEnd()))->endPosition() + invisibleCount * (averageSize + spacing);
+ } else if (model && model->count()) {
+ pos = model->count() * averageSize + (model->count()-1) * spacing;
}
return pos;
}
@@ -402,6 +404,8 @@ public:
void itemGeometryChanged(QDeclarativeItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) {
Q_Q(QDeclarativeListView);
QDeclarativeFlickablePrivate::itemGeometryChanged(item, newGeometry, oldGeometry);
+ if (!q->isComponentComplete())
+ return;
if (item != contentItem && (!highlight || item != highlight->item)) {
if ((orient == QDeclarativeListView::Vertical && newGeometry.height() != oldGeometry.height())
|| (orient == QDeclarativeListView::Horizontal && newGeometry.width() != oldGeometry.width())) {
@@ -639,7 +643,8 @@ void QDeclarativeListViewPrivate::refill(qreal from, qreal to, bool doBuffer)
int i = visibleItems.count() - 1;
while (i > 0 && visibleItems.at(i)->index == -1)
--i;
- modelIndex = visibleItems.at(i)->index + 1;
+ if (visibleItems.at(i)->index != -1)
+ modelIndex = visibleItems.at(i)->index + 1;
}
bool changed = false;
@@ -737,16 +742,20 @@ void QDeclarativeListViewPrivate::layout()
return;
}
if (!visibleItems.isEmpty()) {
- qreal oldEnd = visibleItems.last()->endPosition();
+ bool fixedCurrent = currentItem && visibleItems.first()->item == currentItem->item;
+ qreal sum = visibleItems.first()->size();
qreal pos = visibleItems.first()->position() + visibleItems.first()->size() + spacing;
for (int i=1; i < visibleItems.count(); ++i) {
FxListItem *item = visibleItems.at(i);
item->setPosition(pos);
pos += item->size() + spacing;
+ sum += item->size();
+ fixedCurrent = fixedCurrent || (currentItem && item->item == currentItem->item);
}
- // move current item if it is after the visible items.
- if (currentItem && currentIndex > lastVisibleIndex())
- currentItem->setPosition(currentItem->position() + (visibleItems.last()->endPosition() - oldEnd));
+ averageSize = qRound(sum / visibleItems.count());
+ // move current item if it is not a visible item.
+ if (currentIndex >= 0 && currentItem && !fixedCurrent)
+ currentItem->setPosition(positionAt(currentIndex));
}
q->refill();
minExtentDirty = true;
@@ -1044,6 +1053,8 @@ void QDeclarativeListViewPrivate::updateCurrent(int modelIndex)
// This is slightly sub-optimal, but section heading caching minimizes the impact.
if (currentItem->section)
currentItem->section->setVisible(false);
+ if (visibleItems.isEmpty())
+ averageSize = currentItem->size();
}
updateHighlight();
emit q->currentIndexChanged();
@@ -1123,8 +1134,6 @@ void QDeclarativeListViewPrivate::updateHeader()
QDeclarativeItemPrivate *itemPrivate = static_cast<QDeclarativeItemPrivate*>(QGraphicsItemPrivate::get(item));
itemPrivate->addItemChangeListener(this, QDeclarativeItemPrivate::Geometry);
header = new FxListItem(item, q);
- if (visibleItems.isEmpty())
- visiblePos = header->size();
}
}
if (header) {
@@ -1137,6 +1146,8 @@ void QDeclarativeListViewPrivate::updateHeader()
header->setPosition(startPos - header->size());
}
} else {
+ if (itemCount == 0)
+ visiblePos = header->size();
header->setPosition(0);
}
}
@@ -1185,10 +1196,14 @@ void QDeclarativeListViewPrivate::fixup(AxisData &data, qreal minExtent, qreal m
FxListItem *bottomItem = snapItemAt(position()+highlightRangeEnd);
qreal pos;
if (topItem) {
- pos = qMax(qMin(topItem->position() - highlightRangeStart, -maxExtent), -minExtent);
+ if (topItem->index == 0 && header && position()+highlightRangeStart < header->position()+header->size()/2)
+ pos = header->position() - highlightRangeStart;
+ else
+ pos = qMax(qMin(topItem->position() - highlightRangeStart, -maxExtent), -minExtent);
} else if (bottomItem) {
pos = qMax(qMin(bottomItem->position() - highlightRangeStart, -maxExtent), -minExtent);
} else {
+ QDeclarativeFlickablePrivate::fixup(data, minExtent, maxExtent);
fixupDuration = oldDuration;
return;
}
@@ -1401,6 +1416,13 @@ void QDeclarativeListViewPrivate::flick(AxisData &data, qreal minExtent, qreal m
Delegates are instantiated as needed and may be destroyed at any time.
State should \e never be stored in a delegate.
+ ListView attaches a number of properties to the root item of the delegate, for example
+ \c {ListView.isCurrentItem}. In the following example, the root delegate item can access
+ this attached property directly as \c ListView.isCurrentItem, while the child
+ \c contactInfo object must refer to this property as \c wrapper.ListView.isCurrentItem.
+
+ \snippet doc/src/snippets/declarative/listview/listview.qml isCurrentItem
+
\note Views do not enable \e clip automatically. If the view
is not clipped by another item or the screen, it will be necessary
to set \e {clip: true} in order to have the out of view items clipped
@@ -1561,10 +1583,12 @@ void QDeclarativeListView::setModel(const QVariant &model)
d->moveReason = QDeclarativeListViewPrivate::SetIndex;
d->updateCurrent(d->currentIndex);
if (d->highlight && d->currentItem) {
- d->highlight->setPosition(d->currentItem->position());
+ if (d->autoHighlight)
+ d->highlight->setPosition(d->currentItem->position());
d->updateTrackedItem();
}
}
+ d->updateViewport();
}
connect(d->model, SIGNAL(itemsInserted(int,int)), this, SLOT(itemsInserted(int,int)));
connect(d->model, SIGNAL(itemsRemoved(int,int)), this, SLOT(itemsRemoved(int,int)));
@@ -1632,9 +1656,11 @@ void QDeclarativeListView::setDelegate(QDeclarativeComponent *delegate)
d->moveReason = QDeclarativeListViewPrivate::SetIndex;
d->updateCurrent(d->currentIndex);
if (d->highlight && d->currentItem) {
- d->highlight->setPosition(d->currentItem->position());
+ if (d->autoHighlight)
+ d->highlight->setPosition(d->currentItem->position());
d->updateTrackedItem();
}
+ d->updateViewport();
}
}
emit delegateChanged();
@@ -2211,8 +2237,10 @@ void QDeclarativeListView::setFooter(QDeclarativeComponent *footer)
d->footerComponent = footer;
d->minExtentDirty = true;
d->maxExtentDirty = true;
- d->updateFooter();
- d->updateViewport();
+ if (isComponentComplete()) {
+ d->updateFooter();
+ d->updateViewport();
+ }
emit footerChanged();
}
}
@@ -2243,9 +2271,11 @@ void QDeclarativeListView::setHeader(QDeclarativeComponent *header)
d->headerComponent = header;
d->minExtentDirty = true;
d->maxExtentDirty = true;
- d->updateHeader();
- d->updateFooter();
- d->updateViewport();
+ if (isComponentComplete()) {
+ d->updateHeader();
+ d->updateFooter();
+ d->updateViewport();
+ }
emit headerChanged();
}
}
@@ -2618,8 +2648,10 @@ void QDeclarativeListView::positionViewAtIndex(int index, int mode)
cancelFlick();
d->setPosition(pos);
if (d->highlight) {
- d->highlight->setPosition(d->currentItem->itemPosition());
- d->highlight->setSize(d->currentItem->itemSize());
+ if (d->autoHighlight) {
+ d->highlight->setPosition(d->currentItem->itemPosition());
+ d->highlight->setSize(d->currentItem->itemSize());
+ }
d->updateHighlight();
}
}
@@ -2655,6 +2687,8 @@ void QDeclarativeListView::componentComplete()
Q_D(QDeclarativeListView);
QDeclarativeFlickable::componentComplete();
updateSections();
+ d->updateHeader();
+ d->updateFooter();
if (d->isValid()) {
refill();
d->moveReason = QDeclarativeListViewPrivate::SetIndex;
@@ -2663,7 +2697,8 @@ void QDeclarativeListView::componentComplete()
else
d->updateCurrent(d->currentIndex);
if (d->highlight && d->currentItem) {
- d->highlight->setPosition(d->currentItem->position());
+ if (d->autoHighlight)
+ d->highlight->setPosition(d->currentItem->position());
d->updateTrackedItem();
}
d->moveReason = QDeclarativeListViewPrivate::Other;
@@ -2777,7 +2812,10 @@ void QDeclarativeListView::itemsInserted(int modelIndex, int count)
int i = d->visibleItems.count() - 1;
while (i > 0 && d->visibleItems.at(i)->index == -1)
--i;
- if (d->visibleItems.at(i)->index + 1 == modelIndex
+ if (i == 0 && d->visibleItems.first()->index == -1) {
+ // there are no visible items except items marked for removal
+ index = d->visibleItems.count();
+ } else if (d->visibleItems.at(i)->index + 1 == modelIndex
&& d->visibleItems.at(i)->endPosition() < d->buffer+d->position()+d->size()-1) {
// Special case of appending an item to the model.
index = d->visibleItems.count();
@@ -2809,7 +2847,7 @@ void QDeclarativeListView::itemsInserted(int modelIndex, int count)
// 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()
- : d->visibleItems.at(index-1)->endPosition()+d->spacing+1;
+ : d->visibleItems.last()->endPosition()+d->spacing+1;
int initialPos = pos;
int diff = 0;
QList<FxListItem*> added;
@@ -2961,14 +2999,16 @@ void QDeclarativeListView::itemsRemoved(int modelIndex, int count)
}
// update visibleIndex
+ bool haveVisibleIndex = false;
for (it = d->visibleItems.begin(); it != d->visibleItems.end(); ++it) {
if ((*it)->index != -1) {
d->visibleIndex = (*it)->index;
+ haveVisibleIndex = true;
break;
}
}
- if (removedVisible && d->visibleItems.isEmpty()) {
+ if (removedVisible && !haveVisibleIndex) {
d->timeline.clear();
if (d->itemCount == 0) {
d->visibleIndex = 0;
@@ -3126,7 +3166,8 @@ void QDeclarativeListView::modelReset()
d->moveReason = QDeclarativeListViewPrivate::SetIndex;
d->updateCurrent(d->currentIndex);
if (d->highlight && d->currentItem) {
- d->highlight->setPosition(d->currentItem->position());
+ if (d->autoHighlight)
+ d->highlight->setPosition(d->currentItem->position());
d->updateTrackedItem();
}
d->moveReason = QDeclarativeListViewPrivate::Other;
diff --git a/src/declarative/graphicsitems/qdeclarativepathview.cpp b/src/declarative/graphicsitems/qdeclarativepathview.cpp
index 7c79afe..e3987d0 100644
--- a/src/declarative/graphicsitems/qdeclarativepathview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativepathview.cpp
@@ -393,6 +393,13 @@ void QDeclarativePathViewPrivate::regenerate()
Delegates are instantiated as needed and may be destroyed at any time.
State should \e never be stored in a delegate.
+ PathView attaches a number of properties to the root item of the delegate, for example
+ \c {PathView.isCurrentItem}. In the following example, the root delegate item can access
+ this attached property directly as \c PathView.isCurrentItem, while the child
+ \c nameText object must refer to this property as \c wrapper.PathView.isCurrentItem.
+
+ \snippet doc/src/snippets/declarative/pathview/pathview.qml 1
+
\bold Note that views do not enable \e clip automatically. If the view
is not clipped by another item or the screen, it will be necessary
to set \e {clip: true} in order to have the out of view items clipped
@@ -452,6 +459,8 @@ QDeclarativePathView::~QDeclarativePathView()
It is attached to each instance of the delegate.
This property may be used to adjust the appearance of the current item.
+
+ \snippet doc/src/snippets/declarative/pathview/pathview.qml 1
*/
/*!
@@ -1133,8 +1142,10 @@ void QDeclarativePathViewPrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent
QPointF pathPoint = pointNear(event->pos(), &newPc);
if (!stealMouse) {
QPointF delta = pathPoint - startPoint;
- if (qAbs(delta.x()) > QApplication::startDragDistance() || qAbs(delta.y()) > QApplication::startDragDistance())
+ if (qAbs(delta.x()) > QApplication::startDragDistance() || qAbs(delta.y()) > QApplication::startDragDistance()) {
stealMouse = true;
+ startPc = newPc;
+ }
}
if (stealMouse) {
@@ -1478,7 +1489,7 @@ void QDeclarativePathView::itemsRemoved(int modelIndex, int count)
currentChanged = true;
} else if (d->currentIndex >= modelIndex && d->currentIndex < modelIndex + count) {
// current item has been removed.
- d->currentIndex = qMin(modelIndex, d->modelCount-1);
+ d->currentIndex = qMin(modelIndex, d->modelCount-count-1);
if (d->currentItem) {
if (QDeclarativePathViewAttached *att = d->attached(d->currentItem))
att->setIsCurrentItem(true);
diff --git a/src/declarative/graphicsitems/qdeclarativerectangle.cpp b/src/declarative/graphicsitems/qdeclarativerectangle.cpp
index 7686dde..99b36a8 100644
--- a/src/declarative/graphicsitems/qdeclarativerectangle.cpp
+++ b/src/declarative/graphicsitems/qdeclarativerectangle.cpp
@@ -420,6 +420,10 @@ void QDeclarativeRectangle::generateRoundedRect()
p.drawRoundedRect(QRectF(qreal(pw)/2+1, qreal(pw)/2+1, d->rectImage.width()-(pw+1), d->rectImage.height()-(pw+1)), d->radius, d->radius);
else
p.drawRoundedRect(QRectF(qreal(pw)/2, qreal(pw)/2, d->rectImage.width()-pw, d->rectImage.height()-pw), d->radius, d->radius);
+
+ // end painting before inserting pixmap
+ // to pixmap cache to avoid a deep copy
+ p.end();
QPixmapCache::insert(key, d->rectImage);
}
}
@@ -454,6 +458,10 @@ void QDeclarativeRectangle::generateBorderedRect()
p.drawRect(QRectF(qreal(pw)/2+1, qreal(pw)/2+1, d->rectImage.width()-(pw+1), d->rectImage.height()-(pw+1)));
else
p.drawRect(QRectF(qreal(pw)/2, qreal(pw)/2, d->rectImage.width()-pw, d->rectImage.height()-pw));
+
+ // end painting before inserting pixmap
+ // to pixmap cache to avoid a deep copy
+ p.end();
QPixmapCache::insert(key, d->rectImage);
}
}
@@ -462,6 +470,8 @@ void QDeclarativeRectangle::generateBorderedRect()
void QDeclarativeRectangle::paint(QPainter *p, const QStyleOptionGraphicsItem *, QWidget *)
{
Q_D(QDeclarativeRectangle);
+ if (width() <= 0 || height() <= 0)
+ return;
if (d->radius > 0 || (d->pen && d->pen->isValid())
|| (d->gradient && d->gradient->gradient()) ) {
drawRect(*p);
@@ -531,6 +541,12 @@ void QDeclarativeRectangle::drawRect(QPainter &p)
Q_ASSERT(d->rectImage.width() == 2*xOffset + 1);
Q_ASSERT(d->rectImage.height() == 2*yOffset + 1);
+ // check whether we've eliminated the center completely
+ if (2*xOffset > width()+pw)
+ xOffset = (width()+pw)/2;
+ if (2*yOffset > height()+pw)
+ yOffset = (height()+pw)/2;
+
QMargins margins(xOffset, yOffset, xOffset, yOffset);
QTileRules rules(Qt::StretchTile, Qt::StretchTile);
//NOTE: even though our item may have qreal-based width and height, qDrawBorderPixmap only supports QRects
diff --git a/src/declarative/graphicsitems/qdeclarativetext.cpp b/src/declarative/graphicsitems/qdeclarativetext.cpp
index 82c444e..303b21c 100644
--- a/src/declarative/graphicsitems/qdeclarativetext.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetext.cpp
@@ -436,12 +436,13 @@ void QDeclarativeTextPrivate::invalidateImageCache()
{
Q_Q(QDeclarativeText);
- if (imageCacheDirty)
- return;
-
- imageCacheDirty = true;
- imageCache = QPixmap();
+ if(cacheAllTextAsImage || style != QDeclarativeText::Normal){//If actually using the image cache
+ if (imageCacheDirty)
+ return;
+ imageCacheDirty = true;
+ imageCache = QPixmap();
+ }
if (q->isComponentComplete())
q->update();
}
diff --git a/src/declarative/graphicsitems/qdeclarativetextedit.cpp b/src/declarative/graphicsitems/qdeclarativetextedit.cpp
index e05f4e4..4e16d24 100644
--- a/src/declarative/graphicsitems/qdeclarativetextedit.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetextedit.cpp
@@ -643,6 +643,8 @@ int QDeclarativeTextEdit::cursorPosition() const
void QDeclarativeTextEdit::setCursorPosition(int pos)
{
Q_D(QDeclarativeTextEdit);
+ if (pos < 0 || pos > d->text.length())
+ return;
QTextCursor cursor = d->control->textCursor();
if (cursor.position() == pos)
return;
diff --git a/src/declarative/graphicsitems/qdeclarativetextinput.cpp b/src/declarative/graphicsitems/qdeclarativetextinput.cpp
index 0deacf8..521e4ab 100644
--- a/src/declarative/graphicsitems/qdeclarativetextinput.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetextinput.cpp
@@ -437,6 +437,8 @@ int QDeclarativeTextInput::cursorPosition() const
void QDeclarativeTextInput::setCursorPosition(int cp)
{
Q_D(QDeclarativeTextInput);
+ if (cp < 0 || cp > d->control->text().length())
+ return;
d->control->moveCursor(cp);
}
@@ -771,7 +773,7 @@ void QDeclarativeTextInput::setEchoMode(QDeclarativeTextInput::EchoMode echo)
imHints &= ~(Qt::ImhNoAutoUppercase | Qt::ImhNoPredictiveText);
setInputMethodHints(imHints);
d->control->setEchoMode((uint)echo);
- update();
+ q_textChanged();
emit echoModeChanged(echoMode());
}
@@ -1479,6 +1481,7 @@ void QDeclarativeTextInput::cursorPosChanged()
updateRect();//TODO: Only update rect between pos's
updateMicroFocus();
emit cursorPositionChanged();
+ d->control->resetCursorBlinkTimer();
if(!d->control->hasSelectedText()){
if(d->lastSelectionStart != d->control->cursor()){
diff --git a/src/declarative/graphicsitems/qdeclarativetextlayout.cpp b/src/declarative/graphicsitems/qdeclarativetextlayout.cpp
index e8da367..14a1109 100644
--- a/src/declarative/graphicsitems/qdeclarativetextlayout.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetextlayout.cpp
@@ -361,10 +361,18 @@ void QDeclarativeTextLayout::draw(QPainter *painter, const QPointF &p)
d->position = p;
}
+ QPen oldPen = priv->state->pen;
+ QColor currentColor = oldPen.color();
for (int ii = 0; ii < itemCount; ++ii) {
QStaticTextItem &item = d->items[ii];
+ if (item.color.isValid() && currentColor != item.color) {
+ painter->setPen(item.color);
+ currentColor = item.color;
+ }
priv->extended->drawStaticTextItem(&item);
}
+ if (currentColor != oldPen.color())
+ painter->setPen(oldPen);
}
QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp b/src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp
index 4fe6c4c..bf9263b 100644
--- a/src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp
+++ b/src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp
@@ -773,6 +773,8 @@ void QDeclarativeVisualDataModel::setModel(const QVariant &model)
QObject::connect(d->m_abstractItemModel, SIGNAL(modelReset()), this, SLOT(_q_modelReset()));
QObject::connect(d->m_abstractItemModel, SIGNAL(layoutChanged()), this, SLOT(_q_layoutChanged()));
d->m_metaDataCacheable = true;
+ if (d->m_abstractItemModel->canFetchMore(d->m_root))
+ d->m_abstractItemModel->fetchMore(d->m_root);
return;
}
if ((d->m_visualItemModel = qvariant_cast<QDeclarativeVisualDataModel *>(model))) {
@@ -870,6 +872,8 @@ void QDeclarativeVisualDataModel::setRootIndex(const QVariant &root)
if (d->m_root != modelIndex) {
int oldCount = d->modelCount();
d->m_root = modelIndex;
+ if (d->m_abstractItemModel && d->m_abstractItemModel->canFetchMore(modelIndex))
+ d->m_abstractItemModel->fetchMore(modelIndex);
int newCount = d->modelCount();
if (d->m_delegate && oldCount)
emit itemsRemoved(0, oldCount);
@@ -1094,6 +1098,8 @@ QDeclarativeItem *QDeclarativeVisualDataModel::item(int index, const QByteArray
d->m_delegateValidated = true;
}
}
+ if (d->modelCount()-1 == index && d->m_abstractItemModel && d->m_abstractItemModel->canFetchMore(d->m_root))
+ d->m_abstractItemModel->fetchMore(d->m_root);
return item;
}
@@ -1367,7 +1373,7 @@ void QDeclarativeVisualDataModel::_q_rowsMoved(const QModelIndex &sourceParent,
Q_D(QDeclarativeVisualDataModel);
const int count = sourceEnd - sourceStart + 1;
if (destinationParent == d->m_root && sourceParent == d->m_root) {
- _q_itemsMoved(sourceStart, destinationRow, count);
+ _q_itemsMoved(sourceStart, sourceStart > destinationRow ? destinationRow : destinationRow-1, count);
} else if (sourceParent == d->m_root) {
_q_itemsRemoved(sourceStart, count);
} else if (destinationParent == d->m_root) {
diff --git a/src/declarative/qml/qdeclarativebinding.cpp b/src/declarative/qml/qdeclarativebinding.cpp
index cb6ad8c..a7fbf44 100644
--- a/src/declarative/qml/qdeclarativebinding.cpp
+++ b/src/declarative/qml/qdeclarativebinding.cpp
@@ -55,6 +55,158 @@
QT_BEGIN_NAMESPACE
+QDeclarativeAbstractBinding::QDeclarativeAbstractBinding()
+: m_object(0), m_propertyIndex(-1), m_mePtr(0), m_prevBinding(0), m_nextBinding(0)
+{
+}
+
+QDeclarativeAbstractBinding::~QDeclarativeAbstractBinding()
+{
+ Q_ASSERT(m_prevBinding == 0);
+ Q_ASSERT(m_mePtr == 0);
+}
+
+/*!
+Destroy the binding. Use this instead of calling delete.
+
+Bindings are free to implement their own memory management, so the delete operator is not
+necessarily safe. The default implementation clears the binding, removes it from the object
+and calls delete.
+*/
+void QDeclarativeAbstractBinding::destroy()
+{
+ removeFromObject();
+ clear();
+
+ delete this;
+}
+
+/*!
+Add this binding to \a object.
+
+This transfers ownership of the binding to the object, marks the object's property as
+being bound.
+
+However, it does not enable the binding itself or call update() on it.
+*/
+void QDeclarativeAbstractBinding::addToObject(QObject *object, int index)
+{
+ Q_ASSERT(object);
+
+ if (m_object == object && m_propertyIndex == index)
+ return;
+
+ removeFromObject();
+
+ Q_ASSERT(!m_prevBinding);
+
+ m_object = object;
+ m_propertyIndex = index;
+
+ QDeclarativeData *data = QDeclarativeData::get(object, true);
+
+ if (index & 0xFF000000) {
+ // Value type
+
+ int coreIndex = index & 0xFFFFFF;
+
+ // Find the value type proxy (if there is one)
+ QDeclarativeValueTypeProxyBinding *proxy = 0;
+ if (data->hasBindingBit(coreIndex)) {
+ QDeclarativeAbstractBinding *b = data->bindings;
+ while (b && b->propertyIndex() != coreIndex)
+ b = b->m_nextBinding;
+ Q_ASSERT(b && b->bindingType() == QDeclarativeAbstractBinding::ValueTypeProxy);
+ proxy = static_cast<QDeclarativeValueTypeProxyBinding *>(b);
+ }
+
+ if (!proxy) {
+ proxy = new QDeclarativeValueTypeProxyBinding(object, coreIndex);
+ proxy->addToObject(object, coreIndex);
+ }
+
+ m_nextBinding = proxy->m_bindings;
+ if (m_nextBinding) m_nextBinding->m_prevBinding = &m_nextBinding;
+ m_prevBinding = &proxy->m_bindings;
+ proxy->m_bindings = this;
+
+ } else {
+ m_nextBinding = data->bindings;
+ if (m_nextBinding) m_nextBinding->m_prevBinding = &m_nextBinding;
+ m_prevBinding = &data->bindings;
+ data->bindings = this;
+
+ data->setBindingBit(m_object, index);
+ }
+}
+
+/*!
+Remove the binding from the object.
+*/
+void QDeclarativeAbstractBinding::removeFromObject()
+{
+ if (m_prevBinding) {
+ int index = propertyIndex();
+
+ *m_prevBinding = m_nextBinding;
+ if (m_nextBinding) m_nextBinding->m_prevBinding = m_prevBinding;
+ m_prevBinding = 0;
+ m_nextBinding = 0;
+
+ if (index & 0xFF000000) {
+ // Value type - we don't remove the proxy from the object. It will sit their happily
+ // doing nothing until it is removed by a write, a binding change or it is reused
+ // to hold more sub-bindings.
+ } else if (m_object) {
+ QDeclarativeData *data = QDeclarativeData::get(m_object, false);
+ if (data) data->clearBindingBit(index);
+ }
+
+ m_object = 0;
+ m_propertyIndex = -1;
+ }
+}
+
+static void bindingDummyDeleter(QDeclarativeAbstractBinding *)
+{
+}
+
+QDeclarativeAbstractBinding::Pointer QDeclarativeAbstractBinding::weakPointer()
+{
+ if (m_selfPointer.isNull())
+ m_selfPointer = QSharedPointer<QDeclarativeAbstractBinding>(this, bindingDummyDeleter);
+
+ return m_selfPointer.toWeakRef();
+}
+
+void QDeclarativeAbstractBinding::clear()
+{
+ if (m_mePtr) {
+ *m_mePtr = 0;
+ m_mePtr = 0;
+ }
+}
+
+QString QDeclarativeAbstractBinding::expression() const
+{
+ return QLatin1String("<Unknown>");
+}
+
+QObject *QDeclarativeAbstractBinding::object() const
+{
+ return m_object;
+}
+
+int QDeclarativeAbstractBinding::propertyIndex() const
+{
+ return m_propertyIndex;
+}
+
+void QDeclarativeAbstractBinding::setEnabled(bool enabled, QDeclarativePropertyPrivate::WriteFlags flags)
+{
+ if (enabled) update(flags);
+}
+
void QDeclarativeBindingPrivate::refresh()
{
Q_Q(QDeclarativeBinding);
@@ -255,20 +407,8 @@ void QDeclarativeBinding::setEnabled(bool e, QDeclarativePropertyPrivate::WriteF
d->enabled = e;
setNotifyOnValueChanged(e);
- QDeclarativeAbstractBinding::setEnabled(e, flags);
-
- if (e) {
- addToObject(d->property.object());
+ if (e)
update(flags);
- } else {
- removeFromObject();
- }
-}
-
-int QDeclarativeBinding::propertyIndex()
-{
- Q_D(QDeclarativeBinding);
- return QDeclarativePropertyPrivate::bindingIndex(d->property);
}
bool QDeclarativeBinding::enabled() const
@@ -283,127 +423,6 @@ QString QDeclarativeBinding::expression() const
return QDeclarativeExpression::expression();
}
-QDeclarativeAbstractBinding::QDeclarativeAbstractBinding()
-: m_object(0), m_mePtr(0), m_prevBinding(0), m_nextBinding(0)
-{
-}
-
-QDeclarativeAbstractBinding::~QDeclarativeAbstractBinding()
-{
- Q_ASSERT(m_prevBinding == 0);
- Q_ASSERT(m_mePtr == 0);
-}
-
-void QDeclarativeAbstractBinding::destroy()
-{
- removeFromObject();
- clear();
-
- delete this;
-}
-
-void QDeclarativeAbstractBinding::addToObject(QObject *object)
-{
- Q_ASSERT(object);
-
- if (m_object == object)
- return;
-
- int index = propertyIndex();
-
- removeFromObject();
-
- Q_ASSERT(!m_prevBinding);
-
- m_object = object;
- QDeclarativeData *data = QDeclarativeData::get(object, true);
-
- if (index & 0xFF000000) {
- // Value type
-
- int coreIndex = index & 0xFFFFFF;
-
- // Find the value type proxy (if there is one)
- QDeclarativeValueTypeProxyBinding *proxy = 0;
- if (data->hasBindingBit(coreIndex)) {
- QDeclarativeAbstractBinding *b = data->bindings;
- while (b && b->propertyIndex() != coreIndex)
- b = b->m_nextBinding;
- Q_ASSERT(b && b->bindingType() == QDeclarativeAbstractBinding::ValueTypeProxy);
- proxy = static_cast<QDeclarativeValueTypeProxyBinding *>(b);
- }
-
- if (!proxy)
- proxy = new QDeclarativeValueTypeProxyBinding(object, coreIndex);
- proxy->addToObject(object);
-
- m_nextBinding = proxy->m_bindings;
- if (m_nextBinding) m_nextBinding->m_prevBinding = &m_nextBinding;
- m_prevBinding = &proxy->m_bindings;
- proxy->m_bindings = this;
-
- } else {
- m_nextBinding = data->bindings;
- if (m_nextBinding) m_nextBinding->m_prevBinding = &m_nextBinding;
- m_prevBinding = &data->bindings;
- data->bindings = this;
-
- data->setBindingBit(m_object, index);
- }
-}
-
-void QDeclarativeAbstractBinding::removeFromObject()
-{
- if (m_prevBinding) {
- int index = propertyIndex();
-
- *m_prevBinding = m_nextBinding;
- if (m_nextBinding) m_nextBinding->m_prevBinding = m_prevBinding;
- m_prevBinding = 0;
- m_nextBinding = 0;
-
- if (index & 0xFF000000) {
- // Value type - we don't remove the proxy from the object. It will sit their happily
- // doing nothing for ever more.
- } else if (m_object) {
- QDeclarativeData *data = QDeclarativeData::get(m_object, false);
- if (data) data->clearBindingBit(index);
- }
-
- m_object = 0;
- }
-}
-
-static void bindingDummyDeleter(QDeclarativeAbstractBinding *)
-{
-}
-
-QDeclarativeAbstractBinding::Pointer QDeclarativeAbstractBinding::weakPointer()
-{
- if (m_selfPointer.isNull())
- m_selfPointer = QSharedPointer<QDeclarativeAbstractBinding>(this, bindingDummyDeleter);
-
- return m_selfPointer.toWeakRef();
-}
-
-void QDeclarativeAbstractBinding::clear()
-{
- if (m_mePtr) {
- *m_mePtr = 0;
- m_mePtr = 0;
- }
-}
-
-QString QDeclarativeAbstractBinding::expression() const
-{
- return QLatin1String("<Unknown>");
-}
-
-void QDeclarativeAbstractBinding::setEnabled(bool e, QDeclarativePropertyPrivate::WriteFlags)
-{
- if (e) m_mePtr = 0;
-}
-
QDeclarativeValueTypeProxyBinding::QDeclarativeValueTypeProxyBinding(QObject *o, int index)
: m_object(o), m_index(index), m_bindings(0)
{
@@ -421,16 +440,10 @@ QDeclarativeValueTypeProxyBinding::~QDeclarativeValueTypeProxyBinding()
void QDeclarativeValueTypeProxyBinding::setEnabled(bool e, QDeclarativePropertyPrivate::WriteFlags flags)
{
if (e) {
- addToObject(m_object);
-
QDeclarativeAbstractBinding *bindings = m_bindings;
- m_bindings = 0;
recursiveEnable(bindings, flags);
} else {
- removeFromObject();
-
QDeclarativeAbstractBinding *bindings = m_bindings;
- m_bindings = 0;
recursiveDisable(bindings);
}
}
@@ -440,13 +453,7 @@ void QDeclarativeValueTypeProxyBinding::recursiveEnable(QDeclarativeAbstractBind
if (!b)
return;
- QDeclarativeAbstractBinding *next = b->m_nextBinding;
- b->m_prevBinding = 0;
- b->m_nextBinding = 0;
- Q_ASSERT(b->m_mePtr == 0);
- b->m_mePtr = &b;
-
- recursiveEnable(next, flags);
+ recursiveEnable(b->m_nextBinding, flags);
if (b)
b->setEnabled(true, flags);
@@ -459,19 +466,8 @@ void QDeclarativeValueTypeProxyBinding::recursiveDisable(QDeclarativeAbstractBin
recursiveDisable(b->m_nextBinding);
- b->setEnabled(false, 0);
-
- Q_ASSERT(b->m_prevBinding == 0);
- Q_ASSERT(b->m_nextBinding == 0);
- b->m_nextBinding = m_bindings;
- if (b->m_nextBinding) b->m_nextBinding->m_prevBinding = &b->m_nextBinding;
- b->m_prevBinding = &m_bindings;
- m_bindings = b;
-}
-
-int QDeclarativeValueTypeProxyBinding::propertyIndex()
-{
- return m_index;
+ if (b)
+ b->setEnabled(false, 0);
}
void QDeclarativeValueTypeProxyBinding::update(QDeclarativePropertyPrivate::WriteFlags)
@@ -488,4 +484,25 @@ QDeclarativeAbstractBinding *QDeclarativeValueTypeProxyBinding::binding(int prop
return binding;
}
+/*!
+Removes a collection of bindings, corresponding to the set bits in \a mask.
+*/
+void QDeclarativeValueTypeProxyBinding::removeBindings(quint32 mask)
+{
+ QDeclarativeAbstractBinding *binding = m_bindings;
+ while (binding) {
+ if (mask & (1 << (binding->propertyIndex() >> 24))) {
+ QDeclarativeAbstractBinding *remove = binding;
+ binding = remove->m_nextBinding;
+ *remove->m_prevBinding = remove->m_nextBinding;
+ if (remove->m_nextBinding) remove->m_nextBinding->m_prevBinding = remove->m_prevBinding;
+ remove->m_prevBinding = 0;
+ remove->m_nextBinding = 0;
+ remove->destroy();
+ } else {
+ binding = binding->m_nextBinding;
+ }
+ }
+}
+
QT_END_NAMESPACE
diff --git a/src/declarative/qml/qdeclarativebinding_p.h b/src/declarative/qml/qdeclarativebinding_p.h
index 0b9bde6..7823a3d 100644
--- a/src/declarative/qml/qdeclarativebinding_p.h
+++ b/src/declarative/qml/qdeclarativebinding_p.h
@@ -78,14 +78,16 @@ public:
enum Type { PropertyBinding, ValueTypeProxy };
virtual Type bindingType() const { return PropertyBinding; }
+ QObject *object() const;
+ int propertyIndex() const;
+
void setEnabled(bool e) { setEnabled(e, QDeclarativePropertyPrivate::DontRemoveBinding); }
virtual void setEnabled(bool, QDeclarativePropertyPrivate::WriteFlags) = 0;
- virtual int propertyIndex() = 0;
void update() { update(QDeclarativePropertyPrivate::DontRemoveBinding); }
virtual void update(QDeclarativePropertyPrivate::WriteFlags) = 0;
- void addToObject(QObject *);
+ void addToObject(QObject *, int);
void removeFromObject();
static Pointer getPointer(QDeclarativeAbstractBinding *p) { return p ? p->weakPointer() : Pointer(); }
@@ -98,12 +100,14 @@ private:
Pointer weakPointer();
friend class QDeclarativeData;
+ friend class QDeclarativeComponentPrivate;
friend class QDeclarativeValueTypeProxyBinding;
friend class QDeclarativePropertyPrivate;
friend class QDeclarativeVME;
friend class QtSharedPointer::ExternalRefCount<QDeclarativeAbstractBinding>;
QObject *m_object;
+ int m_propertyIndex;
QDeclarativeAbstractBinding **m_mePtr;
QDeclarativeAbstractBinding **m_prevBinding;
QDeclarativeAbstractBinding *m_nextBinding;
@@ -118,11 +122,12 @@ public:
virtual Type bindingType() const { return ValueTypeProxy; }
virtual void setEnabled(bool, QDeclarativePropertyPrivate::WriteFlags);
- virtual int propertyIndex();
virtual void update(QDeclarativePropertyPrivate::WriteFlags);
QDeclarativeAbstractBinding *binding(int propertyIndex);
+ void removeBindings(quint32 mask);
+
protected:
~QDeclarativeValueTypeProxyBinding();
@@ -154,7 +159,6 @@ public:
// Inherited from QDeclarativeAbstractBinding
virtual void setEnabled(bool, QDeclarativePropertyPrivate::WriteFlags flags);
- virtual int propertyIndex();
virtual void update(QDeclarativePropertyPrivate::WriteFlags flags);
virtual QString expression() const;
diff --git a/src/declarative/qml/qdeclarativecompiledbindings.cpp b/src/declarative/qml/qdeclarativecompiledbindings.cpp
index fbe5829..5c295b9 100644
--- a/src/declarative/qml/qdeclarativecompiledbindings.cpp
+++ b/src/declarative/qml/qdeclarativecompiledbindings.cpp
@@ -187,7 +187,6 @@ public:
// Inherited from QDeclarativeAbstractBinding
virtual void setEnabled(bool, QDeclarativePropertyPrivate::WriteFlags flags);
- virtual int propertyIndex();
virtual void update(QDeclarativePropertyPrivate::WriteFlags flags);
virtual void destroy();
@@ -294,14 +293,6 @@ QDeclarativeAbstractBinding *QDeclarativeCompiledBindings::configBinding(int ind
void QDeclarativeCompiledBindingsPrivate::Binding::setEnabled(bool e, QDeclarativePropertyPrivate::WriteFlags flags)
{
- if (e) {
- addToObject(target);
- } else {
- removeFromObject();
- }
-
- QDeclarativeAbstractBinding::setEnabled(e, flags);
-
if (enabled != e) {
enabled = e;
@@ -309,11 +300,6 @@ void QDeclarativeCompiledBindingsPrivate::Binding::setEnabled(bool e, QDeclarati
}
}
-int QDeclarativeCompiledBindingsPrivate::Binding::propertyIndex()
-{
- return property & 0xFFFF;
-}
-
void QDeclarativeCompiledBindingsPrivate::Binding::update(QDeclarativePropertyPrivate::WriteFlags flags)
{
parent->run(this, flags);
diff --git a/src/declarative/qml/qdeclarativecompiler.cpp b/src/declarative/qml/qdeclarativecompiler.cpp
index 645402e..df428b1 100644
--- a/src/declarative/qml/qdeclarativecompiler.cpp
+++ b/src/declarative/qml/qdeclarativecompiler.cpp
@@ -946,6 +946,16 @@ void QDeclarativeCompiler::genObject(QDeclarativeParser::Object *obj)
QDeclarativePropertyCache::Data::IsVMEFunction,
QDeclarativePropertyCache::Data::IsVMESignal);
+ // Add flag for alias properties
+ if (!obj->synthdata.isEmpty()) {
+ const QDeclarativeVMEMetaData *vmeMetaData =
+ reinterpret_cast<const QDeclarativeVMEMetaData *>(obj->synthdata.constData());
+ for (int ii = 0; ii < vmeMetaData->aliasCount; ++ii) {
+ int index = obj->metaObject()->propertyOffset() + vmeMetaData->propertyCount + ii;
+ propertyCache->property(index)->flags |= QDeclarativePropertyCache::Data::IsAlias;
+ }
+ }
+
if (obj == unitRoot) {
propertyCache->addref();
output->rootPropertyCache = propertyCache;
@@ -1003,7 +1013,8 @@ void QDeclarativeCompiler::genObjectBody(QDeclarativeParser::Object *obj)
seenDefer = true;
continue;
}
- genValueProperty(prop, obj);
+ if (!prop->isAlias)
+ genValueProperty(prop, obj);
}
if (seenDefer) {
QDeclarativeInstruction defer;
@@ -1113,25 +1124,56 @@ void QDeclarativeCompiler::genObjectBody(QDeclarativeParser::Object *obj)
}
foreach(Property *prop, obj->valueTypeProperties) {
- QDeclarativeInstruction fetch;
- fetch.type = QDeclarativeInstruction::FetchValueType;
- fetch.fetchValue.property = prop->index;
- fetch.fetchValue.type = prop->type;
- fetch.line = prop->location.start.line;
+ if (!prop->isAlias)
+ genValueTypeProperty(obj, prop);
+ }
- output->bytecode << fetch;
+ foreach(Property *prop, obj->valueProperties) {
+ if (prop->isDeferred)
+ continue;
+ if (prop->isAlias)
+ genValueProperty(prop, obj);
+ }
+
+ foreach(Property *prop, obj->valueTypeProperties) {
+ if (prop->isAlias)
+ genValueTypeProperty(obj, prop);
+ }
+}
+void QDeclarativeCompiler::genValueTypeProperty(QDeclarativeParser::Object *obj,QDeclarativeParser::Property *prop)
+{
+ QDeclarativeInstruction fetch;
+ fetch.type = QDeclarativeInstruction::FetchValueType;
+ fetch.fetchValue.property = prop->index;
+ fetch.fetchValue.type = prop->type;
+ fetch.fetchValue.bindingSkipList = 0;
+ fetch.line = prop->location.start.line;
+
+ if (obj->type == -1 || output->types.at(obj->type).component) {
+ // We only have to do this if this is a composite type. If it is a builtin
+ // type it can't possibly already have bindings that need to be cleared.
foreach(Property *vprop, prop->value->valueProperties) {
- genPropertyAssignment(vprop, prop->value, prop);
+ if (!vprop->values.isEmpty()) {
+ Q_ASSERT(vprop->index >= 0 && vprop->index < 32);
+ fetch.fetchValue.bindingSkipList |= (1 << vprop->index);
+ }
}
+ }
- QDeclarativeInstruction pop;
- pop.type = QDeclarativeInstruction::PopValueType;
- pop.fetchValue.property = prop->index;
- pop.fetchValue.type = prop->type;
- pop.line = prop->location.start.line;
- output->bytecode << pop;
+ output->bytecode << fetch;
+
+ foreach(Property *vprop, prop->value->valueProperties) {
+ genPropertyAssignment(vprop, prop->value, prop);
}
+
+ QDeclarativeInstruction pop;
+ pop.type = QDeclarativeInstruction::PopValueType;
+ pop.fetchValue.property = prop->index;
+ pop.fetchValue.type = prop->type;
+ pop.fetchValue.bindingSkipList = 0;
+ pop.line = prop->location.start.line;
+ output->bytecode << pop;
}
void QDeclarativeCompiler::genComponent(QDeclarativeParser::Object *obj)
@@ -1440,10 +1482,22 @@ bool QDeclarativeCompiler::buildProperty(QDeclarativeParser::Property *prop,
if (p.name()) {
prop->type = p.userType();
}
- }
- if (prop->index != -1)
- prop->parent->setBindingBit(prop->index);
+ // Check if this is an alias
+ if (prop->index != -1 &&
+ prop->parent &&
+ prop->parent->type != -1 &&
+ output->types.at(prop->parent->type).component) {
+
+ QDeclarativePropertyCache *cache = output->types.at(prop->parent->type).component->rootPropertyCache;
+ if (cache && cache->property(prop->index) &&
+ cache->property(prop->index)->flags & QDeclarativePropertyCache::Data::IsAlias)
+ prop->isAlias = true;
+ }
+
+ if (prop->index != -1 && !prop->values.isEmpty())
+ prop->parent->setBindingBit(prop->index);
+ }
if (!prop->isDefault && prop->name == "id" && !ctxt.isSubContext()) {
@@ -1778,6 +1832,12 @@ bool QDeclarativeCompiler::buildGroupedProperty(QDeclarativeParser::Property *pr
COMPILE_EXCEPTION(prop, tr( "Invalid property assignment: \"%1\" is a read-only property").arg(QString::fromUtf8(prop->name)));
}
+
+ if (prop->isAlias) {
+ foreach (Property *vtProp, prop->value->properties)
+ vtProp->isAlias = true;
+ }
+
COMPILE_CHECK(buildValueTypeProperty(enginePrivate->valueTypes[prop->type],
prop->value, obj, ctxt.incr()));
obj->addValueTypeProperty(prop);
@@ -2423,7 +2483,7 @@ bool QDeclarativeCompiler::buildDynamicMeta(QDeclarativeParser::Object *obj, Dyn
if (p.type == Object::DynamicProperty::Alias) {
if (mode == ResolveAliases) {
((QDeclarativeVMEMetaData *)dynamicData.data())->aliasCount++;
- compileAlias(builder, dynamicData, obj, p);
+ COMPILE_CHECK(compileAlias(builder, dynamicData, obj, p));
} else {
// Need a fake signal so that the metaobject remains consistent across
// the resolve and non-resolve alias runs
@@ -2694,7 +2754,10 @@ void QDeclarativeCompiler::genBindingAssignment(QDeclarativeParser::Value *bindi
}
QDeclarativeInstruction store;
- store.type = QDeclarativeInstruction::StoreBinding;
+ if (!prop->isAlias)
+ store.type = QDeclarativeInstruction::StoreBinding;
+ else
+ store.type = QDeclarativeInstruction::StoreBindingOnAlias;
store.assignBinding.value = output->indexForByteArray(ref.compiledData);
store.assignBinding.context = ref.bindingContext.stack;
store.assignBinding.owner = ref.bindingContext.owner;
@@ -2769,13 +2832,17 @@ bool QDeclarativeCompiler::completeComponentBuild()
expr.expression = binding.expression;
expr.imports = unit->imports();
- int index = bindingCompiler.compile(expr, enginePrivate);
- if (index != -1) {
- binding.dataType = BindingReference::Experimental;
- binding.compiledIndex = index;
- componentStat.optimizedBindings.append(iter.key()->location);
- continue;
- }
+ // ### We don't currently optimize for bindings on alias's - because
+ // of the solution to QTBUG-13719
+ if (!binding.property->isAlias) {
+ int index = bindingCompiler.compile(expr, enginePrivate);
+ if (index != -1) {
+ binding.dataType = BindingReference::Experimental;
+ binding.compiledIndex = index;
+ componentStat.optimizedBindings.append(iter.key()->location);
+ continue;
+ }
+ }
binding.dataType = BindingReference::QtScript;
diff --git a/src/declarative/qml/qdeclarativecompiler_p.h b/src/declarative/qml/qdeclarativecompiler_p.h
index 5cd1fd2..7d76ad9 100644
--- a/src/declarative/qml/qdeclarativecompiler_p.h
+++ b/src/declarative/qml/qdeclarativecompiler_p.h
@@ -252,6 +252,7 @@ private:
void genObject(QDeclarativeParser::Object *obj);
void genObjectBody(QDeclarativeParser::Object *obj);
+ void genValueTypeProperty(QDeclarativeParser::Object *obj,QDeclarativeParser::Property *);
void genComponent(QDeclarativeParser::Object *obj);
void genValueProperty(QDeclarativeParser::Property *prop, QDeclarativeParser::Object *obj);
void genListProperty(QDeclarativeParser::Property *prop, QDeclarativeParser::Object *obj);
diff --git a/src/declarative/qml/qdeclarativecomponent.cpp b/src/declarative/qml/qdeclarativecomponent.cpp
index 2686ce3..ecb3bc5 100644
--- a/src/declarative/qml/qdeclarativecomponent.cpp
+++ b/src/declarative/qml/qdeclarativecomponent.cpp
@@ -147,32 +147,36 @@ class QByteArray;
Components are reusable, encapsulated QML elements with well-defined interfaces.
Components are often defined by \l {qdeclarativedocuments.html}{component files} -
- that is, \c .qml files. The \e Component element allows components to be defined
- within QML items rather than in a separate file. This may be useful for reusing
- a small component within a QML file, or for defining a component that logically
- belongs with other QML components within a file.
+ that is, \c .qml files. The \e Component element essentially allows QML components
+ to be defined inline, within a \l {QML Document}{QML document}, rather than as a separate QML file.
+ This may be useful for reusing a small component within a QML file, or for defining
+ a component that logically belongs with other QML components within a file.
For example, here is a component that is used by multiple \l Loader objects.
- It contains a top level \l Rectangle item:
+ It contains a single item, a \l Rectangle:
\snippet doc/src/snippets/declarative/component.qml 0
Notice that while a \l Rectangle by itself would be automatically
rendered and displayed, this is not the case for the above rectangle
because it is defined inside a \c Component. The component encapsulates the
- QML elements within, as if they were defined in a separate \c .qml
+ QML elements within, as if they were defined in a separate QML
file, and is not loaded until requested (in this case, by the
two \l Loader objects).
- A Component cannot contain anything other
- than an \c id and a single top level item. While the \c id is optional,
- the top level item is not; you cannot define an empty component.
+ Defining a \c Component is similar to defining a \l {QML Document}{QML document}.
+ A QML document has a single top-level item that defines the behaviors and
+ properties of that component, and cannot define properties or behaviors outside
+ of that top-level item. In the same way, a \c Component definition contains a single
+ top level item (which in the above example is a \l Rectangle) and cannot define any
+ data outside of this item, with the exception of an \e id (which in the above example
+ is \e redSquare).
- The Component element is commonly used to provide graphical components
- for views. For example, the ListView::delegate property requires a Component
+ The \c Component element is commonly used to provide graphical components
+ for views. For example, the ListView::delegate property requires a \c Component
to specify how each list item is to be displayed.
- Component objects can also be dynamically created using
+ \c Component objects can also be created dynamically using
\l{QML:Qt::createComponent()}{Qt.createComponent()}.
*/
@@ -695,17 +699,6 @@ QObject *QDeclarativeComponent::create(QDeclarativeContext *context)
return rv;
}
-QObject *QDeclarativeComponentPrivate::create(QDeclarativeContextData *context,
- const QBitField &bindings)
-{
- if (!context)
- context = QDeclarativeContextData::get(engine->rootContext());
-
- QObject *rv = beginCreate(context, bindings);
- completeCreate();
- return rv;
-}
-
/*!
This method provides more advanced control over component instance creation.
In general, programmers should use QDeclarativeComponent::create() to create a
@@ -876,9 +869,12 @@ void QDeclarativeComponentPrivate::complete(QDeclarativeEnginePrivate *enginePri
QDeclarativeEnginePrivate::SimpleList<QDeclarativeAbstractBinding> bv =
state->bindValues.at(ii);
for (int jj = 0; jj < bv.count; ++jj) {
- if(bv.at(jj))
+ if(bv.at(jj)) {
+ // XXX akennedy
+ bv.at(jj)->m_mePtr = 0;
bv.at(jj)->setEnabled(true, QDeclarativePropertyPrivate::BypassInterceptor |
QDeclarativePropertyPrivate::DontRemoveBinding);
+ }
}
QDeclarativeEnginePrivate::clear(bv);
}
diff --git a/src/declarative/qml/qdeclarativecomponent_p.h b/src/declarative/qml/qdeclarativecomponent_p.h
index 7b30bad..daf1dcb 100644
--- a/src/declarative/qml/qdeclarativecomponent_p.h
+++ b/src/declarative/qml/qdeclarativecomponent_p.h
@@ -81,7 +81,6 @@ class Q_AUTOTEST_EXPORT QDeclarativeComponentPrivate : public QObjectPrivate, pu
public:
QDeclarativeComponentPrivate() : typeData(0), progress(0.), start(-1), count(-1), cc(0), engine(0), creationContext(0) {}
- QObject *create(QDeclarativeContextData *, const QBitField &);
QObject *beginCreate(QDeclarativeContextData *, const QBitField &);
void completeCreate();
diff --git a/src/declarative/qml/qdeclarativedata_p.h b/src/declarative/qml/qdeclarativedata_p.h
index def4188..4767169 100644
--- a/src/declarative/qml/qdeclarativedata_p.h
+++ b/src/declarative/qml/qdeclarativedata_p.h
@@ -65,6 +65,7 @@ class QDeclarativeContext;
class QDeclarativePropertyCache;
class QDeclarativeContextData;
class QDeclarativeNotifier;
+class QDeclarativeDataExtended;
// This class is structured in such a way, that simply zero'ing it is the
// default state for elemental object allocations. This is crucial in the
// workings of the QDeclarativeInstruction::CreateSimpleObject instruction.
@@ -150,17 +151,13 @@ public:
}
}
+ bool hasExtendedData() const { return extendedData != 0; }
QDeclarativeNotifier *objectNameNotifier() const;
QHash<int, QObject *> *attachedProperties() const;
- struct ExtendedData {
- ExtendedData();
- ~ExtendedData();
-
- QHash<int, QObject *> attachedProperties;
- void *objectNameNotifier;
- };
- mutable ExtendedData *extendedData;
+private:
+ // For objectNameNotifier and attachedProperties
+ mutable QDeclarativeDataExtended *extendedData;
};
template<class T>
diff --git a/src/declarative/qml/qdeclarativeengine.cpp b/src/declarative/qml/qdeclarativeengine.cpp
index cd11336..adcaf3c 100644
--- a/src/declarative/qml/qdeclarativeengine.cpp
+++ b/src/declarative/qml/qdeclarativeengine.cpp
@@ -261,6 +261,33 @@ of their use.
\endlist
*/
+/*!
+\qmlmethod object Qt::include(string url, jsobject callback)
+
+Includes another JavaScript file. This method can only be used from within JavaScript files,
+and not regular QML files.
+
+This imports all functions from \a url into the current script's namespace.
+
+Qt.include() returns an object that describes the status of the operation. The object has
+a single property, \c {status}, that is set to one of the following values:
+
+\table
+\header \o Symbol \o Value \o Description
+\row \o result.OK \o 0 \o The include completed successfully.
+\row \o result.LOADING \o 1 \o Data is being loaded from the network.
+\row \o result.NETWORK_ERROR \o 2 \o A network error occurred while fetching the url.
+\row \o result.EXCEPTION \o 3 \o A JavaScript exception occurred while executing the included code.
+An additional \c exception property will be set in this case.
+\endtable
+
+The \c status property will be updated as the operation progresses.
+
+If provided, \a callback is invoked when the operation completes. The callback is passed
+the same object as is returned from the Qt.include() call.
+*/
+// Qt.include() is implemented in qdeclarativeinclude.cpp
+
QDeclarativeEnginePrivate::QDeclarativeEnginePrivate(QDeclarativeEngine *e)
: captureProperties(false), rootContext(0), isDebugging(false),
@@ -678,6 +705,9 @@ QNetworkAccessManager *QDeclarativeEngine::networkAccessManager() const
requests. See the QDeclarativeImageProvider documentation for details on
implementing and using image providers.
+ All required image providers should be added to the engine before any
+ QML sources files are loaded.
+
Note that images loaded from a QDeclarativeImageProvider are cached
by QPixmapCache, similar to any image loaded by QML.
@@ -730,8 +760,10 @@ QImage QDeclarativeEnginePrivate::getImageFromProvider(const QUrl &url, QSize *s
QImage image;
QSharedPointer<QDeclarativeImageProvider> provider = imageProviders.value(url.host());
locker.unlock();
- if (provider)
- image = provider->requestImage(url.path().mid(1), size, req_size);
+ if (provider) {
+ QString imageId = url.toString(QUrl::RemoveScheme | QUrl::RemoveAuthority).mid(1);
+ image = provider->requestImage(imageId, size, req_size);
+ }
return image;
}
@@ -741,8 +773,10 @@ QPixmap QDeclarativeEnginePrivate::getPixmapFromProvider(const QUrl &url, QSize
QPixmap pixmap;
QSharedPointer<QDeclarativeImageProvider> provider = imageProviders.value(url.host());
locker.unlock();
- if (provider)
- pixmap = provider->requestPixmap(url.path().mid(1), size, req_size);
+ if (provider) {
+ QString imageId = url.toString(QUrl::RemoveScheme | QUrl::RemoveAuthority).mid(1);
+ pixmap = provider->requestPixmap(imageId, size, req_size);
+ }
return pixmap;
}
@@ -897,9 +931,7 @@ void QDeclarativeEngine::setObjectOwnership(QObject *object, ObjectOwnership own
if (!object)
return;
- // No need to do anything if CppOwnership and there is no QDeclarativeData as
- // the current ownership must be CppOwnership
- QDeclarativeData *ddata = QDeclarativeData::get(object, ownership == JavaScriptOwnership);
+ QDeclarativeData *ddata = QDeclarativeData::get(object, true);
if (!ddata)
return;
@@ -957,7 +989,7 @@ QObject *qmlAttachedPropertiesObjectById(int id, const QObject *object, bool cre
if (!data)
return 0; // Attached properties are only on objects created by QML
- QObject *rv = data->extendedData?data->attachedProperties()->value(id):0;
+ QObject *rv = data->hasExtendedData()?data->attachedProperties()->value(id):0;
if (rv || !create)
return rv;
@@ -985,6 +1017,35 @@ QObject *qmlAttachedPropertiesObject(int *idCache, const QObject *object,
return qmlAttachedPropertiesObjectById(*idCache, object, create);
}
+class QDeclarativeDataExtended {
+public:
+ QDeclarativeDataExtended();
+ ~QDeclarativeDataExtended();
+
+ QHash<int, QObject *> attachedProperties;
+ QDeclarativeNotifier objectNameNotifier;
+};
+
+QDeclarativeDataExtended::QDeclarativeDataExtended()
+{
+}
+
+QDeclarativeDataExtended::~QDeclarativeDataExtended()
+{
+}
+
+QDeclarativeNotifier *QDeclarativeData::objectNameNotifier() const
+{
+ if (!extendedData) extendedData = new QDeclarativeDataExtended;
+ return &extendedData->objectNameNotifier;
+}
+
+QHash<int, QObject *> *QDeclarativeData::attachedProperties() const
+{
+ if (!extendedData) extendedData = new QDeclarativeDataExtended;
+ return &extendedData->attachedProperties;
+}
+
void QDeclarativeData::destroyed(QObject *object)
{
if (deferredComponent)
@@ -1075,28 +1136,6 @@ void QDeclarativeData::setBindingBit(QObject *obj, int bit)
bindingBits[bit / 32] |= (1 << (bit % 32));
}
-QDeclarativeData::ExtendedData::ExtendedData()
-: objectNameNotifier(0)
-{
-}
-
-QDeclarativeData::ExtendedData::~ExtendedData()
-{
- ((QDeclarativeNotifier *)&objectNameNotifier)->~QDeclarativeNotifier();
-}
-
-QDeclarativeNotifier *QDeclarativeData::objectNameNotifier() const
-{
- if (!extendedData) extendedData = new ExtendedData;
- return (QDeclarativeNotifier *)&extendedData->objectNameNotifier;
-}
-
-QHash<int, QObject *> *QDeclarativeData::attachedProperties() const
-{
- if (!extendedData) extendedData = new ExtendedData;
- return &extendedData->attachedProperties;
-}
-
/*!
Creates a QScriptValue allowing you to use \a object in QML script.
\a engine is the QDeclarativeEngine it is to be created in.
@@ -2225,8 +2264,9 @@ bool QDeclarative_isFileCaseCorrect(const QString &fileName)
if (a != c)
return false;
}
+#else
+ Q_UNUSED(fileName)
#endif
-
return true;
}
diff --git a/src/declarative/qml/qdeclarativeenginedebug.cpp b/src/declarative/qml/qdeclarativeenginedebug.cpp
index bffe681..e54f7d6 100644
--- a/src/declarative/qml/qdeclarativeenginedebug.cpp
+++ b/src/declarative/qml/qdeclarativeenginedebug.cpp
@@ -146,7 +146,10 @@ QDeclarativeEngineDebugServer::propertyData(QObject *obj, int propIdx)
if (binding)
rv.binding = binding->expression();
- QVariant value = prop.read(obj);
+ QVariant value;
+ if (prop.userType() != 0) {
+ value = prop.read(obj);
+ }
rv.value = valueContents(value);
if (QDeclarativeValueTypeFactory::isValueType(prop.userType())) {
diff --git a/src/declarative/qml/qdeclarativeglobal_p.h b/src/declarative/qml/qdeclarativeglobal_p.h
index 31fbb1e..b8428b8 100644
--- a/src/declarative/qml/qdeclarativeglobal_p.h
+++ b/src/declarative/qml/qdeclarativeglobal_p.h
@@ -65,7 +65,7 @@ QT_MODULE(Declarative)
}
#ifdef Q_OS_SYMBIAN
-#define Q_DECLARATIVE_PRIVATE_EXPORT
+#define Q_DECLARATIVE_PRIVATE_EXPORT Q_AUTOTEST_EXPORT
#else
#define Q_DECLARATIVE_PRIVATE_EXPORT Q_DECLARATIVE_EXPORT
#endif
diff --git a/src/declarative/qml/qdeclarativeimageprovider.cpp b/src/declarative/qml/qdeclarativeimageprovider.cpp
index ef31be7..e3da645 100644
--- a/src/declarative/qml/qdeclarativeimageprovider.cpp
+++ b/src/declarative/qml/qdeclarativeimageprovider.cpp
@@ -182,13 +182,17 @@ QDeclarativeImageProvider::ImageType QDeclarativeImageProvider::imageType() cons
Implement this method to return the image with \a id. The default
implementation returns an empty image.
+ The \a id is the requested image source, with the "image:" scheme and
+ provider identifier removed. For example, if the image \l{Image::}{source}
+ was "image://myprovider/icons/home", the given \a id would be "icons/home".
+
The \a requestedSize corresponds to the \l {Image::sourceSize} requested by
an Image element. If \a requestedSize is a valid size, the image
returned should be of that size.
In all cases, \a size must be set to the original size of the image. This
- is used to set the \l {Item::}{width} and \l {Item::}{height} of image
- elements that should be automatically sized to the loaded image.
+ is used to set the \l {Item::}{width} and \l {Item::}{height} of the
+ relevant \l Image if these values have not been set explicitly.
\note this method may be called by multiple threads, so ensure the
implementation of this method is reentrant.
@@ -207,13 +211,17 @@ QImage QDeclarativeImageProvider::requestImage(const QString &id, QSize *size, c
Implement this method to return the pixmap with \a id. The default
implementation returns an empty pixmap.
+ The \a id is the requested image source, with the "image:" scheme and
+ provider identifier removed. For example, if the image \l{Image::}{source}
+ was "image://myprovider/icons/home", the given \a id would be "icons/home".
+
The \a requestedSize corresponds to the \l {Image::sourceSize} requested by
an Image element. If \a requestedSize is a valid size, the image
returned should be of that size.
In all cases, \a size must be set to the original size of the image. This
- is used to set the \l {Item::}{width} and \l {Item::}{height} of image
- elements that should be automatically sized to the loaded image.
+ is used to set the \l {Item::}{width} and \l {Item::}{height} of the
+ relevant \l Image if these values have not been set explicitly.
*/
QPixmap QDeclarativeImageProvider::requestPixmap(const QString &id, QSize *size, const QSize& requestedSize)
{
diff --git a/src/declarative/qml/qdeclarativeimport.cpp b/src/declarative/qml/qdeclarativeimport.cpp
index 6f5216a..94765f2 100644
--- a/src/declarative/qml/qdeclarativeimport.cpp
+++ b/src/declarative/qml/qdeclarativeimport.cpp
@@ -51,6 +51,10 @@
#include <private/qdeclarativetypenamecache_p.h>
#include <private/qdeclarativeengine_p.h>
+#ifdef Q_OS_SYMBIAN
+#include "private/qcore_symbian_p.h"
+#endif
+
QT_BEGIN_NAMESPACE
DEFINE_BOOL_CONFIG_OPTION(qmlImportTrace, QML_IMPORT_TRACE)
@@ -378,7 +382,13 @@ bool QDeclarativeImportsPrivate::importExtension(const QString &absoluteFilePath
foreach (const QDeclarativeDirParser::Plugin &plugin, qmldirParser.plugins()) {
QString resolvedFilePath = database->resolvePlugin(dir, plugin.path, plugin.name);
-
+#if defined(QT_LIBINFIX) && defined(Q_OS_SYMBIAN)
+ if (resolvedFilePath.isEmpty()) {
+ // In case of libinfixed build, attempt to load libinfixed version, too.
+ QString infixedPluginName = plugin.name + QLatin1String(QT_LIBINFIX);
+ resolvedFilePath = database->resolvePlugin(dir, plugin.path, infixedPluginName);
+ }
+#endif
if (!resolvedFilePath.isEmpty()) {
if (!database->importPlugin(resolvedFilePath, uri, errorString)) {
if (errorString)
@@ -658,8 +668,32 @@ QDeclarativeImportDatabase::QDeclarativeImportDatabase(QDeclarativeEngine *e)
// Search order is applicationDirPath(), $QML_IMPORT_PATH, QLibraryInfo::ImportsPath
- addImportPath(QLibraryInfo::location(QLibraryInfo::ImportsPath));
+ QString installImportsPath = QLibraryInfo::location(QLibraryInfo::ImportsPath);
+#if defined(Q_OS_SYMBIAN)
+ // Append imports path for all available drives in Symbian
+ if (installImportsPath.at(1) != QChar(QLatin1Char(':'))) {
+ QString tempPath = installImportsPath;
+ if (tempPath.at(tempPath.length() - 1) != QDir::separator()) {
+ tempPath += QDir::separator();
+ }
+ RFs& fs = qt_s60GetRFs();
+ TPtrC tempPathPtr(reinterpret_cast<const TText*> (tempPath.constData()));
+ TFindFile finder(fs);
+ TInt err = finder.FindByDir(tempPathPtr, tempPathPtr);
+ while (err == KErrNone) {
+ QString foundDir(reinterpret_cast<const QChar *>(finder.File().Ptr()),
+ finder.File().Length());
+ foundDir = QDir(foundDir).canonicalPath();
+ addImportPath(foundDir);
+ err = finder.Find();
+ }
+ } else {
+ addImportPath(installImportsPath);
+ }
+#else
+ addImportPath(installImportsPath);
+#endif
// env import paths
QByteArray envImportPath = qgetenv("QML_IMPORT_PATH");
if (!envImportPath.isEmpty()) {
diff --git a/src/declarative/qml/qdeclarativeinclude.cpp b/src/declarative/qml/qdeclarativeinclude.cpp
index 1e240d7..a9ecdda 100644
--- a/src/declarative/qml/qdeclarativeinclude.cpp
+++ b/src/declarative/qml/qdeclarativeinclude.cpp
@@ -172,28 +172,8 @@ void QDeclarativeInclude::callback(QScriptEngine *engine, QScriptValue &callback
}
}
-/*!
-\qmlmethod object Qt::include(string url, jsobject callback)
-
-Include another JavaScript file. This method can only be used from within JavaScript files,
-and not regular QML files.
-
-Qt.include() returns an object that describes the status of the operation. The object has
-a single property, \c {status} that is set to one of the following values:
-
-\table
-\header \o Symbol \o Value \o Description
-\row \o result.OK \o 0 \o The include completed successfully.
-\row \o result.LOADING \o 1 \o Data is being loaded from the network.
-\row \o result.NETWORK_ERROR \o 2 \o A network error occurred while fetching the url.
-\row \o result.EXCEPTION \o 3 \o A JavaScript exception occurred while executing the included code.
-An additional \c exception property will be set in this case.
-\endtable
-
-The return object's properties will be updated as the operation progresses.
-
-If provided, \a callback is invoked when the operation completes. The callback is passed
-the same object as is returned from the Qt.include() call.
+/*
+ Documented in qdeclarativeengine.cpp
*/
QScriptValue QDeclarativeInclude::include(QScriptContext *ctxt, QScriptEngine *engine)
{
diff --git a/src/declarative/qml/qdeclarativeinstruction.cpp b/src/declarative/qml/qdeclarativeinstruction.cpp
index 1767d2f..818c15d 100644
--- a/src/declarative/qml/qdeclarativeinstruction.cpp
+++ b/src/declarative/qml/qdeclarativeinstruction.cpp
@@ -63,7 +63,7 @@ void QDeclarativeCompiledData::dump(QDeclarativeInstruction *instr, int idx)
qWarning().nospace() << idx << "\t\t" << line << "\t" << "INIT\t\t\t" << instr->init.bindingsSize << "\t" << instr->init.parserStatusSize << "\t" << instr->init.contextCache << "\t" << instr->init.compiledBinding;
break;
case QDeclarativeInstruction::CreateObject:
- qWarning().nospace() << idx << "\t\t" << line << "\t" << "CREATE\t\t\t" << instr->create.type << "\t\t\t" << types.at(instr->create.type).className;
+ qWarning().nospace() << idx << "\t\t" << line << "\t" << "CREATE\t\t\t" << instr->create.type << "\t" << instr->create.bindingBits << "\t\t" << types.at(instr->create.type).className;
break;
case QDeclarativeInstruction::CreateSimpleObject:
qWarning().nospace() << idx << "\t\t" << line << "\t" << "CREATE_SIMPLE\t\t" << instr->createSimple.typeSize;
@@ -174,6 +174,9 @@ void QDeclarativeCompiledData::dump(QDeclarativeInstruction *instr, int idx)
case QDeclarativeInstruction::StoreBinding:
qWarning().nospace() << idx << "\t\t" << line << "\t" << "STORE_BINDING\t" << instr->assignBinding.property << "\t" << instr->assignBinding.value << "\t" << instr->assignBinding.context;
break;
+ case QDeclarativeInstruction::StoreBindingOnAlias:
+ qWarning().nospace() << idx << "\t\t" << line << "\t" << "STORE_BINDING_ALIAS\t" << instr->assignBinding.property << "\t" << instr->assignBinding.value << "\t" << instr->assignBinding.context;
+ break;
case QDeclarativeInstruction::StoreCompiledBinding:
qWarning().nospace() << idx << "\t\t" << line << "\t" << "STORE_COMPILED_BINDING\t" << instr->assignBinding.property << "\t" << instr->assignBinding.value << "\t" << instr->assignBinding.context;
break;
@@ -203,7 +206,7 @@ void QDeclarativeCompiledData::dump(QDeclarativeInstruction *instr, int idx)
qWarning().nospace() << idx << "\t\t" << line << "\t" << "FETCH\t\t\t" << instr->fetch.property;
break;
case QDeclarativeInstruction::FetchValueType:
- qWarning().nospace() << idx << "\t\t" << line << "\t" << "FETCH_VALUE\t\t" << instr->fetchValue.property << "\t" << instr->fetchValue.type;
+ qWarning().nospace() << idx << "\t\t" << line << "\t" << "FETCH_VALUE\t\t" << instr->fetchValue.property << "\t" << instr->fetchValue.type << "\t" << instr->fetchValue.bindingSkipList;
break;
case QDeclarativeInstruction::PopFetchedObject:
qWarning().nospace() << idx << "\t\t" << line << "\t" << "POP";
diff --git a/src/declarative/qml/qdeclarativeinstruction_p.h b/src/declarative/qml/qdeclarativeinstruction_p.h
index f0b032c..94676fc 100644
--- a/src/declarative/qml/qdeclarativeinstruction_p.h
+++ b/src/declarative/qml/qdeclarativeinstruction_p.h
@@ -132,6 +132,7 @@ public:
AssignCustomType, /* assignCustomType */
StoreBinding, /* assignBinding */
+ StoreBindingOnAlias, /* assignBinding */
StoreCompiledBinding, /* assignBinding */
StoreValueSource, /* assignValueSource */
StoreValueInterceptor, /* assignValueInterceptor */
@@ -214,6 +215,7 @@ public:
struct FetchValueInstruction {
int property;
int type;
+ quint32 bindingSkipList;
};
struct FetchQmlListInstruction {
int property;
diff --git a/src/declarative/qml/qdeclarativenetworkaccessmanagerfactory.cpp b/src/declarative/qml/qdeclarativenetworkaccessmanagerfactory.cpp
index d22798d..36e9721 100644
--- a/src/declarative/qml/qdeclarativenetworkaccessmanagerfactory.cpp
+++ b/src/declarative/qml/qdeclarativenetworkaccessmanagerfactory.cpp
@@ -46,27 +46,44 @@ QT_BEGIN_NAMESPACE
/*!
\class QDeclarativeNetworkAccessManagerFactory
\since 4.7
- \brief The QDeclarativeNetworkAccessManagerFactory class provides a factory for QNetworkAccessManager for use by a Qt Declarative engine.
+ \brief The QDeclarativeNetworkAccessManagerFactory class creates QNetworkAccessManager instances for a QML engine.
- QNetworkAccessManager is used for all network access by QML.
- By implementing a factory it is possible to create custom
- QNetworkAccessManager with specialized caching, proxy and
- cookie support.
+ A QML engine uses QNetworkAccessManager for all network access.
+ By implementing a factory, it is possible to provide the QML engine
+ with custom QNetworkAccessManager instances with specialized caching,
+ proxy and cookies support.
- To implement a factory, subclass QDeclarativeNetworkAccessManagerFactory and implement
- the create() method.
+ To implement a factory, subclass QDeclarativeNetworkAccessManagerFactory and
+ implement the virtual create() method, then assign it to the relevant QML
+ engine using QDeclarativeEngine::setNetworkAccessManagerFactory().
- To use a factory, assign it to the relevant QDeclarativeEngine using
- QDeclarativeEngine::setNetworkAccessManagerFactory().
+ Note the QML engine may create QNetworkAccessManager instances
+ from multiple threads. Because of this, the implementation of the create()
+ method must be \l{Reentrancy and Thread-Safety}{reentrant}. In addition,
+ the developer should be careful if the signals of the object to be
+ returned from create() are connected to the slots of an object that may
+ be created in a different thread:
- Note: the create() method may be called by multiple threads, so ensure the
- implementation of this method is reentrant.
+ \list
+ \o The QML engine internally handles all requests, and cleans up any
+ QNetworkReply objects it creates. Receiving the
+ QNetworkAccessManager::finished() signal in another thread may not
+ provide the receiver with a valid reply object if it has already
+ been deleted.
+ \o Authentication details provided to QNetworkAccessManager::authenticationRequired()
+ must be provided immediately, so this signal cannot be connected as a
+ Qt::QueuedConnection (or as the default Qt::AutoConnection from another
+ thread).
+ \endlist
+
+ For more information about signals and threads, see
+ \l {Threads and QObjects} and \l {Signals and Slots Across Threads}.
- \sa QDeclarativeEngine::setNetworkAccessManagerFactory(), {declarative/cppextensions/networkaccessmanagerfactory}{NetworkAccessManagerFactory example}
+ \sa {declarative/cppextensions/networkaccessmanagerfactory}{NetworkAccessManagerFactory example}
*/
/*!
- The destructor is empty.
+ Destroys the factory. The default implementation does nothing.
*/
QDeclarativeNetworkAccessManagerFactory::~QDeclarativeNetworkAccessManagerFactory()
{
@@ -75,13 +92,9 @@ QDeclarativeNetworkAccessManagerFactory::~QDeclarativeNetworkAccessManagerFactor
/*!
\fn QNetworkAccessManager *QDeclarativeNetworkAccessManagerFactory::create(QObject *parent)
- Implement this method to create a QNetworkAccessManager with \a parent.
- This allows proxies, caching and cookie support to be setup appropriately.
-
- This method must return a new QNetworkAccessManager each time it is called.
- The parent of the QNetworkAccessManager must be the \a parent provided.
- The QNetworkAccessManager(s) created by this
- function will be destroyed automatically when their parent is destroyed.
+ Creates and returns a network access manager with the specified \a parent.
+ This method must return a new QNetworkAccessManager instance each time
+ it is called.
Note: this method may be called by multiple threads, so ensure the
implementation of this method is reentrant.
diff --git a/src/declarative/qml/qdeclarativeobjectscriptclass.cpp b/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
index eff59df..b0bc5bb 100644
--- a/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
+++ b/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
@@ -69,7 +69,7 @@ struct ObjectData : public QScriptDeclarativeClass::Object {
virtual ~ObjectData() {
if (object && !object->parent()) {
QDeclarativeData *ddata = QDeclarativeData::get(object, false);
- if (ddata && !ddata->indestructible && 0 == --ddata->objectDataRefCount)
+ if (ddata && !ddata->indestructible && 0 == --ddata->objectDataRefCount)
object->deleteLater();
}
}
@@ -808,7 +808,14 @@ QScriptDeclarativeClass::Value MetaCallArgument::toValue(QDeclarativeEngine *e)
}
return QScriptDeclarativeClass::Value(engine, rv);
} else if (type == -1 || type == qMetaTypeId<QVariant>()) {
- return QScriptDeclarativeClass::Value(engine, QDeclarativeEnginePrivate::get(e)->scriptValueFromVariant(*((QVariant *)&data)));
+ QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(e);
+ QScriptValue rv = ep->scriptValueFromVariant(*((QVariant *)&data));
+ if (rv.isQObject()) {
+ QObject *object = rv.toQObject();
+ if (object)
+ QDeclarativeData::get(object, true)->setImplicitDestructible();
+ }
+ return QScriptDeclarativeClass::Value(engine, rv);
} else {
return QScriptDeclarativeClass::Value();
}
diff --git a/src/declarative/qml/qdeclarativeparser.cpp b/src/declarative/qml/qdeclarativeparser.cpp
index 8d00ef8..effecb1 100644
--- a/src/declarative/qml/qdeclarativeparser.cpp
+++ b/src/declarative/qml/qdeclarativeparser.cpp
@@ -205,13 +205,13 @@ QDeclarativeParser::Object::DynamicSlot::DynamicSlot(const DynamicSlot &o)
QDeclarativeParser::Property::Property()
: parent(0), type(0), index(-1), value(0), isDefault(true), isDeferred(false),
- isValueTypeSubProperty(false)
+ isValueTypeSubProperty(false), isAlias(false)
{
}
QDeclarativeParser::Property::Property(const QByteArray &n)
: parent(0), type(0), index(-1), value(0), name(n), isDefault(false),
- isDeferred(false), isValueTypeSubProperty(false)
+ isDeferred(false), isValueTypeSubProperty(false), isAlias(false)
{
}
diff --git a/src/declarative/qml/qdeclarativeparser_p.h b/src/declarative/qml/qdeclarativeparser_p.h
index 77184c2..633847d 100644
--- a/src/declarative/qml/qdeclarativeparser_p.h
+++ b/src/declarative/qml/qdeclarativeparser_p.h
@@ -358,6 +358,9 @@ namespace QDeclarativeParser
bool isDeferred;
// True if this property is a value-type pseudo-property
bool isValueTypeSubProperty;
+ // True if this property is a property alias. Set by the
+ // QDeclarativeCompiler
+ bool isAlias;
LocationSpan location;
LocationRange listValueRange;
diff --git a/src/declarative/qml/qdeclarativeproperty.cpp b/src/declarative/qml/qdeclarativeproperty.cpp
index 1395e97..60edd64 100644
--- a/src/declarative/qml/qdeclarativeproperty.cpp
+++ b/src/declarative/qml/qdeclarativeproperty.cpp
@@ -77,15 +77,28 @@ a property on a specific object instance. To read a property's value, programme
QDeclarativeProperty instance and call the read() method. Likewise to write a property value the
write() method is used.
+For example, for the following QML code:
+
+\qml
+// MyItem.qml
+import QtQuick 1.0
+
+Text { text: "A bit of text" }
+\endqml
+
+The \l Text object's properties could be accessed using QDeclarativeProperty, like this:
+
\code
+#include <QDeclarativeProperty>
+#include <QGraphicsObject>
-QObject *object = declarativeComponent.create();
+...
-QDeclarativeProperty property(object, "font.pixelSize");
+QDeclarativeView view(QUrl::fromLocalFile("MyItem.qml"));
+QDeclarativeProperty property(view.rootObject(), "font.pixelSize");
qWarning() << "Current pixel size:" << property.read().toInt();
property.write(24);
qWarning() << "Pixel size should now be 24:" << property.read().toInt();
-
\endcode
*/
@@ -607,26 +620,7 @@ QDeclarativePropertyPrivate::binding(const QDeclarativeProperty &that)
if (!that.isProperty() || !that.d->object)
return 0;
- QDeclarativeData *data = QDeclarativeData::get(that.d->object);
- if (!data)
- return 0;
-
- if (!data->hasBindingBit(that.d->core.coreIndex))
- return 0;
-
- QDeclarativeAbstractBinding *binding = data->bindings;
- while (binding && binding->propertyIndex() != that.d->core.coreIndex)
- binding = binding->m_nextBinding;
-
- if (binding && that.d->valueType.valueTypeCoreIdx != -1) {
- if (binding->bindingType() == QDeclarativeAbstractBinding::ValueTypeProxy) {
- QDeclarativeValueTypeProxyBinding *proxy = static_cast<QDeclarativeValueTypeProxyBinding *>(binding);
-
- binding = proxy->binding(bindingIndex(that));
- }
- }
-
- return binding;
+ return binding(that.d->object, that.d->core.coreIndex, that.d->valueType.valueTypeCoreIdx);
}
/*!
@@ -658,12 +652,106 @@ QDeclarativePropertyPrivate::setBinding(const QDeclarativeProperty &that,
}
QDeclarativeAbstractBinding *
+QDeclarativePropertyPrivate::binding(QObject *object, int coreIndex, int valueTypeIndex)
+{
+ QDeclarativeData *data = QDeclarativeData::get(object);
+ if (!data)
+ return 0;
+
+ QDeclarativePropertyCache::Data *propertyData =
+ data->propertyCache?data->propertyCache->property(coreIndex):0;
+ if (propertyData && propertyData->flags & QDeclarativePropertyCache::Data::IsAlias) {
+ const QDeclarativeVMEMetaObject *vme =
+ static_cast<const QDeclarativeVMEMetaObject *>(metaObjectForProperty(object->metaObject(), coreIndex));
+
+ QObject *aObject = 0; int aCoreIndex = -1; int aValueTypeIndex = -1;
+ if (!vme->aliasTarget(coreIndex, &aObject, &aCoreIndex, &aValueTypeIndex))
+ return 0;
+
+ // This will either be a value type sub-reference or an alias to a value-type sub-reference not both
+ Q_ASSERT(valueTypeIndex == -1 || aValueTypeIndex == -1);
+ return binding(aObject, aCoreIndex, (valueTypeIndex == -1)?aValueTypeIndex:valueTypeIndex);
+ }
+
+ if (!data->hasBindingBit(coreIndex))
+ return 0;
+
+ QDeclarativeAbstractBinding *binding = data->bindings;
+ while (binding && binding->propertyIndex() != coreIndex)
+ binding = binding->m_nextBinding;
+
+ if (binding && valueTypeIndex != -1) {
+ if (binding->bindingType() == QDeclarativeAbstractBinding::ValueTypeProxy) {
+ int index = coreIndex | (valueTypeIndex << 24);
+ binding = static_cast<QDeclarativeValueTypeProxyBinding *>(binding)->binding(index);
+ }
+ }
+
+ return binding;
+}
+
+void QDeclarativePropertyPrivate::findAliasTarget(QObject *object, int bindingIndex,
+ QObject **targetObject, int *targetBindingIndex)
+{
+ int coreIndex = bindingIndex & 0xFFFFFF;
+ int valueTypeIndex = bindingIndex >> 24;
+ if (valueTypeIndex == 0) valueTypeIndex = -1;
+
+ QDeclarativeData *data = QDeclarativeData::get(object, false);
+ if (data) {
+ QDeclarativePropertyCache::Data *propertyData =
+ data->propertyCache?data->propertyCache->property(coreIndex):0;
+ if (propertyData && propertyData->flags & QDeclarativePropertyCache::Data::IsAlias) {
+ const QDeclarativeVMEMetaObject *vme =
+ static_cast<const QDeclarativeVMEMetaObject *>(metaObjectForProperty(object->metaObject(), coreIndex));
+ QObject *aObject = 0; int aCoreIndex = -1; int aValueTypeIndex = -1;
+ if (vme->aliasTarget(coreIndex, &aObject, &aCoreIndex, &aValueTypeIndex)) {
+ // This will either be a value type sub-reference or an alias to a value-type sub-reference not both
+ Q_ASSERT(valueTypeIndex == -1 || aValueTypeIndex == -1);
+
+ int aBindingIndex = aCoreIndex;
+ if (aValueTypeIndex != -1)
+ aBindingIndex |= aValueTypeIndex << 24;
+ else if (valueTypeIndex != -1)
+ aBindingIndex |= valueTypeIndex << 24;
+
+ findAliasTarget(aObject, aBindingIndex, targetObject, targetBindingIndex);
+ return;
+ }
+ }
+ }
+
+ *targetObject = object;
+ *targetBindingIndex = bindingIndex;
+}
+
+QDeclarativeAbstractBinding *
QDeclarativePropertyPrivate::setBinding(QObject *object, int coreIndex, int valueTypeIndex,
QDeclarativeAbstractBinding *newBinding, WriteFlags flags)
{
QDeclarativeData *data = QDeclarativeData::get(object, 0 != newBinding);
QDeclarativeAbstractBinding *binding = 0;
+ if (data) {
+ QDeclarativePropertyCache::Data *propertyData =
+ data->propertyCache?data->propertyCache->property(coreIndex):0;
+ if (propertyData && propertyData->flags & QDeclarativePropertyCache::Data::IsAlias) {
+ const QDeclarativeVMEMetaObject *vme =
+ static_cast<const QDeclarativeVMEMetaObject *>(metaObjectForProperty(object->metaObject(), coreIndex));
+
+ QObject *aObject = 0; int aCoreIndex = -1; int aValueTypeIndex = -1;
+ if (!vme->aliasTarget(coreIndex, &aObject, &aCoreIndex, &aValueTypeIndex)) {
+ if (newBinding) newBinding->destroy();
+ return 0;
+ }
+
+ // This will either be a value type sub-reference or an alias to a value-type sub-reference not both
+ Q_ASSERT(valueTypeIndex == -1 || aValueTypeIndex == -1);
+ return setBinding(aObject, aCoreIndex, (valueTypeIndex == -1)?aValueTypeIndex:valueTypeIndex,
+ newBinding, flags);
+ }
+ }
+
if (data && data->hasBindingBit(coreIndex)) {
binding = data->bindings;
@@ -671,16 +759,72 @@ QDeclarativePropertyPrivate::setBinding(QObject *object, int coreIndex, int valu
binding = binding->m_nextBinding;
}
- if (binding && valueTypeIndex != -1 && binding->bindingType() == QDeclarativeAbstractBinding::ValueTypeProxy) {
- int index = coreIndex | (valueTypeIndex << 24);
+ int index = coreIndex;
+ if (valueTypeIndex != -1)
+ index |= (valueTypeIndex << 24);
+
+ if (binding && valueTypeIndex != -1 && binding->bindingType() == QDeclarativeAbstractBinding::ValueTypeProxy)
binding = static_cast<QDeclarativeValueTypeProxyBinding *>(binding)->binding(index);
+
+ if (binding) {
+ binding->removeFromObject();
+ binding->setEnabled(false, 0);
+ }
+
+ if (newBinding) {
+ newBinding->addToObject(object, index);
+ newBinding->setEnabled(true, flags);
+ }
+
+ return binding;
+}
+
+QDeclarativeAbstractBinding *
+QDeclarativePropertyPrivate::setBindingNoEnable(QObject *object, int coreIndex, int valueTypeIndex,
+ QDeclarativeAbstractBinding *newBinding)
+{
+ QDeclarativeData *data = QDeclarativeData::get(object, 0 != newBinding);
+ QDeclarativeAbstractBinding *binding = 0;
+
+ if (data) {
+ QDeclarativePropertyCache::Data *propertyData =
+ data->propertyCache?data->propertyCache->property(coreIndex):0;
+ if (propertyData && propertyData->flags & QDeclarativePropertyCache::Data::IsAlias) {
+ const QDeclarativeVMEMetaObject *vme =
+ static_cast<const QDeclarativeVMEMetaObject *>(metaObjectForProperty(object->metaObject(), coreIndex));
+
+ QObject *aObject = 0; int aCoreIndex = -1; int aValueTypeIndex = -1;
+ if (!vme->aliasTarget(coreIndex, &aObject, &aCoreIndex, &aValueTypeIndex)) {
+ if (newBinding) newBinding->destroy();
+ return 0;
+ }
+
+ // This will either be a value type sub-reference or an alias to a value-type sub-reference not both
+ Q_ASSERT(valueTypeIndex == -1 || aValueTypeIndex == -1);
+ return setBindingNoEnable(aObject, aCoreIndex, (valueTypeIndex == -1)?aValueTypeIndex:valueTypeIndex,
+ newBinding);
+ }
+ }
+
+ if (data && data->hasBindingBit(coreIndex)) {
+ binding = data->bindings;
+
+ while (binding && binding->propertyIndex() != coreIndex)
+ binding = binding->m_nextBinding;
}
+ int index = coreIndex;
+ if (valueTypeIndex != -1)
+ index |= (valueTypeIndex << 24);
+
+ if (binding && valueTypeIndex != -1 && binding->bindingType() == QDeclarativeAbstractBinding::ValueTypeProxy)
+ binding = static_cast<QDeclarativeValueTypeProxyBinding *>(binding)->binding(index);
+
if (binding)
- binding->setEnabled(false);
+ binding->removeFromObject();
if (newBinding)
- newBinding->setEnabled(true, flags);
+ newBinding->addToObject(object, index);
return binding;
}
@@ -1392,11 +1536,26 @@ static inline int QMetaObject_methods(const QMetaObject *metaObject)
int className;
int classInfoCount, classInfoData;
int methodCount, methodData;
+ int propertyCount, propertyData;
};
return reinterpret_cast<const Private *>(metaObject->d.data)->methodCount;
}
+static inline int QMetaObject_properties(const QMetaObject *metaObject)
+{
+ struct Private
+ {
+ int revision;
+ int className;
+ int classInfoCount, classInfoData;
+ int methodCount, methodData;
+ int propertyCount, propertyData;
+ };
+
+ return reinterpret_cast<const Private *>(metaObject->d.data)->propertyCount;
+}
+
static inline void flush_vme_signal(const QObject *object, int index)
{
QDeclarativeData *data = static_cast<QDeclarativeData *>(QObjectPrivate::get(const_cast<QObject *>(object))->declarativeData);
@@ -1437,4 +1596,19 @@ bool QDeclarativePropertyPrivate::connect(const QObject *sender, int signal_inde
return QMetaObject::connect(sender, signal_index, receiver, method_index, type, types);
}
+/*!
+Return \a metaObject's [super] meta object that provides data for \a property.
+*/
+const QMetaObject *QDeclarativePropertyPrivate::metaObjectForProperty(const QMetaObject *metaObject, int property)
+{
+ int propertyOffset = metaObject->propertyOffset();
+
+ while (propertyOffset > property) {
+ metaObject = metaObject->d.superdata;
+ propertyOffset -= QMetaObject_properties(metaObject);
+ }
+
+ return metaObject;
+}
+
QT_END_NAMESPACE
diff --git a/src/declarative/qml/qdeclarativeproperty_p.h b/src/declarative/qml/qdeclarativeproperty_p.h
index a9d6979..6392f88 100644
--- a/src/declarative/qml/qdeclarativeproperty_p.h
+++ b/src/declarative/qml/qdeclarativeproperty_p.h
@@ -68,7 +68,7 @@ class QDeclarativeExpression;
class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativePropertyPrivate
{
public:
- enum WriteFlag { BypassInterceptor = 0x01, DontRemoveBinding = 0x02 };
+ enum WriteFlag { BypassInterceptor = 0x01, DontRemoveBinding = 0x02, RemoveBindingOnAliasWrite = 0x04 };
Q_DECLARE_FLAGS(WriteFlags, WriteFlag)
QDeclarativePropertyPrivate()
@@ -108,9 +108,13 @@ public:
const QVariant &value, int flags);
static bool write(QObject *, const QDeclarativePropertyCache::Data &, const QVariant &,
QDeclarativeContextData *, WriteFlags flags = 0);
+ static void findAliasTarget(QObject *, int, QObject **, int *);
static QDeclarativeAbstractBinding *setBinding(QObject *, int coreIndex, int valueTypeIndex /* -1 */,
QDeclarativeAbstractBinding *,
WriteFlags flags = DontRemoveBinding);
+ static QDeclarativeAbstractBinding *setBindingNoEnable(QObject *, int coreIndex, int valueTypeIndex /* -1 */,
+ QDeclarativeAbstractBinding *);
+ static QDeclarativeAbstractBinding *binding(QObject *, int coreIndex, int valueTypeIndex /* -1 */);
static QByteArray saveValueType(const QMetaObject *, int,
const QMetaObject *, int);
@@ -120,7 +124,6 @@ public:
static bool equal(const QMetaObject *, const QMetaObject *);
static bool canConvert(const QMetaObject *from, const QMetaObject *to);
-
// "Public" (to QML) methods
static QDeclarativeAbstractBinding *binding(const QDeclarativeProperty &that);
static QDeclarativeAbstractBinding *setBinding(const QDeclarativeProperty &that,
@@ -136,6 +139,7 @@ public:
static bool connect(const QObject *sender, int signal_index,
const QObject *receiver, int method_index,
int type = 0, int *types = 0);
+ static const QMetaObject *metaObjectForProperty(const QMetaObject *, int);
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QDeclarativePropertyPrivate::WriteFlags)
diff --git a/src/declarative/qml/qdeclarativepropertycache.cpp b/src/declarative/qml/qdeclarativepropertycache.cpp
index 0adcdbd..dd9a224 100644
--- a/src/declarative/qml/qdeclarativepropertycache.cpp
+++ b/src/declarative/qml/qdeclarativepropertycache.cpp
@@ -320,7 +320,6 @@ void QDeclarativePropertyCache::update(QDeclarativeEngine *engine, const QMetaOb
{
Q_ASSERT(engine);
Q_ASSERT(metaObject);
- QDeclarativeEnginePrivate *enginePriv = QDeclarativeEnginePrivate::get(engine);
clear();
diff --git a/src/declarative/qml/qdeclarativepropertycache_p.h b/src/declarative/qml/qdeclarativepropertycache_p.h
index 922010d..f7c5daa 100644
--- a/src/declarative/qml/qdeclarativepropertycache_p.h
+++ b/src/declarative/qml/qdeclarativepropertycache_p.h
@@ -83,6 +83,7 @@ public:
IsConstant = 0x00000001,
IsWritable = 0x00000002,
IsResettable = 0x00000004,
+ IsAlias = 0x00000008,
// These are mutualy exclusive
IsFunction = 0x00000010,
diff --git a/src/declarative/qml/qdeclarativesqldatabase.cpp b/src/declarative/qml/qdeclarativesqldatabase.cpp
index 42b596a..d9a5cc3 100644
--- a/src/declarative/qml/qdeclarativesqldatabase.cpp
+++ b/src/declarative/qml/qdeclarativesqldatabase.cpp
@@ -172,16 +172,23 @@ static const char* sqlerror[] = {
return errorValue; \
}
-
-static QString databaseFile(const QString& connectionName, QScriptEngine *engine)
+static QString qmlsqldatabase_databasesPath(QScriptEngine *engine)
{
QDeclarativeScriptEngine *qmlengine = static_cast<QDeclarativeScriptEngine*>(engine);
- QString basename = qmlengine->offlineStoragePath
- + QDir::separator() + QLatin1String("Databases") + QDir::separator();
- basename += connectionName;
- return basename;
+ return qmlengine->offlineStoragePath
+ + QDir::separator() + QLatin1String("Databases");
}
+static void qmlsqldatabase_initDatabasesPath(QScriptEngine *engine)
+{
+ QDir().mkpath(qmlsqldatabase_databasesPath(engine));
+}
+
+static QString qmlsqldatabase_databaseFile(const QString& connectionName, QScriptEngine *engine)
+{
+ return qmlsqldatabase_databasesPath(engine) + QDir::separator()
+ + connectionName;
+}
static QScriptValue qmlsqldatabase_item(QScriptContext *context, QScriptEngine *engine)
@@ -302,7 +309,7 @@ static QScriptValue qmlsqldatabase_change_version(QScriptContext *context, QScri
if (ok) {
context->thisObject().setProperty(QLatin1String("version"), to_version, QScriptValue::ReadOnly);
- QSettings ini(databaseFile(db.connectionName(),engine)+QLatin1String(".ini"),QSettings::IniFormat);
+ QSettings ini(qmlsqldatabase_databaseFile(db.connectionName(),engine) + QLatin1String(".ini"), QSettings::IniFormat);
ini.setValue(QLatin1String("Version"), to_version);
}
@@ -348,6 +355,8 @@ static QScriptValue qmlsqldatabase_read_transaction(QScriptContext *context, QSc
*/
static QScriptValue qmlsqldatabase_open_sync(QScriptContext *context, QScriptEngine *engine)
{
+ qmlsqldatabase_initDatabasesPath(engine);
+
QSqlDatabase database;
QString dbname = context->argument(0).toString();
@@ -360,7 +369,7 @@ static QScriptValue qmlsqldatabase_open_sync(QScriptContext *context, QScriptEng
md5.addData(dbname.toUtf8());
QString dbid(QLatin1String(md5.result().toHex()));
- QString basename = databaseFile(dbid,engine);
+ QString basename = qmlsqldatabase_databaseFile(dbid, engine);
bool created = false;
QString version = dbversion;
@@ -375,7 +384,6 @@ static QScriptValue qmlsqldatabase_open_sync(QScriptContext *context, QScriptEng
} else {
created = !QFile::exists(basename+QLatin1String(".sqlite"));
database = QSqlDatabase::addDatabase(QLatin1String("QSQLITE"), dbid);
- QDir().mkpath(basename);
if (created) {
ini.setValue(QLatin1String("Name"), dbname);
if (dbcreationCallback.isFunction())
diff --git a/src/declarative/qml/qdeclarativevaluetype.cpp b/src/declarative/qml/qdeclarativevaluetype.cpp
index b9e9cec..5dc6ffd 100644
--- a/src/declarative/qml/qdeclarativevaluetype.cpp
+++ b/src/declarative/qml/qdeclarativevaluetype.cpp
@@ -109,36 +109,54 @@ void QDeclarativeValueTypeFactory::registerValueTypes()
QDeclarativeValueType *QDeclarativeValueTypeFactory::valueType(int t)
{
+ QDeclarativeValueType *rv = 0;
+
switch (t) {
case QVariant::Point:
- return new QDeclarativePointValueType;
+ rv = new QDeclarativePointValueType;
+ break;
case QVariant::PointF:
- return new QDeclarativePointFValueType;
+ rv = new QDeclarativePointFValueType;
+ break;
case QVariant::Size:
- return new QDeclarativeSizeValueType;
+ rv = new QDeclarativeSizeValueType;
+ break;
case QVariant::SizeF:
- return new QDeclarativeSizeFValueType;
+ rv = new QDeclarativeSizeFValueType;
+ break;
case QVariant::Rect:
- return new QDeclarativeRectValueType;
+ rv = new QDeclarativeRectValueType;
+ break;
case QVariant::RectF:
- return new QDeclarativeRectFValueType;
+ rv = new QDeclarativeRectFValueType;
+ break;
case QVariant::Vector2D:
- return new QDeclarativeVector2DValueType;
+ rv = new QDeclarativeVector2DValueType;
+ break;
case QVariant::Vector3D:
- return new QDeclarativeVector3DValueType;
+ rv = new QDeclarativeVector3DValueType;
+ break;
case QVariant::Vector4D:
- return new QDeclarativeVector4DValueType;
+ rv = new QDeclarativeVector4DValueType;
+ break;
case QVariant::Quaternion:
- return new QDeclarativeQuaternionValueType;
+ rv = new QDeclarativeQuaternionValueType;
+ break;
case QVariant::Matrix4x4:
- return new QDeclarativeMatrix4x4ValueType;
+ rv = new QDeclarativeMatrix4x4ValueType;
+ break;
case QVariant::EasingCurve:
- return new QDeclarativeEasingValueType;
+ rv = new QDeclarativeEasingValueType;
+ break;
case QVariant::Font:
- return new QDeclarativeFontValueType;
+ rv = new QDeclarativeFontValueType;
+ break;
default:
- return 0;
+ break;
}
+
+ Q_ASSERT(!rv || rv->metaObject()->propertyCount() < 32);
+ return rv;
}
QDeclarativeValueType::QDeclarativeValueType(QObject *parent)
diff --git a/src/declarative/qml/qdeclarativevme.cpp b/src/declarative/qml/qdeclarativevme.cpp
index db90aff..c742dec 100644
--- a/src/declarative/qml/qdeclarativevme.cpp
+++ b/src/declarative/qml/qdeclarativevme.cpp
@@ -154,7 +154,8 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(ctxt->engine);
int status = -1; //for dbus
- QDeclarativePropertyPrivate::WriteFlags flags = QDeclarativePropertyPrivate::BypassInterceptor;
+ QDeclarativePropertyPrivate::WriteFlags flags = QDeclarativePropertyPrivate::BypassInterceptor |
+ QDeclarativePropertyPrivate::RemoveBindingOnAliasWrite;
for (int ii = start; !isError() && ii < (start + count); ++ii) {
const QDeclarativeInstruction &instr = comp->bytecode.at(ii);
@@ -664,6 +665,7 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
break;
case QDeclarativeInstruction::StoreBinding:
+ case QDeclarativeInstruction::StoreBindingOnAlias:
{
QObject *target =
stack.at(stack.count() - 1 - instr.assignBinding.owner);
@@ -675,14 +677,20 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
int coreIndex = mp.index();
- if (stack.count() == 1 && bindingSkipList.testBit(coreIndex))
+ if ((stack.count() - instr.assignBinding.owner) == 1 && bindingSkipList.testBit(coreIndex))
break;
QDeclarativeBinding *bind = new QDeclarativeBinding((void *)datas.at(instr.assignBinding.value).constData(), comp, context, ctxt, comp->name, instr.line, 0);
bindValues.append(bind);
bind->m_mePtr = &bindValues.values[bindValues.count - 1];
bind->setTarget(mp);
- bind->addToObject(target);
+
+ if (instr.type == QDeclarativeInstruction::StoreBindingOnAlias) {
+ QDeclarativeAbstractBinding *old = QDeclarativePropertyPrivate::setBindingNoEnable(target, coreIndex, QDeclarativePropertyPrivate::valueTypeCoreIndex(mp), bind);
+ if (old) { old->destroy(); }
+ } else {
+ bind->addToObject(target, QDeclarativePropertyPrivate::bindingIndex(mp));
+ }
}
break;
@@ -701,7 +709,7 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
ctxt->optimizedBindings->configBinding(instr.assignBinding.value, target, scope, property);
bindValues.append(binding);
binding->m_mePtr = &bindValues.values[bindValues.count - 1];
- binding->addToObject(target);
+ binding->addToObject(target, property);
}
break;
@@ -874,8 +882,26 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack,
case QDeclarativeInstruction::FetchValueType:
{
QObject *target = stack.top();
- QDeclarativeValueType *valueHandler =
- ep->valueTypes[instr.fetchValue.type];
+
+ if (instr.fetchValue.bindingSkipList != 0) {
+ // Possibly need to clear bindings
+ QDeclarativeData *targetData = QDeclarativeData::get(target);
+ if (targetData) {
+ QDeclarativeAbstractBinding *binding =
+ QDeclarativePropertyPrivate::binding(target, instr.fetchValue.property, -1);
+
+ if (binding && binding->bindingType() != QDeclarativeAbstractBinding::ValueTypeProxy) {
+ QDeclarativePropertyPrivate::setBinding(target, instr.fetchValue.property, -1, 0);
+ binding->destroy();
+ } else if (binding) {
+ QDeclarativeValueTypeProxyBinding *proxy =
+ static_cast<QDeclarativeValueTypeProxyBinding *>(binding);
+ proxy->removeBindings(instr.fetchValue.bindingSkipList);
+ }
+ }
+ }
+
+ QDeclarativeValueType *valueHandler = ep->valueTypes[instr.fetchValue.type];
valueHandler->read(target, instr.fetchValue.property);
stack.push(valueHandler);
}
diff --git a/src/declarative/qml/qdeclarativevmemetaobject.cpp b/src/declarative/qml/qdeclarativevmemetaobject.cpp
index e28062b..38c1709 100644
--- a/src/declarative/qml/qdeclarativevmemetaobject.cpp
+++ b/src/declarative/qml/qdeclarativevmemetaobject.cpp
@@ -46,6 +46,7 @@
#include "qdeclarativeexpression.h"
#include "private/qdeclarativeexpression_p.h"
#include "private/qdeclarativecontext_p.h"
+#include "private/qdeclarativebinding_p.h"
Q_DECLARE_METATYPE(QScriptValue);
@@ -589,7 +590,21 @@ int QDeclarativeVMEMetaObject::metaCall(QMetaObject::Call c, int _id, void **a)
if (d->isObjectAlias()) {
*reinterpret_cast<QObject **>(a[0]) = target;
return -1;
- } else if (d->isValueTypeAlias()) {
+ }
+
+ // Remove binding (if any) on write
+ if(c == QMetaObject::WriteProperty) {
+ int flags = *reinterpret_cast<int*>(a[3]);
+ if (flags & QDeclarativePropertyPrivate::RemoveBindingOnAliasWrite) {
+ QDeclarativeData *targetData = QDeclarativeData::get(target);
+ if (targetData && targetData->hasBindingBit(d->propertyIndex())) {
+ QDeclarativeAbstractBinding *binding = QDeclarativePropertyPrivate::setBinding(target, d->propertyIndex(), d->isValueTypeAlias()?d->valueTypeIndex():-1, 0);
+ if (binding) binding->destroy();
+ }
+ }
+ }
+
+ if (d->isValueTypeAlias()) {
// Value type property
QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(ctxt->engine);
@@ -821,6 +836,36 @@ void QDeclarativeVMEMetaObject::setVMEProperty(int index, const QScriptValue &v)
return writeVarProperty(index - propOffset, v);
}
+bool QDeclarativeVMEMetaObject::aliasTarget(int index, QObject **target, int *coreIndex, int *valueTypeIndex) const
+{
+ Q_ASSERT(index >= propOffset + metaData->propertyCount);
+
+ *target = 0;
+ *coreIndex = -1;
+ *valueTypeIndex = -1;
+
+ if (!ctxt)
+ return false;
+
+ QDeclarativeVMEMetaData::AliasData *d = metaData->aliasData() + (index - propOffset - metaData->propertyCount);
+ QDeclarativeContext *context = ctxt->asQDeclarativeContext();
+ QDeclarativeContextPrivate *ctxtPriv = QDeclarativeContextPrivate::get(context);
+
+ *target = ctxtPriv->data->idValues[d->contextIdx].data();
+ if (!*target)
+ return false;
+
+ if (d->isObjectAlias()) {
+ } else if (d->isValueTypeAlias()) {
+ *coreIndex = d->propertyIndex();
+ *valueTypeIndex = d->valueTypeIndex();
+ } else {
+ *coreIndex = d->propertyIndex();
+ }
+
+ return true;
+}
+
void QDeclarativeVMEMetaObject::connectAlias(int aliasId)
{
if (!aConnected.testBit(aliasId)) {
diff --git a/src/declarative/qml/qdeclarativevmemetaobject_p.h b/src/declarative/qml/qdeclarativevmemetaobject_p.h
index 5134763..7b6b410 100644
--- a/src/declarative/qml/qdeclarativevmemetaobject_p.h
+++ b/src/declarative/qml/qdeclarativevmemetaobject_p.h
@@ -138,6 +138,7 @@ public:
QDeclarativeCompiledData *compiledData);
~QDeclarativeVMEMetaObject();
+ bool aliasTarget(int index, QObject **target, int *coreIndex, int *valueTypeIndex) const;
void registerInterceptor(int index, int valueIndex, QDeclarativePropertyValueInterceptor *interceptor);
QScriptValue vmeMethod(int index);
int vmeMethodLineNumber(int index);
@@ -146,6 +147,7 @@ public:
void setVMEProperty(int index, const QScriptValue &);
void connectAliasSignal(int index);
+
protected:
virtual int metaCall(QMetaObject::Call _c, int _id, void **_a);
diff --git a/src/declarative/qml/qdeclarativeworkerscript.cpp b/src/declarative/qml/qdeclarativeworkerscript.cpp
index 75cc6f9..2699bd2 100644
--- a/src/declarative/qml/qdeclarativeworkerscript.cpp
+++ b/src/declarative/qml/qdeclarativeworkerscript.cpp
@@ -458,7 +458,7 @@ QDeclarativeWorkerScriptEngine::QDeclarativeWorkerScriptEngine(QDeclarativeEngin
{
d->m_lock.lock();
connect(d, SIGNAL(stopThread()), this, SLOT(quit()), Qt::DirectConnection);
- start(QThread::LowPriority);
+ start(QThread::IdlePriority);
d->m_wait.wait(&d->m_lock);
d->moveToThread(this);
d->m_lock.unlock();
diff --git a/src/declarative/util/qdeclarativeanimation.cpp b/src/declarative/util/qdeclarativeanimation.cpp
index 58444bd..d5df51e 100644
--- a/src/declarative/util/qdeclarativeanimation.cpp
+++ b/src/declarative/util/qdeclarativeanimation.cpp
@@ -1324,7 +1324,7 @@ void QDeclarativeVector3dAnimation::setTo(QVector3D t)
/*!
\qmlclass RotationAnimation QDeclarativeRotationAnimation
- \ingroup qml-animation-transition
+ \ingroup qml-animation-transition
\since 4.7
\inherits PropertyAnimation
\brief The RotationAnimation element animates changes in rotation values.
@@ -1333,8 +1333,8 @@ void QDeclarativeVector3dAnimation::setTo(QVector3D t)
over the direction of rotation during an animation.
By default, it rotates in the direction
- of the numerical change; a rotation from 0 to 240 will rotate 220 degrees
- clockwise, while a rotation from 240 to 0 will rotate 220 degrees
+ of the numerical change; a rotation from 0 to 240 will rotate 240 degrees
+ clockwise, while a rotation from 240 to 0 will rotate 240 degrees
counterclockwise. The \l direction property can be set to specify the
direction in which the rotation should occur.
@@ -1342,7 +1342,7 @@ void QDeclarativeVector3dAnimation::setTo(QVector3D t)
between states via the shortest path:
\snippet doc/src/snippets/declarative/rotationanimation.qml 0
-
+
Notice the RotationAnimation did not need to set a \l target
value. As a convenience, when used in a transition, RotationAnimation will rotate all
properties named "rotation" or "angle". You can override this by providing
diff --git a/src/declarative/util/qdeclarativepixmapcache.cpp b/src/declarative/util/qdeclarativepixmapcache.cpp
index a07b1bb..380d9bc 100644
--- a/src/declarative/util/qdeclarativepixmapcache.cpp
+++ b/src/declarative/util/qdeclarativepixmapcache.cpp
@@ -684,7 +684,7 @@ void QDeclarativePixmapStore::timerEvent(QTimerEvent *)
}
QDeclarativePixmapReply::QDeclarativePixmapReply(QDeclarativePixmapData *d)
-: data(d), reader(0), loading(false), redirectCount(0), requestSize(d->requestSize)
+: data(d), reader(0), requestSize(d->requestSize), loading(false), redirectCount(0)
{
if (finishedIndex == -1) {
finishedIndex = QDeclarativePixmapReply::staticMetaObject.indexOfSignal("finished()");
diff --git a/src/declarative/util/qdeclarativeview.cpp b/src/declarative/util/qdeclarativeview.cpp
index c4d8dde..49b662f 100644
--- a/src/declarative/util/qdeclarativeview.cpp
+++ b/src/declarative/util/qdeclarativeview.cpp
@@ -192,7 +192,7 @@ void QDeclarativeViewPrivate::itemGeometryChanged(QDeclarativeItem *resizeItem,
/*!
\class QDeclarativeView
- \since 4.7
+ \since 4.7
\brief The QDeclarativeView class provides a widget for displaying a Qt Declarative user interface.
QDeclarativeItem objects can be placed on a standard QGraphicsScene and
@@ -360,13 +360,14 @@ QDeclarativeContext* QDeclarativeView::rootContext() const
}
/*!
- \enum QDeclarativeView::Status
+ \enum QDeclarativeView::Status
Specifies the loading status of the QDeclarativeView.
\value Null This QDeclarativeView has no source set.
\value Ready This QDeclarativeView has loaded and created the QML component.
\value Loading This QDeclarativeView is loading network data.
- \value Error An error has occurred. Call errorDescription() to retrieve a description.
+ \value Error One or more errors has occurred. Call errors() to retrieve a list
+ of errors.
*/
/*! \enum QDeclarativeView::ResizeMode
diff --git a/src/declarative/util/qdeclarativexmllistmodel.cpp b/src/declarative/util/qdeclarativexmllistmodel.cpp
index 337b1e0..8f32716 100644
--- a/src/declarative/util/qdeclarativexmllistmodel.cpp
+++ b/src/declarative/util/qdeclarativexmllistmodel.cpp
@@ -503,9 +503,9 @@ void QDeclarativeXmlListModelPrivate::clear_role(QDeclarativeListProperty<QDecla
\qmlclass XmlListModel QDeclarativeXmlListModel
\ingroup qml-working-with-data
\since 4.7
- \brief The XmlListModel element is used to specify a model using XPath expressions.
+ \brief The XmlListModel element is used to specify a read-only model using XPath expressions.
- XmlListModel is used to create a model from XML data. It can be used as a data source
+ XmlListModel is used to create a read-only model from XML data. It can be used as a data source
for view elements (such as ListView, PathView, GridView) and other elements that interact with model
data (such as \l Repeater).
@@ -924,6 +924,7 @@ void QDeclarativeXmlListModel::reload()
} else {
d->notifyQueryStarted(true);
QNetworkRequest req(d->src);
+ req.setRawHeader("Accept", "application/xml");
d->reply = qmlContext(this)->engine()->networkAccessManager()->get(req);
QObject::connect(d->reply, SIGNAL(finished()), this, SLOT(requestFinished()));
QObject::connect(d->reply, SIGNAL(downloadProgress(qint64,qint64)),
diff --git a/src/gui/dialogs/qdialog.cpp b/src/gui/dialogs/qdialog.cpp
index 6970b76..e522dc9 100644
--- a/src/gui/dialogs/qdialog.cpp
+++ b/src/gui/dialogs/qdialog.cpp
@@ -282,8 +282,8 @@ QDialog::QDialog(QWidget *parent, Qt::WindowFlags f)
QDialog::QDialog(QWidget *parent, const char *name, bool modal, Qt::WindowFlags f)
: QWidget(*new QDialogPrivate, parent,
f
- | QFlag(modal ? Qt::WShowModal : 0)
- | QFlag((f & Qt::WindowType_Mask) == 0 ? Qt::Dialog : 0)
+ | QFlag(modal ? Qt::WShowModal : Qt::WindowType(0))
+ | QFlag((f & Qt::WindowType_Mask) == 0 ? Qt::Dialog : Qt::WindowType(0))
)
{
setObjectName(QString::fromAscii(name));
@@ -899,17 +899,27 @@ bool QDialog::symbianAdjustedPosition()
{
#if defined(Q_WS_S60)
QPoint p;
- const bool doS60Positioning = !(isFullScreen()||isMaximized());
- if (doS60Positioning) {
+ QPoint oldPos = pos();
+ if (isFullScreen()) {
+ p.setX(0);
+ p.setY(0);
+ } else if (isMaximized()) {
+ TRect statusPaneRect = TRect();
+ if (S60->screenHeightInPixels > S60->screenWidthInPixels) {
+ AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EStatusPane, statusPaneRect);
+ } else {
+ AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EStaconTop, statusPaneRect);
+ }
+
+ p.setX(0);
+ p.setY(statusPaneRect.Height());
+ } else {
// naive way to deduce screen orientation
if (S60->screenHeightInPixels > S60->screenWidthInPixels) {
int cbaHeight;
- const CEikButtonGroupContainer* bgContainer = S60->buttonGroupContainer();
- if (!bgContainer) {
- cbaHeight = 0;
- } else {
- cbaHeight = qt_TSize2QSize(bgContainer->Size()).height();
- }
+ TRect rect;
+ AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EControlPane, rect);
+ cbaHeight = rect.Height();
p.setY(S60->screenHeightInPixels - height() - cbaHeight);
p.setX(0);
} else {
@@ -939,9 +949,10 @@ bool QDialog::symbianAdjustedPosition()
p.setX(qMax(0,S60->screenWidthInPixels - width()));
}
}
- move(p);
}
- return doS60Positioning;
+ if (oldPos != p || p.y() < 0)
+ move(p);
+ return true;
#else
// TODO - check positioning requirement for Symbian, non-s60
return false;
diff --git a/src/gui/dialogs/qfiledialog_mac.mm b/src/gui/dialogs/qfiledialog_mac.mm
index 6c1d7f6..a233d4f 100644
--- a/src/gui/dialogs/qfiledialog_mac.mm
+++ b/src/gui/dialogs/qfiledialog_mac.mm
@@ -726,6 +726,14 @@ bool QFileDialogPrivate::setVisible_sys(bool visible)
if (!visible == q->isHidden())
return false;
+ if (q->windowFlags() & Qt::WindowStaysOnTopHint) {
+ // The native file dialog tries all it can to stay
+ // on the NSModalPanel level. And it might also show
+ // its own "create directory" dialog that we cannot control.
+ // So we need to use the non-native version in this case...
+ return false;
+ }
+
#ifndef QT_MAC_USE_COCOA
return visible ? showCarbonNavServicesDialog() : hideCarbonNavServicesDialog();
#else
diff --git a/src/gui/dialogs/qfiledialog_symbian.cpp b/src/gui/dialogs/qfiledialog_symbian.cpp
index 1f70305..1fc5f5e 100644
--- a/src/gui/dialogs/qfiledialog_symbian.cpp
+++ b/src/gui/dialogs/qfiledialog_symbian.cpp
@@ -64,7 +64,7 @@ public:
filterList.clear();
if (filter.left(2) == QLatin1String("*.")) {
//Filter has only extensions
- filterList << filter.split(" ");
+ filterList << filter.split(QLatin1String(" "));
return;
} else {
//Extensions are in parenthesis and there may be several filters
@@ -75,7 +75,7 @@ public:
return;
}
}
- QRegExp rx("\\(([^\\)]*)\\)");
+ QRegExp rx(QLatin1String("\\(([^\\)]*)\\)"));
int pos = 0;
while ((pos = rx.indexIn(filter, pos)) != -1) {
filterList << rx.cap(1).split(QLatin1String(" "));
@@ -119,36 +119,49 @@ static QString launchSymbianDialog(const QString dialogCaption, const QString st
{
QString selection;
#if defined(Q_WS_S60) && defined(SYMBIAN_VERSION_SYMBIAN3)
- QT_TRAP_THROWING(
- TFileName startFolder;
- if (!startDirectory.isEmpty()) {
- QString dir = QDir::toNativeSeparators(startDirectory);
+ TFileName startFolder;
+ if (!startDirectory.isEmpty()) {
+ QString dir = QDir::toNativeSeparators(QFileDialogPrivate::workingDirectory(startDirectory));
+ startFolder = qt_QString2TPtrC(dir);
+ }
+ TInt types = AknCommonDialogsDynMem::EMemoryTypeMMCExternal|
+ AknCommonDialogsDynMem::EMemoryTypeInternalMassStorage|
+ AknCommonDialogsDynMem::EMemoryTypePhone;
+
+ TPtrC titlePtr(qt_QString2TPtrC(dialogCaption));
+ TFileName target;
+ bool select = false;
+ int tryCount = 2;
+ while (tryCount--) {
+ TInt err(KErrNone);
+ TRAP(err,
+ if (dialogMode == DialogOpen) {
+ CExtensionFilter* extensionFilter = new (ELeave) CExtensionFilter;
+ CleanupStack::PushL(extensionFilter);
+ extensionFilter->setFilter(filter);
+ select = AknCommonDialogsDynMem::RunSelectDlgLD(types, target,
+ startFolder, NULL, NULL, titlePtr, extensionFilter);
+ CleanupStack::Pop(extensionFilter);
+ } else if (dialogMode == DialogSave) {
+ select = AknCommonDialogsDynMem::RunSaveDlgLD(types, target,
+ startFolder, NULL, NULL, titlePtr);
+ } else if (dialogMode == DialogFolder) {
+ select = AknCommonDialogsDynMem::RunFolderSelectDlgLD(types, target, startFolder,
+ 0, 0, titlePtr, NULL, NULL);
+ }
+ );
+
+ if (err == KErrNone) {
+ tryCount = 0;
+ } else {
+ // Symbian native file dialog doesn't allow accessing files outside C:/Data
+ // It will always leave in that case, so default into QDir::rootPath() in error cases.
+ QString dir = QDir::toNativeSeparators(QDir::rootPath());
startFolder = qt_QString2TPtrC(dir);
}
- TInt types = AknCommonDialogsDynMem::EMemoryTypeMMCExternal|
- AknCommonDialogsDynMem::EMemoryTypeInternalMassStorage|
- AknCommonDialogsDynMem::EMemoryTypePhone;
-
- TPtrC titlePtr(qt_QString2TPtrC(dialogCaption));
- TFileName target;
- bool select = false;
- if (dialogMode == DialogOpen) {
- CExtensionFilter* extensionFilter = new (ELeave) CExtensionFilter;
- CleanupStack::PushL(extensionFilter);
- extensionFilter->setFilter(filter);
- select = AknCommonDialogsDynMem::RunSelectDlgLD(types, target,
- startFolder, NULL, NULL, titlePtr, extensionFilter);
- CleanupStack::Pop(extensionFilter);
- } else if (dialogMode == DialogSave) {
- select = AknCommonDialogsDynMem::RunSaveDlgLD(types, target,
- startFolder, NULL, NULL, titlePtr);
- } else if (dialogMode == DialogFolder) {
- select = AknCommonDialogsDynMem::RunFolderSelectDlgLD(types, target, startFolder,
- 0, 0, titlePtr, NULL, NULL);
- }
- if (select)
- selection.append(qt_TDesC2QString(target));
- );
+ }
+ if (select)
+ selection.append(qt_TDesC2QString(target));
#endif
return selection;
}
diff --git a/src/gui/dialogs/qfilesystemmodel.cpp b/src/gui/dialogs/qfilesystemmodel.cpp
index 5002beb..6552370 100644
--- a/src/gui/dialogs/qfilesystemmodel.cpp
+++ b/src/gui/dialogs/qfilesystemmodel.cpp
@@ -1313,7 +1313,7 @@ QString QFileSystemModelPrivate::filePath(const QModelIndex &index) const
if ((fullPath.length() > 2) && fullPath[0] == QLatin1Char('/') && fullPath[1] == QLatin1Char('/'))
fullPath = fullPath.mid(1);
#endif
-#if defined(Q_OS_WIN)
+#if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
if (fullPath.length() == 2 && fullPath.endsWith(QLatin1Char(':')))
fullPath.append(QLatin1Char('/'));
#endif
diff --git a/src/gui/dialogs/qinputdialog.cpp b/src/gui/dialogs/qinputdialog.cpp
index 9e4b9b6..1724316 100644
--- a/src/gui/dialogs/qinputdialog.cpp
+++ b/src/gui/dialogs/qinputdialog.cpp
@@ -234,6 +234,8 @@ void QInputDialogPrivate::ensureLayout()
//we want to let the input dialog grow to available size on Symbian.
#ifndef Q_OS_SYMBIAN
mainLayout->setSizeConstraint(QLayout::SetMinAndMaxSize);
+#else
+ label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
#endif
mainLayout->addWidget(label);
mainLayout->addWidget(inputWidget);
diff --git a/src/gui/dialogs/qmessagebox.cpp b/src/gui/dialogs/qmessagebox.cpp
index 224a176..af9616d 100644
--- a/src/gui/dialogs/qmessagebox.cpp
+++ b/src/gui/dialogs/qmessagebox.cpp
@@ -1925,7 +1925,7 @@ void QMessageBoxPrivate::retranslateStrings()
{
#ifndef QT_NO_TEXTEDIT
if (detailsButton)
- detailsButton->setLabel(detailsText->isHidden() ? HideLabel : ShowLabel);
+ detailsButton->setLabel(detailsText->isHidden() ? ShowLabel : HideLabel);
#endif
}
diff --git a/src/gui/egl/qegl_x11.cpp b/src/gui/egl/qegl_x11.cpp
index 15cc109..29415ed 100644
--- a/src/gui/egl/qegl_x11.cpp
+++ b/src/gui/egl/qegl_x11.cpp
@@ -165,8 +165,10 @@ VisualID QEgl::getCompatibleVisualId(EGLConfig config)
if (chosenVisualInfo) {
// Skip size checks if implementation supports non-matching visual
// and config (http://bugreports.qt.nokia.com/browse/QTBUG-9444).
- if (QEgl::hasExtension("EGL_NV_post_convert_rounding"))
+ if (QEgl::hasExtension("EGL_NV_post_convert_rounding")) {
+ XFree(chosenVisualInfo);
return visualId;
+ }
int visualRedSize = countBits(chosenVisualInfo->red_mask);
int visualGreenSize = countBits(chosenVisualInfo->green_mask);
diff --git a/src/gui/graphicsview/qgraphicsitem.cpp b/src/gui/graphicsview/qgraphicsitem.cpp
index e9a2f9f..360fccc 100644
--- a/src/gui/graphicsview/qgraphicsitem.cpp
+++ b/src/gui/graphicsview/qgraphicsitem.cpp
@@ -3295,9 +3295,13 @@ void QGraphicsItemPrivate::setFocusHelper(Qt::FocusReason focusReason, bool clim
}
// Update the child focus chain.
- if (scene && scene->focusItem())
- scene->focusItem()->d_ptr->clearSubFocus();
- f->d_ptr->setSubFocus();
+ QGraphicsItem *commonAncestor = 0;
+ if (scene && scene->focusItem()) {
+ commonAncestor = scene->focusItem()->commonAncestorItem(f);
+ scene->focusItem()->d_ptr->clearSubFocus(scene->focusItem(), commonAncestor);
+ }
+
+ f->d_ptr->setSubFocus(f, commonAncestor);
// Update the scene's focus item.
if (scene) {
@@ -5554,7 +5558,7 @@ void QGraphicsItemPrivate::ensureSceneTransformRecursive(QGraphicsItem **topMost
/*!
\internal
*/
-void QGraphicsItemPrivate::setSubFocus(QGraphicsItem *rootItem)
+void QGraphicsItemPrivate::setSubFocus(QGraphicsItem *rootItem, QGraphicsItem *stopItem)
{
// Update focus child chain. Stop at panels, or if this item
// is hidden, stop at the first item with a visible parent.
@@ -5567,7 +5571,7 @@ void QGraphicsItemPrivate::setSubFocus(QGraphicsItem *rootItem)
if (parent != q_ptr && parent->d_ptr->subFocusItem) {
if (parent->d_ptr->subFocusItem == q_ptr)
break;
- parent->d_ptr->subFocusItem->d_ptr->clearSubFocus();
+ parent->d_ptr->subFocusItem->d_ptr->clearSubFocus(0, stopItem);
}
parent->d_ptr->subFocusItem = q_ptr;
parent->d_ptr->subFocusItemChange();
@@ -5580,12 +5584,12 @@ void QGraphicsItemPrivate::setSubFocus(QGraphicsItem *rootItem)
/*!
\internal
*/
-void QGraphicsItemPrivate::clearSubFocus(QGraphicsItem *rootItem)
+void QGraphicsItemPrivate::clearSubFocus(QGraphicsItem *rootItem, QGraphicsItem *stopItem)
{
// Reset sub focus chain.
QGraphicsItem *parent = rootItem ? rootItem : q_ptr;
do {
- if (parent->d_ptr->subFocusItem != q_ptr)
+ if (parent->d_ptr->subFocusItem != q_ptr || parent == stopItem)
break;
parent->d_ptr->subFocusItem = 0;
parent->d_ptr->subFocusItemChange();
diff --git a/src/gui/graphicsview/qgraphicsitem_p.h b/src/gui/graphicsview/qgraphicsitem_p.h
index 1b7aa97..b938759 100644
--- a/src/gui/graphicsview/qgraphicsitem_p.h
+++ b/src/gui/graphicsview/qgraphicsitem_p.h
@@ -479,8 +479,8 @@ public:
void setFocusHelper(Qt::FocusReason focusReason, bool climb, bool focusFromHide);
void clearFocusHelper(bool giveFocusToParent);
- void setSubFocus(QGraphicsItem *rootItem = 0);
- void clearSubFocus(QGraphicsItem *rootItem = 0);
+ void setSubFocus(QGraphicsItem *rootItem = 0, QGraphicsItem *stopItem = 0);
+ void clearSubFocus(QGraphicsItem *rootItem = 0, QGraphicsItem *stopItem = 0);
void resetFocusProxy();
virtual void subFocusItemChange();
virtual void focusScopeItemChange(bool isSubFocusItem);
diff --git a/src/gui/graphicsview/qgraphicslayout.cpp b/src/gui/graphicsview/qgraphicslayout.cpp
index 91f386f..40f7c1b 100644
--- a/src/gui/graphicsview/qgraphicslayout.cpp
+++ b/src/gui/graphicsview/qgraphicslayout.cpp
@@ -307,10 +307,13 @@ void QGraphicsLayout::invalidate()
// does not call the base implementation? In addition, updateGeometry()
// does more than we need.
layoutItem->d_func()->sizeHintCacheDirty = true;
+ layoutItem->d_func()->sizeHintWithConstraintCacheDirty = true;
layoutItem = layoutItem->parentLayoutItem();
}
- if (layoutItem)
+ if (layoutItem) {
layoutItem->d_func()->sizeHintCacheDirty = true;
+ layoutItem->d_func()->sizeHintWithConstraintCacheDirty = true;
+ }
bool postIt = layoutItem ? !layoutItem->isLayout() : false;
if (postIt) {
diff --git a/src/gui/graphicsview/qgraphicslayoutitem.cpp b/src/gui/graphicsview/qgraphicslayoutitem.cpp
index b650391..7bdf035 100644
--- a/src/gui/graphicsview/qgraphicslayoutitem.cpp
+++ b/src/gui/graphicsview/qgraphicslayoutitem.cpp
@@ -128,7 +128,7 @@ QGraphicsLayoutItemPrivate::~QGraphicsLayoutItemPrivate()
void QGraphicsLayoutItemPrivate::init()
{
sizeHintCacheDirty = true;
- sizePolicy = QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
+ sizeHintWithConstraintCacheDirty = true;
}
/*!
@@ -394,6 +394,7 @@ QGraphicsLayoutItem::QGraphicsLayoutItem(QGraphicsLayoutItem *parent, bool isLay
{
Q_D(QGraphicsLayoutItem);
d->init();
+ d->sizePolicy = QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
d->q_ptr = this;
}
@@ -404,6 +405,7 @@ QGraphicsLayoutItem::QGraphicsLayoutItem(QGraphicsLayoutItemPrivate &dd)
: d_ptr(&dd)
{
Q_D(QGraphicsLayoutItem);
+ d->init();
d->q_ptr = this;
}
@@ -823,6 +825,7 @@ void QGraphicsLayoutItem::updateGeometry()
{
Q_D(QGraphicsLayoutItem);
d->sizeHintCacheDirty = true;
+ d->sizeHintWithConstraintCacheDirty = true;
}
/*!
diff --git a/src/gui/graphicsview/qgraphicsscene.cpp b/src/gui/graphicsview/qgraphicsscene.cpp
index 19b2cb8..73e5a4e 100644
--- a/src/gui/graphicsview/qgraphicsscene.cpp
+++ b/src/gui/graphicsview/qgraphicsscene.cpp
@@ -4566,13 +4566,13 @@ void QGraphicsScenePrivate::drawItemHelper(QGraphicsItem *item, QPainter *painte
itemCache->exposed.clear();
deviceData->cacheIndent = QPoint();
pix = QPixmap();
- } else {
+ } else if (!viewRect.isNull()) {
allowPartialCacheExposure = deviceData->cacheIndent != QPoint();
}
// Allow partial cache exposure if the device rect isn't fully contained and
// deviceRect is 20% taller or wider than the viewRect.
- if (!allowPartialCacheExposure && !viewRect.contains(deviceRect)) {
+ if (!allowPartialCacheExposure && !viewRect.isNull() && !viewRect.contains(deviceRect)) {
allowPartialCacheExposure = (viewRect.width() * 1.2 < deviceRect.width())
|| (viewRect.height() * 1.2 < deviceRect.height());
}
diff --git a/src/gui/graphicsview/qgraphicsview.cpp b/src/gui/graphicsview/qgraphicsview.cpp
index 73f1493..b2fb22a 100644
--- a/src/gui/graphicsview/qgraphicsview.cpp
+++ b/src/gui/graphicsview/qgraphicsview.cpp
@@ -2493,7 +2493,7 @@ QVariant QGraphicsView::inputMethodQuery(Qt::InputMethodQuery query) const
QVariant value = d->scene->inputMethodQuery(query);
if (value.type() == QVariant::RectF)
- value = mapFromScene(value.toRectF()).boundingRect();
+ value = d->mapRectFromScene(value.toRectF());
else if (value.type() == QVariant::PointF)
value = mapFromScene(value.toPointF());
else if (value.type() == QVariant::Rect)
diff --git a/src/gui/graphicsview/qgridlayoutengine_p.h b/src/gui/graphicsview/qgridlayoutengine_p.h
index 1016bc8..c4b9958 100644
--- a/src/gui/graphicsview/qgridlayoutengine_p.h
+++ b/src/gui/graphicsview/qgridlayoutengine_p.h
@@ -434,7 +434,7 @@ private:
// Lazily computed from the above user input
mutable int q_cachedEffectiveFirstRows[NOrientations];
mutable int q_cachedEffectiveLastRows[NOrientations];
- mutable quint8 q_cachedConstraintOrientation : 2;
+ mutable quint8 q_cachedConstraintOrientation : 3;
// Layout item input
mutable QLayoutStyleInfo q_cachedDataForStyleInfo;
diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp
index 1ac1cd8..556a6d7 100644
--- a/src/gui/image/qimage.cpp
+++ b/src/gui/image/qimage.cpp
@@ -139,42 +139,6 @@ QImageData::QImageData()
{
}
-static int depthForFormat(QImage::Format format)
-{
- int depth = 0;
- switch(format) {
- case QImage::Format_Invalid:
- case QImage::NImageFormats:
- Q_ASSERT(false);
- case QImage::Format_Mono:
- case QImage::Format_MonoLSB:
- depth = 1;
- break;
- case QImage::Format_Indexed8:
- depth = 8;
- break;
- case QImage::Format_RGB32:
- case QImage::Format_ARGB32:
- case QImage::Format_ARGB32_Premultiplied:
- depth = 32;
- break;
- case QImage::Format_RGB555:
- case QImage::Format_RGB16:
- case QImage::Format_RGB444:
- case QImage::Format_ARGB4444_Premultiplied:
- depth = 16;
- break;
- case QImage::Format_RGB666:
- case QImage::Format_ARGB6666_Premultiplied:
- case QImage::Format_ARGB8565_Premultiplied:
- case QImage::Format_ARGB8555_Premultiplied:
- case QImage::Format_RGB888:
- depth = 24;
- break;
- }
- return depth;
-}
-
/*! \fn QImageData * QImageData::create(const QSize &size, QImage::Format format, int numColors)
\internal
@@ -195,7 +159,7 @@ QImageData * QImageData::create(const QSize &size, QImage::Format format, int nu
uint width = size.width();
uint height = size.height();
- uint depth = depthForFormat(format);
+ uint depth = qt_depthForFormat(format);
switch (format) {
case QImage::Format_Mono:
@@ -871,7 +835,7 @@ QImageData *QImageData::create(uchar *data, int width, int height, int bpl, QIm
return 0;
}
- const int depth = depthForFormat(format);
+ const int depth = qt_depthForFormat(format);
const int calc_bytes_per_line = ((width * depth + 31)/32) * 4;
const int min_bytes_per_line = (width * depth + 7)/8;
@@ -1121,9 +1085,14 @@ QImage::QImage(const char * const xpm[])
QImage::QImage(const QImage &image)
: QPaintDevice()
{
- d = image.d;
- if (d)
- d->ref.ref();
+ if (image.paintingActive()) {
+ d = 0;
+ operator=(image.copy());
+ } else {
+ d = image.d;
+ if (d)
+ d->ref.ref();
+ }
}
#ifdef QT3_SUPPORT
@@ -1320,11 +1289,15 @@ QImage::~QImage()
QImage &QImage::operator=(const QImage &image)
{
- if (image.d)
- image.d->ref.ref();
- if (d && !d->ref.deref())
- delete d;
- d = image.d;
+ if (image.paintingActive()) {
+ operator=(image.copy());
+ } else {
+ if (image.d)
+ image.d->ref.ref();
+ if (d && !d->ref.deref())
+ delete d;
+ d = image.d;
+ }
return *this;
}
@@ -2054,11 +2027,11 @@ void QImage::fill(Qt::GlobalColor color)
Fills the entire image with the given \a color.
If the depth of the image is 1, the image will be filled with 1 if
- \a color equals Qt::color0; it will otherwise be filled with 0.
+ \a color equals Qt::color1; it will otherwise be filled with 0.
If the depth of the image is 8, the image will be filled with the
index corresponding the \a color in the color table if present; it
- will otherwise be filled with 0.|
+ will otherwise be filled with 0.
\since 4.8
*/
@@ -6341,7 +6314,7 @@ int QImage::bitPlaneCount() const
bpc = 12;
break;
default:
- bpc = depthForFormat(d->format);
+ bpc = qt_depthForFormat(d->format);
break;
}
return bpc;
diff --git a/src/gui/image/qimage_p.h b/src/gui/image/qimage_p.h
index c53a7ac..64af0a6 100644
--- a/src/gui/image/qimage_p.h
+++ b/src/gui/image/qimage_p.h
@@ -113,6 +113,42 @@ struct Q_GUI_EXPORT QImageData { // internal image data
void qInitImageConversions();
Q_GUI_EXPORT void qGamma_correct_back_to_linear_cs(QImage *image);
+inline int qt_depthForFormat(QImage::Format format)
+{
+ int depth = 0;
+ switch(format) {
+ case QImage::Format_Invalid:
+ case QImage::NImageFormats:
+ Q_ASSERT(false);
+ case QImage::Format_Mono:
+ case QImage::Format_MonoLSB:
+ depth = 1;
+ break;
+ case QImage::Format_Indexed8:
+ depth = 8;
+ break;
+ case QImage::Format_RGB32:
+ case QImage::Format_ARGB32:
+ case QImage::Format_ARGB32_Premultiplied:
+ depth = 32;
+ break;
+ case QImage::Format_RGB555:
+ case QImage::Format_RGB16:
+ case QImage::Format_RGB444:
+ case QImage::Format_ARGB4444_Premultiplied:
+ depth = 16;
+ break;
+ case QImage::Format_RGB666:
+ case QImage::Format_ARGB6666_Premultiplied:
+ case QImage::Format_ARGB8565_Premultiplied:
+ case QImage::Format_ARGB8555_Premultiplied:
+ case QImage::Format_RGB888:
+ depth = 24;
+ break;
+ }
+ return depth;
+}
+
QT_END_NAMESPACE
#endif
diff --git a/src/gui/image/qmovie.cpp b/src/gui/image/qmovie.cpp
index 911a2b5..eb139fa 100644
--- a/src/gui/image/qmovie.cpp
+++ b/src/gui/image/qmovie.cpp
@@ -381,10 +381,14 @@ QFrameInfo QMoviePrivate::infoForFrame(int frameNumber)
QPixmap aPixmap = QPixmap::fromImage(anImage);
int aDelay = reader->nextImageDelay();
return QFrameInfo(aPixmap, aDelay);
- } else {
+ } else if (frameNumber != 0) {
// We've read all frames now. Return an end marker
haveReadAll = true;
return QFrameInfo::endMarker();
+ } else {
+ // No readable frames
+ haveReadAll = true;
+ return QFrameInfo();
}
}
diff --git a/src/gui/image/qpixmap.cpp b/src/gui/image/qpixmap.cpp
index 9fd10ae..5cd47c7 100644
--- a/src/gui/image/qpixmap.cpp
+++ b/src/gui/image/qpixmap.cpp
@@ -783,8 +783,8 @@ QBitmap QPixmap::createHeuristicMask(bool clipTight) const
/*!
Creates and returns a mask for this pixmap based on the given \a
maskColor. If the \a mode is Qt::MaskInColor, all pixels matching the
- maskColor will be opaque. If \a mode is Qt::MaskOutColor, all pixels
- matching the maskColor will be transparent.
+ maskColor will be transparent. If \a mode is Qt::MaskOutColor, all pixels
+ matching the maskColor will be opaque.
This function is slow because it involves converting to/from a
QImage.
diff --git a/src/gui/image/qpixmap_raster.cpp b/src/gui/image/qpixmap_raster.cpp
index 53f3559..d34c9c8 100644
--- a/src/gui/image/qpixmap_raster.cpp
+++ b/src/gui/image/qpixmap_raster.cpp
@@ -44,11 +44,13 @@
#include "qpixmap_raster_p.h"
#include "qnativeimage_p.h"
#include "qimage_p.h"
+#include "qpaintengine.h"
#include "qbitmap.h"
#include "qimage.h"
#include <QBuffer>
#include <QImageReader>
+#include <private/qimage_p.h>
#include <private/qsimd_p.h>
#include <private/qwidget_p.h>
#include <private/qdrawhelper_p.h>
@@ -206,7 +208,13 @@ void QRasterPixmapData::fill(const QColor &color)
else
#endif
toFormat = QImage::Format_ARGB32_Premultiplied;
- image = QImage(image.width(), image.height(), toFormat);
+
+ if (!image.isNull() && qt_depthForFormat(image.format()) == qt_depthForFormat(toFormat)) {
+ image.detach();
+ image.d->format = toFormat;
+ } else {
+ image = QImage(image.width(), image.height(), toFormat);
+ }
}
switch (image.format()) {
@@ -302,6 +310,15 @@ bool QRasterPixmapData::hasAlphaChannel() const
QImage QRasterPixmapData::toImage() const
{
+ if (!image.isNull()) {
+ QImageData *data = const_cast<QImage &>(image).data_ptr();
+ if (data->paintEngine && data->paintEngine->isActive()
+ && data->paintEngine->paintDevice() == &image)
+ {
+ return image.copy();
+ }
+ }
+
return image;
}
diff --git a/src/gui/image/qpnghandler.cpp b/src/gui/image/qpnghandler.cpp
index ea62cf8..5ee59c8 100644
--- a/src/gui/image/qpnghandler.cpp
+++ b/src/gui/image/qpnghandler.cpp
@@ -82,6 +82,42 @@ QT_BEGIN_NAMESPACE
Never to grayscale.
*/
+class QPngHandlerPrivate
+{
+public:
+ enum State {
+ Ready,
+ ReadHeader,
+ ReadingEnd,
+ Error
+ };
+
+ QPngHandlerPrivate(QPngHandler *qq)
+ : gamma(0.0), quality(2), png_ptr(0), info_ptr(0),
+ end_info(0), row_pointers(0), state(Ready), q(qq)
+ { }
+
+ float gamma;
+ int quality;
+ QString description;
+ QStringList readTexts;
+
+ png_struct *png_ptr;
+ png_info *info_ptr;
+ png_info *end_info;
+ png_byte **row_pointers;
+
+ bool readPngHeader();
+ bool readPngImage(QImage *image);
+
+ QImage::Format readImageFormat();
+
+ State state;
+
+ QPngHandler *q;
+};
+
+
#if defined(Q_C_CALLBACKS)
extern "C" {
#endif
@@ -118,7 +154,16 @@ private:
static
void CALLBACK_CALL_TYPE iod_read_fn(png_structp png_ptr, png_bytep data, png_size_t length)
{
- QIODevice *in = (QIODevice *)png_get_io_ptr(png_ptr);
+ QPngHandlerPrivate *d = (QPngHandlerPrivate *)png_get_io_ptr(png_ptr);
+ QIODevice *in = d->q->device();
+
+ if (d->state == QPngHandlerPrivate::ReadingEnd && !in->isSequential() && (in->size() - in->pos()) < 4 && length == 4) {
+ // Workaround for certain malformed PNGs that lack the final crc bytes
+ uchar endcrc[4] = { 0xae, 0x42, 0x60, 0x82 };
+ qMemCopy(data, endcrc, 4);
+ in->seek(in->size());
+ return;
+ }
while (length) {
int nr = in->read((char*)data, length);
@@ -314,40 +359,6 @@ static void CALLBACK_CALL_TYPE qt_png_warning(png_structp /*png_ptr*/, png_const
}
#endif
-class QPngHandlerPrivate
-{
-public:
- enum State {
- Ready,
- ReadHeader,
- Error
- };
-
- QPngHandlerPrivate(QPngHandler *qq)
- : gamma(0.0), quality(2), png_ptr(0), info_ptr(0),
- end_info(0), row_pointers(0), state(Ready), q(qq)
- { }
-
- float gamma;
- int quality;
- QString description;
- QStringList readTexts;
-
- png_struct *png_ptr;
- png_info *info_ptr;
- png_info *end_info;
- png_byte **row_pointers;
-
- bool readPngHeader();
- bool readPngImage(QImage *image);
-
- QImage::Format readImageFormat();
-
- State state;
-
- QPngHandler *q;
-};
-
/*!
\internal
*/
@@ -380,7 +391,7 @@ bool Q_INTERNAL_WIN_NO_THROW QPngHandlerPrivate::readPngHeader()
return false;
}
- png_set_read_fn(png_ptr, q->device(), iod_read_fn);
+ png_set_read_fn(png_ptr, this, iod_read_fn);
png_read_info(png_ptr, info_ptr);
#ifndef QT_NO_IMAGE_TEXT
@@ -484,6 +495,7 @@ bool Q_INTERNAL_WIN_NO_THROW QPngHandlerPrivate::readPngImage(QImage *outImage)
for (int i = 0; i < readTexts.size()-1; i+=2)
outImage->setText(readTexts.at(i), readTexts.at(i+1));
+ state = ReadingEnd;
png_read_end(png_ptr, end_info);
png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
delete [] row_pointers;
diff --git a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp
index 4a1b9b9..d48d63d 100644
--- a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp
+++ b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp
@@ -89,7 +89,7 @@ QCoeFepInputContext::QCoeFepInputContext(QObject *parent)
m_fepState->SetFlags(EAknEditorFlagDefault);
m_fepState->SetDefaultInputMode( EAknEditorTextInputMode );
m_fepState->SetPermittedInputModes( EAknEditorAllInputModes );
- m_fepState->SetDefaultCase( EAknEditorLowerCase );
+ m_fepState->SetDefaultCase( EAknEditorTextCase );
m_fepState->SetPermittedCases( EAknEditorAllCaseModes );
m_fepState->SetSpecialCharacterTableResourceId(R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG);
m_fepState->SetNumericKeymap( EAknEditorStandardNumberModeKeymap );
@@ -657,6 +657,8 @@ void QCoeFepInputContext::UpdateFepInlineTextL(const TDesC& aNewInlineText,
if (!w)
return;
+ commitTemporaryPreeditString();
+
m_inlinePosition = aPositionOfInsertionPointInInlineText;
QList<QInputMethodEvent::Attribute> attributes;
@@ -694,6 +696,12 @@ void QCoeFepInputContext::SetInlineEditingCursorVisibilityL(TBool aCursorVisibil
void QCoeFepInputContext::CancelFepInlineEdit()
{
+ // We are not supposed to ever have a tempPreeditString and a real preedit string
+ // from S60 at the same time, so it should be safe to rely on this test to determine
+ // whether we should honor S60's request to clear the text or not.
+ if (m_hasTempPreeditString)
+ return;
+
QList<QInputMethodEvent::Attribute> attributes;
QInputMethodEvent event(QLatin1String(""), attributes);
event.setCommitString(QLatin1String(""), 0, 0);
diff --git a/src/gui/itemviews/qabstractitemview.cpp b/src/gui/itemviews/qabstractitemview.cpp
index 8af6013..1bb43fa 100644
--- a/src/gui/itemviews/qabstractitemview.cpp
+++ b/src/gui/itemviews/qabstractitemview.cpp
@@ -62,6 +62,9 @@
#include <qaccessible.h>
#endif
#include <private/qsoftkeymanager_p.h>
+#ifndef QT_NO_GESTURE
+# include <qscroller.h>
+#endif
QT_BEGIN_NAMESPACE
@@ -191,6 +194,37 @@ void QAbstractItemViewPrivate::checkMouseMove(const QPersistentModelIndex &index
}
}
+// stores and restores the selection and current item when flicking
+void QAbstractItemViewPrivate::_q_scrollerStateChanged()
+{
+ Q_Q(QAbstractItemView);
+
+ if (QScroller *scroller = QScroller::scroller(viewport)) {
+ switch (scroller->state()) {
+ case QScroller::Pressed:
+ // store the current selection in case we start scrolling
+ if (q->selectionModel()) {
+ oldSelection = q->selectionModel()->selection();
+ oldCurrent = q->selectionModel()->currentIndex();
+ }
+ break;
+
+ case QScroller::Dragging:
+ // restore the old selection if we really start scrolling
+ if (q->selectionModel()) {
+ q->selectionModel()->select(oldSelection, QItemSelectionModel::ClearAndSelect);
+ q->selectionModel()->setCurrentIndex(oldCurrent, QItemSelectionModel::NoUpdate);
+ }
+ // fall through
+
+ default:
+ oldSelection = QItemSelection();
+ oldCurrent = QModelIndex();
+ break;
+ }
+ }
+}
+
/*!
\class QAbstractItemView
@@ -596,6 +630,8 @@ QAbstractItemView::QAbstractItemView(QAbstractItemViewPrivate &dd, QWidget *pare
*/
QAbstractItemView::~QAbstractItemView()
{
+ // stop this timer here before ~QObject
+ d_func()->delayedReset.stop();
}
/*!
@@ -828,7 +864,7 @@ QVariant QAbstractItemView::inputMethodQuery(Qt::InputMethodQuery query) const
deleted. QAbstractItemView does not take ownership of \a delegate.
\note If a delegate has been assigned to both a row and a column, the row
- delegate (i.e., this delegate) will take presedence and manage the
+ delegate (i.e., this delegate) will take precedence and manage the
intersecting cell index.
\warning You should not share the same instance of a delegate between views.
@@ -886,7 +922,7 @@ QAbstractItemDelegate *QAbstractItemView::itemDelegateForRow(int row) const
deleted. QAbstractItemView does not take ownership of \a delegate.
\note If a delegate has been assigned to both a row and a column, the row
- delegate will take presedence and manage the intersecting cell index.
+ delegate will take precedence and manage the intersecting cell index.
\warning You should not share the same instance of a delegate between views.
Doing so can cause incorrect or unintuitive editing behavior since each
@@ -1616,6 +1652,11 @@ bool QAbstractItemView::viewportEvent(QEvent *event)
case QEvent::WindowDeactivate:
d->viewport->update();
break;
+ case QEvent::ScrollPrepare:
+ executeDelayedItemsLayout();
+ connect(QScroller::scroller(d->viewport), SIGNAL(stateChanged(QScroller::State)), this, SLOT(_q_scrollerStateChanged()), Qt::UniqueConnection);
+ break;
+
default:
break;
}
diff --git a/src/gui/itemviews/qabstractitemview.h b/src/gui/itemviews/qabstractitemview.h
index 0f86f62..6f7db09 100644
--- a/src/gui/itemviews/qabstractitemview.h
+++ b/src/gui/itemviews/qabstractitemview.h
@@ -359,6 +359,7 @@ private:
Q_PRIVATE_SLOT(d_func(), void _q_modelDestroyed())
Q_PRIVATE_SLOT(d_func(), void _q_layoutChanged())
Q_PRIVATE_SLOT(d_func(), void _q_headerDataChanged())
+ Q_PRIVATE_SLOT(d_func(), void _q_scrollerStateChanged())
friend class QTreeViewPrivate; // needed to compile with MSVC
friend class QAccessibleItemRow;
diff --git a/src/gui/itemviews/qabstractitemview_p.h b/src/gui/itemviews/qabstractitemview_p.h
index 03b413a..be20dce 100644
--- a/src/gui/itemviews/qabstractitemview_p.h
+++ b/src/gui/itemviews/qabstractitemview_p.h
@@ -114,6 +114,7 @@ public:
virtual void _q_modelDestroyed();
virtual void _q_layoutChanged();
void _q_headerDataChanged() { doDelayedItemsLayout(); }
+ void _q_scrollerStateChanged();
void fetchMore();
@@ -414,6 +415,12 @@ public:
QAbstractItemView::ScrollMode verticalScrollMode;
QAbstractItemView::ScrollMode horizontalScrollMode;
+#ifndef QT_NO_GESTURES
+ // the selection before the last mouse down. In case we have to restore it for scrolling
+ QItemSelection oldSelection;
+ QModelIndex oldCurrent;
+#endif
+
bool currentIndexSet;
bool wrapItemText;
diff --git a/src/gui/itemviews/qfileiconprovider.cpp b/src/gui/itemviews/qfileiconprovider.cpp
index 4748f89..570c0ab 100644
--- a/src/gui/itemviews/qfileiconprovider.cpp
+++ b/src/gui/itemviews/qfileiconprovider.cpp
@@ -234,7 +234,7 @@ QIcon QFileIconProviderPrivate::getWinIcon(const QFileInfo &fileInfo) const
const QString fileExtension = QLatin1Char('.') + fileInfo.suffix().toUpper();
QString key;
- if (fileInfo.isFile() && !fileInfo.isExecutable() && !fileInfo.isSymLink())
+ if (fileInfo.isFile() && !fileInfo.isExecutable() && !fileInfo.isSymLink() && fileExtension != QLatin1String(".ICO"))
key = QLatin1String("qt_") + fileExtension;
QPixmap pixmap;
diff --git a/src/gui/itemviews/qsortfilterproxymodel.cpp b/src/gui/itemviews/qsortfilterproxymodel.cpp
index fe866e5..904a0c5 100644
--- a/src/gui/itemviews/qsortfilterproxymodel.cpp
+++ b/src/gui/itemviews/qsortfilterproxymodel.cpp
@@ -784,14 +784,14 @@ void QSortFilterProxyModelPrivate::source_items_inserted(
if (orthogonal_source_to_proxy.isEmpty()) {
const int ortho_end = (orient == Qt::Horizontal) ? model->rowCount(source_parent) : model->columnCount(source_parent);
+ orthogonal_source_to_proxy.resize(ortho_end);
+
for (int ortho_item = 0; ortho_item < ortho_end; ++ortho_item) {
if ((orient == Qt::Horizontal) ? q->filterAcceptsRow(ortho_item, source_parent)
: q->filterAcceptsColumn(ortho_item, source_parent)) {
orthogonal_proxy_to_source.append(ortho_item);
}
}
- orthogonal_source_to_proxy.resize(orthogonal_proxy_to_source.size());
-
if (orient == Qt::Horizontal) {
// We're reacting to columnsInserted, but we've just inserted new rows. Sort them.
sort_source_rows(orthogonal_proxy_to_source, source_parent);
diff --git a/src/gui/itemviews/qstandarditemmodel.cpp b/src/gui/itemviews/qstandarditemmodel.cpp
index 767b5a9..7d20bbb 100644
--- a/src/gui/itemviews/qstandarditemmodel.cpp
+++ b/src/gui/itemviews/qstandarditemmodel.cpp
@@ -1130,7 +1130,7 @@ Qt::ItemFlags QStandardItem::flags() const
meaning that the user can interact with the item; if \a enabled is false, the
user cannot interact with the item.
- This flag takes presedence over the other item flags; e.g. if an item is not
+ This flag takes precedence over the other item flags; e.g. if an item is not
enabled, it cannot be selected by the user, even if the Qt::ItemIsSelectable
flag has been set.
diff --git a/src/gui/kernel/qapplication.cpp b/src/gui/kernel/qapplication.cpp
index 833e803..de84966 100644
--- a/src/gui/kernel/qapplication.cpp
+++ b/src/gui/kernel/qapplication.cpp
@@ -807,7 +807,6 @@ void QApplicationPrivate::construct(
)
{
initResources();
- graphics_system_name = QLatin1String(qgetenv("QT_DEFAULT_GRAPHICS_SYSTEM"));
qt_is_gui_used = (qt_appType != QApplication::Tty);
process_cmdline();
@@ -1104,6 +1103,9 @@ QApplication::~QApplication()
QApplicationPrivate::is_app_closing = true;
QApplicationPrivate::is_app_running = false;
+ delete QWidgetPrivate::mapper;
+ QWidgetPrivate::mapper = 0;
+
// delete all widgets
if (QWidgetPrivate::allWidgets) {
QWidgetSet *mySet = QWidgetPrivate::allWidgets;
@@ -1133,9 +1135,6 @@ QApplication::~QApplication()
delete d->ignore_cursor; d->ignore_cursor = 0;
#endif
- delete QWidgetPrivate::mapper;
- QWidgetPrivate::mapper = 0;
-
delete QApplicationPrivate::app_pal;
QApplicationPrivate::app_pal = 0;
delete QApplicationPrivate::sys_pal;
diff --git a/src/gui/kernel/qapplication_s60.cpp b/src/gui/kernel/qapplication_s60.cpp
index f352871..7f157a1 100644
--- a/src/gui/kernel/qapplication_s60.cpp
+++ b/src/gui/kernel/qapplication_s60.cpp
@@ -667,9 +667,6 @@ void QSymbianControl::HandleStatusPaneSizeChange()
{
QS60MainAppUi *s60AppUi = static_cast<QS60MainAppUi *>(S60->appUi());
s60AppUi->HandleStatusPaneSizeChange();
- // Send resize event to trigger desktopwidget workAreaResized signal
- QResizeEvent e(qt_desktopWidget->size(), qt_desktopWidget->size());
- QApplication::sendEvent(qt_desktopWidget, &e);
}
#endif
@@ -1074,6 +1071,14 @@ void QSymbianControl::Draw(const TRect& controlRect) const
Q_ASSERT(topExtra);
if (!topExtra->inExpose) {
topExtra->inExpose = true;
+ if (!qwidget->isWindow()) {
+ // If we get here, then it means we have a native child window
+ // Since no content should ever be painted to these windows, we
+ // erase them with a transparent brush when they get an expose.
+ CWindowGc &gc = SystemGc();
+ gc.SetBrushColor(TRgb(0, 0, 0, 0));
+ gc.Clear(controlRect);
+ }
QRect exposeRect = qt_TRect2QRect(controlRect);
qwidget->d_func()->syncBackingStore(exposeRect);
topExtra->inExpose = false;
@@ -1177,8 +1182,10 @@ void QSymbianControl::SizeChanged()
if (!slowResize && tlwExtra)
tlwExtra->inTopLevelResize = false;
} else {
- QResizeEvent *e = new QResizeEvent(newSize, oldSize);
- QApplication::postEvent(qwidget, e);
+ if (!qwidget->testAttribute(Qt::WA_PendingResizeEvent)) {
+ QResizeEvent *e = new QResizeEvent(newSize, oldSize);
+ QApplication::postEvent(qwidget, e);
+ }
}
}
@@ -1310,6 +1317,9 @@ void QSymbianControl::HandleResourceChange(int resourceType)
case KEikDynamicLayoutVariantSwitch:
{
handleClientAreaChange();
+ // Send resize event to trigger desktopwidget workAreaResized signal
+ QResizeEvent e(qt_desktopWidget->size(), qt_desktopWidget->size());
+ QApplication::sendEvent(qt_desktopWidget, &e);
break;
}
#endif
@@ -1614,6 +1624,9 @@ extern void qt_cleanup_symbianFontDatabaseExtras(); // qfontdatabase_s60.cpp
*****************************************************************************/
void qt_cleanup()
{
+#ifdef Q_WS_S60
+ S60->setButtonGroupContainer(0);
+#endif
if(qt_S60Beep) {
delete qt_S60Beep;
qt_S60Beep = 0;
@@ -1633,6 +1646,13 @@ void qt_cleanup()
//Change mouse pointer back
S60->wsSession().SetPointerCursorMode(EPointerCursorNone);
+#ifdef Q_WS_S60
+ // Clear CBA
+ CEikonEnv::Static()->AppUiFactory()->SwapButtonGroup(0);
+ delete S60->buttonGroupContainer();
+ S60->setButtonGroupContainer(0);
+#endif
+
if (S60->qtOwnsS60Environment) {
// Restore the S60 framework trap handler. See qt_init().
User::SetTrapHandler(S60->s60InstalledTrapHandler);
diff --git a/src/gui/kernel/qapplication_x11.cpp b/src/gui/kernel/qapplication_x11.cpp
index ff98229..58ccda2 100644
--- a/src/gui/kernel/qapplication_x11.cpp
+++ b/src/gui/kernel/qapplication_x11.cpp
@@ -2015,12 +2015,15 @@ void qt_init(QApplicationPrivate *priv, int,
(PtrXRRRootToScreen) xrandrLib.resolve("XRRRootToScreen");
X11->ptrXRRQueryExtension =
(PtrXRRQueryExtension) xrandrLib.resolve("XRRQueryExtension");
+ X11->ptrXRRSizes =
+ (PtrXRRSizes) xrandrLib.resolve("XRRSizes");
}
# else
X11->ptrXRRSelectInput = XRRSelectInput;
X11->ptrXRRUpdateConfiguration = XRRUpdateConfiguration;
X11->ptrXRRRootToScreen = XRRRootToScreen;
X11->ptrXRRQueryExtension = XRRQueryExtension;
+ X11->ptrXRRSizes = XRRSizes;
# endif
if (X11->ptrXRRQueryExtension
diff --git a/src/gui/kernel/qcocoasharedwindowmethods_mac_p.h b/src/gui/kernel/qcocoasharedwindowmethods_mac_p.h
index efe045c..60cdfb9 100644
--- a/src/gui/kernel/qcocoasharedwindowmethods_mac_p.h
+++ b/src/gui/kernel/qcocoasharedwindowmethods_mac_p.h
@@ -161,7 +161,7 @@ QT_END_NAMESPACE
bool handled = false;
// sometimes need to redirect mouse events to the popup.
QWidget *popup = qAppInstance()->activePopupWidget();
- if (popup) {
+ if (popup && popup != widget) {
switch([event type])
{
case NSLeftMouseDown:
diff --git a/src/gui/kernel/qevent.cpp b/src/gui/kernel/qevent.cpp
index 5633cb8..422aeeb 100644
--- a/src/gui/kernel/qevent.cpp
+++ b/src/gui/kernel/qevent.cpp
@@ -4568,4 +4568,223 @@ const QGestureEventPrivate *QGestureEvent::d_func() const
#endif // QT_NO_GESTURES
+/*!
+ \class QScrollPrepareEvent
+ \since 4.8
+ \ingroup events
+
+ \brief The QScrollPrepareEvent class is send in preparation of a scrolling.
+
+ The scroll prepare event is send before scrolling (usually by QScroller) is started.
+ The object receiving this event should set viewportSize, maxContentPos and contentPos.
+ It also should accept this event to indicate that scrolling should be started.
+
+ It is not guaranteed that a QScrollEvent will be send after an acceepted
+ QScrollPrepareEvent, e.g. in a case where the maximum content position is (0,0).
+
+ \sa QScrollEvent, QScroller
+*/
+
+/*!
+ Creates new QScrollPrepareEvent
+ The \a startPos is the position of a touch or mouse event that started the scrolling.
+*/
+QScrollPrepareEvent::QScrollPrepareEvent(const QPointF &startPos)
+ : QEvent(QEvent::ScrollPrepare)
+{
+ d = reinterpret_cast<QEventPrivate *>(new QScrollPrepareEventPrivate());
+ d_func()->startPos = startPos;
+}
+
+/*!
+ Destroys QScrollEvent.
+*/
+QScrollPrepareEvent::~QScrollPrepareEvent()
+{
+ delete reinterpret_cast<QScrollPrepareEventPrivate *>(d);
+}
+
+/*!
+ Returns the position of the touch or mouse event that started the scrolling.
+*/
+QPointF QScrollPrepareEvent::startPos() const
+{
+ return d_func()->startPos;
+}
+
+/*!
+ Returns size of the area that is to be scrolled as set by setViewportSize
+
+ \sa setViewportSize()
+*/
+QSizeF QScrollPrepareEvent::viewportSize() const
+{
+ return d_func()->viewportSize;
+}
+
+/*!
+ Returns the range of coordinates for the content as set by setContentPosRange().
+*/
+QRectF QScrollPrepareEvent::contentPosRange() const
+{
+ return d_func()->contentPosRange;
+}
+
+/*!
+ Returns the current position of the content as set by setContentPos.
+*/
+QPointF QScrollPrepareEvent::contentPos() const
+{
+ return d_func()->contentPos;
+}
+
+
+/*!
+ Sets the size of the area that is to be scrolled to \a size.
+
+ \sa viewportSize()
+*/
+void QScrollPrepareEvent::setViewportSize(const QSizeF &size)
+{
+ d_func()->viewportSize = size;
+}
+
+/*!
+ Sets the range of content coordinates to \a rect.
+
+ \sa contentPosRange()
+*/
+void QScrollPrepareEvent::setContentPosRange(const QRectF &rect)
+{
+ d_func()->contentPosRange = rect;
+}
+
+/*!
+ Sets the current content position to \a pos.
+
+ \sa contentPos()
+*/
+void QScrollPrepareEvent::setContentPos(const QPointF &pos)
+{
+ d_func()->contentPos = pos;
+}
+
+
+/*!
+ \internal
+*/
+QScrollPrepareEventPrivate *QScrollPrepareEvent::d_func()
+{
+ return reinterpret_cast<QScrollPrepareEventPrivate *>(d);
+}
+
+/*!
+ \internal
+*/
+const QScrollPrepareEventPrivate *QScrollPrepareEvent::d_func() const
+{
+ return reinterpret_cast<const QScrollPrepareEventPrivate *>(d);
+}
+
+/*!
+ \class QScrollEvent
+ \since 4.8
+ \ingroup events
+
+ \brief The QScrollEvent class is send when scrolling.
+
+ The scroll event is send to indicate that the receiver should be scrolled.
+ Usually the receiver should be something visual like QWidget or QGraphicsObject.
+
+ Some care should be taken that no conflicting QScrollEvents are sent from two
+ sources. Using QScroller::scrollTo is save however.
+
+ \sa QScrollPrepareEvent, QScroller
+*/
+
+/*!
+ \enum QScrollEvent::ScrollState
+
+ This enum describes the states a scroll event can have.
+
+ \value ScrollStarted Set for the first scroll event of a scroll activity.
+
+ \value ScrollUpdated Set for all but the first and the last scroll event of a scroll activity.
+
+ \value ScrollFinished Set for the last scroll event of a scroll activity.
+
+ \sa QScrollEvent::scrollState()
+*/
+
+/*!
+ Creates a new QScrollEvent
+ \a contentPos is the new content position, \a overshootDistance is the
+ new overshoot distance while \a scrollState indicates if this scroll
+ event is the first one, the last one or some event in between.
+*/
+QScrollEvent::QScrollEvent(const QPointF &contentPos, const QPointF &overshootDistance, ScrollState scrollState)
+ : QEvent(QEvent::Scroll)
+{
+ d = reinterpret_cast<QEventPrivate *>(new QScrollEventPrivate());
+ d_func()->contentPos = contentPos;
+ d_func()->overshoot= overshootDistance;
+ d_func()->state = scrollState;
+}
+
+/*!
+ Destroys QScrollEvent.
+*/
+QScrollEvent::~QScrollEvent()
+{
+ delete reinterpret_cast<QScrollEventPrivate *>(d);
+}
+
+/*!
+ Returns the new scroll position.
+*/
+QPointF QScrollEvent::contentPos() const
+{
+ return d_func()->contentPos;
+}
+
+/*!
+ Returns the new overshoot distance.
+ See QScroller for an explanation of the term overshoot.
+
+ \sa QScroller
+*/
+QPointF QScrollEvent::overshootDistance() const
+{
+ return d_func()->overshoot;
+}
+
+/*!
+ Returns the current scroll state as a combination of ScrollStateFlag values.
+ ScrollStarted (or ScrollFinished) will be set, if this scroll event is the first (or last) event in a scrolling activity.
+ Please note that both values can be set at the same time, if the activity consists of a single QScrollEvent.
+ All other scroll events in between will have their state set to ScrollUpdated.
+
+ A widget could for example revert selections when scrolling is started and stopped.
+*/
+QScrollEvent::ScrollState QScrollEvent::scrollState() const
+{
+ return d_func()->state;
+}
+
+/*!
+ \internal
+*/
+QScrollEventPrivate *QScrollEvent::d_func()
+{
+ return reinterpret_cast<QScrollEventPrivate *>(d);
+}
+
+/*!
+ \internal
+*/
+const QScrollEventPrivate *QScrollEvent::d_func() const
+{
+ return reinterpret_cast<const QScrollEventPrivate *>(d);
+}
+
QT_END_NAMESPACE
diff --git a/src/gui/kernel/qevent.h b/src/gui/kernel/qevent.h
index 9c70c02..6c0076d 100644
--- a/src/gui/kernel/qevent.h
+++ b/src/gui/kernel/qevent.h
@@ -880,6 +880,52 @@ private:
};
#endif // QT_NO_GESTURES
+class QScrollPrepareEventPrivate;
+class Q_GUI_EXPORT QScrollPrepareEvent : public QEvent
+{
+public:
+ QScrollPrepareEvent(const QPointF &startPos);
+ ~QScrollPrepareEvent();
+
+ QPointF startPos() const;
+
+ QSizeF viewportSize() const;
+ QRectF contentPosRange() const;
+ QPointF contentPos() const;
+
+ void setViewportSize(const QSizeF &size);
+ void setContentPosRange(const QRectF &rect);
+ void setContentPos(const QPointF &pos);
+
+private:
+ QScrollPrepareEventPrivate *d_func();
+ const QScrollPrepareEventPrivate *d_func() const;
+};
+
+
+class QScrollEventPrivate;
+class Q_GUI_EXPORT QScrollEvent : public QEvent
+{
+public:
+ enum ScrollState
+ {
+ ScrollStarted,
+ ScrollUpdated,
+ ScrollFinished
+ };
+
+ QScrollEvent(const QPointF &contentPos, const QPointF &overshoot, ScrollState scrollState);
+ ~QScrollEvent();
+
+ QPointF contentPos() const;
+ QPointF overshootDistance() const;
+ ScrollState scrollState() const;
+
+private:
+ QScrollEventPrivate *d_func();
+ const QScrollEventPrivate *d_func() const;
+};
+
QT_END_NAMESPACE
QT_END_HEADER
diff --git a/src/gui/kernel/qevent_p.h b/src/gui/kernel/qevent_p.h
index e323aa9..02f41e7 100644
--- a/src/gui/kernel/qevent_p.h
+++ b/src/gui/kernel/qevent_p.h
@@ -178,6 +178,34 @@ public:
QUrl url;
};
+
+class QScrollPrepareEventPrivate
+{
+public:
+ inline QScrollPrepareEventPrivate()
+ : target(0)
+ {
+ }
+
+ QObject* target;
+ QPointF startPos;
+ QSizeF viewportSize;
+ QRectF contentPosRange;
+ QPointF contentPos;
+};
+
+class QScrollEventPrivate
+{
+public:
+ inline QScrollEventPrivate()
+ {
+ }
+
+ QPointF contentPos;
+ QPointF overshoot;
+ QScrollEvent::ScrollState state;
+};
+
QT_END_NAMESPACE
#endif // QEVENT_P_H
diff --git a/src/gui/kernel/qeventdispatcher_mac.mm b/src/gui/kernel/qeventdispatcher_mac.mm
index 515c6d3..dc926e0 100644
--- a/src/gui/kernel/qeventdispatcher_mac.mm
+++ b/src/gui/kernel/qeventdispatcher_mac.mm
@@ -844,7 +844,7 @@ static void setChildrenWorksWhenModal(QWidget *widget, bool worksWhenModal)
NSWindow *window = qt_mac_window_for(dialogs[i]);
if (window && [window isKindOfClass:[NSPanel class]]) {
[static_cast<NSPanel *>(window) setWorksWhenModal:worksWhenModal];
- if (worksWhenModal && dialogs[i]->isVisible()){
+ if (worksWhenModal && [window isVisible]){
[window orderFront:window];
}
}
@@ -856,6 +856,7 @@ void QEventDispatcherMacPrivate::updateChildrenWorksWhenModal()
// Make the dialog children of the widget
// active. And make the dialog children of
// the previous modal dialog unactive again:
+ QMacCocoaAutoReleasePool pool;
int size = cocoaModalSessionStack.size();
if (size > 0){
if (QWidget *prevModal = cocoaModalSessionStack[size-1].widget)
diff --git a/src/gui/kernel/qeventdispatcher_s60_p.h b/src/gui/kernel/qeventdispatcher_s60_p.h
index c14fef0..539a21c 100644
--- a/src/gui/kernel/qeventdispatcher_s60_p.h
+++ b/src/gui/kernel/qeventdispatcher_s60_p.h
@@ -75,6 +75,13 @@ public:
void complete();
private:
+ // Workaround for a BC break from S60 3.2 -> 5.0, where the CEikonEnv override was removed.
+ // To avoid linking to that when we build against 3.2, define an empty body here.
+ // Reserved_*() have been verified to be empty in the S60 code.
+ void Reserved_1() {}
+ void Reserved_2() {}
+
+private:
int m_lastIterationCount;
TInt m_savedStatusCode;
bool m_hasAlreadyRun;
diff --git a/src/gui/kernel/qplatformwindow_qpa.h b/src/gui/kernel/qplatformwindow_qpa.h
index 90bc1cb..4f6fedc 100644
--- a/src/gui/kernel/qplatformwindow_qpa.h
+++ b/src/gui/kernel/qplatformwindow_qpa.h
@@ -60,7 +60,7 @@ class QPlatformGLContext;
class Q_GUI_EXPORT QPlatformWindow
{
- Q_DECLARE_PRIVATE(QPlatformWindow);
+ Q_DECLARE_PRIVATE(QPlatformWindow)
public:
QPlatformWindow(QWidget *tlw);
virtual ~QPlatformWindow();
@@ -85,7 +85,7 @@ public:
protected:
QScopedPointer<QPlatformWindowPrivate> d_ptr;
private:
- Q_DISABLE_COPY(QPlatformWindow);
+ Q_DISABLE_COPY(QPlatformWindow)
};
QT_END_NAMESPACE
diff --git a/src/gui/kernel/qt_x11_p.h b/src/gui/kernel/qt_x11_p.h
index 56c8094..d97264c 100644
--- a/src/gui/kernel/qt_x11_p.h
+++ b/src/gui/kernel/qt_x11_p.h
@@ -226,6 +226,7 @@ typedef void (*PtrXRRSelectInput)(Display *, Window, int);
typedef int (*PtrXRRUpdateConfiguration)(XEvent *);
typedef int (*PtrXRRRootToScreen)(Display *, Window);
typedef Bool (*PtrXRRQueryExtension)(Display *, int *, int *);
+typedef XRRScreenSize *(*PtrXRRSizes)(Display *, int, int *);
#endif // QT_NO_XRANDR
#ifndef QT_NO_XINPUT
@@ -710,6 +711,7 @@ struct QX11Data
PtrXRRUpdateConfiguration ptrXRRUpdateConfiguration;
PtrXRRRootToScreen ptrXRRRootToScreen;
PtrXRRQueryExtension ptrXRRQueryExtension;
+ PtrXRRSizes ptrXRRSizes;
#endif // QT_NO_XRANDR
};
diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm
index bcddae5..059140e 100644
--- a/src/gui/kernel/qwidget_mac.mm
+++ b/src/gui/kernel/qwidget_mac.mm
@@ -2825,23 +2825,31 @@ void QWidgetPrivate::setSubWindowStacking(bool set)
if (NSWindow *pwin = [qt_mac_nativeview_for(parent) window]) {
if (set) {
Qt::WindowType ptype = parent->window()->windowType();
- if ([pwin isVisible] && (ptype == Qt::Window || ptype == Qt::Dialog) && ![qwin parentWindow])
+ if ([pwin isVisible] && (ptype == Qt::Window || ptype == Qt::Dialog) && ![qwin parentWindow]) {
+ NSInteger level = [qwin level];
[pwin addChildWindow:qwin ordered:NSWindowAbove];
+ if ([qwin level] < level)
+ [qwin setLevel:level];
+ }
} else {
[pwin removeChildWindow:qwin];
}
}
}
- QList<QWidget *> widgets = q->findChildren<QWidget *>();
+ QObjectList widgets = q->children();
for (int i=0; i<widgets.size(); ++i) {
- QWidget *child = widgets.at(i);
+ QWidget *child = qobject_cast<QWidget *>(widgets.at(i));
if (child && child->isWindow()) {
if (NSWindow *cwin = [qt_mac_nativeview_for(child) window]) {
if (set) {
Qt::WindowType ctype = child->window()->windowType();
- if ([cwin isVisible] && (ctype == Qt::Window || ctype == Qt::Dialog) && ![cwin parentWindow])
+ if ([cwin isVisible] && (ctype == Qt::Window || ctype == Qt::Dialog) && ![cwin parentWindow]) {
+ NSInteger level = [cwin level];
[qwin addChildWindow:cwin ordered:NSWindowAbove];
+ if ([cwin level] < level)
+ [cwin setLevel:level];
+ }
} else {
[qwin removeChildWindow:qt_mac_window_for(child)];
}
diff --git a/src/gui/kernel/qwidget_s60.cpp b/src/gui/kernel/qwidget_s60.cpp
index 13b48e9..9543792 100644
--- a/src/gui/kernel/qwidget_s60.cpp
+++ b/src/gui/kernel/qwidget_s60.cpp
@@ -508,7 +508,7 @@ void QWidgetPrivate::show_sys()
CEikButtonGroupContainer *cba = CEikButtonGroupContainer::NewL(CEikButtonGroupContainer::ECba,
CEikButtonGroupContainer::EHorizontal,ui,R_AVKON_SOFTKEYS_EMPTY_WITH_IDS);
- CEikButtonGroupContainer *oldCba = CEikonEnv::Static()->AppUiFactory()->SwapButtonGroup(cba);
+ CEikButtonGroupContainer *oldCba = factory->SwapButtonGroup(cba);
Q_ASSERT(!oldCba);
S60->setButtonGroupContainer(cba);
@@ -517,7 +517,7 @@ void QWidgetPrivate::show_sys()
menuBar->SetMenuType(CEikMenuBar::EMenuOptions);
S60->appUi()->AddToStackL(menuBar,ECoeStackPriorityMenu,ECoeStackFlagRefusesFocus);
- CEikMenuBar *oldMenu = CEikonEnv::Static()->AppUiFactory()->SwapMenuBar(menuBar);
+ CEikMenuBar *oldMenu = factory->SwapMenuBar(menuBar);
Q_ASSERT(!oldMenu);
)
diff --git a/src/gui/kernel/qwidget_x11.cpp b/src/gui/kernel/qwidget_x11.cpp
index 9085e98..ff6f215 100644
--- a/src/gui/kernel/qwidget_x11.cpp
+++ b/src/gui/kernel/qwidget_x11.cpp
@@ -905,8 +905,17 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO
inputContext->setFocusWidget(q);
}
- if (destroyw)
+ if (destroyw) {
qt_XDestroyWindow(q, dpy, destroyw);
+ if (QTLWExtra *topData = maybeTopData()) {
+#ifndef QT_NO_XSYNC
+ if (topData->syncUpdateCounter)
+ XSyncDestroyCounter(dpy, topData->syncUpdateCounter);
+#endif
+ // we destroyed our old window - reset the top-level state
+ createTLSysExtra();
+ }
+ }
// newly created windows are positioned at the window system's
// (0,0) position. If the parent uses wrect mapping to expand the
diff --git a/src/gui/kernel/qx11embed_x11.cpp b/src/gui/kernel/qx11embed_x11.cpp
index e6e3bfb..f2f95d3 100644
--- a/src/gui/kernel/qx11embed_x11.cpp
+++ b/src/gui/kernel/qx11embed_x11.cpp
@@ -512,7 +512,7 @@ QX11EmbedWidget::~QX11EmbedWidget()
<< "from container with winId" << d->container;
#endif
XUnmapWindow(x11Info().display(), internalWinId());
- XReparentWindow(x11Info().display(), internalWinId(), x11Info().appRootWindow(), 0, 0);
+ XReparentWindow(x11Info().display(), internalWinId(), x11Info().appRootWindow(x11Info().screen()), 0, 0);
}
#ifdef QX11EMBED_DEBUG
@@ -791,13 +791,13 @@ bool QX11EmbedWidget::x11Event(XEvent *event)
qDebug() << "QX11EmbedWidget::x11Event: client"
<< (void *)this << "with winId" << winId()
<< "received a ReparentNotify to"
- << ((event->xreparent.parent == x11Info().appRootWindow())
+ << ((event->xreparent.parent == x11Info().appRootWindow(x11Info().screen()))
? QString::fromLatin1("root") : QString::number(event->xreparent.parent));
#endif
// If the container shuts down, we will be reparented to the
// root window. We must also consider the case that we may be
// reparented from one container to another.
- if (event->xreparent.parent == x11Info().appRootWindow()) {
+ if (event->xreparent.parent == x11Info().appRootWindow(x11Info().screen())) {
if (((QHackWidget *)this)->topData()->embedded) {
d->container = 0;
emit containerClosed();
@@ -1115,7 +1115,7 @@ QX11EmbedContainer::~QX11EmbedContainer()
Q_D(QX11EmbedContainer);
if (d->client) {
XUnmapWindow(x11Info().display(), d->client);
- XReparentWindow(x11Info().display(), d->client, x11Info().appRootWindow(), 0, 0);
+ XReparentWindow(x11Info().display(), d->client, x11Info().appRootWindow(x11Info().screen()), 0, 0);
}
if (d->xgrab)
@@ -1379,7 +1379,7 @@ bool QX11EmbedContainer::eventFilter(QObject *o, QEvent *event)
// Wait until the messages have been processed. Then ask
// the window manager to delete the window.
XUnmapWindow(x11Info().display(), d->client);
- XReparentWindow(x11Info().display(), d->client, x11Info().appRootWindow(), 0, 0);
+ XReparentWindow(x11Info().display(), d->client, x11Info().appRootWindow(x11Info().screen()), 0, 0);
XSync(x11Info().display(), false);
XEvent ev;
@@ -1627,7 +1627,7 @@ void QX11EmbedContainerPrivate::rejectClient(WId window)
Q_Q(QX11EmbedContainer);
q->setEnabled(false);
XRemoveFromSaveSet(q->x11Info().display(), client);
- XReparentWindow(q->x11Info().display(), window, q->x11Info().appRootWindow(), 0, 0);
+ XReparentWindow(q->x11Info().display(), window, q->x11Info().appRootWindow(q->x11Info().screen()), 0, 0);
}
/*! \internal
diff --git a/src/gui/painting/painting.pri b/src/gui/painting/painting.pri
index 099619c..51f2538 100644
--- a/src/gui/painting/painting.pri
+++ b/src/gui/painting/painting.pri
@@ -34,6 +34,7 @@ HEADERS += \
painting/qprinter.h \
painting/qprinter_p.h \
painting/qprinterinfo.h \
+ painting/qprinterinfo_p.h \
painting/qrasterizer_p.h \
painting/qregion.h \
painting/qstroker_p.h \
@@ -73,6 +74,7 @@ SOURCES += \
painting/qprintengine_pdf.cpp \
painting/qprintengine_ps.cpp \
painting/qprinter.cpp \
+ painting/qprinterinfo.cpp \
painting/qrasterizer.cpp \
painting/qregion.cpp \
painting/qstroker.cpp \
diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp
index a4ab278..4fd90ed 100644
--- a/src/gui/painting/qdrawhelper.cpp
+++ b/src/gui/painting/qdrawhelper.cpp
@@ -712,6 +712,38 @@ static inline uint interpolate_4_pixels_16(uint tl, uint tr, uint bl, uint br, i
}
#endif
+#if defined(QT_ALWAYS_HAVE_NEON)
+#define interpolate_4_pixels_16_neon(tl, tr, bl, br, distx, disty, disty_, colorMask, invColorMask, v_256, b) \
+{ \
+ const int16x8_t dxdy = vmulq_s16(distx, disty); \
+ const int16x8_t distx_ = vshlq_n_s16(distx, 4); \
+ const int16x8_t idxidy = vaddq_s16(dxdy, vsubq_s16(v_256, vaddq_s16(distx_, disty_))); \
+ const int16x8_t dxidy = vsubq_s16(distx_, dxdy); \
+ const int16x8_t idxdy = vsubq_s16(disty_, dxdy); \
+ \
+ int16x8_t tlAG = vreinterpretq_s16_u16(vshrq_n_u16(vreinterpretq_u16_s16(tl), 8)); \
+ int16x8_t tlRB = vandq_s16(tl, colorMask); \
+ int16x8_t trAG = vreinterpretq_s16_u16(vshrq_n_u16(vreinterpretq_u16_s16(tr), 8)); \
+ int16x8_t trRB = vandq_s16(tr, colorMask); \
+ int16x8_t blAG = vreinterpretq_s16_u16(vshrq_n_u16(vreinterpretq_u16_s16(bl), 8)); \
+ int16x8_t blRB = vandq_s16(bl, colorMask); \
+ int16x8_t brAG = vreinterpretq_s16_u16(vshrq_n_u16(vreinterpretq_u16_s16(br), 8)); \
+ int16x8_t brRB = vandq_s16(br, colorMask); \
+ \
+ int16x8_t rAG = vmulq_s16(tlAG, idxidy); \
+ int16x8_t rRB = vmulq_s16(tlRB, idxidy); \
+ rAG = vmlaq_s16(rAG, trAG, dxidy); \
+ rRB = vmlaq_s16(rRB, trRB, dxidy); \
+ rAG = vmlaq_s16(rAG, blAG, idxdy); \
+ rRB = vmlaq_s16(rRB, blRB, idxdy); \
+ rAG = vmlaq_s16(rAG, brAG, dxdy); \
+ rRB = vmlaq_s16(rRB, brRB, dxdy); \
+ \
+ rAG = vandq_s16(invColorMask, rAG); \
+ rRB = vreinterpretq_s16_u16(vshrq_n_u16(vreinterpretq_u16_s16(rRB), 8)); \
+ vst1q_s16((int16_t*)(b), vorrq_s16(rAG, rRB)); \
+}
+#endif
template<TextureBlendType blendType>
Q_STATIC_TEMPLATE_FUNCTION inline void fetchTransformedBilinear_pixelBounds(int max, int l1, int l2, int &v1, int &v2)
@@ -819,10 +851,9 @@ const uint * QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *
}
}
-#if defined(QT_ALWAYS_HAVE_SSE2)
if (blendType != BlendTransformedBilinearTiled &&
(format == QImage::Format_ARGB32_Premultiplied || format == QImage::Format_RGB32)) {
-
+#if defined(QT_ALWAYS_HAVE_SSE2)
const __m128i disty_ = _mm_set1_epi16(disty);
const __m128i idisty_ = _mm_set1_epi16(idisty);
const __m128i colorMask = _mm_set1_epi32(0x00ff00ff);
@@ -852,8 +883,38 @@ const uint * QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *
rRB = _mm_srli_epi16(rRB, 8);
_mm_storeu_si128((__m128i*)(&intermediate_buffer[0][f]), rRB);
}
- }
+#elif defined(QT_ALWAYS_HAVE_NEON)
+ const int16x8_t disty_ = vdupq_n_s16(disty);
+ const int16x8_t idisty_ = vdupq_n_s16(idisty);
+ const int16x8_t colorMask = vdupq_n_s16(0x00ff);
+
+ lim -= 3;
+ for (; f < lim; x += 4, f += 4) {
+ // Load 4 pixels from s1, and split the alpha-green and red-blue component
+ int16x8_t top = vld1q_s16((int16_t*)((const uint *)(s1)+x));
+ int16x8_t topAG = vreinterpretq_s16_u16(vshrq_n_u16(vreinterpretq_u16_s16(top), 8));
+ int16x8_t topRB = vandq_s16(top, colorMask);
+ // Multiplies each colour component by idisty
+ topAG = vmulq_s16(topAG, idisty_);
+ topRB = vmulq_s16(topRB, idisty_);
+
+ // Same for the s2 vector
+ int16x8_t bottom = vld1q_s16((int16_t*)((const uint *)(s2)+x));
+ int16x8_t bottomAG = vreinterpretq_s16_u16(vshrq_n_u16(vreinterpretq_u16_s16(bottom), 8));
+ int16x8_t bottomRB = vandq_s16(bottom, colorMask);
+ bottomAG = vmulq_s16(bottomAG, disty_);
+ bottomRB = vmulq_s16(bottomRB, disty_);
+
+ // Add the values, and shift to only keep 8 significant bits per colors
+ int16x8_t rAG = vaddq_s16(topAG, bottomAG);
+ rAG = vreinterpretq_s16_u16(vshrq_n_u16(vreinterpretq_u16_s16(rAG), 8));
+ vst1q_s16((int16_t*)(&intermediate_buffer[1][f]), rAG);
+ int16x8_t rRB = vaddq_s16(topRB, bottomRB);
+ rRB = vreinterpretq_s16_u16(vshrq_n_u16(vreinterpretq_u16_s16(rRB), 8));
+ vst1q_s16((int16_t*)(&intermediate_buffer[0][f]), rRB);
+ }
#endif
+ }
for (; f < count; f++) { // Same as above but without sse2
if (blendType == BlendTransformedBilinearTiled) {
if (x >= image_width) x -= image_width;
@@ -920,35 +981,36 @@ const uint * QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *
const uchar *s2 = data->texture.scanLine(y2);
int disty = (fy & 0x0000ffff) >> 12;
-#if defined(QT_ALWAYS_HAVE_SSE2)
if (blendType != BlendTransformedBilinearTiled &&
(format == QImage::Format_ARGB32_Premultiplied || format == QImage::Format_RGB32)) {
- //prolog to get into the bounds
- while (b < end) {
- int x1 = (fx >> 16);
- int x2;
- fetchTransformedBilinear_pixelBounds<blendType>(image_width, image_x1, image_x2, x1, x2);
- if (x1 != x2) //break if we are insided the bounds.
- break;
- uint tl = fetch(s1, x1, data->texture.colorTable);
- uint tr = fetch(s1, x2, data->texture.colorTable);
- uint bl = fetch(s2, x1, data->texture.colorTable);
- uint br = fetch(s2, x2, data->texture.colorTable);
- int distx = (fx & 0x0000ffff) >> 12;
- *b = interpolate_4_pixels_16(tl, tr, bl, br, distx, disty);
- fx += fdx;
- ++b;
- }
- uint *boundedEnd;
- if (fdx > 0)
- boundedEnd = qMin(end, buffer + uint((image_x2 - (fx >> 16)) / data->m11));
- else
- boundedEnd = qMin(end, buffer + uint((image_x1 - (fx >> 16)) / data->m11));
+#define BILINEAR_DOWNSCALE_BOUNDS_PROLOG \
+ while (b < end) { \
+ int x1 = (fx >> 16); \
+ int x2; \
+ fetchTransformedBilinear_pixelBounds<blendType>(image_width, image_x1, image_x2, x1, x2); \
+ if (x1 != x2) \
+ break; \
+ uint tl = fetch(s1, x1, data->texture.colorTable); \
+ uint tr = fetch(s1, x2, data->texture.colorTable); \
+ uint bl = fetch(s2, x1, data->texture.colorTable); \
+ uint br = fetch(s2, x2, data->texture.colorTable); \
+ int distx = (fx & 0x0000ffff) >> 12; \
+ *b = interpolate_4_pixels_16(tl, tr, bl, br, distx, disty); \
+ fx += fdx; \
+ ++b; \
+ } \
+ uint *boundedEnd; \
+ if (fdx > 0) \
+ boundedEnd = qMin(end, buffer + uint((image_x2 - (fx >> 16)) / data->m11)); \
+ else \
+ boundedEnd = qMin(end, buffer + uint((image_x1 - (fx >> 16)) / data->m11)); \
boundedEnd -= 3;
+#if defined(QT_ALWAYS_HAVE_SSE2)
+ BILINEAR_DOWNSCALE_BOUNDS_PROLOG
+
const __m128i colorMask = _mm_set1_epi32(0x00ff00ff);
- //const __m128i distShuffleMask = _mm_set_epi8(13, 12, 13, 12, 9, 8, 9, 8, 5, 4, 5, 4, 1, 0, 1, 0);
const __m128i v_256 = _mm_set1_epi16(256);
const __m128i v_disty = _mm_set1_epi16(disty);
__m128i v_fdx = _mm_set1_epi32(fdx*4);
@@ -976,8 +1038,7 @@ const uint * QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *
bl.i[i] = *(addr_tl+secondLine);
br.i[i] = *(addr_tr+secondLine);
}
- __m128i v_distx = _mm_srli_epi16(v_fx.vect, 12); //distx = (fx & 0x0000ffff) >> 12;
- //v_distx = _mm_shuffle_epi8(v_disty, distShuffleMask); //distx |= distx << 16;
+ __m128i v_distx = _mm_srli_epi16(v_fx.vect, 12);
v_distx = _mm_shufflehi_epi16(v_distx, _MM_SHUFFLE(2,2,0,0));
v_distx = _mm_shufflelo_epi16(v_distx, _MM_SHUFFLE(2,2,0,0));
@@ -986,8 +1047,57 @@ const uint * QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *
v_fx.vect = _mm_add_epi32(v_fx.vect, v_fdx);
}
fx = v_fx.i[0];
- }
+#elif defined(QT_ALWAYS_HAVE_NEON)
+ BILINEAR_DOWNSCALE_BOUNDS_PROLOG
+
+ const int16x8_t colorMask = vdupq_n_s16(0x00ff);
+ const int16x8_t invColorMask = vmvnq_s16(colorMask);
+ const int16x8_t v_256 = vdupq_n_s16(256);
+ const int16x8_t v_disty = vdupq_n_s16(disty);
+ const int16x8_t v_disty_ = vshlq_n_s16(v_disty, 4);
+ int32x4_t v_fdx = vdupq_n_s32(fdx*4);
+
+ ptrdiff_t secondLine = reinterpret_cast<const uint *>(s2) - reinterpret_cast<const uint *>(s1);
+
+ union Vect_buffer { int32x4_t vect; quint32 i[4]; };
+ Vect_buffer v_fx;
+
+ for (int i = 0; i < 4; i++) {
+ v_fx.i[i] = fx;
+ fx += fdx;
+ }
+
+ const int32x4_t v_ffff_mask = vdupq_n_s32(0x0000ffff);
+
+ while (b < boundedEnd) {
+
+ Vect_buffer tl, tr, bl, br;
+
+ Vect_buffer v_fx_shifted;
+ v_fx_shifted.vect = vshrq_n_s32(v_fx.vect, 16);
+
+ int32x4_t v_distx = vshrq_n_s32(vandq_s32(v_fx.vect, v_ffff_mask), 12);
+
+ for (int i = 0; i < 4; i++) {
+ int x1 = v_fx_shifted.i[i];
+ const uint *addr_tl = reinterpret_cast<const uint *>(s1) + x1;
+ const uint *addr_tr = addr_tl + 1;
+ tl.i[i] = *addr_tl;
+ tr.i[i] = *addr_tr;
+ bl.i[i] = *(addr_tl+secondLine);
+ br.i[i] = *(addr_tr+secondLine);
+ }
+
+ v_distx = vorrq_s32(v_distx, vshlq_n_s32(v_distx, 16));
+
+ interpolate_4_pixels_16_neon(vreinterpretq_s16_s32(tl.vect), vreinterpretq_s16_s32(tr.vect), vreinterpretq_s16_s32(bl.vect), vreinterpretq_s16_s32(br.vect), vreinterpretq_s16_s32(v_distx), v_disty, v_disty_, colorMask, invColorMask, v_256, b);
+ b+=4;
+ v_fx.vect = vaddq_s32(v_fx.vect, v_fdx);
+ }
+ fx = v_fx.i[0];
#endif
+ }
+
while (b < end) {
int x1 = (fx >> 16);
int x2;
@@ -6432,6 +6542,8 @@ Q_STATIC_TEMPLATE_FUNCTION void blendTransformedTiled(int count, const QSpan *sp
int px = int(tx) - (tx < 0);
int py = int(ty) - (ty < 0);
+ px %= image_width;
+ py %= image_height;
if (px < 0)
px += image_width;
if (py < 0)
@@ -7709,17 +7821,6 @@ void qInitDrawhelperAsm()
}
#endif
#endif // SSE
-#if defined(QT_HAVE_MMXEXT) && defined(QT_HAVE_SSE)
- } else if (features & MMXEXT) {
- qt_memfill32 = qt_memfill32_sse;
- qDrawHelper[QImage::Format_RGB16].bitmapBlit = qt_bitmapblit16_sse;
-# ifdef QT_HAVE_3DNOW
- if (features & MMX3DNOW) {
- qt_memfill32 = qt_memfill32_sse3dnow;
- qDrawHelper[QImage::Format_RGB16].bitmapBlit = qt_bitmapblit16_sse3dnow;
- }
-# endif // 3DNOW
-#endif // MMXEXT
}
#ifdef QT_HAVE_MMX
if (features & MMX) {
diff --git a/src/gui/painting/qdrawhelper_p.h b/src/gui/painting/qdrawhelper_p.h
index 0cc2e40..33fd21e 100644
--- a/src/gui/painting/qdrawhelper_p.h
+++ b/src/gui/painting/qdrawhelper_p.h
@@ -1684,9 +1684,7 @@ QT_TRIVIAL_MEMCONVERT_IMPL(qrgb888)
QT_TRIVIAL_MEMCONVERT_IMPL(qargb6666)
QT_TRIVIAL_MEMCONVERT_IMPL(qrgb666)
QT_TRIVIAL_MEMCONVERT_IMPL(quint16)
-#ifdef Q_WS_QWS
QT_TRIVIAL_MEMCONVERT_IMPL(qrgb565)
-#endif
QT_TRIVIAL_MEMCONVERT_IMPL(qargb8565)
QT_TRIVIAL_MEMCONVERT_IMPL(qargb8555)
QT_TRIVIAL_MEMCONVERT_IMPL(qrgb555)
@@ -1783,9 +1781,7 @@ QT_RECTCONVERT_TRIVIAL_IMPL(quint32)
QT_RECTCONVERT_TRIVIAL_IMPL(qrgb888)
QT_RECTCONVERT_TRIVIAL_IMPL(qargb6666)
QT_RECTCONVERT_TRIVIAL_IMPL(qrgb666)
-#ifdef Q_WS_QWS
QT_RECTCONVERT_TRIVIAL_IMPL(qrgb565)
-#endif
QT_RECTCONVERT_TRIVIAL_IMPL(qargb8565)
QT_RECTCONVERT_TRIVIAL_IMPL(quint16)
QT_RECTCONVERT_TRIVIAL_IMPL(qargb8555)
diff --git a/src/gui/painting/qemulationpaintengine.cpp b/src/gui/painting/qemulationpaintengine.cpp
index 0510b10..714d5de 100644
--- a/src/gui/painting/qemulationpaintengine.cpp
+++ b/src/gui/painting/qemulationpaintengine.cpp
@@ -268,6 +268,15 @@ void QEmulationPaintEngine::setState(QPainterState *s)
real_engine->setState(s);
}
+void QEmulationPaintEngine::beginNativePainting()
+{
+ real_engine->beginNativePainting();
+}
+
+void QEmulationPaintEngine::endNativePainting()
+{
+ real_engine->endNativePainting();
+}
void QEmulationPaintEngine::fillBGRect(const QRectF &r)
{
diff --git a/src/gui/painting/qemulationpaintengine_p.h b/src/gui/painting/qemulationpaintengine_p.h
index 5835f10..e283645 100644
--- a/src/gui/painting/qemulationpaintengine_p.h
+++ b/src/gui/painting/qemulationpaintengine_p.h
@@ -93,6 +93,9 @@ public:
virtual void setState(QPainterState *s);
+ virtual void beginNativePainting();
+ virtual void endNativePainting();
+
virtual uint flags() const {return QPaintEngineEx::IsEmulationEngine | QPaintEngineEx::DoNotEmulate;}
inline QPainterState *state() { return (QPainterState *)QPaintEngine::state; }
diff --git a/src/gui/painting/qgrayraster.c b/src/gui/painting/qgrayraster.c
index 536f265..c72885f 100644
--- a/src/gui/painting/qgrayraster.c
+++ b/src/gui/painting/qgrayraster.c
@@ -952,49 +952,53 @@
const QT_FT_Vector* control2,
const QT_FT_Vector* to )
{
+ TPos dx, dy, da, db;
int top, level;
int* levels;
QT_FT_Vector* arc;
- int mid_x = ( DOWNSCALE( ras.x ) + to->x +
- 3 * (control1->x + control2->x ) ) / 8;
- int mid_y = ( DOWNSCALE( ras.y ) + to->y +
- 3 * (control1->y + control2->y ) ) / 8;
- TPos dx = DOWNSCALE( ras.x ) + to->x - ( mid_x << 1 );
- TPos dy = DOWNSCALE( ras.y ) + to->y - ( mid_y << 1 );
+ dx = DOWNSCALE( ras.x ) + to->x - ( control1->x << 1 );
if ( dx < 0 )
dx = -dx;
+ dy = DOWNSCALE( ras.y ) + to->y - ( control1->y << 1 );
if ( dy < 0 )
dy = -dy;
if ( dx < dy )
dx = dy;
+ da = dx;
+
+ dx = DOWNSCALE( ras.x ) + to->x - 3 * ( control1->x + control2->x );
+ if ( dx < 0 )
+ dx = -dx;
+ dy = DOWNSCALE( ras.y ) + to->y - 3 * ( control1->y + control2->y );
+ if ( dy < 0 )
+ dy = -dy;
+ if ( dx < dy )
+ dx = dy;
+ db = dx;
level = 1;
- dx /= ras.cubic_level;
- while ( dx > 0 )
+ da = da / ras.cubic_level;
+ db = db / ras.conic_level;
+ while ( da > 0 || db > 0 )
{
- dx >>= 2;
+ da >>= 2;
+ db >>= 3;
level++;
}
if ( level <= 1 )
{
- TPos to_x, to_y;
+ TPos to_x, to_y, mid_x, mid_y;
to_x = UPSCALE( to->x );
to_y = UPSCALE( to->y );
-
- /* Recalculation of midpoint is needed only if */
- /* UPSCALE and DOWNSCALE have any effect. */
-
-#if ( PIXEL_BITS != 6 )
mid_x = ( ras.x + to_x +
3 * UPSCALE( control1->x + control2->x ) ) / 8;
mid_y = ( ras.y + to_y +
3 * UPSCALE( control1->y + control2->y ) ) / 8;
-#endif
gray_render_line( RAS_VAR_ mid_x, mid_y );
gray_render_line( RAS_VAR_ to_x, to_y );
diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp
index 97dfddf..cdcd092 100644
--- a/src/gui/painting/qpaintengine_raster.cpp
+++ b/src/gui/painting/qpaintengine_raster.cpp
@@ -662,31 +662,23 @@ QRasterPaintEngineState::QRasterPaintEngineState()
QRasterPaintEngineState::QRasterPaintEngineState(QRasterPaintEngineState &s)
: QPainterState(s)
+ , stroker(s.stroker)
+ , 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)
{
- stroker = s.stroker;
-
- lastBrush = s.lastBrush;
- brushData = s.brushData;
brushData.tempImage = 0;
-
- lastPen = s.lastPen;
- penData = s.penData;
penData.tempImage = 0;
-
- fillFlags = s.fillFlags;
- strokeFlags = s.strokeFlags;
- pixmapFlags = s.pixmapFlags;
-
- intOpacity = s.intOpacity;
-
- txscale = s.txscale;
-
- flag_bits = s.flag_bits;
-
- clip = s.clip;
flags.has_clip_ownership = false;
-
- dirty = s.dirty;
}
/*!
@@ -1211,7 +1203,7 @@ void QRasterPaintEngine::clip(const QVectorPath &path, Qt::ClipOperation op)
// There are some cases that are not supported by clip(QRect)
if (op != Qt::UniteClip && (op != Qt::IntersectClip || !s->clip
|| s->clip->hasRectClip || s->clip->hasRegionClip)) {
- if (s->matrix.type() <= QTransform::TxTranslate
+ if (s->matrix.type() <= QTransform::TxScale
&& ((path.shape() == QVectorPath::RectangleHint)
|| (isRect(points, path.elementCount())
&& (!types || (types[0] == QPainterPath::MoveToElement
@@ -1223,8 +1215,8 @@ void QRasterPaintEngine::clip(const QVectorPath &path, Qt::ClipOperation op)
#endif
QRectF r(points[0], points[1], points[4]-points[0], points[5]-points[1]);
- clip(r.toRect(), op);
- return;
+ if (setClipRectInDeviceCoords(s->matrix.mapRect(r).toRect(), op))
+ return;
}
}
@@ -1285,7 +1277,6 @@ void QRasterPaintEngine::clip(const QRect &rect, Qt::ClipOperation op)
qDebug() << "QRasterPaintEngine::clip(): " << rect << op;
#endif
- Q_D(QRasterPaintEngine);
QRasterPaintEngineState *s = state();
if (op == Qt::NoClip) {
@@ -1295,11 +1286,23 @@ void QRasterPaintEngine::clip(const QRect &rect, Qt::ClipOperation op)
QPaintEngineEx::clip(rect, op);
return;
- } else if (op == Qt::ReplaceClip || s->clip == 0) {
+ } else if (!setClipRectInDeviceCoords(s->matrix.mapRect(rect), op)) {
+ QPaintEngineEx::clip(rect, op);
+ return;
+ }
+}
+
+
+bool QRasterPaintEngine::setClipRectInDeviceCoords(const QRect &r, Qt::ClipOperation op)
+{
+ Q_D(QRasterPaintEngine);
+ QRect clipRect = r & d->deviceRect;
+ QRasterPaintEngineState *s = state();
+
+ if (op == Qt::ReplaceClip || s->clip == 0) {
// No current clip, hence we intersect with sysclip and be
// done with it...
- QRect clipRect = s->matrix.mapRect(rect) & d->deviceRect;
QRegion clipRegion = systemClip();
QClipData *clip = new QClipData(d->rasterBuffer->height());
@@ -1315,12 +1318,11 @@ void QRasterPaintEngine::clip(const QRect &rect, Qt::ClipOperation op)
s->clip->enabled = true;
s->flags.has_clip_ownership = true;
- } else { // intersect clip with current clip
+ } else if (op == Qt::IntersectClip){ // intersect clip with current clip
QClipData *base = s->clip;
Q_ASSERT(base);
if (base->hasRectClip || base->hasRegionClip) {
- QRect clipRect = s->matrix.mapRect(rect) & d->deviceRect;
if (!s->flags.has_clip_ownership) {
s->clip = new QClipData(d->rasterBuffer->height());
s->flags.has_clip_ownership = true;
@@ -1331,11 +1333,14 @@ void QRasterPaintEngine::clip(const QRect &rect, Qt::ClipOperation op)
s->clip->setClipRegion(base->clipRegion & clipRect);
s->clip->enabled = true;
} else {
- QPaintEngineEx::clip(rect, op);
- return;
+ return false;
}
+ } else {
+ return false;
}
+
qrasterpaintengine_dirty_clip(d, s);
+ return true;
}
@@ -5152,7 +5157,8 @@ void QSpanData::setup(const QBrush &brush, int alpha, QPainter::CompositionMode
case Qt::SolidPattern: {
type = Solid;
QColor c = qbrush_color(brush);
- solid.color = PREMUL(ARGB_COMBINE_ALPHA(c.rgba(), alpha));
+ QRgb rgba = c.rgba();
+ solid.color = PREMUL(ARGB_COMBINE_ALPHA(rgba, alpha));
if ((solid.color & 0xff000000) == 0
&& compositionMode == QPainter::CompositionMode_SourceOver) {
type = None;
diff --git a/src/gui/painting/qpaintengine_raster_p.h b/src/gui/painting/qpaintengine_raster_p.h
index 404528c..d70a7e7 100644
--- a/src/gui/painting/qpaintengine_raster_p.h
+++ b/src/gui/painting/qpaintengine_raster_p.h
@@ -268,6 +268,8 @@ private:
void drawGlyphsS60(const QPointF &p, const QTextItemInt &ti);
#endif // Q_OS_SYMBIAN && QT_NO_FREETYPE
+ bool setClipRectInDeviceCoords(const QRect &r, Qt::ClipOperation op);
+
inline void ensureBrush(const QBrush &brush) {
if (!qbrush_fast_equals(state()->lastBrush, brush) || (brush.style() != Qt::NoBrush && state()->fillFlags))
updateBrush(brush);
diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp
index 546861a..e8db049 100644
--- a/src/gui/painting/qpainter.cpp
+++ b/src/gui/painting/qpainter.cpp
@@ -151,6 +151,13 @@ static inline uint line_emulation(uint emulation)
| QPaintEngine_OpaqueBackground);
}
+static bool qt_paintengine_supports_transformations(QPaintEngine::Type type)
+{
+ return type == QPaintEngine::OpenGL2
+ || type == QPaintEngine::OpenVG
+ || type == QPaintEngine::OpenGL;
+}
+
#ifndef QT_NO_DEBUG
static bool qt_painter_thread_test(int devType, const char *what, bool extraCondition = false)
{
@@ -5795,8 +5802,17 @@ void QPainter::drawGlyphs(const QPointF &position, const QGlyphs &glyphs)
int count = qMin(glyphIndexes.size(), glyphPositions.size());
QVarLengthArray<QFixedPoint, 128> fixedPointPositions(count);
- for (int i=0; i<count; ++i)
- fixedPointPositions[i] = QFixedPoint::fromPointF(position + glyphPositions.at(i));
+
+ bool paintEngineSupportsTransformations =
+ d->extended != 0
+ ? qt_paintengine_supports_transformations(d->extended->type())
+ : false;
+ for (int i=0; i<count; ++i) {
+ QPointF processedPosition = position + glyphPositions.at(i);
+ if (!paintEngineSupportsTransformations)
+ processedPosition = d->state->transform().map(processedPosition);
+ fixedPointPositions[i] = QFixedPoint::fromPointF(processedPosition);
+ }
d->drawGlyphs(glyphIndexes.data(), fixedPointPositions.data(), count);
@@ -5988,10 +6004,7 @@ void QPainter::drawStaticText(const QPointF &topLeftPosition, const QStaticText
return;
}
- bool paintEngineSupportsTransformations = d->extended->type() == QPaintEngine::OpenGL2
- || d->extended->type() == QPaintEngine::OpenVG
- || d->extended->type() == QPaintEngine::OpenGL;
-
+ bool paintEngineSupportsTransformations = qt_paintengine_supports_transformations(d->extended->type());
if (paintEngineSupportsTransformations && !staticText_d->untransformedCoordinates) {
staticText_d->untransformedCoordinates = true;
staticText_d->needsRelayout = true;
diff --git a/src/gui/painting/qpathclipper.cpp b/src/gui/painting/qpathclipper.cpp
index a17b7c1..5060ad6 100644
--- a/src/gui/painting/qpathclipper.cpp
+++ b/src/gui/painting/qpathclipper.cpp
@@ -868,9 +868,9 @@ QWingedEdge::QWingedEdge() :
}
QWingedEdge::QWingedEdge(const QPainterPath &subject, const QPainterPath &clip) :
- m_edges(subject.length()),
- m_vertices(subject.length()),
- m_segments(subject.length())
+ m_edges(subject.elementCount()),
+ m_vertices(subject.elementCount()),
+ m_segments(subject.elementCount())
{
m_segments.setPath(subject);
m_segments.addPath(clip);
@@ -1405,9 +1405,9 @@ bool QPathClipper::intersect()
else if (clipIsRect)
return subjectPath.intersects(r2);
- QPathSegments a(subjectPath.length());
+ QPathSegments a(subjectPath.elementCount());
a.setPath(subjectPath);
- QPathSegments b(clipPath.length());
+ QPathSegments b(clipPath.elementCount());
b.setPath(clipPath);
QIntersectionFinder finder;
@@ -1450,9 +1450,9 @@ bool QPathClipper::contains()
if (clipIsRect)
return subjectPath.contains(r2);
- QPathSegments a(subjectPath.length());
+ QPathSegments a(subjectPath.elementCount());
a.setPath(subjectPath);
- QPathSegments b(clipPath.length());
+ QPathSegments b(clipPath.elementCount());
b.setPath(clipPath);
QIntersectionFinder finder;
diff --git a/src/gui/painting/qpdf.cpp b/src/gui/painting/qpdf.cpp
index 45af03a..f5f7c3c 100644
--- a/src/gui/painting/qpdf.cpp
+++ b/src/gui/painting/qpdf.cpp
@@ -1389,7 +1389,7 @@ int QPdfBaseEngine::metric(QPaintDevice::PaintDeviceMetric metricType) const
void QPdfBaseEngine::setProperty(PrintEnginePropertyKey key, const QVariant &value)
{
Q_D(QPdfBaseEngine);
- switch (key) {
+ switch (int(key)) {
case PPK_CollateCopies:
d->collate = value.toBool();
break;
@@ -1479,7 +1479,7 @@ QVariant QPdfBaseEngine::property(PrintEnginePropertyKey key) const
Q_D(const QPdfBaseEngine);
QVariant ret;
- switch (key) {
+ switch (int(key)) {
case PPK_CollateCopies:
ret = d->collate;
break;
diff --git a/src/gui/painting/qprinterinfo.qdoc b/src/gui/painting/qprinterinfo.cpp
index 9193213..72f8be3 100644
--- a/src/gui/painting/qprinterinfo.qdoc
+++ b/src/gui/painting/qprinterinfo.cpp
@@ -25,6 +25,16 @@
**
****************************************************************************/
+#include "qprinterinfo.h"
+#include "qprinterinfo_p.h"
+
+#ifndef QT_NO_PRINTER
+
+QT_BEGIN_NAMESPACE
+
+QPrinterInfoPrivate QPrinterInfoPrivate::shared_null;
+
+
/*!
\class QPrinterInfo
@@ -59,60 +69,94 @@
*/
/*!
- \fn QPrinterInfo::QPrinterInfo()
-
Constructs an empty QPrinterInfo object.
\sa isNull()
*/
+QPrinterInfo::QPrinterInfo()
+ : d_ptr(&QPrinterInfoPrivate::shared_null)
+{
+}
/*!
- \fn QPrinterInfo::QPrinterInfo(const QPrinterInfo& src)
-
- Constructs a copy of \a src.
+ Constructs a copy of \a other.
*/
+QPrinterInfo::QPrinterInfo(const QPrinterInfo &other)
+ : d_ptr(new QPrinterInfoPrivate(*other.d_ptr))
+{
+}
/*!
- \fn QPrinterInfo::QPrinterInfo(const QPrinter& printer)
-
Constructs a QPrinterInfo object from \a printer.
*/
+QPrinterInfo::QPrinterInfo(const QPrinter &printer)
+ : d_ptr(&QPrinterInfoPrivate::shared_null)
+{
+ foreach (const QPrinterInfo &printerInfo, availablePrinters()) {
+ if (printerInfo.printerName() == printer.printerName()) {
+ d_ptr.reset(new QPrinterInfoPrivate(*printerInfo.d_ptr));
+ break;
+ }
+ }
+}
/*!
- \fn QPrinterInfo::~QPrinterInfo()
+ \internal
+*/
+QPrinterInfo::QPrinterInfo(const QString &name)
+ : d_ptr(new QPrinterInfoPrivate(name))
+{
+}
+/*!
Destroys the QPrinterInfo object. References to the values in the
object become invalid.
*/
+QPrinterInfo::~QPrinterInfo()
+{
+}
/*!
- \fn QPrinterInfo& QPrinterInfo::operator=(const QPrinterInfo& src)
-
- Sets the QPrinterInfo object to be equal to \a src.
+ Sets the QPrinterInfo object to be equal to \a other.
*/
+QPrinterInfo &QPrinterInfo::operator=(const QPrinterInfo &other)
+{
+ Q_ASSERT(d_ptr);
+ d_ptr.reset(new QPrinterInfoPrivate(*other.d_ptr));
+ return *this;
+}
/*!
- \fn QString QPrinterInfo::printerName() const
-
Returns the name of the printer.
\sa QPrinter::setPrinterName()
*/
+QString QPrinterInfo::printerName() const
+{
+ const Q_D(QPrinterInfo);
+ return d->name;
+}
/*!
- \fn bool QPrinterInfo::isNull() const
-
Returns whether this QPrinterInfo object holds a printer definition.
An empty QPrinterInfo object could result for example from calling
defaultPrinter() when there are no printers on the system.
*/
+bool QPrinterInfo::isNull() const
+{
+ const Q_D(QPrinterInfo);
+ return d == &QPrinterInfoPrivate::shared_null;
+}
/*!
- \fn bool QPrinterInfo::isDefault() const
-
Returns whether this printer is the default printer.
*/
+bool QPrinterInfo::isDefault() const
+{
+ const Q_D(QPrinterInfo);
+ return d->isDefault;
+}
/*!
\fn QList< QPrinter::PaperSize> QPrinterInfo::supportedPaperSizes() const
@@ -123,3 +167,7 @@
Not all printer drivers support this query, so the list may be empty.
On Mac OS X 10.3, this function always returns an empty list.
*/
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_PRINTER
diff --git a/src/gui/painting/qprinterinfo.h b/src/gui/painting/qprinterinfo.h
index 063c6b9..c8c9534 100644
--- a/src/gui/painting/qprinterinfo.h
+++ b/src/gui/painting/qprinterinfo.h
@@ -42,9 +42,10 @@
#ifndef QPRINTERINFO_H
#define QPRINTERINFO_H
-#include <QtGui/QPrinter>
#include <QtCore/QList>
+#include <QtGui/QPrinter>
+
QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
@@ -56,15 +57,13 @@ class QPrinterInfoPrivate;
class QPrinterInfoPrivateDeleter;
class Q_GUI_EXPORT QPrinterInfo
{
-Q_DECLARE_PRIVATE(QPrinterInfo)
-
public:
QPrinterInfo();
- QPrinterInfo(const QPrinterInfo& src);
- QPrinterInfo(const QPrinter& printer);
+ QPrinterInfo(const QPrinterInfo &other);
+ QPrinterInfo(const QPrinter &printer);
~QPrinterInfo();
- QPrinterInfo& operator=(const QPrinterInfo& src);
+ QPrinterInfo &operator=(const QPrinterInfo &other);
QString printerName() const;
bool isNull() const;
@@ -75,8 +74,10 @@ public:
static QPrinterInfo defaultPrinter();
private:
- QPrinterInfo(const QString& name);
+ QPrinterInfo(const QString &name);
+private:
+ Q_DECLARE_PRIVATE(QPrinterInfo)
QScopedPointer<QPrinterInfoPrivate, QPrinterInfoPrivateDeleter> d_ptr;
};
diff --git a/src/gui/painting/qprinterinfo_mac.cpp b/src/gui/painting/qprinterinfo_mac.cpp
index 9b199f4..033682a 100644
--- a/src/gui/painting/qprinterinfo_mac.cpp
+++ b/src/gui/painting/qprinterinfo_mac.cpp
@@ -40,6 +40,7 @@
****************************************************************************/
#include "qprinterinfo.h"
+#include "qprinterinfo_p.h"
#include "private/qt_mac_p.h"
@@ -47,189 +48,71 @@ QT_BEGIN_NAMESPACE
#ifndef QT_NO_PRINTER
-class QPrinterInfoPrivate
-{
-Q_DECLARE_PUBLIC(QPrinterInfo)
-public:
- ~QPrinterInfoPrivate();
- QPrinterInfoPrivate();
- QPrinterInfoPrivate(const QString& name);
-
-private:
- QPrinterInfo* q_ptr;
-
- QString m_name;
- bool m_default;
- bool m_isNull;
-};
-
-static QPrinterInfoPrivate nullQPrinterInfoPrivate;
-
-class QPrinterInfoPrivateDeleter
-{
-public:
- static inline void cleanup(QPrinterInfoPrivate *d)
- {
- if (d != &nullQPrinterInfoPrivate)
- delete d;
- }
-};
-
-extern QPrinter::PaperSize qSizeFTopaperSize(const QSizeF& size);
-
-/////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////////////////////////////////////////////////
+extern QPrinter::PaperSize qSizeFTopaperSize(const QSizeF &size);
QList<QPrinterInfo> QPrinterInfo::availablePrinters()
{
QList<QPrinterInfo> printers;
- OSStatus status = noErr;
- QCFType<CFArrayRef> printerList;
- status = PMServerCreatePrinterList(kPMServerLocal, &printerList);
- if (status == noErr) {
- CFIndex count = CFArrayGetCount(printerList);
- for (CFIndex i=0; i<count; ++i) {
- PMPrinter printer = static_cast<PMPrinter>(const_cast<void *>(CFArrayGetValueAtIndex(printerList, i)));
- QString name = QCFString::toQString(PMPrinterGetName(printer));
- printers.append(QPrinterInfo(name));
- if (PMPrinterIsDefault(printer)) {
- printers[i].d_ptr->m_default = true;
- }
+ QCFType<CFArrayRef> array;
+ if (PMServerCreatePrinterList(kPMServerLocal, &array) == noErr) {
+ CFIndex count = CFArrayGetCount(array);
+ for (int i = 0; i < count; ++i) {
+ PMPrinter printer = static_cast<PMPrinter>(const_cast<void *>(CFArrayGetValueAtIndex(array, i)));
+ QString printerName = QCFString::toQString(PMPrinterGetName(printer));
+
+ QPrinterInfo printerInfo(printerName);
+ if (PMPrinterIsDefault(printer))
+ printerInfo.d_ptr->isDefault = true;
+ printers.append(printerInfo);
}
}
return printers;
}
-QPrinterInfo QPrinterInfo::defaultPrinter(){
- QList<QPrinterInfo> printers = availablePrinters();
- for (int c = 0; c < printers.size(); ++c) {
- if (printers[c].isDefault()) {
- return printers[c];
- }
- }
- return QPrinterInfo();
-}
-
-/////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////////////////////////////////////////////////
-
-QPrinterInfo::QPrinterInfo(const QPrinter& prn)
- : d_ptr(&nullQPrinterInfoPrivate)
+QPrinterInfo QPrinterInfo::defaultPrinter()
{
- QList<QPrinterInfo> list = availablePrinters();
- for (int c = 0; c < list.size(); ++c) {
- if (prn.printerName() == list[c].printerName()) {
- *this = list[c];
- return;
- }
+ QList<QPrinterInfo> printers = availablePrinters();
+ foreach (const QPrinterInfo &printerInfo, printers) {
+ if (printerInfo.isDefault())
+ return printerInfo;
}
-}
-
-QPrinterInfo::~QPrinterInfo()
-{
-}
-
-QPrinterInfo::QPrinterInfo()
- : d_ptr(&nullQPrinterInfoPrivate)
-{
-}
-
-QPrinterInfo::QPrinterInfo(const QString& name)
- : d_ptr(new QPrinterInfoPrivate(name))
-{
- d_ptr->q_ptr = this;
-}
-
-QPrinterInfo::QPrinterInfo(const QPrinterInfo& src)
- : d_ptr(&nullQPrinterInfoPrivate)
-{
- *this = src;
-}
-
-QPrinterInfo& QPrinterInfo::operator=(const QPrinterInfo& src)
-{
- Q_ASSERT(d_ptr);
- d_ptr.reset(new QPrinterInfoPrivate(*src.d_ptr));
- d_ptr->q_ptr = this;
- return *this;
-}
-
-QString QPrinterInfo::printerName() const
-{
- const Q_D(QPrinterInfo);
- return d->m_name;
-}
-bool QPrinterInfo::isNull() const
-{
- const Q_D(QPrinterInfo);
- return d->m_isNull;
-}
-
-bool QPrinterInfo::isDefault() const
-{
- const Q_D(QPrinterInfo);
- return d->m_default;
+ return printers.value(0);
}
QList<QPrinter::PaperSize> QPrinterInfo::supportedPaperSizes() const
{
const Q_D(QPrinterInfo);
- PMPrinter cfPrn = PMPrinterCreateFromPrinterID(QCFString::toCFStringRef(d->m_name));
+ QList<QPrinter::PaperSize> paperSizes;
+ if (isNull())
+ return paperSizes;
- if (!cfPrn) return QList<QPrinter::PaperSize>();
+ PMPrinter cfPrn = PMPrinterCreateFromPrinterID(QCFString::toCFStringRef(d->name));
+ if (!cfPrn)
+ return paperSizes;
CFArrayRef array;
- OSStatus status = PMPrinterGetPaperList(cfPrn, &array);
-
- if (status != 0) {
+ if (PMPrinterGetPaperList(cfPrn, &array) != noErr) {
PMRelease(cfPrn);
- return QList<QPrinter::PaperSize>();
+ return paperSizes;
}
- QList<QPrinter::PaperSize> paperList;
int count = CFArrayGetCount(array);
- for (int c = 0; c < count; c++) {
- PMPaper paper = static_cast<PMPaper>(
- const_cast<void*>(
- CFArrayGetValueAtIndex(array, c)));
+ for (int i = 0; i < count; ++i) {
+ PMPaper paper = static_cast<PMPaper>(const_cast<void *>(CFArrayGetValueAtIndex(array, i)));
double width, height;
- status = PMPaperGetWidth(paper, &width);
- status |= PMPaperGetHeight(paper, &height);
- if (status != 0) continue;
-
- QSizeF size(width * 0.3527, height * 0.3527);
- paperList.append(qSizeFTopaperSize(size));
+ if (PMPaperGetWidth(paper, &width) == noErr && PMPaperGetHeight(paper, &height) == noErr) {
+ QSizeF size(width * 0.3527, height * 0.3527);
+ paperSizes.append(qSizeFTopaperSize(size));
+ }
}
PMRelease(cfPrn);
- return paperList;
-}
-
-/////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////////////////////////////////////////////////
-
-QPrinterInfoPrivate::QPrinterInfoPrivate() :
- q_ptr(NULL),
- m_default(false),
- m_isNull(true)
-{
-}
-
-QPrinterInfoPrivate::QPrinterInfoPrivate(const QString& name) :
- q_ptr(NULL),
- m_name(name),
- m_default(false),
- m_isNull(false)
-{
-}
-
-QPrinterInfoPrivate::~QPrinterInfoPrivate()
-{
+ return paperSizes;
}
#endif // QT_NO_PRINTER
diff --git a/src/gui/painting/qprinterinfo_p.h b/src/gui/painting/qprinterinfo_p.h
new file mode 100644
index 0000000..7781d59
--- /dev/null
+++ b/src/gui/painting/qprinterinfo_p.h
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** 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 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 QPRINTERINFO_P_H
+#define QPRINTERINFO_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 "QtCore/qglobal.h"
+
+#ifndef QT_NO_PRINTER
+
+#include "QtCore/qlist.h"
+
+QT_BEGIN_NAMESPACE
+
+class QPrinterInfoPrivate
+{
+public:
+ QPrinterInfoPrivate(const QString& name = QString()) :
+ name(name), isDefault(false)
+#if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(Q_OS_SYMBIAN)) || defined(Q_WS_QPA)
+#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
+ , cupsPrinterIndex(0), hasPaperSizes(false)
+#endif
+#endif
+ {}
+ ~QPrinterInfoPrivate()
+ {}
+
+ static QPrinterInfoPrivate shared_null;
+
+ QString name;
+ bool isDefault;
+
+#if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(Q_OS_SYMBIAN)) || defined(Q_WS_QPA)
+#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
+ int cupsPrinterIndex;
+ mutable bool hasPaperSizes;
+ mutable QList<QPrinter::PaperSize> paperSizes;
+#endif
+#endif
+};
+
+
+class QPrinterInfoPrivateDeleter
+{
+public:
+ static inline void cleanup(QPrinterInfoPrivate *d)
+ {
+ if (d != &QPrinterInfoPrivate::shared_null)
+ delete d;
+ }
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_PRINTER
+
+#endif // QPRINTERINFO_P_H
diff --git a/src/gui/painting/qprinterinfo_unix.cpp b/src/gui/painting/qprinterinfo_unix.cpp
index 2129aa5..af2e52a 100644
--- a/src/gui/painting/qprinterinfo_unix.cpp
+++ b/src/gui/painting/qprinterinfo_unix.cpp
@@ -40,6 +40,7 @@
****************************************************************************/
#include "qprinterinfo.h"
+#include "qprinterinfo_p.h"
#include <qfile.h>
#include <qfileinfo.h>
@@ -60,42 +61,66 @@ QT_BEGIN_NAMESPACE
#ifndef QT_NO_PRINTER
-class QPrinterInfoPrivate
-{
-Q_DECLARE_PUBLIC(QPrinterInfo)
-public:
- QPrinterInfoPrivate();
- QPrinterInfoPrivate(const QString& name);
- ~QPrinterInfoPrivate();
-
- static QPrinter::PaperSize string2PaperSize(const QString& str);
- static QString pageSize2String(QPrinter::PaperSize size);
-
-private:
- QString m_name;
- bool m_isNull;
- bool m_default;
- mutable bool m_mustGetPaperSizes;
- mutable QList<QPrinter::PaperSize> m_paperSizes;
- int m_cupsPrinterIndex;
-
- QPrinterInfo* q_ptr;
+#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
+// preserver names in ascending order for the binary search
+static const struct NamedPaperSize {
+ const char *const name;
+ QPrinter::PaperSize size;
+} named_sizes_map[QPrinter::NPageSize] = {
+ { "A0", QPrinter::A0 },
+ { "A1", QPrinter::A1 },
+ { "A2", QPrinter::A2 },
+ { "A3", QPrinter::A3 },
+ { "A4", QPrinter::A4 },
+ { "A5", QPrinter::A5 },
+ { "A6", QPrinter::A6 },
+ { "A7", QPrinter::A7 },
+ { "A8", QPrinter::A8 },
+ { "A9", QPrinter::A9 },
+ { "B0", QPrinter::B0 },
+ { "B1", QPrinter::B1 },
+ { "B10", QPrinter::B10 },
+ { "B2", QPrinter::B2 },
+ { "B4", QPrinter::B4 },
+ { "B5", QPrinter::B5 },
+ { "B6", QPrinter::B6 },
+ { "B7", QPrinter::B7 },
+ { "B8", QPrinter::B8 },
+ { "B9", QPrinter::B9 },
+ { "C5E", QPrinter::C5E },
+ { "Comm10E", QPrinter::Comm10E },
+ { "Custom", QPrinter::Custom },
+ { "DLE", QPrinter::DLE },
+ { "Executive", QPrinter::Executive },
+ { "Folio", QPrinter::Folio },
+ { "Ledger", QPrinter::Ledger },
+ { "Legal", QPrinter::Legal },
+ { "Letter", QPrinter::Letter },
+ { "Tabloid", QPrinter::Tabloid }
};
-static QPrinterInfoPrivate nullQPrinterInfoPrivate;
+inline bool operator<(const char *name, const NamedPaperSize &data)
+{ return qstrcmp(name, data.name) < 0; }
+inline bool operator<(const NamedPaperSize &data, const char *name)
+{ return qstrcmp(data.name, name) < 0; }
-class QPrinterInfoPrivateDeleter
+static inline QPrinter::PaperSize string2PaperSize(const char *name)
{
-public:
- static inline void cleanup(QPrinterInfoPrivate *d)
- {
- if (d != &nullQPrinterInfoPrivate)
- delete d;
- }
-};
+ const NamedPaperSize *r = qBinaryFind(named_sizes_map, named_sizes_map + QPrinter::NPageSize, name);
+ if (r - named_sizes_map != QPrinter::NPageSize)
+ return r->size;
+ return QPrinter::Custom;
+}
-/////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////////////////////////////////////////////////
+static inline const char *paperSize2String(QPrinter::PaperSize size)
+{
+ for (int i = 0; i < QPrinter::NPageSize; ++i) {
+ if (size == named_sizes_map[i].size)
+ return named_sizes_map[i].name;
+ }
+ return 0;
+}
+#endif
void qt_perhapsAddPrinter(QList<QPrinterDescription> *printers, const QString &name,
QString host, QString comment,
@@ -784,12 +809,12 @@ int qt_getLprPrinters(QList<QPrinterDescription>& printers)
#endif
}
+ QRegExp ps(QLatin1String("[^a-z]ps(?:[^a-z]|$)"));
+ QRegExp lp(QLatin1String("[^a-z]lp(?:[^a-z]|$)"));
+
int quality = 0;
int best = 0;
for (int i = 0; i < printers.size(); ++i) {
- QRegExp ps(QLatin1String("[^a-z]ps(?:[^a-z]|$)"));
- QRegExp lp(QLatin1String("[^a-z]lp(?:[^a-z]|$)"));
-
QString name = printers.at(i).name;
QString comment = printers.at(i).comment;
if (quality < 5 && name == dollarPrinter) {
@@ -824,331 +849,77 @@ int qt_getLprPrinters(QList<QPrinterDescription>& printers)
QList<QPrinterInfo> QPrinterInfo::availablePrinters()
{
- QList<QPrinterInfo> list;
+ QList<QPrinterInfo> printers;
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
- QCUPSSupport cups;
if (QCUPSSupport::isAvailable()) {
- //const ppd_file_t* cupsPPD = cups.currentPPD();
+ QCUPSSupport cups;
int cupsPrinterCount = cups.availablePrintersCount();
const cups_dest_t* cupsPrinters = cups.availablePrinters();
-
for (int i = 0; i < cupsPrinterCount; ++i) {
QString printerName(QString::fromLocal8Bit(cupsPrinters[i].name));
if (cupsPrinters[i].instance)
printerName += QLatin1Char('/') + QString::fromLocal8Bit(cupsPrinters[i].instance);
- list.append(QPrinterInfo(printerName));
+
+ QPrinterInfo printerInfo(printerName);
if (cupsPrinters[i].is_default)
- list[i].d_ptr->m_default = true;
- list[i].d_ptr->m_cupsPrinterIndex = i;
+ printerInfo.d_ptr->isDefault = true;
+ printerInfo.d_ptr->cupsPrinterIndex = i;
+ printers.append(printerInfo);
}
- } else {
+ } else
#endif
+ {
QList<QPrinterDescription> lprPrinters;
int defprn = qt_getLprPrinters(lprPrinters);
// populating printer combo
- QList<QPrinterDescription>::const_iterator i = lprPrinters.constBegin();
- for(; i != lprPrinters.constEnd(); ++i) {
- list.append(QPrinterInfo((*i).name));
- }
- if (defprn >= 0 && defprn < lprPrinters.size()) {
- list[defprn].d_ptr->m_default = true;
- }
-#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
+ foreach (const QPrinterDescription &description, lprPrinters)
+ printers.append(QPrinterInfo(description.name));
+ if (defprn >= 0 && defprn < printers.size())
+ printers[defprn].d_ptr->isDefault = true;
}
-#endif
- return list;
+ return printers;
}
QPrinterInfo QPrinterInfo::defaultPrinter()
{
- QList<QPrinterInfo> prnList = availablePrinters();
- for (int i = 0; i < prnList.size(); ++i) {
- if (prnList[i].isDefault())
- return prnList[i];
+ QList<QPrinterInfo> printers = availablePrinters();
+ foreach (const QPrinterInfo &printerInfo, printers) {
+ if (printerInfo.isDefault())
+ return printerInfo;
}
- return (prnList.size() > 0) ? prnList[0] : QPrinterInfo();
-}
-
-QPrinterInfo::QPrinterInfo()
- : d_ptr(&nullQPrinterInfoPrivate)
-{
-}
-QPrinterInfo::QPrinterInfo(const QPrinterInfo& src)
- : d_ptr(&nullQPrinterInfoPrivate)
-{
- *this = src;
+ return printers.value(0);
}
-QPrinterInfo::QPrinterInfo(const QPrinter& printer)
- : d_ptr(new QPrinterInfoPrivate(printer.printerName()))
+QList<QPrinter::PaperSize> QPrinterInfo::supportedPaperSizes() const
{
-
- Q_D(QPrinterInfo);
- d->q_ptr = this;
-
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
- QCUPSSupport cups;
- if (QCUPSSupport::isAvailable()) {
- int cupsPrinterCount = cups.availablePrintersCount();
- const cups_dest_t* cupsPrinters = cups.availablePrinters();
-
- for (int i = 0; i < cupsPrinterCount; ++i) {
- QString printerName(QString::fromLocal8Bit(cupsPrinters[i].name));
- if (cupsPrinters[i].instance)
- printerName += QLatin1Char('/') + QString::fromLocal8Bit(cupsPrinters[i].instance);
- if (printerName == printer.printerName()) {
- if (cupsPrinters[i].is_default)
- d->m_default = true;
- d->m_cupsPrinterIndex = i;
- return;
- }
- }
- } else {
-#endif
- QList<QPrinterDescription> lprPrinters;
- int defprn = qt_getLprPrinters(lprPrinters);
- // populating printer combo
- QList<QPrinterDescription>::const_iterator i = lprPrinters.constBegin();
- int c;
- for(c = 0; i != lprPrinters.constEnd(); ++i, ++c) {
- if (i->name == printer.printerName()) {
- if (defprn == c)
- d->m_default = true;
- return;
- }
- }
-#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
- }
-#endif
-
- // Printer not found.
- d_ptr.reset(&nullQPrinterInfoPrivate);
-}
-
-QPrinterInfo::QPrinterInfo(const QString& name)
- : d_ptr(new QPrinterInfoPrivate(name))
-{
- d_ptr->q_ptr = this;
-}
-
-QPrinterInfo::~QPrinterInfo()
-{
-}
-
-QPrinterInfo& QPrinterInfo::operator=(const QPrinterInfo& src)
-{
- Q_ASSERT(d_ptr);
- d_ptr.reset(new QPrinterInfoPrivate(*src.d_ptr));
- d_ptr->q_ptr = this;
- return *this;
-}
-
-QString QPrinterInfo::printerName() const
-{
const Q_D(QPrinterInfo);
- return d->m_name;
-}
-
-bool QPrinterInfo::isNull() const
-{
- const Q_D(QPrinterInfo);
- return d->m_isNull;
-}
-bool QPrinterInfo::isDefault() const
-{
- const Q_D(QPrinterInfo);
- return d->m_default;
-}
+ if (isNull())
+ return d->paperSizes;
-QList< QPrinter::PaperSize> QPrinterInfo::supportedPaperSizes() const
-{
- const Q_D(QPrinterInfo);
- if (d->m_mustGetPaperSizes) {
- d->m_mustGetPaperSizes = false;
+ if (!d->hasPaperSizes) {
+ d->hasPaperSizes = true;
-#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
- QCUPSSupport cups;
if (QCUPSSupport::isAvailable()) {
// Find paper sizes from CUPS.
- cups.setCurrentPrinter(d->m_cupsPrinterIndex);
+ QCUPSSupport cups;
+ cups.setCurrentPrinter(d->cupsPrinterIndex);
const ppd_option_t* sizes = cups.pageSizes();
if (sizes) {
- for (int j = 0; j < sizes->num_choices; ++j) {
- d->m_paperSizes.append(
- QPrinterInfoPrivate::string2PaperSize(
- QLatin1String(sizes->choices[j].choice)));
- }
+ for (int j = 0; j < sizes->num_choices; ++j)
+ d->paperSizes.append(string2PaperSize(sizes->choices[j].choice));
}
}
-#endif
-
}
- return d->m_paperSizes;
-}
-
-/////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////////////////////////////////////////////////
-
-QPrinterInfoPrivate::QPrinterInfoPrivate()
-{
- m_isNull = true;
- m_default = false;
- m_mustGetPaperSizes = true;
- m_cupsPrinterIndex = 0;
- q_ptr = 0;
-}
-
-QPrinterInfoPrivate::QPrinterInfoPrivate(const QString& name)
-{
- m_name = name;
- m_isNull = false;
- m_default = false;
- m_mustGetPaperSizes = true;
- m_cupsPrinterIndex = 0;
- q_ptr = 0;
-}
-QPrinterInfoPrivate::~QPrinterInfoPrivate()
-{
-}
-
-QPrinter::PaperSize QPrinterInfoPrivate::string2PaperSize(const QString& str)
-{
- if (str == QLatin1String("A4")) {
- return QPrinter::A4;
- } else if (str == QLatin1String("B5")) {
- return QPrinter::B5;
- } else if (str == QLatin1String("Letter")) {
- return QPrinter::Letter;
- } else if (str == QLatin1String("Legal")) {
- return QPrinter::Legal;
- } else if (str == QLatin1String("Executive")) {
- return QPrinter::Executive;
- } else if (str == QLatin1String("A0")) {
- return QPrinter::A0;
- } else if (str == QLatin1String("A1")) {
- return QPrinter::A1;
- } else if (str == QLatin1String("A2")) {
- return QPrinter::A2;
- } else if (str == QLatin1String("A3")) {
- return QPrinter::A3;
- } else if (str == QLatin1String("A5")) {
- return QPrinter::A5;
- } else if (str == QLatin1String("A6")) {
- return QPrinter::A6;
- } else if (str == QLatin1String("A7")) {
- return QPrinter::A7;
- } else if (str == QLatin1String("A8")) {
- return QPrinter::A8;
- } else if (str == QLatin1String("A9")) {
- return QPrinter::A9;
- } else if (str == QLatin1String("B0")) {
- return QPrinter::B0;
- } else if (str == QLatin1String("B1")) {
- return QPrinter::B1;
- } else if (str == QLatin1String("B10")) {
- return QPrinter::B10;
- } else if (str == QLatin1String("B2")) {
- return QPrinter::B2;
- } else if (str == QLatin1String("B3")) {
- return QPrinter::B3;
- } else if (str == QLatin1String("B4")) {
- return QPrinter::B4;
- } else if (str == QLatin1String("B6")) {
- return QPrinter::B6;
- } else if (str == QLatin1String("B7")) {
- return QPrinter::B7;
- } else if (str == QLatin1String("B8")) {
- return QPrinter::B8;
- } else if (str == QLatin1String("B9")) {
- return QPrinter::B9;
- } else if (str == QLatin1String("C5E")) {
- return QPrinter::C5E;
- } else if (str == QLatin1String("Comm10E")) {
- return QPrinter::Comm10E;
- } else if (str == QLatin1String("DLE")) {
- return QPrinter::DLE;
- } else if (str == QLatin1String("Folio")) {
- return QPrinter::Folio;
- } else if (str == QLatin1String("Ledger")) {
- return QPrinter::Ledger;
- } else if (str == QLatin1String("Tabloid")) {
- return QPrinter::Tabloid;
- } else {
- return QPrinter::Custom;
- }
-}
-
-QString QPrinterInfoPrivate::pageSize2String(QPrinter::PaperSize size)
-{
- switch (size) {
- case QPrinter::A4:
- return QLatin1String("A4");
- case QPrinter::B5:
- return QLatin1String("B5");
- case QPrinter::Letter:
- return QLatin1String("Letter");
- case QPrinter::Legal:
- return QLatin1String("Legal");
- case QPrinter::Executive:
- return QLatin1String("Executive");
- case QPrinter::A0:
- return QLatin1String("A0");
- case QPrinter::A1:
- return QLatin1String("A1");
- case QPrinter::A2:
- return QLatin1String("A2");
- case QPrinter::A3:
- return QLatin1String("A3");
- case QPrinter::A5:
- return QLatin1String("A5");
- case QPrinter::A6:
- return QLatin1String("A6");
- case QPrinter::A7:
- return QLatin1String("A7");
- case QPrinter::A8:
- return QLatin1String("A8");
- case QPrinter::A9:
- return QLatin1String("A9");
- case QPrinter::B0:
- return QLatin1String("B0");
- case QPrinter::B1:
- return QLatin1String("B1");
- case QPrinter::B10:
- return QLatin1String("B10");
- case QPrinter::B2:
- return QLatin1String("B2");
- case QPrinter::B3:
- return QLatin1String("B3");
- case QPrinter::B4:
- return QLatin1String("B4");
- case QPrinter::B6:
- return QLatin1String("B6");
- case QPrinter::B7:
- return QLatin1String("B7");
- case QPrinter::B8:
- return QLatin1String("B8");
- case QPrinter::B9:
- return QLatin1String("B9");
- case QPrinter::C5E:
- return QLatin1String("C5E");
- case QPrinter::Comm10E:
- return QLatin1String("Comm10E");
- case QPrinter::DLE:
- return QLatin1String("DLE");
- case QPrinter::Folio:
- return QLatin1String("Folio");
- case QPrinter::Ledger:
- return QLatin1String("Ledger");
- case QPrinter::Tabloid:
- return QLatin1String("Tabloid");
- default:
- return QLatin1String("Custom");
- }
+ return d->paperSizes;
+#else
+ return QList<QPrinter::PaperSize>();
+#endif
}
#endif // QT_NO_PRINTER
diff --git a/src/gui/painting/qprinterinfo_win.cpp b/src/gui/painting/qprinterinfo_win.cpp
index caada1f..2d25063 100644
--- a/src/gui/painting/qprinterinfo_win.cpp
+++ b/src/gui/painting/qprinterinfo_win.cpp
@@ -40,6 +40,7 @@
****************************************************************************/
#include "qprinterinfo.h"
+#include "qprinterinfo_p.h"
#include <qstringlist.h>
@@ -51,59 +52,25 @@ QT_BEGIN_NAMESPACE
extern QPrinter::PaperSize mapDevmodePaperSize(int s);
-class QPrinterInfoPrivate
-{
-Q_DECLARE_PUBLIC(QPrinterInfo)
-public:
- ~QPrinterInfoPrivate();
- QPrinterInfoPrivate();
- QPrinterInfoPrivate(const QString& name);
-
-private:
- QString m_name;
- bool m_default;
- bool m_isNull;
-
- QPrinterInfo* q_ptr;
-};
-
-static QPrinterInfoPrivate nullQPrinterInfoPrivate;
-
-class QPrinterInfoPrivateDeleter
-{
-public:
- static inline void cleanup(QPrinterInfoPrivate *d)
- {
- if (d != &nullQPrinterInfoPrivate)
- delete d;
- }
-};
-
-/////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////////////////////////////////////////////////
-
QList<QPrinterInfo> QPrinterInfo::availablePrinters()
{
QList<QPrinterInfo> printers;
- LPBYTE buffer;
+
DWORD needed = 0;
DWORD returned = 0;
-
- if ( !EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, NULL, 4, 0, 0, &needed, &returned))
- {
- buffer = new BYTE[needed];
- if (!EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS , NULL,
- 4, buffer, needed, &needed, &returned))
- {
- delete [] buffer;
- return printers;
- }
- PPRINTER_INFO_4 infoList = reinterpret_cast<PPRINTER_INFO_4>(buffer);
- QPrinterInfo defPrn = defaultPrinter();
- for (uint i = 0; i < returned; ++i) {
- printers.append(QPrinterInfo(QString::fromWCharArray(infoList[i].pPrinterName)));
- if (printers.at(i).printerName() == defPrn.printerName())
- printers[i].d_ptr->m_default = true;
+ if (!EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, NULL, 4, 0, 0, &needed, &returned)) {
+ LPBYTE buffer = new BYTE[needed];
+ if (EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, NULL, 4, buffer, needed, &needed, &returned)) {
+ PPRINTER_INFO_4 infoList = reinterpret_cast<PPRINTER_INFO_4>(buffer);
+ QPrinterInfo defPrn = defaultPrinter();
+ for (uint i = 0; i < returned; ++i) {
+ QString printerName(QString::fromWCharArray(infoList[i].pPrinterName));
+
+ QPrinterInfo printerInfo(printerName);
+ if (printerInfo.printerName() == defPrn.printerName())
+ printerInfo.d_ptr->isDefault = true;
+ printers.append(printerInfo);
+ }
}
delete [] buffer;
}
@@ -117,127 +84,37 @@ QPrinterInfo QPrinterInfo::defaultPrinter()
wchar_t buffer[256];
GetProfileString(L"windows", L"device", (wchar_t*)noPrinters.utf16(), buffer, 256);
QString output = QString::fromWCharArray(buffer);
-
- // Filter out the name of the printer, which should be everything
- // before a comma.
- bool noConfiguredPrinters = (output == noPrinters);
- QStringList info = output.split(QLatin1Char(','));
- QString printerName = noConfiguredPrinters ? QString() : info.at(0);
-
- QPrinterInfo prn(printerName);
- prn.d_ptr->m_default = true;
- if (noConfiguredPrinters)
- prn.d_ptr->m_isNull = true;
- return prn;
-}
-
-/////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////////////////////////////////////////////////
-
-QPrinterInfo::QPrinterInfo()
- : d_ptr(&nullQPrinterInfoPrivate)
-{
-}
-
-QPrinterInfo::QPrinterInfo(const QString& name)
- : d_ptr(new QPrinterInfoPrivate(name))
-{
- d_ptr->q_ptr = this;
-}
-
-QPrinterInfo::QPrinterInfo(const QPrinterInfo& src)
- : d_ptr(&nullQPrinterInfoPrivate)
-{
- *this = src;
-}
-
-QPrinterInfo::QPrinterInfo(const QPrinter& prn)
- : d_ptr(&nullQPrinterInfoPrivate)
-{
- QList<QPrinterInfo> list = availablePrinters();
- for (int c = 0; c < list.size(); ++c) {
- if (prn.printerName() == list[c].printerName()) {
- *this = list[c];
- return;
- }
+ if (output != noPrinters) {
+ // Filter out the name of the printer, which should be everything before a comma.
+ QString printerName = output.split(QLatin1Char(',')).value(0);
+ QPrinterInfo printerInfo(printerName);
+ printerInfo.d_ptr->isDefault = true;
+ return printerInfo;
}
- *this = QPrinterInfo();
-}
-
-QPrinterInfo::~QPrinterInfo()
-{
-}
-
-QPrinterInfo& QPrinterInfo::operator=(const QPrinterInfo& src)
-{
- Q_ASSERT(d_ptr);
- d_ptr.reset(new QPrinterInfoPrivate(*src.d_ptr));
- d_ptr->q_ptr = this;
- return *this;
-}
-
-QString QPrinterInfo::printerName() const
-{
- const Q_D(QPrinterInfo);
- return d->m_name;
-}
-
-bool QPrinterInfo::isNull() const
-{
- const Q_D(QPrinterInfo);
- return d->m_isNull;
-}
-
-bool QPrinterInfo::isDefault() const
-{
- const Q_D(QPrinterInfo);
- return d->m_default;
+ return QPrinterInfo();
}
QList<QPrinter::PaperSize> QPrinterInfo::supportedPaperSizes() const
{
const Q_D(QPrinterInfo);
- QList<QPrinter::PaperSize> paperList;
- DWORD size = DeviceCapabilities(reinterpret_cast<const wchar_t*>(d->m_name.utf16()),
- NULL, DC_PAPERS, NULL, NULL);
- if ((int)size == -1)
- return paperList;
-
- wchar_t *papers = new wchar_t[size];
- size = DeviceCapabilities(reinterpret_cast<const wchar_t*>(d->m_name.utf16()),
- NULL, DC_PAPERS, papers, NULL);
+ QList<QPrinter::PaperSize> paperSizes;
+ if (isNull())
+ return paperSizes;
- for (int c = 0; c < (int)size; ++c) {
- paperList.append(mapDevmodePaperSize(papers[c]));
+ DWORD size = DeviceCapabilities(reinterpret_cast<const wchar_t*>(d->name.utf16()),
+ NULL, DC_PAPERS, NULL, NULL);
+ if ((int)size != -1) {
+ wchar_t *papers = new wchar_t[size];
+ size = DeviceCapabilities(reinterpret_cast<const wchar_t*>(d->name.utf16()),
+ NULL, DC_PAPERS, papers, NULL);
+ for (int c = 0; c < (int)size; ++c)
+ paperSizes.append(mapDevmodePaperSize(papers[c]));
+ delete [] papers;
}
- delete [] papers;
-
- return paperList;
-}
-
-/////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////////////////////////////////////////////////
-
-QPrinterInfoPrivate::QPrinterInfoPrivate() :
- m_default(false),
- m_isNull(true),
- q_ptr(NULL)
-{
-}
-
-QPrinterInfoPrivate::QPrinterInfoPrivate(const QString& name) :
- m_name(name),
- m_default(false),
- m_isNull(false),
- q_ptr(NULL)
-{
-}
-
-QPrinterInfoPrivate::~QPrinterInfoPrivate()
-{
+ return paperSizes;
}
#endif // QT_NO_PRINTER
diff --git a/src/gui/painting/qtextureglyphcache.cpp b/src/gui/painting/qtextureglyphcache.cpp
index de59524..60300c3 100644
--- a/src/gui/painting/qtextureglyphcache.cpp
+++ b/src/gui/painting/qtextureglyphcache.cpp
@@ -225,7 +225,7 @@ bool QTextureGlyphCache::populate(QFontEngine *fontEngine, int numGlyphs, const
// no room on the current line, start new glyph strip
m_cx = 0;
m_cy += m_currentRowHeight + paddingDoubled;
- m_currentRowHeight = 0; // New row
+ m_currentRowHeight = c.h + margin * 2; // New row
}
}
@@ -445,7 +445,7 @@ void QImageTextureGlyphCache::fillTexture(const Coord &c, glyph_t g, QFixed subP
QPoint base(c.x + glyphMargin(), c.y + glyphMargin() + c.baseLineY-1);
if (m_image.rect().contains(base))
m_image.setPixel(base, 255);
- m_image.save(QString::fromLatin1("cache-%1.png").arg(int(this)));
+ m_image.save(QString::fromLatin1("cache-%1.png").arg(qint64(this)));
#endif
}
diff --git a/src/gui/painting/qunifiedtoolbarsurface_mac.cpp b/src/gui/painting/qunifiedtoolbarsurface_mac.cpp
index ace0a46..02ba8db 100644
--- a/src/gui/painting/qunifiedtoolbarsurface_mac.cpp
+++ b/src/gui/painting/qunifiedtoolbarsurface_mac.cpp
@@ -83,11 +83,11 @@ void QUnifiedToolbarSurface::recursiveRedirect(QObject *object, const QPoint &of
widget->d_func()->unifiedSurface = this;
widget->d_func()->isInUnifiedToolbar = true;
widget->d_func()->toolbar_offset = offset;
- }
- }
- for (int i = 0; i < object->children().size(); ++i) {
- recursiveRedirect(object->children().at(i), offset);
+ for (int i = 0; i < object->children().size(); ++i) {
+ recursiveRedirect(object->children().at(i), offset);
+ }
+ }
}
}
}
diff --git a/src/gui/styles/qcommonstyle.cpp b/src/gui/styles/qcommonstyle.cpp
index 039a6da..e443832 100644
--- a/src/gui/styles/qcommonstyle.cpp
+++ b/src/gui/styles/qcommonstyle.cpp
@@ -1403,8 +1403,9 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt,
}
break;
case CE_ProgressBarGroove:
- qDrawShadePanel(p, opt->rect, opt->palette, true, 1,
- &opt->palette.brush(QPalette::Window));
+ if (opt->rect.isValid())
+ qDrawShadePanel(p, opt->rect, opt->palette, true, 1,
+ &opt->palette.brush(QPalette::Window));
break;
case CE_ProgressBarLabel:
if (const QStyleOptionProgressBar *pb = qstyleoption_cast<const QStyleOptionProgressBar *>(opt)) {
@@ -2217,7 +2218,7 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt,
if (vopt->state & QStyle::State_HasFocus) {
QStyleOptionFocusRect o;
o.QStyleOption::operator=(*vopt);
- o.rect = subElementRect(SE_ItemViewItemFocusRect, vopt, widget);
+ o.rect = proxy()->subElementRect(SE_ItemViewItemFocusRect, vopt, widget);
o.state |= QStyle::State_KeyboardFocusChange;
o.state |= QStyle::State_Item;
QPalette::ColorGroup cg = (vopt->state & QStyle::State_Enabled)
diff --git a/src/gui/styles/qgtkstyle.cpp b/src/gui/styles/qgtkstyle.cpp
index 9cc64b3..323639a 100644
--- a/src/gui/styles/qgtkstyle.cpp
+++ b/src/gui/styles/qgtkstyle.cpp
@@ -1706,12 +1706,17 @@ void QGtkStyle::drawComplexControl(ComplexControl control, const QStyleOptionCom
fakePos = maximum;
else if (scrollBar->sliderPosition > scrollBar->minimum)
fakePos = maximum - 1;
- GtkObject *adjustment = d->gtk_adjustment_new(fakePos, 0, maximum, 0, 0, 0);
- if (horizontal)
- d->gtk_range_set_adjustment((GtkRange*)(gtkHScrollBar), (GtkAdjustment*)(adjustment));
- else
- d->gtk_range_set_adjustment((GtkRange*)(gtkVScrollBar), (GtkAdjustment*)(adjustment));
+
+ GtkRange *range = (GtkRange*)(horizontal ? gtkHScrollBar : gtkVScrollBar);
+ GtkAdjustment *adjustment = d->gtk_range_get_adjustment(range);
+
+ if (adjustment) {
+ d->gtk_adjustment_configure(adjustment, fakePos, 0, maximum, 0, 0, 0);
+ } else {
+ adjustment = (GtkAdjustment*)d->gtk_adjustment_new(fakePos, 0, maximum, 0, 0, 0);
+ d->gtk_range_set_adjustment(range, adjustment);
+ }
if (scrollBar->subControls & SC_ScrollBarGroove) {
GtkStateType state = GTK_STATE_ACTIVE;
@@ -1990,15 +1995,29 @@ void QGtkStyle::drawComplexControl(ComplexControl control, const QStyleOptionCom
style = scaleWidget->style;
if ((option->subControls & SC_SliderGroove) && groove.isValid()) {
- GtkObject *adjustment = d->gtk_adjustment_new(slider->sliderPosition,
- slider->minimum,
- slider->maximum,
- slider->singleStep,
- slider->singleStep,
- slider->pageStep);
+
+ GtkRange *range = (GtkRange*)scaleWidget;
+ GtkAdjustment *adjustment = d->gtk_range_get_adjustment(range);
+ if (adjustment) {
+ d->gtk_adjustment_configure(adjustment,
+ slider->sliderPosition,
+ slider->minimum,
+ slider->maximum,
+ slider->singleStep,
+ slider->singleStep,
+ slider->pageStep);
+ } else {
+ adjustment = (GtkAdjustment*)d->gtk_adjustment_new(slider->sliderPosition,
+ slider->minimum,
+ slider->maximum,
+ slider->singleStep,
+ slider->singleStep,
+ slider->pageStep);
+ d->gtk_range_set_adjustment(range, adjustment);
+ }
+
int outerSize;
- d->gtk_range_set_adjustment ((GtkRange*)(scaleWidget), (GtkAdjustment*)(adjustment));
- d->gtk_range_set_inverted((GtkRange*)(scaleWidget), !horizontal);
+ d->gtk_range_set_inverted(range, !horizontal);
d->gtk_widget_style_get(scaleWidget, "trough-border", &outerSize, NULL);
outerSize++;
@@ -2998,8 +3017,7 @@ void QGtkStyle::drawControl(ControlElement element,
else if (bar->progress > bar->minimum)
fakePos = maximum - 1;
- GtkObject *adjustment = d->gtk_adjustment_new(fakePos, 0, maximum, 0, 0, 0);
- d->gtk_progress_set_adjustment((GtkProgress*)(gtkProgressBar), (GtkAdjustment*)(adjustment));
+ d->gtk_progress_configure((GtkProgress*)gtkProgressBar, fakePos, 0, maximum);
QRect progressBar;
diff --git a/src/gui/styles/qgtkstyle_p.cpp b/src/gui/styles/qgtkstyle_p.cpp
index fdbe1f8..aa56baa 100644
--- a/src/gui/styles/qgtkstyle_p.cpp
+++ b/src/gui/styles/qgtkstyle_p.cpp
@@ -121,7 +121,8 @@ Ptr_gtk_combo_box_entry_new QGtkStylePrivate::gtk_combo_box_entry_new = 0;
Ptr_gtk_progress_bar_new QGtkStylePrivate::gtk_progress_bar_new = 0;
Ptr_gtk_container_add QGtkStylePrivate::gtk_container_add = 0;
Ptr_gtk_menu_shell_append QGtkStylePrivate::gtk_menu_shell_append = 0;
-Ptr_gtk_progress_set_adjustment QGtkStylePrivate::gtk_progress_set_adjustment = 0;
+Ptr_gtk_progress_configure QGtkStylePrivate::gtk_progress_configure = 0;
+Ptr_gtk_range_get_adjustment QGtkStylePrivate::gtk_range_get_adjustment = 0;
Ptr_gtk_range_set_adjustment QGtkStylePrivate::gtk_range_set_adjustment = 0;
Ptr_gtk_range_set_inverted QGtkStylePrivate::gtk_range_set_inverted = 0;
Ptr_gtk_icon_factory_lookup_default QGtkStylePrivate::gtk_icon_factory_lookup_default = 0;
@@ -145,6 +146,7 @@ Ptr_gtk_paint_focus QGtkStylePrivate::gtk_paint_focus = 0;
Ptr_gtk_paint_arrow QGtkStylePrivate::gtk_paint_arrow = 0;
Ptr_gtk_paint_handle QGtkStylePrivate::gtk_paint_handle = 0;
Ptr_gtk_paint_expander QGtkStylePrivate::gtk_paint_expander = 0;
+Ptr_gtk_adjustment_configure QGtkStylePrivate::gtk_adjustment_configure = 0;
Ptr_gtk_adjustment_new QGtkStylePrivate::gtk_adjustment_new = 0;
Ptr_gtk_paint_hline QGtkStylePrivate::gtk_paint_hline = 0;
Ptr_gtk_paint_vline QGtkStylePrivate::gtk_paint_vline = 0;
@@ -376,7 +378,8 @@ void QGtkStylePrivate::resolveGtk() const
gtk_entry_new = (Ptr_gtk_entry_new)libgtk.resolve("gtk_entry_new");
gtk_tree_view_new = (Ptr_gtk_tree_view_new)libgtk.resolve("gtk_tree_view_new");
gtk_combo_box_new = (Ptr_gtk_combo_box_new)libgtk.resolve("gtk_combo_box_new");
- gtk_progress_set_adjustment = (Ptr_gtk_progress_set_adjustment)libgtk.resolve("gtk_progress_set_adjustment");
+ gtk_progress_configure = (Ptr_gtk_progress_configure)libgtk.resolve("gtk_progress_configure");
+ gtk_range_get_adjustment = (Ptr_gtk_range_get_adjustment)libgtk.resolve("gtk_range_get_adjustment");
gtk_range_set_adjustment = (Ptr_gtk_range_set_adjustment)libgtk.resolve("gtk_range_set_adjustment");
gtk_range_set_inverted = (Ptr_gtk_range_set_inverted)libgtk.resolve("gtk_range_set_inverted");
gtk_container_add = (Ptr_gtk_container_add)libgtk.resolve("gtk_container_add");
@@ -405,6 +408,7 @@ void QGtkStylePrivate::resolveGtk() const
gtk_paint_extension = (Ptr_gtk_paint_extension)libgtk.resolve("gtk_paint_extension");
gtk_paint_hline = (Ptr_gtk_paint_hline)libgtk.resolve("gtk_paint_hline");
gtk_paint_vline = (Ptr_gtk_paint_vline)libgtk.resolve("gtk_paint_vline");
+ gtk_adjustment_configure = (Ptr_gtk_adjustment_configure)libgtk.resolve("gtk_adjustment_configure");
gtk_adjustment_new = (Ptr_gtk_adjustment_new)libgtk.resolve("gtk_adjustment_new");
gtk_menu_item_set_submenu = (Ptr_gtk_menu_item_set_submenu)libgtk.resolve("gtk_menu_item_set_submenu");
gtk_settings_get_default = (Ptr_gtk_settings_get_default)libgtk.resolve("gtk_settings_get_default");
diff --git a/src/gui/styles/qgtkstyle_p.h b/src/gui/styles/qgtkstyle_p.h
index 4e1d07a..16ceb3a 100644
--- a/src/gui/styles/qgtkstyle_p.h
+++ b/src/gui/styles/qgtkstyle_p.h
@@ -174,8 +174,9 @@ typedef GtkWidget* (*Ptr_gtk_frame_new)(const gchar *);
typedef GtkWidget* (*Ptr_gtk_expander_new)(const gchar*);
typedef GtkWidget* (*Ptr_gtk_statusbar_new)(void);
typedef GtkSettings* (*Ptr_gtk_settings_get_default)(void);
+typedef GtkAdjustment* (*Ptr_gtk_range_get_adjustment)(GtkRange *);
typedef void (*Ptr_gtk_range_set_adjustment)(GtkRange *, GtkAdjustment *);
-typedef void (*Ptr_gtk_progress_set_adjustment)(GtkProgress *, GtkAdjustment *);
+typedef void (*Ptr_gtk_progress_configure)(GtkProgress *, double, double, double);
typedef void (*Ptr_gtk_range_set_inverted)(GtkRange*, bool);
typedef void (*Ptr_gtk_container_add)(GtkContainer *container, GtkWidget *widget);
typedef GtkIconSet* (*Ptr_gtk_icon_factory_lookup_default) (const gchar*);
@@ -198,6 +199,7 @@ typedef void (*Ptr_gtk_paint_arrow) (GtkStyle*,GdkWindow*, GtkStateType, GtkSha
typedef void (*Ptr_gtk_paint_option) (GtkStyle*,GdkWindow*, GtkStateType, GtkShadowType, const GdkRectangle *, GtkWidget *, const gchar *, gint , gint , gint , gint);
typedef void (*Ptr_gtk_paint_flat_box) (GtkStyle*,GdkWindow*, GtkStateType, GtkShadowType, const GdkRectangle *, GtkWidget *, const gchar *, gint , gint , gint , gint);
typedef void (*Ptr_gtk_paint_extension) (GtkStyle *, GdkWindow *, GtkStateType, GtkShadowType, const GdkRectangle *, GtkWidget *, const gchar *, gint, gint, gint, gint, GtkPositionType);
+typedef void (*Ptr_gtk_adjustment_configure) (GtkAdjustment *, double, double, double, double, double, double);
typedef GtkObject* (*Ptr_gtk_adjustment_new) (double, double, double, double, double, double);
typedef void (*Ptr_gtk_paint_hline) (GtkStyle *, GdkWindow *, GtkStateType, const GdkRectangle *, GtkWidget *, const gchar *, gint, gint, gint y);
typedef void (*Ptr_gtk_paint_vline) (GtkStyle *, GdkWindow *, GtkStateType, const GdkRectangle *, GtkWidget *, const gchar *, gint, gint, gint);
@@ -393,7 +395,8 @@ public:
static Ptr_gtk_progress_bar_new gtk_progress_bar_new;
static Ptr_gtk_container_add gtk_container_add;
static Ptr_gtk_menu_shell_append gtk_menu_shell_append;
- static Ptr_gtk_progress_set_adjustment gtk_progress_set_adjustment;
+ static Ptr_gtk_progress_configure gtk_progress_configure;
+ static Ptr_gtk_range_get_adjustment gtk_range_get_adjustment;
static Ptr_gtk_range_set_adjustment gtk_range_set_adjustment;
static Ptr_gtk_range_set_inverted gtk_range_set_inverted;
static Ptr_gtk_icon_factory_lookup_default gtk_icon_factory_lookup_default;
@@ -416,6 +419,7 @@ public:
static Ptr_gtk_paint_arrow gtk_paint_arrow;
static Ptr_gtk_paint_handle gtk_paint_handle;
static Ptr_gtk_paint_expander gtk_paint_expander;
+ static Ptr_gtk_adjustment_configure gtk_adjustment_configure;
static Ptr_gtk_adjustment_new gtk_adjustment_new;
static Ptr_gtk_paint_vline gtk_paint_vline;
static Ptr_gtk_paint_hline gtk_paint_hline;
diff --git a/src/gui/styles/qs60style.cpp b/src/gui/styles/qs60style.cpp
index 3326c48..4a19b49 100644
--- a/src/gui/styles/qs60style.cpp
+++ b/src/gui/styles/qs60style.cpp
@@ -104,11 +104,11 @@ const int QS60StylePrivate::m_numberOfLayouts =
const short QS60StylePrivate::data[][MAX_PIXELMETRICS] = {
// *** generated pixel metrics ***
-{5,0,-909,0,0,2,0,0,-1,7,12,22,15,15,7,198,-909,-909,-909,20,13,2,0,0,21,7,18,30,3,3,1,-909,-909,0,1,0,0,12,20,15,15,18,18,1,115,18,0,-909,-909,-909,-909,0,0,16,2,-909,0,0,-909,16,-909,-909,-909,-909,32,18,55,24,55,4,4,4,9,13,-909,5,51,11,5,0,3,3,6,8,3,3,-909,2,-909,-909,-909,-909,5,5,3,1,106},
-{5,0,-909,0,0,1,0,0,-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,0,-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,0,-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,0,-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}
+{5,0,-909,0,0,2,0,2,-1,7,12,22,15,15,7,198,-909,-909,-909,20,13,2,0,0,21,7,18,30,3,3,1,-909,-909,0,1,0,0,12,20,15,15,18,18,1,115,18,0,-909,-909,-909,-909,0,0,16,2,-909,0,0,-909,16,-909,-909,-909,-909,32,18,55,24,55,4,4,4,9,13,-909,5,51,11,5,0,3,3,6,8,3,3,-909,2,-909,-909,-909,-909,5,5,3,1,106},
+{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}
// *** End of generated data ***
};
@@ -1071,11 +1071,11 @@ void QS60Style::drawComplexControl(ComplexControl control, const QStyleOptionCom
// Button frame
QStyleOptionFrame buttonOption;
buttonOption.QStyleOption::operator=(*cmb);
- const int maxHeight = cmbxFrame.height();
- const int maxWidth = cmbxFrame.width() - cmbxEditField.width();
+ const int maxButtonSide = cmbxFrame.width() - cmbxEditField.width();
+ const int newTop = cmbxEditField.center().y() - maxButtonSide / 2;
const int topLeftPoint = direction ?
- (cmbxEditField.right() + 1) : (cmbxEditField.left() + 1 - maxWidth);
- const QRect buttonRect(topLeftPoint, cmbxEditField.top(), maxWidth, maxHeight);
+ (cmbxEditField.right() + 1) : (cmbxEditField.left() + 1 - maxButtonSide);
+ const QRect buttonRect(topLeftPoint, newTop, maxButtonSide, maxButtonSide);
buttonOption.rect = buttonRect;
buttonOption.state = cmb->state;
drawPrimitive(PE_PanelButtonCommand, &buttonOption, painter, widget);
@@ -2884,30 +2884,24 @@ QRect QS60Style::subControlRect(ComplexControl control, const QStyleOptionComple
ret = cmb->rect;
const int width = cmb->rect.width();
const int height = cmb->rect.height();
- const int buttonIconSize = QS60StylePrivate::pixelMetric(PM_ButtonIconSize);
const int buttonMargin = cmb->frame ? 2 : 0;
// lets use spinbox frame here as well, as no combobox specific value available.
const int frameThickness = cmb->frame ? pixelMetric(PM_SpinBoxFrameWidth, cmb, widget) : 0;
- const int buttonWidth = qMax(cmb->rect.height(), buttonIconSize);
-
+ const int buttonMinSize = QS60StylePrivate::pixelMetric(PM_ButtonIconSize) + 2 * buttonMargin;
QSize buttonSize;
- buttonSize.setWidth(buttonWidth + 2 * buttonMargin);
- buttonSize.setHeight(qMax(8, (cmb->rect.height() >> 1) - frameThickness)); //buttons should be squares
+ //allow button to grow to one fourth of the frame height, if the frame is really tall
+ buttonSize.setHeight(qMin(height, qMax(width / 4, buttonMinSize)));
+ buttonSize.setWidth(buttonSize.height());
buttonSize = buttonSize.expandedTo(QApplication::globalStrut());
switch (scontrol) {
case SC_ComboBoxArrow: {
- const int xposMod = cmb->rect.x() + width - buttonMargin - buttonWidth;
+ const int xposMod = cmb->rect.x() + width - buttonMargin - buttonSize.width();
const int ypos = cmb->rect.y();
- ret.setRect(xposMod, ypos + buttonMargin, buttonWidth, height - 2 * buttonMargin);
+ ret.setRect(xposMod, ypos + buttonMargin, buttonSize.width(), height - 2 * buttonMargin);
}
break;
case SC_ComboBoxEditField: {
- const int withFrameX = cmb->rect.x() + width - frameThickness - buttonSize.width();
- ret = QRect(
- frameThickness,
- frameThickness,
- withFrameX - frameThickness,
- height - 2 * frameThickness);
+ ret = QRect(0, 0, cmb->rect.x() + width - buttonSize.width(), height);
}
break;
case SC_ComboBoxListBoxPopup: {
diff --git a/src/gui/styles/qs60style_s60.cpp b/src/gui/styles/qs60style_s60.cpp
index 7b75d40..92f53ff 100644
--- a/src/gui/styles/qs60style_s60.cpp
+++ b/src/gui/styles/qs60style_s60.cpp
@@ -698,7 +698,7 @@ void QS60StylePrivate::deleteStoredSettings()
{
QSettings settings(QSettings::UserScope, QLatin1String("Trolltech"));
settings.beginGroup(QLatin1String("QS60Style"));
- settings.remove("");
+ settings.remove(QString());
settings.endGroup();
}
@@ -717,7 +717,6 @@ QColor QS60StylePrivate::colorFromFrameGraphics(SkinFrameElements frame) const
QT_TRAP_THROWING(
CRepository *themeRepository = CRepository::NewLC(personalisationUID);
if (themeRepository) {
- static const TInt KThemePkgIDDesSize = 23; //size of the stored theme package ID
TBuf<32> value; //themeID is currently max of 8 + 1 + 8 characters, but lets have some extra space
const TUint32 key = 0x00000002; //active theme key in the repository
error = themeRepository->Get(key, value);
@@ -747,7 +746,7 @@ QColor QS60StylePrivate::colorFromFrameGraphics(SkinFrameElements frame) const
return storedColor;
}
}
- settings.remove(""); //if color was invalid, or theme has been changed, just delete all stored settings
+ settings.remove(QString()); //if color was invalid, or theme has been changed, just delete all stored settings
}
}
#endif
diff --git a/src/gui/styles/qwindowsstyle.cpp b/src/gui/styles/qwindowsstyle.cpp
index d994b9b..2604f1f 100644
--- a/src/gui/styles/qwindowsstyle.cpp
+++ b/src/gui/styles/qwindowsstyle.cpp
@@ -130,6 +130,7 @@ QWindowsStylePrivate::QWindowsStylePrivate()
pSHGetStockIconInfo = (PtrSHGetStockIconInfo)shellLib.resolve("SHGetStockIconInfo");
}
#endif
+ startTime.start();
}
// Returns true if the toplevel parent of \a widget has seen the Alt-key
@@ -2396,8 +2397,10 @@ void QWindowsStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPai
#ifndef QT_NO_PROGRESSBAR
case CE_ProgressBarContents:
if (const QStyleOptionProgressBar *pb = qstyleoption_cast<const QStyleOptionProgressBar *>(opt)) {
-
QRect rect = pb->rect;
+ if (!rect.isValid())
+ return;
+
bool vertical = false;
bool inverted = false;
diff --git a/src/gui/text/qfontdatabase_s60.cpp b/src/gui/text/qfontdatabase_s60.cpp
index 5e168c6..9a77a7a 100644
--- a/src/gui/text/qfontdatabase_s60.cpp
+++ b/src/gui/text/qfontdatabase_s60.cpp
@@ -116,7 +116,6 @@ public:
const QSymbianTypeFaceExtras *extras(const QString &typeface, bool bold, bool italic) const;
void addFontFileToFontStore(const QFileInfo &fontFileInfo);
-#ifndef Q_SYMBIAN_HAS_FONTTABLE_API
struct CFontFromFontStoreReleaser {
static inline void cleanup(CFont *font)
{
@@ -127,7 +126,6 @@ public:
dbExtras->m_store->ReleaseFont(font);
}
};
-#endif // !Q_SYMBIAN_HAS_FONTTABLE_API
struct CFontFromScreenDeviceReleaser {
static inline void cleanup(CFont *font)
@@ -138,37 +136,38 @@ public:
}
};
-#ifndef Q_SYMBIAN_HAS_FONTTABLE_API
+// m_heap, m_store, m_rasterizer and m_extras are used if Symbian
+// does not provide the Font Table API
RHeap* m_heap;
CFontStore *m_store;
COpenFontRasterizer *m_rasterizer;
mutable QList<const QSymbianTypeFaceExtras *> m_extras;
-#endif // !Q_SYMBIAN_HAS_FONTTABLE_API
+
mutable QHash<QString, const QSymbianTypeFaceExtras *> m_extrasHash;
};
QSymbianFontDatabaseExtrasImplementation::QSymbianFontDatabaseExtrasImplementation()
{
-#ifndef Q_SYMBIAN_HAS_FONTTABLE_API
- QStringList filters;
- filters.append(QLatin1String("*.ttf"));
- filters.append(QLatin1String("*.ccc"));
- filters.append(QLatin1String("*.ltt"));
- const QFileInfoList fontFiles = alternativeFilePaths(QLatin1String("resource\\Fonts"), filters);
-
- const TInt heapMinLength = 0x1000;
- const TInt heapMaxLength = qMax(0x20000 * fontFiles.count(), heapMinLength);
- m_heap = User::ChunkHeap(NULL, heapMinLength, heapMaxLength);
- QT_TRAP_THROWING(
- m_store = CFontStore::NewL(m_heap);
- m_rasterizer = COpenFontRasterizer::NewL(TUid::Uid(0x101F7F5E));
- CleanupStack::PushL(m_rasterizer);
- m_store->InstallRasterizerL(m_rasterizer);
- CleanupStack::Pop(m_rasterizer););
-
- foreach (const QFileInfo &fontFileInfo, fontFiles)
- addFontFileToFontStore(fontFileInfo);
-#endif // !Q_SYMBIAN_HAS_FONTTABLE_API
+ if (!QSymbianTypeFaceExtras::symbianFontTableApiAvailable()) {
+ QStringList filters;
+ filters.append(QLatin1String("*.ttf"));
+ filters.append(QLatin1String("*.ccc"));
+ filters.append(QLatin1String("*.ltt"));
+ const QFileInfoList fontFiles = alternativeFilePaths(QLatin1String("resource\\Fonts"), filters);
+
+ const TInt heapMinLength = 0x1000;
+ const TInt heapMaxLength = qMax(0x20000 * fontFiles.count(), heapMinLength);
+ m_heap = User::ChunkHeap(NULL, heapMinLength, heapMaxLength);
+ QT_TRAP_THROWING(
+ m_store = CFontStore::NewL(m_heap);
+ m_rasterizer = COpenFontRasterizer::NewL(TUid::Uid(0x101F7F5E));
+ CleanupStack::PushL(m_rasterizer);
+ m_store->InstallRasterizerL(m_rasterizer);
+ CleanupStack::Pop(m_rasterizer););
+
+ foreach (const QFileInfo &fontFileInfo, fontFiles)
+ addFontFileToFontStore(fontFileInfo);
+ }
}
void qt_cleanup_symbianFontDatabaseExtras()
@@ -177,26 +176,26 @@ void qt_cleanup_symbianFontDatabaseExtras()
static_cast<const QSymbianFontDatabaseExtrasImplementation*>(privateDb()->symbianExtras);
if (!dbExtras)
return; // initializeDb() has never been called
-#ifdef Q_SYMBIAN_HAS_FONTTABLE_API
- qDeleteAll(dbExtras->m_extrasHash);
-#else // Q_SYMBIAN_HAS_FONTTABLE_API
- typedef QList<const QSymbianTypeFaceExtras *>::iterator iterator;
- for (iterator p = dbExtras->m_extras.begin(); p != dbExtras->m_extras.end(); ++p) {
- dbExtras->m_store->ReleaseFont((*p)->fontOwner());
- delete *p;
+ if (QSymbianTypeFaceExtras::symbianFontTableApiAvailable()) {
+ qDeleteAll(dbExtras->m_extrasHash);
+ } else {
+ typedef QList<const QSymbianTypeFaceExtras *>::iterator iterator;
+ for (iterator p = dbExtras->m_extras.begin(); p != dbExtras->m_extras.end(); ++p) {
+ dbExtras->m_store->ReleaseFont((*p)->fontOwner());
+ delete *p;
+ }
+ dbExtras->m_extras.clear();
}
- dbExtras->m_extras.clear();
-#endif // Q_SYMBIAN_HAS_FONTTABLE_API
dbExtras->m_extrasHash.clear();
}
QSymbianFontDatabaseExtrasImplementation::~QSymbianFontDatabaseExtrasImplementation()
{
qt_cleanup_symbianFontDatabaseExtras();
-#ifndef Q_SYMBIAN_HAS_FONTTABLE_API
- delete m_store;
- m_heap->Close();
-#endif // !Q_SYMBIAN_HAS_FONTTABLE_API
+ if (!QSymbianTypeFaceExtras::symbianFontTableApiAvailable()) {
+ delete m_store;
+ m_heap->Close();
+ }
}
#ifndef FNTSTORE_H_INLINES_SUPPORT_FMM
@@ -228,44 +227,45 @@ const QSymbianTypeFaceExtras *QSymbianFontDatabaseExtrasImplementation::extras(c
searchSpec.iFontStyle.SetPosture(EPostureItalic);
CFont* font = NULL;
-#ifdef Q_SYMBIAN_HAS_FONTTABLE_API
- const TInt err = S60->screenDevice()->GetNearestFontToDesignHeightInPixels(font, searchSpec);
- Q_ASSERT(err == KErrNone && font);
- QScopedPointer<CFont, CFontFromScreenDeviceReleaser> sFont(font);
- QSymbianTypeFaceExtras *extras = new QSymbianTypeFaceExtras(font);
- sFont.take();
- m_extrasHash.insert(searchKey, extras);
-#else // Q_SYMBIAN_HAS_FONTTABLE_API
- const TInt err = m_store->GetNearestFontToDesignHeightInPixels(font, searchSpec);
- Q_ASSERT(err == KErrNone && font);
- const CBitmapFont *bitmapFont = static_cast<CBitmapFont*>(font);
- COpenFont *openFont =
-#ifdef FNTSTORE_H_INLINES_SUPPORT_FMM
- bitmapFont->OpenFont();
-#else // FNTSTORE_H_INLINES_SUPPORT_FMM
- OpenFontFromBitmapFont(bitmapFont);
-#endif // FNTSTORE_H_INLINES_SUPPORT_FMM
- const TOpenFontFaceAttrib* const attrib = openFont->FaceAttrib();
- const QString foundKey =
- QString((const QChar*)attrib->FullName().Ptr(), attrib->FullName().Length());
- if (!m_extrasHash.contains(foundKey)) {
- QScopedPointer<CFont, CFontFromFontStoreReleaser> sFont(font);
- QSymbianTypeFaceExtras *extras = new QSymbianTypeFaceExtras(font, openFont);
+ if (QSymbianTypeFaceExtras::symbianFontTableApiAvailable()) {
+ const TInt err = S60->screenDevice()->GetNearestFontToDesignHeightInPixels(font, searchSpec);
+ Q_ASSERT(err == KErrNone && font);
+ QScopedPointer<CFont, CFontFromScreenDeviceReleaser> sFont(font);
+ QSymbianTypeFaceExtras *extras = new QSymbianTypeFaceExtras(font);
sFont.take();
- m_extras.append(extras);
m_extrasHash.insert(searchKey, extras);
- m_extrasHash.insert(foundKey, extras);
} else {
- m_store->ReleaseFont(font);
- m_extrasHash.insert(searchKey, m_extrasHash.value(foundKey));
+ const TInt err = m_store->GetNearestFontToDesignHeightInPixels(font, searchSpec);
+ Q_ASSERT(err == KErrNone && font);
+ const CBitmapFont *bitmapFont = static_cast<CBitmapFont*>(font);
+ COpenFont *openFont =
+#ifdef FNTSTORE_H_INLINES_SUPPORT_FMM
+ bitmapFont->OpenFont();
+#else // FNTSTORE_H_INLINES_SUPPORT_FMM
+ OpenFontFromBitmapFont(bitmapFont);
+#endif // FNTSTORE_H_INLINES_SUPPORT_FMM
+ const TOpenFontFaceAttrib* const attrib = openFont->FaceAttrib();
+ const QString foundKey =
+ QString((const QChar*)attrib->FullName().Ptr(), attrib->FullName().Length());
+ if (!m_extrasHash.contains(foundKey)) {
+ QScopedPointer<CFont, CFontFromFontStoreReleaser> sFont(font);
+ QSymbianTypeFaceExtras *extras = new QSymbianTypeFaceExtras(font, openFont);
+ sFont.take();
+ m_extras.append(extras);
+ m_extrasHash.insert(searchKey, extras);
+ m_extrasHash.insert(foundKey, extras);
+ } else {
+ m_store->ReleaseFont(font);
+ m_extrasHash.insert(searchKey, m_extrasHash.value(foundKey));
+ }
}
-#endif // Q_SYMBIAN_HAS_FONTTABLE_API
}
return m_extrasHash.value(searchKey);
}
void 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));
diff --git a/src/gui/text/qfontengine_coretext.mm b/src/gui/text/qfontengine_coretext.mm
index dcc8329..2ae60b1 100644
--- a/src/gui/text/qfontengine_coretext.mm
+++ b/src/gui/text/qfontengine_coretext.mm
@@ -50,6 +50,8 @@
QT_BEGIN_NAMESPACE
+static float SYNTHETIC_ITALIC_SKEW = tanf(14 * acosf(0) / 90);
+
QCoreTextFontEngineMulti::QCoreTextFontEngineMulti(const QCFString &name, const QFontDef &fontDef, bool kerning)
: QFontEngineMulti(0)
{
@@ -396,6 +398,9 @@ glyph_metrics_t QCoreTextFontEngine::boundingBox(glyph_t glyph)
glyph_metrics_t ret;
CGGlyph g = glyph;
CGRect rect = CTFontGetBoundingRectsForGlyphs(ctfont, kCTFontHorizontalOrientation, &g, 0, 1);
+ if (synthesisFlags & QFontEngine::SynthesizedItalic) {
+ rect.size.width += rect.size.height * SYNTHETIC_ITALIC_SKEW;
+ }
ret.width = QFixed::fromReal(rect.size.width);
ret.height = QFixed::fromReal(rect.size.height);
ret.x = QFixed::fromReal(rect.origin.x);
@@ -487,7 +492,7 @@ void QCoreTextFontEngine::draw(CGContextRef ctx, qreal x, qreal y, const QTextIt
CGAffineTransformConcat(cgMatrix, oldTextMatrix);
if (synthesisFlags & QFontEngine::SynthesizedItalic)
- cgMatrix = CGAffineTransformConcat(cgMatrix, CGAffineTransformMake(1, 0, -tanf(14 * acosf(0) / 90), 1, 0, 0));
+ cgMatrix = CGAffineTransformConcat(cgMatrix, CGAffineTransformMake(1, 0, -SYNTHETIC_ITALIC_SKEW, 1, 0, 0));
cgMatrix = CGAffineTransformConcat(cgMatrix, transform);
@@ -570,13 +575,11 @@ static void convertCGPathToQPainterPath(void *info, const CGPathElement *element
void QCoreTextFontEngine::addGlyphsToPath(glyph_t *glyphs, QFixedPoint *positions, int nGlyphs,
QPainterPath *path, QTextItem::RenderFlags)
{
-
CGAffineTransform cgMatrix = CGAffineTransformIdentity;
cgMatrix = CGAffineTransformScale(cgMatrix, 1, -1);
if (synthesisFlags & QFontEngine::SynthesizedItalic)
- cgMatrix = CGAffineTransformConcat(cgMatrix, CGAffineTransformMake(1, 0, -tanf(14 * acosf(0) / 90), 1, 0, 0));
-
+ cgMatrix = CGAffineTransformConcat(cgMatrix, CGAffineTransformMake(1, 0, -SYNTHETIC_ITALIC_SKEW, 1, 0, 0));
for (int i = 0; i < nGlyphs; ++i) {
QCFType<CGPathRef> cgpath = CTFontCreatePathForGlyph(ctfont, glyphs[i], &cgMatrix);
@@ -616,7 +619,7 @@ QImage QCoreTextFontEngine::imageForGlyph(glyph_t glyph, QFixed subPixelPosition
CGAffineTransformConcat(cgMatrix, oldTextMatrix);
if (synthesisFlags & QFontEngine::SynthesizedItalic)
- cgMatrix = CGAffineTransformConcat(cgMatrix, CGAffineTransformMake(1, 0, tanf(14 * acosf(0) / 90), 1, 0, 0));
+ cgMatrix = CGAffineTransformConcat(cgMatrix, CGAffineTransformMake(1, 0, SYNTHETIC_ITALIC_SKEW, 1, 0, 0));
cgMatrix = CGAffineTransformConcat(cgMatrix, transform);
diff --git a/src/gui/text/qfontengine_s60.cpp b/src/gui/text/qfontengine_s60.cpp
index 134c1ed..de61b55 100644
--- a/src/gui/text/qfontengine_s60.cpp
+++ b/src/gui/text/qfontengine_s60.cpp
@@ -46,115 +46,116 @@
#include <private/qapplication_p.h>
#include "qimage.h"
#include <private/qt_s60_p.h>
+#include <private/qpixmap_s60_p.h>
#include <e32base.h>
#include <e32std.h>
#include <eikenv.h>
#include <gdi.h>
-#if defined(Q_SYMBIAN_HAS_FONTTABLE_API) || defined(Q_SYMBIAN_HAS_GLYPHOUTLINE_API)
+#if defined(Q_SYMBIAN_HAS_GLYPHOUTLINE_API)
#include <graphics/gdi/gdiplatapi.h>
-#endif // Q_SYMBIAN_HAS_FONTTABLE_API || Q_SYMBIAN_HAS_GLYPHOUTLINE_API
+#endif // Q_SYMBIAN_HAS_GLYPHOUTLINE_API
+
+// Replication of TGetFontTableParam & friends.
+// There is unfortunately no compile time flag like SYMBIAN_FONT_TABLE_API
+// that would help us to only replicate these things for Symbian versions
+// that do not yet have the font table Api. Symbian's public SDK does
+// generally not define any usable macros.
+class QSymbianTGetFontTableParam
+{
+public:
+ TUint32 iTag;
+ TAny *iContent;
+ TInt iLength;
+};
+const TUid QSymbianKFontGetFontTable = {0x102872C1};
+const TUid QSymbianKFontReleaseFontTable = {0x2002AC24};
QT_BEGIN_NAMESPACE
-#ifdef Q_SYMBIAN_HAS_FONTTABLE_API
QSymbianTypeFaceExtras::QSymbianTypeFaceExtras(CFont* cFont, COpenFont *openFont)
: m_cFont(cFont)
, m_symbolCMap(false)
+ , m_openFont(openFont)
{
- Q_UNUSED(openFont)
+ if (!symbianFontTableApiAvailable()) {
+ TAny *trueTypeExtension = NULL;
+ m_openFont->ExtendedInterface(KUidOpenFontTrueTypeExtension, trueTypeExtension);
+ m_trueTypeExtension = static_cast<MOpenFontTrueTypeExtension*>(trueTypeExtension);
+ Q_ASSERT(m_trueTypeExtension);
+ }
}
QSymbianTypeFaceExtras::~QSymbianTypeFaceExtras()
{
- S60->screenDevice()->ReleaseFont(m_cFont);
+ if (symbianFontTableApiAvailable())
+ S60->screenDevice()->ReleaseFont(m_cFont);
}
QByteArray QSymbianTypeFaceExtras::getSfntTable(uint tag) const
{
- RFontTable fontTable;
- if (fontTable.Open(*m_cFont, tag) != KErrNone)
+ if (symbianFontTableApiAvailable()) {
+ QSymbianTGetFontTableParam fontTableParams = { tag, 0, 0 };
+ if (m_cFont->ExtendedFunction(QSymbianKFontGetFontTable, &fontTableParams) == KErrNone) {
+ const char* const fontTableContent =
+ static_cast<const char *>(fontTableParams.iContent);
+ const QByteArray fontTable(fontTableContent, fontTableParams.iLength);
+ m_cFont->ExtendedFunction(QSymbianKFontReleaseFontTable, &fontTableParams);
+ return fontTable;
+ }
return QByteArray();
- const QByteArray byteArray(reinterpret_cast<const char *>
- (fontTable.TableContent()),fontTable.TableLength());
- fontTable.Close();
- return byteArray;
+ } else {
+ Q_ASSERT(m_trueTypeExtension->HasTrueTypeTable(tag));
+ TInt error = KErrNone;
+ TInt tableByteLength = 0;
+ TAny *table = m_trueTypeExtension->GetTrueTypeTable(error, tag, &tableByteLength);
+ Q_CHECK_PTR(table);
+ const QByteArray result(static_cast<const char*>(table), tableByteLength);
+ m_trueTypeExtension->ReleaseTrueTypeTable(table);
+ return result;
+ }
}
bool QSymbianTypeFaceExtras::getSfntTableData(uint tag, uchar *buffer, uint *length) const
{
- RFontTable fontTable;
- if (fontTable.Open(*m_cFont, tag) != KErrNone)
- return false;
-
bool result = true;
- const TInt tableByteLength = fontTable.TableLength();
-
- if (*length > 0 && *length < tableByteLength) {
- result = false; // Caller did not allocate enough memory
+ if (symbianFontTableApiAvailable()) {
+ QSymbianTGetFontTableParam fontTableParams = { tag, 0, 0 };
+ if (m_cFont->ExtendedFunction(QSymbianKFontGetFontTable, &fontTableParams) == KErrNone) {
+ if (*length > 0 && *length < fontTableParams.iLength) {
+ result = false; // Caller did not allocate enough memory
+ } else {
+ *length = fontTableParams.iLength;
+ if (buffer)
+ memcpy(buffer, fontTableParams.iContent, fontTableParams.iLength);
+ }
+ m_cFont->ExtendedFunction(QSymbianKFontReleaseFontTable, &fontTableParams);
+ } else {
+ result = false;
+ }
} else {
- *length = tableByteLength;
- if (buffer)
- memcpy(buffer, fontTable.TableContent(), tableByteLength);
- }
-
- fontTable.Close();
- return result;
-}
-
-#else // Q_SYMBIAN_HAS_FONTTABLE_API
-QSymbianTypeFaceExtras::QSymbianTypeFaceExtras(CFont* cFont, COpenFont *openFont)
- : m_cFont(cFont)
- , m_symbolCMap(false)
- , m_openFont(openFont)
-{
- TAny *trueTypeExtension = NULL;
- m_openFont->ExtendedInterface(KUidOpenFontTrueTypeExtension, trueTypeExtension);
- m_trueTypeExtension = static_cast<MOpenFontTrueTypeExtension*>(trueTypeExtension);
- Q_ASSERT(m_trueTypeExtension);
-}
-
-QSymbianTypeFaceExtras::~QSymbianTypeFaceExtras()
-{
-}
-
-QByteArray QSymbianTypeFaceExtras::getSfntTable(uint tag) const
-{
- Q_ASSERT(m_trueTypeExtension->HasTrueTypeTable(tag));
- TInt error = KErrNone;
- TInt tableByteLength = 0;
- TAny *table = m_trueTypeExtension->GetTrueTypeTable(error, tag, &tableByteLength);
- Q_CHECK_PTR(table);
- QByteArray result(static_cast<const char*>(table), tableByteLength);
- m_trueTypeExtension->ReleaseTrueTypeTable(table);
- return result;
-}
+ if (!m_trueTypeExtension->HasTrueTypeTable(tag))
+ return false;
-bool QSymbianTypeFaceExtras::getSfntTableData(uint tag, uchar *buffer, uint *length) const
-{
- if (!m_trueTypeExtension->HasTrueTypeTable(tag))
- return false;
+ TInt error = KErrNone;
+ TInt tableByteLength;
+ TAny *table = m_trueTypeExtension->GetTrueTypeTable(error, tag, &tableByteLength);
+ Q_CHECK_PTR(table);
- bool result = true;
- TInt error = KErrNone;
- TInt tableByteLength;
- TAny *table = m_trueTypeExtension->GetTrueTypeTable(error, tag, &tableByteLength);
- Q_CHECK_PTR(table);
+ if (error != KErrNone) {
+ return false;
+ } else if (*length > 0 && *length < tableByteLength) {
+ result = false; // Caller did not allocate enough memory
+ } else {
+ *length = tableByteLength;
+ if (buffer)
+ memcpy(buffer, table, tableByteLength);
+ }
- if (error != KErrNone) {
- return false;
- } else if (*length > 0 && *length < tableByteLength) {
- result = false; // Caller did not allocate enough memory
- } else {
- *length = tableByteLength;
- if (buffer)
- memcpy(buffer, table, tableByteLength);
+ m_trueTypeExtension->ReleaseTrueTypeTable(table);
}
-
- m_trueTypeExtension->ReleaseTrueTypeTable(table);
return result;
}
-#endif // Q_SYMBIAN_HAS_FONTTABLE_API
const uchar *QSymbianTypeFaceExtras::cmap() const
{
@@ -196,6 +197,39 @@ QFixed QSymbianTypeFaceExtras::unitsPerEm() const
return m_unitsPerEm;
}
+bool QSymbianTypeFaceExtras::symbianFontTableApiAvailable()
+{
+ enum FontTableApiAvailability {
+ Unknown,
+ Available,
+ Unavailable
+ };
+ static FontTableApiAvailability availability =
+ QSysInfo::symbianVersion() < QSysInfo::SV_SF_3 ?
+ Unavailable : Unknown;
+ if (availability == Unknown) {
+ // Actually, we should ask CFeatureDiscovery::IsFeatureSupportedL()
+ // with FfFontTable here. But since at the time of writing, the
+ // FfFontTable flag check either gave false positives or false
+ // negatives. Here comes an implicit check via CFont::ExtendedFunction.
+ QSymbianTGetFontTableParam fontTableParams = {
+ MAKE_TAG('O', 'S', '/', '2'), 0, 0 };
+ QSymbianFbsHeapLock lock(QSymbianFbsHeapLock::Unlock);
+ CFont *font;
+ const TInt getFontErr = S60->screenDevice()->GetNearestFontInTwips(font, TFontSpec());
+ Q_ASSERT(getFontErr == KErrNone);
+ if (font->ExtendedFunction(QSymbianKFontGetFontTable, &fontTableParams) == KErrNone) {
+ font->ExtendedFunction(QSymbianKFontReleaseFontTable, &fontTableParams);
+ availability = Available;
+ } else {
+ availability = Unavailable;
+ }
+ S60->screenDevice()->ReleaseFont(font);
+ lock.relock();
+ }
+ return availability == Available;
+}
+
// duplicated from qfontengine_xyz.cpp
static inline unsigned int getChar(const QChar *str, int &i, const int len)
{
diff --git a/src/gui/text/qfontengine_s60_p.h b/src/gui/text/qfontengine_s60_p.h
index c65ce55..cdf2185 100644
--- a/src/gui/text/qfontengine_s60_p.h
+++ b/src/gui/text/qfontengine_s60_p.h
@@ -58,13 +58,11 @@
#include "qsize.h"
#include <openfont.h>
-#ifdef SYMBIAN_GDI_GLYPHDATA
-#define Q_SYMBIAN_HAS_FONTTABLE_API
-#endif
-
-#ifdef Q_SYMBIAN_HAS_FONTTABLE_API
+// The glyph outline code is intentionally disabled. It will be reactivated as
+// soon as the glyph outline API is backported from Symbian(^4) to Symbian(^3).
+#if 0
#define Q_SYMBIAN_HAS_GLYPHOUTLINE_API
-#endif // Q_SYMBIAN_HAS_FONTTABLE_API
+#endif
class CFont;
@@ -83,16 +81,18 @@ public:
CFont *fontOwner() const;
bool isSymbolCMap() const;
QFixed unitsPerEm() const;
+ static bool symbianFontTableApiAvailable();
private:
CFont* m_cFont;
mutable bool m_symbolCMap;
mutable QByteArray m_cmapTable;
mutable QFixed m_unitsPerEm;
-#ifndef Q_SYMBIAN_HAS_FONTTABLE_API
+
+ // m_openFont and m_openFont are used if Symbian does not provide
+ // the Font Table API
COpenFont *m_openFont;
mutable MOpenFontTrueTypeExtension *m_trueTypeExtension;
-#endif // Q_SYMBIAN_HAS_FONTTABLE_API
};
class QFontEngineS60 : public QFontEngine
diff --git a/src/gui/text/qtextcursor.cpp b/src/gui/text/qtextcursor.cpp
index 769ab2f..f73cc4b 100644
--- a/src/gui/text/qtextcursor.cpp
+++ b/src/gui/text/qtextcursor.cpp
@@ -363,6 +363,9 @@ bool QTextCursorPrivate::movePosition(QTextCursor::MoveOperation op, QTextCursor
bool adjustX = true;
QTextBlock blockIt = block();
+ if (!blockIt.isValid())
+ return false;
+
if (op >= QTextCursor::Left && op <= QTextCursor::WordRight
&& blockIt.textDirection() == Qt::RightToLeft) {
if (op == QTextCursor::Left)
diff --git a/src/gui/text/qtextdocument.cpp b/src/gui/text/qtextdocument.cpp
index 496accd..08929ba 100644
--- a/src/gui/text/qtextdocument.cpp
+++ b/src/gui/text/qtextdocument.cpp
@@ -596,8 +596,10 @@ void QTextDocument::markContentsDirty(int from, int length)
Q_D(QTextDocument);
d->documentChange(from, length);
if (!d->inContentsChange) {
- d->lout->documentChanged(d->docChangeFrom, d->docChangeOldLength, d->docChangeLength);
- d->docChangeFrom = -1;
+ if (d->lout) {
+ d->lout->documentChanged(d->docChangeFrom, d->docChangeOldLength, d->docChangeLength);
+ d->docChangeFrom = -1;
+ }
}
}
diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp
index 06eed55..96379e6 100644
--- a/src/gui/text/qtextengine.cpp
+++ b/src/gui/text/qtextengine.cpp
@@ -1233,6 +1233,8 @@ void QTextEngine::shapeTextWithHarfbuzz(int item) const
shaper_item.num_glyphs -= itemBoundaries[k + 1];
}
shaper_item.initialGlyphCount = shaper_item.num_glyphs;
+ if (shaper_item.num_glyphs < shaper_item.item.length)
+ shaper_item.num_glyphs = shaper_item.item.length;
QFontEngine *actualFontEngine = font;
uint engineIdx = 0;
@@ -1257,7 +1259,8 @@ void QTextEngine::shapeTextWithHarfbuzz(int item) const
}
const QGlyphLayout g = availableGlyphs(&si).mid(glyph_pos);
- moveGlyphData(g.mid(shaper_item.num_glyphs), g.mid(shaper_item.initialGlyphCount), remaining_glyphs);
+ if (shaper_item.num_glyphs > shaper_item.item.length)
+ moveGlyphData(g.mid(shaper_item.num_glyphs), g.mid(shaper_item.initialGlyphCount), remaining_glyphs);
shaper_item.glyphs = g.glyphs;
shaper_item.attributes = g.attributes;
diff --git a/src/gui/text/qtextformat.cpp b/src/gui/text/qtextformat.cpp
index ffa0ebc..945b012 100644
--- a/src/gui/text/qtextformat.cpp
+++ b/src/gui/text/qtextformat.cpp
@@ -265,10 +265,18 @@ private:
friend QDataStream &operator>>(QDataStream &, QTextFormat &);
};
-// this is only safe if sizeof(int) == sizeof(float)
+// this is only safe because sizeof(int) == sizeof(float)
static inline uint hash(float d)
{
+#ifdef Q_CC_GNU
+ // this is a GCC extension and isn't guaranteed to work in other compilers
+ // the reinterpret_cast below generates a strict-aliasing warning with GCC
+ union { float f; uint u; } cvt;
+ cvt.f = d;
+ return cvt.u;
+#else
return reinterpret_cast<uint&>(d);
+#endif
}
static inline uint hash(const QColor &color)
diff --git a/src/gui/util/qflickgesture.cpp b/src/gui/util/qflickgesture.cpp
new file mode 100644
index 0000000..eb0cc8d
--- /dev/null
+++ b/src/gui/util/qflickgesture.cpp
@@ -0,0 +1,677 @@
+/****************************************************************************
+**
+** 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 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 "qgesture.h"
+#include "qapplication.h"
+#include "qevent.h"
+#include "qwidget.h"
+#include "qgraphicsitem.h"
+#include "qgraphicsscene.h"
+#include "qgraphicssceneevent.h"
+#include "qgraphicsview.h"
+#include "qscroller.h"
+#include "private/qevent_p.h"
+#include "private/qflickgesture_p.h"
+#include "qdebug.h"
+
+#ifndef QT_NO_GESTURES
+
+QT_BEGIN_NAMESPACE
+
+//#define QFLICKGESTURE_DEBUG
+
+#ifdef QFLICKGESTURE_DEBUG
+# define qFGDebug qDebug
+#else
+# define qFGDebug while (false) qDebug
+#endif
+
+extern bool qt_sendSpontaneousEvent(QObject *receiver, QEvent *event);
+
+static QMouseEvent *copyMouseEvent(QEvent *e)
+{
+ switch (e->type()) {
+ case QEvent::MouseButtonPress:
+ case QEvent::MouseButtonRelease:
+ case QEvent::MouseMove: {
+ QMouseEvent *me = static_cast<QMouseEvent *>(e);
+ return new QMouseEvent(me->type(), QPoint(0, 0), me->globalPos(), me->button(), me->buttons(), me->modifiers());
+ }
+ case QEvent::GraphicsSceneMousePress:
+ case QEvent::GraphicsSceneMouseRelease:
+ case QEvent::GraphicsSceneMouseMove: {
+ QGraphicsSceneMouseEvent *me = static_cast<QGraphicsSceneMouseEvent *>(e);
+#if 1
+ QEvent::Type met = me->type() == QEvent::GraphicsSceneMousePress ? QEvent::MouseButtonPress :
+ (me->type() == QEvent::GraphicsSceneMouseRelease ? QEvent::MouseButtonRelease : QEvent::MouseMove);
+ return new QMouseEvent(met, QPoint(0, 0), me->screenPos(), me->button(), me->buttons(), me->modifiers());
+#else
+ QGraphicsSceneMouseEvent *copy = new QGraphicsSceneMouseEvent(me->type());
+ copy->setPos(me->pos());
+ copy->setScenePos(me->scenePos());
+ copy->setScreenPos(me->screenPos());
+ for (int i = 0x1; i <= 0x10; i <<= 1) {
+ Qt::MouseButton button = Qt::MouseButton(i);
+ copy->setButtonDownPos(button, me->buttonDownPos(button));
+ copy->setButtonDownScenePos(button, me->buttonDownScenePos(button));
+ copy->setButtonDownScreenPos(button, me->buttonDownScreenPos(button));
+ }
+ copy->setLastPos(me->lastPos());
+ copy->setLastScenePos(me->lastScenePos());
+ copy->setLastScreenPos(me->lastScreenPos());
+ copy->setButtons(me->buttons());
+ copy->setButton(me->button());
+ copy->setModifiers(me->modifiers());
+ return copy;
+#endif
+ }
+ default:
+ return 0;
+ }
+}
+
+class PressDelayHandler : public QObject
+{
+private:
+ PressDelayHandler(QObject *parent = 0)
+ : QObject(parent)
+ , pressDelayTimer(0)
+ , sendingEvent(false)
+ , mouseButton(Qt::NoButton)
+ , mouseTarget(0)
+ { }
+
+ static PressDelayHandler *inst;
+
+public:
+ enum {
+ UngrabMouseBefore = 1,
+ RegrabMouseAfterwards = 2
+ };
+
+ static PressDelayHandler *instance()
+ {
+ static PressDelayHandler *inst = 0;
+ if (!inst)
+ inst = new PressDelayHandler(QCoreApplication::instance());
+ return inst;
+ }
+
+ bool shouldEventBeIgnored(QEvent *) const
+ {
+ return sendingEvent;
+ }
+
+ bool isDelaying() const
+ {
+ return !pressDelayEvent.isNull();
+ }
+
+ void pressed(QEvent *e, int delay)
+ {
+ if (!pressDelayEvent) {
+ pressDelayEvent.reset(copyMouseEvent(e));
+ pressDelayTimer = startTimer(delay);
+ mouseTarget = QApplication::widgetAt(pressDelayEvent->globalPos());
+ mouseButton = pressDelayEvent->button();
+ qFGDebug() << "QFG: consuming/delaying mouse press";
+ } else {
+ qFGDebug() << "QFG: NOT consuming/delaying mouse press";
+ }
+ e->setAccepted(true);
+ }
+
+ bool released(QEvent *e, bool scrollerWasActive, bool scrollerIsActive)
+ {
+ // consume this event if the scroller was or is active
+ bool result = scrollerWasActive || scrollerIsActive;
+
+ // stop the timer
+ if (pressDelayTimer) {
+ killTimer(pressDelayTimer);
+ pressDelayTimer = 0;
+ }
+ // we still haven't even sent the press, so do it now
+ if (pressDelayEvent && mouseTarget && !scrollerIsActive) {
+ QScopedPointer<QMouseEvent> releaseEvent(copyMouseEvent(e));
+
+ qFGDebug() << "QFG: re-sending mouse press (due to release) for " << mouseTarget;
+ sendMouseEvent(pressDelayEvent.data(), UngrabMouseBefore);
+
+ qFGDebug() << "QFG: faking mouse release (due to release) for " << mouseTarget;
+ sendMouseEvent(releaseEvent.data());
+
+ result = true; // consume this event
+ } else if (mouseTarget && scrollerIsActive) {
+ // we grabbed the mouse expicitly when the scroller became active, so undo that now
+ sendMouseEvent(0, UngrabMouseBefore);
+ }
+ pressDelayEvent.reset(0);
+ mouseTarget = 0;
+ return result;
+ }
+
+ void scrollerWasIntercepted()
+ {
+ qFGDebug() << "QFG: deleting delayed mouse press, since scroller was only intercepted";
+ if (pressDelayEvent) {
+ // we still haven't even sent the press, so just throw it away now
+ if (pressDelayTimer) {
+ killTimer(pressDelayTimer);
+ pressDelayTimer = 0;
+ }
+ pressDelayEvent.reset(0);
+ }
+ mouseTarget = 0;
+ }
+
+ void scrollerBecameActive()
+ {
+ if (pressDelayEvent) {
+ // we still haven't even sent the press, so just throw it away now
+ qFGDebug() << "QFG: deleting delayed mouse press, since scroller is active now";
+ if (pressDelayTimer) {
+ killTimer(pressDelayTimer);
+ pressDelayTimer = 0;
+ }
+ pressDelayEvent.reset(0);
+ mouseTarget = 0;
+ } else if (mouseTarget) {
+ // we did send a press, so we need to fake a release now
+ Qt::MouseButtons mouseButtons = QApplication::mouseButtons();
+
+ // release all pressed mouse buttons
+ /*for (int i = 0; i < 32; ++i) {
+ if (mouseButtons & (1 << i)) {
+ Qt::MouseButton b = static_cast<Qt::MouseButton>(1 << i);
+ mouseButtons &= ~b;
+ QPoint farFarAway(-QWIDGETSIZE_MAX, -QWIDGETSIZE_MAX);
+
+ qFGDebug() << "QFG: sending a fake mouse release at far-far-away to " << mouseTarget;
+ QMouseEvent re(QEvent::MouseButtonRelease, QPoint(), farFarAway,
+ b, mouseButtons, QApplication::keyboardModifiers());
+ sendMouseEvent(&re);
+ }
+ }*/
+
+ QPoint farFarAway(-QWIDGETSIZE_MAX, -QWIDGETSIZE_MAX);
+
+ qFGDebug() << "QFG: sending a fake mouse release at far-far-away to " << mouseTarget;
+ QMouseEvent re(QEvent::MouseButtonRelease, QPoint(), farFarAway,
+ mouseButton, QApplication::mouseButtons() & ~mouseButton,
+ QApplication::keyboardModifiers());
+ sendMouseEvent(&re, RegrabMouseAfterwards);
+ // don't clear the mouseTarget just yet, since we need to explicitly ungrab the mouse on release!
+ }
+ }
+
+protected:
+ void timerEvent(QTimerEvent *e)
+ {
+ if (e->timerId() == pressDelayTimer) {
+ if (pressDelayEvent && mouseTarget) {
+ qFGDebug() << "QFG: timer event: re-sending mouse press to " << mouseTarget;
+ sendMouseEvent(pressDelayEvent.data(), UngrabMouseBefore);
+ }
+ pressDelayEvent.reset(0);
+
+ if (pressDelayTimer) {
+ killTimer(pressDelayTimer);
+ pressDelayTimer = 0;
+ }
+ }
+ }
+
+ void sendMouseEvent(QMouseEvent *me, int flags = 0)
+ {
+ if (mouseTarget) {
+ sendingEvent = true;
+
+ QGraphicsItem *grabber = 0;
+ if (mouseTarget->parentWidget()) {
+ if (QGraphicsView *gv = qobject_cast<QGraphicsView *>(mouseTarget->parentWidget())) {
+ if (gv->scene())
+ grabber = gv->scene()->mouseGrabberItem();
+ }
+ }
+
+ if (grabber && (flags & UngrabMouseBefore)) {
+ // GraphicsView Mouse Handling Workaround #1:
+ // we need to ungrab the mouse before re-sending the press,
+ // since the scene had already set the mouse grabber to the
+ // original (and consumed) event's receiver
+ qFGDebug() << "QFG: ungrabbing" << grabber;
+ grabber->ungrabMouse();
+ }
+
+ if (me) {
+ QMouseEvent copy(me->type(), mouseTarget->mapFromGlobal(me->globalPos()), me->globalPos(), me->button(), me->buttons(), me->modifiers());
+ qt_sendSpontaneousEvent(mouseTarget, &copy);
+ }
+
+ if (grabber && (flags & RegrabMouseAfterwards)) {
+ // GraphicsView Mouse Handling Workaround #2:
+ // we need to re-grab the mouse after sending a faked mouse
+ // release, since we still need the mouse moves for the gesture
+ // (the scene will clear the item's mouse grabber status on
+ // release).
+ qFGDebug() << "QFG: re-grabbing" << grabber;
+ grabber->grabMouse();
+ }
+ sendingEvent = false;
+ }
+ }
+
+
+private:
+ int pressDelayTimer;
+ QScopedPointer<QMouseEvent> pressDelayEvent;
+ bool sendingEvent;
+ Qt::MouseButton mouseButton;
+ QPointer<QWidget> mouseTarget;
+};
+
+
+/*!
+ \internal
+ \class QFlickGesture
+ \since 4.8
+ \brief The QFlickGesture class describes a flicking gesture made by the user.
+ \ingroup gestures
+ The QFlickGesture is more complex than the QPanGesture that uses QScroller and QScrollerProperties
+ to decide if it is triggered.
+ This gesture is reacting on touch event as compared to the QMouseFlickGesture.
+
+ \sa {Gestures Programming}, QScroller, QScrollerProperties, QMouseFlickGesture
+*/
+
+/*!
+ \internal
+*/
+QFlickGesture::QFlickGesture(QObject *receiver, Qt::MouseButton button, QObject *parent)
+ : QGesture(*new QFlickGesturePrivate, parent)
+{
+ d_func()->q_ptr = this;
+ d_func()->receiver = receiver;
+ d_func()->receiverScroller = (receiver && QScroller::hasScroller(receiver)) ? QScroller::scroller(receiver) : 0;
+ d_func()->button = button;
+}
+
+QFlickGesture::~QFlickGesture()
+{ }
+
+QFlickGesturePrivate::QFlickGesturePrivate()
+ : receiverScroller(0), button(Qt::NoButton), macIgnoreWheel(false)
+{ }
+
+
+//
+// QFlickGestureRecognizer
+//
+
+
+QFlickGestureRecognizer::QFlickGestureRecognizer(Qt::MouseButton button)
+{
+ this->button = button;
+}
+
+/*! \reimp
+ */
+QGesture *QFlickGestureRecognizer::create(QObject *target)
+{
+ QGraphicsObject *go = qobject_cast<QGraphicsObject*>(target);
+ if (go && button == Qt::NoButton) {
+ go->setAcceptTouchEvents(true);
+ }
+ return new QFlickGesture(target, button);
+}
+
+/*! \internal
+ The recognize function detects a touch event suitable to start the attached QScroller.
+ The QFlickGesture will be triggered as soon as the scroller is no longer in the state
+ QScroller::Inactive or QScroller::Pressed. It will be finished or canceled
+ at the next QEvent::TouchEnd.
+ Note that the QScroller might continue scrolling (kinetically) at this point.
+ */
+QGestureRecognizer::Result QFlickGestureRecognizer::recognize(QGesture *state,
+ QObject *watched,
+ QEvent *event)
+{
+ Q_UNUSED(watched);
+
+ static QElapsedTimer monotonicTimer;
+ if (!monotonicTimer.isValid())
+ monotonicTimer.start();
+
+ QFlickGesture *q = static_cast<QFlickGesture *>(state);
+ QFlickGesturePrivate *d = q->d_func();
+
+ QScroller *scroller = d->receiverScroller;
+ if (!scroller)
+ return Ignore; // nothing to do without a scroller?
+
+ QWidget *receiverWidget = qobject_cast<QWidget *>(d->receiver);
+ QGraphicsObject *receiverGraphicsObject = qobject_cast<QGraphicsObject *>(d->receiver);
+
+ // this is only set for events that we inject into the event loop via sendEvent()
+ if (PressDelayHandler::instance()->shouldEventBeIgnored(event)) {
+ //qFGDebug() << state << "QFG: ignored event: " << event->type();
+ return Ignore;
+ }
+
+ const QMouseEvent *me = 0;
+ const QGraphicsSceneMouseEvent *gsme = 0;
+ const QTouchEvent *te = 0;
+ QPoint globalPos;
+
+ // qFGDebug() << "FlickGesture "<<state<<"watched:"<<watched<<"receiver"<<d->receiver<<"event"<<event->type()<<"button"<<button;
+
+ switch (event->type()) {
+ case QEvent::MouseButtonPress:
+ case QEvent::MouseButtonRelease:
+ case QEvent::MouseMove:
+ if (!receiverWidget)
+ return Ignore;
+ if (button != Qt::NoButton) {
+ me = static_cast<const QMouseEvent *>(event);
+ globalPos = me->globalPos();
+ }
+ break;
+ case QEvent::GraphicsSceneMousePress:
+ case QEvent::GraphicsSceneMouseRelease:
+ case QEvent::GraphicsSceneMouseMove:
+ if (!receiverGraphicsObject)
+ return Ignore;
+ if (button != Qt::NoButton) {
+ gsme = static_cast<const QGraphicsSceneMouseEvent *>(event);
+ globalPos = gsme->screenPos();
+ }
+ break;
+ case QEvent::TouchBegin:
+ case QEvent::TouchEnd:
+ case QEvent::TouchUpdate:
+ if (button == Qt::NoButton) {
+ te = static_cast<const QTouchEvent *>(event);
+ if (!te->touchPoints().isEmpty())
+ globalPos = te->touchPoints().at(0).screenPos().toPoint();
+ }
+ break;
+
+#if defined(Q_WS_MAC)
+ // the only way to distinguish between real mouse wheels and wheel
+ // events generated by the native 2 finger swipe gesture is to listen
+ // for these events (according to Apple's Cocoa Event-Handling Guide)
+
+ case QEvent::NativeGesture: {
+ QNativeGestureEvent *nge = static_cast<QNativeGestureEvent *>(event);
+ if (nge->gestureType == QNativeGestureEvent::GestureBegin)
+ d->macIgnoreWheel = true;
+ else if (nge->gestureType == QNativeGestureEvent::GestureEnd)
+ d->macIgnoreWheel = false;
+ break;
+ }
+#endif
+
+ // consume all wheel events if the scroller is active
+ case QEvent::Wheel:
+ if (d->macIgnoreWheel || (scroller->state() != QScroller::Inactive))
+ return Ignore | ConsumeEventHint;
+ break;
+
+ // consume all dbl click events if the scroller is active
+ case QEvent::MouseButtonDblClick:
+ if (scroller->state() != QScroller::Inactive)
+ return Ignore | ConsumeEventHint;
+ break;
+
+ default:
+ break;
+ }
+
+ if (!me && !gsme && !te) // Neither mouse nor touch
+ return Ignore;
+
+ // get the current pointer position in local coordinates.
+ QPointF point;
+ QScroller::Input inputType = (QScroller::Input) 0;
+
+ switch (event->type()) {
+ case QEvent::MouseButtonPress:
+ if (me && me->button() == button && me->buttons() == button) {
+ point = me->globalPos();
+ inputType = QScroller::InputPress;
+ } else if (me) {
+ scroller->stop();
+ return CancelGesture;
+ }
+ break;
+ case QEvent::MouseButtonRelease:
+ if (me && me->button() == button) {
+ point = me->globalPos();
+ inputType = QScroller::InputRelease;
+ }
+ break;
+ case QEvent::MouseMove:
+#ifdef Q_OS_SYMBIAN
+ // Qt on Symbian tracks the button state internally, while Qt on Win/Mac/Unix
+ // relies on the windowing system to report the current buttons state.
+ if (me && (me->buttons() == button || !me->buttons())) {
+#else
+ if (me && me->buttons() == button) {
+#endif
+ point = me->globalPos();
+ inputType = QScroller::InputMove;
+ }
+ break;
+
+ case QEvent::GraphicsSceneMousePress:
+ if (gsme && gsme->button() == button && gsme->buttons() == button) {
+ point = gsme->scenePos();
+ inputType = QScroller::InputPress;
+ } else if (gsme) {
+ scroller->stop();
+ return CancelGesture;
+ }
+ break;
+ case QEvent::GraphicsSceneMouseRelease:
+ if (gsme && gsme->button() == button) {
+ point = gsme->scenePos();
+ inputType = QScroller::InputRelease;
+ }
+ break;
+ case QEvent::GraphicsSceneMouseMove:
+#ifdef Q_OS_SYMBIAN
+ // Qt on Symbian tracks the button state internally, while Qt on Win/Mac/Unix
+ // relies on the windowing system to report the current buttons state.
+ if (gsme && (gsme->buttons() == button || !me->buttons())) {
+#else
+ if (gsme && gsme->buttons() == button) {
+#endif
+ point = gsme->scenePos();
+ inputType = QScroller::InputMove;
+ }
+ break;
+
+ case QEvent::TouchBegin:
+ inputType = QScroller::InputPress;
+ // fall through
+ case QEvent::TouchEnd:
+ if (!inputType)
+ inputType = QScroller::InputRelease;
+ // fallthrough
+ case QEvent::TouchUpdate:
+ if (!inputType)
+ inputType = QScroller::InputMove;
+
+ if (te->deviceType() == QTouchEvent::TouchPad) {
+ if (te->touchPoints().count() != 2) // 2 fingers on pad
+ return Ignore;
+
+ point = te->touchPoints().at(0).startScenePos() +
+ ((te->touchPoints().at(0).scenePos() - te->touchPoints().at(0).startScenePos()) +
+ (te->touchPoints().at(1).scenePos() - te->touchPoints().at(1).startScenePos())) / 2;
+ } else { // TouchScreen
+ if (te->touchPoints().count() != 1) // 1 finger on screen
+ return Ignore;
+
+ point = te->touchPoints().at(0).scenePos();
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ // Check for an active scroller at globalPos
+ if (inputType == QScroller::InputPress) {
+ foreach (QScroller *as, QScroller::activeScrollers()) {
+ if (as != scroller) {
+ QRegion scrollerRegion;
+
+ if (QWidget *w = qobject_cast<QWidget *>(as->target())) {
+ scrollerRegion = QRect(w->mapToGlobal(QPoint(0, 0)), w->size());
+ } else if (QGraphicsObject *go = qobject_cast<QGraphicsObject *>(as->target())) {
+ if (go->scene() && !go->scene()->views().isEmpty()) {
+ foreach (QGraphicsView *gv, go->scene()->views())
+ scrollerRegion |= gv->mapFromScene(go->mapToScene(go->boundingRect()))
+ .translated(gv->mapToGlobal(QPoint(0, 0)));
+ }
+ }
+ // active scrollers always have priority
+ if (scrollerRegion.contains(globalPos))
+ return Ignore;
+ }
+ }
+ }
+
+ bool scrollerWasDragging = (scroller->state() == QScroller::Dragging);
+ bool scrollerWasScrolling = (scroller->state() == QScroller::Scrolling);
+
+ if (inputType) {
+ if (QWidget *w = qobject_cast<QWidget *>(d->receiver))
+ point = w->mapFromGlobal(point.toPoint());
+ else if (QGraphicsObject *go = qobject_cast<QGraphicsObject *>(d->receiver))
+ point = go->mapFromScene(point);
+
+ // inform the scroller about the new event
+ scroller->handleInput(inputType, point, monotonicTimer.elapsed());
+ }
+
+ // depending on the scroller state return the gesture state
+ Result result(0);
+ bool scrollerIsActive = (scroller->state() == QScroller::Dragging ||
+ scroller->state() == QScroller::Scrolling);
+
+ // Consume all mouse events while dragging or scrolling to avoid nasty
+ // side effects with Qt's standard widgets.
+ if ((me || gsme) && scrollerIsActive)
+ result |= ConsumeEventHint;
+
+ // The only problem with this approach is that we consume the
+ // MouseRelease when we start the scrolling with a flick gesture, so we
+ // have to fake a MouseRelease "somewhere" to not mess with the internal
+ // states of Qt's widgets (a QPushButton would stay in 'pressed' state
+ // forever, if it doesn't receive a MouseRelease).
+ if (me || gsme) {
+ if (!scrollerWasDragging && !scrollerWasScrolling && scrollerIsActive)
+ PressDelayHandler::instance()->scrollerBecameActive();
+ else if (scrollerWasScrolling && (scroller->state() == QScroller::Dragging || scroller->state() == QScroller::Inactive))
+ PressDelayHandler::instance()->scrollerWasIntercepted();
+ }
+
+ if (!inputType) {
+ result |= Ignore;
+ } else {
+ switch (event->type()) {
+ case QEvent::MouseButtonPress:
+ case QEvent::GraphicsSceneMousePress:
+ if (scroller->state() == QScroller::Pressed) {
+ int pressDelay = int(1000 * scroller->scrollerProperties().scrollMetric(QScrollerProperties::MousePressEventDelay).toReal());
+ if (pressDelay > 0) {
+ result |= ConsumeEventHint;
+
+ PressDelayHandler::instance()->pressed(event, pressDelay);
+ event->accept();
+ }
+ }
+ // fall through
+ case QEvent::TouchBegin:
+ q->setHotSpot(globalPos);
+ result |= scrollerIsActive ? TriggerGesture : MayBeGesture;
+ break;
+
+ case QEvent::MouseMove:
+ case QEvent::GraphicsSceneMouseMove:
+ if (PressDelayHandler::instance()->isDelaying())
+ result |= ConsumeEventHint;
+ // fall through
+ case QEvent::TouchUpdate:
+ result |= scrollerIsActive ? TriggerGesture : Ignore;
+ break;
+
+ case QEvent::GraphicsSceneMouseRelease:
+ case QEvent::MouseButtonRelease:
+ if (PressDelayHandler::instance()->released(event, scrollerWasDragging || scrollerWasScrolling, scrollerIsActive))
+ result |= ConsumeEventHint;
+ // fall through
+ case QEvent::TouchEnd:
+ result |= scrollerIsActive ? FinishGesture : CancelGesture;
+ break;
+
+ default:
+ result |= Ignore;
+ break;
+ }
+ }
+ return result;
+}
+
+
+/*! \reimp
+ */
+void QFlickGestureRecognizer::reset(QGesture *state)
+{
+ QGestureRecognizer::reset(state);
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_GESTURES
diff --git a/src/gui/util/qflickgesture_p.h b/src/gui/util/qflickgesture_p.h
new file mode 100644
index 0000000..c3c263b
--- /dev/null
+++ b/src/gui/util/qflickgesture_p.h
@@ -0,0 +1,113 @@
+/****************************************************************************
+**
+** 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 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 QFLICKGESTURE_P_H
+#define QFLICKGESTURE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of other Qt classes. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qevent.h"
+#include "qgesturerecognizer.h"
+#include "private/qgesture_p.h"
+#include "qscroller.h"
+#include "qscopedpointer.h"
+
+#ifndef QT_NO_GESTURES
+
+QT_BEGIN_NAMESPACE
+
+class QFlickGesturePrivate;
+class QGraphicsItem;
+
+class Q_GUI_EXPORT QFlickGesture : public QGesture
+{
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(QFlickGesture)
+
+public:
+ QFlickGesture(QObject *receiver, Qt::MouseButton button, QObject *parent = 0);
+ ~QFlickGesture();
+
+ friend class QFlickGestureRecognizer;
+};
+
+class PressDelayHandler;
+
+class QFlickGesturePrivate : public QGesturePrivate
+{
+ Q_DECLARE_PUBLIC(QFlickGesture)
+public:
+ QFlickGesturePrivate();
+
+ QPointer<QObject> receiver;
+ QScroller *receiverScroller;
+ Qt::MouseButton button; // NoButton == Touch
+ bool macIgnoreWheel;
+ static PressDelayHandler *pressDelayHandler;
+};
+
+class QFlickGestureRecognizer : public QGestureRecognizer
+{
+public:
+ QFlickGestureRecognizer(Qt::MouseButton button);
+
+ QGesture *create(QObject *target);
+ QGestureRecognizer::Result recognize(QGesture *state, QObject *watched, QEvent *event);
+ void reset(QGesture *state);
+
+private:
+ Qt::MouseButton button; // NoButton == Touch
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_GESTURES
+
+#endif // QFLICKGESTURE_P_H
diff --git a/src/gui/util/qscroller.cpp b/src/gui/util/qscroller.cpp
new file mode 100644
index 0000000..2ca4a6e
--- /dev/null
+++ b/src/gui/util/qscroller.cpp
@@ -0,0 +1,1999 @@
+/****************************************************************************
+**
+** 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 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 "qevent.h"
+#include "qwidget.h"
+#include "qscroller.h"
+#include "private/qflickgesture_p.h"
+#include "private/qscroller_p.h"
+#include "qscrollerproperties.h"
+#include "private/qscrollerproperties_p.h"
+#include "qnumeric.h"
+#include "math.h"
+
+#include <QTime>
+#include <QElapsedTimer>
+#include <QMap>
+#include <QApplication>
+#include <QAbstractScrollArea>
+#include <QGraphicsObject>
+#include <QGraphicsScene>
+#include <QGraphicsView>
+#include <QDesktopWidget>
+#include <QtCore/qmath.h>
+#include <QtGui/qevent.h>
+#include <qnumeric.h>
+
+#include <QtDebug>
+
+#if defined(Q_WS_X11)
+# include "private/qt_x11_p.h"
+#endif
+
+
+QT_BEGIN_NAMESPACE
+
+bool qt_sendSpontaneousEvent(QObject *receiver, QEvent *event);
+
+//#define QSCROLLER_DEBUG
+
+#ifdef QSCROLLER_DEBUG
+# define qScrollerDebug qDebug
+#else
+# define qScrollerDebug while (false) qDebug
+#endif
+
+QDebug &operator<<(QDebug &dbg, const QScrollerPrivate::ScrollSegment &s)
+{
+ dbg << "\n Time: start:" << s.startTime << " duration:" << s.deltaTime;
+ dbg << "\n Pos: start:" << s.startPos << " delta:" << s.deltaPos;
+ dbg << "\n Curve: type:" << s.curve.type() << " max progress:" << s.maxProgress << "\n";
+ return dbg;
+}
+
+
+// a few helper operators to make the code below a lot more readable:
+// otherwise a lot of ifs would have to be multi-line to check both the x
+// and y coordinate separately.
+
+// returns true only if the abs. value of BOTH x and y are <= f
+inline bool operator<=(const QPointF &p, qreal f)
+{
+ return (qAbs(p.x()) <= f) && (qAbs(p.y()) <= f);
+}
+
+// returns true only if the abs. value of BOTH x and y are < f
+inline bool operator<(const QPointF &p, qreal f)
+{
+ return (qAbs(p.x()) < f) && (qAbs(p.y()) < f);
+}
+
+// returns true if the abs. value of EITHER x or y are >= f
+inline bool operator>=(const QPointF &p, qreal f)
+{
+ return (qAbs(p.x()) >= f) || (qAbs(p.y()) >= f);
+}
+
+// returns true if the abs. value of EITHER x or y are > f
+inline bool operator>(const QPointF &p, qreal f)
+{
+ return (qAbs(p.x()) > f) || (qAbs(p.y()) > f);
+}
+
+// returns a new point with both coordinates having the abs. value of the original one
+inline QPointF qAbs(const QPointF &p)
+{
+ return QPointF(qAbs(p.x()), qAbs(p.y()));
+}
+
+// returns a new point with all components of p1 multiplied by the corresponding components of p2
+inline QPointF operator*(const QPointF &p1, const QPointF &p2)
+{
+ return QPointF(p1.x() * p2.x(), p1.y() * p2.y());
+}
+
+// returns a new point with all components of p1 divided by the corresponding components of p2
+inline QPointF operator/(const QPointF &p1, const QPointF &p2)
+{
+ return QPointF(p1.x() / p2.x(), p1.y() / p2.y());
+}
+
+inline QPointF clampToRect(const QPointF &p, const QRectF &rect)
+{
+ qreal x = qBound(rect.left(), p.x(), rect.right());
+ qreal y = qBound(rect.top(), p.y(), rect.bottom());
+ return QPointF(x, y);
+}
+
+// returns -1, 0 or +1 according to r being <0, ==0 or >0
+inline int qSign(qreal r)
+{
+ return (r < 0) ? -1 : ((r > 0) ? 1 : 0);
+}
+
+// this version is not mathematically exact, but it just works for every
+// easing curve type (even custom ones)
+
+static qreal differentialForProgress(const QEasingCurve &curve, qreal pos)
+{
+ const qreal dx = 0.01;
+ qreal left = (pos < qreal(0.5)) ? pos : pos - qreal(dx);
+ qreal right = (pos >= qreal(0.5)) ? pos : pos + qreal(dx);
+ qreal d = (curve.valueForProgress(right) - curve.valueForProgress(left)) / qreal(dx);
+
+ //qScrollerDebug() << "differentialForProgress(type: " << curve.type() << ", pos: " << pos << ") = " << d;
+
+ return d;
+}
+
+// this version is not mathematically exact, but it just works for every
+// easing curve type (even custom ones)
+
+static qreal progressForValue(const QEasingCurve &curve, qreal value)
+{
+ if (curve.type() >= QEasingCurve::InElastic &&
+ curve.type() < QEasingCurve::Custom) {
+ qWarning("progressForValue(): QEasingCurves of type %d do not have an inverse, since they are not injective.", curve.type());
+ return value;
+ }
+ if (value < qreal(0) || value > qreal(1))
+ return value;
+
+ qreal progress = value, left(0), right(1);
+ for (int iterations = 6; iterations; --iterations) {
+ qreal v = curve.valueForProgress(progress);
+ if (v < value)
+ left = progress;
+ else if (v > value)
+ right = progress;
+ else
+ break;
+ progress = (left + right) / qreal(2);
+ }
+ return progress;
+}
+
+
+class QScrollTimer : public QAbstractAnimation
+{
+public:
+ QScrollTimer(QScrollerPrivate *_d)
+ : d(_d), ignoreUpdate(false), skip(0)
+ { }
+
+ int duration() const
+ {
+ return -1;
+ }
+
+ void start()
+ {
+ // QAbstractAnimation::start() will immediately call
+ // updateCurrentTime(), but our state is not set correctly yet
+ ignoreUpdate = true;
+ QAbstractAnimation::start();
+ ignoreUpdate = false;
+ skip = 0;
+ }
+
+protected:
+ void updateCurrentTime(int /*currentTime*/)
+ {
+ if (!ignoreUpdate) {
+ if (++skip >= d->frameRateSkip()) {
+ skip = 0;
+ d->timerTick();
+ }
+ }
+ }
+
+private:
+ QScrollerPrivate *d;
+ bool ignoreUpdate;
+ int skip;
+};
+
+/*!
+ \class QScroller
+ \brief The QScroller class enables kinetic scrolling for any scrolling widget or graphics item.
+ \since 4.8
+
+ With kinetic scrolling, the user can push the widget in a given
+ direction and it will continue to scroll in this direction until it is
+ stopped either by the user or by friction. Aspects of inertia, friction
+ and other physical concepts can be changed in order to fine-tune an
+ intuitive user experience.
+
+ The QScroller object is the object that stores the current position and
+ speed of the scrolling and takes care of updates.
+ QScroller can be triggered by a flick gesture
+
+ \code
+ QWidget *w = ...;
+ QScroller::grabGesture(w, QScroller::LeftMouseButtonGesture);
+ \endcode
+
+ or directly like this:
+
+ \code
+ QWidget *w = ...;
+ QScroller *scroller = QScroller::scroller(w);
+ scroller->scrollTo(QPointF(100, 100));
+ \endcode
+
+ The scrolled QObjects will be receive a QScrollPrepareEvent whenever the scroller needs to
+ update its geometry information and a QScrollEvent whenever the content of the object should
+ actually be scrolled.
+
+ The scroller uses the global QAbstractAnimation timer to generate its QScrollEvents, but this
+ can be slowed down with QScrollerProperties::FrameRate on a per-QScroller basis.
+
+ Several examples in the \c scroller examples directory show how QScroller,
+ QScrollEvent and the scroller gesture can be used.
+
+ Even though this kinetic scroller has a huge number of settings available via
+ QScrollerProperties, we recommend that you leave them all at their default, platform optimized
+ values. In case you really want to change them you can experiment with the \c plot example in
+ the \c scroller examples directory first.
+
+ \sa QScrollEvent, QScrollPrepareEvent, QScrollerProperties
+*/
+
+
+QMap<QObject *, QScroller *> QScrollerPrivate::allScrollers;
+QSet<QScroller *> QScrollerPrivate::activeScrollers;
+
+/*!
+ Returns \c true if a QScroller object was already created for \a target; \c false otherwise.
+
+ \sa scroller()
+*/
+bool QScroller::hasScroller(QObject *target)
+{
+ return (QScrollerPrivate::allScrollers.value(target));
+}
+
+/*!
+ Returns the scroller for the given \a target.
+ As long as the object exist this function will always return the same QScroller.
+ If a QScroller does not exist yet for the \a target, it will implicitly be created.
+ At no point will two QScrollers be active on one object.
+
+ \sa hasScroller(), target()
+*/
+QScroller *QScroller::scroller(QObject *target)
+{
+ if (!target) {
+ qWarning("QScroller::scroller() was called with a null target.");
+ return 0;
+ }
+
+ if (QScrollerPrivate::allScrollers.contains(target))
+ return QScrollerPrivate::allScrollers.value(target);
+
+ QScroller *s = new QScroller(target);
+ QScrollerPrivate::allScrollers.insert(target, s);
+ return s;
+}
+
+/*!
+ \overload
+ This is the const version of scroller().
+*/
+const QScroller *QScroller::scroller(const QObject *target)
+{
+ return scroller(const_cast<QObject*>(target));
+}
+
+/*!
+ Returns an application wide list of currently active, i.e. state() !=
+ QScroller::Inactive, QScroller objects.
+ This routine is mostly useful when writing your own gesture recognizer.
+*/
+QList<QScroller *> QScroller::activeScrollers()
+{
+ return QScrollerPrivate::activeScrollers.toList();
+}
+
+/*!
+ Returns the target object of this scroller.
+ \sa hasScroller(), scroller()
+ */
+QObject *QScroller::target() const
+{
+ Q_D(const QScroller);
+ return d->target;
+}
+
+/*!
+ \fn QScroller::scrollerPropertiesChanged(const QScrollerProperties &newProperties);
+
+ QScroller emits this signal whenever its scroller properties have been
+ changed. \a newProperties are the new scroller properties.
+
+ \sa scrollerProperties
+*/
+
+
+/*! \property QScroller::scrollerProperties
+ \brief The scroller properties of this scroller.
+ The properties will be used by the QScroller to determine its scrolling behaviour.
+*/
+QScrollerProperties QScroller::scrollerProperties() const
+{
+ Q_D(const QScroller);
+ return d->properties;
+}
+
+void QScroller::setScrollerProperties(const QScrollerProperties &sp)
+{
+ Q_D(QScroller);
+ if (d->properties != sp) {
+ d->properties = sp;
+ emit scrollerPropertiesChanged(sp);
+
+ // we need to force the recalculation here, since the overshootPolicy may have changed and
+ // existing segments may include an overshoot animation.
+ d->recalcScrollingSegments(true);
+ }
+}
+
+
+/*!
+ Registers a custom scroll gesture recognizer and grabs it for the \a
+ target and returns the resulting gesture type. If \a scrollGestureType is
+ set to TouchGesture the gesture will trigger on touch events - if set to
+ one of LeftMouseButtonGesture, RightMouseButtonGesture or
+ MiddleMouseButtonGesture it will trigger on mouse events of the
+ corresponding button.
+
+ Only one scroll gesture can be active on a single object at the same
+ time, so if you call this function twice on the same object, it will
+ ungrab the existing gesture before grabbing the new one.
+
+ Please note: To avoid nasty side-effects, all mouse events will be
+ consumed while the gesture is triggered. Since the mouse press event is
+ not consumed, the gesture needs to also send a fake mouse release event
+ at the global position \c{(INT_MIN, INT_MIN)} to make sure that it
+ doesn't mess with the internal states of the widget that received the
+ mouse press in the first place (which could e.g. be a QPushButton
+ inside a QScrollArea).
+*/
+Qt::GestureType QScroller::grabGesture(QObject *target, ScrollerGestureType scrollGestureType)
+{
+ // ensure that a scroller for target is created
+ QScroller *s = scroller(target);
+ if (!s)
+ return Qt::GestureType(0);
+
+ QScrollerPrivate *sp = s->d_ptr;
+ if (sp->recognizer)
+ ungrabGesture(target); // ungrab the old gesture
+
+ Qt::MouseButton button;
+ switch (scrollGestureType) {
+ case LeftMouseButtonGesture : button = Qt::LeftButton; break;
+ case RightMouseButtonGesture : button = Qt::RightButton; break;
+ case MiddleMouseButtonGesture: button = Qt::MiddleButton; break;
+ default :
+ case TouchGesture : button = Qt::NoButton; break; // NoButton == Touch
+ }
+
+ sp->recognizer = new QFlickGestureRecognizer(button);
+ sp->recognizerType = QGestureRecognizer::registerRecognizer(sp->recognizer);
+
+ if (target->isWidgetType()) {
+ QWidget *widget = static_cast<QWidget *>(target);
+ widget->grabGesture(sp->recognizerType);
+ if (scrollGestureType == TouchGesture)
+ widget->setAttribute(Qt::WA_AcceptTouchEvents);
+
+ } else if (QGraphicsObject *go = qobject_cast<QGraphicsObject*>(target)) {
+ if (scrollGestureType == TouchGesture)
+ go->setAcceptTouchEvents(true);
+ go->grabGesture(sp->recognizerType);
+ }
+ return sp->recognizerType;
+}
+
+/*!
+ Returns the gesture type currently grabbed for the \a target or 0 if no
+ gesture is grabbed.
+*/
+Qt::GestureType QScroller::grabbedGesture(QObject *target)
+{
+ QScroller *s = scroller(target);
+ if (s && s->d_ptr)
+ return s->d_ptr->recognizerType;
+ else
+ return Qt::GestureType(0);
+}
+
+/*!
+ Ungrabs the gesture for the \a target.
+*/
+void QScroller::ungrabGesture(QObject *target)
+{
+ QScroller *s = scroller(target);
+ if (!s)
+ return;
+
+ QScrollerPrivate *sp = s->d_ptr;
+ if (!sp->recognizer)
+ return; // nothing to do
+
+ if (target->isWidgetType()) {
+ QWidget *widget = static_cast<QWidget *>(target);
+ widget->ungrabGesture(sp->recognizerType);
+
+ } else if (QGraphicsObject *go = qobject_cast<QGraphicsObject*>(target)) {
+ go->ungrabGesture(sp->recognizerType);
+ }
+
+ QGestureRecognizer::unregisterRecognizer(sp->recognizerType);
+ // do not delete the recognizer. The QGestureManager is doing this.
+ sp->recognizer = 0;
+}
+
+/*!
+ \internal
+*/
+QScroller::QScroller(QObject *target)
+ : d_ptr(new QScrollerPrivate(this, target))
+{
+ Q_ASSERT(target); // you can't create a scroller without a target in any normal way
+ Q_D(QScroller);
+ d->init();
+}
+
+/*!
+ \internal
+*/
+QScroller::~QScroller()
+{
+ Q_D(QScroller);
+ QGestureRecognizer::unregisterRecognizer(d->recognizerType);
+ // do not delete the recognizer. The QGestureManager is doing this.
+ d->recognizer = 0;
+ QScrollerPrivate::allScrollers.remove(d->target);
+ QScrollerPrivate::activeScrollers.remove(this);
+
+ delete d_ptr;
+}
+
+
+/*!
+ \fn QScroller::stateChanged(QScroller::State newState);
+
+ QScroller emits this signal whenever the state changes. \a newState is the new State.
+
+ \sa state
+*/
+
+/*!
+ \property QScroller::state
+ \brief the state of the scroller
+
+ \sa QScroller::State
+*/
+QScroller::State QScroller::state() const
+{
+ Q_D(const QScroller);
+ return d->state;
+}
+
+/*!
+ Stops the scroller and resets the state back to Inactive.
+*/
+void QScroller::stop()
+{
+ Q_D(QScroller);
+ if (d->state != Inactive) {
+ QPointF here = clampToRect(d->contentPosition, d->contentPosRange);
+ qreal snapX = d->nextSnapPos(here.x(), 0, Qt::Horizontal);
+ qreal snapY = d->nextSnapPos(here.y(), 0, Qt::Vertical);
+ QPointF snap = here;
+ if (!qIsNaN(snapX))
+ snap.setX(snapX);
+ if (!qIsNaN(snapY))
+ snap.setY(snapY);
+ d->contentPosition = snap;
+ d->overshootPosition = QPointF(0, 0);
+
+ d->setState(Inactive);
+ }
+}
+
+/*!
+ \brief Returns the pixel per meter metric for the scrolled widget.
+
+ The value is reported for both the x and y axis separately by using a QPointF.
+
+ \note Please note that this value should be physically correct, while the actual DPI settings
+ that Qt returns for the display may be reported wrongly (on purpose) by the underlying
+ windowing system (e.g. Mac OS X or Maemo 5).
+*/
+QPointF QScroller::pixelPerMeter() const
+{
+ Q_D(const QScroller);
+ QPointF ppm = d->pixelPerMeter;
+
+ if (QGraphicsObject *go = qobject_cast<QGraphicsObject *>(d->target)) {
+ QTransform viewtr;
+ //TODO: the first view isn't really correct - maybe use an additional field in the prepare event?
+ if (go->scene() && !go->scene()->views().isEmpty())
+ viewtr = go->scene()->views().first()->viewportTransform();
+ QTransform tr = go->deviceTransform(viewtr);
+ if (tr.isScaling()) {
+ QPointF p0 = tr.map(QPointF(0, 0));
+ QPointF px = tr.map(QPointF(1, 0));
+ QPointF py = tr.map(QPointF(0, 1));
+ ppm.rx() /= QLineF(p0, px).length();
+ ppm.ry() /= QLineF(p0, py).length();
+ }
+ }
+ return ppm;
+}
+
+/*!
+ \brief Returns the current velocity of the scroller.
+
+ Returns the current scrolling velocity in meter per second when in the state Scrolling.
+ Returns a null velocity otherwise.
+
+ The velocity is reported for both the x and y axis separately by using a QPointF.
+
+ \sa pixelPerMeter()
+*/
+QPointF QScroller::velocity() const
+{
+ Q_D(const QScroller);
+ const QScrollerPropertiesPrivate *sp = d->properties.d.data();
+
+ switch (state()) {
+ case Dragging:
+ return d->releaseVelocity;
+ case Scrolling: {
+ QPointF vel;
+ qint64 now = d->monotonicTimer.elapsed();
+
+ if (!d->xSegments.isEmpty()) {
+ const QScrollerPrivate::ScrollSegment &s = d->xSegments.head();
+ qreal progress = qreal(now - s.startTime) / (qreal(s.deltaTime) / s.maxProgress);
+ qreal v = qSign(s.deltaPos) * qreal(s.deltaTime) / s.maxProgress / qreal(1000) * sp->decelerationFactor * qreal(0.5) * differentialForProgress(s.curve, progress);
+ vel.setX(v);
+ }
+
+ if (!d->ySegments.isEmpty()) {
+ const QScrollerPrivate::ScrollSegment &s = d->ySegments.head();
+ qreal progress = qreal(now - s.startTime) / (qreal(s.deltaTime) / s.maxProgress);
+ qreal v = qSign(s.deltaPos) * qreal(s.deltaTime) / s.maxProgress / qreal(1000) * sp->decelerationFactor * qreal(0.5) * differentialForProgress(s.curve, progress);
+ vel.setY(v);
+ }
+ //qScrollerDebug() << "Velocity: " << vel;
+ return vel;
+ }
+ default:
+ return QPointF(0, 0);
+ }
+}
+
+/*!
+ \brief Returns the target position for the scroll movement.
+
+ Returns the planned final position for the current scroll movement or the current
+ position if the scroller is not in the scrolling state.
+ The result is undefined when the scroller is in the inactive state.
+
+ The target position is in pixel.
+
+ \sa pixelPerMeter(), scrollTo()
+*/
+QPointF QScroller::finalPosition() const
+{
+ Q_D(const QScroller);
+ return QPointF(d->scrollingSegmentsEndPos(Qt::Horizontal),
+ d->scrollingSegmentsEndPos(Qt::Vertical));
+}
+
+/*!
+ Starts scrolling the widget so that point \a pos is at the top-left position in
+ the viewport.
+
+ The behaviour when scrolling outside the valid scroll area is undefined.
+ In this case the scroller might or might not overshoot.
+
+ The scrolling speed will be calculated so that the given position will
+ be reached after a platform-defined time span (e.g. 1 second for Maemo 5).
+
+ \a pos is given in viewport coordinates.
+
+ \sa ensureVisible()
+*/
+void QScroller::scrollTo(const QPointF &pos)
+{
+ // we could make this adjustable via QScrollerProperties
+ scrollTo(pos, 300);
+}
+
+/*! \overload
+
+ This version will reach its destination position in \a scrollTime milli seconds.
+*/
+void QScroller::scrollTo(const QPointF &pos, int scrollTime)
+{
+ Q_D(QScroller);
+
+ if (d->state == Pressed || d->state == Dragging )
+ return;
+
+ // no need to resend a prepare event if we are already scrolling
+ if (d->state == Inactive && !d->prepareScrolling(QPointF()))
+ return;
+
+ QPointF newpos = clampToRect(pos, d->contentPosRange);
+ qreal snapX = d->nextSnapPos(newpos.x(), 0, Qt::Horizontal);
+ qreal snapY = d->nextSnapPos(newpos.y(), 0, Qt::Vertical);
+ if (!qIsNaN(snapX))
+ newpos.setX(snapX);
+ if (!qIsNaN(snapY))
+ newpos.setY(snapY);
+
+ qScrollerDebug() << "QScroller::scrollTo(req:" << pos << " [pix] / snap:" << newpos << ", " << scrollTime << " [ms])";
+
+ if (newpos == d->contentPosition + d->overshootPosition)
+ return;
+
+ QPointF vel = velocity();
+
+ if (scrollTime < 0)
+ scrollTime = 0;
+ qreal time = qreal(scrollTime) / 1000;
+
+ d->createScrollToSegments(vel.x(), time, newpos.x(), Qt::Horizontal, QScrollerPrivate::ScrollTypeScrollTo);
+ d->createScrollToSegments(vel.y(), time, newpos.y(), Qt::Vertical, QScrollerPrivate::ScrollTypeScrollTo);
+
+ if (!scrollTime)
+ d->setContentPositionHelperScrolling();
+ d->setState(scrollTime ? Scrolling : Inactive);
+}
+
+/*!
+ Starts scrolling so that the rectangle \a rect is visible inside the
+ viewport with additional margins specified in pixels by \a xmargin and \a ymargin around
+ the rect.
+
+ In cases where it is not possible to fit the rect plus margins inside the viewport the contents
+ are scrolled so that as much as possible is visible from \a rect.
+
+ The scrolling speed will be calculated so that the given position will
+ be reached after a platform-defined time span (e.g. 1 second for Maemo 5).
+
+ This function performs the actual scrolling by calling scrollTo().
+*/
+void QScroller::ensureVisible(const QRectF &rect, qreal xmargin, qreal ymargin)
+{
+ // we could make this adjustable via QScrollerProperties
+ ensureVisible(rect, xmargin, ymargin, 1000);
+}
+
+/*! \overload
+
+ This version will reach its destination position in \a scrollTime milli seconds.
+*/
+void QScroller::ensureVisible(const QRectF &rect, qreal xmargin, qreal ymargin, int scrollTime)
+{
+ Q_D(QScroller);
+
+ if (d->state == Pressed || d->state == Dragging )
+ return;
+
+ if (d->state == Inactive && !d->prepareScrolling(QPointF()))
+ return;
+
+ // -- calculate the current pos (or the position after the current scroll)
+ QPointF startPos = d->contentPosition + d->overshootPosition;
+ startPos = QPointF(d->scrollingSegmentsEndPos(Qt::Horizontal),
+ d->scrollingSegmentsEndPos(Qt::Vertical));
+
+ QRectF marginRect(rect.x() - xmargin, rect.y() - ymargin,
+ rect.width() + 2 * xmargin, rect.height() + 2 * ymargin);
+
+ QSizeF visible = d->viewportSize;
+ QRectF visibleRect(startPos, visible);
+
+ qScrollerDebug() << "QScroller::ensureVisible(" << rect << " [pix], " << xmargin << " [pix], " << ymargin << " [pix], " << scrollTime << "[ms])";
+ qScrollerDebug() << " --> content position:" << d->contentPosition;
+
+ if (visibleRect.contains(marginRect))
+ return;
+
+ QPointF newPos = startPos;
+
+ if (visibleRect.width() < rect.width()) {
+ // at least try to move the rect into view
+ if (rect.left() > visibleRect.left())
+ newPos.setX(rect.left());
+ else if (rect.right() < visibleRect.right())
+ newPos.setX(rect.right() - visible.width());
+
+ } else if (visibleRect.width() < marginRect.width()) {
+ newPos.setX(rect.center().x() - visibleRect.width() / 2);
+ } else if (marginRect.left() > visibleRect.left()) {
+ newPos.setX(marginRect.left());
+ } else if (marginRect.right() < visibleRect.right()) {
+ newPos.setX(marginRect.right() - visible.width());
+ }
+
+ if (visibleRect.height() < rect.height()) {
+ // at least try to move the rect into view
+ if (rect.top() > visibleRect.top())
+ newPos.setX(rect.top());
+ else if (rect.bottom() < visibleRect.bottom())
+ newPos.setX(rect.bottom() - visible.height());
+
+ } else if (visibleRect.height() < marginRect.height()) {
+ newPos.setY(rect.center().y() - visibleRect.height() / 2);
+ } else if (marginRect.top() > visibleRect.top()) {
+ newPos.setY(marginRect.top());
+ } else if (marginRect.bottom() < visibleRect.bottom()) {
+ newPos.setY(marginRect.bottom() - visible.height());
+ }
+
+ // clamp to maximum content position
+ newPos = clampToRect(newPos, d->contentPosRange);
+ if (newPos == startPos)
+ return;
+
+ scrollTo(newPos, scrollTime);
+}
+
+/*! This function resends the QScrollPrepareEvent.
+ * Calling resendPrepareEvent triggers a QScrollPrepareEvent from the scroller.
+ * This will allow the receiver to re-set content position and content size while
+ * scrolling.
+ * Calling this function while in the Inactive state is useless as the prepare event
+ * is send again right before scrolling starts.
+ */
+void QScroller::resendPrepareEvent()
+{
+ Q_D(QScroller);
+ d->prepareScrolling(d->pressPosition);
+}
+
+/*! Set the snap positions for the horizontal axis.
+ * Set the snap positions to a list of \a positions.
+ * This will overwrite all previously set snap positions and also a previously
+ * set snapping interval.
+ * Snapping can be deactivated by setting an empty list of positions.
+ */
+void QScroller::setSnapPositionsX(const QList<qreal> &positions)
+{
+ Q_D(QScroller);
+ d->snapPositionsX = positions;
+ d->snapIntervalX = 0.0;
+
+ d->recalcScrollingSegments();
+}
+
+/*! Set the snap positions for the horizontal axis.
+ * Set the snap positions to regular spaced intervals.
+ * The first snap position will be at \a first from the beginning of the list. The next at \a first + \a interval and so on.
+ * This can be used to implement a list header.
+ * This will overwrite all previously set snap positions and also a previously
+ * set snapping interval.
+ * Snapping can be deactivated by setting an interval of 0.0
+ */
+void QScroller::setSnapPositionsX(qreal first, qreal interval)
+{
+ Q_D(QScroller);
+ d->snapFirstX = first;
+ d->snapIntervalX = interval;
+ d->snapPositionsX.clear();
+
+ d->recalcScrollingSegments();
+}
+
+/*! Set the snap positions for the vertical axis.
+ * Set the snap positions to a list of \a positions.
+ * This will overwrite all previously set snap positions and also a previously
+ * set snapping interval.
+ * Snapping can be deactivated by setting an empty list of positions.
+ */
+void QScroller::setSnapPositionsY(const QList<qreal> &positions)
+{
+ Q_D(QScroller);
+ d->snapPositionsY = positions;
+ d->snapIntervalY = 0.0;
+
+ d->recalcScrollingSegments();
+}
+
+/*! Set the snap positions for the vertical axis.
+ * Set the snap positions to regular spaced intervals.
+ * The first snap position will be at \a first. The next at \a first + \a interval and so on.
+ * This will overwrite all previously set snap positions and also a previously
+ * set snapping interval.
+ * Snapping can be deactivated by setting an interval of 0.0
+ */
+void QScroller::setSnapPositionsY(qreal first, qreal interval)
+{
+ Q_D(QScroller);
+ d->snapFirstY = first;
+ d->snapIntervalY = interval;
+ d->snapPositionsY.clear();
+
+ d->recalcScrollingSegments();
+}
+
+
+
+// -------------- private ------------
+
+QScrollerPrivate::QScrollerPrivate(QScroller *q, QObject *_target)
+ : target(_target)
+ , recognizer(0)
+ , recognizerType(Qt::CustomGesture)
+ , state(QScroller::Inactive)
+ , firstScroll(true)
+ , pressTimestamp(0)
+ , lastTimestamp(0)
+ , snapFirstX(-1.0)
+ , snapIntervalX(0.0)
+ , snapFirstY(-1.0)
+ , snapIntervalY(0.0)
+ , scrollTimer(new QScrollTimer(this))
+ , q_ptr(q)
+{
+ connect(target, SIGNAL(destroyed(QObject*)), this, SLOT(targetDestroyed()));
+}
+
+void QScrollerPrivate::init()
+{
+ setDpiFromWidget(0);
+ monotonicTimer.start();
+}
+
+void QScrollerPrivate::sendEvent(QObject *o, QEvent *e)
+{
+ qt_sendSpontaneousEvent(o, e);
+}
+
+const char *QScrollerPrivate::stateName(QScroller::State state)
+{
+ switch (state) {
+ case QScroller::Inactive: return "inactive";
+ case QScroller::Pressed: return "pressed";
+ case QScroller::Dragging: return "dragging";
+ case QScroller::Scrolling: return "scrolling";
+ default: return "(invalid)";
+ }
+}
+
+const char *QScrollerPrivate::inputName(QScroller::Input input)
+{
+ switch (input) {
+ case QScroller::InputPress: return "press";
+ case QScroller::InputMove: return "move";
+ case QScroller::InputRelease: return "release";
+ default: return "(invalid)";
+ }
+}
+
+void QScrollerPrivate::targetDestroyed()
+{
+ scrollTimer->stop();
+ delete q_ptr;
+}
+
+void QScrollerPrivate::timerTick()
+{
+ struct timerevent {
+ QScroller::State state;
+ typedef void (QScrollerPrivate::*timerhandler_t)();
+ timerhandler_t handler;
+ };
+
+ timerevent timerevents[] = {
+ { QScroller::Dragging, &QScrollerPrivate::timerEventWhileDragging },
+ { QScroller::Scrolling, &QScrollerPrivate::timerEventWhileScrolling },
+ };
+
+ for (int i = 0; i < int(sizeof(timerevents) / sizeof(*timerevents)); ++i) {
+ timerevent *te = timerevents + i;
+
+ if (state == te->state) {
+ (this->*te->handler)();
+ return;
+ }
+ }
+
+ scrollTimer->stop();
+}
+
+/*!
+ This function is used by gesture recognizers to inform the scroller about a new input event.
+ The scroller will change its internal state() according to the input event and its attached
+ scroller properties. Since the scroller doesn't care about the actual kind of input device the
+ event came from, you need to decompose the event into the \a input type, a \a position and a
+ milli-second \a timestamp. The \a position needs to be in the target's coordinate system.
+ The return value is \c true if the event should be consumed by the calling filter or \c false
+ if the event should be forwarded to the control.
+
+ \note Using grabGesture() should be sufficient for most use cases though.
+*/
+bool QScroller::handleInput(Input input, const QPointF &position, qint64 timestamp)
+{
+ Q_D(QScroller);
+
+ qScrollerDebug() << "QScroller::handleInput(" << input << ", " << d->stateName(d->state) << ", " << position << ", " << timestamp << ")";
+ struct statechange {
+ State state;
+ Input input;
+ typedef bool (QScrollerPrivate::*inputhandler_t)(const QPointF &position, qint64 timestamp);
+ inputhandler_t handler;
+ };
+
+ statechange statechanges[] = {
+ { QScroller::Inactive, InputPress, &QScrollerPrivate::pressWhileInactive },
+ { QScroller::Pressed, InputMove, &QScrollerPrivate::moveWhilePressed },
+ { QScroller::Pressed, InputRelease, &QScrollerPrivate::releaseWhilePressed },
+ { QScroller::Dragging, InputMove, &QScrollerPrivate::moveWhileDragging },
+ { QScroller::Dragging, InputRelease, &QScrollerPrivate::releaseWhileDragging },
+ { QScroller::Scrolling, InputPress, &QScrollerPrivate::pressWhileScrolling }
+ };
+
+ for (int i = 0; i < int(sizeof(statechanges) / sizeof(*statechanges)); ++i) {
+ statechange *sc = statechanges + i;
+
+ if (d->state == sc->state && input == sc->input)
+ return (d->*sc->handler)(position - d->overshootPosition, timestamp);
+ }
+ return false;
+}
+
+#if !defined(Q_WS_MAC)
+// the Mac version is implemented in qscroller_mac.mm
+
+QPointF QScrollerPrivate::realDpi(int screen)
+{
+# ifdef Q_WS_MAEMO_5
+ Q_UNUSED(screen);
+
+ // The DPI value is hardcoded to 96 on Maemo5:
+ // https://projects.maemo.org/bugzilla/show_bug.cgi?id=152525
+ // This value (260) is only correct for the N900 though, but
+ // there's no way to get the real DPI at run time.
+ return QPointF(260, 260);
+
+# elif defined(Q_WS_X11) && !defined(QT_NO_XRANDR)
+ if (X11->use_xrandr && X11->ptrXRRSizes) {
+ int nsizes = 0;
+ XRRScreenSize *sizes = X11->ptrXRRSizes(X11->display, screen == -1 ? X11->defaultScreen : screen, &nsizes);
+ if (nsizes > 0 && sizes && sizes->width && sizes->height && sizes->mwidth && sizes->mheight) {
+ qScrollerDebug() << "XRandR DPI:" << QPointF(qreal(25.4) * qreal(sizes->width) / qreal(sizes->mwidth),
+ qreal(25.4) * qreal(sizes->height) / qreal(sizes->mheight));
+ return QPointF(qreal(25.4) * qreal(sizes->width) / qreal(sizes->mwidth),
+ qreal(25.4) * qreal(sizes->height) / qreal(sizes->mheight));
+ }
+ }
+# endif
+
+ QWidget *w = QApplication::desktop()->screen(screen);
+ return QPointF(w->physicalDpiX(), w->physicalDpiY());
+}
+
+#endif // !Q_WS_MAC
+
+
+/*! \internal
+ Returns the resolution of the used screen.
+*/
+QPointF QScrollerPrivate::dpi() const
+{
+ return pixelPerMeter * qreal(0.0254);
+}
+
+/*! \internal
+ Sets the resolution used for scrolling.
+ This resolution is only used by the kinetic scroller. If you change this
+ then the scroller will behave quite different as a lot of the values are
+ given in physical distances (millimeter).
+*/
+void QScrollerPrivate::setDpi(const QPointF &dpi)
+{
+ pixelPerMeter = dpi / qreal(0.0254);
+}
+
+/*! \internal
+ Sets the dpi used for scrolling to the value of the widget.
+*/
+void QScrollerPrivate::setDpiFromWidget(QWidget *widget)
+{
+ QDesktopWidget *dw = QApplication::desktop();
+ setDpi(realDpi(widget ? dw->screenNumber(widget) : dw->primaryScreen()));
+}
+
+/*! \internal
+ Updates the velocity during dragging.
+ Sets releaseVelocity.
+*/
+void QScrollerPrivate::updateVelocity(const QPointF &deltaPixelRaw, qint64 deltaTime)
+{
+ if (deltaTime <= 0)
+ return;
+
+ Q_Q(QScroller);
+ QPointF ppm = q->pixelPerMeter();
+ const QScrollerPropertiesPrivate *sp = properties.d.data();
+ QPointF deltaPixel = deltaPixelRaw;
+
+ qScrollerDebug() << "QScroller::updateVelocity(" << deltaPixelRaw << " [delta pix], " << deltaTime << " [delta ms])";
+
+ // faster than 2.5mm/ms seems bogus (that would be a screen height in ~20 ms)
+ if (((deltaPixelRaw / qreal(deltaTime)).manhattanLength() / ((ppm.x() + ppm.y()) / 2) * 1000) > qreal(2.5))
+ deltaPixel = deltaPixelRaw * qreal(2.5) * ppm / 1000 / (deltaPixelRaw / qreal(deltaTime)).manhattanLength();
+
+ QPointF newv = -deltaPixel / qreal(deltaTime) * qreal(1000) / ppm;
+ if (releaseVelocity != QPointF(0, 0))
+ newv = newv * sp->dragVelocitySmoothingFactor + releaseVelocity * (qreal(1) - sp->dragVelocitySmoothingFactor);
+
+ releaseVelocity.setX(qBound(-sp->maximumVelocity, newv.x(), sp->maximumVelocity));
+ releaseVelocity.setY(qBound(-sp->maximumVelocity, newv.y(), sp->maximumVelocity));
+
+ qScrollerDebug() << " --> new velocity:" << releaseVelocity;
+}
+
+void QScrollerPrivate::pushSegment(ScrollType type, qreal deltaTime, qreal startPos, qreal endPos, QEasingCurve::Type curve, Qt::Orientation orientation, qreal maxProgress)
+{
+ if (startPos == endPos)
+ return;
+
+ ScrollSegment s;
+ if (orientation == Qt::Horizontal && !xSegments.isEmpty())
+ s.startTime = xSegments.last().startTime + xSegments.last().deltaTime;
+ else if (orientation == Qt::Vertical && !ySegments.isEmpty())
+ s.startTime = ySegments.last().startTime + ySegments.last().deltaTime;
+ else
+ s.startTime = monotonicTimer.elapsed();
+
+ s.startPos = startPos;
+ s.deltaPos = endPos - startPos;
+ s.deltaTime = deltaTime * 1000;
+ s.maxProgress = maxProgress;
+ s.curve.setType(curve);
+ s.type = type;
+
+ if (orientation == Qt::Horizontal)
+ xSegments.enqueue(s);
+ else
+ ySegments.enqueue(s);
+
+ qScrollerDebug() << "+++ Added a new ScrollSegment: " << s;
+}
+
+
+/*! \internal
+ Clears the old segments and recalculates them if the current segments are not longer valid
+*/
+void QScrollerPrivate::recalcScrollingSegments(bool forceRecalc)
+{
+ Q_Q(QScroller);
+ QPointF ppm = q->pixelPerMeter();
+
+ releaseVelocity = q->velocity();
+
+ if (forceRecalc || !scrollingSegmentsValid(Qt::Horizontal))
+ createScrollingSegments(releaseVelocity.x(), contentPosition.x() + overshootPosition.x(), ppm.x(), Qt::Horizontal);
+
+ if (forceRecalc || !scrollingSegmentsValid(Qt::Vertical))
+ createScrollingSegments(releaseVelocity.y(), contentPosition.y() + overshootPosition.y(), ppm.y(), Qt::Vertical);
+}
+
+/*! \internal
+ Returns the end position after the current scroll has finished.
+*/
+qreal QScrollerPrivate::scrollingSegmentsEndPos(Qt::Orientation orientation) const
+{
+ const QQueue<ScrollSegment> *segments;
+ qreal endPos;
+
+ if (orientation == Qt::Horizontal) {
+ segments = &xSegments;
+ endPos = contentPosition.x() + overshootPosition.x();
+ } else {
+ segments = &ySegments;
+ endPos = contentPosition.y() + overshootPosition.y();
+ }
+
+ if (!segments->isEmpty()) {
+ const ScrollSegment &last = segments->last();
+ endPos = last.startPos + last.deltaPos;
+ }
+
+ return endPos;
+}
+
+/*! \internal
+ Checks if the scroller segment end in a valid position.
+*/
+bool QScrollerPrivate::scrollingSegmentsValid(Qt::Orientation orientation)
+{
+ QQueue<ScrollSegment> *segments;
+ qreal minPos;
+ qreal maxPos;
+
+ if (orientation == Qt::Horizontal) {
+ segments = &xSegments;
+ minPos = contentPosRange.left();
+ maxPos = contentPosRange.right();
+ } else {
+ segments = &ySegments;
+ minPos = contentPosRange.top();
+ maxPos = contentPosRange.bottom();
+ }
+
+ if (segments->isEmpty())
+ return true;
+
+ const ScrollSegment &last = segments->last();
+ qreal endPos = last.startPos + last.deltaPos;
+
+ if (last.type == ScrollTypeScrollTo)
+ return true; // scrollTo is always valid
+
+ if (last.type == ScrollTypeOvershoot &&
+ endPos != minPos && endPos != maxPos)
+ return false;
+
+ if (endPos < minPos || endPos > maxPos)
+ return false;
+
+ if (endPos == minPos || endPos == maxPos) // the begin and the end of the list are always ok
+ return true;
+
+ qreal nextSnap = nextSnapPos(endPos, 0, orientation);
+ if (!qIsNaN(nextSnap) && endPos != nextSnap)
+ return false;
+
+ return true;
+}
+
+/*! \internal
+ Creates the sections needed to scroll to the specific \a endPos to the segments queue.
+*/
+void QScrollerPrivate::createScrollToSegments(qreal v, qreal deltaTime, qreal endPos, Qt::Orientation orientation, ScrollType type)
+{
+ Q_UNUSED(v);
+
+ if (orientation == Qt::Horizontal) {
+ xSegments.clear();
+ } else {
+ ySegments.clear();
+ }
+
+ qScrollerDebug() << "+++ createScrollToSegments: t:" << deltaTime << "ep:" << endPos << "o:" << int(orientation);
+
+ const QScrollerPropertiesPrivate *sp = properties.d.data();
+
+ qreal startPos = (orientation == Qt::Horizontal) ? contentPosition.x() + overshootPosition.x()
+ : contentPosition.y() + overshootPosition.y();
+ qreal deltaPos = endPos - startPos;
+
+ pushSegment(type, deltaTime * 0.3, startPos, startPos + deltaPos * 0.5, QEasingCurve::InQuad, orientation);
+ pushSegment(type, deltaTime * 0.7, startPos + deltaPos * 0.5, endPos, sp->scrollingCurve.type(), orientation);
+}
+
+/*! \internal
+*/
+void QScrollerPrivate::createScrollingSegments(qreal v, qreal startPos, qreal ppm, Qt::Orientation orientation)
+{
+ const QScrollerPropertiesPrivate *sp = properties.d.data();
+
+ QScrollerProperties::OvershootPolicy policy;
+ qreal minPos;
+ qreal maxPos;
+ qreal viewSize;
+
+ if (orientation == Qt::Horizontal) {
+ xSegments.clear();
+ policy = sp->hOvershootPolicy;
+ minPos = contentPosRange.left();
+ maxPos = contentPosRange.right();
+ viewSize = viewportSize.width();
+ } else {
+ ySegments.clear();
+ policy = sp->vOvershootPolicy;
+ minPos = contentPosRange.top();
+ maxPos = contentPosRange.bottom();
+ viewSize = viewportSize.height();
+ }
+
+ bool alwaysOvershoot = (policy == QScrollerProperties::OvershootAlwaysOn);
+ bool noOvershoot = (policy == QScrollerProperties::OvershootAlwaysOff) || !sp->overshootScrollDistanceFactor;
+ bool canOvershoot = !noOvershoot && (alwaysOvershoot || maxPos);
+
+ qScrollerDebug() << "+++ createScrollingSegments: s:" << startPos << "maxPos:" << maxPos << "o:" << int(orientation);
+
+ // -- check if we are in overshoot
+ if (startPos < minPos) {
+ createScrollToSegments(v, sp->overshootScrollTime * 0.5, minPos, orientation, ScrollTypeOvershoot);
+ return;
+ }
+
+ if (startPos > maxPos) {
+ createScrollToSegments(v, sp->overshootScrollTime * 0.5, maxPos, orientation, ScrollTypeOvershoot);
+ return;
+ }
+
+ qScrollerDebug() << "v = " << v << ", decelerationFactor = " << sp->decelerationFactor << ", curveType = " << sp->scrollingCurve.type();
+
+ // This is only correct for QEasingCurve::OutQuad (linear velocity,
+ // constant deceleration), but the results look and feel ok for OutExpo
+ // and OutSine as well
+
+ // v(t) = deltaTime * a * 0.5 * differentialForProgress(t / deltaTime)
+ // v(0) = vrelease
+ // v(deltaTime) = 0
+ // deltaTime = (2 * vrelease) / (a * differntial(0))
+
+ // pos(t) = integrate(v(t)dt)
+ // pos(t) = vrelease * t - 0.5 * a * t * t
+ // pos(t) = deltaTime * a * 0.5 * progress(t / deltaTime) * deltaTime
+ // deltaPos = pos(deltaTime)
+
+ qreal deltaTime = (qreal(2) * qAbs(v)) / (sp->decelerationFactor * differentialForProgress(sp->scrollingCurve, 0));
+ qreal deltaPos = qSign(v) * deltaTime * deltaTime * qreal(0.5) * sp->decelerationFactor * ppm;
+ qreal endPos = startPos + deltaPos;
+
+ qScrollerDebug() << " Real Delta:" << deltaPos;
+
+ // -- determine snap points
+ qreal nextSnap = nextSnapPos(endPos, 0, orientation);
+ qreal lowerSnapPos = nextSnapPos(startPos, -1, orientation);
+ qreal higherSnapPos = nextSnapPos(startPos, 1, orientation);
+
+ qScrollerDebug() << " Real Delta:" << lowerSnapPos <<"-"<<nextSnap <<"-"<<higherSnapPos;
+
+ // - check if we can reach another snap point
+ if (nextSnap > higherSnapPos || qIsNaN(higherSnapPos))
+ higherSnapPos = nextSnap;
+ if (nextSnap < lowerSnapPos || qIsNaN(lowerSnapPos))
+ lowerSnapPos = nextSnap;
+
+ if (qAbs(v) < sp->minimumVelocity) {
+
+ qScrollerDebug() << "### below minimum Vel" << orientation;
+
+ // - no snap points or already at one
+ if (qIsNaN(nextSnap) || nextSnap == startPos)
+ return; // nothing to do, no scrolling needed.
+
+ // - decide which point to use
+
+ qreal snapDistance = higherSnapPos - lowerSnapPos;
+
+ qreal pressDistance = (orientation == Qt::Horizontal) ?
+ lastPosition.x() - pressPosition.x() :
+ lastPosition.y() - pressPosition.y();
+
+ // if not dragged far enough, pick the next snap point.
+ if (sp->snapPositionRatio == 0.0 || qAbs(pressDistance / sp->snapPositionRatio) > snapDistance)
+ endPos = nextSnap;
+ else if (pressDistance < 0.0)
+ endPos = lowerSnapPos;
+ else
+ endPos = higherSnapPos;
+
+ deltaPos = endPos - startPos;
+ pushSegment(ScrollTypeFlick, sp->snapTime * 0.3, startPos, startPos + deltaPos * 0.3, QEasingCurve::InQuad, orientation);
+ pushSegment(ScrollTypeFlick, sp->snapTime * 0.7, startPos + deltaPos * 0.3, endPos, sp->scrollingCurve.type(), orientation);
+ return;
+ }
+
+ // - go to the next snappoint if there is one
+ if (v > 0 && !qIsNaN(higherSnapPos)) {
+ // change the time in relation to the changed end position
+ if (endPos - startPos)
+ deltaTime *= qAbs((higherSnapPos - startPos) / (endPos - startPos));
+ if (deltaTime > sp->snapTime)
+ deltaTime = sp->snapTime;
+ endPos = higherSnapPos;
+
+ } else if (v < 0 && !qIsNaN(lowerSnapPos)) {
+ // change the time in relation to the changed end position
+ if (endPos - startPos)
+ deltaTime *= qAbs((lowerSnapPos - startPos) / (endPos - startPos));
+ if (deltaTime > sp->snapTime)
+ deltaTime = sp->snapTime;
+ endPos = lowerSnapPos;
+
+ // -- check if we are overshooting
+ } else if (endPos < minPos || endPos > maxPos) {
+ qreal stopPos = endPos < minPos ? minPos : maxPos;
+
+ qScrollerDebug() << "Overshoot: delta:" << (stopPos - startPos);
+
+ qreal maxProgress = progressForValue(sp->scrollingCurve, qAbs((stopPos - startPos) / deltaPos));
+ qScrollerDebug() << "Overshoot maxp:" << maxProgress;
+
+ pushSegment(ScrollTypeFlick, deltaTime * maxProgress, startPos, stopPos, sp->scrollingCurve.type(), orientation, maxProgress);
+
+ if (canOvershoot) {
+ qreal endV = qSign(v) * deltaTime * sp->decelerationFactor * qreal(0.5) * differentialForProgress(sp->scrollingCurve, maxProgress);
+ qScrollerDebug() << "Overshoot: velocity" << endV;
+ qScrollerDebug() << "Overshoot: maxVelocity" << sp->maximumVelocity;
+ qScrollerDebug() << "Overshoot: viewsize" << viewSize;
+ qScrollerDebug() << "Overshoot: factor" << sp->overshootScrollDistanceFactor;
+
+ qreal oDistance = viewSize * sp->overshootScrollDistanceFactor * endV / sp->maximumVelocity;
+ qreal oDeltaTime = sp->overshootScrollTime;
+
+ pushSegment(ScrollTypeOvershoot, oDeltaTime * 0.3, stopPos, stopPos + oDistance, sp->scrollingCurve.type(), orientation);
+ pushSegment(ScrollTypeOvershoot, oDeltaTime * 0.7, stopPos + oDistance, stopPos, sp->scrollingCurve.type(), orientation);
+ }
+ return;
+ }
+
+ pushSegment(ScrollTypeFlick, deltaTime, startPos, endPos, sp->scrollingCurve.type(), orientation);
+}
+
+
+/*! Prepares scrolling by sending a QScrollPrepareEvent to the receiver widget.
+ Returns true if the scrolling was accepted and a target was returned.
+*/
+bool QScrollerPrivate::prepareScrolling(const QPointF &position)
+{
+ QScrollPrepareEvent spe(position);
+ spe.ignore();
+ sendEvent(target, &spe);
+
+ qScrollerDebug() << "QScrollPrepareEvent returned from" << target << "with" << spe.isAccepted() << "mcp:" << spe.contentPosRange() << "cp:" << spe.contentPos();
+ if (spe.isAccepted()) {
+ QPointF oldContentPos = contentPosition + overshootPosition;
+ QPointF contentDelta = spe.contentPos() - oldContentPos;
+
+ viewportSize = spe.viewportSize();
+ contentPosRange = spe.contentPosRange();
+ if (contentPosRange.width() < 0)
+ contentPosRange.setWidth(0);
+ if (contentPosRange.height() < 0)
+ contentPosRange.setHeight(0);
+ contentPosition = clampToRect(spe.contentPos(), contentPosRange);
+ overshootPosition = spe.contentPos() - contentPosition;
+
+ // - check if the content position was moved
+ if (contentDelta != QPointF(0, 0)) {
+ // need to correct all segments
+ for (int i = 0; i < xSegments.count(); i++)
+ xSegments[i].startPos -= contentDelta.x();
+
+ for (int i = 0; i < ySegments.count(); i++)
+ ySegments[i].startPos -= contentDelta.y();
+ }
+
+ if (QWidget *w = qobject_cast<QWidget *>(target))
+ setDpiFromWidget(w);
+ if (QGraphicsObject *go = qobject_cast<QGraphicsObject *>(target)) {
+ //TODO: the first view isn't really correct - maybe use an additional field in the prepare event?
+ if (go->scene() && !go->scene()->views().isEmpty())
+ setDpiFromWidget(go->scene()->views().first());
+ }
+
+ if (state == QScroller::Scrolling) {
+ recalcScrollingSegments();
+ }
+ return true;
+ }
+
+ return false;
+}
+
+void QScrollerPrivate::handleDrag(const QPointF &position, qint64 timestamp)
+{
+ const QScrollerPropertiesPrivate *sp = properties.d.data();
+
+ QPointF deltaPixel = position - lastPosition;
+ qint64 deltaTime = timestamp - lastTimestamp;
+
+ if (sp->axisLockThreshold) {
+ int dx = qAbs(deltaPixel.x());
+ int dy = qAbs(deltaPixel.y());
+ if (dx || dy) {
+ bool vertical = (dy > dx);
+ qreal alpha = qreal(vertical ? dx : dy) / qreal(vertical ? dy : dx);
+ //qScrollerDebug() << "QScroller::handleDrag() -- axis lock:" << alpha << " / " << axisLockThreshold << "- isvertical:" << vertical << "- dx:" << dx << "- dy:" << dy;
+ if (alpha <= sp->axisLockThreshold) {
+ if (vertical)
+ deltaPixel.setX(0);
+ else
+ deltaPixel.setY(0);
+ }
+ }
+ }
+
+ // calculate velocity (if the user would release the mouse NOW)
+ updateVelocity(deltaPixel, deltaTime);
+
+ // restrict velocity, if content is not scrollable
+ QRectF max = contentPosRange;
+ bool canScrollX = (max.width() > 0) || (sp->hOvershootPolicy == QScrollerProperties::OvershootAlwaysOn);
+ bool canScrollY = (max.height() > 0) || (sp->vOvershootPolicy == QScrollerProperties::OvershootAlwaysOn);
+
+ if (!canScrollX) {
+ deltaPixel.setX(0);
+ releaseVelocity.setX(0);
+ }
+ if (!canScrollY) {
+ deltaPixel.setY(0);
+ releaseVelocity.setY(0);
+ }
+
+// if (firstDrag) {
+// // Do not delay the first drag
+// setContentPositionHelper(q->contentPosition() - overshootDistance - deltaPixel);
+// dragDistance = QPointF(0, 0);
+// } else {
+ dragDistance += deltaPixel;
+// }
+//qScrollerDebug() << "######################" << deltaPixel << position.y() << lastPosition.y();
+ if (canScrollX)
+ lastPosition.setX(position.x());
+ if (canScrollY)
+ lastPosition.setY(position.y());
+ lastTimestamp = timestamp;
+}
+
+bool QScrollerPrivate::pressWhileInactive(const QPointF &position, qint64 timestamp)
+{
+ if (prepareScrolling(position)) {
+ const QScrollerPropertiesPrivate *sp = properties.d.data();
+
+ if (!contentPosRange.isNull() ||
+ (sp->hOvershootPolicy == QScrollerProperties::OvershootAlwaysOn) ||
+ (sp->vOvershootPolicy == QScrollerProperties::OvershootAlwaysOn)) {
+
+ lastPosition = pressPosition = position;
+ lastTimestamp = pressTimestamp = timestamp;
+ setState(QScroller::Pressed);
+ }
+ }
+ return false;
+}
+
+bool QScrollerPrivate::releaseWhilePressed(const QPointF &, qint64)
+{
+ if (overshootPosition != QPointF(0.0, 0.0)) {
+ setState(QScroller::Scrolling);
+ return true;
+ } else {
+ setState(QScroller::Inactive);
+ return false;
+ }
+}
+
+bool QScrollerPrivate::moveWhilePressed(const QPointF &position, qint64 timestamp)
+{
+ Q_Q(QScroller);
+ const QScrollerPropertiesPrivate *sp = properties.d.data();
+ QPointF ppm = q->pixelPerMeter();
+
+ QPointF deltaPixel = position - pressPosition;
+
+ bool moveAborted = false;
+ bool moveStarted = (((deltaPixel / ppm).manhattanLength()) > sp->dragStartDistance);
+
+ // check the direction of the mouse drag and abort if it's too much in the wrong direction.
+ if (moveStarted) {
+ QRectF max = contentPosRange;
+ bool canScrollX = (max.width() > 0);
+ bool canScrollY = (max.height() > 0);
+
+ if (sp->hOvershootPolicy == QScrollerProperties::OvershootAlwaysOn)
+ canScrollX = true;
+ if (sp->vOvershootPolicy == QScrollerProperties::OvershootAlwaysOn)
+ canScrollY = true;
+
+ if (qAbs(deltaPixel.x() / ppm.x()) < qAbs(deltaPixel.y() / ppm.y())) {
+ if (!canScrollY)
+ moveAborted = true;
+ } else {
+ if (!canScrollX)
+ moveAborted = true;
+ }
+ }
+
+ if (moveAborted) {
+ setState(QScroller::Inactive);
+ moveStarted = false;
+
+ } else if (moveStarted) {
+ setState(QScroller::Dragging);
+
+ // subtract the dragStartDistance
+ deltaPixel = deltaPixel - deltaPixel * (sp->dragStartDistance / deltaPixel.manhattanLength());
+
+ if (deltaPixel != QPointF(0, 0)) {
+ // handleDrag updates lastPosition, lastTimestamp and velocity
+ handleDrag(pressPosition + deltaPixel, timestamp);
+ }
+ }
+ return moveStarted;
+}
+
+bool QScrollerPrivate::moveWhileDragging(const QPointF &position, qint64 timestamp)
+{
+ // handleDrag updates lastPosition, lastTimestamp and velocity
+ handleDrag(position, timestamp);
+ return true;
+}
+
+void QScrollerPrivate::timerEventWhileDragging()
+{
+ if (dragDistance != QPointF(0, 0)) {
+ qScrollerDebug() << "QScroller::timerEventWhileDragging() -- dragDistance:" << dragDistance;
+
+ setContentPositionHelperDragging(-dragDistance);
+ dragDistance = QPointF(0, 0);
+ }
+}
+
+bool QScrollerPrivate::releaseWhileDragging(const QPointF &position, qint64 timestamp)
+{
+ Q_Q(QScroller);
+ const QScrollerPropertiesPrivate *sp = properties.d.data();
+
+ // handleDrag updates lastPosition, lastTimestamp and velocity
+ handleDrag(position, timestamp);
+
+ // check if we moved at all - this can happen if you stop a running
+ // scroller with a press and release shortly afterwards
+ QPointF deltaPixel = position - pressPosition;
+ if (((deltaPixel / q->pixelPerMeter()).manhattanLength()) > sp->dragStartDistance) {
+
+ // handle accelerating flicks
+ if ((oldVelocity != QPointF(0, 0)) && sp->acceleratingFlickMaximumTime &&
+ ((timestamp - pressTimestamp) < qint64(sp->acceleratingFlickMaximumTime * 1000))) {
+
+ // - determine if the direction was changed
+ int signX = 0, signY = 0;
+ if (releaseVelocity.x())
+ signX = (releaseVelocity.x() > 0) == (oldVelocity.x() > 0) ? 1 : -1;
+ if (releaseVelocity.y())
+ signY = (releaseVelocity.y() > 0) == (oldVelocity.y() > 0) ? 1 : -1;
+
+ if (signX > 0)
+ releaseVelocity.setX(qBound(-sp->maximumVelocity,
+ oldVelocity.x() * sp->acceleratingFlickSpeedupFactor,
+ sp->maximumVelocity));
+ if (signY > 0)
+ releaseVelocity.setY(qBound(-sp->maximumVelocity,
+ oldVelocity.y() * sp->acceleratingFlickSpeedupFactor,
+ sp->maximumVelocity));
+ }
+ }
+
+ QPointF ppm = q->pixelPerMeter();
+ createScrollingSegments(releaseVelocity.x(), contentPosition.x() + overshootPosition.x(), ppm.x(), Qt::Horizontal);
+ createScrollingSegments(releaseVelocity.y(), contentPosition.y() + overshootPosition.y(), ppm.y(), Qt::Vertical);
+
+ qScrollerDebug() << "QScroller::releaseWhileDragging() -- velocity:" << releaseVelocity << "-- minimum velocity:" << sp->minimumVelocity << "overshoot" << overshootPosition;
+
+ if (xSegments.isEmpty() && ySegments.isEmpty())
+ setState(QScroller::Inactive);
+ else
+ setState(QScroller::Scrolling);
+
+ return true;
+}
+
+void QScrollerPrivate::timerEventWhileScrolling()
+{
+ qScrollerDebug() << "QScroller::timerEventWhileScrolling()";
+
+ setContentPositionHelperScrolling();
+ if (xSegments.isEmpty() && ySegments.isEmpty())
+ setState(QScroller::Inactive);
+}
+
+bool QScrollerPrivate::pressWhileScrolling(const QPointF &position, qint64 timestamp)
+{
+ Q_Q(QScroller);
+
+ if ((q->velocity() <= properties.d->maximumClickThroughVelocity) &&
+ (overshootPosition == QPointF(0.0, 0.0))) {
+ setState(QScroller::Inactive);
+ return false;
+ } else {
+ lastPosition = pressPosition = position;
+ lastTimestamp = pressTimestamp = timestamp;
+ setState(QScroller::Pressed);
+ setState(QScroller::Dragging);
+ return true;
+ }
+}
+
+/*! \internal
+ This function handles all state changes of the scroller.
+*/
+void QScrollerPrivate::setState(QScroller::State newstate)
+{
+ Q_Q(QScroller);
+ bool sendLastScroll = false;
+
+ if (state == newstate)
+ return;
+
+ qScrollerDebug() << q << "QScroller::setState(" << stateName(newstate) << ")";
+
+ switch (newstate) {
+ case QScroller::Inactive:
+ scrollTimer->stop();
+
+ // send the last scroll event (but only after the current state change was finished)
+ if (!firstScroll)
+ sendLastScroll = true;
+
+ releaseVelocity = QPointF(0, 0);
+ break;
+
+ case QScroller::Pressed:
+ scrollTimer->stop();
+
+ oldVelocity = releaseVelocity;
+ releaseVelocity = QPointF(0, 0);
+ break;
+
+ case QScroller::Dragging:
+ dragDistance = QPointF(0, 0);
+ if (state == QScroller::Pressed)
+ scrollTimer->start();
+ break;
+
+ case QScroller::Scrolling:
+ scrollTimer->start();
+ break;
+ }
+
+ qSwap(state, newstate);
+
+ if (sendLastScroll) {
+ QScrollEvent se(contentPosition, overshootPosition, QScrollEvent::ScrollFinished);
+ sendEvent(target, &se);
+ firstScroll = true;
+ }
+ if (state == QScroller::Dragging || state == QScroller::Scrolling)
+ activeScrollers.insert(q);
+ else
+ activeScrollers.remove(q);
+ emit q->stateChanged(state);
+}
+
+
+/*! \internal
+ Helps when setting the content position.
+ It will try to move the content by the requested delta but stop in case
+ when we are coming back from an overshoot or a scrollTo.
+ It will also indicate a new overshooting condition by the overshootX and oversthootY flags.
+
+ In this cases it will reset the velocity variables and other flags.
+
+ Also keeps track of the current over-shooting value in overshootPosition.
+
+ \a deltaPos is the amount of pixels the current content position should be moved
+*/
+void QScrollerPrivate::setContentPositionHelperDragging(const QPointF &deltaPos)
+{
+ Q_Q(QScroller);
+ QPointF ppm = q->pixelPerMeter();
+ const QScrollerPropertiesPrivate *sp = properties.d.data();
+ QPointF v = q->velocity();
+
+ if (sp->overshootDragResistanceFactor)
+ overshootPosition /= sp->overshootDragResistanceFactor;
+
+ QPointF oldPos = contentPosition + overshootPosition;
+ QPointF newPos = oldPos + deltaPos;
+
+ qScrollerDebug() << "QScroller::setContentPositionHelperDragging(" << deltaPos << " [pix])";
+ qScrollerDebug() << " --> overshoot:" << overshootPosition << "- old pos:" << oldPos << "- new pos:" << newPos;
+
+ QPointF oldClampedPos = clampToRect(oldPos, contentPosRange);
+ QPointF newClampedPos = clampToRect(newPos, contentPosRange);
+
+ // --- handle overshooting and stop if the coordinate is going back inside the normal area
+ bool alwaysOvershootX = (sp->hOvershootPolicy == QScrollerProperties::OvershootAlwaysOn);
+ bool alwaysOvershootY = (sp->vOvershootPolicy == QScrollerProperties::OvershootAlwaysOn);
+ bool noOvershootX = (sp->hOvershootPolicy == QScrollerProperties::OvershootAlwaysOff) ||
+ ((state == QScroller::Dragging) && !sp->overshootDragResistanceFactor) ||
+ !sp->overshootDragDistanceFactor;
+ bool noOvershootY = (sp->vOvershootPolicy == QScrollerProperties::OvershootAlwaysOff) ||
+ ((state == QScroller::Dragging) && !sp->overshootDragResistanceFactor) ||
+ !sp->overshootDragDistanceFactor;
+ bool canOvershootX = !noOvershootX && (alwaysOvershootX || contentPosRange.width());
+ bool canOvershootY = !noOvershootY && (alwaysOvershootY || contentPosRange.height());
+
+ qreal oldOvershootX = (canOvershootX) ? oldPos.x() - oldClampedPos.x() : 0;
+ qreal oldOvershootY = (canOvershootY) ? oldPos.y() - oldClampedPos.y() : 0;
+
+ qreal newOvershootX = (canOvershootX) ? newPos.x() - newClampedPos.x() : 0;
+ qreal newOvershootY = (canOvershootY) ? newPos.y() - newClampedPos.y() : 0;
+
+ qreal maxOvershootX = viewportSize.width() * sp->overshootDragDistanceFactor;
+ qreal maxOvershootY = viewportSize.height() * sp->overshootDragDistanceFactor;
+
+ qScrollerDebug() << " --> noOs:" << noOvershootX << "drf:" << sp->overshootDragResistanceFactor << "mdf:" << sp->overshootScrollDistanceFactor << "ossP:"<<sp->hOvershootPolicy;
+ qScrollerDebug() << " --> canOS:" << canOvershootX << "newOS:" << newOvershootX << "maxOS:" << maxOvershootX;
+
+ if (sp->overshootDragResistanceFactor) {
+ oldOvershootX *= sp->overshootDragResistanceFactor;
+ oldOvershootY *= sp->overshootDragResistanceFactor;
+ newOvershootX *= sp->overshootDragResistanceFactor;
+ newOvershootY *= sp->overshootDragResistanceFactor;
+ }
+
+ // -- stop at the maximum overshoot distance
+
+ newOvershootX = qBound(-maxOvershootX, newOvershootX, maxOvershootX);
+ newOvershootY = qBound(-maxOvershootY, newOvershootY, maxOvershootY);
+
+ overshootPosition.setX(newOvershootX);
+ overshootPosition.setY(newOvershootY);
+ contentPosition = newClampedPos;
+
+ QScrollEvent se(contentPosition, overshootPosition, firstScroll ? QScrollEvent::ScrollStarted : QScrollEvent::ScrollUpdated);
+ sendEvent(target, &se);
+ firstScroll = false;
+
+ qScrollerDebug() << " --> new position:" << newClampedPos << "- new overshoot:" << overshootPosition <<
+ "- overshoot x/y?:" << overshootPosition;
+}
+
+
+qreal QScrollerPrivate::nextSegmentPosition(QQueue<ScrollSegment> &segments, qint64 now, qreal oldPos)
+{
+ qreal pos = oldPos;
+
+ // check the X segments for new positions
+ while (!segments.isEmpty()) {
+ const ScrollSegment s = segments.head();
+
+ if ((s.startTime + s.deltaTime) <= now) {
+ segments.dequeue();
+ pos = s.startPos + s.deltaPos;
+ } else if (s.startTime <= now) {
+ qreal progress = qreal(now - s.startTime) / (qreal(s.deltaTime) / s.maxProgress);
+ pos = s.startPos + s.deltaPos * s.curve.valueForProgress(progress) / s.curve.valueForProgress(s.maxProgress);
+ break;
+ } else {
+ break;
+ }
+ }
+ return pos;
+}
+
+void QScrollerPrivate::setContentPositionHelperScrolling()
+{
+ qint64 now = monotonicTimer.elapsed();
+ QPointF newPos = contentPosition + overshootPosition;
+
+ newPos.setX(nextSegmentPosition(xSegments, now, newPos.x()));
+ newPos.setY(nextSegmentPosition(ySegments, now, newPos.y()));
+
+ // -- set the position and handle overshoot
+ qScrollerDebug() << "QScroller::setContentPositionHelperScrolling()";
+ qScrollerDebug() << " --> overshoot:" << overshootPosition << "- new pos:" << newPos;
+
+ QPointF newClampedPos = clampToRect(newPos, contentPosRange);
+
+ overshootPosition = newPos - newClampedPos;
+ contentPosition = newClampedPos;
+
+ QScrollEvent se(contentPosition, overshootPosition, firstScroll ? QScrollEvent::ScrollStarted : QScrollEvent::ScrollUpdated);
+ sendEvent(target, &se);
+ firstScroll = false;
+
+ qScrollerDebug() << " --> new position:" << newClampedPos << "- new overshoot:" << overshootPosition;
+}
+
+/*! \internal
+ * Returns the next snap point in direction.
+ * If \a direction >0 it will return the next snap point that is larger than the current position.
+ * If \a direction <0 it will return the next snap point that is smaller than the current position.
+ * If \a direction ==0 it will return the nearest snap point (or the current position if we are already
+ * on a snap point.
+ * Returns the nearest snap position or NaN if no such point could be found.
+ */
+qreal QScrollerPrivate::nextSnapPos(qreal p, int dir, Qt::Orientation orientation)
+{
+ qreal bestSnapPos = Q_QNAN;
+ qreal bestSnapPosDist = Q_INFINITY;
+
+ qreal minPos;
+ qreal maxPos;
+
+ if (orientation == Qt::Horizontal) {
+ minPos = contentPosRange.left();
+ maxPos = contentPosRange.right();
+ } else {
+ minPos = contentPosRange.top();
+ maxPos = contentPosRange.bottom();
+ }
+
+ if (orientation == Qt::Horizontal) {
+ // the snap points in the list
+ foreach (qreal snapPos, snapPositionsX) {
+ qreal snapPosDist = snapPos - p;
+ if ((dir > 0 && snapPosDist < 0) ||
+ (dir < 0 && snapPosDist > 0))
+ continue; // wrong direction
+ if (snapPos < minPos || snapPos > maxPos )
+ continue; // invalid
+
+ if (qIsNaN(bestSnapPos) ||
+ qAbs(snapPosDist) < bestSnapPosDist ) {
+ bestSnapPos = snapPos;
+ bestSnapPosDist = qAbs(snapPosDist);
+ }
+ }
+
+ // the snap point interval
+ if (snapIntervalX > 0.0) {
+ qreal first = minPos + snapFirstX;
+ qreal snapPos;
+ if (dir > 0)
+ snapPos = qCeil((p - first) / snapIntervalX) * snapIntervalX + first;
+ else if (dir < 0)
+ snapPos = qFloor((p - first) / snapIntervalX) * snapIntervalX + first;
+ else if (p <= first)
+ snapPos = first;
+ else
+ {
+ qreal last = qFloor((maxPos - first) / snapIntervalX) * snapIntervalX + first;
+ if (p >= last)
+ snapPos = last;
+ else
+ snapPos = qRound((p - first) / snapIntervalX) * snapIntervalX + first;
+ }
+
+ if (snapPos >= first && snapPos <= maxPos ) {
+ qreal snapPosDist = snapPos - p;
+
+ if (qIsNaN(bestSnapPos) ||
+ qAbs(snapPosDist) < bestSnapPosDist ) {
+ bestSnapPos = snapPos;
+ bestSnapPosDist = qAbs(snapPosDist);
+ }
+ }
+ }
+
+ } else { // (orientation == Qt::Vertical)
+ // the snap points in the list
+ foreach (qreal snapPos, snapPositionsY) {
+ qreal snapPosDist = snapPos - p;
+ if ((dir > 0 && snapPosDist < 0) ||
+ (dir < 0 && snapPosDist > 0))
+ continue; // wrong direction
+ if (snapPos < minPos || snapPos > maxPos )
+ continue; // invalid
+
+ if (qIsNaN(bestSnapPos) ||
+ qAbs(snapPosDist) < bestSnapPosDist) {
+ bestSnapPos = snapPos;
+ bestSnapPosDist = qAbs(snapPosDist);
+ }
+ }
+
+ // the snap point interval
+ if (snapIntervalY > 0.0) {
+ qreal first = minPos + snapFirstY;
+ qreal snapPos;
+ if (dir > 0)
+ snapPos = qCeil((p - first) / snapIntervalY) * snapIntervalY + first;
+ else if (dir < 0)
+ snapPos = qFloor((p - first) / snapIntervalY) * snapIntervalY + first;
+ else if (p <= first)
+ snapPos = first;
+ else
+ {
+ qreal last = qFloor((maxPos - first) / snapIntervalY) * snapIntervalY + first;
+ if (p >= last)
+ snapPos = last;
+ else
+ snapPos = qRound((p - first) / snapIntervalY) * snapIntervalY + first;
+ }
+
+ if (snapPos >= first && snapPos <= maxPos ) {
+ qreal snapPosDist = snapPos - p;
+
+ if (qIsNaN(bestSnapPos) ||
+ qAbs(snapPosDist) < bestSnapPosDist) {
+ bestSnapPos = snapPos;
+ bestSnapPosDist = qAbs(snapPosDist);
+ }
+ }
+ }
+ }
+
+ return bestSnapPos;
+}
+
+/*!
+ \enum QScroller::State
+
+ This enum contains the different QScroller states.
+
+ \value Inactive The scroller is not scrolling and nothing is pressed.
+ \value Pressed A touch event was received or the mouse button pressed but the scroll area is currently not dragged.
+ \value Dragging The scroll area is currently following the touch point or mouse.
+ \value Scrolling The scroll area is moving on it's own.
+*/
+
+/*!
+ \enum QScroller::ScrollerGestureType
+
+ This enum contains the different gesture types that are supported by the QScroller gesture recognizer.
+
+ \value TouchGesture The gesture recognizer will only trigger on touch
+ events. Specifically it will react on single touch points when using a
+ touch screen and dual touch points when using a touchpad.
+ \value LeftMouseButtonGesture The gesture recognizer will only trigger on left mouse button events.
+ \value MiddleMouseButtonGesture The gesture recognizer will only trigger on middle mouse button events.
+ \value RightMouseButtonGesture The gesture recognizer will only trigger on right mouse button events.
+*/
+
+/*!
+ \enum QScroller::Input
+
+ This enum contains an input device agnostic view of input events that are relevant for QScroller.
+
+ \value InputPress The user pressed the input device (e.g. QEvent::MouseButtonPress,
+ QEvent::GraphicsSceneMousePress, QEvent::TouchBegin)
+
+ \value InputMove The user moved the input device (e.g. QEvent::MouseMove,
+ QEvent::GraphicsSceneMouseMove, QEvent::TouchUpdate)
+
+ \value InputRelease The user released the input device (e.g. QEvent::MouseButtonRelease,
+ QEvent::GraphicsSceneMouseRelease, QEvent::TouchEnd)
+
+*/
+
+QT_END_NAMESPACE
diff --git a/src/gui/util/qscroller.h b/src/gui/util/qscroller.h
new file mode 100644
index 0000000..7d7e1ca
--- /dev/null
+++ b/src/gui/util/qscroller.h
@@ -0,0 +1,149 @@
+/****************************************************************************
+**
+** 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 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 QSCROLLER_H
+#define QSCROLLER_H
+
+#include <QtCore/QObject>
+#include <QtCore/QPointF>
+#include <QtGui/QScrollerProperties>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Gui)
+
+class QWidget;
+class QScrollerPrivate;
+class QScrollerProperties;
+class QFlickGestureRecognizer;
+class QMouseFlickGestureRecognizer;
+
+class Q_GUI_EXPORT QScroller : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(State state READ state NOTIFY stateChanged)
+ Q_PROPERTY(QScrollerProperties scrollerProperties READ scrollerProperties WRITE setScrollerProperties NOTIFY scrollerPropertiesChanged)
+ Q_ENUMS(State)
+
+public:
+ enum State
+ {
+ Inactive,
+ Pressed,
+ Dragging,
+ Scrolling
+ };
+
+ enum ScrollerGestureType
+ {
+ TouchGesture,
+ LeftMouseButtonGesture,
+ RightMouseButtonGesture,
+ MiddleMouseButtonGesture
+ };
+
+ enum Input
+ {
+ InputPress = 1,
+ InputMove,
+ InputRelease
+ };
+
+ static bool hasScroller(QObject *target);
+
+ static QScroller *scroller(QObject *target);
+ static const QScroller *scroller(const QObject *target);
+
+ static Qt::GestureType grabGesture(QObject *target, ScrollerGestureType gestureType = TouchGesture);
+ static Qt::GestureType grabbedGesture(QObject *target);
+ static void ungrabGesture(QObject *target);
+
+ static QList<QScroller *> activeScrollers();
+
+ QObject *target() const;
+
+ State state() const;
+
+ bool handleInput(Input input, const QPointF &position, qint64 timestamp = 0);
+
+ void stop();
+ QPointF velocity() const;
+ QPointF finalPosition() const;
+ QPointF pixelPerMeter() const;
+
+ QScrollerProperties scrollerProperties() const;
+
+ void setSnapPositionsX( const QList<qreal> &positions );
+ void setSnapPositionsX( qreal first, qreal interval );
+ void setSnapPositionsY( const QList<qreal> &positions );
+ void setSnapPositionsY( qreal first, qreal interval );
+
+public Q_SLOTS:
+ void setScrollerProperties(const QScrollerProperties &prop);
+ void scrollTo(const QPointF &pos);
+ void scrollTo(const QPointF &pos, int scrollTime);
+ void ensureVisible(const QRectF &rect, qreal xmargin, qreal ymargin);
+ void ensureVisible(const QRectF &rect, qreal xmargin, qreal ymargin, int scrollTime);
+ void resendPrepareEvent();
+
+Q_SIGNALS:
+ void stateChanged(QScroller::State newstate);
+ void scrollerPropertiesChanged(const QScrollerProperties &);
+
+private:
+ QScrollerPrivate *d_ptr;
+
+ QScroller(QObject *target);
+ virtual ~QScroller();
+
+ Q_DISABLE_COPY(QScroller)
+ Q_DECLARE_PRIVATE(QScroller)
+
+ friend class QFlickGestureRecognizer;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QSCROLLER_H
diff --git a/src/gui/util/qscroller_mac.mm b/src/gui/util/qscroller_mac.mm
new file mode 100644
index 0000000..3203036
--- /dev/null
+++ b/src/gui/util/qscroller_mac.mm
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** 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 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$
+**
+****************************************************************************/
+
+#import <Cocoa/Cocoa.h>
+
+#include "qscroller_p.h"
+
+#ifdef Q_WS_MAC
+
+QPointF QScrollerPrivate::realDpi(int screen)
+{
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ NSArray *nsscreens = [NSScreen screens];
+
+ if (screen < 0 || screen >= int([nsscreens count]))
+ screen = 0;
+
+ NSScreen *nsscreen = [nsscreens objectAtIndex:screen];
+ CGDirectDisplayID display = [[[nsscreen deviceDescription] objectForKey:@"NSScreenNumber"] intValue];
+
+ CGSize mmsize = CGDisplayScreenSize(display);
+ if (mmsize.width > 0 && mmsize.height > 0) {
+ return QPointF(CGDisplayPixelsWide(display) / mmsize.width,
+ CGDisplayPixelsHigh(display) / mmsize.height) * qreal(25.4);
+ } else {
+ return QPointF();
+ }
+ [pool release];
+}
+
+#endif
diff --git a/src/gui/util/qscroller_p.h b/src/gui/util/qscroller_p.h
new file mode 100644
index 0000000..98f34f7
--- /dev/null
+++ b/src/gui/util/qscroller_p.h
@@ -0,0 +1,205 @@
+/****************************************************************************
+**
+** 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 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 QSCROLLER_P_H
+#define QSCROLLER_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 <QObject>
+#include <QPointer>
+#include <QQueue>
+#include <QSet>
+#include <QEasingCurve>
+#include <QElapsedTimer>
+#include <QSizeF>
+#include <QPointF>
+#include <QRectF>
+#include <qscroller.h>
+#include <qscrollerproperties.h>
+#include <private/qscrollerproperties_p.h>
+#include <QAbstractAnimation>
+
+QT_BEGIN_NAMESPACE
+
+class QFlickGestureRecognizer;
+
+class QScrollTimer;
+
+class QScrollerPrivate : public QObject
+{
+ Q_OBJECT
+ Q_DECLARE_PUBLIC(QScroller)
+
+public:
+ QScrollerPrivate(QScroller *q, QObject *target);
+ void init();
+
+ void sendEvent(QObject *o, QEvent *e);
+
+ void setState(QScroller::State s);
+
+ enum ScrollType {
+ ScrollTypeFlick = 0,
+ ScrollTypeScrollTo,
+ ScrollTypeOvershoot
+ };
+
+ struct ScrollSegment {
+ qint64 startTime;
+ qint64 deltaTime;
+ qreal startPos;
+ qreal deltaPos;
+ QEasingCurve curve;
+ qreal maxProgress;
+ ScrollType type;
+ };
+
+ bool pressWhileInactive(const QPointF &position, qint64 timestamp);
+ bool moveWhilePressed(const QPointF &position, qint64 timestamp);
+ bool releaseWhilePressed(const QPointF &position, qint64 timestamp);
+ bool moveWhileDragging(const QPointF &position, qint64 timestamp);
+ bool releaseWhileDragging(const QPointF &position, qint64 timestamp);
+ bool pressWhileScrolling(const QPointF &position, qint64 timestamp);
+
+ void timerTick();
+ void timerEventWhileDragging();
+ void timerEventWhileScrolling();
+
+ bool prepareScrolling(const QPointF &position);
+ void handleDrag(const QPointF &position, qint64 timestamp);
+
+ QPointF realDpi(int screen);
+ QPointF dpi() const;
+ void setDpi(const QPointF &dpi);
+ void setDpiFromWidget(QWidget *widget);
+
+ void updateVelocity(const QPointF &deltaPixelRaw, qint64 deltaTime);
+ void pushSegment(ScrollType type, qreal deltaTime, qreal startPos, qreal endPos, QEasingCurve::Type curve, Qt::Orientation orientation, qreal maxProgress = 1.0);
+ void recalcScrollingSegments(bool forceRecalc = false);
+ qreal scrollingSegmentsEndPos(Qt::Orientation orientation) const;
+ bool scrollingSegmentsValid(Qt::Orientation orientation);
+ void createScrollToSegments(qreal v, qreal deltaTime, qreal endPos, Qt::Orientation orientation, ScrollType type);
+ void createScrollingSegments(qreal v, qreal startPos, qreal ppm, Qt::Orientation orientation);
+
+ void setContentPositionHelperDragging(const QPointF &deltaPos);
+ void setContentPositionHelperScrolling();
+
+ qreal nextSnapPos(qreal p, int dir, Qt::Orientation orientation);
+ static qreal nextSegmentPosition(QQueue<ScrollSegment> &segments, qint64 now, qreal oldPos);
+
+ inline int frameRateSkip() const { return properties.d.data()->frameRate; }
+
+ static const char *stateName(QScroller::State state);
+ static const char *inputName(QScroller::Input input);
+
+public slots:
+ void targetDestroyed();
+
+public:
+ // static
+ static QMap<QObject *, QScroller *> allScrollers;
+ static QSet<QScroller *> activeScrollers;
+
+ // non static
+ QObject *target;
+ QScrollerProperties properties;
+ QFlickGestureRecognizer *recognizer;
+ Qt::GestureType recognizerType;
+
+ // scroller state:
+
+ // QPointer<QObject> scrollTarget;
+ QSizeF viewportSize;
+ QRectF contentPosRange;
+ QPointF contentPosition;
+ QPointF overshootPosition; // the number of pixels we are overshooting (before overshootDragResistanceFactor)
+
+ // state
+
+ bool enabled;
+ QScroller::State state;
+ bool firstScroll; // true if we haven't already send a scroll event
+
+ QPointF oldVelocity; // the release velocity of the last drag
+
+ QPointF pressPosition;
+ QPointF lastPosition;
+ qint64 pressTimestamp;
+ qint64 lastTimestamp;
+
+ QPointF dragDistance; // the distance we should move during the next drag timer event
+
+ QQueue<ScrollSegment> xSegments;
+ QQueue<ScrollSegment> ySegments;
+
+ // snap positions
+ QList<qreal> snapPositionsX;
+ qreal snapFirstX;
+ qreal snapIntervalX;
+ QList<qreal> snapPositionsY;
+ qreal snapFirstY;
+ qreal snapIntervalY;
+
+ QPointF pixelPerMeter;
+
+ QElapsedTimer monotonicTimer;
+
+ QPointF releaseVelocity; // the starting velocity of the scrolling state
+ QScrollTimer *scrollTimer;
+
+ QScroller *q_ptr;
+};
+
+
+QT_END_NAMESPACE
+
+#endif // QSCROLLER_P_H
+
diff --git a/src/gui/util/qscrollerproperties.cpp b/src/gui/util/qscrollerproperties.cpp
new file mode 100644
index 0000000..2e52959
--- /dev/null
+++ b/src/gui/util/qscrollerproperties.cpp
@@ -0,0 +1,397 @@
+/****************************************************************************
+**
+** 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 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 <QPointer>
+#include <QObject>
+#include <QtCore/qmath.h>
+#ifdef Q_WS_WIN
+# include <QLibrary>
+#endif
+
+#include "qscrollerproperties.h"
+#include "private/qscrollerproperties_p.h"
+
+QT_BEGIN_NAMESPACE
+
+static QScrollerPropertiesPrivate *userDefaults = 0;
+static QScrollerPropertiesPrivate *systemDefaults = 0;
+
+QScrollerPropertiesPrivate *QScrollerPropertiesPrivate::defaults()
+{
+ if (!systemDefaults) {
+ QScrollerPropertiesPrivate spp;
+ spp.mousePressEventDelay = qreal(0.25);
+ spp.dragStartDistance = qreal(5.0 / 1000);
+ spp.dragVelocitySmoothingFactor = qreal(0.8);
+ spp.axisLockThreshold = qreal(0);
+ spp.scrollingCurve.setType(QEasingCurve::OutQuad);
+ spp.decelerationFactor = qreal(0.125);
+ spp.minimumVelocity = qreal(50.0 / 1000);
+ spp.maximumVelocity = qreal(500.0 / 1000);
+ spp.maximumClickThroughVelocity = qreal(66.5 / 1000);
+ spp.acceleratingFlickMaximumTime = qreal(1.25);
+ spp.acceleratingFlickSpeedupFactor = qreal(3.0);
+ spp.snapPositionRatio = qreal(0.5);
+ spp.snapTime = qreal(0.3);
+ spp.overshootDragResistanceFactor = qreal(0.5);
+ spp.overshootDragDistanceFactor = qreal(1);
+ spp.overshootScrollDistanceFactor = qreal(0.5);
+ spp.overshootScrollTime = qreal(0.7);
+# ifdef Q_WS_WIN
+ if (QLibrary::resolve(QLatin1String("UxTheme"), "BeginPanningFeedback"))
+ spp.overshootScrollTime = qreal(0.35);
+# endif
+ spp.hOvershootPolicy = QScrollerProperties::OvershootWhenScrollable;
+ spp.vOvershootPolicy = QScrollerProperties::OvershootWhenScrollable;
+ spp.frameRate = QScrollerProperties::Standard;
+
+ systemDefaults = new QScrollerPropertiesPrivate(spp);
+ }
+ return new QScrollerPropertiesPrivate(userDefaults ? *userDefaults : *systemDefaults);
+}
+
+/*!
+ \class QScrollerProperties
+ \brief The QScrollerProperties class stores the settings for a QScroller.
+ \since 4.8
+
+ The QScrollerProperties class stores the parameters used by QScroller.
+
+ The default settings are platform dependant and Qt will emulate the
+ platform behaviour for kinetic scrolling.
+
+ As a convention the QScrollerProperties are in physical units (meter,
+ seconds) and will be converted by QScroller using the current DPI.
+
+ \sa QScroller
+*/
+
+/*!
+ Constructs new scroller properties.
+*/
+QScrollerProperties::QScrollerProperties()
+ : d(QScrollerPropertiesPrivate::defaults())
+{
+}
+
+/*!
+ Constructs a copy of \a sp.
+*/
+QScrollerProperties::QScrollerProperties(const QScrollerProperties &sp)
+ : d(new QScrollerPropertiesPrivate(*sp.d))
+{
+}
+
+/*!
+ Assigns \a sp to these scroller properties and returns a reference to these scroller properties.
+*/
+QScrollerProperties &QScrollerProperties::operator=(const QScrollerProperties &sp)
+{
+ *d.data() = *sp.d.data();
+ return *this;
+}
+
+/*!
+ Destroys the scroller properties.
+*/
+QScrollerProperties::~QScrollerProperties()
+{
+}
+
+/*!
+ Returns true if these scroller properties are equal to \a sp; otherwise returns false.
+*/
+bool QScrollerProperties::operator==(const QScrollerProperties &sp) const
+{
+ return *d.data() == *sp.d.data();
+}
+
+/*!
+ Returns true if these scroller properties are different from \a sp; otherwise returns false.
+*/
+bool QScrollerProperties::operator!=(const QScrollerProperties &sp) const
+{
+ return !(*d.data() == *sp.d.data());
+}
+
+bool QScrollerPropertiesPrivate::operator==(const QScrollerPropertiesPrivate &p) const
+{
+ bool same = true;
+ same &= (mousePressEventDelay == p.mousePressEventDelay);
+ same &= (dragStartDistance == p.dragStartDistance);
+ same &= (dragVelocitySmoothingFactor == p.dragVelocitySmoothingFactor);
+ same &= (axisLockThreshold == p.axisLockThreshold);
+ same &= (scrollingCurve == p.scrollingCurve);
+ same &= (decelerationFactor == p.decelerationFactor);
+ same &= (minimumVelocity == p.minimumVelocity);
+ same &= (maximumVelocity == p.maximumVelocity);
+ same &= (maximumClickThroughVelocity == p.maximumClickThroughVelocity);
+ same &= (acceleratingFlickMaximumTime == p.acceleratingFlickMaximumTime);
+ same &= (acceleratingFlickSpeedupFactor == p.acceleratingFlickSpeedupFactor);
+ same &= (snapPositionRatio == p.snapPositionRatio);
+ same &= (snapTime == p.snapTime);
+ same &= (overshootDragResistanceFactor == p.overshootDragResistanceFactor);
+ same &= (overshootDragDistanceFactor == p.overshootDragDistanceFactor);
+ same &= (overshootScrollDistanceFactor == p.overshootScrollDistanceFactor);
+ same &= (overshootScrollTime == p.overshootScrollTime);
+ same &= (hOvershootPolicy == p.hOvershootPolicy);
+ same &= (vOvershootPolicy == p.vOvershootPolicy);
+ same &= (frameRate == p.frameRate);
+ return same;
+}
+
+/*!
+ Sets the scroller properties returned by the default constructor to \a sp.
+
+ Use this function to override the platform default properties returned by the default
+ constructor. If you only want to change the scroller properties of a single scroller, then use
+ QScroller::setScrollerProperties()
+
+ \note Calling this function will not change the content of already existing
+ QScrollerProperties objects.
+
+ \sa unsetDefaultScrollerProperties()
+*/
+void QScrollerProperties::setDefaultScrollerProperties(const QScrollerProperties &sp)
+{
+ if (!userDefaults)
+ userDefaults = new QScrollerPropertiesPrivate(*sp.d);
+ else
+ *userDefaults = *sp.d;
+}
+
+/*!
+ Sets the scroller properties returned by the default constructor back to the platform default
+ properties.
+
+ \sa setDefaultScrollerProperties()
+*/
+void QScrollerProperties::unsetDefaultScrollerProperties()
+{
+ delete userDefaults;
+ userDefaults = 0;
+}
+
+/*!
+ Query the \a metric value of the scroller properties.
+
+ \sa setScrollMetric(), ScrollMetric
+*/
+QVariant QScrollerProperties::scrollMetric(ScrollMetric metric) const
+{
+ switch (metric) {
+ case MousePressEventDelay: return d->mousePressEventDelay;
+ case DragStartDistance: return d->dragStartDistance;
+ case DragVelocitySmoothingFactor: return d->dragVelocitySmoothingFactor;
+ case AxisLockThreshold: return d->axisLockThreshold;
+ case ScrollingCurve: return d->scrollingCurve;
+ case DecelerationFactor: return d->decelerationFactor;
+ case MinimumVelocity: return d->minimumVelocity;
+ case MaximumVelocity: return d->maximumVelocity;
+ case MaximumClickThroughVelocity: return d->maximumClickThroughVelocity;
+ case AcceleratingFlickMaximumTime: return d->acceleratingFlickMaximumTime;
+ case AcceleratingFlickSpeedupFactor:return d->acceleratingFlickSpeedupFactor;
+ case SnapPositionRatio: return d->snapPositionRatio;
+ case SnapTime: return d->snapTime;
+ case OvershootDragResistanceFactor: return d->overshootDragResistanceFactor;
+ case OvershootDragDistanceFactor: return d->overshootDragDistanceFactor;
+ case OvershootScrollDistanceFactor: return d->overshootScrollDistanceFactor;
+ case OvershootScrollTime: return d->overshootScrollTime;
+ case HorizontalOvershootPolicy: return QVariant::fromValue(d->hOvershootPolicy);
+ case VerticalOvershootPolicy: return QVariant::fromValue(d->vOvershootPolicy);
+ case FrameRate: return QVariant::fromValue(d->frameRate);
+ case ScrollMetricCount: break;
+ }
+ return QVariant();
+}
+
+/*!
+ Set a specific value of the \a metric ScrollerMetric to \a value.
+
+ \sa scrollMetric(), ScrollMetric
+*/
+void QScrollerProperties::setScrollMetric(ScrollMetric metric, const QVariant &value)
+{
+ switch (metric) {
+ case MousePressEventDelay: d->mousePressEventDelay = value.toReal(); break;
+ case DragStartDistance: d->dragStartDistance = value.toReal(); break;
+ case DragVelocitySmoothingFactor: d->dragVelocitySmoothingFactor = qBound(qreal(0), value.toReal(), qreal(1)); break;
+ case AxisLockThreshold: d->axisLockThreshold = qBound(qreal(0), value.toReal(), qreal(1)); break;
+ case ScrollingCurve: d->scrollingCurve = value.toEasingCurve(); break;
+ case DecelerationFactor: d->decelerationFactor = value.toReal(); break;
+ case MinimumVelocity: d->minimumVelocity = value.toReal(); break;
+ case MaximumVelocity: d->maximumVelocity = value.toReal(); break;
+ case MaximumClickThroughVelocity: d->maximumClickThroughVelocity = value.toReal(); break;
+ case AcceleratingFlickMaximumTime: d->acceleratingFlickMaximumTime = value.toReal(); break;
+ case AcceleratingFlickSpeedupFactor:d->acceleratingFlickSpeedupFactor = value.toReal(); break;
+ case SnapPositionRatio: d->snapPositionRatio = qBound(qreal(0), value.toReal(), qreal(1)); break;
+ case SnapTime: d->snapTime = value.toReal(); break;
+ case OvershootDragResistanceFactor: d->overshootDragResistanceFactor = value.toReal(); break;
+ case OvershootDragDistanceFactor: d->overshootDragDistanceFactor = qBound(qreal(0), value.toReal(), qreal(1)); break;
+ case OvershootScrollDistanceFactor: d->overshootScrollDistanceFactor = qBound(qreal(0), value.toReal(), qreal(1)); break;
+ case OvershootScrollTime: d->overshootScrollTime = value.toReal(); break;
+ case HorizontalOvershootPolicy: d->hOvershootPolicy = value.value<QScrollerProperties::OvershootPolicy>(); break;
+ case VerticalOvershootPolicy: d->vOvershootPolicy = value.value<QScrollerProperties::OvershootPolicy>(); break;
+ case FrameRate: d->frameRate = value.value<QScrollerProperties::FrameRates>(); break;
+ case ScrollMetricCount: break;
+ }
+}
+
+/*!
+ \enum QScrollerProperties::FrameRates
+
+ This enum describes the available frame rates used while dragging or scrolling.
+
+ \value Fps60 60 frames per second
+ \value Fps30 30 frames per second
+ \value Fps20 20 frames per second
+ \value Standard the default value is 60 frames per second (which corresponds to QAbstractAnimation).
+*/
+
+/*!
+ \enum QScrollerProperties::OvershootPolicy
+
+ This enum describes the various modes of overshooting.
+
+ \value OvershootWhenScrollable Overshooting is when the content is scrollable. This is the
+ default.
+
+ \value OvershootAlwaysOff Overshooting is never enabled (even when the content is scrollable).
+
+ \value OvershootAlwaysOn Overshooting is always enabled (even when the content is not
+ scrollable).
+*/
+
+/*!
+ \enum QScrollerProperties::ScrollMetric
+
+ This enum contains the different scroll metric types. When not indicated otherwise the
+ setScrollMetric function expects a QVariant of a real value.
+
+ See the QScroller documentation for a further explanation of the concepts behind the different
+ values.
+
+ \value MousePressEventDelay This is the time a mouse press event will be delayed when starting
+ a flick gesture in \c{[s]}. If the gesture is triggered within that time, no mouse press or
+ release will be sent to the scrolled object. If it triggers after that delay the (delayed)
+ mouse press plus a faked release event (at global postion \c{QPoint(-QWIDGETSIZE_MAX,
+ -QWIDGETSIZE_MAX)} will be sent. If the gesture is canceled, then both the (delayed) mouse
+ press plus the real release event will be delivered.
+
+ \value DragStartDistance This is the minimum distance the touch or mouse point needs to be
+ moved before the flick gesture is triggered in \c m.
+
+ \value DragVelocitySmoothingFactor A value that describes how much new drag velocities are
+ included in the final scrolling velocity. This value should be in the range between \c 0 and
+ \c 1. The lower the value, the more smoothing will be applied to the dragging velocity. The
+ default value is \c 0.8.
+
+ \value AxisLockThreshold If greater than zero a scroll movement will be restricted to one axis
+ only if the movement is inside an angle about the axis. The threshold must be in the range \c 0
+ to \c 1.
+
+ \value ScrollingCurve The QEasingCurve used when decelerating the scrolling velocity after an
+ user initiated flick. Please note that this is the easing curve for the positions, \bold{not}
+ the velocity: the default is QEasingCurve::OutQuad, which results is a linear decrease in
+ velocity (1st derivative) and a constant deceleration (2nd derivative).
+
+ \value DecelerationFactor This factor influences how long it takes the scroller to decelerate
+ to 0 velocity. The actual value heavily depends on the chosen ScrollingCurve, but for most
+ types the value should be in the range from \c 0.1 to \c 2.0
+
+ \value MinimumVelocity The minimum velocity that is needed after ending the touch or releasing
+ the mouse to start scrolling in \c{m/s}.
+
+ \value MaximumVelocity This is the maximum velocity that can be reached in \c{m/s}.
+
+ \value MaximumClickThroughVelocity This is the maximum allowed scroll speed for a click-through
+ in \c{m/s}. This means that a click on a currently (slowly) scrolling object will not only stop
+ the scrolling but the click event will also be delivered to the UI control - this is very
+ useful when using exponential-type scrolling curves.
+
+ \value AcceleratingFlickMaximumTime This is the maximum time in \c seconds that a flick gesture
+ can take to be recognized as an accelerating flick. If set to zero no such gesture will be
+ detected. An "accelerating flick" is a flick gesture executed on an already scrolling object.
+ In such cases the scrolling speed is multiplied by AcceleratingFlickSpeedupFactor in order to
+ accelerate it.
+
+ \value AcceleratingFlickSpeedupFactor The current speed will be multiplied by this number if an
+ accelerating flick is detected. Should be \c{> 1}.
+
+ \value SnapPositionRatio This is the distance that the user must drag the area beween two snap
+ points in order to snap it to the next position. e.g. \c{0.33} means that the scroll must only
+ reach one third of the distance between two snap points to snap to the next one. The ratio must
+ be in the range \c 0 to \c 1.
+
+ \value SnapTime This is the time factor for the scrolling curve. A lower value means that the
+ scrolling will take longer. The scrolling distance is independet of this value.
+
+ \value OvershootDragResistanceFactor This value is the factor between the mouse dragging and
+ the actual scroll area movement (during overshoot). The factor must be in the range \c 0 to \c
+ 1.
+
+ \value OvershootDragDistanceFactor This is the maximum distance for overshoot movements while
+ dragging. The actual overshoot distance will be calculated by multiplying this value with the
+ viewport size of the scrolled object. The factor must be in the range \c 0 to \c 1.
+
+ \value OvershootScrollDistanceFactor This is the maximum distance for overshoot movements while
+ scrolling. The actual overshoot distance will be calculated by multiplying this value with the
+ viewport size of the scrolled object. The factor must be in the range \c 0 to \c 1.
+
+ \value OvershootScrollTime This is the time in \c seconds that will be used to play the
+ complete overshoot animation.
+
+ \value HorizontalOvershootPolicy This is the horizontal overshooting policy (see OvershootPolicy).
+
+ \value VerticalOvershootPolicy This is the horizontal overshooting policy (see OvershootPolicy).
+
+ \value FrameRate This is the frame rate which should be used while dragging or scrolling.
+ QScroller uses a QAbstractAnimation timer internally to sync all scrolling operations to other
+ animations that might be active at the same time. If the Standard value of 60 frames per
+ second is too fast for your use case, you can lower the frames per second with this setting
+ (while still being in-sync with QAbstractAnimation). Please note that only the values of the
+ FrameRates enum are allowed here.
+
+ \value ScrollMetricCount This is just used when enumerating the metrics. It is always the last
+ entry.
+*/
+
+QT_END_NAMESPACE
diff --git a/src/gui/util/qscrollerproperties.h b/src/gui/util/qscrollerproperties.h
new file mode 100644
index 0000000..e292d8d
--- /dev/null
+++ b/src/gui/util/qscrollerproperties.h
@@ -0,0 +1,140 @@
+/****************************************************************************
+**
+** 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 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 QSCROLLERPROPERTIES_H
+#define QSCROLLERPROPERTIES_H
+
+#include <QtCore/QScopedPointer>
+#include <QtCore/QMetaType>
+#include <QtCore/QVariant>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Gui)
+
+class QScroller;
+class QScrollerPrivate;
+class QScrollerPropertiesPrivate;
+
+class Q_GUI_EXPORT QScrollerProperties
+{
+public:
+ QScrollerProperties();
+ QScrollerProperties(const QScrollerProperties &sp);
+ QScrollerProperties &operator=(const QScrollerProperties &sp);
+ virtual ~QScrollerProperties();
+
+ bool operator==(const QScrollerProperties &sp) const;
+ bool operator!=(const QScrollerProperties &sp) const;
+
+ static void setDefaultScrollerProperties(const QScrollerProperties &sp);
+ static void unsetDefaultScrollerProperties();
+
+ enum OvershootPolicy
+ {
+ OvershootWhenScrollable,
+ OvershootAlwaysOff,
+ OvershootAlwaysOn
+ };
+
+ enum FrameRates {
+ Standard,
+ Fps60,
+ Fps30,
+ Fps20
+ };
+
+ enum ScrollMetric
+ {
+ MousePressEventDelay, // qreal [s]
+ DragStartDistance, // qreal [m]
+ DragVelocitySmoothingFactor, // qreal [0..1/s] (complex calculation involving time) v = v_new* DASF + v_old * (1-DASF)
+ AxisLockThreshold, // qreal [0..1] atan(|min(dx,dy)|/|max(dx,dy)|)
+
+ ScrollingCurve, // QEasingCurve
+ DecelerationFactor, // slope of the curve
+
+ MinimumVelocity, // qreal [m/s]
+ MaximumVelocity, // qreal [m/s]
+ MaximumClickThroughVelocity, // qreal [m/s]
+
+ AcceleratingFlickMaximumTime, // qreal [s]
+ AcceleratingFlickSpeedupFactor, // qreal [1..]
+
+ SnapPositionRatio, // qreal [0..1]
+ SnapTime, // qreal [s]
+
+ OvershootDragResistanceFactor, // qreal [0..1]
+ OvershootDragDistanceFactor, // qreal [0..1]
+ OvershootScrollDistanceFactor, // qreal [0..1]
+ OvershootScrollTime, // qreal [s]
+
+ HorizontalOvershootPolicy, // enum OvershootPolicy
+ VerticalOvershootPolicy, // enum OvershootPolicy
+ FrameRate, // enum FrameRates
+
+ ScrollMetricCount
+ };
+
+ QVariant scrollMetric(ScrollMetric metric) const;
+ void setScrollMetric(ScrollMetric metric, const QVariant &value);
+
+protected:
+ QScopedPointer<QScrollerPropertiesPrivate> d;
+
+private:
+ QScrollerProperties(QScrollerPropertiesPrivate &dd);
+
+ friend class QScrollerPropertiesPrivate;
+ friend class QScroller;
+ friend class QScrollerPrivate;
+};
+
+QT_END_NAMESPACE
+
+Q_DECLARE_METATYPE(QScrollerProperties::OvershootPolicy)
+Q_DECLARE_METATYPE(QScrollerProperties::FrameRates)
+
+QT_END_HEADER
+
+#endif // QSCROLLERPROPERTIES_H
diff --git a/src/gui/util/qscrollerproperties_p.h b/src/gui/util/qscrollerproperties_p.h
new file mode 100644
index 0000000..093f615
--- /dev/null
+++ b/src/gui/util/qscrollerproperties_p.h
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** 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 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 QSCROLLERPROPERTIES_P_H
+#define QSCROLLERPROPERTIES_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 <QPointF>
+#include <QEasingCurve>
+#include <qscrollerproperties.h>
+
+QT_BEGIN_NAMESPACE
+
+class QScrollerPropertiesPrivate
+{
+public:
+ static QScrollerPropertiesPrivate *defaults();
+
+ bool operator==(const QScrollerPropertiesPrivate &) const;
+
+ qreal mousePressEventDelay;
+ qreal dragStartDistance;
+ qreal dragVelocitySmoothingFactor;
+ qreal axisLockThreshold;
+ QEasingCurve scrollingCurve;
+ qreal decelerationFactor;
+ qreal minimumVelocity;
+ qreal maximumVelocity;
+ qreal maximumClickThroughVelocity;
+ qreal acceleratingFlickMaximumTime;
+ qreal acceleratingFlickSpeedupFactor;
+ qreal snapPositionRatio;
+ qreal snapTime;
+ qreal overshootDragResistanceFactor;
+ qreal overshootDragDistanceFactor;
+ qreal overshootScrollDistanceFactor;
+ qreal overshootScrollTime;
+ QScrollerProperties::OvershootPolicy hOvershootPolicy;
+ QScrollerProperties::OvershootPolicy vOvershootPolicy;
+ QScrollerProperties::FrameRates frameRate;
+};
+
+QT_END_NAMESPACE
+
+#endif // QSCROLLERPROPERTIES_P_H
+
diff --git a/src/gui/util/util.pri b/src/gui/util/util.pri
index f125f82..2814a2d 100644
--- a/src/gui/util/util.pri
+++ b/src/gui/util/util.pri
@@ -6,6 +6,11 @@ HEADERS += \
util/qcompleter_p.h \
util/qdesktopservices.h \
util/qsystemtrayicon_p.h \
+ util/qscroller.h \
+ util/qscroller_p.h \
+ util/qscrollerproperties.h \
+ util/qscrollerproperties_p.h \
+ util/qflickgesture_p.h \
util/qundogroup.h \
util/qundostack.h \
util/qundostack_p.h \
@@ -15,6 +20,9 @@ SOURCES += \
util/qsystemtrayicon.cpp \
util/qcompleter.cpp \
util/qdesktopservices.cpp \
+ util/qscroller.cpp \
+ util/qscrollerproperties.cpp \
+ util/qflickgesture.cpp \
util/qundogroup.cpp \
util/qundostack.cpp \
util/qundoview.cpp
@@ -57,3 +65,7 @@ symbian {
DEFINES += USE_SCHEMEHANDLER
}
}
+
+macx {
+ OBJECTIVE_SOURCES += util/qscroller_mac.mm
+}
diff --git a/src/gui/widgets/qabstractscrollarea.cpp b/src/gui/widgets/qabstractscrollarea.cpp
index 30ce23b..030f544 100644
--- a/src/gui/widgets/qabstractscrollarea.cpp
+++ b/src/gui/widgets/qabstractscrollarea.cpp
@@ -53,6 +53,8 @@
#include "qpainter.h"
#include "qmargins.h"
+#include <QDebug>
+
#include "qabstractscrollarea_p.h"
#include <qwidget.h>
@@ -62,6 +64,10 @@
#include <private/qt_mac_p.h>
#include <private/qt_cocoa_helpers_mac_p.h>
#endif
+#ifdef Q_WS_WIN
+# include <qlibrary.h>
+# include <windows.h>
+#endif
QT_BEGIN_NAMESPACE
@@ -295,9 +301,14 @@ void QAbstractScrollAreaPrivate::init()
q->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
layoutChildren();
#ifndef Q_WS_MAC
-#ifndef QT_NO_GESTURES
+# ifndef QT_NO_GESTURES
viewport->grabGesture(Qt::PanGesture);
+# endif
#endif
+#ifdef Q_WS_MAEMO_5
+# ifndef QT_NO_GESTURES
+ // viewport->grabGesture(Qt::TouchFlickGesture);
+# endif
#endif
}
@@ -552,6 +563,11 @@ void QAbstractScrollArea::setViewport(QWidget *widget)
d->viewport->grabGesture(Qt::PanGesture);
#endif
#endif
+#ifdef Q_WS_MAEMO_5
+#ifndef QT_NO_GESTURES
+// d->viewport->grabGesture(Qt::TouchFlickGesture);
+#endif
+#endif
d->layoutChildren();
if (isVisible())
d->viewport->show();
@@ -986,6 +1002,66 @@ bool QAbstractScrollArea::event(QEvent *e)
return false;
}
#endif // QT_NO_GESTURES
+ case QEvent::ScrollPrepare:
+ {
+ QScrollPrepareEvent *se = static_cast<QScrollPrepareEvent *>(e);
+ if (d->canStartScrollingAt(se->startPos().toPoint())) {
+ QScrollBar *hBar = horizontalScrollBar();
+ QScrollBar *vBar = verticalScrollBar();
+
+ se->setViewportSize(QSizeF(viewport()->size()));
+ se->setContentPosRange(QRectF(0, 0, hBar->maximum(), vBar->maximum()));
+ se->setContentPos(QPointF(hBar->value(), vBar->value()));
+ se->accept();
+ return true;
+ }
+ return false;
+ }
+ case QEvent::Scroll:
+ {
+ QScrollEvent *se = static_cast<QScrollEvent *>(e);
+
+ QScrollBar *hBar = horizontalScrollBar();
+ QScrollBar *vBar = verticalScrollBar();
+ hBar->setValue(se->contentPos().x());
+ vBar->setValue(se->contentPos().y());
+
+#ifdef Q_WS_WIN
+ typedef BOOL (*PtrBeginPanningFeedback)(HWND);
+ typedef BOOL (*PtrUpdatePanningFeedback)(HWND, LONG, LONG, BOOL);
+ typedef BOOL (*PtrEndPanningFeedback)(HWND, BOOL);
+
+ static PtrBeginPanningFeedback ptrBeginPanningFeedback = 0;
+ static PtrUpdatePanningFeedback ptrUpdatePanningFeedback = 0;
+ static PtrEndPanningFeedback ptrEndPanningFeedback = 0;
+
+ if (!ptrBeginPanningFeedback)
+ ptrBeginPanningFeedback = (PtrBeginPanningFeedback) QLibrary::resolve(QLatin1String("UxTheme"), "BeginPanningFeedback");
+ if (!ptrUpdatePanningFeedback)
+ ptrUpdatePanningFeedback = (PtrUpdatePanningFeedback) QLibrary::resolve(QLatin1String("UxTheme"), "UpdatePanningFeedback");
+ if (!ptrEndPanningFeedback)
+ ptrEndPanningFeedback = (PtrEndPanningFeedback) QLibrary::resolve(QLatin1String("UxTheme"), "EndPanningFeedback");
+
+ if (ptrBeginPanningFeedback && ptrUpdatePanningFeedback && ptrEndPanningFeedback) {
+ WId wid = window()->winId();
+
+ if (!se->overshootDistance().isNull() && d->overshoot.isNull())
+ ptrBeginPanningFeedback(wid);
+ if (!se->overshootDistance().isNull())
+ ptrUpdatePanningFeedback(wid, -se->overshootDistance().x(), -se->overshootDistance().y(), false);
+ if (se->overshootDistance().isNull() && !d->overshoot.isNull())
+ ptrEndPanningFeedback(wid, true);
+ } else
+#endif
+ {
+ QPoint delta = d->overshoot - se->overshootDistance().toPoint();
+ if (!delta.isNull())
+ viewport()->move(viewport()->pos() + delta);
+ }
+ d->overshoot = se->overshootDistance().toPoint();
+
+ return true;
+ }
case QEvent::StyleChange:
case QEvent::LayoutDirectionChange:
case QEvent::ApplicationLayoutDirectionChange:
@@ -1047,6 +1123,9 @@ bool QAbstractScrollArea::viewportEvent(QEvent *e)
case QEvent::GestureOverride:
return event(e);
#endif
+ case QEvent::ScrollPrepare:
+ case QEvent::Scroll:
+ return event(e);
default:
break;
}
@@ -1303,6 +1382,30 @@ void QAbstractScrollArea::scrollContentsBy(int, int)
viewport()->update();
}
+bool QAbstractScrollAreaPrivate::canStartScrollingAt( const QPoint &startPos )
+{
+ Q_Q(QAbstractScrollArea);
+
+ // don't start scrolling when a drag mode has been set.
+ // don't start scrolling on a movable item.
+ if (QGraphicsView *view = qobject_cast<QGraphicsView *>(q)) {
+ if (view->dragMode() != QGraphicsView::NoDrag)
+ return false;
+
+ QGraphicsItem *childItem = view->itemAt(startPos);
+
+ if (childItem && (childItem->flags() & QGraphicsItem::ItemIsMovable))
+ return false;
+ }
+
+ // don't start scrolling on a QAbstractSlider
+ if (qobject_cast<QAbstractSlider *>(q->viewport()->childAt(startPos))) {
+ return false;
+ }
+
+ return true;
+}
+
void QAbstractScrollAreaPrivate::_q_hslide(int x)
{
Q_Q(QAbstractScrollArea);
diff --git a/src/gui/widgets/qabstractscrollarea_p.h b/src/gui/widgets/qabstractscrollarea_p.h
index 9a0d66f..8dbb3e4 100644
--- a/src/gui/widgets/qabstractscrollarea_p.h
+++ b/src/gui/widgets/qabstractscrollarea_p.h
@@ -84,11 +84,13 @@ public:
int left, top, right, bottom; // viewport margin
int xoffset, yoffset;
+ QPoint overshoot;
void init();
void layoutChildren();
// ### Fix for 4.4, talk to Bjoern E or Girish.
virtual void scrollBarPolicyChanged(Qt::Orientation, Qt::ScrollBarPolicy) {}
+ bool canStartScrollingAt( const QPoint &startPos );
void _q_hslide(int);
void _q_vslide(int);
diff --git a/src/gui/widgets/qcombobox.cpp b/src/gui/widgets/qcombobox.cpp
index ced0d73f..36e9ef7 100644
--- a/src/gui/widgets/qcombobox.cpp
+++ b/src/gui/widgets/qcombobox.cpp
@@ -399,7 +399,7 @@ void QComboBoxPrivateContainer::leaveEvent(QEvent *)
#ifdef Q_WS_MAC
QStyleOptionComboBox opt = comboStyleOption();
if (combo->style()->styleHint(QStyle::SH_ComboBox_Popup, &opt, combo))
- view->clearSelection();
+ view->setCurrentIndex(QModelIndex());
#endif
}
diff --git a/src/gui/widgets/qdockwidget.cpp b/src/gui/widgets/qdockwidget.cpp
index df9b171..0a6269d 100644
--- a/src/gui/widgets/qdockwidget.cpp
+++ b/src/gui/widgets/qdockwidget.cpp
@@ -1531,8 +1531,11 @@ QAction * QDockWidget::toggleViewAction() const
/*!
\since 4.3
+
Sets an arbitrary \a widget as the dock widget's title bar. If \a widget
- is 0, the title bar widget is removed, but not deleted.
+ is 0, any custom title bar widget previously set on the dock widget is
+ removed, but not deleted, and the default title bar will be used
+ instead.
If a title bar widget is set, QDockWidget will not use native window
decorations when it is floated.
@@ -1540,23 +1543,27 @@ QAction * QDockWidget::toggleViewAction() const
Here are some tips for implementing custom title bars:
\list
- \i Mouse events that are not explicitly handled by the title bar widget
+ \o Mouse events that are not explicitly handled by the title bar widget
must be ignored by calling QMouseEvent::ignore(). These events then
propagate to the QDockWidget parent, which handles them in the usual
manner, moving when the title bar is dragged, docking and undocking
when it is double-clicked, etc.
- \i When DockWidgetVerticalTitleBar is set on QDockWidget, the title
+ \o When DockWidgetVerticalTitleBar is set on QDockWidget, the title
bar widget is repositioned accordingly. In resizeEvent(), the title
bar should check what orientation it should assume:
\snippet doc/src/snippets/code/src_gui_widgets_qdockwidget.cpp 0
- \i The title bar widget must have a valid QWidget::sizeHint() and
+ \o The title bar widget must have a valid QWidget::sizeHint() and
QWidget::minimumSizeHint(). These functions should take into account
the current orientation of the title bar.
+
+ \o It is not possible to remove a title bar from a dock widget. However,
+ a similar effect can be achieved by setting a default constructed
+ QWidget as the title bar widget.
\endlist
- Using qobject_cast as shown above, the title bar widget has full access
+ Using qobject_cast() as shown above, the title bar widget has full access
to its parent QDockWidget. Hence it can perform such operations as docking
and hiding in response to user actions.
diff --git a/src/gui/widgets/qlabel.cpp b/src/gui/widgets/qlabel.cpp
index 15e2ff3..386a95d 100644
--- a/src/gui/widgets/qlabel.cpp
+++ b/src/gui/widgets/qlabel.cpp
@@ -682,7 +682,7 @@ QSize QLabelPrivate::sizeForWidth(int w) const
bool tryWidth = (w < 0) && (align & Qt::TextWordWrap);
if (tryWidth)
- w = fm.averageCharWidth() * 80;
+ w = qMin(fm.averageCharWidth() * 80, q->maximumSize().width());
else if (w < 0)
w = 2000;
w -= (hextra + contentsMargin.width());
diff --git a/src/gui/widgets/qlinecontrol.cpp b/src/gui/widgets/qlinecontrol.cpp
index a283da6..9b25ef9 100644
--- a/src/gui/widgets/qlinecontrol.cpp
+++ b/src/gui/widgets/qlinecontrol.cpp
@@ -1308,6 +1308,15 @@ void QLineControl::setCursorBlinkPeriod(int msec)
m_blinkPeriod = msec;
}
+void QLineControl::resetCursorBlinkTimer()
+{
+ if (m_blinkPeriod == 0 || m_blinkTimer == 0)
+ return;
+ killTimer(m_blinkTimer);
+ m_blinkTimer = startTimer(m_blinkPeriod / 2);
+ m_blinkStatus = 1;
+}
+
void QLineControl::timerEvent(QTimerEvent *event)
{
if (event->timerId() == m_blinkTimer) {
diff --git a/src/gui/widgets/qlinecontrol_p.h b/src/gui/widgets/qlinecontrol_p.h
index 7068f62..d881acf 100644
--- a/src/gui/widgets/qlinecontrol_p.h
+++ b/src/gui/widgets/qlinecontrol_p.h
@@ -296,6 +296,7 @@ public:
int cursorBlinkPeriod() const { return m_blinkPeriod; }
void setCursorBlinkPeriod(int msec);
+ void resetCursorBlinkTimer();
QString cancelText() const { return m_cancelText; }
void setCancelText(const QString &text) { m_cancelText = text; }
diff --git a/src/gui/widgets/qmenu.cpp b/src/gui/widgets/qmenu.cpp
index 245657a..0a95d04 100644
--- a/src/gui/widgets/qmenu.cpp
+++ b/src/gui/widgets/qmenu.cpp
@@ -1320,6 +1320,9 @@ void QMenu::initStyleOption(QStyleOptionMenuItem *option, const QAction *action)
Conversely, actions can be added to widgets with the addAction(),
addActions() and insertAction() functions.
+ \warning To make QMenu visible on the screen, exec() or popup() should be
+ used instead of show().
+
\section1 QMenu on Qt for Windows CE
If a menu is integrated into the native menubar on Windows Mobile we
@@ -1795,10 +1798,12 @@ QSize QMenu::sizeHint() const
void QMenu::popup(const QPoint &p, QAction *atAction)
{
Q_D(QMenu);
+#ifndef Q_OS_SYMBIAN
if (d->scroll) { // reset scroll state from last popup
d->scroll->scrollOffset = 0;
d->scroll->scrollFlags = QMenuPrivate::QMenuScroller::ScrollNone;
}
+#endif
d->tearoffHighlighted = 0;
d->motions = 0;
d->doChildEffects = true;
diff --git a/src/gui/widgets/qvalidator.h b/src/gui/widgets/qvalidator.h
index 63734ca..013387d 100644
--- a/src/gui/widgets/qvalidator.h
+++ b/src/gui/widgets/qvalidator.h
@@ -101,7 +101,7 @@ class Q_GUI_EXPORT QIntValidator : public QValidator
public:
explicit QIntValidator(QObject * parent = 0);
- QIntValidator(int bottom, int top, QObject * parent);
+ QIntValidator(int bottom, int top, QObject *parent = 0);
~QIntValidator();
QValidator::State validate(QString &, int &) const;
@@ -142,7 +142,7 @@ class Q_GUI_EXPORT QDoubleValidator : public QValidator
public:
explicit QDoubleValidator(QObject * parent = 0);
- QDoubleValidator(double bottom, double top, int decimals, QObject * parent);
+ QDoubleValidator(double bottom, double top, int decimals, QObject *parent = 0);
~QDoubleValidator();
enum Notation {
@@ -186,7 +186,7 @@ class Q_GUI_EXPORT QRegExpValidator : public QValidator
public:
explicit QRegExpValidator(QObject *parent = 0);
- QRegExpValidator(const QRegExp& rx, QObject *parent);
+ QRegExpValidator(const QRegExp& rx, QObject *parent = 0);
~QRegExpValidator();
virtual QValidator::State validate(QString& input, int& pos) const;
diff --git a/src/imports/folderlistmodel/qdeclarativefolderlistmodel.cpp b/src/imports/folderlistmodel/qdeclarativefolderlistmodel.cpp
index abab33c..7b05bc5 100644
--- a/src/imports/folderlistmodel/qdeclarativefolderlistmodel.cpp
+++ b/src/imports/folderlistmodel/qdeclarativefolderlistmodel.cpp
@@ -190,6 +190,12 @@ QVariant QDeclarativeFolderListModel::data(const QModelIndex &index, int role) c
return rv;
}
+/*!
+ \qmlproperty int FolderListModel::count
+
+ Returns the number of items in the current folder that match the
+ filter criteria.
+*/
int QDeclarativeFolderListModel::rowCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
@@ -225,6 +231,11 @@ void QDeclarativeFolderListModel::setFolder(const QUrl &folder)
}
}
+/*!
+ \qmlproperty url FolderListModel::parentFolder
+
+ Returns the URL of the parent of of the current \l folder.
+*/
QUrl QDeclarativeFolderListModel::parentFolder() const
{
QString localFile = d->folder.toLocalFile();
@@ -279,13 +290,28 @@ void QDeclarativeFolderListModel::classBegin()
void QDeclarativeFolderListModel::componentComplete()
{
- if (!d->folder.isValid() || !QDir().exists(d->folder.toLocalFile()))
+ if (!d->folder.isValid() || d->folder.toLocalFile().isEmpty() || !QDir().exists(d->folder.toLocalFile()))
setFolder(QUrl(QLatin1String("file://")+QDir::currentPath()));
if (!d->folderIndex.isValid())
QMetaObject::invokeMethod(this, "refresh", Qt::QueuedConnection);
}
+/*!
+ \qmlproperty enumeration FolderListModel::sortField
+
+ The \a sortField property contains field to use for sorting. sortField
+ may be one of:
+ \list
+ \o Unsorted - no sorting is applied. The order is system default.
+ \o Name - sort by filename
+ \o Time - sort by time modified
+ \o Size - sort by file size
+ \o Type - sort by file type (extension)
+ \endlist
+
+ \sa sortReversed
+*/
QDeclarativeFolderListModel::SortField QDeclarativeFolderListModel::sortField() const
{
return d->sortField;
@@ -299,6 +325,13 @@ void QDeclarativeFolderListModel::setSortField(SortField field)
}
}
+/*!
+ \qmlproperty bool FolderListModel::sortReversed
+
+ If set to true, reverses the sort order. The default is false.
+
+ \sa sortField
+*/
bool QDeclarativeFolderListModel::sortReversed() const
{
return d->sortReversed;
diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp
index a1c7cf1..1d38690 100644
--- a/src/network/access/qhttpnetworkconnection.cpp
+++ b/src/network/access/qhttpnetworkconnection.cpp
@@ -855,12 +855,17 @@ QHttpNetworkReply* QHttpNetworkConnection::sendRequest(const QHttpNetworkRequest
return d->queueRequest(request);
}
-bool QHttpNetworkConnection::isEncrypted() const
+bool QHttpNetworkConnection::isSsl() const
{
Q_D(const QHttpNetworkConnection);
return d->encrypt;
}
+QHttpNetworkConnectionChannel *QHttpNetworkConnection::channels() const
+{
+ return d_func()->channels;
+}
+
#ifndef QT_NO_NETWORKPROXY
void QHttpNetworkConnection::setCacheProxy(const QNetworkProxy &networkProxy)
{
diff --git a/src/network/access/qhttpnetworkconnection_p.h b/src/network/access/qhttpnetworkconnection_p.h
index 8461426c..9f23cbf 100644
--- a/src/network/access/qhttpnetworkconnection_p.h
+++ b/src/network/access/qhttpnetworkconnection_p.h
@@ -108,7 +108,9 @@ public:
QNetworkProxy transparentProxy() const;
#endif
- bool isEncrypted() const;
+ bool isSsl() const;
+
+ QHttpNetworkConnectionChannel *channels() const;
#ifndef QT_NO_OPENSSL
void setSslConfiguration(const QSslConfiguration &config);
diff --git a/src/network/access/qhttpnetworkconnectionchannel.cpp b/src/network/access/qhttpnetworkconnectionchannel.cpp
index fe5946a..dc0109d 100644
--- a/src/network/access/qhttpnetworkconnectionchannel.cpp
+++ b/src/network/access/qhttpnetworkconnectionchannel.cpp
@@ -179,7 +179,6 @@ bool QHttpNetworkConnectionChannel::sendRequest()
replyPrivate->autoDecompress = request.d->autoDecompress;
replyPrivate->pipeliningUsed = false;
- pendingEncrypt = false;
// if the url contains authentication parameters, use the new ones
// both channels will use the new authentication parameters
if (!request.url().userInfo().isEmpty() && request.withCredentials()) {
@@ -1047,6 +1046,7 @@ void QHttpNetworkConnectionChannel::_q_encrypted()
if (!socket)
return; // ### error
state = QHttpNetworkConnectionChannel::IdleState;
+ pendingEncrypt = false;
sendRequest();
}
diff --git a/src/network/access/qhttpnetworkconnectionchannel_p.h b/src/network/access/qhttpnetworkconnectionchannel_p.h
index 07bb4a6..968dbd8 100644
--- a/src/network/access/qhttpnetworkconnectionchannel_p.h
+++ b/src/network/access/qhttpnetworkconnectionchannel_p.h
@@ -157,6 +157,8 @@ public:
bool isSocketWaiting() const;
bool isSocketReading() const;
+ friend class QNetworkAccessHttpBackend;
+
protected slots:
void _q_receiveReply();
void _q_bytesWritten(qint64 bytes); // proceed sending
diff --git a/src/network/access/qhttpnetworkreply.cpp b/src/network/access/qhttpnetworkreply.cpp
index 3e98dcc..f57830d 100644
--- a/src/network/access/qhttpnetworkreply.cpp
+++ b/src/network/access/qhttpnetworkreply.cpp
@@ -189,6 +189,12 @@ QByteArray QHttpNetworkReply::readAny()
return d->responseData.read();
}
+QByteArray QHttpNetworkReply::readAll()
+{
+ Q_D(QHttpNetworkReply);
+ return d->responseData.readAll();
+}
+
void QHttpNetworkReply::setDownstreamLimited(bool dsl)
{
Q_D(QHttpNetworkReply);
diff --git a/src/network/access/qhttpnetworkreply_p.h b/src/network/access/qhttpnetworkreply_p.h
index 65d1887..555e5ab 100644
--- a/src/network/access/qhttpnetworkreply_p.h
+++ b/src/network/access/qhttpnetworkreply_p.h
@@ -126,6 +126,7 @@ public:
qint64 bytesAvailable() const;
qint64 bytesAvailableNextBlock() const;
QByteArray readAny();
+ QByteArray readAll();
void setDownstreamLimited(bool t);
bool supportsUserProvidedDownloadBuffer();
diff --git a/src/network/access/qnetworkaccessbackend.cpp b/src/network/access/qnetworkaccessbackend.cpp
index d4ecf43..d5fb753 100644
--- a/src/network/access/qnetworkaccessbackend.cpp
+++ b/src/network/access/qnetworkaccessbackend.cpp
@@ -142,6 +142,7 @@ void QNetworkAccessBackend::emitReplyUploadProgress(qint64 bytesSent, qint64 byt
QNetworkAccessBackend::QNetworkAccessBackend()
: manager(0)
, reply(0)
+ , synchronous(false)
{
}
diff --git a/src/network/access/qnetworkaccessbackend_p.h b/src/network/access/qnetworkaccessbackend_p.h
index b9a832e..9ecc3ee 100644
--- a/src/network/access/qnetworkaccessbackend_p.h
+++ b/src/network/access/qnetworkaccessbackend_p.h
@@ -157,6 +157,9 @@ public:
QVariant attribute(QNetworkRequest::Attribute code) const;
void setAttribute(QNetworkRequest::Attribute code, const QVariant &value);
+ bool isSynchronous() { return synchronous; }
+ void setSynchronous(bool sync) { synchronous = sync; }
+
// return true if the QNonContiguousByteDevice of the upload
// data needs to support reset(). Currently needed for HTTP.
// This will possibly enable buffering of the upload data.
@@ -166,6 +169,8 @@ public:
virtual bool canResume() const { return false; }
virtual void setResumeOffset(quint64 offset) { Q_UNUSED(offset); }
+ virtual bool processRequestSynchronously() { return false; }
+
protected:
// Create the device used for reading the upload data
QNonContiguousByteDevice* createUploadByteDevice();
@@ -204,6 +209,7 @@ private:
friend class QNetworkReplyImplPrivate;
QNetworkAccessManagerPrivate *manager;
QNetworkReplyImplPrivate *reply;
+ bool synchronous;
};
class QNetworkAccessBackendFactory
diff --git a/src/network/access/qnetworkaccessdatabackend_p.h b/src/network/access/qnetworkaccessdatabackend_p.h
index a7c63d5..0e5a494 100644
--- a/src/network/access/qnetworkaccessdatabackend_p.h
+++ b/src/network/access/qnetworkaccessdatabackend_p.h
@@ -68,6 +68,8 @@ public:
virtual void closeUpstreamChannel();
virtual bool waitForDownstreamReadyRead(int msecs);
virtual bool waitForUpstreamBytesWritten(int msecs);
+
+ virtual bool processRequestSynchronously();
};
class QNetworkAccessDataBackendFactory: public QNetworkAccessBackendFactory
diff --git a/src/network/access/qnetworkaccesshttpbackend.cpp b/src/network/access/qnetworkaccesshttpbackend.cpp
index 3c41d85..ab2fd96 100644
--- a/src/network/access/qnetworkaccesshttpbackend.cpp
+++ b/src/network/access/qnetworkaccesshttpbackend.cpp
@@ -50,6 +50,7 @@
#include "qnetworkrequest_p.h"
#include "qnetworkcookie_p.h"
#include "QtCore/qdatetime.h"
+#include "QtCore/qelapsedtimer.h"
#include "QtNetwork/qsslconfiguration.h"
#ifndef QT_NO_HTTP
@@ -318,7 +319,10 @@ void QNetworkAccessHttpBackend::disconnectFromHttp()
// Get the object cache that stores our QHttpNetworkConnection objects
QNetworkAccessCache *cache = QNetworkAccessManagerPrivate::getObjectCache(this);
- cache->releaseEntry(cacheKey);
+
+ // synchronous calls are not put into the cache, so for them the key is empty
+ if (!cacheKey.isEmpty())
+ cache->releaseEntry(cacheKey);
}
// This is abut disconnecting signals, not about disconnecting TCP connections
@@ -643,34 +647,49 @@ void QNetworkAccessHttpBackend::open()
if (transparentProxy.type() == QNetworkProxy::DefaultProxy &&
cacheProxy.type() == QNetworkProxy::DefaultProxy) {
// unsuitable proxies
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNetworkReply::NetworkError, QNetworkReply::ProxyNotFoundError),
- Q_ARG(QString, tr("No suitable proxy found")));
- QMetaObject::invokeMethod(this, "finished", Qt::QueuedConnection);
- return;
+ if (isSynchronous()) {
+ error(QNetworkReply::ProxyNotFoundError, tr("No suitable proxy found"));
+ finished();
+ } else {
+ QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
+ Q_ARG(QNetworkReply::NetworkError, QNetworkReply::ProxyNotFoundError),
+ Q_ARG(QString, tr("No suitable proxy found")));
+ QMetaObject::invokeMethod(this, "finished", Qt::QueuedConnection);
+ }
+ return;
}
#endif
- // check if we have an open connection to this host
- cacheKey = makeCacheKey(this, theProxy);
- QNetworkAccessCache *cache = QNetworkAccessManagerPrivate::getObjectCache(this);
- // the http object is actually a QHttpNetworkConnection
- http = static_cast<QNetworkAccessCachedHttpConnection *>(cache->requestEntryNow(cacheKey));
- if (http == 0) {
- // no entry in cache; create an object
- // the http object is actually a QHttpNetworkConnection
- http = new QNetworkAccessCachedHttpConnection(url.host(), url.port(), encrypt);
-
+ if (isSynchronous()) {
+ // for synchronous requests, we just create a new connection
+ http = new QHttpNetworkConnection(1, url.host(), url.port(), encrypt, this);
#ifndef QT_NO_NETWORKPROXY
http->setTransparentProxy(transparentProxy);
http->setCacheProxy(cacheProxy);
#endif
+ postRequest();
+ processRequestSynchronously();
+ } else {
+ // check if we have an open connection to this host
+ cacheKey = makeCacheKey(this, theProxy);
+ QNetworkAccessCache *cache = QNetworkAccessManagerPrivate::getObjectCache(this);
+ // the http object is actually a QHttpNetworkConnection
+ http = static_cast<QNetworkAccessCachedHttpConnection *>(cache->requestEntryNow(cacheKey));
+ if (http == 0) {
+ // no entry in cache; create an object
+ // the http object is actually a QHttpNetworkConnection
+ http = new QNetworkAccessCachedHttpConnection(url.host(), url.port(), encrypt);
- // cache the QHttpNetworkConnection corresponding to this cache key
- cache->addEntry(cacheKey, http);
- }
+#ifndef QT_NO_NETWORKPROXY
+ http->setTransparentProxy(transparentProxy);
+ http->setCacheProxy(cacheProxy);
+#endif
- postRequest();
+ // cache the QHttpNetworkConnection corresponding to this cache key
+ cache->addEntry(cacheKey, static_cast<QNetworkAccessCachedHttpConnection *>(http.data()));
+ }
+ postRequest();
+ }
}
void QNetworkAccessHttpBackend::closeDownstreamChannel()
@@ -1158,6 +1177,87 @@ void QNetworkAccessHttpBackend::setResumeOffset(quint64 offset)
resumeOffset = offset;
}
+bool QNetworkAccessHttpBackend::processRequestSynchronously()
+{
+ QHttpNetworkConnectionChannel *channel = &http->channels()[0];
+
+ // Disconnect all socket signals. They will only confuse us when using waitFor*
+ QObject::disconnect(channel->socket, 0, 0, 0);
+
+ qint64 timeout = 20*1000; // 20 sec
+ QElapsedTimer timeoutTimer;
+
+ bool waitResult = channel->socket->waitForConnected(timeout);
+ timeoutTimer.start();
+
+ if (!waitResult || channel->socket->state() != QAbstractSocket::ConnectedState) {
+ error(QNetworkReply::UnknownNetworkError, QLatin1String("could not connect"));
+ return false;
+ }
+ channel->_q_connected(); // this will send the request (via sendRequest())
+
+#ifndef QT_NO_OPENSSL
+ if (http->isSsl()) {
+ qint64 remainingTimeEncrypted = timeout - timeoutTimer.elapsed();
+ if (!static_cast<QSslSocket *>(channel->socket)->waitForEncrypted(remainingTimeEncrypted)) {
+ error(QNetworkReply::SslHandshakeFailedError,
+ QLatin1String("could not encrypt or timeout while encrypting"));
+ return false;
+ }
+ channel->_q_encrypted();
+ }
+#endif
+
+ // if we get a 401 or 407, we might need to send the request twice, see below
+ bool authenticating = false;
+
+ do {
+ channel->sendRequest();
+
+ qint64 remainingTimeBytesWritten;
+ while(channel->socket->bytesToWrite() > 0 ||
+ channel->state == QHttpNetworkConnectionChannel::WritingState) {
+ remainingTimeBytesWritten = timeout - timeoutTimer.elapsed();
+ channel->sendRequest(); // triggers channel->socket->write()
+ if (!channel->socket->waitForBytesWritten(remainingTimeBytesWritten)) {
+ error(QNetworkReply::TimeoutError,
+ QLatin1String("could not write bytes to socket or timeout while writing"));
+ return false;
+ }
+ }
+
+ qint64 remainingTimeBytesRead = timeout - timeoutTimer.elapsed();
+ // Loop for at most remainingTime until either the socket disconnects
+ // or the reply is finished
+ do {
+ waitResult = channel->socket->waitForReadyRead(remainingTimeBytesRead);
+ remainingTimeBytesRead = timeout - timeoutTimer.elapsed();
+ if (!waitResult || remainingTimeBytesRead <= 0
+ || channel->socket->state() != QAbstractSocket::ConnectedState) {
+ error(QNetworkReply::TimeoutError,
+ QLatin1String("could not read from socket or timeout while reading"));
+ return false;
+ }
+
+ if (channel->socket->bytesAvailable())
+ channel->_q_readyRead();
+
+ if (!httpReply)
+ return false; // we got a 401 or 407 and cannot handle it (it might happen that
+ // disconnectFromHttp() was called, in that case the reply is zero)
+ // ### I am quite sure this does not work for NTLM
+ // ### how about uploading to an auth / proxyAuth site?
+
+ authenticating = (httpReply->statusCode() == 401 || httpReply->statusCode() == 407);
+
+ if (httpReply->isFinished())
+ break;
+ } while (remainingTimeBytesRead > 0);
+ } while (authenticating);
+
+ return true;
+}
+
QT_END_NAMESPACE
#endif // QT_NO_HTTP
diff --git a/src/network/access/qnetworkaccesshttpbackend_p.h b/src/network/access/qnetworkaccesshttpbackend_p.h
index fd3b2ec..462f435 100644
--- a/src/network/access/qnetworkaccesshttpbackend_p.h
+++ b/src/network/access/qnetworkaccesshttpbackend_p.h
@@ -99,6 +99,8 @@ public:
bool canResume() const;
void setResumeOffset(quint64 offset);
+ virtual bool processRequestSynchronously();
+
private slots:
void replyReadyRead();
void replyFinished();
@@ -112,7 +114,7 @@ private slots:
private:
QHttpNetworkReply *httpReply;
- QPointer<QNetworkAccessCachedHttpConnection> http;
+ QPointer<QHttpNetworkConnection> http;
QByteArray cacheKey;
QNetworkAccessBackendUploadIODevice *uploadDevice;
diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp
index 97e7928..bec217b 100644
--- a/src/network/access/qnetworkaccessmanager.cpp
+++ b/src/network/access/qnetworkaccessmanager.cpp
@@ -1049,12 +1049,14 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera
priv->backend->setParent(reply);
priv->backend->reply = priv;
}
- // fourth step: setup the reply
- priv->setup(op, request, outgoingData);
#ifndef QT_NO_OPENSSL
reply->setSslConfiguration(request.sslConfiguration());
#endif
+
+ // fourth step: setup the reply
+ priv->setup(op, request, outgoingData);
+
return reply;
}
@@ -1130,6 +1132,11 @@ void QNetworkAccessManagerPrivate::authenticationRequired(QNetworkAccessBackend
}
}
+ // if we emit a signal here in synchronous mode, the user might spin
+ // an event loop, which might recurse and lead to problems
+ if (backend->isSynchronous())
+ return;
+
backend->reply->urlForLastAuthentication = url;
emit q->authenticationRequired(backend->reply->q_func(), authenticator);
cacheCredentials(url, authenticator);
@@ -1157,6 +1164,11 @@ void QNetworkAccessManagerPrivate::proxyAuthenticationRequired(QNetworkAccessBac
}
}
+ // if we emit a signal here in synchronous mode, the user might spin
+ // an event loop, which might recurse and lead to problems
+ if (backend->isSynchronous())
+ return;
+
backend->reply->lastProxyAuthentication = proxy;
emit q->proxyAuthenticationRequired(proxy, authenticator);
cacheProxyCredentials(proxy, authenticator);
diff --git a/src/network/access/qnetworkreplyimpl.cpp b/src/network/access/qnetworkreplyimpl.cpp
index 010e904..fdc202c 100644
--- a/src/network/access/qnetworkreplyimpl.cpp
+++ b/src/network/access/qnetworkreplyimpl.cpp
@@ -91,7 +91,7 @@ void QNetworkReplyImplPrivate::_q_startOperation()
}
#ifndef QT_NO_BEARERMANAGEMENT
- if (!backend->start()) {
+ if (!backend->start()) { // ### we should call that method even if bearer is not used
// backend failed to start because the session state is not Connected.
// QNetworkAccessManager will call reply->backend->start() again for us when the session
// state changes.
@@ -115,11 +115,16 @@ void QNetworkReplyImplPrivate::_q_startOperation()
}
#endif
- if (state != Finished) {
- if (operation == QNetworkAccessManager::GetOperation)
- pendingNotifications.append(NotifyDownstreamReadyWrite);
+ if (backend->isSynchronous()) {
+ state = Finished;
+ q_func()->setFinished(true);
+ } else {
+ if (state != Finished) {
+ if (operation == QNetworkAccessManager::GetOperation)
+ pendingNotifications.append(NotifyDownstreamReadyWrite);
- handleNotifications();
+ handleNotifications();
+ }
}
}
@@ -277,8 +282,8 @@ void QNetworkReplyImplPrivate::_q_networkSessionConnected()
void QNetworkReplyImplPrivate::_q_networkSessionFailed()
{
- // Abort waiting replies.
- if (state == WaitingForSession) {
+ // Abort waiting and working replies.
+ if (state == WaitingForSession || state == Working) {
state = Working;
error(QNetworkReplyImpl::UnknownNetworkError,
QCoreApplication::translate("QNetworkReply", "Network session error."));
@@ -297,7 +302,25 @@ void QNetworkReplyImplPrivate::setup(QNetworkAccessManager::Operation op, const
url = request.url();
operation = op;
- if (outgoingData && backend) {
+ q->QIODevice::open(QIODevice::ReadOnly);
+ // Internal code that does a HTTP reply for the synchronous Ajax
+ // in QtWebKit.
+ QVariant synchronousHttpAttribute = req.attribute(
+ static_cast<QNetworkRequest::Attribute>(QNetworkRequest::DownloadBufferAttribute + 1));
+ if (synchronousHttpAttribute.toBool()) {
+ backend->setSynchronous(true);
+ if (outgoingData && outgoingData->isSequential()) {
+ outgoingDataBuffer = new QRingBuffer();
+ QByteArray data;
+ do {
+ data = outgoingData->readAll();
+ if (data.isEmpty())
+ break;
+ outgoingDataBuffer->append(data);
+ } while (1);
+ }
+ }
+ if (outgoingData && backend && !backend->isSynchronous()) {
// there is data to be uploaded, e.g. HTTP POST.
if (!backend->needsResetableUploadData() || !outgoingData->isSequential()) {
@@ -308,7 +331,7 @@ void QNetworkReplyImplPrivate::setup(QNetworkAccessManager::Operation op, const
} else {
bool bufferingDisallowed =
req.attribute(QNetworkRequest::DoNotBufferUploadDataAttribute,
- false).toBool();
+ false).toBool();
if (bufferingDisallowed) {
// if a valid content-length header for the request was supplied, we can disable buffering
@@ -333,17 +356,18 @@ void QNetworkReplyImplPrivate::setup(QNetworkAccessManager::Operation op, const
// for HTTP, we want to send out the request as fast as possible to the network, without
// invoking methods in a QueuedConnection
#ifndef QT_NO_HTTP
- if (qobject_cast<QNetworkAccessHttpBackend *>(backend)) {
+ if (qobject_cast<QNetworkAccessHttpBackend *>(backend) || (backend && backend->isSynchronous())) {
_q_startOperation();
} else {
QMetaObject::invokeMethod(q, "_q_startOperation", Qt::QueuedConnection);
}
#else
- QMetaObject::invokeMethod(q, "_q_startOperation", Qt::QueuedConnection);
+ if (backend->isSynchronous())
+ _q_startOperation();
+ else
+ QMetaObject::invokeMethod(q, "_q_startOperation", Qt::QueuedConnection);
#endif // QT_NO_HTTP
- }
-
- q->QIODevice::open(QIODevice::ReadOnly);
+ }
}
void QNetworkReplyImplPrivate::backendNotify(InternalNotifications notification)
diff --git a/src/network/access/qnetworkrequest.h b/src/network/access/qnetworkrequest.h
index cdadf0f..9bcc900 100644
--- a/src/network/access/qnetworkrequest.h
+++ b/src/network/access/qnetworkrequest.h
@@ -85,6 +85,9 @@ public:
MaximumDownloadBufferSizeAttribute, // internal
DownloadBufferAttribute, // internal
+ // (DownloadBufferAttribute + 1) is reserved internal for QSynchronousHttpNetworkReply
+ // add the enum in 4.8
+
User = 1000,
UserMax = 32767
};
diff --git a/src/network/bearer/bearer.pri b/src/network/bearer/bearer.pri
index 44e97fd..bc5b0b5 100644
--- a/src/network/bearer/bearer.pri
+++ b/src/network/bearer/bearer.pri
@@ -15,4 +15,3 @@ SOURCES += bearer/qnetworksession.cpp \
bearer/qnetworkconfigmanager_p.cpp \
bearer/qbearerengine.cpp \
bearer/qbearerplugin.cpp
-
diff --git a/src/network/bearer/qbearerengine.cpp b/src/network/bearer/qbearerengine.cpp
index b074924..ee7c66e 100644
--- a/src/network/bearer/qbearerengine.cpp
+++ b/src/network/bearer/qbearerengine.cpp
@@ -46,7 +46,7 @@
QT_BEGIN_NAMESPACE
QBearerEngine::QBearerEngine(QObject *parent)
-: QObject(parent), mutex(QMutex::Recursive)
+ : QObject(parent), mutex(QMutex::Recursive)
{
}
@@ -54,6 +54,7 @@ QBearerEngine::~QBearerEngine()
{
QHash<QString, QNetworkConfigurationPrivatePointer>::Iterator it;
QHash<QString, QNetworkConfigurationPrivatePointer>::Iterator end;
+
for (it = snapConfigurations.begin(), end = snapConfigurations.end(); it != end; ++it) {
it.value()->isValid = false;
it.value()->id.clear();
@@ -93,19 +94,20 @@ bool QBearerEngine::configurationsInUse() const
QMutexLocker locker(&mutex);
- for (it = accessPointConfigurations.begin(),
- end = accessPointConfigurations.end(); it != end; ++it) {
+ for (it = accessPointConfigurations.constBegin(),
+ end = accessPointConfigurations.constEnd(); it != end; ++it) {
if (it.value()->ref > 1)
return true;
}
- for (it = snapConfigurations.begin(), end = snapConfigurations.end(); it != end; ++it) {
+ for (it = snapConfigurations.constBegin(),
+ end = snapConfigurations.constEnd(); it != end; ++it) {
if (it.value()->ref > 1)
return true;
}
- for (it = userChoiceConfigurations.begin(),
- end = userChoiceConfigurations.end(); it != end; ++it) {
+ for (it = userChoiceConfigurations.constBegin(),
+ end = userChoiceConfigurations.constEnd(); it != end; ++it) {
if (it.value()->ref > 1)
return true;
}
diff --git a/src/network/bearer/qbearerengine_p.h b/src/network/bearer/qbearerengine_p.h
index 70aa5fa..bac6b14 100644
--- a/src/network/bearer/qbearerengine_p.h
+++ b/src/network/bearer/qbearerengine_p.h
@@ -78,7 +78,7 @@ class Q_NETWORK_EXPORT QBearerEngine : public QObject
friend class QNetworkConfigurationManagerPrivate;
public:
- QBearerEngine(QObject *parent = 0);
+ explicit QBearerEngine(QObject *parent = 0);
virtual ~QBearerEngine();
virtual bool hasIdentifier(const QString &id) = 0;
@@ -96,7 +96,6 @@ Q_SIGNALS:
void configurationAdded(QNetworkConfigurationPrivatePointer config);
void configurationRemoved(QNetworkConfigurationPrivatePointer config);
void configurationChanged(QNetworkConfigurationPrivatePointer config);
-
void updateCompleted();
protected:
@@ -114,4 +113,4 @@ QT_END_NAMESPACE
#endif // QT_NO_BEARERMANAGEMENT
-#endif
+#endif // QBEARERENGINE_P_H
diff --git a/src/network/bearer/qbearerplugin.cpp b/src/network/bearer/qbearerplugin.cpp
index a5e8918..b92982f 100644
--- a/src/network/bearer/qbearerplugin.cpp
+++ b/src/network/bearer/qbearerplugin.cpp
@@ -41,14 +41,12 @@
#include "qbearerplugin_p.h"
-#include <QtCore/qdebug.h>
-
#ifndef QT_NO_BEARERMANAGEMENT
QT_BEGIN_NAMESPACE
QBearerEnginePlugin::QBearerEnginePlugin(QObject *parent)
-: QObject(parent)
+ : QObject(parent)
{
}
diff --git a/src/network/bearer/qbearerplugin_p.h b/src/network/bearer/qbearerplugin_p.h
index 9652f14..aee189b 100644
--- a/src/network/bearer/qbearerplugin_p.h
+++ b/src/network/bearer/qbearerplugin_p.h
@@ -68,7 +68,7 @@ QT_MODULE(Network)
struct Q_NETWORK_EXPORT QBearerEngineFactoryInterface : public QFactoryInterface
{
- virtual QBearerEngine *create(const QString &key = QString()) const = 0;
+ virtual QBearerEngine *create(const QString &key) const = 0;
};
#define QBearerEngineFactoryInterface_iid "com.trolltech.Qt.QBearerEngineFactoryInterface"
@@ -84,7 +84,7 @@ public:
virtual ~QBearerEnginePlugin();
virtual QStringList keys() const = 0;
- virtual QBearerEngine *create(const QString &key = QString()) const = 0;
+ virtual QBearerEngine *create(const QString &key) const = 0;
};
QT_END_NAMESPACE
@@ -93,4 +93,4 @@ QT_END_HEADER
#endif // QT_NO_BEARERMANAGEMENT
-#endif
+#endif // QBEARERPLUGIN_P_H
diff --git a/src/network/bearer/qnetworkconfigmanager.cpp b/src/network/bearer/qnetworkconfigmanager.cpp
index 4c149a2..8b6d45f 100644
--- a/src/network/bearer/qnetworkconfigmanager.cpp
+++ b/src/network/bearer/qnetworkconfigmanager.cpp
@@ -124,14 +124,14 @@ QNetworkConfigurationManagerPrivate *qNetworkConfigurationManagerPrivate()
*/
/*!
- \fn void QNetworkConfigurationManager::configurationAdded(const QNetworkConfiguration& config)
+ \fn void QNetworkConfigurationManager::configurationAdded(const QNetworkConfiguration &config)
This signal is emitted whenever a new network configuration is added to the system. The new
configuration is specified by \a config.
*/
/*!
- \fn void QNetworkConfigurationManager::configurationRemoved(const QNetworkConfiguration& configuration)
+ \fn void QNetworkConfigurationManager::configurationRemoved(const QNetworkConfiguration &config)
This signal is emitted when a configuration is about to be removed from the system. The removed
\a configuration is invalid but retains name and identifier.
@@ -144,7 +144,7 @@ QNetworkConfigurationManagerPrivate *qNetworkConfigurationManagerPrivate()
be initiated via \l updateConfigurations().
*/
-/*! \fn void QNetworkConfigurationManager::configurationChanged(const QNetworkConfiguration& config)
+/*! \fn void QNetworkConfigurationManager::configurationChanged(const QNetworkConfiguration &config)
This signal is emitted when the \l {QNetworkConfiguration::state()}{state} of \a config changes.
*/
@@ -204,7 +204,7 @@ QNetworkConfigurationManagerPrivate *qNetworkConfigurationManagerPrivate()
/*!
Constructs a QNetworkConfigurationManager with the given \a parent.
*/
-QNetworkConfigurationManager::QNetworkConfigurationManager( QObject* parent )
+QNetworkConfigurationManager::QNetworkConfigurationManager(QObject *parent)
: QObject(parent)
{
QNetworkConfigurationManagerPrivate *priv = qNetworkConfigurationManagerPrivate();
@@ -213,12 +213,12 @@ QNetworkConfigurationManager::QNetworkConfigurationManager( QObject* parent )
this, SIGNAL(configurationAdded(QNetworkConfiguration)));
connect(priv, SIGNAL(configurationRemoved(QNetworkConfiguration)),
this, SIGNAL(configurationRemoved(QNetworkConfiguration)));
- connect(priv, SIGNAL(configurationUpdateComplete()),
- this, SIGNAL(updateCompleted()));
- connect(priv, SIGNAL(onlineStateChanged(bool)),
- this, SIGNAL(onlineStateChanged(bool)));
connect(priv, SIGNAL(configurationChanged(QNetworkConfiguration)),
this, SIGNAL(configurationChanged(QNetworkConfiguration)));
+ connect(priv, SIGNAL(onlineStateChanged(bool)),
+ this, SIGNAL(onlineStateChanged(bool)));
+ connect(priv, SIGNAL(configurationUpdateComplete()),
+ this, SIGNAL(updateCompleted()));
priv->enablePolling();
}
diff --git a/src/network/bearer/qnetworkconfigmanager.h b/src/network/bearer/qnetworkconfigmanager.h
index 3e44be1..9ddebe5 100644
--- a/src/network/bearer/qnetworkconfigmanager.h
+++ b/src/network/bearer/qnetworkconfigmanager.h
@@ -68,7 +68,6 @@ class QNetworkConfigurationManagerExport QNetworkConfigurationManager : public Q
Q_OBJECT
public:
-
enum Capability {
CanStartAndStopInterfaces = 0x00000001,
DirectConnectionRouting = 0x00000002,
@@ -81,26 +80,26 @@ public:
Q_DECLARE_FLAGS(Capabilities, Capability)
- QNetworkConfigurationManager( QObject* parent = 0 );
+ explicit QNetworkConfigurationManager(QObject *parent = 0);
virtual ~QNetworkConfigurationManager();
-
QNetworkConfigurationManager::Capabilities capabilities() const;
- QNetworkConfiguration defaultConfiguration() const;
+ QNetworkConfiguration defaultConfiguration() const;
QList<QNetworkConfiguration> allConfigurations(QNetworkConfiguration::StateFlags flags = 0) const;
- QNetworkConfiguration configurationFromIdentifier(const QString& identifier) const;
- void updateConfigurations();
+ QNetworkConfiguration configurationFromIdentifier(const QString &identifier) const;
bool isOnline() const;
+public Q_SLOTS:
+ void updateConfigurations();
+
Q_SIGNALS:
- void configurationAdded(const QNetworkConfiguration& config);
- void configurationRemoved(const QNetworkConfiguration& config);
- void configurationChanged(const QNetworkConfiguration& config);
+ void configurationAdded(const QNetworkConfiguration &config);
+ void configurationRemoved(const QNetworkConfiguration &config);
+ void configurationChanged(const QNetworkConfiguration &config);
void onlineStateChanged(bool isOnline);
void updateCompleted();
-
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QNetworkConfigurationManager::Capabilities)
@@ -115,5 +114,4 @@ QT_END_HEADER
#endif // QT_NO_BEARERMANAGEMENT
-#endif //QNETWORKCONFIGURATIONMANAGER_H
-
+#endif // QNETWORKCONFIGURATIONMANAGER_H
diff --git a/src/network/bearer/qnetworkconfigmanager_p.cpp b/src/network/bearer/qnetworkconfigmanager_p.cpp
index d388920..fd1052c 100644
--- a/src/network/bearer/qnetworkconfigmanager_p.cpp
+++ b/src/network/bearer/qnetworkconfigmanager_p.cpp
@@ -60,7 +60,7 @@ Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, loader,
#endif
QNetworkConfigurationManagerPrivate::QNetworkConfigurationManagerPrivate()
-: pollTimer(0), mutex(QMutex::Recursive), forcedPolling(0), firstUpdate(true)
+ : QObject(), mutex(QMutex::Recursive), forcedPolling(0), firstUpdate(true)
{
qRegisterMetaType<QNetworkConfiguration>("QNetworkConfiguration");
qRegisterMetaType<QNetworkConfigurationPrivatePointer>("QNetworkConfigurationPrivatePointer");
@@ -73,13 +73,12 @@ QNetworkConfigurationManagerPrivate::~QNetworkConfigurationManagerPrivate()
qDeleteAll(sessionEngines);
}
-QNetworkConfiguration QNetworkConfigurationManagerPrivate::defaultConfiguration()
+QNetworkConfiguration QNetworkConfigurationManagerPrivate::defaultConfiguration() const
{
QMutexLocker locker(&mutex);
foreach (QBearerEngine *engine, sessionEngines) {
QNetworkConfigurationPrivatePointer ptr = engine->defaultConfiguration();
-
if (ptr) {
QNetworkConfiguration config;
config.d = ptr;
@@ -98,8 +97,8 @@ QNetworkConfiguration QNetworkConfigurationManagerPrivate::defaultConfiguration(
QMutexLocker locker(&engine->mutex);
- for (it = engine->snapConfigurations.begin(), end = engine->snapConfigurations.end();
- it != end; ++it) {
+ for (it = engine->snapConfigurations.begin(),
+ end = engine->snapConfigurations.end(); it != end; ++it) {
QNetworkConfigurationPrivatePointer ptr = it.value();
QMutexLocker configLocker(&ptr->mutex);
@@ -109,10 +108,8 @@ QNetworkConfiguration QNetworkConfigurationManagerPrivate::defaultConfiguration(
config.d = ptr;
return config;
} else if (!defaultConfiguration) {
- if ((ptr->state & QNetworkConfiguration::Discovered) ==
- QNetworkConfiguration::Discovered) {
+ if ((ptr->state & QNetworkConfiguration::Discovered) == QNetworkConfiguration::Discovered)
defaultConfiguration = ptr;
- }
}
}
}
@@ -136,8 +133,6 @@ QNetworkConfiguration QNetworkConfigurationManagerPrivate::defaultConfiguration(
6. Discovered Other
*/
- defaultConfiguration.reset();
-
foreach (QBearerEngine *engine, sessionEngines) {
QHash<QString, QNetworkConfigurationPrivatePointer>::Iterator it;
QHash<QString, QNetworkConfigurationPrivatePointer>::Iterator end;
@@ -151,8 +146,7 @@ QNetworkConfiguration QNetworkConfigurationManagerPrivate::defaultConfiguration(
QMutexLocker configLocker(&ptr->mutex);
QNetworkConfiguration::BearerType bearerType = ptr->bearerType;
- if ((ptr->state & QNetworkConfiguration::Discovered) ==
- QNetworkConfiguration::Discovered) {
+ if ((ptr->state & QNetworkConfiguration::Discovered) == QNetworkConfiguration::Discovered) {
if (!defaultConfiguration) {
defaultConfiguration = ptr;
} else {
@@ -196,7 +190,7 @@ QNetworkConfiguration QNetworkConfigurationManagerPrivate::defaultConfiguration(
return QNetworkConfiguration();
}
-QList<QNetworkConfiguration> QNetworkConfigurationManagerPrivate::allConfigurations(QNetworkConfiguration::StateFlags filter)
+QList<QNetworkConfiguration> QNetworkConfigurationManagerPrivate::allConfigurations(QNetworkConfiguration::StateFlags filter) const
{
QList<QNetworkConfiguration> result;
@@ -240,7 +234,7 @@ QList<QNetworkConfiguration> QNetworkConfigurationManagerPrivate::allConfigurati
return result;
}
-QNetworkConfiguration QNetworkConfigurationManagerPrivate::configurationFromIdentifier(const QString &identifier)
+QNetworkConfiguration QNetworkConfigurationManagerPrivate::configurationFromIdentifier(const QString &identifier) const
{
QNetworkConfiguration item;
@@ -250,11 +244,11 @@ QNetworkConfiguration QNetworkConfigurationManagerPrivate::configurationFromIden
QMutexLocker locker(&engine->mutex);
if (engine->accessPointConfigurations.contains(identifier))
- item.d = engine->accessPointConfigurations.value(identifier);
+ item.d = engine->accessPointConfigurations[identifier];
else if (engine->snapConfigurations.contains(identifier))
- item.d = engine->snapConfigurations.value(identifier);
+ item.d = engine->snapConfigurations[identifier];
else if (engine->userChoiceConfigurations.contains(identifier))
- item.d = engine->userChoiceConfigurations.value(identifier);
+ item.d = engine->userChoiceConfigurations[identifier];
else
continue;
@@ -264,14 +258,14 @@ QNetworkConfiguration QNetworkConfigurationManagerPrivate::configurationFromIden
return item;
}
-bool QNetworkConfigurationManagerPrivate::isOnline()
+bool QNetworkConfigurationManagerPrivate::isOnline() const
{
QMutexLocker locker(&mutex);
return !onlineConfigurations.isEmpty();
}
-QNetworkConfigurationManager::Capabilities QNetworkConfigurationManagerPrivate::capabilities()
+QNetworkConfigurationManager::Capabilities QNetworkConfigurationManagerPrivate::capabilities() const
{
QMutexLocker locker(&mutex);
@@ -353,7 +347,7 @@ void QNetworkConfigurationManagerPrivate::updateConfigurations()
QMutexLocker locker(&mutex);
if (firstUpdate) {
- if (sender())
+ if (qobject_cast<QBearerEngine *>(sender()))
return;
if (thread() != QCoreApplicationPrivate::mainThread()) {
@@ -366,10 +360,9 @@ void QNetworkConfigurationManagerPrivate::updateConfigurations()
updating = false;
#ifndef QT_NO_LIBRARY
- QFactoryLoader *l = loader();
-
QBearerEngine *generic = 0;
+ QFactoryLoader *l = loader();
foreach (const QString &key, l->keys()) {
QBearerEnginePlugin *plugin = qobject_cast<QBearerEnginePlugin *>(l->instance(key));
if (plugin) {
@@ -403,11 +396,8 @@ void QNetworkConfigurationManagerPrivate::updateConfigurations()
}
QBearerEngine *engine = qobject_cast<QBearerEngine *>(sender());
- if (!updatingEngines.isEmpty() && engine) {
- int index = sessionEngines.indexOf(engine);
- if (index >= 0)
- updatingEngines.remove(index);
- }
+ if (engine && !updatingEngines.isEmpty())
+ updatingEngines.remove(engine);
if (updating && updatingEngines.isEmpty()) {
updating = false;
@@ -415,10 +405,7 @@ void QNetworkConfigurationManagerPrivate::updateConfigurations()
}
if (engine && !pollingEngines.isEmpty()) {
- int index = sessionEngines.indexOf(engine);
- if (index >= 0)
- pollingEngines.remove(index);
-
+ pollingEngines.remove(engine);
if (pollingEngines.isEmpty())
startPolling();
}
@@ -438,13 +425,13 @@ void QNetworkConfigurationManagerPrivate::performAsyncConfigurationUpdate()
updating = true;
- for (int i = 0; i < sessionEngines.count(); ++i) {
- updatingEngines.insert(i);
- QMetaObject::invokeMethod(sessionEngines.at(i), "requestUpdate");
+ foreach (QBearerEngine *engine, sessionEngines) {
+ updatingEngines.insert(engine);
+ QMetaObject::invokeMethod(engine, "requestUpdate");
}
}
-QList<QBearerEngine *> QNetworkConfigurationManagerPrivate::engines()
+QList<QBearerEngine *> QNetworkConfigurationManagerPrivate::engines() const
{
QMutexLocker locker(&mutex);
@@ -455,35 +442,11 @@ void QNetworkConfigurationManagerPrivate::startPolling()
{
QMutexLocker locker(&mutex);
- bool pollingRequired = false;
-
- if (forcedPolling > 0) {
- foreach (QBearerEngine *engine, sessionEngines) {
- if (engine->requiresPolling()) {
- pollingRequired = true;
- break;
- }
- }
- }
-
- if (!pollingRequired) {
- foreach (QBearerEngine *engine, sessionEngines) {
- if (engine->configurationsInUse()) {
- pollingRequired = true;
- break;
- }
- }
- }
-
- if (pollingRequired) {
- if (!pollTimer) {
- pollTimer = new QTimer(this);
- pollTimer->setInterval(10000);
- pollTimer->setSingleShot(true);
- connect(pollTimer, SIGNAL(timeout()), this, SLOT(pollEngines()));
+ foreach (QBearerEngine *engine, sessionEngines) {
+ if (engine->requiresPolling() && (forcedPolling || engine->configurationsInUse())) {
+ QTimer::singleShot(10000, this, SLOT(pollEngines()));
+ break;
}
-
- pollTimer->start();
}
}
@@ -491,13 +454,10 @@ void QNetworkConfigurationManagerPrivate::pollEngines()
{
QMutexLocker locker(&mutex);
- for (int i = 0; i < sessionEngines.count(); ++i) {
- if (!sessionEngines.at(i)->requiresPolling())
- continue;
-
- if (forcedPolling || sessionEngines.at(i)->configurationsInUse()) {
- pollingEngines.insert(i);
- QMetaObject::invokeMethod(sessionEngines.at(i), "requestUpdate");
+ foreach (QBearerEngine *engine, sessionEngines) {
+ if (engine->requiresPolling() && (forcedPolling || engine->configurationsInUse())) {
+ pollingEngines.insert(engine);
+ QMetaObject::invokeMethod(engine, "requestUpdate");
}
}
}
@@ -509,7 +469,7 @@ void QNetworkConfigurationManagerPrivate::enablePolling()
++forcedPolling;
if (forcedPolling == 1)
- QMetaObject::invokeMethod(this, "startPolling");
+ startPolling();
}
void QNetworkConfigurationManagerPrivate::disablePolling()
diff --git a/src/network/bearer/qnetworkconfigmanager_p.h b/src/network/bearer/qnetworkconfigmanager_p.h
index 0649031..16c2c4b 100644
--- a/src/network/bearer/qnetworkconfigmanager_p.h
+++ b/src/network/bearer/qnetworkconfigmanager_p.h
@@ -64,7 +64,6 @@
QT_BEGIN_NAMESPACE
class QBearerEngine;
-class QTimer;
class Q_NETWORK_EXPORT QNetworkConfigurationManagerPrivate : public QObject
{
@@ -74,57 +73,54 @@ public:
QNetworkConfigurationManagerPrivate();
virtual ~QNetworkConfigurationManagerPrivate();
- QNetworkConfiguration defaultConfiguration();
- QList<QNetworkConfiguration> allConfigurations(QNetworkConfiguration::StateFlags filter);
- QNetworkConfiguration configurationFromIdentifier(const QString &identifier);
+ QNetworkConfiguration defaultConfiguration() const;
+ QList<QNetworkConfiguration> allConfigurations(QNetworkConfiguration::StateFlags filter) const;
+ QNetworkConfiguration configurationFromIdentifier(const QString &identifier) const;
- bool isOnline();
+ bool isOnline() const;
- QNetworkConfigurationManager::Capabilities capabilities();
+ QNetworkConfigurationManager::Capabilities capabilities() const;
void performAsyncConfigurationUpdate();
- QList<QBearerEngine *> engines();
-
- Q_INVOKABLE void startPolling();
+ QList<QBearerEngine *> engines() const;
void enablePolling();
void disablePolling();
-public slots:
+public Q_SLOTS:
void updateConfigurations();
Q_SIGNALS:
- void configurationAdded(const QNetworkConfiguration& config);
- void configurationRemoved(const QNetworkConfiguration& config);
+ void configurationAdded(const QNetworkConfiguration &config);
+ void configurationRemoved(const QNetworkConfiguration &config);
+ void configurationChanged(const QNetworkConfiguration &config);
void configurationUpdateComplete();
- void configurationChanged(const QNetworkConfiguration& config);
void onlineStateChanged(bool isOnline);
- void abort();
+private Q_SLOTS:
+ void configurationAdded(QNetworkConfigurationPrivatePointer ptr);
+ void configurationRemoved(QNetworkConfigurationPrivatePointer ptr);
+ void configurationChanged(QNetworkConfigurationPrivatePointer ptr);
+
+ void pollEngines();
private:
- QTimer *pollTimer;
+ void startPolling();
- QMutex mutex;
+private:
+ mutable QMutex mutex;
QList<QBearerEngine *> sessionEngines;
QSet<QString> onlineConfigurations;
- QSet<int> pollingEngines;
- QSet<int> updatingEngines;
+ QSet<QBearerEngine *> pollingEngines;
+ QSet<QBearerEngine *> updatingEngines;
int forcedPolling;
bool updating;
bool firstUpdate;
-
-private Q_SLOTS:
- void configurationAdded(QNetworkConfigurationPrivatePointer ptr);
- void configurationRemoved(QNetworkConfigurationPrivatePointer ptr);
- void configurationChanged(QNetworkConfigurationPrivatePointer ptr);
-
- void pollEngines();
};
Q_NETWORK_EXPORT QNetworkConfigurationManagerPrivate *qNetworkConfigurationManagerPrivate();
@@ -133,4 +129,4 @@ QT_END_NAMESPACE
#endif // QT_NO_BEARERMANAGEMENT
-#endif //QNETWORKCONFIGURATIONMANAGERPRIVATE_H
+#endif // QNETWORKCONFIGURATIONMANAGERPRIVATE_H
diff --git a/src/network/bearer/qnetworkconfiguration.cpp b/src/network/bearer/qnetworkconfiguration.cpp
index 3190a30..96d8bff 100644
--- a/src/network/bearer/qnetworkconfiguration.cpp
+++ b/src/network/bearer/qnetworkconfiguration.cpp
@@ -212,44 +212,38 @@ QNetworkConfiguration::QNetworkConfiguration()
/*!
Creates a copy of the QNetworkConfiguration object contained in \a other.
*/
-QNetworkConfiguration::QNetworkConfiguration(const QNetworkConfiguration& other)
+QNetworkConfiguration::QNetworkConfiguration(const QNetworkConfiguration &other)
: d(other.d)
{
}
/*!
- Copies the content of the QNetworkConfiguration object contained in \a other into this one.
+ Frees the resources associated with the QNetworkConfiguration object.
*/
-QNetworkConfiguration& QNetworkConfiguration::operator=(const QNetworkConfiguration& other)
+QNetworkConfiguration::~QNetworkConfiguration()
{
- d = other.d;
- return *this;
}
/*!
- Frees the resources associated with the QNetworkConfiguration object.
+ Copies the content of the QNetworkConfiguration object contained in \a other into this one.
*/
-QNetworkConfiguration::~QNetworkConfiguration()
+QNetworkConfiguration &QNetworkConfiguration::operator=(const QNetworkConfiguration &other)
{
+ d = other.d;
+ return *this;
}
/*!
Returns true, if this configuration is the same as the \a other
configuration given; otherwise returns false.
*/
-bool QNetworkConfiguration::operator==(const QNetworkConfiguration& other) const
+bool QNetworkConfiguration::operator==(const QNetworkConfiguration &other) const
{
- if (!d)
- return !other.d;
-
- if (!other.d)
- return false;
-
return (d == other.d);
}
/*!
- \fn bool QNetworkConfiguration::operator!=(const QNetworkConfiguration& other) const
+ \fn bool QNetworkConfiguration::operator!=(const QNetworkConfiguration &other) const
Returns true if this configuration is not the same as the \a other
configuration given; otherwise returns false.
@@ -370,11 +364,14 @@ QList<QNetworkConfiguration> QNetworkConfiguration::children() const
{
QList<QNetworkConfiguration> results;
- if (type() != QNetworkConfiguration::ServiceNetwork || !isValid())
+ if (!d)
return results;
QMutexLocker locker(&d->mutex);
+ if (d->type != QNetworkConfiguration::ServiceNetwork || !d->isValid)
+ return results;
+
QMutableMapIterator<unsigned int, QNetworkConfigurationPrivatePointer> i(d->serviceNetworkMembers);
while (i.hasNext()) {
i.next();
@@ -510,4 +507,3 @@ QString QNetworkConfiguration::bearerTypeName() const
}
QT_END_NAMESPACE
-
diff --git a/src/network/bearer/qnetworkconfiguration.h b/src/network/bearer/qnetworkconfiguration.h
index 593dbbe..475df9e 100644
--- a/src/network/bearer/qnetworkconfiguration.h
+++ b/src/network/bearer/qnetworkconfiguration.h
@@ -73,12 +73,12 @@ class QNetworkConfigurationExport QNetworkConfiguration
public:
QNetworkConfiguration();
QNetworkConfiguration(const QNetworkConfiguration& other);
- QNetworkConfiguration &operator=(const QNetworkConfiguration& other);
+ QNetworkConfiguration &operator=(const QNetworkConfiguration &other);
~QNetworkConfiguration();
- bool operator==(const QNetworkConfiguration& cp) const;
- inline bool operator!=(const QNetworkConfiguration& cp) const
- { return !operator==(cp); }
+ bool operator==(const QNetworkConfiguration &other) const;
+ inline bool operator!=(const QNetworkConfiguration &other) const
+ { return !operator==(other); }
enum Type {
InternetAccessPoint = 0,
@@ -100,7 +100,6 @@ public:
Discovered = 0x0000006,
Active = 0x000000e
};
-
Q_DECLARE_FLAGS(StateFlags, StateFlag)
#ifndef QT_MOBILITY_BEARER
@@ -155,4 +154,4 @@ QTM_END_NAMESPACE
QT_END_HEADER
-#endif //QNETWORKCONFIGURATION_H
+#endif // QNETWORKCONFIGURATION_H
diff --git a/src/network/bearer/qnetworkconfiguration_p.h b/src/network/bearer/qnetworkconfiguration_p.h
index 2b0bbf6..4d41acb 100644
--- a/src/network/bearer/qnetworkconfiguration_p.h
+++ b/src/network/bearer/qnetworkconfiguration_p.h
@@ -65,18 +65,17 @@ typedef QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> QNetworkConfi
class QNetworkConfigurationPrivate : public QSharedData
{
public:
- QNetworkConfigurationPrivate ()
- : mutex(QMutex::Recursive), type(QNetworkConfiguration::Invalid),
+ QNetworkConfigurationPrivate() :
+ mutex(QMutex::Recursive),
+ type(QNetworkConfiguration::Invalid),
purpose(QNetworkConfiguration::UnknownPurpose),
bearerType(QNetworkConfiguration::BearerUnknown),
isValid(false), roamingSupported(false)
- {
- }
-
+ {}
virtual ~QNetworkConfigurationPrivate()
{
//release pointers to member configurations
- serviceNetworkMembers.clear();
+ serviceNetworkMembers.clear();
}
virtual QString bearerTypeName() const
@@ -100,11 +99,9 @@ public:
bool roamingSupported;
private:
- // disallow detaching
- QNetworkConfigurationPrivate &operator=(const QNetworkConfigurationPrivate &other);
- QNetworkConfigurationPrivate(const QNetworkConfigurationPrivate &other);
+ Q_DISABLE_COPY(QNetworkConfigurationPrivate)
};
QT_END_NAMESPACE
-#endif //QNETWORKCONFIGURATIONPRIVATE_H
+#endif // QNETWORKCONFIGURATIONPRIVATE_H
diff --git a/src/network/bearer/qnetworksession.cpp b/src/network/bearer/qnetworksession.cpp
index 226c3c5..a9ba9c5 100644
--- a/src/network/bearer/qnetworksession.cpp
+++ b/src/network/bearer/qnetworksession.cpp
@@ -39,11 +39,12 @@
**
****************************************************************************/
+#include "qnetworksession.h"
+#include "qbearerengine_p.h"
+
#include <QEventLoop>
#include <QTimer>
-#include "qnetworksession.h"
-#include "qbearerengine_p.h"
#include "qnetworkconfigmanager_p.h"
#include "qnetworksession_p.h"
@@ -165,7 +166,7 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn void QNetworkSession::preferredConfigurationChanged(const QNetworkConfiguration& config, bool isSeamless)
+ \fn void QNetworkSession::preferredConfigurationChanged(const QNetworkConfiguration &config, bool isSeamless)
This signal is emitted when the preferred configuration/access point for the
session changes. Only sessions which are based on service network configurations
@@ -224,30 +225,29 @@ QT_BEGIN_NAMESPACE
\sa QNetworkConfiguration
*/
-QNetworkSession::QNetworkSession(const QNetworkConfiguration& connectionConfig, QObject* parent)
-: QObject(parent), d(0)
+QNetworkSession::QNetworkSession(const QNetworkConfiguration &connectionConfig, QObject *parent)
+ : QObject(parent), d(0)
{
// invalid configuration
- if (connectionConfig.identifier().isNull())
- return;
-
- foreach (QBearerEngine *engine, qNetworkConfigurationManagerPrivate()->engines()) {
- if (engine->hasIdentifier(connectionConfig.identifier())) {
- d = engine->createSessionBackend();
- d->q = this;
- d->publicConfig = connectionConfig;
- d->syncStateWithInterface();
- connect(d, SIGNAL(quitPendingWaitsForOpened()), this, SIGNAL(opened()));
- connect(d, SIGNAL(error(QNetworkSession::SessionError)),
- this, SIGNAL(error(QNetworkSession::SessionError)));
- connect(d, SIGNAL(stateChanged(QNetworkSession::State)),
- this, SIGNAL(stateChanged(QNetworkSession::State)));
- connect(d, SIGNAL(closed()), this, SIGNAL(closed()));
- connect(d, SIGNAL(preferredConfigurationChanged(QNetworkConfiguration,bool)),
- this, SIGNAL(preferredConfigurationChanged(QNetworkConfiguration,bool)));
- connect(d, SIGNAL(newConfigurationActivated()),
- this, SIGNAL(newConfigurationActivated()));
- break;
+ if (!connectionConfig.identifier().isEmpty()) {
+ foreach (QBearerEngine *engine, qNetworkConfigurationManagerPrivate()->engines()) {
+ if (engine->hasIdentifier(connectionConfig.identifier())) {
+ d = engine->createSessionBackend();
+ d->q = this;
+ d->publicConfig = connectionConfig;
+ d->syncStateWithInterface();
+ connect(d, SIGNAL(quitPendingWaitsForOpened()), this, SIGNAL(opened()));
+ connect(d, SIGNAL(error(QNetworkSession::SessionError)),
+ this, SIGNAL(error(QNetworkSession::SessionError)));
+ connect(d, SIGNAL(stateChanged(QNetworkSession::State)),
+ this, SIGNAL(stateChanged(QNetworkSession::State)));
+ connect(d, SIGNAL(closed()), this, SIGNAL(closed()));
+ connect(d, SIGNAL(preferredConfigurationChanged(QNetworkConfiguration,bool)),
+ this, SIGNAL(preferredConfigurationChanged(QNetworkConfiguration,bool)));
+ connect(d, SIGNAL(newConfigurationActivated()),
+ this, SIGNAL(newConfigurationActivated()));
+ break;
+ }
}
}
}
@@ -310,22 +310,20 @@ bool QNetworkSession::waitForOpened(int msecs)
if (d->isOpen)
return true;
- if (d->state != Connecting)
+ if (!(d->state == Connecting || d->state == Connected)) {
return false;
+ }
- QEventLoop* loop = new QEventLoop(this);
- QObject::connect(d, SIGNAL(quitPendingWaitsForOpened()),
- loop, SLOT(quit()));
- QObject::connect(this, SIGNAL(error(QNetworkSession::SessionError)),
- loop, SLOT(quit()));
+ QEventLoop loop;
+ QObject::connect(d, SIGNAL(quitPendingWaitsForOpened()), &loop, SLOT(quit()));
+ QObject::connect(this, SIGNAL(error(QNetworkSession::SessionError)), &loop, SLOT(quit()));
//final call
- if (msecs>=0)
- QTimer::singleShot(msecs, loop, SLOT(quit()));
+ if (msecs >= 0)
+ QTimer::singleShot(msecs, &loop, SLOT(quit()));
- loop->exec();
- loop->disconnect();
- loop->deleteLater();
+ // enter the event loop and wait for opened/error/timeout
+ loop.exec(QEventLoop::ExcludeUserInputEvents | QEventLoop::WaitForMoreEvents);
return d->isOpen;
}
@@ -471,7 +469,7 @@ QString QNetworkSession::errorString() const
\code
QNetworkConfigurationManager mgr;
QNetworkConfiguration ap = mgr.defaultConfiguration();
- QNetworkSession* session = new QNetworkSession(ap);
+ QNetworkSession *session = new QNetworkSession(ap);
... //code activates session
QString ident = session->sessionProperty("ActiveConfiguration").toString();
@@ -516,20 +514,13 @@ QString QNetworkSession::errorString() const
has no effect for sessions that do not require polling.
\endtable
*/
-QVariant QNetworkSession::sessionProperty(const QString& key) const
+QVariant QNetworkSession::sessionProperty(const QString &key) const
{
- if (!d)
+ if (!d || !d->publicConfig.isValid())
return QVariant();
- if (!d->publicConfig.isValid())
- return QVariant();
-
- if (key == QLatin1String("ActiveConfiguration")) {
- if (!d->isOpen)
- return QString();
- else
- return d->activeConfig.identifier();
- }
+ if (key == QLatin1String("ActiveConfiguration"))
+ return d->isOpen ? d->activeConfig.identifier() : QString();
if (key == QLatin1String("UserChoiceConfiguration")) {
if (!d->isOpen || d->publicConfig.type() != QNetworkConfiguration::UserChoice)
@@ -552,7 +543,7 @@ QVariant QNetworkSession::sessionProperty(const QString& key) const
Note that the \e UserChoiceConfiguration and \e ActiveConfiguration
properties are read only and cannot be changed using this method.
*/
-void QNetworkSession::setSessionProperty(const QString& key, const QVariant& value)
+void QNetworkSession::setSessionProperty(const QString &key, const QVariant &value)
{
if (!d)
return;
@@ -586,7 +577,7 @@ void QNetworkSession::migrate()
*/
void QNetworkSession::ignore()
{
- // Needed on at least Symbian platform: the roaming must be explicitly
+ // Needed on at least Symbian platform: the roaming must be explicitly
// ignore()'d or migrate()'d
if (d)
d->ignore();
@@ -680,32 +671,34 @@ quint64 QNetworkSession::activeTime() const
void QNetworkSession::connectNotify(const char *signal)
{
QObject::connectNotify(signal);
- //check for preferredConfigurationChanged() signal connect notification
- //This is not required on all platforms
+
if (!d)
return;
- if (qstrcmp(signal, SIGNAL(preferredConfigurationChanged(QNetworkConfiguration,bool))) == 0)
+ //check for preferredConfigurationChanged() signal connect notification
+ //This is not required on all platforms
+ if (QLatin1String(signal) == SIGNAL(preferredConfigurationChanged(QNetworkConfiguration,bool)))
d->setALREnabled(true);
}
/*!
\internal
- This function is called when the client disconnects from the preferredConfigurationChanged()
- signal.
+ This function is called when the client disconnects from the
+ preferredConfigurationChanged() signal.
\sa connectNotify()
*/
void QNetworkSession::disconnectNotify(const char *signal)
{
QObject::disconnectNotify(signal);
- //check for preferredConfigurationChanged() signal disconnect notification
- //This is not required on all platforms
+
if (!d)
return;
- if (qstrcmp(signal, SIGNAL(preferredConfigurationChanged(QNetworkConfiguration,bool))) == 0)
+ //check for preferredConfigurationChanged() signal disconnect notification
+ //This is not required on all platforms
+ if (QLatin1String(signal) == SIGNAL(preferredConfigurationChanged(QNetworkConfiguration,bool)))
d->setALREnabled(false);
}
diff --git a/src/network/bearer/qnetworksession.h b/src/network/bearer/qnetworksession.h
index 0b40147..717e085 100644
--- a/src/network/bearer/qnetworksession.h
+++ b/src/network/bearer/qnetworksession.h
@@ -71,6 +71,7 @@ class QNetworkSessionPrivate;
class QNetworkSessionExport QNetworkSession : public QObject
{
Q_OBJECT
+
public:
enum State {
Invalid = 0,
@@ -89,7 +90,8 @@ public:
OperationNotSupportedError,
InvalidConfigurationError
};
- explicit QNetworkSession(const QNetworkConfiguration& connConfig, QObject* parent =0);
+
+ explicit QNetworkSession(const QNetworkConfiguration &connConfig, QObject *parent = 0);
virtual ~QNetworkSession();
bool isOpen() const;
@@ -101,8 +103,8 @@ public:
State state() const;
SessionError error() const;
QString errorString() const;
- QVariant sessionProperty(const QString& key) const;
- void setSessionProperty(const QString& key, const QVariant& value);
+ QVariant sessionProperty(const QString &key) const;
+ void setSessionProperty(const QString &key, const QVariant &value);
quint64 bytesWritten() const;
quint64 bytesReceived() const;
@@ -121,13 +123,12 @@ public Q_SLOTS:
void accept();
void reject();
-
Q_SIGNALS:
void stateChanged(QNetworkSession::State);
void opened();
void closed();
void error(QNetworkSession::SessionError);
- void preferredConfigurationChanged(const QNetworkConfiguration& config, bool isSeamless);
+ void preferredConfigurationChanged(const QNetworkConfiguration &config, bool isSeamless);
void newConfigurationActivated();
protected:
@@ -135,9 +136,9 @@ protected:
virtual void disconnectNotify(const char *signal);
private:
- QNetworkSessionPrivate* d;
friend class QNetworkSessionPrivate;
- };
+ QNetworkSessionPrivate *d;
+};
#ifndef QT_MOBILITY_BEARER
QT_END_NAMESPACE
@@ -149,4 +150,4 @@ QT_END_HEADER
#endif // QT_NO_BEARERMANAGEMENT
-#endif //QNETWORKSESSION_H
+#endif // QNETWORKSESSION_H
diff --git a/src/network/bearer/qnetworksession_p.h b/src/network/bearer/qnetworksession_p.h
index c7b5718..943841f 100644
--- a/src/network/bearer/qnetworksession_p.h
+++ b/src/network/bearer/qnetworksession_p.h
@@ -67,14 +67,11 @@ class Q_NETWORK_EXPORT QNetworkSessionPrivate : public QObject
friend class QNetworkSession;
public:
- QNetworkSessionPrivate()
- : state(QNetworkSession::Invalid), isOpen(false)
- {
- }
-
+ QNetworkSessionPrivate() : QObject(),
+ state(QNetworkSession::Invalid), isOpen(false)
+ {}
virtual ~QNetworkSessionPrivate()
- {
- }
+ {}
//called by QNetworkSession constructor and ensures
//that the state is immediately updated (w/o actually opening
@@ -85,14 +82,14 @@ public:
#ifndef QT_NO_NETWORKINTERFACE
virtual QNetworkInterface currentInterface() const = 0;
#endif
- virtual QVariant sessionProperty(const QString& key) const = 0;
- virtual void setSessionProperty(const QString& key, const QVariant& value) = 0;
+ virtual QVariant sessionProperty(const QString &key) const = 0;
+ virtual void setSessionProperty(const QString &key, const QVariant &value) = 0;
virtual void open() = 0;
virtual void close() = 0;
virtual void stop() = 0;
- virtual void setALREnabled(bool /*enabled*/) { }
+ virtual void setALREnabled(bool /*enabled*/) {}
virtual void migrate() = 0;
virtual void accept() = 0;
virtual void ignore() = 0;
@@ -150,5 +147,4 @@ QT_END_NAMESPACE
#endif // QT_NO_BEARERMANAGEMENT
-#endif //QNETWORKSESSIONPRIVATE_H
-
+#endif // QNETWORKSESSIONPRIVATE_H
diff --git a/src/network/socket/qlocalsocket_win.cpp b/src/network/socket/qlocalsocket_win.cpp
index 1e0bced..5b42578 100644
--- a/src/network/socket/qlocalsocket_win.cpp
+++ b/src/network/socket/qlocalsocket_win.cpp
@@ -322,9 +322,9 @@ bool QLocalSocketPrivate::completeAsyncRead()
// buffer. We will read the remaining data in the next call.
break;
case ERROR_PIPE_NOT_CONNECTED:
- setErrorString(QLatin1String("QLocalSocketPrivate::completeAsyncRead"));
- // fall through
+ return false;
default:
+ setErrorString(QLatin1String("QLocalSocketPrivate::completeAsyncRead"));
return false;
}
}
diff --git a/src/network/socket/qnativesocketengine_unix.cpp b/src/network/socket/qnativesocketengine_unix.cpp
index aa55009..44c691c 100644
--- a/src/network/socket/qnativesocketengine_unix.cpp
+++ b/src/network/socket/qnativesocketengine_unix.cpp
@@ -203,9 +203,6 @@ bool QNativeSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType soc
return false;
}
- // Ensure that the socket is closed on exec*().
- ::fcntl(socket, F_SETFD, FD_CLOEXEC);
-
socketDescriptor = socket;
return true;
}
@@ -614,16 +611,6 @@ int QNativeSocketEnginePrivate::nativeAccept()
#else
int acceptedDescriptor = qt_safe_accept(socketDescriptor, 0, 0);
#endif
- //check if we have valid descriptor at all
- if(acceptedDescriptor > 0) {
- // Ensure that the socket is closed on exec*()
- ::fcntl(acceptedDescriptor, F_SETFD, FD_CLOEXEC);
- }
-#ifdef Q_OS_SYMBIAN
- else {
- qWarning("QNativeSocketEnginePrivate::nativeAccept() - acceptedDescriptor <= 0");
- }
-#endif
return acceptedDescriptor;
}
diff --git a/src/network/ssl/qsslcertificate.cpp b/src/network/ssl/qsslcertificate.cpp
index a3ea555..275c7be 100644
--- a/src/network/ssl/qsslcertificate.cpp
+++ b/src/network/ssl/qsslcertificate.cpp
@@ -716,7 +716,7 @@ QSslCertificate QSslCertificatePrivate::QSslCertificate_from_X509(X509 *x509)
static bool matchLineFeed(const QByteArray &pem, int *offset)
{
- char ch;
+ char ch = 0;
// ignore extra whitespace at the end of the line
while (*offset < pem.size() && (ch = pem.at(*offset)) == ' ')
diff --git a/src/opengl/gl2paintengineex/qglengineshadermanager.cpp b/src/opengl/gl2paintengineex/qglengineshadermanager.cpp
index 93ff3f4..0723c28 100644
--- a/src/opengl/gl2paintengineex/qglengineshadermanager.cpp
+++ b/src/opengl/gl2paintengineex/qglengineshadermanager.cpp
@@ -42,6 +42,7 @@
#include "qglengineshadermanager_p.h"
#include "qglengineshadersource_p.h"
#include "qpaintengineex_opengl2_p.h"
+#include "qglshadercache_p.h"
#if defined(QT_DEBUG)
#include <QMetaEnum>
@@ -170,64 +171,92 @@ QGLEngineSharedShaders::QGLEngineSharedShaders(const QGLContext* context)
QGLShader* fragShader;
QGLShader* vertexShader;
- QByteArray source;
+ QByteArray vertexSource;
+ QByteArray fragSource;
// Compile up the simple shader:
- source.clear();
- source.append(qShaderSnippets[MainVertexShader]);
- source.append(qShaderSnippets[PositionOnlyVertexShader]);
- vertexShader = new QGLShader(QGLShader::Vertex, context, 0);
- shaders.append(vertexShader);
- if (!vertexShader->compileSourceCode(source))
- qWarning("Vertex shader for simpleShaderProg (MainVertexShader & PositionOnlyVertexShader) failed to compile");
-
- source.clear();
- source.append(qShaderSnippets[MainFragmentShader]);
- source.append(qShaderSnippets[ShockingPinkSrcFragmentShader]);
- fragShader = new QGLShader(QGLShader::Fragment, context, 0);
- shaders.append(fragShader);
- if (!fragShader->compileSourceCode(source))
- qWarning("Fragment shader for simpleShaderProg (MainFragmentShader & ShockingPinkSrcFragmentShader) failed to compile");
+ vertexSource.append(qShaderSnippets[MainVertexShader]);
+ vertexSource.append(qShaderSnippets[PositionOnlyVertexShader]);
+
+ fragSource.append(qShaderSnippets[MainFragmentShader]);
+ fragSource.append(qShaderSnippets[ShockingPinkSrcFragmentShader]);
simpleShaderProg = new QGLShaderProgram(context, 0);
- simpleShaderProg->addShader(vertexShader);
- simpleShaderProg->addShader(fragShader);
- simpleShaderProg->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
- simpleShaderProg->bindAttributeLocation("pmvMatrix1", QT_PMV_MATRIX_1_ATTR);
- simpleShaderProg->bindAttributeLocation("pmvMatrix2", QT_PMV_MATRIX_2_ATTR);
- simpleShaderProg->bindAttributeLocation("pmvMatrix3", QT_PMV_MATRIX_3_ATTR);
+
+ CachedShader simpleShaderCache(fragSource, vertexSource);
+
+ bool inCache = simpleShaderCache.load(simpleShaderProg, context);
+
+ if (!inCache) {
+ vertexShader = new QGLShader(QGLShader::Vertex, context, 0);
+ shaders.append(vertexShader);
+ if (!vertexShader->compileSourceCode(vertexSource))
+ qWarning("Vertex shader for simpleShaderProg (MainVertexShader & PositionOnlyVertexShader) failed to compile");
+
+ fragShader = new QGLShader(QGLShader::Fragment, context, 0);
+ shaders.append(fragShader);
+ if (!fragShader->compileSourceCode(fragSource))
+ qWarning("Fragment shader for simpleShaderProg (MainFragmentShader & ShockingPinkSrcFragmentShader) failed to compile");
+
+ simpleShaderProg->addShader(vertexShader);
+ simpleShaderProg->addShader(fragShader);
+
+ simpleShaderProg->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
+ simpleShaderProg->bindAttributeLocation("pmvMatrix1", QT_PMV_MATRIX_1_ATTR);
+ simpleShaderProg->bindAttributeLocation("pmvMatrix2", QT_PMV_MATRIX_2_ATTR);
+ simpleShaderProg->bindAttributeLocation("pmvMatrix3", QT_PMV_MATRIX_3_ATTR);
+ }
+
simpleShaderProg->link();
- if (!simpleShaderProg->isLinked()) {
+
+ if (simpleShaderProg->isLinked()) {
+ if (!inCache)
+ simpleShaderCache.store(simpleShaderProg, context);
+ } else {
qCritical() << "Errors linking simple shader:"
<< simpleShaderProg->log();
}
// Compile the blit shader:
- source.clear();
- source.append(qShaderSnippets[MainWithTexCoordsVertexShader]);
- source.append(qShaderSnippets[UntransformedPositionVertexShader]);
- vertexShader = new QGLShader(QGLShader::Vertex, context, 0);
- shaders.append(vertexShader);
- if (!vertexShader->compileSourceCode(source))
- qWarning("Vertex shader for blitShaderProg (MainWithTexCoordsVertexShader & UntransformedPositionVertexShader) failed to compile");
-
- source.clear();
- source.append(qShaderSnippets[MainFragmentShader]);
- source.append(qShaderSnippets[ImageSrcFragmentShader]);
- fragShader = new QGLShader(QGLShader::Fragment, context, 0);
- shaders.append(fragShader);
- if (!fragShader->compileSourceCode(source))
- qWarning("Fragment shader for blitShaderProg (MainFragmentShader & ImageSrcFragmentShader) failed to compile");
+ vertexSource.clear();
+ vertexSource.append(qShaderSnippets[MainWithTexCoordsVertexShader]);
+ vertexSource.append(qShaderSnippets[UntransformedPositionVertexShader]);
+
+ fragSource.clear();
+ fragSource.append(qShaderSnippets[MainFragmentShader]);
+ fragSource.append(qShaderSnippets[ImageSrcFragmentShader]);
blitShaderProg = new QGLShaderProgram(context, 0);
- blitShaderProg->addShader(vertexShader);
- blitShaderProg->addShader(fragShader);
- blitShaderProg->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR);
- blitShaderProg->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
+
+ CachedShader blitShaderCache(fragSource, vertexSource);
+
+ inCache = blitShaderCache.load(blitShaderProg, context);
+
+ if (!inCache) {
+ vertexShader = new QGLShader(QGLShader::Vertex, context, 0);
+ shaders.append(vertexShader);
+ if (!vertexShader->compileSourceCode(vertexSource))
+ qWarning("Vertex shader for blitShaderProg (MainWithTexCoordsVertexShader & UntransformedPositionVertexShader) failed to compile");
+
+ fragShader = new QGLShader(QGLShader::Fragment, context, 0);
+ shaders.append(fragShader);
+ if (!fragShader->compileSourceCode(fragSource))
+ qWarning("Fragment shader for blitShaderProg (MainFragmentShader & ImageSrcFragmentShader) failed to compile");
+
+ blitShaderProg->addShader(vertexShader);
+ blitShaderProg->addShader(fragShader);
+
+ blitShaderProg->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR);
+ blitShaderProg->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
+ }
+
blitShaderProg->link();
- if (!blitShaderProg->isLinked()) {
+ if (blitShaderProg->isLinked()) {
+ if (!inCache)
+ blitShaderCache.store(blitShaderProg, context);
+ } else {
qCritical() << "Errors linking blit shader:"
- << simpleShaderProg->log();
+ << blitShaderProg->log();
}
#ifdef QT_GL_SHARED_SHADER_DEBUG
@@ -279,101 +308,110 @@ QGLEngineShaderProg *QGLEngineSharedShaders::findProgramInCache(const QGLEngineS
}
}
- QGLShader *vertexShader = 0;
- QGLShader *fragShader = 0;
- QGLEngineShaderProg *newProg = 0;
- bool success = false;
+ QScopedPointer<QGLEngineShaderProg> newProg;
do {
- QByteArray source;
+ QByteArray fragSource;
// Insert the custom stage before the srcPixel shader to work around an ATI driver bug
// where you cannot forward declare a function that takes a sampler as argument.
if (prog.srcPixelFragShader == CustomImageSrcFragmentShader)
- source.append(prog.customStageSource);
- source.append(qShaderSnippets[prog.mainFragShader]);
- source.append(qShaderSnippets[prog.srcPixelFragShader]);
+ fragSource.append(prog.customStageSource);
+ fragSource.append(qShaderSnippets[prog.mainFragShader]);
+ fragSource.append(qShaderSnippets[prog.srcPixelFragShader]);
if (prog.compositionFragShader)
- source.append(qShaderSnippets[prog.compositionFragShader]);
+ fragSource.append(qShaderSnippets[prog.compositionFragShader]);
if (prog.maskFragShader)
- source.append(qShaderSnippets[prog.maskFragShader]);
- fragShader = new QGLShader(QGLShader::Fragment, ctxGuard.context(), 0);
- shaders.append(fragShader);
- QByteArray description;
+ fragSource.append(qShaderSnippets[prog.maskFragShader]);
+
+ QByteArray vertexSource;
+ vertexSource.append(qShaderSnippets[prog.mainVertexShader]);
+ vertexSource.append(qShaderSnippets[prog.positionVertexShader]);
+
+ QScopedPointer<QGLShaderProgram> shaderProgram(new QGLShaderProgram(ctxGuard.context(), 0));
+
+ CachedShader shaderCache(fragSource, vertexSource);
+ bool inCache = shaderCache.load(shaderProgram.data(), ctxGuard.context());
+
+ if (!inCache) {
+
+ QScopedPointer<QGLShader> fragShader(new QGLShader(QGLShader::Fragment, ctxGuard.context(), 0));
+ QByteArray description;
#if defined(QT_DEBUG)
- // Name the shader for easier debugging
- description.append("Fragment shader: main=");
- description.append(snippetNameStr(prog.mainFragShader));
- description.append(", srcPixel=");
- description.append(snippetNameStr(prog.srcPixelFragShader));
- if (prog.compositionFragShader) {
- description.append(", composition=");
- description.append(snippetNameStr(prog.compositionFragShader));
- }
- if (prog.maskFragShader) {
- description.append(", mask=");
- description.append(snippetNameStr(prog.maskFragShader));
- }
- fragShader->setObjectName(QString::fromLatin1(description));
+ // Name the shader for easier debugging
+ description.append("Fragment shader: main=");
+ description.append(snippetNameStr(prog.mainFragShader));
+ description.append(", srcPixel=");
+ description.append(snippetNameStr(prog.srcPixelFragShader));
+ if (prog.compositionFragShader) {
+ description.append(", composition=");
+ description.append(snippetNameStr(prog.compositionFragShader));
+ }
+ if (prog.maskFragShader) {
+ description.append(", mask=");
+ description.append(snippetNameStr(prog.maskFragShader));
+ }
+ fragShader->setObjectName(QString::fromLatin1(description));
#endif
- if (!fragShader->compileSourceCode(source)) {
- qWarning() << "Warning:" << description << "failed to compile!";
- break;
- }
+ if (!fragShader->compileSourceCode(fragSource)) {
+ qWarning() << "Warning:" << description << "failed to compile!";
+ break;
+ }
- source.clear();
- source.append(qShaderSnippets[prog.mainVertexShader]);
- source.append(qShaderSnippets[prog.positionVertexShader]);
- vertexShader = new QGLShader(QGLShader::Vertex, ctxGuard.context(), 0);
- shaders.append(vertexShader);
+ QScopedPointer<QGLShader> vertexShader(new QGLShader(QGLShader::Vertex, ctxGuard.context(), 0));
#if defined(QT_DEBUG)
- // Name the shader for easier debugging
- description.clear();
- description.append("Vertex shader: main=");
- description.append(snippetNameStr(prog.mainVertexShader));
- description.append(", position=");
- description.append(snippetNameStr(prog.positionVertexShader));
- vertexShader->setObjectName(QString::fromLatin1(description));
+ // Name the shader for easier debugging
+ description.clear();
+ description.append("Vertex shader: main=");
+ description.append(snippetNameStr(prog.mainVertexShader));
+ description.append(", position=");
+ description.append(snippetNameStr(prog.positionVertexShader));
+ vertexShader->setObjectName(QString::fromLatin1(description));
#endif
- if (!vertexShader->compileSourceCode(source)) {
- qWarning() << "Warning:" << description << "failed to compile!";
- break;
- }
+ if (!vertexShader->compileSourceCode(vertexSource)) {
+ qWarning() << "Warning:" << description << "failed to compile!";
+ break;
+ }
- newProg = new QGLEngineShaderProg(prog);
-
- // If the shader program's not found in the cache, create it now.
- newProg->program = new QGLShaderProgram(ctxGuard.context(), 0);
- newProg->program->addShader(vertexShader);
- newProg->program->addShader(fragShader);
-
- // We have to bind the vertex attribute names before the program is linked:
- newProg->program->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
- if (newProg->useTextureCoords)
- newProg->program->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR);
- if (newProg->useOpacityAttribute)
- newProg->program->bindAttributeLocation("opacityArray", QT_OPACITY_ATTR);
- if (newProg->usePmvMatrixAttribute) {
- newProg->program->bindAttributeLocation("pmvMatrix1", QT_PMV_MATRIX_1_ATTR);
- newProg->program->bindAttributeLocation("pmvMatrix2", QT_PMV_MATRIX_2_ATTR);
- newProg->program->bindAttributeLocation("pmvMatrix3", QT_PMV_MATRIX_3_ATTR);
+ shaders.append(vertexShader.data());
+ shaders.append(fragShader.data());
+ shaderProgram->addShader(vertexShader.take());
+ shaderProgram->addShader(fragShader.take());
+
+ // We have to bind the vertex attribute names before the program is linked:
+ shaderProgram->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
+ if (prog.useTextureCoords)
+ shaderProgram->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR);
+ if (prog.useOpacityAttribute)
+ shaderProgram->bindAttributeLocation("opacityArray", QT_OPACITY_ATTR);
+ if (prog.usePmvMatrixAttribute) {
+ shaderProgram->bindAttributeLocation("pmvMatrix1", QT_PMV_MATRIX_1_ATTR);
+ shaderProgram->bindAttributeLocation("pmvMatrix2", QT_PMV_MATRIX_2_ATTR);
+ shaderProgram->bindAttributeLocation("pmvMatrix3", QT_PMV_MATRIX_3_ATTR);
+ }
}
+ newProg.reset(new QGLEngineShaderProg(prog));
+ newProg->program = shaderProgram.take();
+
newProg->program->link();
- if (!newProg->program->isLinked()) {
+ if (newProg->program->isLinked()) {
+ if (!inCache)
+ shaderCache.store(newProg->program, ctxGuard.context());
+ } else {
QLatin1String none("none");
QLatin1String br("\n");
QString error;
- error = QLatin1String("Shader program failed to link,")
+ error = QLatin1String("Shader program failed to link,");
#if defined(QT_DEBUG)
- + br
- + QLatin1String(" Shaders Used:") + br
- + QLatin1String(" ") + vertexShader->objectName() + QLatin1String(": ") + br
- + QLatin1String(vertexShader->sourceCode()) + br
- + QLatin1String(" ") + fragShader->objectName() + QLatin1String(": ") + br
- + QLatin1String(fragShader->sourceCode()) + br
+ error += QLatin1String("\n Shaders Used:\n");
+ for (int i = 0; i < newProg->program->shaders().count(); ++i) {
+ QGLShader *shader = newProg->program->shaders().at(i);
+ error += QLatin1String(" ") + shader->objectName() + QLatin1String(": \n")
+ + QLatin1String(shader->sourceCode()) + br;
+ }
#endif
- + QLatin1String(" Error Log:\n")
- + QLatin1String(" ") + newProg->program->log();
+ error += QLatin1String(" Error Log:\n")
+ + QLatin1String(" ") + newProg->program->log();
qWarning() << error;
break;
}
@@ -395,26 +433,10 @@ QGLEngineShaderProg *QGLEngineSharedShaders::findProgramInCache(const QGLEngineS
}
}
- cachedPrograms.insert(0, newProg);
-
- success = true;
+ cachedPrograms.insert(0, newProg.data());
} while (false);
- // Clean up everything if we weren't successful
- if (!success) {
- if (newProg) {
- delete newProg; // Also deletes the QGLShaderProgram which in turn deletes the QGLShaders
- newProg = 0;
- }
- else {
- if (vertexShader)
- delete vertexShader;
- if (fragShader)
- delete fragShader;
- }
- }
-
- return newProg;
+ return newProg.take();
}
void QGLEngineSharedShaders::cleanupCustomStage(QGLCustomShaderStage* stage)
diff --git a/src/opengl/gl2paintengineex/qglshadercache_meego_p.h b/src/opengl/gl2paintengineex/qglshadercache_meego_p.h
new file mode 100644
index 0000000..5f51fc2
--- /dev/null
+++ b/src/opengl/gl2paintengineex/qglshadercache_meego_p.h
@@ -0,0 +1,457 @@
+/****************************************************************************
+**
+** 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 QtOpenGL 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$
+**
+****************************************************************************/
+
+//
+// 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.
+//
+
+#ifndef QGLSHADERCACHE_MEEGO_P_H
+#define QGLSHADERCACHE_MEEGO_P_H
+
+#include <QtCore/qglobal.h>
+
+#if defined(QT_MEEGO_EXPERIMENTAL_SHADERCACHE) && defined(QT_OPENGL_ES_2)
+
+#include <QtCore/qcryptographichash.h>
+#include <QtCore/qsharedmemory.h>
+#include <QtCore/qsystemsemaphore.h>
+
+#ifndef QT_BOOTSTRAPPED
+# include <GLES2/gl2ext.h>
+#endif
+#if defined(QT_DEBUG) || defined(QT_MEEGO_EXPERIMENTAL_SHADERCACHE_TRACE)
+# include <syslog.h>
+#endif
+
+QT_BEGIN_HEADER
+
+/*
+ This cache stores internal Qt shader programs in shared memory.
+
+ This header file is ugly on purpose and can only be included once. It is only to be used
+ for the internal shader cache, not as a generic cache for anyone's shaders.
+
+ The cache stores either ShaderCacheMaxEntries shader programs or ShaderCacheDataSize kilobytes
+ of shader programs, whatever limit is reached first.
+
+ The layout of the cache is as outlined in the CachedShaders struct. After some
+ integers, an array of headers is reserved, then comes the space for the actual binaries.
+
+ Shader Programs are identified by the md5sum of their frag and vertex shader source code.
+
+ Shader Programs are never removed. The cache never shrinks or re-shuffles. This is done
+ on purpose to ensure minimum amount of locking, no alignment problems and very few write
+ operations.
+
+ Note: Locking the shader cache could be expensive, because the entire system might hang.
+ That's why the cache is immutable to minimize the time we need to keep it locked.
+
+ Why is it Meego specific?
+
+ First, the size is chosen so that it fits to generic meego usage. Second, on Meego, there's
+ always at least one Qt application active (the launcher), so the cache will never be destroyed.
+ Only when the last Qt app exits, the cache dies, which should only be when someone kills the
+ X11 server. And last but not least it was only tested with Meego's SGX driver.
+
+ There's a small tool in src/opengl/util/meego that dumps the contents of the cache.
+ */
+
+// anonymous namespace, prevent exporting of the private symbols
+namespace
+{
+
+struct CachedShaderHeader
+{
+ /* the index in the data[] member of CachedShaders */
+ int index;
+ /* the size of the binary shader */
+ GLsizei size;
+ /* the format of the binary shader */
+ GLenum format;
+ /* the md5sum of the frag+vertex shaders */
+ char md5Sum[16];
+};
+
+enum
+{
+ /* The maximum amount of shader programs the cache can hold */
+ ShaderCacheMaxEntries = 20
+};
+
+typedef CachedShaderHeader CachedShaderHeaders[ShaderCacheMaxEntries];
+
+enum
+{
+ // ShaderCacheDataSize is 20k minus the other data members of CachedShaders
+ ShaderCacheDataSize = 1024 * ShaderCacheMaxEntries - sizeof(CachedShaderHeaders) - 2 * sizeof(int)
+};
+
+struct CachedShaders
+{
+ /* How much space is still available in the cache */
+ inline int availableSize() const { return ShaderCacheDataSize - dataSize; }
+
+ /* The current amount of cached shaders */
+ int shaderCount;
+
+ /* The current amount (in bytes) of cached data */
+ int dataSize;
+
+ /* The headers describing the shaders */
+ CachedShaderHeaders headers;
+
+ /* The actual binary data of the shader programs */
+ char data[ShaderCacheDataSize];
+};
+
+//#define QT_DEBUG_SHADER_CACHE
+#ifdef QT_DEBUG_SHADER_CACHE
+static QDebug shaderCacheDebug()
+{
+ return QDebug(QtDebugMsg);
+}
+#else
+static inline QNoDebug shaderCacheDebug() { return QNoDebug(); }
+#endif
+
+class ShaderCacheSharedMemory
+{
+public:
+ ShaderCacheSharedMemory()
+ : shm(QLatin1String("qt_gles2_shadercache_" QT_VERSION_STR))
+ {
+ // we need a system semaphore here, since cache creation and initialization must be atomic
+ QSystemSemaphore attachSemaphore(QLatin1String("qt_gles2_shadercache_mutex_" QT_VERSION_STR), 1);
+
+ if (!attachSemaphore.acquire()) {
+ shaderCacheDebug() << "Unable to require shader cache semaphore:" << attachSemaphore.errorString();
+ return;
+ }
+
+ if (shm.attach()) {
+ // success!
+ shaderCacheDebug() << "Attached to shader cache";
+ } else {
+
+ // no cache exists - create and initialize it
+ if (shm.create(sizeof(CachedShaders))) {
+ shaderCacheDebug() << "Created new shader cache";
+ initializeCache();
+ } else {
+ shaderCacheDebug() << "Unable to create shader cache:" << shm.errorString();
+ }
+ }
+
+ attachSemaphore.release();
+ }
+
+ inline bool isAttached() const { return shm.isAttached(); }
+
+ inline bool lock() { return shm.lock(); }
+ inline bool unlock() { return shm.unlock(); }
+ inline void *data() { return shm.data(); }
+ inline QString errorString() { return shm.errorString(); }
+
+ ~ShaderCacheSharedMemory()
+ {
+ if (!shm.detach())
+ shaderCacheDebug() << "Unable to detach shader cache" << shm.errorString();
+ }
+
+private:
+ void initializeCache()
+ {
+ // no need to lock the shared memory since we're already protected by the
+ // attach system semaphore.
+
+ void *data = shm.data();
+ Q_ASSERT(data);
+
+ memset(data, 0, sizeof(CachedShaders));
+ }
+
+ QSharedMemory shm;
+};
+
+class ShaderCacheLocker
+{
+public:
+ inline ShaderCacheLocker(ShaderCacheSharedMemory *cache)
+ : shm(cache->lock() ? cache : (ShaderCacheSharedMemory *)0)
+ {
+ if (!shm)
+ shaderCacheDebug() << "Unable to lock shader cache" << cache->errorString();
+ }
+
+ inline bool isLocked() const { return shm; }
+
+ inline ~ShaderCacheLocker()
+ {
+ if (!shm)
+ return;
+ if (!shm->unlock())
+ shaderCacheDebug() << "Unable to unlock shader cache" << shm->errorString();
+ }
+
+private:
+ ShaderCacheSharedMemory *shm;
+};
+
+#ifdef QT_BOOTSTRAPPED
+} // end namespace
+#else
+
+static void traceCacheOverflow(const char *message)
+{
+#if defined(QT_DEBUG) || defined (QT_MEEGO_EXPERIMENTAL_SHADERCACHE_TRACE)
+ openlog(qPrintable(QCoreApplication::applicationName()), LOG_PID | LOG_ODELAY, LOG_USER);
+ syslog(LOG_DEBUG, message);
+ closelog();
+#endif
+ shaderCacheDebug() << message;
+}
+
+Q_GLOBAL_STATIC(ShaderCacheSharedMemory, shaderCacheSharedMemory)
+
+/*
+ Finds the index of the shader program identified by md5Sum in the cache.
+ Note: Does NOT lock the cache for reading, the cache must already be locked!
+
+ Returns -1 when no shader was found.
+ */
+static int qt_cache_index_unlocked(const QByteArray &md5Sum, CachedShaders *cache)
+{
+ for (int i = 0; i < cache->shaderCount; ++i) {
+ if (qstrncmp(md5Sum.constData(), cache->headers[i].md5Sum, 16) == 0) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/* Returns the index of the shader identified by md5Sum */
+static int qt_cache_index(const QByteArray &md5Sum)
+{
+ ShaderCacheSharedMemory *shm = shaderCacheSharedMemory();
+ if (!shm || !shm->isAttached())
+ return false;
+
+ Q_ASSERT(md5Sum.length() == 16);
+
+ ShaderCacheLocker locker(shm);
+ if (!locker.isLocked())
+ return false;
+
+ void *data = shm->data();
+ Q_ASSERT(data);
+
+ CachedShaders *cache = reinterpret_cast<CachedShaders *>(data);
+
+ return qt_cache_index_unlocked(md5Sum, cache);
+}
+
+/* Loads the cached shader at index \a shaderIndex into \a program
+ * Note: Since the cache is immutable, this operation doesn't lock the shared memory.
+ */
+static bool qt_cached_shader(QGLShaderProgram *program, const QGLContext *ctx, int shaderIndex)
+{
+ Q_ASSERT(shaderIndex >= 0 && shaderIndex <= ShaderCacheMaxEntries);
+ Q_ASSERT(program);
+
+ ShaderCacheSharedMemory *shm = shaderCacheSharedMemory();
+ if (!shm || !shm->isAttached())
+ return false;
+
+ void *data = shm->data();
+ Q_ASSERT(data);
+
+ CachedShaders *cache = reinterpret_cast<CachedShaders *>(data);
+
+ shaderCacheDebug() << "fetching cached shader at index" << shaderIndex
+ << "dataIndex" << cache->headers[shaderIndex].index
+ << "size" << cache->headers[shaderIndex].size
+ << "format" << cache->headers[shaderIndex].format;
+
+ // call program->programId first, since that resolves the glProgramBinaryOES symbol
+ GLuint programId = program->programId();
+ glProgramBinaryOES(programId, cache->headers[shaderIndex].format,
+ cache->data + cache->headers[shaderIndex].index,
+ cache->headers[shaderIndex].size);
+
+ return true;
+}
+
+/* Stores the shader program in the cache. Returns false if there's an error with the cache, or
+ if the cache is too small to hold the shader. */
+static bool qt_cache_shader(const QGLShaderProgram *shader, const QGLContext *ctx, const QByteArray &md5Sum)
+{
+ ShaderCacheSharedMemory *shm = shaderCacheSharedMemory();
+ if (!shm || !shm->isAttached())
+ return false;
+
+ void *data = shm->data();
+ Q_ASSERT(data);
+
+ CachedShaders *cache = reinterpret_cast<CachedShaders *>(data);
+
+ ShaderCacheLocker locker(shm);
+ if (!locker.isLocked())
+ return false;
+
+ int cacheIdx = cache->shaderCount;
+ if (cacheIdx >= ShaderCacheMaxEntries) {
+ traceCacheOverflow("Qt OpenGL shader cache index overflow!");
+ return false;
+ }
+
+ // now that we have the lock on the shared memory, make sure no one
+ // inserted the shader already while we were unlocked
+ if (qt_cache_index_unlocked(md5Sum, cache) != -1)
+ return true; // already cached
+
+ shaderCacheDebug() << "Caching shader at index" << cacheIdx;
+
+ GLint binaryLength = 0;
+ glGetProgramiv(shader->programId(), GL_PROGRAM_BINARY_LENGTH_OES, &binaryLength);
+
+ if (!binaryLength) {
+ shaderCacheDebug() << "Unable to determine binary shader size!";
+ return false;
+ }
+
+ if (binaryLength > cache->availableSize()) {
+ traceCacheOverflow("Qt OpenGL shader cache data overflow!");
+ return false;
+ }
+
+ GLsizei size = 0;
+ GLenum format = 0;
+ glGetProgramBinaryOES(shader->programId(), binaryLength, &size, &format,
+ cache->data + cache->dataSize);
+
+ if (!size) {
+ shaderCacheDebug() << "Unable to get binary shader!";
+ return false;
+ }
+
+ cache->headers[cacheIdx].index = cache->dataSize;
+ cache->dataSize += binaryLength;
+ ++cache->shaderCount;
+ cache->headers[cacheIdx].size = binaryLength;
+ cache->headers[cacheIdx].format = format;
+
+ memcpy(cache->headers[cacheIdx].md5Sum, md5Sum.constData(), 16);
+
+ shaderCacheDebug() << "cached shader size" << size
+ << "format" << format
+ << "binarySize" << binaryLength
+ << "cache index" << cacheIdx
+ << "data index" << cache->headers[cacheIdx].index;
+
+ return true;
+}
+
+} // namespace
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(OpenGL)
+
+class CachedShader
+{
+public:
+ CachedShader(const QByteArray &fragSource, const QByteArray &vertexSource)
+ : cacheIdx(-1)
+ {
+ QCryptographicHash md5Hash(QCryptographicHash::Md5);
+
+ md5Hash.addData(fragSource);
+ md5Hash.addData(vertexSource);
+
+ md5Sum = md5Hash.result();
+ }
+
+ bool isCached()
+ {
+ return cacheIndex() != -1;
+ }
+
+ int cacheIndex()
+ {
+ if (cacheIdx != -1)
+ return cacheIdx;
+ cacheIdx = qt_cache_index(md5Sum);
+ return cacheIdx;
+ }
+
+ bool load(QGLShaderProgram *program, const QGLContext *ctx)
+ {
+ if (cacheIndex() == -1)
+ return false;
+ return qt_cached_shader(program, ctx, cacheIdx);
+ }
+
+ bool store(QGLShaderProgram *program, const QGLContext *ctx)
+ {
+ return qt_cache_shader(program, ctx, md5Sum);
+ }
+
+private:
+ QByteArray md5Sum;
+ int cacheIdx;
+};
+
+
+QT_END_NAMESPACE
+
+#endif
+
+QT_END_HEADER
+
+#endif
+#endif
diff --git a/src/opengl/gl2paintengineex/qglshadercache_p.h b/src/opengl/gl2paintengineex/qglshadercache_p.h
new file mode 100644
index 0000000..29616ae
--- /dev/null
+++ b/src/opengl/gl2paintengineex/qglshadercache_p.h
@@ -0,0 +1,98 @@
+/****************************************************************************
+**
+** 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 QtOpenGL 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$
+**
+****************************************************************************/
+
+//
+// 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.
+//
+
+#ifndef QGLSHADERCACHE_P_H
+#define QGLSHADERCACHE_P_H
+
+#include <QtCore/qglobal.h>
+
+#if defined(QT_MEEGO_EXPERIMENTAL_SHADERCACHE) && defined(QT_OPENGL_ES_2)
+# include "qglshadercache_meego_p.h"
+#else
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(OpenGL)
+
+class QGLShaderProgram;
+class QGLContext;
+
+class CachedShader
+{
+public:
+ inline CachedShader(const QByteArray &, const QByteArray &)
+ {}
+
+ inline bool isCached()
+ {
+ return false;
+ }
+
+ inline bool load(QGLShaderProgram *, const QGLContext *)
+ {
+ return false;
+ }
+
+ inline bool store(QGLShaderProgram *, const QGLContext *)
+ {
+ return false;
+ }
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif
+#endif
diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp
index 735aab1..cf63626 100644
--- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp
+++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp
@@ -163,6 +163,8 @@ void QGL2PaintEngineExPrivate::setBrush(const QBrush& brush)
Q_ASSERT(newStyle != Qt::NoBrush);
currentBrush = brush;
+ if (!currentBrushPixmap.isNull())
+ currentBrushPixmap = QPixmap();
brushUniformsDirty = true; // All brushes have at least one uniform
if (newStyle > Qt::SolidPattern)
@@ -221,10 +223,14 @@ void QGL2PaintEngineExPrivate::updateBrushTexture()
updateTextureFilter(GL_TEXTURE_2D, GL_CLAMP_TO_EDGE, q->state()->renderHints & QPainter::SmoothPixmapTransform);
}
else if (style == Qt::TexturePattern) {
- const QPixmap& texPixmap = currentBrush.texture();
+ currentBrushPixmap = currentBrush.texture();
+
+ int max_texture_size = ctx->d_func()->maxTextureSize();
+ if (currentBrushPixmap.width() > max_texture_size || currentBrushPixmap.height() > max_texture_size)
+ currentBrushPixmap = currentBrushPixmap.scaled(max_texture_size, max_texture_size, Qt::KeepAspectRatio);
glActiveTexture(GL_TEXTURE0 + QT_BRUSH_TEXTURE_UNIT);
- QGLTexture *tex = ctx->d_func()->bindTexture(texPixmap, GL_TEXTURE_2D, GL_RGBA,
+ QGLTexture *tex = ctx->d_func()->bindTexture(currentBrushPixmap, GL_TEXTURE_2D, GL_RGBA,
QGLContext::InternalBindOption |
QGLContext::CanFlipNativePixmapBindOption);
updateTextureFilter(GL_TEXTURE_2D, GL_REPEAT, q->state()->renderHints & QPainter::SmoothPixmapTransform);
@@ -381,12 +387,6 @@ void QGL2PaintEngineExPrivate::updateMatrix()
dx = ceilf(dx - 0.5f);
dy = ceilf(dy - 0.5f);
}
-#ifndef Q_OS_SYMBIAN
- if (addOffset) {
- dx += 0.49f;
- dy += 0.49f;
- }
-#endif
pmvMatrix[0][0] = (wfactor * transform.m11()) - transform.m13();
pmvMatrix[1][0] = (wfactor * transform.m21()) - transform.m23();
pmvMatrix[2][0] = (wfactor * dx) - transform.m33();
@@ -488,11 +488,6 @@ void QGL2PaintEngineExPrivate::drawTexture(const QGLRect& dest, const QGLRect& s
currentBrush = noBrush;
shaderManager->setSrcPixelType(pattern ? QGLEngineShaderManager::PatternSrc : QGLEngineShaderManager::ImageSrc);
- if (addOffset) {
- addOffset = false;
- matrixDirty = true;
- }
-
if (snapToPixelGrid) {
snapToPixelGrid = false;
matrixDirty = true;
@@ -675,16 +670,6 @@ void QGL2PaintEngineExPrivate::fill(const QVectorPath& path)
{
transferMode(BrushDrawingMode);
- const QOpenGL2PaintEngineState *s = q->state();
- const bool newAddOffset = !(s->renderHints & QPainter::Antialiasing) &&
- (qbrush_style(currentBrush) == Qt::SolidPattern) &&
- !multisamplingAlwaysEnabled;
-
- if (addOffset != newAddOffset) {
- addOffset = newAddOffset;
- matrixDirty = true;
- }
-
if (snapToPixelGrid) {
snapToPixelGrid = false;
matrixDirty = true;
@@ -1203,12 +1188,6 @@ void QGL2PaintEngineEx::stroke(const QVectorPath &path, const QPen &pen)
void QGL2PaintEngineExPrivate::stroke(const QVectorPath &path, const QPen &pen)
{
const QOpenGL2PaintEngineState *s = q->state();
- const bool newAddOffset = !(s->renderHints & QPainter::Antialiasing) && !multisamplingAlwaysEnabled;
- if (addOffset != newAddOffset) {
- addOffset = newAddOffset;
- matrixDirty = true;
- }
-
if (snapToPixelGrid) {
snapToPixelGrid = false;
matrixDirty = true;
@@ -1334,13 +1313,30 @@ void QGL2PaintEngineEx::transformChanged()
}
+static const QRectF scaleRect(const QRectF &r, qreal sx, qreal sy)
+{
+ return QRectF(r.x() * sx, r.y() * sy, r.width() * sx, r.height() * sy);
+}
+
void QGL2PaintEngineEx::drawPixmap(const QRectF& dest, const QPixmap & pixmap, const QRectF & src)
{
Q_D(QGL2PaintEngineEx);
+ QGLContext *ctx = d->ctx;
+
+ int max_texture_size = ctx->d_func()->maxTextureSize();
+ if (pixmap.width() > max_texture_size || pixmap.height() > max_texture_size) {
+ QPixmap scaled = pixmap.scaled(max_texture_size, max_texture_size, Qt::KeepAspectRatio);
+
+ const qreal sx = scaled.width() / qreal(pixmap.width());
+ const qreal sy = scaled.height() / qreal(pixmap.height());
+
+ drawPixmap(dest, scaled, scaleRect(src, sx, sy));
+ return;
+ }
+
ensureActive();
d->transferMode(ImageDrawingMode);
- QGLContext *ctx = d->ctx;
glActiveTexture(GL_TEXTURE0 + QT_IMAGE_TEXTURE_UNIT);
QGLTexture *texture =
ctx->d_func()->bindTexture(pixmap, GL_TEXTURE_2D, GL_RGBA,
@@ -1363,11 +1359,24 @@ void QGL2PaintEngineEx::drawImage(const QRectF& dest, const QImage& image, const
Qt::ImageConversionFlags)
{
Q_D(QGL2PaintEngineEx);
+ QGLContext *ctx = d->ctx;
+
+ int max_texture_size = ctx->d_func()->maxTextureSize();
+ if (image.width() > max_texture_size || image.height() > max_texture_size) {
+ QImage scaled = image.scaled(max_texture_size, max_texture_size, Qt::KeepAspectRatio);
+
+ const qreal sx = scaled.width() / qreal(image.width());
+ const qreal sy = scaled.height() / qreal(image.height());
+
+ drawImage(dest, scaled, scaleRect(src, sx, sy));
+ return;
+ }
+
ensureActive();
d->transferMode(ImageDrawingMode);
- QGLContext *ctx = d->ctx;
glActiveTexture(GL_TEXTURE0 + QT_IMAGE_TEXTURE_UNIT);
+
QGLTexture *texture = ctx->d_func()->bindTexture(image, GL_TEXTURE_2D, GL_RGBA, QGLContext::InternalBindOption);
GLuint id = texture->id;
@@ -1493,6 +1502,7 @@ namespace {
QSize cacheSize;
QGL2PEXVertexArray vertexCoordinateArray;
QGL2PEXVertexArray textureCoordinateArray;
+ QFontEngineGlyphCache::Type glyphType;
};
}
@@ -1507,23 +1517,30 @@ void QGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type glyp
QOpenGL2PaintEngineState *s = q->state();
void *cacheKey = const_cast<QGLContext *>(QGLContextPrivate::contextGroup(ctx)->context());
+ bool recreateVertexArrays = false;
+
QGLTextureGlyphCache *cache =
(QGLTextureGlyphCache *) staticTextItem->fontEngine()->glyphCache(cacheKey, glyphType, QTransform());
if (!cache || cache->cacheType() != glyphType || cache->context() == 0) {
cache = new QGLTextureGlyphCache(ctx, glyphType, QTransform());
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);
}
- bool recreateVertexArrays = false;
- if (staticTextItem->userDataNeedsUpdate)
+ if (staticTextItem->userDataNeedsUpdate) {
recreateVertexArrays = true;
- else if (staticTextItem->userData() == 0)
+ } else if (staticTextItem->userData() == 0) {
recreateVertexArrays = true;
- else if (staticTextItem->userData()->type != QStaticTextUserData::OpenGLUserData)
+ } else if (staticTextItem->userData()->type != QStaticTextUserData::OpenGLUserData) {
recreateVertexArrays = true;
+ } else {
+ QOpenGLStaticTextUserData *userData = static_cast<QOpenGLStaticTextUserData *>(staticTextItem->userData());
+ if (userData->glyphType != glyphType)
+ recreateVertexArrays = true;
+ }
// We only need to update the cache with new glyphs if we are actually going to recreate the vertex arrays.
// If the cache size has changed, we do need to regenerate the vertices, but we don't need to repopulate the
@@ -1562,6 +1579,8 @@ void QGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type glyp
userData = static_cast<QOpenGLStaticTextUserData*>(staticTextItem->userData());
}
+ userData->glyphType = glyphType;
+
// Use cache if backend optimizations is turned on
vertexCoordinates = &userData->vertexCoordinateArray;
textureCoordinates = &userData->textureCoordinateArray;
@@ -1628,10 +1647,6 @@ void QGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type glyp
setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, (GLfloat*)vertexCoordinates->data());
setVertexAttributePointer(QT_TEXTURE_COORDS_ATTR, (GLfloat*)textureCoordinates->data());
- if (addOffset) {
- addOffset = false;
- matrixDirty = true;
- }
if (!snapToPixelGrid) {
snapToPixelGrid = true;
matrixDirty = true;
@@ -1761,7 +1776,13 @@ void QGL2PaintEngineEx::drawPixmapFragments(const QPainter::PixmapFragment *frag
}
ensureActive();
- d->drawPixmapFragments(fragments, fragmentCount, pixmap, hints);
+ int max_texture_size = d->ctx->d_func()->maxTextureSize();
+ if (pixmap.width() > max_texture_size || pixmap.height() > max_texture_size) {
+ QPixmap scaled = pixmap.scaled(max_texture_size, max_texture_size, Qt::KeepAspectRatio);
+ d->drawPixmapFragments(fragments, fragmentCount, scaled, hints);
+ } else {
+ d->drawPixmapFragments(fragments, fragmentCount, pixmap, hints);
+ }
}
@@ -1776,11 +1797,6 @@ void QGL2PaintEngineExPrivate::drawPixmapFragments(const QPainter::PixmapFragmen
textureCoordinateArray.clear();
opacityArray.reset();
- if (addOffset) {
- addOffset = false;
- matrixDirty = true;
- }
-
if (snapToPixelGrid) {
snapToPixelGrid = false;
matrixDirty = true;
@@ -2077,10 +2093,6 @@ void QGL2PaintEngineExPrivate::writeClip(const QVectorPath &path, uint value)
{
transferMode(BrushDrawingMode);
- if (addOffset) {
- addOffset = false;
- matrixDirty = true;
- }
if (snapToPixelGrid) {
snapToPixelGrid = false;
matrixDirty = true;
@@ -2173,7 +2185,11 @@ void QGL2PaintEngineEx::clip(const QVectorPath &path, Qt::ClipOperation op)
const QPointF* const points = reinterpret_cast<const QPointF*>(path.points());
QRectF rect(points[0], points[2]);
- if (state()->matrix.type() <= QTransform::TxScale) {
+ if (state()->matrix.type() <= QTransform::TxScale
+ || (state()->matrix.type() == QTransform::TxRotate
+ && qFuzzyIsNull(state()->matrix.m11())
+ && qFuzzyIsNull(state()->matrix.m22())))
+ {
state()->rectangleClip = state()->rectangleClip.intersected(state()->matrix.mapRect(rect).toRect());
d->updateClipScissorTest();
return;
diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h b/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h
index b255e75..e99101c 100644
--- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h
+++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h
@@ -181,7 +181,6 @@ public:
elementIndicesVBOId(0),
opacityArray(0),
snapToPixelGrid(false),
- addOffset(false),
nativePaintingActive(false),
inverseScale(1),
lastMaskTextureUsed(0)
@@ -274,6 +273,8 @@ public:
QBrush currentBrush; // May not be the state's brush!
const QBrush noBrush;
+ QPixmap currentBrushPixmap;
+
QGL2PEXVertexArray vertexCoordinateArray;
QGL2PEXVertexArray textureCoordinateArray;
QVector<GLushort> elementIndices;
@@ -283,7 +284,6 @@ public:
GLfloat staticTextureCoordinateArray[8];
bool snapToPixelGrid;
- bool addOffset; // When enabled, adds a 0.49,0.49 offset to matrix in updateMatrix
bool nativePaintingActive;
GLfloat pmvMatrix[3][3];
GLfloat inverseScale;
diff --git a/src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp b/src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp
index 538b09e..a5e2bd1 100644
--- a/src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp
+++ b/src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp
@@ -124,14 +124,17 @@ void QGLTextureGlyphCache::createTextureData(int width, int height)
glyphTexture->m_width = width;
glyphTexture->m_height = height;
- QVarLengthArray<uchar> data(width * height);
- for (int i = 0; i < data.size(); ++i)
- data[i] = 0;
-
- if (m_type == QFontEngineGlyphCache::Raster_RGBMask)
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, &data[0]);
- else
+ if (m_type == QFontEngineGlyphCache::Raster_RGBMask) {
+ QVarLengthArray<uchar> data(width * height * 4);
+ for (int i = 0; i < data.size(); ++i)
+ data[i] = 0;
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, &data[0]);
+ } else {
+ QVarLengthArray<uchar> data(width * height);
+ for (int i = 0; i < data.size(); ++i)
+ data[i] = 0;
glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, width, height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, &data[0]);
+ }
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
@@ -324,7 +327,7 @@ void QGLTextureGlyphCache::fillTexture(const Coord &c, glyph_t glyph, QFixed sub
if (mask.format() == QImage::Format_RGB32) {
glTexSubImage2D(GL_TEXTURE_2D, 0, c.x, c.y, maskWidth, maskHeight, GL_BGRA, GL_UNSIGNED_BYTE, mask.bits());
} else {
-#ifdef QT_OPENGL_ES2
+#ifdef QT_OPENGL_ES_2
glTexSubImage2D(GL_TEXTURE_2D, 0, c.x, c.y, maskWidth, maskHeight, GL_ALPHA, GL_UNSIGNED_BYTE, mask.bits());
#else
// glTexSubImage2D() might cause some garbage to appear in the texture if the mask width is
@@ -359,6 +362,9 @@ int QGLTextureGlyphCache::maxTextureHeight() const
{
if (ctx == 0)
return QImageTextureGlyphCache::maxTextureHeight();
+
+ if (ctx->d_ptr->workaround_brokenTexSubImage)
+ return qMin(1024, ctx->d_ptr->maxTextureSize());
else
return ctx->d_ptr->maxTextureSize();
}
diff --git a/src/opengl/opengl.pro b/src/opengl/opengl.pro
index 682e620..a089d55 100644
--- a/src/opengl/opengl.pro
+++ b/src/opengl/opengl.pro
@@ -60,7 +60,9 @@ SOURCES += qgl.cpp \
gl2paintengineex/qglcustomshaderstage_p.h \
gl2paintengineex/qtriangulatingstroker_p.h \
gl2paintengineex/qtriangulator_p.h \
- gl2paintengineex/qtextureglyphcache_gl_p.h
+ gl2paintengineex/qtextureglyphcache_gl_p.h \
+ gl2paintengineex/qglshadercache_p.h \
+ gl2paintengineex/qglshadercache_meego_p.h
SOURCES += qglshaderprogram.cpp \
qglpixmapfilter.cpp \
diff --git a/src/opengl/qgl.cpp b/src/opengl/qgl.cpp
index dc7a333..e9e8880 100644
--- a/src/opengl/qgl.cpp
+++ b/src/opengl/qgl.cpp
@@ -1729,6 +1729,7 @@ void QGLContextPrivate::init(QPaintDevice *dev, const QGLFormat &format)
active_engine = 0;
workaround_needsFullClearOnEveryFrame = false;
workaround_brokenFBOReadBack = false;
+ workaround_brokenTexSubImage = false;
workaroundsCached = false;
workaround_brokenTextureFromPixmap = false;
@@ -1853,18 +1854,6 @@ QGLTextureCache::~QGLTextureCache()
void QGLTextureCache::insert(QGLContext* ctx, qint64 key, QGLTexture* texture, int cost)
{
QWriteLocker locker(&m_lock);
- if (m_cache.totalCost() + cost > m_cache.maxCost()) {
- // the cache is full - make an attempt to remove something
- const QList<QGLTextureCacheKey> keys = m_cache.keys();
- int i = 0;
- while (i < m_cache.count()
- && (m_cache.totalCost() + cost > m_cache.maxCost())) {
- QGLTexture *tex = m_cache.object(keys.at(i));
- if (tex->context == ctx)
- m_cache.remove(keys.at(i));
- ++i;
- }
- }
const QGLTextureCacheKey cacheKey = {key, QGLContextPrivate::contextGroup(ctx)};
m_cache.insert(cacheKey, texture, cost);
}
@@ -2125,7 +2114,9 @@ void QGLContextPrivate::cleanup()
void QGLContextPrivate::setVertexAttribArrayEnabled(int arrayIndex, bool enabled)
{
Q_ASSERT(arrayIndex < QT_GL_VERTEX_ARRAY_TRACKED_COUNT);
+#ifdef glEnableVertexAttribArray
Q_ASSERT(glEnableVertexAttribArray);
+#endif
if (vertexAttributeArraysEnabledState[arrayIndex] && !enabled)
glDisableVertexAttribArray(arrayIndex);
@@ -2138,7 +2129,9 @@ void QGLContextPrivate::setVertexAttribArrayEnabled(int arrayIndex, bool enabled
void QGLContextPrivate::syncGlState()
{
+#ifdef glEnableVertexAttribArray
Q_ASSERT(glEnableVertexAttribArray);
+#endif
for (int i = 0; i < QT_GL_VERTEX_ARRAY_TRACKED_COUNT; ++i) {
if (vertexAttributeArraysEnabledState[i])
glEnableVertexAttribArray(i);
diff --git a/src/opengl/qgl_egl.cpp b/src/opengl/qgl_egl.cpp
index 8902099..6f9e39c 100644
--- a/src/opengl/qgl_egl.cpp
+++ b/src/opengl/qgl_egl.cpp
@@ -204,6 +204,8 @@ void QGLContext::makeCurrent()
const char *egl_version = eglQueryString(d->eglContext->display(), EGL_VERSION);
if (egl_version && strstr(egl_version, "1.3"))
d->workaround_brokenFBOReadBack = true;
+ else if (egl_version && strstr(egl_version, "1.4"))
+ d->workaround_brokenTexSubImage = true;
}
}
}
diff --git a/src/opengl/qgl_p.h b/src/opengl/qgl_p.h
index 547e457..ca8bc55 100644
--- a/src/opengl/qgl_p.h
+++ b/src/opengl/qgl_p.h
@@ -409,6 +409,7 @@ public:
// workarounds for driver/hw bugs on different platforms
uint workaround_needsFullClearOnEveryFrame : 1;
uint workaround_brokenFBOReadBack : 1;
+ uint workaround_brokenTexSubImage : 1;
uint workaroundsCached : 1;
uint workaround_brokenTextureFromPixmap : 1;
@@ -509,6 +510,7 @@ Q_SIGNALS:
private slots:
void freeTexture_slot(QGLContext *context, QPixmapData *boundPixmap, GLuint id) {
+ Q_UNUSED(boundPixmap);
#if defined(Q_WS_X11)
if (boundPixmap) {
QGLContext *oldContext = const_cast<QGLContext *>(QGLContext::currentContext());
diff --git a/src/opengl/qgl_x11egl.cpp b/src/opengl/qgl_x11egl.cpp
index 21b1ab6..b323d29 100644
--- a/src/opengl/qgl_x11egl.cpp
+++ b/src/opengl/qgl_x11egl.cpp
@@ -345,7 +345,7 @@ void QGLWidgetPrivate::recreateEglSurface()
// old surface before re-creating a new one. Note: This should not be the case as the
// surface should be deleted before the old window id.
if (glcx->d_func()->eglSurface != EGL_NO_SURFACE && (currentId != eglSurfaceWindowId)) {
- qWarning("EGL surface for deleted window %lx was not destroyed", eglSurfaceWindowId);
+ qWarning("EGL surface for deleted window %lx was not destroyed", uint(eglSurfaceWindowId));
glcx->d_func()->destroyEglSurfaceForDevice();
}
diff --git a/src/opengl/qglpixelbuffer_egl.cpp b/src/opengl/qglpixelbuffer_egl.cpp
index 0b94f5a..2d9f6f1 100644
--- a/src/opengl/qglpixelbuffer_egl.cpp
+++ b/src/opengl/qglpixelbuffer_egl.cpp
@@ -74,7 +74,6 @@ bool QGLPixelBufferPrivate::init(const QSize &size, const QGLFormat &f, QGLWidge
// Use the same configuration as the widget we are sharing with.
ctx->setConfig(shareContext->config());
#if QGL_RENDER_TEXTURE
- EGLint value = EGL_FALSE;
if (ctx->configAttrib(EGL_BIND_TO_TEXTURE_RGBA) == EGL_TRUE)
textureFormat = EGL_TEXTURE_RGBA;
else if (ctx->configAttrib(EGL_BIND_TO_TEXTURE_RGB) == EGL_TRUE)
diff --git a/src/opengl/qglshaderprogram.cpp b/src/opengl/qglshaderprogram.cpp
index 74382b0..1f39884 100644
--- a/src/opengl/qglshaderprogram.cpp
+++ b/src/opengl/qglshaderprogram.cpp
@@ -260,10 +260,27 @@ bool QGLShaderPrivate::compile(QGLShader *q)
glGetShaderInfoLog(shader, value, &len, logbuf);
log = QString::fromLatin1(logbuf);
QString name = q->objectName();
+
+ char *types[] = {
+ "Fragment",
+ "Vertex",
+ "Geometry",
+ ""
+ };
+
+ char *type = types[3];
+ if (shaderType == QGLShader::Fragment)
+ type = types[0];
+ else if (shaderType == QGLShader::Vertex)
+ type = types[1];
+ else if (shaderType == QGLShader::Geometry)
+ type = types[2];
+
if (name.isEmpty())
- qWarning() << "QGLShader::compile:" << log;
+ qWarning("QGLShader::compile(%s): %s", type, qPrintable(log));
else
- qWarning() << "QGLShader::compile[" << name << "]:" << log;
+ qWarning("QGLShader::compile(%s)[%s]: %s", type, qPrintable(name), qPrintable(log));
+
delete [] logbuf;
}
return compiled;
diff --git a/src/opengl/qwindowsurface_gl.cpp b/src/opengl/qwindowsurface_gl.cpp
index cd7558c..6185ff8 100644
--- a/src/opengl/qwindowsurface_gl.cpp
+++ b/src/opengl/qwindowsurface_gl.cpp
@@ -285,6 +285,7 @@ struct QGLWindowSurfacePrivate
int tried_pb : 1;
int destructive_swap_buffers : 1;
int geometry_updated : 1;
+ int did_paint : 1;
QGLContext *ctx;
@@ -348,6 +349,7 @@ QGLWindowSurface::QGLWindowSurface(QWidget *window)
d_ptr->glDevice.d = d_ptr;
d_ptr->q_ptr = this;
d_ptr->geometry_updated = false;
+ d_ptr->did_paint = false;
}
QGLWindowSurface::~QGLWindowSurface()
@@ -404,7 +406,18 @@ void QGLWindowSurface::hijackWindow(QWidget *widget)
if (!d_ptr->fbo && d_ptr->tried_fbo)
d_ptr->ctx = ctx;
#else
- QGLContext *ctx = new QGLContext(surfaceFormat, widget);
+ QGLContext *ctx = NULL;
+
+ // For translucent top-level widgets we need alpha in the format.
+ if (widget->testAttribute(Qt::WA_TranslucentBackground)) {
+ QGLFormat modFormat(surfaceFormat);
+ modFormat.setSampleBuffers(false);
+ modFormat.setSamples(0);
+ modFormat.setAlpha(true);
+ ctx = new QGLContext(modFormat, widget);
+ } else
+ ctx = new QGLContext(surfaceFormat, widget);
+
ctx->create(qt_gl_share_widget()->context());
#endif
@@ -480,6 +493,8 @@ void QGLWindowSurface::beginPaint(const QRegion &)
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(clearFlags);
}
+
+ d_ptr->did_paint = true;
}
void QGLWindowSurface::endPaint(const QRegion &rgn)
@@ -532,6 +547,13 @@ void QGLWindowSurface::flush(QWidget *widget, const QRegion &rgn, const QPoint &
if (d_ptr->geometry_updated)
return;
+ // did_paint is set to true in ::beginPaint. ::beginPaint means that we
+ // at least cleared the background (= painted something). In EGL API it's a
+ // mistakte to call swapBuffers if nothing was painted. This check protects
+ // the flush func from being executed if it's for nothing.
+ if (!d_ptr->did_paint)
+ return;
+
QWidget *parent = widget->internalWinId() ? widget : widget->nativeParentWidget();
Q_ASSERT(parent);
@@ -760,6 +782,8 @@ void QGLWindowSurface::flush(QWidget *widget, const QRegion &rgn, const QPoint &
ctx->swapBuffers();
else
glFlush();
+
+ d_ptr->did_paint = false;
}
diff --git a/src/opengl/util/meego/main.cpp b/src/opengl/util/meego/main.cpp
new file mode 100644
index 0000000..5522855
--- /dev/null
+++ b/src/opengl/util/meego/main.cpp
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** 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 QtOpenGL 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 <QtCore/qdebug.h>
+
+#define QT_DEBUG_SHADER_CACHE
+#define QT_MEEGO_EXPERIMENTAL_SHADERCACHE
+#define QT_OPENGL_ES_2
+#define QT_BOOTSTRAPPED
+
+typedef int GLsizei;
+typedef unsigned int GLenum;
+
+#include "../../gl2paintengineex/qglshadercache_meego_p.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+int main()
+{
+ ShaderCacheSharedMemory shm;
+
+ if (!shm.isAttached()) {
+ fprintf(stderr, "Unable to attach to shared memory\n");
+ return EXIT_FAILURE;
+ }
+
+ ShaderCacheLocker locker(&shm);
+ if (!locker.isLocked()) {
+ fprintf(stderr, "Unable to lock shared memory\n");
+ return EXIT_FAILURE;
+ }
+
+ void *data = shm.data();
+ Q_ASSERT(data);
+
+ CachedShaders *cache = reinterpret_cast<CachedShaders *>(data);
+
+ for (int i = 0; i < cache->shaderCount; ++i) {
+ printf("Shader %d: %d bytes\n", i, cache->headers[i].size);
+ }
+
+ printf("\nSummary:\n\n"
+ " Amount of cached shaders: %d\n"
+ " Bytes used: %d\n"
+ " Bytes available: %d\n",
+ cache->shaderCount, cache->dataSize, cache->availableSize());
+
+ return EXIT_SUCCESS;
+}
+
diff --git a/src/opengl/util/meego/shader-cache-introspector.pro b/src/opengl/util/meego/shader-cache-introspector.pro
new file mode 100644
index 0000000..520e9a5
--- /dev/null
+++ b/src/opengl/util/meego/shader-cache-introspector.pro
@@ -0,0 +1,7 @@
+TEMPLATE = app
+
+SOURCES += main.cpp
+
+TARGET = shader-cache-introspector
+
+QT = core
diff --git a/src/openvg/qpaintengine_vg.cpp b/src/openvg/qpaintengine_vg.cpp
index b8e8bad..13156d7 100644
--- a/src/openvg/qpaintengine_vg.cpp
+++ b/src/openvg/qpaintengine_vg.cpp
@@ -3210,8 +3210,7 @@ void QVGPaintEngine::drawTiledPixmap
(const QRectF &r, const QPixmap &pixmap, const QPointF &s)
{
QBrush brush(state()->pen.color(), pixmap);
- QTransform xform;
- xform.translate(-s.x(), -s.y());
+ QTransform xform = QTransform::fromTranslate(r.x() - s.x(), r.y() - s.y());
brush.setTransform(xform);
fillRect(r, brush);
}
diff --git a/src/plugins/bearer/connman/qconnmanengine.cpp b/src/plugins/bearer/connman/qconnmanengine.cpp
index 184ceb4..7f3501e 100644
--- a/src/plugins/bearer/connman/qconnmanengine.cpp
+++ b/src/plugins/bearer/connman/qconnmanengine.cpp
@@ -726,6 +726,7 @@ void QConnmanEngine::addNetworkConfiguration(const QString &networkPath)
if(servicePath.isEmpty()) {
id = QString::number(qHash(networkPath));
+ serv = 0;
} else {
id = QString::number(qHash(servicePath));
serv = new QConnmanServiceInterface(servicePath,this);
diff --git a/src/plugins/bearer/connman/qconnmanservice_linux.cpp b/src/plugins/bearer/connman/qconnmanservice_linux.cpp
index b66298e..98b3663 100644
--- a/src/plugins/bearer/connman/qconnmanservice_linux.cpp
+++ b/src/plugins/bearer/connman/qconnmanservice_linux.cpp
@@ -216,7 +216,6 @@ void QConnmanManagerInterface::registerCounter(const QString &path, quint32 inte
{ QDBusReply<QList<QDBusObjectPath> > reply = this->call(QLatin1String("RegisterCounter"),
QVariant::fromValue(path),
QVariant::fromValue(interval));
- bool ok = true;
if(reply.error().type() == QDBusError::InvalidArgs) {
qWarning() << reply.error().message();
}
@@ -225,7 +224,6 @@ void QConnmanManagerInterface::registerCounter(const QString &path, quint32 inte
void QConnmanManagerInterface::unregisterCounter(const QString &path)
{ QDBusReply<QList<QDBusObjectPath> > reply = this->call(QLatin1String("UnregisterCounter"),
QVariant::fromValue(path));
- bool ok = true;
if(reply.error().type() == QDBusError::InvalidArgs) {
qWarning() << reply.error().message();
}
diff --git a/src/plugins/bearer/icd/proxyconf.cpp b/src/plugins/bearer/icd/proxyconf.cpp
index e5c8f4e..efe2da7 100644
--- a/src/plugins/bearer/icd/proxyconf.cpp
+++ b/src/plugins/bearer/icd/proxyconf.cpp
@@ -142,16 +142,23 @@ QHash<QString,QVariant> GConfItemFast::getEntries() const
-class NetworkProxyFactory : QNetworkProxyFactory {
+class NetworkProxyFactory : QNetworkProxyFactory
+{
+ ProxyConf proxy_conf;
+ bool proxy_data_read;
+
public:
- NetworkProxyFactory() { }
+ NetworkProxyFactory() : proxy_data_read(false) { }
QList<QNetworkProxy> queryProxy(const QNetworkProxyQuery &query = QNetworkProxyQuery());
};
QList<QNetworkProxy> NetworkProxyFactory::queryProxy(const QNetworkProxyQuery &query)
{
- ProxyConf proxy_conf;
+ if (proxy_data_read == false) {
+ proxy_data_read = true;
+ proxy_conf.readProxyData();
+ }
QList<QNetworkProxy> result = proxy_conf.flush(query);
if (result.isEmpty())
@@ -299,12 +306,12 @@ QList<QNetworkProxy> ProxyConfPrivate::flush(const QNetworkProxyQuery &query)
if (isHostExcluded(query.peerHostName()))
return result; // no proxy for this host
- if (mode == "auto") {
+ if (mode == QLatin1String("AUTO")) {
// TODO: pac currently not supported, fix me
return result;
}
- if (mode == "manual") {
+ if (mode == QLatin1String("MANUAL")) {
bool isHttps = false;
QString protocol = query.protocolTag().toLower();
@@ -377,10 +384,13 @@ ProxyConf::~ProxyConf()
delete d_ptr;
}
+void ProxyConf::readProxyData()
+{
+ d_ptr->readProxyData();
+}
QList<QNetworkProxy> ProxyConf::flush(const QNetworkProxyQuery &query)
{
- d_ptr->readProxyData();
return d_ptr->flush(query);
}
diff --git a/src/plugins/bearer/icd/proxyconf.h b/src/plugins/bearer/icd/proxyconf.h
index 884cc5c..eedbbf2 100644
--- a/src/plugins/bearer/icd/proxyconf.h
+++ b/src/plugins/bearer/icd/proxyconf.h
@@ -58,6 +58,7 @@ public:
virtual ~ProxyConf();
QList<QNetworkProxy> flush(const QNetworkProxyQuery &query = QNetworkProxyQuery()); // read the proxies from db
+ void readProxyData();
/* Note that for each update() call there should be corresponding
* clear() call because the ProxyConf class implements a reference
diff --git a/src/plugins/bearer/icd/qicdengine.cpp b/src/plugins/bearer/icd/qicdengine.cpp
index bdf4e2e..96827f3 100644
--- a/src/plugins/bearer/icd/qicdengine.cpp
+++ b/src/plugins/bearer/icd/qicdengine.cpp
@@ -229,7 +229,7 @@ void IapMonitor::iapRemoved(const QString &iap_id)
/******************************************************************************/
QIcdEngine::QIcdEngine(QObject *parent)
-: QBearerEngine(parent), iapMonitor(0), m_dbusInterface(0),
+: QBearerEngine(parent), iapMonitor(0), m_dbusInterface(0), m_icdServiceWatcher(0),
firstUpdate(true), m_scanGoingOn(false)
{
}
@@ -248,9 +248,10 @@ QNetworkConfigurationManager::Capabilities QIcdEngine::capabilities() const
QNetworkConfigurationManager::NetworkSessionRequired;
}
-void QIcdEngine::initialize()
+bool QIcdEngine::ensureDBusConnection()
{
- QMutexLocker locker(&mutex);
+ if (m_dbusInterface)
+ return true;
// Setup DBus Interface for ICD
m_dbusInterface = new QDBusInterface(ICD_DBUS_API_INTERFACE,
@@ -259,9 +260,22 @@ void QIcdEngine::initialize()
QDBusConnection::systemBus(),
this);
- // abort if cannot connect to DBus.
- if (!m_dbusInterface->isValid())
- return;
+ if (!m_dbusInterface->isValid()) {
+ delete m_dbusInterface;
+ m_dbusInterface = 0;
+
+ if (!m_icdServiceWatcher) {
+ m_icdServiceWatcher = new QDBusServiceWatcher(ICD_DBUS_API_INTERFACE,
+ QDBusConnection::systemBus(),
+ QDBusServiceWatcher::WatchForOwnerChange,
+ this);
+
+ connect(m_icdServiceWatcher, SIGNAL(serviceOwnerChanged(QString,QString,QString)),
+ this, SLOT(icdServiceOwnerChanged(QString,QString,QString)));
+ }
+
+ return false;
+ }
connect(&m_scanTimer, SIGNAL(timeout()), this, SLOT(finishAsyncConfigurationUpdate()));
m_scanTimer.setSingleShot(true);
@@ -289,6 +303,19 @@ void QIcdEngine::initialize()
doRequestUpdate();
getIcdInitialState();
+
+ return true;
+}
+
+void QIcdEngine::initialize()
+{
+ QMutexLocker locker(&mutex);
+
+ if (!ensureDBusConnection()) {
+ locker.unlock();
+ emit updateCompleted();
+ locker.relock();
+ }
}
static inline QString network_attrs_to_security(uint network_attrs)
@@ -792,6 +819,9 @@ QNetworkConfigurationPrivatePointer QIcdEngine::defaultConfiguration()
{
QMutexLocker locker(&mutex);
+ if (!ensureDBusConnection())
+ return QNetworkConfigurationPrivatePointer();
+
// Here we just return [ANY] request to icd and let the icd decide which IAP to connect.
return userChoiceConfigurations.value(OSSO_IAP_ANY);
}
@@ -933,13 +963,55 @@ void QIcdEngine::connectionStateSignalsSlot(QDBusMessage msg)
locker.relock();
}
+void QIcdEngine::icdServiceOwnerChanged(const QString &serviceName, const QString &oldOwner,
+ const QString &newOwner)
+{
+ Q_UNUSED(serviceName);
+ Q_UNUSED(oldOwner);
+
+ QMutexLocker locker(&mutex);
+
+ if (newOwner.isEmpty()) {
+ // Disconnected from ICD, remove all configurations
+ cleanup();
+ delete iapMonitor;
+ iapMonitor = 0;
+ delete m_dbusInterface;
+ m_dbusInterface = 0;
+
+ QMutableHashIterator<QString, QNetworkConfigurationPrivatePointer> i(accessPointConfigurations);
+ while (i.hasNext()) {
+ i.next();
+
+ QNetworkConfigurationPrivatePointer ptr = i.value();
+ i.remove();
+
+ locker.unlock();
+ emit configurationRemoved(ptr);
+ locker.relock();
+ }
+
+ userChoiceConfigurations.clear();
+ } else {
+ // Connected to ICD ensure connection.
+ ensureDBusConnection();
+ }
+}
+
void QIcdEngine::requestUpdate()
{
QMutexLocker locker(&mutex);
- if (m_scanGoingOn) {
+ if (!ensureDBusConnection()) {
+ locker.unlock();
+ emit updateCompleted();
+ locker.relock();
return;
}
+
+ if (m_scanGoingOn)
+ return;
+
m_scanGoingOn = true;
m_dbusInterface->connection().connect(ICD_DBUS_API_INTERFACE,
@@ -956,14 +1028,16 @@ void QIcdEngine::requestUpdate()
void QIcdEngine::cancelAsyncConfigurationUpdate()
{
- if (!m_scanGoingOn) {
+ if (!ensureDBusConnection())
return;
- }
+
+ if (!m_scanGoingOn)
+ return;
+
m_scanGoingOn = false;
- if (m_scanTimer.isActive()) {
+ if (m_scanTimer.isActive())
m_scanTimer.stop();
- }
m_dbusInterface->connection().disconnect(ICD_DBUS_API_INTERFACE,
ICD_DBUS_API_PATH,
diff --git a/src/plugins/bearer/icd/qicdengine.h b/src/plugins/bearer/icd/qicdengine.h
index d528f15..d5b4fb3 100644
--- a/src/plugins/bearer/icd/qicdengine.h
+++ b/src/plugins/bearer/icd/qicdengine.h
@@ -53,6 +53,7 @@ QT_BEGIN_NAMESPACE
class QNetworkConfigurationPrivate;
class IapMonitor;
class QDBusInterface;
+class QDBusServiceWatcher;
inline QNetworkConfiguration::BearerType bearerTypeFromIapType(const QString &iapType)
{
@@ -147,12 +148,15 @@ private Q_SLOTS:
void finishAsyncConfigurationUpdate();
void asyncUpdateConfigurationsSlot(QDBusMessage msg);
void connectionStateSignalsSlot(QDBusMessage msg);
+ void icdServiceOwnerChanged(const QString &serviceName, const QString &oldOwner,
+ const QString &newOwner);
private:
void startListeningStateSignalsForAllConnections();
void doRequestUpdate(QList<Maemo::IcdScanResult> scanned = QList<Maemo::IcdScanResult>());
void cancelAsyncConfigurationUpdate();
void getIcdInitialState();
+ bool ensureDBusConnection();
private:
IapMonitor *iapMonitor;
@@ -162,6 +166,8 @@ private:
QStringList m_typesToBeScanned;
QList<Maemo::IcdScanResult> m_scanResult;
+ QDBusServiceWatcher *m_icdServiceWatcher;
+
bool firstUpdate;
bool m_scanGoingOn;
};
diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp
index 554f9b7..f93b605 100644
--- a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp
+++ b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp
@@ -743,9 +743,11 @@ QNetworkConfigurationPrivate *QNetworkManagerEngine::parseConnection(const QStri
QNetworkConfigurationPrivatePointer ptr =
accessPointConfigurations.take(accessPointId);
- mutex.unlock();
- emit configurationRemoved(ptr);
- mutex.lock();
+ if (ptr) {
+ mutex.unlock();
+ emit configurationRemoved(ptr);
+ mutex.lock();
+ }
}
break;
}
diff --git a/src/plugins/bearer/platformdefs_win.h b/src/plugins/bearer/platformdefs_win.h
index 68343cf..0968e71 100644
--- a/src/plugins/bearer/platformdefs_win.h
+++ b/src/plugins/bearer/platformdefs_win.h
@@ -138,4 +138,4 @@ enum NDIS_PHYSICAL_MEDIUM {
QT_END_NAMESPACE
-#endif
+#endif // QPLATFORMDEFS_WIN_H
diff --git a/src/plugins/bearer/qbearerengine_impl.h b/src/plugins/bearer/qbearerengine_impl.h
index 6c30d0f..2325bd0 100644
--- a/src/plugins/bearer/qbearerengine_impl.h
+++ b/src/plugins/bearer/qbearerengine_impl.h
@@ -60,8 +60,8 @@ public:
DisconnectionError,
};
- QBearerEngineImpl(QObject *parent = 0) : QBearerEngine(parent) { }
- ~QBearerEngineImpl() { }
+ QBearerEngineImpl(QObject *parent = 0) : QBearerEngine(parent) {}
+ ~QBearerEngineImpl() {}
virtual void connectToId(const QString &id) = 0;
virtual void disconnectFromId(const QString &id) = 0;
@@ -81,4 +81,5 @@ Q_SIGNALS:
QT_END_NAMESPACE
#endif // QT_NO_BEARERMANAGEMENT
-#endif
+
+#endif // QBEARERENGINE_IMPL_H
diff --git a/src/plugins/bearer/qnetworksession_impl.cpp b/src/plugins/bearer/qnetworksession_impl.cpp
index ef5f347..27e14b1 100644
--- a/src/plugins/bearer/qnetworksession_impl.cpp
+++ b/src/plugins/bearer/qnetworksession_impl.cpp
@@ -45,9 +45,10 @@
#include <QtNetwork/qnetworksession.h>
#include <QtNetwork/private/qnetworkconfigmanager_p.h>
-#include <QtCore/qstringlist.h>
+#include <QtCore/qdatetime.h>
#include <QtCore/qdebug.h>
#include <QtCore/qmutex.h>
+#include <QtCore/qstringlist.h>
#ifndef QT_NO_BEARERMANAGEMENT
@@ -71,10 +72,11 @@ class QNetworkSessionManagerPrivate : public QObject
Q_OBJECT
public:
- QNetworkSessionManagerPrivate(QObject *parent = 0);
- ~QNetworkSessionManagerPrivate();
+ QNetworkSessionManagerPrivate(QObject *parent = 0) : QObject(parent) {}
+ ~QNetworkSessionManagerPrivate() {}
- void forceSessionClose(const QNetworkConfiguration &config);
+ inline void forceSessionClose(const QNetworkConfiguration &config)
+ { emit forcedSessionClose(config); }
Q_SIGNALS:
void forcedSessionClose(const QNetworkConfiguration &config);
@@ -84,20 +86,6 @@ Q_SIGNALS:
Q_GLOBAL_STATIC(QNetworkSessionManagerPrivate, sessionManager);
-QNetworkSessionManagerPrivate::QNetworkSessionManagerPrivate(QObject *parent)
-: QObject(parent)
-{
-}
-
-QNetworkSessionManagerPrivate::~QNetworkSessionManagerPrivate()
-{
-}
-
-void QNetworkSessionManagerPrivate::forceSessionClose(const QNetworkConfiguration &config)
-{
- emit forcedSessionClose(config);
-}
-
void QNetworkSessionPrivateImpl::syncStateWithInterface()
{
connect(sessionManager(), SIGNAL(forcedSessionClose(QNetworkConfiguration)),
@@ -108,8 +96,7 @@ void QNetworkSessionPrivateImpl::syncStateWithInterface()
state = QNetworkSession::Invalid;
lastError = QNetworkSession::UnknownSessionError;
- qRegisterMetaType<QBearerEngineImpl::ConnectionError>
- ("QBearerEngineImpl::ConnectionError");
+ qRegisterMetaType<QBearerEngineImpl::ConnectionError>("QBearerEngineImpl::ConnectionError");
switch (publicConfig.type()) {
case QNetworkConfiguration::InternetAccessPoint:
@@ -145,9 +132,8 @@ void QNetworkSessionPrivateImpl::open()
lastError = QNetworkSession::OperationNotSupportedError;
emit QNetworkSessionPrivate::error(lastError);
} else if (!isOpen) {
- if ((activeConfig.state() & QNetworkConfiguration::Discovered) !=
- QNetworkConfiguration::Discovered) {
- lastError =QNetworkSession::InvalidConfigurationError;
+ if ((activeConfig.state() & QNetworkConfiguration::Discovered) != QNetworkConfiguration::Discovered) {
+ lastError = QNetworkSession::InvalidConfigurationError;
state = QNetworkSession::Invalid;
emit stateChanged(state);
emit QNetworkSessionPrivate::error(lastError);
@@ -221,11 +207,10 @@ void QNetworkSessionPrivateImpl::reject()
#ifndef QT_NO_NETWORKINTERFACE
QNetworkInterface QNetworkSessionPrivateImpl::currentInterface() const
{
- if (!publicConfig.isValid() || !engine || state != QNetworkSession::Connected)
+ if (!engine || state != QNetworkSession::Connected || !publicConfig.isValid())
return QNetworkInterface();
QString interface = engine->getInterfaceFromId(activeConfig.identifier());
-
if (interface.isEmpty())
return QNetworkInterface();
return QNetworkInterface::interfaceFromName(interface);
@@ -237,10 +222,7 @@ QVariant QNetworkSessionPrivateImpl::sessionProperty(const QString &key) const
if (key == QLatin1String("AutoCloseSessionTimeout")) {
if (engine && engine->requiresPolling() &&
!(engine->capabilities() & QNetworkConfigurationManager::CanStartAndStopInterfaces)) {
- if (sessionTimeout >= 0)
- return sessionTimeout * 10000;
- else
- return -1;
+ return sessionTimeout >= 0 ? sessionTimeout * 10000 : -1;
}
}
@@ -278,7 +260,8 @@ QString QNetworkSessionPrivateImpl::errorString() const
return tr("The specified configuration cannot be used.");
case QNetworkSession::RoamingError:
return tr("Roaming was aborted or is not possible.");
-
+ default:
+ break;
}
return QString();
@@ -293,24 +276,21 @@ quint64 QNetworkSessionPrivateImpl::bytesWritten() const
{
if (engine && state == QNetworkSession::Connected)
return engine->bytesWritten(activeConfig.identifier());
- else
- return Q_UINT64_C(0);
+ return Q_UINT64_C(0);
}
quint64 QNetworkSessionPrivateImpl::bytesReceived() const
{
if (engine && state == QNetworkSession::Connected)
return engine->bytesReceived(activeConfig.identifier());
- else
- return Q_UINT64_C(0);
+ return Q_UINT64_C(0);
}
quint64 QNetworkSessionPrivateImpl::activeTime() const
{
if (state == QNetworkSession::Connected && startTime != Q_UINT64_C(0))
return QDateTime::currentDateTime().toTime_t() - startTime;
- else
- return Q_UINT64_C(0);
+ return Q_UINT64_C(0);
}
void QNetworkSessionPrivateImpl::updateStateFromServiceNetwork()
@@ -323,17 +303,15 @@ void QNetworkSessionPrivateImpl::updateStateFromServiceNetwork()
if (activeConfig != config) {
if (engine) {
- disconnect(engine,
- SIGNAL(connectionError(QString,QBearerEngineImpl::ConnectionError)),
- this,
- SLOT(connectionError(QString,QBearerEngineImpl::ConnectionError)));
+ disconnect(engine, SIGNAL(connectionError(QString,QBearerEngineImpl::ConnectionError)),
+ this, SLOT(connectionError(QString,QBearerEngineImpl::ConnectionError)));
}
activeConfig = config;
engine = getEngineFromId(activeConfig.identifier());
+
if (engine) {
- connect(engine,
- SIGNAL(connectionError(QString,QBearerEngineImpl::ConnectionError)),
+ connect(engine, SIGNAL(connectionError(QString,QBearerEngineImpl::ConnectionError)),
this, SLOT(connectionError(QString,QBearerEngineImpl::ConnectionError)),
Qt::QueuedConnection);
}
@@ -362,7 +340,6 @@ void QNetworkSessionPrivateImpl::updateStateFromActiveConfig()
return;
QNetworkSession::State oldState = state;
-
state = engine->sessionStateForId(activeConfig.identifier());
bool oldActive = isOpen;
@@ -410,8 +387,7 @@ void QNetworkSessionPrivateImpl::forcedSessionClose(const QNetworkConfiguration
}
}
-void QNetworkSessionPrivateImpl::connectionError(const QString &id,
- QBearerEngineImpl::ConnectionError error)
+void QNetworkSessionPrivateImpl::connectionError(const QString &id, QBearerEngineImpl::ConnectionError error)
{
if (activeConfig.identifier() == id) {
networkConfigurationsChanged();
@@ -443,4 +419,3 @@ void QNetworkSessionPrivateImpl::decrementTimeout()
QT_END_NAMESPACE
#endif // QT_NO_BEARERMANAGEMENT
-
diff --git a/src/plugins/bearer/qnetworksession_impl.h b/src/plugins/bearer/qnetworksession_impl.h
index a4902eb..d8f4803 100644
--- a/src/plugins/bearer/qnetworksession_impl.h
+++ b/src/plugins/bearer/qnetworksession_impl.h
@@ -58,8 +58,6 @@
#include <QtNetwork/private/qnetworkconfigmanager_p.h>
#include <QtNetwork/private/qnetworksession_p.h>
-#include <QtCore/qdatetime.h>
-
#ifndef QT_NO_BEARERMANAGEMENT
QT_BEGIN_NAMESPACE
@@ -69,15 +67,13 @@ class QBearerEngineImpl;
class QNetworkSessionPrivateImpl : public QNetworkSessionPrivate
{
Q_OBJECT
+
public:
QNetworkSessionPrivateImpl()
- : startTime(0), sessionTimeout(-1)
- {
- }
-
+ : startTime(0), sessionTimeout(-1)
+ {}
~QNetworkSessionPrivateImpl()
- {
- }
+ {}
//called by QNetworkSession constructor and ensures
//that the state is immediately updated (w/o actually opening
@@ -106,10 +102,6 @@ public:
quint64 bytesReceived() const;
quint64 activeTime() const;
-private:
- void updateStateFromServiceNetwork();
- void updateStateFromActiveConfig();
-
private Q_SLOTS:
void networkConfigurationsChanged();
void configurationChanged(QNetworkConfigurationPrivatePointer config);
@@ -118,6 +110,10 @@ private Q_SLOTS:
void decrementTimeout();
private:
+ void updateStateFromServiceNetwork();
+ void updateStateFromActiveConfig();
+
+private:
QBearerEngineImpl *engine;
quint64 startTime;
@@ -133,5 +129,4 @@ QT_END_NAMESPACE
#endif // QT_NO_BEARERMANAGEMENT
-#endif //QNETWORKSESSION_IMPL_H
-
+#endif // QNETWORKSESSION_IMPL_H
diff --git a/src/plugins/graphicssystems/meego/dithering.cpp b/src/plugins/graphicssystems/meego/dithering.cpp
index 1a2e3fa..ca303a8 100644
--- a/src/plugins/graphicssystems/meego/dithering.cpp
+++ b/src/plugins/graphicssystems/meego/dithering.cpp
@@ -154,7 +154,10 @@ unsigned short* convertRGB32_to_RGB565(const unsigned char *in, int width, int h
// Add the diffusion for this pixel we stored in the accumulator.
// >> 7 because the values in accumulator are stored * 128
- component[c] += accumulator[c][x] >> 7;
+ 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]);
@@ -172,10 +175,10 @@ unsigned short* convertRGB32_to_RGB565(const unsigned char *in, int width, int h
// Distribute the difference according to the matrix in the
// accumulation bufffer.
- ACCUMULATE(accumulator[c], x + 1, 0, width, diff * 7);
- ACCUMULATE(accumulator[c], x - 1, 1, width, diff * 3);
+ 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 * 1);
+ ACCUMULATE(accumulator[c], x + 1, 1, width, diff * 3);
}
// Write the newly produced pixel
diff --git a/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp b/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp
index 507f70b..4a86082 100644
--- a/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp
+++ b/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp
@@ -124,8 +124,10 @@ QPixmapData* QMeeGoGraphicsSystem::wrapPixmapData(QPixmapData *pmd)
void QMeeGoGraphicsSystem::setSurfaceFixedSize(int /*width*/, int /*height*/)
{
- if (QMeeGoGraphicsSystem::surfaceWasCreated)
+ if (QMeeGoGraphicsSystem::surfaceWasCreated) {
qWarning("Trying to set surface fixed size but surface already created!");
+ return;
+ }
#ifdef QT_WAS_PATCHED
QEglProperties *properties = new QEglProperties();
@@ -143,6 +145,11 @@ void QMeeGoGraphicsSystem::setSurfaceScaling(int x, int y, int width, int height
void QMeeGoGraphicsSystem::setTranslucent(bool translucent)
{
+ if (QMeeGoGraphicsSystem::surfaceWasCreated) {
+ qWarning("Trying to set translucency but surface already created!");
+ return;
+ }
+
QGLWindowSurface::surfaceFormat.setSampleBuffers(false);
QGLWindowSurface::surfaceFormat.setSamples(0);
QGLWindowSurface::surfaceFormat.setAlpha(translucent);
diff --git a/src/plugins/phonon/mmf/mmf.pro b/src/plugins/phonon/mmf/mmf.pro
index 2188505..9dccc4f 100644
--- a/src/plugins/phonon/mmf/mmf.pro
+++ b/src/plugins/phonon/mmf/mmf.pro
@@ -103,7 +103,7 @@ symbian {
exists($${EPOCROOT}epoc32/include/mw/downloadmgrclient.h) {
HEADERS += $$PHONON_MMF_DIR/download.h
SOURCES += $$PHONON_MMF_DIR/download.cpp
- LIBS += -ldownloadmgr
+ LIBS += -lDownloadMgr
DEFINES += PHONON_MMF_PROGRESSIVE_DOWNLOAD
}
}
@@ -128,7 +128,7 @@ symbian {
is_using_gnupoc {
LIBS += -laudioequalizereffect -lbassboosteffect -ldistanceattenuationeffect -ldopplerbase -leffectbase -lenvironmentalreverbeffect -llistenerdopplereffect -llistenerlocationeffect -llistenerorientationeffect -llocationbase -lloudnesseffect -lorientationbase -lsourcedopplereffect -lsourcelocationeffect -lsourceorientationeffect -lstereowideningeffect
} else {
- LIBS += -lAudioEqualizerEffect -lBassBoostEffect -lDistanceAttenuationEffect -lDopplerBase -lEffectBase -lEnvironmentalReverbEffect -lListenerDopplerEffect -lListenerLocationEffect -lListenerOrientationEffect -lLocationBase -lLoudnessEffect -lOrientationBase -lSourceDopplerEffect -lSourceLocationEffect -lSourceOrientationEffect -lStereoWideningEffect
+ LIBS += -lAudioEqualizerEffect -lBassBoostEffect -lDistanceAttenuationEffect -lDopplerbase -lEffectBase -lEnvironmentalReverbEffect -lListenerDopplerEffect -lListenerLocationEffect -lListenerOrientationEffect -lLocationBase -lLoudnessEffect -lOrientationBase -lSourceDopplerEffect -lSourceLocationEffect -lSourceOrientationEffect -lStereoWideningEffect
}
# This is needed for having the .qtplugin file properly created on Symbian.
diff --git a/src/s60installs/bwins/QtCoreu.def b/src/s60installs/bwins/QtCoreu.def
index b678b4e..84aa246 100644
--- a/src/s60installs/bwins/QtCoreu.def
+++ b/src/s60installs/bwins/QtCoreu.def
@@ -4585,4 +4585,9 @@ EXPORTS
?advance@QAnimationDriver@@QAEXXZ @ 4584 NONAME ; void QAnimationDriver::advance(void)
?start@QAnimationDriver@@AAEXXZ @ 4585 NONAME ; void QAnimationDriver::start(void)
?unlockInline@QMutex@@QAEXXZ @ 4586 NONAME ; void QMutex::unlockInline(void)
-
+ ??0QSystemError@@QAE@HW4ErrorScope@0@@Z @ 4587 NONAME ; QSystemError::QSystemError(int, enum QSystemError::ErrorScope)
+ ??0QSystemError@@QAE@XZ @ 4588 NONAME ; QSystemError::QSystemError(void)
+ ?error@QSystemError@@QAEHXZ @ 4589 NONAME ; int QSystemError::error(void)
+ ?scope@QSystemError@@QAE?AW4ErrorScope@1@XZ @ 4590 NONAME ; enum QSystemError::ErrorScope QSystemError::scope(void)
+ ?toString@QSystemError@@QAE?AVQString@@XZ @ 4591 NONAME ; class QString QSystemError::toString(void)
+ ??0QFileInfo@@QAE@PAVQFileInfoPrivate@@@Z @ 4592 NONAME ; QFileInfo::QFileInfo(class QFileInfoPrivate *)
diff --git a/src/s60installs/eabi/QtCoreu.def b/src/s60installs/eabi/QtCoreu.def
index 02e72a1..130d9c0 100644
--- a/src/s60installs/eabi/QtCoreu.def
+++ b/src/s60installs/eabi/QtCoreu.def
@@ -3791,4 +3791,8 @@ EXPORTS
_ZTV13QUnifiedTimer @ 3790 NONAME
_ZTV16QAnimationDriver @ 3791 NONAME
_ZTV23QAnimationDriverPrivate @ 3792 NONAME
+ _ZN12QSystemError8toStringEv @ 3793 NONAME
+ _ZN5QChar21currentUnicodeVersionEv @ 3794 NONAME
+ _ZN9QFileInfoC1EP16QFileInfoPrivate @ 3795 NONAME
+ _ZN9QFileInfoC2EP16QFileInfoPrivate @ 3796 NONAME
diff --git a/src/s60installs/eabi/QtDeclarativeu.def b/src/s60installs/eabi/QtDeclarativeu.def
index 396c133..b0efab4 100644
--- a/src/s60installs/eabi/QtDeclarativeu.def
+++ b/src/s60installs/eabi/QtDeclarativeu.def
@@ -1747,8 +1747,8 @@ EXPORTS
_ZN21QDeclarativeListModelC1EPKS_P32QDeclarativeListModelWorkerAgent @ 1746 NONAME ABSENT
_ZN21QDeclarativeListModelC2EPKS_P32QDeclarativeListModelWorkerAgent @ 1747 NONAME ABSENT
_ZNK21QDeclarativeListModel14inWorkerThreadEv @ 1748 NONAME ABSENT
- _ZN23QDeclarativeDebugHelper15getScriptEngineEP18QDeclarativeEngine @ 1749 NONAME ABSENT
- _ZN23QDeclarativeDebugHelper26setAnimationSlowDownFactorEf @ 1750 NONAME ABSENT
+ _ZN23QDeclarativeDebugHelper15getScriptEngineEP18QDeclarativeEngine @ 1749 NONAME
+ _ZN23QDeclarativeDebugHelper26setAnimationSlowDownFactorEf @ 1750 NONAME
_ZN17QDeclarativeTimer10classBeginEv @ 1751 NONAME ABSENT
_ZN17QDeclarativeTimer10setRunningEb @ 1752 NONAME ABSENT
_ZN17QDeclarativeTimer11qt_metacallEN11QMetaObject4CallEiPPv @ 1753 NONAME ABSENT
@@ -1883,6 +1883,6 @@ EXPORTS
_ZThn8_N29QDeclarativeAbstractAnimation9setTargetERK20QDeclarativeProperty @ 1882 NONAME ABSENT
_ZThn8_N29QDeclarativeAbstractAnimationD0Ev @ 1883 NONAME ABSENT
_ZThn8_N29QDeclarativeAbstractAnimationD1Ev @ 1884 NONAME ABSENT
- _ZN23QDeclarativeDebugHelper15enableDebuggingEv @ 1885 NONAME ABSENT
+ _ZN23QDeclarativeDebugHelper15enableDebuggingEv @ 1885 NONAME
_ZN27QDeclarativePropertyPrivate7connectEPK7QObjectiS2_iiPi @ 1886 NONAME ABSENT
diff --git a/src/s60installs/eabi/QtGuiu.def b/src/s60installs/eabi/QtGuiu.def
index 703d11b..926ed52 100644
--- a/src/s60installs/eabi/QtGuiu.def
+++ b/src/s60installs/eabi/QtGuiu.def
@@ -12105,7 +12105,7 @@ EXPORTS
_ZN15QStaticTextItemD1Ev @ 12104 NONAME
_ZN15QStaticTextItemD2Ev @ 12105 NONAME
_ZN19QEventDispatcherS6031reactivateDeferredActiveObjectsEv @ 12106 NONAME
- _Z18qt_addBitmapToPathffPKhiiiP12QPainterPath @ 12107 NONAME ABSENT
+ _Z18qt_addBitmapToPathffPKhiiiP12QPainterPath @ 12107 NONAME
_Z22qt_fontdata_from_indexi @ 12108 NONAME
_ZN10QBlittable4lockEv @ 12109 NONAME
_ZN10QBlittable6unlockEv @ 12110 NONAME
diff --git a/src/s60installs/s60installs.pro b/src/s60installs/s60installs.pro
index fc364bc..ebbde78 100644
--- a/src/s60installs/s60installs.pro
+++ b/src/s60installs/s60installs.pro
@@ -88,7 +88,7 @@ symbian: {
}
!contains(S60_VERSION, 3.1):!contains(S60_VERSION, 3.2) {
- feedback_plugin.sources = $$QT_BUILD_TREE/plugins/s60/feedback/qtactilefeedback$${QT_LIBINFIX}.dll
+ feedback_plugin.files = $$QT_BUILD_TREE/plugins/s60/feedback/qtactilefeedback$${QT_LIBINFIX}.dll
feedback_plugin.path = c:$$QT_PLUGINS_BASE_DIR/feedback
DEPLOYMENT += feedback_plugin
}
@@ -132,7 +132,7 @@ symbian: {
codecs_plugins.path = c:$$QT_PLUGINS_BASE_DIR/codecs
contains(QT_CONFIG, phonon-backend) {
- phonon_backend_plugins.files += $$QMAKE_LIBDIR_QT/phonon_mmf$${QT_LIBINFIX}.dll
+ phonon_backend_plugins.files += $$QT_BUILD_TREE/plugins/phonon_backend/phonon_mmf$${QT_LIBINFIX}.dll
phonon_backend_plugins.path = c:$$QT_PLUGINS_BASE_DIR/phonon_backend
DEPLOYMENT += phonon_backend_plugins
diff --git a/src/s60main/qts60main_mcrt0.cpp b/src/s60main/qts60main_mcrt0.cpp
index 0f0723e..ddab771 100644
--- a/src/s60main/qts60main_mcrt0.cpp
+++ b/src/s60main/qts60main_mcrt0.cpp
@@ -78,14 +78,14 @@ extern "C" IMPORT_C void exit(int ret);
GLDEF_C TInt QtMainWrapper()
{
int argc = 0;
- char **argv = 0;
- char **envp = 0;
+ // these variables are declared static in the expectation that this function is not reentrant
+ // and so that memory analysis tools can trace any memory allocated in __crt0() to global memory ownership.
+ static char **argv = 0;
+ static char **envp = 0;
// get args & environment
__crt0(argc, argv, envp);
//Call user(application)'s main
TRAPD(ret, QT_TRYCATCH_LEAVING(ret = CALLMAIN(argc, argv, envp);));
- delete[] argv;
- delete[] envp;
return ret;
}
diff --git a/src/sql/drivers/psql/qsql_psql.cpp b/src/sql/drivers/psql/qsql_psql.cpp
index 179f7ba..7ee8095 100644
--- a/src/sql/drivers/psql/qsql_psql.cpp
+++ b/src/sql/drivers/psql/qsql_psql.cpp
@@ -54,7 +54,6 @@
#include <qstringlist.h>
#include <qmutex.h>
-
#include <libpq-fe.h>
#include <pg_config.h>
@@ -619,6 +618,50 @@ static void setDatestyle(PGconn* connection)
PQclear(result);
}
+static QPSQLDriver::Protocol qMakePSQLVersion(int vMaj, int vMin)
+{
+ switch (vMaj) {
+ case 6:
+ return QPSQLDriver::Version6;
+ case 7:
+ {
+ switch (vMin) {
+ case 1:
+ return QPSQLDriver::Version71;
+ case 3:
+ return QPSQLDriver::Version73;
+ case 4:
+ return QPSQLDriver::Version74;
+ default:
+ return QPSQLDriver::Version7;
+ }
+ break;
+ }
+ case 8:
+ {
+ switch (vMin) {
+ case 1:
+ return QPSQLDriver::Version81;
+ case 2:
+ return QPSQLDriver::Version82;
+ case 3:
+ return QPSQLDriver::Version83;
+ case 4:
+ return QPSQLDriver::Version84;
+ default:
+ return QPSQLDriver::Version8;
+ }
+ break;
+ }
+ case 9:
+ return QPSQLDriver::Version9;
+ break;
+ default:
+ break;
+ }
+ return QPSQLDriver::VersionUnknown;
+}
+
static QPSQLDriver::Protocol getPSQLVersion(PGconn* connection)
{
QPSQLDriver::Protocol serverVersion = QPSQLDriver::Version6;
@@ -626,50 +669,44 @@ static QPSQLDriver::Protocol getPSQLVersion(PGconn* connection)
int status = PQresultStatus(result);
if (status == PGRES_COMMAND_OK || status == PGRES_TUPLES_OK) {
QString val = QString::fromAscii(PQgetvalue(result, 0, 0));
+
QRegExp rx(QLatin1String("(\\d+)\\.(\\d+)"));
rx.setMinimal(true); // enforce non-greedy RegExp
+
if (rx.indexIn(val) != -1) {
int vMaj = rx.cap(1).toInt();
int vMin = rx.cap(2).toInt();
-
- switch (vMaj) {
- case 7:
- switch (vMin) {
- case 0:
- serverVersion = QPSQLDriver::Version7;
- break;
- case 1:
- case 2:
- serverVersion = QPSQLDriver::Version71;
- break;
- default:
- serverVersion = QPSQLDriver::Version73;
- break;
- }
- break;
- case 8:
- switch (vMin) {
- case 0:
- serverVersion = QPSQLDriver::Version8;
- break;
- case 1:
- serverVersion = QPSQLDriver::Version81;
- break;
- case 2:
- default:
- serverVersion = QPSQLDriver::Version82;
- break;
- }
- break;
- default:
- break;
+ serverVersion = qMakePSQLVersion(vMaj, vMin);
+#ifdef PG_MAJORVERSION
+ if (rx.indexIn(QLatin1String(PG_MAJORVERSION)) != -1) {
+ vMaj = rx.cap(1).toInt();
+ vMin = rx.cap(2).toInt();
+ }
+ QPSQLDriver::Protocol clientVersion = qMakePSQLVersion(vMaj, vMin);
+
+ if (serverVersion >= QPSQLDriver::Version9 && clientVersion < QPSQLDriver::Version9) {
+ //Client version before QPSQLDriver::Version9 only supports escape mode for bytea type,
+ //but bytea format is set to hex by default in PSQL 9 and above. So need to force the
+ //server use the old escape mode when connects to the new server with old client library.
+ result = PQexec(connection, "SET bytea_output=escape; ");
+ status = PQresultStatus(result);
+ } else if (serverVersion == QPSQLDriver::VersionUnknown) {
+ serverVersion = clientVersion;
+ if (serverVersion != QPSQLDriver::VersionUnknown)
+ qWarning("The server version of this PostgreSQL is unknown, falling back to the client version.");
}
+#endif
}
}
PQclear(result);
- if (serverVersion < QPSQLDriver::Version71)
+ //keep the old behavior unchanged
+ if (serverVersion == QPSQLDriver::VersionUnknown)
+ serverVersion = QPSQLDriver::Version6;
+
+ if (serverVersion < QPSQLDriver::Version71) {
qWarning("This version of PostgreSQL is not supported and may not work.");
+ }
return serverVersion;
}
@@ -852,7 +889,10 @@ bool QPSQLDriver::commitTransaction()
// This hack can dissapear once there is an API to query this sort of information.
if (d->pro == QPSQLDriver::Version8 ||
d->pro == QPSQLDriver::Version81 ||
- d->pro == QPSQLDriver::Version82) {
+ d->pro == QPSQLDriver::Version82 ||
+ d->pro == QPSQLDriver::Version83 ||
+ d->pro == QPSQLDriver::Version84 ||
+ d->pro == QPSQLDriver::Version9) {
transaction_failed = qstrcmp(PQcmdStatus(res), "ROLLBACK") == 0;
}
@@ -963,6 +1003,9 @@ QSqlIndex QPSQLDriver::primaryIndex(const QString& tablename) const
case QPSQLDriver::Version8:
case QPSQLDriver::Version81:
case QPSQLDriver::Version82:
+ case QPSQLDriver::Version83:
+ case QPSQLDriver::Version84:
+ case QPSQLDriver::Version9:
stmt = QLatin1String("SELECT pg_attribute.attname, pg_attribute.atttypid::int, "
"pg_class.relname "
"FROM pg_attribute, pg_class "
@@ -1046,6 +1089,9 @@ QSqlRecord QPSQLDriver::record(const QString& tablename) const
case QPSQLDriver::Version8:
case QPSQLDriver::Version81:
case QPSQLDriver::Version82:
+ case QPSQLDriver::Version83:
+ case QPSQLDriver::Version84:
+ case QPSQLDriver::Version9:
stmt = QLatin1String("select pg_attribute.attname, pg_attribute.atttypid::int, "
"pg_attribute.attnotnull, pg_attribute.attlen, pg_attribute.atttypmod, "
"pg_attrdef.adsrc "
diff --git a/src/sql/drivers/psql/qsql_psql.h b/src/sql/drivers/psql/qsql_psql.h
index 22871ff..107da87 100644
--- a/src/sql/drivers/psql/qsql_psql.h
+++ b/src/sql/drivers/psql/qsql_psql.h
@@ -97,6 +97,7 @@ class Q_EXPORT_SQLDRIVER_PSQL QPSQLDriver : public QSqlDriver
Q_OBJECT
public:
enum Protocol {
+ VersionUnknown = -1,
Version6 = 6,
Version7 = 7,
Version71 = 8,
@@ -104,7 +105,10 @@ public:
Version74 = 10,
Version8 = 11,
Version81 = 12,
- Version82 = 13
+ Version82 = 13,
+ Version83 = 14,
+ Version84 = 15,
+ Version9 = 16,
};
explicit QPSQLDriver(QObject *parent=0);
diff --git a/src/tools/bootstrap/bootstrap.pro b/src/tools/bootstrap/bootstrap.pro
index 27b7336..9e5845c 100644
--- a/src/tools/bootstrap/bootstrap.pro
+++ b/src/tools/bootstrap/bootstrap.pro
@@ -59,6 +59,8 @@ SOURCES += \
../../corelib/io/qdiriterator.cpp \
../../corelib/io/qfile.cpp \
../../corelib/io/qfileinfo.cpp \
+ ../../corelib/io/qfilesystementry.cpp \
+ ../../corelib/io/qfilesystemengine.cpp \
../../corelib/io/qfsfileengine.cpp \
../../corelib/io/qfsfileengine_iterator.cpp \
../../corelib/io/qiodevice.cpp \
@@ -67,6 +69,7 @@ SOURCES += \
../../corelib/io/qurl.cpp \
../../corelib/kernel/qmetatype.cpp \
../../corelib/kernel/qvariant.cpp \
+ ../../corelib/kernel/qsystemerror.cpp \
../../corelib/tools/qbitarray.cpp \
../../corelib/tools/qbytearray.cpp \
../../corelib/tools/qbytearraymatcher.cpp \
@@ -81,19 +84,22 @@ SOURCES += \
../../corelib/tools/qvector.cpp \
../../corelib/tools/qvsnprintf.cpp \
../../corelib/xml/qxmlutils.cpp \
- ../../corelib/xml/qxmlstream.cpp \
+ ../../corelib/xml/qxmlstream.cpp \
../../xml/dom/qdom.cpp \
../../xml/sax/qxml.cpp
-unix:SOURCES += ../../corelib/io/qfsfileengine_unix.cpp \
- ../../corelib/io/qfsfileengine_iterator_unix.cpp
+unix:SOURCES += ../../corelib/io/qfilesystemengine_unix.cpp \
+ ../../corelib/io/qfilesystemiterator_unix.cpp \
+ ../../corelib/io/qfsfileengine_unix.cpp
-win32:SOURCES += ../../corelib/io/qfsfileengine_win.cpp \
- ../../corelib/io/qfsfileengine_iterator_win.cpp \
+win32:SOURCES += ../../corelib/io/qfilesystemengine_win.cpp \
+ ../../corelib/io/qfilesystemiterator_win.cpp \
+ ../../corelib/io/qfsfileengine_win.cpp \
../../corelib/plugin/qsystemlibrary.cpp \
macx: {
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.4 #enables weak linking for 10.4 (exported)
+ SOURCES += ../../corelib/io/qfilesystemengine_mac.cpp
SOURCES += ../../corelib/kernel/qcore_mac.cpp
LIBS += -framework CoreServices
}
diff --git a/src/xmlpatterns/data/qatomicvalue.cpp b/src/xmlpatterns/data/qatomicvalue.cpp
index 700f7ea..09b75f4 100644
--- a/src/xmlpatterns/data/qatomicvalue.cpp
+++ b/src/xmlpatterns/data/qatomicvalue.cpp
@@ -202,7 +202,7 @@ ItemType::Ptr AtomicValue::qtToXDMType(const QXmlItem &item)
Q_ASSERT(item.isAtomicValue());
const QVariant v(item.toAtomicValue());
- switch(v.type())
+ switch(int(v.type()))
{
case QVariant::Char:
/* Fallthrough. */
diff --git a/tests/.gitignore b/tests/.gitignore
deleted file mode 100644
index b203473..0000000
--- a/tests/.gitignore
+++ /dev/null
@@ -1,6 +0,0 @@
-QObject.log
-tst_*
-!tst_*.*
-tst_*.log
-tst_*.debug
-tst_*~
diff --git a/tests/arthur/baselineserver/src/baselineserver.cpp b/tests/arthur/baselineserver/src/baselineserver.cpp
index 0399224..6351dff 100644
--- a/tests/arthur/baselineserver/src/baselineserver.cpp
+++ b/tests/arthur/baselineserver/src/baselineserver.cpp
@@ -97,6 +97,8 @@ void BaselineServer::heartbeat()
QFileInfo me(QCoreApplication::applicationFilePath());
if (me.lastModified() == meLastMod)
return;
+ if (!me.exists() || !me.isExecutable())
+ return;
//# (could close() here to avoid accepting new connections, to avoid livelock)
//# also, could check for a timeout to force exit, to avoid hung threads blocking
@@ -143,36 +145,43 @@ const char *BaselineHandler::logtime()
//return QTime::currentTime().toString(QLS("mm:ss.zzz"));
}
-void BaselineHandler::receiveRequest()
+bool BaselineHandler::establishConnection()
{
- if (!connectionEstablished) {
- if (!proto.acceptConnection(&plat)) {
- qWarning() << runId << logtime() << "Accepting new connection from" << proto.socket.peerAddress().toString() << "failed." << proto.errorMessage();
- proto.socket.disconnectFromHost();
- return;
- }
- QString logMsg;
- foreach (QString key, plat.keys()) {
- if (key != PI_HostName && key != PI_HostAddress)
- logMsg += key + QLS(": '") + plat.value(key) + QLS("', ");
- }
- qDebug() << runId << logtime() << "Connection established with" << plat.value(PI_HostName)
- << "[" << qPrintable(plat.value(PI_HostAddress)) << "]" << logMsg;
+ if (!proto.acceptConnection(&plat)) {
+ qWarning() << runId << logtime() << "Accepting new connection from" << proto.socket.peerAddress().toString() << "failed." << proto.errorMessage();
+ proto.socket.disconnectFromHost();
+ return false;
+ }
+ QString logMsg;
+ foreach (QString key, plat.keys()) {
+ if (key != PI_HostName && key != PI_HostAddress)
+ logMsg += key + QLS(": '") + plat.value(key) + QLS("', ");
+ }
+ qDebug() << runId << logtime() << "Connection established with" << plat.value(PI_HostName)
+ << "[" << qPrintable(plat.value(PI_HostAddress)) << "]" << logMsg;
- // Filter on branch
- QString branch = plat.value(PI_PulseGitBranch);
- if (branch.isEmpty()) {
- // Not run by Pulse, i.e. ad hoc run: Ok.
- }
- else if (branch != QLS("master-integration") || !plat.value(PI_GitCommit).contains(QLS("Merge branch 'master' of scm.dev.nokia.troll.no:qt/oslo-staging-2 into master-integration"))) {
- qDebug() << runId << logtime() << "Did not pass branch/staging repo filter, disconnecting.";
- proto.sendBlock(BaselineProtocol::Abort, QByteArray("This branch/staging repo is not assigned to be tested."));
- proto.socket.disconnectFromHost();
- return;
- }
+ // Filter on branch
+ QString branch = plat.value(PI_PulseGitBranch);
+ if (branch.isEmpty()) {
+ // Not run by Pulse, i.e. ad hoc run: Ok.
+ }
+ else if (branch != QLS("master-integration") || !plat.value(PI_GitCommit).contains(QLS("Merge branch 'master' of scm.dev.nokia.troll.no:qt/oslo-staging-2 into master-integration"))) {
+ qDebug() << runId << logtime() << "Did not pass branch/staging repo filter, disconnecting.";
+ proto.sendBlock(BaselineProtocol::Abort, QByteArray("This branch/staging repo is not assigned to be tested."));
+ proto.socket.disconnectFromHost();
+ return false;
+ }
- proto.sendBlock(BaselineProtocol::Ack, QByteArray());
- connectionEstablished = true;
+ proto.sendBlock(BaselineProtocol::Ack, QByteArray());
+
+ report.init(this, runId, plat);
+ return true;
+}
+
+void BaselineHandler::receiveRequest()
+{
+ if (!connectionEstablished) {
+ connectionEstablished = establishConnection();
return;
}
@@ -206,8 +215,8 @@ void BaselineHandler::provideBaselineChecksums(const QByteArray &itemListBlock)
ImageItemList itemList;
QDataStream ds(itemListBlock);
ds >> itemList;
- qDebug() << runId << logtime() << "Received request for checksums for" << itemList.count() << "items, engine"
- << itemList.at(0).engineAsString() << "pixel format" << itemList.at(0).formatAsString();
+ qDebug() << runId << logtime() << "Received request for checksums for" << itemList.count()
+ << "items in test function" << itemList.at(0).testFunction;
for (ImageItemList::iterator i = itemList.begin(); i != itemList.end(); ++i) {
i->imageChecksums.clear();
@@ -230,10 +239,10 @@ void BaselineHandler::provideBaselineChecksums(const QByteArray &itemListBlock)
if (file.open(QIODevice::ReadOnly)) {
QTextStream in(&file);
do {
- QString scriptName = in.readLine();
- if (!scriptName.isNull()) {
+ QString itemName = in.readLine();
+ if (!itemName.isNull()) {
for (ImageItemList::iterator i = itemList.begin(); i != itemList.end(); ++i) {
- if (i->scriptName == scriptName)
+ if (i->itemName == itemName)
i->status = ImageItem::IgnoreItem;
}
}
@@ -245,7 +254,7 @@ void BaselineHandler::provideBaselineChecksums(const QByteArray &itemListBlock)
QDataStream ods(&block, QIODevice::WriteOnly);
ods << itemList;
proto.sendBlock(BaselineProtocol::Ack, block);
- report.start(BaselineServer::storagePath(), runId, plat, context, itemList);
+ report.addItems(itemList);
}
@@ -256,7 +265,7 @@ void BaselineHandler::storeImage(const QByteArray &itemBlock, bool isBaseline)
ds >> item;
QString prefix = pathForItem(item, isBaseline);
- qDebug() << runId << logtime() << "Received" << (isBaseline ? "baseline" : "mismatched") << "image for:" << item.scriptName << "Storing in" << prefix;
+ qDebug() << runId << logtime() << "Received" << (isBaseline ? "baseline" : "mismatched") << "image for:" << item.itemName << "Storing in" << prefix;
QString dir = prefix.section(QLC('/'), 0, -2);
QDir cwd;
@@ -272,19 +281,15 @@ void BaselineHandler::storeImage(const QByteArray &itemBlock, bool isBaseline)
file.close();
if (!isBaseline)
- report.addItem(pathForItem(item, true, false) + QLS(FileFormat),
- pathForItem(item, false, false) + QLS(FileFormat),
- item);
+ report.addMismatch(item);
- QByteArray msg(isBaseline ? "New baseline image stored: " :
- "Mismatch report: " );
- msg += BaselineServer::baseUrl();
+ QString msg;
if (isBaseline)
- msg += pathForItem(item, true, false).toLatin1() + FileFormat;
+ msg = QLS("New baseline image stored: ") + pathForItem(item, true, true) + QLS(FileFormat);
else
- msg += report.filePath();
+ msg = BaselineServer::baseUrl() + report.filePath();
- proto.sendBlock(BaselineProtocol::Ack, msg);
+ proto.sendBlock(BaselineProtocol::Ack, msg.toLatin1());
}
@@ -296,7 +301,7 @@ void BaselineHandler::receiveDisconnect()
}
-void BaselineHandler::mapPlatformInfo()
+void BaselineHandler::mapPlatformInfo() const
{
mapped = plat;
@@ -326,22 +331,23 @@ void BaselineHandler::mapPlatformInfo()
mapped.insert(PI_QtVersion, ver.prepend(QLS("Qt-"))); //### TBD: remove patch version
}
-QString BaselineHandler::pathForItem(const ImageItem &item, bool isBaseline, bool absolute)
+QString BaselineHandler::pathForItem(const ImageItem &item, bool isBaseline, bool absolute) const
{
if (mapped.isEmpty())
mapPlatformInfo();
- QString itemName = item.scriptName;
- if (itemName.contains(QLC('.')))
- itemName.replace(itemName.lastIndexOf(QLC('.')), 1, QLC('_'));
+ QString itemName = item.itemName.simplified();
+ itemName.replace(QLC(' '), QLC('_'));
+ itemName.replace(QLC('.'), QLC('_'));
itemName.append(QLC('_'));
- itemName.append(QString::number(item.scriptChecksum, 16).rightJustified(4, QLC('0')));
+ itemName.append(QString::number(item.itemChecksum, 16).rightJustified(4, QLC('0')));
QStringList path;
if (absolute)
path += BaselineServer::storagePath();
+ path += mapped.value(PI_TestCase);
path += QLS(isBaseline ? "baselines" : "mismatches");
- path += item.engineAsString() + QLC('_') + item.formatAsString();
+ path += item.testFunction;
path += mapped.value(PI_QtVersion);
path += mapped.value(PI_QMakeSpec);
path += mapped.value(PI_HostName);
@@ -353,6 +359,14 @@ QString BaselineHandler::pathForItem(const ImageItem &item, bool isBaseline, boo
}
+QString BaselineHandler::view(const QString &baseline, const QString &rendered, const QString &compared)
+{
+ QFile f(":/templates/view.html");
+ f.open(QIODevice::ReadOnly);
+ return QString::fromLatin1(f.readAll()).arg('/'+baseline, '/'+rendered, '/'+compared);
+}
+
+
QString BaselineHandler::clearAllBaselines(const QString &context)
{
int tot = 0;
@@ -387,6 +401,7 @@ QString BaselineHandler::updateSingleBaseline(const QString &oldBaseline, const
return res;
}
+
QString BaselineHandler::blacklistTest(const QString &context, const QString &itemId, bool removeFromBlacklist)
{
QFile file(BaselineServer::storagePath() + QLC('/') + context + QLS("/BLACKLIST"));
@@ -429,11 +444,10 @@ void BaselineHandler::testPathMapping()
<< QLS("localhost");
ImageItem item;
- item.scriptName = QLS("arcs.qps");
- item.engine = ImageItem::Raster;
- item.renderFormat = QImage::Format_ARGB32_Premultiplied;
+ item.testFunction = QLS("testPathMapping");
+ item.itemName = QLS("arcs.qps");
item.imageChecksums << 0x0123456789abcdefULL;
- item.scriptChecksum = 0x0123;
+ item.itemChecksum = 0x0123;
plat.insert(PI_QtVersion, QLS("4.8.0"));
plat.insert(PI_BuildKey, QLS("(nobuildkey)"));
diff --git a/tests/arthur/baselineserver/src/baselineserver.h b/tests/arthur/baselineserver/src/baselineserver.h
index c5cb45e..e09a9d0 100644
--- a/tests/arthur/baselineserver/src/baselineserver.h
+++ b/tests/arthur/baselineserver/src/baselineserver.h
@@ -50,7 +50,7 @@
#include <QDateTime>
#include "baselineprotocol.h"
-#include "htmlpage.h"
+#include "report.h"
// #seconds between update checks
#define HEARTBEAT 10
@@ -99,7 +99,10 @@ class BaselineHandler : public QObject
public:
BaselineHandler(int socketDescriptor = -1);
void testPathMapping();
+ QString pathForItem(const ImageItem &item, bool isBaseline = true, bool absolute = true) const;
+ // CGI callbacks:
+ static QString view(const QString &baseline, const QString &rendered, const QString &compared);
static QString clearAllBaselines(const QString &context);
static QString updateSingleBaseline(const QString &oldBaseline, const QString &newBaseline);
static QString blacklistTest(const QString &context, const QString &itemId, bool removeFromBlacklist = false);
@@ -109,19 +112,19 @@ private slots:
void receiveDisconnect();
private:
+ bool establishConnection();
void provideBaselineChecksums(const QByteArray &itemListBlock);
void storeImage(const QByteArray &itemBlock, bool isBaseline);
- void mapPlatformInfo();
- QString pathForItem(const ImageItem &item, bool isBaseline = true, bool absolute = true);
+ void mapPlatformInfo() const;
const char *logtime();
QString computeMismatchScore(const QImage& baseline, const QImage& rendered);
BaselineProtocol proto;
PlatformInfo plat;
- PlatformInfo mapped;
+ mutable PlatformInfo mapped;
bool connectionEstablished;
QString runId;
- HTMLPage report;
+ Report report;
};
#endif // BASELINESERVER_H
diff --git a/tests/arthur/baselineserver/src/baselineserver.pro b/tests/arthur/baselineserver/src/baselineserver.pro
index a7be03d..770662b 100644
--- a/tests/arthur/baselineserver/src/baselineserver.pro
+++ b/tests/arthur/baselineserver/src/baselineserver.pro
@@ -20,8 +20,11 @@ include(../../common/baselineprotocol.pri)
SOURCES += main.cpp \
baselineserver.cpp \
- htmlpage.cpp
+ report.cpp
HEADERS += \
baselineserver.h \
- htmlpage.h
+ report.h
+
+RESOURCES += \
+ baselineserver.qrc
diff --git a/tests/arthur/baselineserver/src/baselineserver.qrc b/tests/arthur/baselineserver/src/baselineserver.qrc
new file mode 100644
index 0000000..b5cd6af
--- /dev/null
+++ b/tests/arthur/baselineserver/src/baselineserver.qrc
@@ -0,0 +1,5 @@
+<RCC>
+ <qresource prefix="/">
+ <file>templates/view.html</file>
+ </qresource>
+</RCC>
diff --git a/tests/arthur/baselineserver/src/htmlpage.cpp b/tests/arthur/baselineserver/src/htmlpage.cpp
deleted file mode 100644
index 9659505..0000000
--- a/tests/arthur/baselineserver/src/htmlpage.cpp
+++ /dev/null
@@ -1,239 +0,0 @@
-/****************************************************************************
-**
-** 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 "htmlpage.h"
-#include "baselineprotocol.h"
-#include "baselineserver.h"
-#include <QDir>
-#include <QProcess>
-#include <QUrl>
-
-HTMLPage::HTMLPage()
- : headerWritten(false)
-{
-}
-
-HTMLPage::~HTMLPage()
-{
- end();
-}
-
-QString HTMLPage::filePath()
-{
- return path;
-}
-
-void HTMLPage::start(const QString &storagepath, const QString &runId, const PlatformInfo pinfo, const QString &context, const ImageItemList &itemList)
-{
- end();
-
- id = runId;
- plat = pinfo;
- ctx = context;
- root = storagepath + QLC('/');
- imageItems = itemList;
- reportDir = pinfo.value(PI_PulseGitBranch).isEmpty() ? QLS("reports/adhoc/") : QLS("reports/pulse/");
- QString dir = root + reportDir;
- QDir cwd;
- if (!cwd.exists(dir))
- cwd.mkpath(dir);
-}
-
-
-void HTMLPage::writeHeader(const ImageItem &item)
-{
- path = reportDir + id + QLC('_') + item.engineAsString()
- + QLC('_') + item.formatAsString() + QLS(".html");
-
- QString pageUrl = BaselineServer::baseUrl() + path;
-
- file.setFileName(root + path);
- if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
- qWarning() << "Failed to open report file" << file.fileName();
- out.setDevice(&file);
-
- out << "<html><body><h1>Lancelot results from run " << id << "</h1>\n\n";
- out << "<p><h3>Platform Info:</h3>\n";
- out << "<table>\n";
- foreach (QString key, plat.keys())
- out << "<tr><td>" << key << "</td><td>" << plat.value(key) << "</td></tr>\n";
- out << "</table></p>\n\n";
-
- out << "<p><a href=\"/cgi-bin/server.cgi?cmd=clearAllBaselines&context=" << ctx << "&url=" << pageUrl
- << "\"><b><big>Clear all baselines</big></b></a></h3> (They will be recreated by the next run)</p>\n\n";
-
- out << "<p><table border=\"2\">\n"
- "<tr>\n"
- "<td><b>Script</b></td>\n"
- "<td><b>Baseline</b></td>\n"
- "<td><b>Rendered</b></td>\n"
- "<td><b>Comparison</b> (diffs are <span style=\"color:red\">RED</span>)</td>\n"
- "<td><b>Info/Action</b></td>\n"
- "</b></tr><br>";
-}
-
-
-void HTMLPage::writeFooter()
-{
- out << "</table></p>\n</body></html>\n";
-}
-
-
-void HTMLPage::addItem(const QString &baseline, const QString &rendered, const ImageItem &item)
-{
- if (!headerWritten) {
- writeHeader(item);
- headerWritten = true;
- }
- QString compared = generateCompared(baseline, rendered);
- QString pageUrl = BaselineServer::baseUrl() + path;
-
- out << "<tr>\n";
- out << "<td>" << item.scriptName << "</td>\n";
- QStringList images = QStringList() << baseline << rendered << compared;
- foreach(const QString& img, images)
- out << "<td><a href=\"/" << img << "\"><img src=\"/" << generateThumbnail(img) << "\" width=240 height=240></a></td>\n";
-
- out << "<td><p><a href=\"/cgi-bin/server.cgi?cmd=updateSingleBaseline&oldBaseline=" << baseline
- << "&newBaseline=" << rendered << "&url=" << pageUrl << "\">Replace baseline with rendered</a></p>"
- << "<p><a href=\"/cgi-bin/server.cgi?cmd=blacklist&context=" << ctx
- << "&itemId=" << item.scriptName << "&url=" << pageUrl << "\">Blacklist this item</a></p>"
- << "</td>\n";
- out << "</tr>\n\n";
-
- QMutableVectorIterator<ImageItem> it(imageItems);
- while (it.hasNext()) {
- it.next();
- if (it.value().scriptName == item.scriptName) {
- it.remove();
- break;
- }
- }
-}
-
-
-void HTMLPage::end()
-{
- if (file.isOpen()) {
- // Add the names of the scripts that passed the test, or were blacklisted
- QString pageUrl = BaselineServer::baseUrl() + path;
- for (int i=0; i<imageItems.count(); ++i) {
- out << "<tr><td>" << imageItems.at(i).scriptName << "</td><td>N/A</td><td>N/A</td><td>N/A</td><td>";
- if (imageItems.at(i).status == ImageItem::IgnoreItem) {
- out << "<span style=\"background-color:yellow\">Blacklisted</span> "
- << "<a href=\"/cgi-bin/server.cgi?cmd=whitelist&context=" << ctx
- << "&itemId=" << imageItems.at(i).scriptName << "&url=" << pageUrl
- << "\">Whitelist item</a>";
- } else {
- out << "<span style=\"color:green\">Test passed</span>";
- }
- out << "</td></tr>\n";
- }
-
- writeFooter();
- out.flush();
- file.close();
- path.clear();
- headerWritten = false;
- }
-}
-
-
-QString HTMLPage::generateCompared(const QString &baseline, const QString &rendered, bool fuzzy)
-{
- QString res = rendered;
- QFileInfo fi(res);
- res.chop(fi.suffix().length() + 1);
- res += QLS(fuzzy ? "_fuzzycompared.png" : "_compared.png");
- QStringList args;
- if (fuzzy)
- args << QLS("-fuzz") << QLS("5%");
- args << root+baseline << root+rendered << root+res;
- QProcess::execute(QLS("compare"), args);
- return res;
-}
-
-
-QString HTMLPage::generateThumbnail(const QString &image)
-{
- QString res = image;
- QFileInfo imgFI(root+image);
- res.chop(imgFI.suffix().length() + 1);
- res += QLS("_thumbnail.jpg");
- QFileInfo resFI(root+res);
- if (resFI.exists() && resFI.lastModified() > imgFI.lastModified())
- return res;
- QStringList args;
- args << root+image << QLS("-resize") << QLS("240x240") << QLS("-quality") << QLS("50") << root+res;
- QProcess::execute(QLS("convert"), args);
- return res;
-}
-
-
-void HTMLPage::handleCGIQuery(const QString &query)
-{
- QUrl cgiUrl(QLS("http://dummy/cgi-bin/dummy.cgi?") + query);
- QTextStream s(stdout);
- s << "Content-Type: text/html\r\n\r\n"
- << "<HTML>";
-// << "Contents of QUERY_STRING:<br>"
-// << "Full string = " << query << "<br>";
-
- QString command(cgiUrl.queryItemValue("cmd"));
-
- if (command == QLS("updateSingleBaseline")) {
- s << BaselineHandler::updateSingleBaseline(cgiUrl.queryItemValue(QLS("oldBaseline")),
- cgiUrl.queryItemValue(QLS("newBaseline")));
- } else if (command == QLS("clearAllBaselines")) {
- s << BaselineHandler::clearAllBaselines(cgiUrl.queryItemValue(QLS("context")));
- } else if (command == QLS("blacklist")) {
- // blacklist a test
- s << BaselineHandler::blacklistTest(cgiUrl.queryItemValue(QLS("context")),
- cgiUrl.queryItemValue(QLS("itemId")));
- } else if (command == QLS("whitelist")) {
- // whitelist a test
- s << BaselineHandler::blacklistTest(cgiUrl.queryItemValue(QLS("context")),
- cgiUrl.queryItemValue(QLS("itemId")), true);
- } else {
- s << "Unknown query:<br>" << query << "<br>";
- }
- s << "<p><a href=\"" << cgiUrl.queryItemValue(QLS("url")) << "\">Back to report</a>";
- s << "</HTML>";
-}
diff --git a/tests/arthur/baselineserver/src/main.cpp b/tests/arthur/baselineserver/src/main.cpp
index a5ec4db..bf41f41 100644
--- a/tests/arthur/baselineserver/src/main.cpp
+++ b/tests/arthur/baselineserver/src/main.cpp
@@ -48,7 +48,7 @@ int main(int argc, char *argv[])
QString queryString(qgetenv("QUERY_STRING"));
if (!queryString.isEmpty()) {
// run as CGI script
- HTMLPage::handleCGIQuery(queryString);
+ Report::handleCGIQuery(queryString);
return 0;
}
diff --git a/tests/arthur/baselineserver/src/report.cpp b/tests/arthur/baselineserver/src/report.cpp
new file mode 100644
index 0000000..f5bb418
--- /dev/null
+++ b/tests/arthur/baselineserver/src/report.cpp
@@ -0,0 +1,296 @@
+/****************************************************************************
+**
+** 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 "report.h"
+#include "baselineprotocol.h"
+#include "baselineserver.h"
+#include <QDir>
+#include <QProcess>
+#include <QUrl>
+
+Report::Report()
+ : written(false), numItems(0), numMismatches(0)
+{
+}
+
+Report::~Report()
+{
+ end();
+}
+
+QString Report::filePath()
+{
+ return path;
+}
+
+void Report::init(const BaselineHandler *h, const QString &r, const PlatformInfo &p)
+{
+ handler = h;
+ runId = r;
+ plat = p;
+ rootDir = BaselineServer::storagePath() + QLC('/');
+ reportDir = plat.value(PI_TestCase) + QLC('/') + (plat.value(PI_PulseGitBranch).isEmpty() ? QLS("reports/adhoc/") : QLS("reports/pulse/"));
+ QString dir = rootDir + reportDir;
+ QDir cwd;
+ if (!cwd.exists(dir))
+ cwd.mkpath(dir);
+ path = reportDir + QLS("Report_") + runId + QLS(".html");
+}
+
+void Report::addItems(const ImageItemList &items)
+{
+ if (items.isEmpty())
+ return;
+ numItems += items.size();
+ QString func = items.at(0).testFunction;
+ if (!testFunctions.contains(func))
+ testFunctions.append(func);
+ itemLists[func] += items;
+}
+
+void Report::addMismatch(const ImageItem &item)
+{
+ if (!testFunctions.contains(item.testFunction)) {
+ qWarning() << "Report::addMismatch: unknown testfunction" << item.testFunction;
+ return;
+ }
+ bool found = false;
+ ImageItemList &list = itemLists[item.testFunction];
+ for (ImageItemList::iterator it = list.begin(); it != list.end(); ++it) {
+ if (it->itemName == item.itemName && it->itemChecksum == item.itemChecksum) {
+ it->status = ImageItem::Mismatch;
+ found = true;
+ break;
+ }
+ }
+ if (found)
+ numMismatches++;
+ else
+ qWarning() << "Report::addMismatch: unknown item" << item.itemName << "in testfunction" << item.testFunction;
+}
+
+void Report::end()
+{
+ if (written || !numMismatches)
+ return;
+ write();
+ written = true;
+}
+
+
+void Report::write()
+{
+ QFile file(rootDir + path);
+ if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
+ qWarning() << "Failed to open report file" << file.fileName();
+ return;
+ }
+ out.setDevice(&file);
+
+ writeHeader();
+ foreach(const QString &func, testFunctions) {
+ writeFunctionResults(itemLists.value(func));
+ }
+ writeFooter();
+ file.close();
+}
+
+
+void Report::writeHeader()
+{
+ QString title = plat.value(PI_TestCase) + QLS(" Qt Baseline Test Report");
+ out << "<head><title>" << title << "</title></head>\n"
+ << "<html><body><h1>" << title << "</h1>\n"
+ << "<p>Run Id: <b>" << runId << "</b></p>\n"
+ << "<p>Summary: <b>" << numMismatches << " of " << numItems << "</b> items reported mismatching</p>\n\n";
+ out << "<h3>Platform Info:</h3>\n"
+ << "<table>\n";
+ foreach (QString key, plat.keys())
+ out << "<tr><td>" << key << "</td><td>" << plat.value(key) << "</td></tr>\n";
+ out << "</table>\n\n";
+}
+
+
+void Report::writeFunctionResults(const ImageItemList &list)
+{
+ QString testFunction = list.at(0).testFunction;
+ QString pageUrl = BaselineServer::baseUrl() + path;
+ QString ctx = handler->pathForItem(list.at(0), true, false).section(QLC('/'), 0, -2);
+
+ out << "\n<p>&nbsp;</p><h3>Test function: " << testFunction << "</h3>\n";
+ out << "<p><a href=\"/cgi-bin/server.cgi?cmd=clearAllBaselines&context=" << ctx << "&url=" << pageUrl
+ << "\"><b><big>Clear all baselines</big></b></a></h3> (They will be recreated by the next run)</p>\n\n";
+
+ out << "<table border=\"2\">\n"
+ "<tr>\n"
+ "<th width=123>Item</th>\n"
+ "<th width=246>Baseline</th>\n"
+ "<th width=246>Rendered</th>\n"
+ "<th width=246>Comparison (diffs are <span style=\"color:red\">RED</span>)</th>\n"
+ "<th width=246>Info/Action</th>\n"
+ "</tr>\n\n";
+
+ foreach (const ImageItem &item, list) {
+ out << "<tr>\n";
+ out << "<td>" << item.itemName << "</td>\n";
+ QString baseline = handler->pathForItem(item, true, false) + QLS(FileFormat);
+ if (item.status == ImageItem::Mismatch) {
+ QString rendered = handler->pathForItem(item, false, false) + QLS(FileFormat);
+ writeItem(baseline, rendered, item, ctx);
+ }
+ else {
+ out << "<td align=center><a href=\"/" << baseline << "\">view</a></td>\n"
+ << "<td align=center colspan=2><small>n/a</small></td>\n"
+ << "<td align=center>";
+ switch (item.status) {
+ case ImageItem::BaselineNotFound:
+ out << "Baseline not found/regenerated";
+ break;
+ case ImageItem::IgnoreItem:
+ out << "<span style=\"background-color:yellow\">Blacklisted</span> "
+ << "<a href=\"/cgi-bin/server.cgi?cmd=whitelist&context=" << ctx
+ << "&itemId=" << item.itemName << "&url=" << pageUrl
+ << "\">Whitelist this item</a>";
+ break;
+ case ImageItem::Ok:
+ out << "<span style=\"color:green\"><small>No mismatch reported</small></span>";
+ break;
+ default:
+ out << "?";
+ break;
+ }
+ out << "</td>\n";
+ }
+ out << "</tr>\n\n";
+ }
+
+ out << "</table>\n";
+}
+
+void Report::writeItem(const QString &baseline, const QString &rendered, const ImageItem &item, const QString &ctx)
+{
+ QString compared = generateCompared(baseline, rendered);
+ QString pageUrl = BaselineServer::baseUrl() + path;
+
+ QStringList images = QStringList() << baseline << rendered << compared;
+ foreach (const QString& img, images)
+ out << "<td height=246 align=center><a href=\"/" << img << "\"><img src=\"/" << generateThumbnail(img) << "\"></a></td>\n";
+
+ out << "<td align=center>\n"
+ << "<p><span style=\"color:red\">Mismatch reported</span></p>\n"
+ << "<p><a href=\"/cgi-bin/server.cgi?cmd=updateSingleBaseline&oldBaseline=" << baseline
+ << "&newBaseline=" << rendered << "&url=" << pageUrl << "\">Replace baseline with rendered</a></p>\n"
+ << "<p><a href=\"/cgi-bin/server.cgi?cmd=blacklist&context=" << ctx
+ << "&itemId=" << item.itemName << "&url=" << pageUrl << "\">Blacklist this item</a></p>\n"
+ << "<p><a href=\"/cgi-bin/server.cgi?cmd=view&baseline=" << baseline << "&rendered=" << rendered
+ << "&compared=" << compared << "&url=" << pageUrl << "\">Inspect</a></p>\n"
+ << "</td>\n";
+}
+
+void Report::writeFooter()
+{
+ out << "\n</body></html>\n";
+}
+
+
+QString Report::generateCompared(const QString &baseline, const QString &rendered, bool fuzzy)
+{
+ QString res = rendered;
+ QFileInfo fi(res);
+ res.chop(fi.suffix().length() + 1);
+ res += QLS(fuzzy ? "_fuzzycompared.png" : "_compared.png");
+ QStringList args;
+ if (fuzzy)
+ args << QLS("-fuzz") << QLS("5%");
+ args << rootDir+baseline << rootDir+rendered << rootDir+res;
+ QProcess::execute(QLS("compare"), args);
+ return res;
+}
+
+
+QString Report::generateThumbnail(const QString &image)
+{
+ QString res = image;
+ QFileInfo imgFI(rootDir+image);
+ res.chop(imgFI.suffix().length() + 1);
+ res += QLS("_thumbnail.jpg");
+ QFileInfo resFI(rootDir+res);
+ if (resFI.exists() && resFI.lastModified() > imgFI.lastModified())
+ return res;
+ QStringList args;
+ args << rootDir+image << QLS("-resize") << QLS("240x240>") << QLS("-quality") << QLS("50") << rootDir+res;
+ QProcess::execute(QLS("convert"), args);
+ return res;
+}
+
+
+void Report::handleCGIQuery(const QString &query)
+{
+ QUrl cgiUrl(QLS("http://dummy/cgi-bin/dummy.cgi?") + query);
+ QTextStream s(stdout);
+ s << "Content-Type: text/html\r\n\r\n"
+ << "<HTML>";
+
+ QString command(cgiUrl.queryItemValue("cmd"));
+
+ if (command == QLS("view")) {
+ s << BaselineHandler::view(cgiUrl.queryItemValue(QLS("baseline")),
+ cgiUrl.queryItemValue(QLS("rendered")),
+ cgiUrl.queryItemValue(QLS("compared")));
+ }
+ else if (command == QLS("updateSingleBaseline")) {
+ s << BaselineHandler::updateSingleBaseline(cgiUrl.queryItemValue(QLS("oldBaseline")),
+ cgiUrl.queryItemValue(QLS("newBaseline")));
+ } else if (command == QLS("clearAllBaselines")) {
+ s << BaselineHandler::clearAllBaselines(cgiUrl.queryItemValue(QLS("context")));
+ } else if (command == QLS("blacklist")) {
+ // blacklist a test
+ s << BaselineHandler::blacklistTest(cgiUrl.queryItemValue(QLS("context")),
+ cgiUrl.queryItemValue(QLS("itemId")));
+ } else if (command == QLS("whitelist")) {
+ // whitelist a test
+ s << BaselineHandler::blacklistTest(cgiUrl.queryItemValue(QLS("context")),
+ cgiUrl.queryItemValue(QLS("itemId")), true);
+ } else {
+ s << "Unknown query:<br>" << query << "<br>";
+ }
+ s << "<p><a href=\"" << cgiUrl.queryItemValue(QLS("url")) << "\">Back to report</a>";
+ s << "</HTML>";
+}
diff --git a/tests/arthur/baselineserver/src/htmlpage.h b/tests/arthur/baselineserver/src/report.h
index 5f1e051..0df613a 100644
--- a/tests/arthur/baselineserver/src/htmlpage.h
+++ b/tests/arthur/baselineserver/src/report.h
@@ -38,42 +38,53 @@
** $QT_END_LICENSE$
**
****************************************************************************/
-#ifndef HTMLPAGE_H
-#define HTMLPAGE_H
+#ifndef REPORT_H
+#define REPORT_H
#include "baselineprotocol.h"
#include <QFile>
#include <QTextStream>
+#include <QMap>
+#include <QStringList>
-class HTMLPage
+class BaselineHandler;
+
+class Report
{
public:
- HTMLPage();
- ~HTMLPage();
+ Report();
+ ~Report();
- void start(const QString &storagePath, const QString &runId, const PlatformInfo pinfo, const QString &context, const ImageItemList &itemList);
- void addItem(const QString &baseline, const QString &rendered, const ImageItem &item);
+ void init(const BaselineHandler *h, const QString &r, const PlatformInfo &p);
+ void addItems(const ImageItemList& items);
+ void addMismatch(const ImageItem& item);
void end();
+
QString filePath();
static void handleCGIQuery(const QString &query);
private:
- void writeHeader(const ImageItem &item);
+ void write();
+ void writeFunctionResults(const ImageItemList &list);
+ void writeItem(const QString &baseline, const QString &rendered, const ImageItem &item, const QString &ctx);
+ void writeHeader();
void writeFooter();
QString generateCompared(const QString &baseline, const QString &rendered, bool fuzzy = false);
QString generateThumbnail(const QString &image);
- QString root;
- QString path;
+ const BaselineHandler *handler;
+ QString runId;
+ PlatformInfo plat;
+ QString rootDir;
QString reportDir;
- QFile file;
+ QString path;
+ QStringList testFunctions;
+ QMap<QString, ImageItemList> itemLists;
+ bool written;
+ int numItems;
+ int numMismatches;
QTextStream out;
- QString id;
- PlatformInfo plat;
- QString ctx;
- ImageItemList imageItems;
- bool headerWritten;
};
-#endif // HTMLPAGE_H
+#endif // REPORT_H
diff --git a/tests/arthur/baselineserver/src/templates/view.html b/tests/arthur/baselineserver/src/templates/view.html
new file mode 100644
index 0000000..c048f47
--- /dev/null
+++ b/tests/arthur/baselineserver/src/templates/view.html
@@ -0,0 +1,79 @@
+<h3>Lancelot Viewer</h3>
+
+<p>
+Zoom:
+<input name="zoom" id="z1" type="radio" checked="Checked">1x</input>
+<input name="zoom" id="z2" type="radio">2x</input>
+<input name="zoom" id="z4" type="radio">4x</input>
+</p>
+
+<p><table>
+<tr>
+<td><input name="imgselect" id="baseline" type="radio" checked="Checked">Baseline</input></td>
+<td>%1</td>
+</tr>
+<tr>
+<td><input name="imgselect" id="rendered" type="radio">Rendered</input></td>
+<td>%2</td>
+</tr>
+<tr>
+<td><input name="imgselect" id="compared" type="radio">Differences</input></td>
+<td></td>
+</tr>
+</table></p>
+
+
+<p>
+<canvas id="c" width="800" height="800"></canvas>
+</p>
+
+<script>
+ var canvas = document.getElementById("c");
+ var context = canvas.getContext("2d");
+ var cat = new Image();
+ cat.src = "%1";
+ var z = 1;
+ cat.onload = function() {
+ context.mozImageSmoothingEnabled = false;
+ context.drawImage(cat, 0, 0, z*cat.width, z*cat.height);
+ };
+
+ var bbut = document.getElementById("baseline");
+ bbut.onclick = function() {
+ cat.src = "%1";
+ };
+
+ var rbut = document.getElementById("rendered");
+ rbut.onclick = function() {
+ cat.src = "%2";
+ };
+
+ var cbut = document.getElementById("compared");
+ cbut.onclick = function() {
+ cat.src = "%3";
+ };
+
+ function setZoom(zoom)
+ {
+ z = zoom;
+ canvas.width = z*800;
+ canvas.height = z*800;
+ context.mozImageSmoothingEnabled = false;
+ context.drawImage(cat, 0, 0, z*cat.width, z*cat.height);
+ }
+
+ var z1but = document.getElementById("z1");
+ z1but.onclick = function() {
+ setZoom(1);
+ };
+
+ var z2but = document.getElementById("z2");
+ z2but.onclick = function() {
+ setZoom(2);
+ };
+
+ var z4but = document.getElementById("z4");
+ z4but.onclick = function() {
+ setZoom(4);
+ };
+</script>
diff --git a/tests/arthur/common/baselineprotocol.cpp b/tests/arthur/common/baselineprotocol.cpp
index 5ed58b4..e4445bd 100644
--- a/tests/arthur/common/baselineprotocol.cpp
+++ b/tests/arthur/common/baselineprotocol.cpp
@@ -48,6 +48,7 @@
#include <QFileInfo>
#include <QDir>
#include <QTime>
+#include <QPointer>
#ifndef QMAKESPEC
#define QMAKESPEC "Unknown"
@@ -128,11 +129,10 @@ PlatformInfo::PlatformInfo(bool useLocal)
ImageItem &ImageItem::operator=(const ImageItem &other)
{
- scriptName = other.scriptName;
- scriptChecksum = other.scriptChecksum;
+ testFunction = other.testFunction;
+ itemName = other.itemName;
+ itemChecksum = other.itemChecksum;
status = other.status;
- renderFormat = other.renderFormat;
- engine = other.engine;
image = other.image;
imageChecksums = other.imageChecksums;
return *this;
@@ -165,6 +165,7 @@ quint64 ImageItem::computeChecksum(const QImage &image)
return (quint64(h1) << 32) | h2;
}
+#if 0
QString ImageItem::engineAsString() const
{
switch (engine) {
@@ -205,6 +206,7 @@ QString ImageItem::formatAsString() const
return QLS("UnknownFormat");
return QLS(formatNames[renderFormat]);
}
+#endif
void ImageItem::writeImageToStream(QDataStream &out) const
{
@@ -249,24 +251,24 @@ void ImageItem::readImageFromStream(QDataStream &in)
QDataStream & operator<< (QDataStream &stream, const ImageItem &ii)
{
- stream << ii.scriptName << ii.scriptChecksum << quint8(ii.status) << quint8(ii.renderFormat)
- << quint8(ii.engine) << ii.imageChecksums;
+ stream << ii.testFunction << ii.itemName << ii.itemChecksum << quint8(ii.status) << ii.imageChecksums;
ii.writeImageToStream(stream);
return stream;
}
QDataStream & operator>> (QDataStream &stream, ImageItem &ii)
{
- quint8 encFormat, encStatus, encEngine;
- stream >> ii.scriptName >> ii.scriptChecksum >> encStatus >> encFormat
- >> encEngine >> ii.imageChecksums;
- ii.renderFormat = QImage::Format(encFormat);
+ quint8 encStatus;
+ stream >> ii.testFunction >> ii.itemName >> ii.itemChecksum >> encStatus >> ii.imageChecksums;
ii.status = ImageItem::ItemStatus(encStatus);
- ii.engine = ImageItem::GraphicsEngine(encEngine);
ii.readImageFromStream(stream);
return stream;
}
+BaselineProtocol::BaselineProtocol()
+{
+}
+
BaselineProtocol::~BaselineProtocol()
{
socket.close();
@@ -275,7 +277,7 @@ BaselineProtocol::~BaselineProtocol()
}
-bool BaselineProtocol::connect(bool *dryrun)
+bool BaselineProtocol::connect(const QString &testCase, bool *dryrun)
{
errMsg.clear();
QByteArray serverName(qgetenv("QT_LANCELOT_SERVER"));
@@ -292,6 +294,7 @@ bool BaselineProtocol::connect(bool *dryrun)
}
PlatformInfo pi(true);
+ pi.insert(PI_TestCase, testCase);
QByteArray block;
QDataStream ds(&block, QIODevice::ReadWrite);
ds << pi;
@@ -342,11 +345,15 @@ bool BaselineProtocol::acceptConnection(PlatformInfo *pi)
}
-bool BaselineProtocol::requestBaselineChecksums(ImageItemList *itemList)
+bool BaselineProtocol::requestBaselineChecksums(const QString &testFunction, ImageItemList *itemList)
{
errMsg.clear();
if (!itemList)
return false;
+
+ for(ImageItemList::iterator it = itemList->begin(); it != itemList->end(); it++)
+ it->testFunction = testFunction;
+
QByteArray block;
QDataStream ds(&block, QIODevice::ReadWrite);
ds << *itemList;
diff --git a/tests/arthur/common/baselineprotocol.h b/tests/arthur/common/baselineprotocol.h
index baffb4a..2315bc3 100644
--- a/tests/arthur/common/baselineprotocol.h
+++ b/tests/arthur/common/baselineprotocol.h
@@ -38,6 +38,7 @@
** $QT_END_LICENSE$
**
****************************************************************************/
+
#ifndef BASELINEPROTOCOL_H
#define BASELINEPROTOCOL_H
@@ -46,12 +47,14 @@
#include <QImage>
#include <QVector>
#include <QMap>
+#include <QPointer>
#define QLS QLatin1String
#define QLC QLatin1Char
#define FileFormat "png"
+const QString PI_TestCase(QLS("TestCase"));
const QString PI_HostName(QLS("HostName"));
const QString PI_HostAddress(QLS("HostAddress"));
const QString PI_OSName(QLS("OSName"));
@@ -73,39 +76,32 @@ struct ImageItem
{
public:
ImageItem()
- : status(Ok), renderFormat(QImage::Format_Invalid), engine(Raster), scriptChecksum(0)
+ : status(Ok), itemChecksum(0)
{}
ImageItem(const ImageItem &other)
{ *this = other; }
~ImageItem()
{}
ImageItem &operator=(const ImageItem &other);
- static quint64 computeChecksum(const QImage& image);
- QString engineAsString() const;
- QString formatAsString() const;
- void writeImageToStream(QDataStream &stream) const;
- void readImageFromStream(QDataStream &stream);
+ static quint64 computeChecksum(const QImage& image);
enum ItemStatus {
Ok = 0,
BaselineNotFound = 1,
- IgnoreItem = 2
- };
-
- enum GraphicsEngine {
- Raster = 0,
- OpenGL = 1
+ IgnoreItem = 2,
+ Mismatch = 3
};
- QString scriptName;
+ QString testFunction;
+ QString itemName;
ItemStatus status;
- QImage::Format renderFormat;
- GraphicsEngine engine;
QImage image;
QList<quint64> imageChecksums;
- // tbd: add diffscore
- quint16 scriptChecksum;
+ quint16 itemChecksum;
+
+ void writeImageToStream(QDataStream &stream) const;
+ void readImageFromStream(QDataStream &stream);
};
QDataStream & operator<< (QDataStream &stream, const ImageItem &ii);
QDataStream & operator>> (QDataStream &stream, ImageItem& ii);
@@ -114,17 +110,20 @@ Q_DECLARE_METATYPE(ImageItem);
typedef QVector<ImageItem> ImageItemList;
+
class BaselineProtocol
{
public:
- BaselineProtocol() {}
+ BaselineProtocol();
~BaselineProtocol();
+ static BaselineProtocol *instance(QObject *parent = 0);
+
// ****************************************************
// Important constants here
// ****************************************************
enum Constant {
- ProtocolVersion = 3,
+ ProtocolVersion = 4,
ServerPort = 54129,
Timeout = 5000
};
@@ -143,8 +142,10 @@ public:
};
// For client:
- bool connect(bool *dryrun = 0);
- bool requestBaselineChecksums(ImageItemList *itemList);
+
+ // For advanced client:
+ bool connect(const QString &testCase, bool *dryrun = 0);
+ bool requestBaselineChecksums(const QString &testFunction, ImageItemList *itemList);
bool submitNewBaseline(const ImageItem &item, QByteArray *serverMsg);
bool submitMismatch(const ImageItem &item, QByteArray *serverMsg);
diff --git a/tests/arthur/common/baselineprotocol.pri b/tests/arthur/common/baselineprotocol.pri
index 996f9d5..62e38a6 100644
--- a/tests/arthur/common/baselineprotocol.pri
+++ b/tests/arthur/common/baselineprotocol.pri
@@ -1,4 +1,5 @@
INCLUDEPATH += $$PWD
+DEPENDPATH += $$PWD
QT *= network
diff --git a/tests/arthur/common/qbaselinetest.cpp b/tests/arthur/common/qbaselinetest.cpp
new file mode 100644
index 0000000..e95b510
--- /dev/null
+++ b/tests/arthur/common/qbaselinetest.cpp
@@ -0,0 +1,124 @@
+/****************************************************************************
+**
+** 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 "qbaselinetest.h"
+#include "baselineprotocol.h"
+
+namespace QBaselineTest {
+
+bool connected = false;
+bool triedConnecting = false;
+BaselineProtocol proto;
+
+
+bool checkImage(const QImage& img, const char *name, quint16 checksum, QByteArray *msg, bool *error)
+{
+ QByteArray itemName;
+ bool hasName = qstrlen(name);
+ const char *tag = QTest::currentDataTag();
+ if (qstrlen(tag)) {
+ itemName = tag;
+ if (hasName)
+ itemName.append('_').append(name);
+ } else {
+ itemName = hasName ? name : "default_name";
+ }
+
+ *msg = "Baseline check of image '" + itemName + "': ";
+
+ if (!triedConnecting) {
+ triedConnecting = true;
+ if (!proto.connect(QTest::testObject()->metaObject()->className())) {
+ *msg += "Failed to connect to baseline server: " + proto.errorMessage().toLatin1();
+ *error = true;
+ return true;
+ }
+ connected = true;
+ }
+ if (!connected) {
+ *msg = "Not connected to baseline server.";
+ *error = true;
+ return true;
+ }
+
+ ImageItem item;
+ item.itemName = QLatin1String(itemName);
+ item.itemChecksum = checksum;
+ item.testFunction = QLatin1String(QTest::currentTestFunction());
+ ImageItemList list;
+ list.append(item);
+ if (!proto.requestBaselineChecksums(QLatin1String(QTest::currentTestFunction()), &list) || list.isEmpty()) {
+ *msg = "Communication with baseline server failed: " + proto.errorMessage().toLatin1();
+ *error = true;
+ return true;
+ }
+ item.image = img;
+ item.imageChecksums.prepend(ImageItem::computeChecksum(img));
+ QByteArray srvMsg;
+ switch (list.at(0).status) {
+ case ImageItem::IgnoreItem :
+ qDebug() << msg->constData() << "Ignored, blacklisted on server.";
+ return true;
+ break;
+ case ImageItem::BaselineNotFound:
+ if (proto.submitNewBaseline(item, &srvMsg))
+ qDebug() << msg->constData() << "Baseline not found on server. New baseline uploaded.";
+ else
+ qDebug() << msg->constData() << "Baseline not found on server. Uploading of new baseline failed:" << srvMsg;
+ return true;
+ break;
+ case ImageItem::Ok:
+ break;
+ default:
+ qWarning() << "Unexpected reply from baseline server.";
+ return true;
+ break;
+ }
+ *error = false;
+ // The actual comparison of the given image with the baseline:
+ if (list.at(0).imageChecksums.contains(item.imageChecksums.at(0)))
+ return true;
+ proto.submitMismatch(item, &srvMsg);
+ *msg += "Mismatch. See report:\n " + srvMsg;
+ return false;
+}
+
+}
diff --git a/tests/arthur/common/qbaselinetest.h b/tests/arthur/common/qbaselinetest.h
new file mode 100644
index 0000000..3445c72
--- /dev/null
+++ b/tests/arthur/common/qbaselinetest.h
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+
+#ifndef BASELINETEST_H
+#define BASELINETEST_H
+
+#include <QTest>
+
+namespace QBaselineTest {
+bool checkImage(const QImage& img, const char *name, quint16 checksum, QByteArray *msg, bool *error);
+}
+
+#define QBASELINE_CHECK_SUM(image, name, checksum)\
+do {\
+ QByteArray _msg;\
+ bool _err = false;\
+ if (!QBaselineTest::checkImage((image), (name), (checksum), &_msg, &_err)) {\
+ QFAIL(_msg.constData());\
+ } else if (_err) {\
+ QSKIP(_msg.constData(), SkipSingle);\
+ }\
+} while (0)
+
+#define QBASELINE_CHECK(image, name) QBASELINE_CHECK_SUM(image, name, 0)
+
+#endif // BASELINETEST_H
diff --git a/tests/arthur/common/qbaselinetest.pri b/tests/arthur/common/qbaselinetest.pri
new file mode 100644
index 0000000..5420c6e
--- /dev/null
+++ b/tests/arthur/common/qbaselinetest.pri
@@ -0,0 +1,13 @@
+QT *= testlib
+
+SOURCES += \
+ $$PWD/qbaselinetest.cpp
+
+HEADERS += \
+ $$PWD/qbaselinetest.h
+
+win32|symbian*:MKSPEC=$$replace(QMAKESPEC, \\\\, /)
+else:MKSPEC=$$QMAKESPEC
+DEFINES += QMAKESPEC=\\\"$$MKSPEC\\\"
+
+include($$PWD/baselineprotocol.pri)
diff --git a/tests/auto/baselineexample/baselineexample.pro b/tests/auto/baselineexample/baselineexample.pro
new file mode 100644
index 0000000..30feecc
--- /dev/null
+++ b/tests/auto/baselineexample/baselineexample.pro
@@ -0,0 +1,18 @@
+#-------------------------------------------------
+#
+# Project created by QtCreator 2010-12-09T14:55:13
+#
+#-------------------------------------------------
+
+QT += testlib
+
+TARGET = tst_baselineexample
+CONFIG += console
+CONFIG -= app_bundle
+
+TEMPLATE = app
+
+SOURCES += tst_baselineexample.cpp
+DEFINES += SRCDIR=\\\"$$PWD/\\\"
+
+include($$QT_SOURCE_TREE/tests/arthur/common/qbaselinetest.pri)
diff --git a/tests/auto/baselineexample/tst_baselineexample.cpp b/tests/auto/baselineexample/tst_baselineexample.cpp
new file mode 100644
index 0000000..28cbec5
--- /dev/null
+++ b/tests/auto/baselineexample/tst_baselineexample.cpp
@@ -0,0 +1,158 @@
+/****************************************************************************
+**
+** 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 <qbaselinetest.h>
+#include <QPushButton>
+
+class tst_BaselineExample : public QObject
+{
+ Q_OBJECT
+
+public:
+ tst_BaselineExample();
+
+private Q_SLOTS:
+ void testBasicUsage();
+ void testMultipleImages();
+ void testDataDriven_data();
+ void testDataDriven();
+ void testDataDrivenMultiple_data();
+ void testDataDrivenMultiple();
+ void testChecksum_data();
+ void testChecksum();
+};
+
+
+tst_BaselineExample::tst_BaselineExample()
+{
+}
+
+
+void tst_BaselineExample::testBasicUsage()
+{
+ // Generate an image:
+ QPushButton b("Press me!");
+ b.resize(100, 50);
+ b.show();
+ QTest::qWaitForWindowShown(&b);
+ QImage img1 = QPixmap::grabWidget(&b).toImage();
+ QVERIFY(!img1.isNull());
+
+ // Compare it to baseline on server:
+ QBASELINE_CHECK(img1, "button");
+}
+
+
+void tst_BaselineExample::testMultipleImages()
+{
+ QPushButton b("Press me!");
+ b.resize(100, 50);
+ b.show();
+ QTest::qWaitForWindowShown(&b);
+ QBASELINE_CHECK(QPixmap::grabWidget(&b).toImage(), "text1");
+
+ b.setText("Kick me!");
+ QTest::qWait(50);
+ QBASELINE_CHECK(QPixmap::grabWidget(&b).toImage(), "text2");
+}
+
+
+void tst_BaselineExample::testDataDriven_data()
+{
+ QTest::addColumn<QString>("label");
+ QTest::newRow("short") << "Ok!";
+ QTest::newRow("long") << "A really long button text that just does not seem to end";
+ QTest::newRow("empty") << "";
+}
+
+
+void tst_BaselineExample::testDataDriven()
+{
+ QFETCH(QString, label);
+ QPushButton b(label);
+ b.resize(100, 50);
+ b.show();
+ QTest::qWaitForWindowShown(&b);
+ QBASELINE_CHECK(QPixmap::grabWidget(&b).toImage(), 0);
+}
+
+
+void tst_BaselineExample::testDataDrivenMultiple_data()
+{
+ testDataDriven_data();
+}
+
+
+void tst_BaselineExample::testDataDrivenMultiple()
+{
+ QFETCH(QString, label);
+ QPushButton b(label);
+ b.resize(100, 50);
+ b.show();
+ QTest::qWaitForWindowShown(&b);
+ QBASELINE_CHECK(QPixmap::grabWidget(&b).toImage(), "normal");
+
+ b.setText(label.prepend('&'));
+ QTest::qWait(50);
+ QBASELINE_CHECK(QPixmap::grabWidget(&b).toImage(), "shortcut");
+}
+
+
+void tst_BaselineExample::testChecksum_data()
+{
+ testDataDriven_data();
+}
+
+
+void tst_BaselineExample::testChecksum()
+{
+ QFETCH(QString, label);
+ QPushButton b(label);
+ b.resize(100, 50);
+ b.show();
+ QTest::qWaitForWindowShown(&b);
+ QBASELINE_CHECK_SUM(QPixmap::grabWidget(&b).toImage(), 0, quint16(qHash(label)));
+}
+
+
+QTEST_MAIN(tst_BaselineExample);
+
+#include "tst_baselineexample.moc"
diff --git a/tests/auto/collections/tst_collections.cpp b/tests/auto/collections/tst_collections.cpp
index cf9fa53..225fe79 100644
--- a/tests/auto/collections/tst_collections.cpp
+++ b/tests/auto/collections/tst_collections.cpp
@@ -3635,7 +3635,7 @@ template<template<class, class> class C> void QTBUG13079_collectionInsideCollect
}
-static quint32 qHash(const QTBUG13079_Node<QSet> &)
+quint32 qHash(const QTBUG13079_Node<QSet> &)
{
return 0;
}
diff --git a/tests/auto/corelib.pro b/tests/auto/corelib.pro
index d1d0940..3451b53 100644
--- a/tests/auto/corelib.pro
+++ b/tests/auto/corelib.pro
@@ -101,6 +101,8 @@ SUBDIRS=\
qwritelocker \
selftests \
utf8 \
+ qfilesystementry \
+ qabstractfileengine
symbian:SUBDIRS -= \
qtconcurrentfilter \
diff --git a/tests/auto/declarative/declarative.pro b/tests/auto/declarative/declarative.pro
index f0fcfa9..499c155 100644
--- a/tests/auto/declarative/declarative.pro
+++ b/tests/auto/declarative/declarative.pro
@@ -8,74 +8,78 @@ SUBDIRS += \
SUBDIRS += \
examples \
parserstress \
+ qdeclarativecomponent \
+ qdeclarativecontext \
+ qdeclarativeengine \
+ qdeclarativeerror \
+ qdeclarativefolderlistmodel \
+ qdeclarativeinfo \
+ qdeclarativelayoutitem \
+ qdeclarativelistreference \
+ qdeclarativemoduleplugin \
+ qdeclarativeparticles \
+ qdeclarativepixmapcache \
+ qdeclarativeqt \
+ qdeclarativeview \
+ qdeclarativeviewer \
+ qdeclarativexmlhttprequest \
+ qmlvisual \
+ moduleqt47
+
+contains(QT_CONFIG, private_tests) {
+ SUBDIRS += \
qdeclarativeanchors \
qdeclarativeanimatedimage \
qdeclarativeanimations \
qdeclarativebehaviors \
qdeclarativebinding \
qdeclarativeborderimage \
- qdeclarativecomponent \
qdeclarativeconnection \
- qdeclarativecontext \
qdeclarativedebug \
qdeclarativedebugclient \
qdeclarativedebugservice \
qdeclarativedom \
qdeclarativeecmascript \
- qdeclarativeengine \
- qdeclarativeerror \
- qdeclarativefolderlistmodel \
- qdeclarativefontloader \
qdeclarativeflickable \
qdeclarativeflipable \
qdeclarativefocusscope \
+ qdeclarativefontloader \
qdeclarativegridview \
qdeclarativeimage \
qdeclarativeimageprovider \
- qdeclarativeinfo \
qdeclarativeinstruction \
qdeclarativeitem \
qdeclarativelanguage \
- qdeclarativelayoutitem \
qdeclarativelistmodel \
- qdeclarativelistreference \
qdeclarativelistview \
qdeclarativeloader \
- qdeclarativemoduleplugin \
qdeclarativemousearea \
- qdeclarativeparticles \
qdeclarativepathview \
- qdeclarativepixmapcache \
qdeclarativepositioners \
qdeclarativeproperty \
qdeclarativepropertymap \
- qdeclarativeqt \
qdeclarativerepeater \
qdeclarativesmoothedanimation \
qdeclarativespringanimation \
+ qdeclarativestyledtext \
qdeclarativesqldatabase \
qdeclarativestates \
- qdeclarativestyledtext \
qdeclarativesystempalette \
qdeclarativetext \
qdeclarativetextedit \
qdeclarativetextinput \
qdeclarativetimer \
qdeclarativevaluetypes \
- qdeclarativeview \
- qdeclarativeviewer \
qdeclarativevisualdatamodel \
qdeclarativeworkerscript \
- qdeclarativexmlhttprequest \
qdeclarativexmllistmodel \
- qmlvisual \
- qpacketprotocol \
- moduleqt47
+ qpacketprotocol
contains(QT_CONFIG, webkit) {
SUBDIRS += \
qdeclarativewebview
}
+}
# Tests which should run in Pulse
PULSE_TESTS = $$SUBDIRS
diff --git a/tests/auto/declarative/examples/examples.pro b/tests/auto/declarative/examples/examples.pro
index 8ed33da..dafc146 100644
--- a/tests/auto/declarative/examples/examples.pro
+++ b/tests/auto/declarative/examples/examples.pro
@@ -6,10 +6,12 @@ SOURCES += tst_examples.cpp
include(../../../../tools/qml/qml.pri)
+include(../symbianlibs.pri)
+
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/moduleqt47/moduleqt47.pro b/tests/auto/declarative/moduleqt47/moduleqt47.pro
index 808f263..ff773e8 100644
--- a/tests/auto/declarative/moduleqt47/moduleqt47.pro
+++ b/tests/auto/declarative/moduleqt47/moduleqt47.pro
@@ -7,7 +7,7 @@ SOURCES += tst_moduleqt47.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/parserstress/parserstress.pro b/tests/auto/declarative/parserstress/parserstress.pro
index 1e323f7..6ef2432 100644
--- a/tests/auto/declarative/parserstress/parserstress.pro
+++ b/tests/auto/declarative/parserstress/parserstress.pro
@@ -7,7 +7,7 @@ SOURCES += tst_parserstress.cpp
symbian: {
importFiles.files = ..\\..\\qscriptjstestsuite\\tests
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativeanchors/qdeclarativeanchors.pro b/tests/auto/declarative/qdeclarativeanchors/qdeclarativeanchors.pro
index 141e25d..f09e8d9 100644
--- a/tests/auto/declarative/qdeclarativeanchors/qdeclarativeanchors.pro
+++ b/tests/auto/declarative/qdeclarativeanchors/qdeclarativeanchors.pro
@@ -6,7 +6,7 @@ macx:CONFIG -= app_bundle
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativeanimatedimage/qdeclarativeanimatedimage.pro b/tests/auto/declarative/qdeclarativeanimatedimage/qdeclarativeanimatedimage.pro
index ad9509a..3d040a6 100644
--- a/tests/auto/declarative/qdeclarativeanimatedimage/qdeclarativeanimatedimage.pro
+++ b/tests/auto/declarative/qdeclarativeanimatedimage/qdeclarativeanimatedimage.pro
@@ -7,7 +7,7 @@ macx:CONFIG -= app_bundle
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativeanimations/qdeclarativeanimations.pro b/tests/auto/declarative/qdeclarativeanimations/qdeclarativeanimations.pro
index 84cd498..d00d51a 100644
--- a/tests/auto/declarative/qdeclarativeanimations/qdeclarativeanimations.pro
+++ b/tests/auto/declarative/qdeclarativeanimations/qdeclarativeanimations.pro
@@ -6,7 +6,7 @@ macx:CONFIG -= app_bundle
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativebehaviors/qdeclarativebehaviors.pro b/tests/auto/declarative/qdeclarativebehaviors/qdeclarativebehaviors.pro
index e4125fd..7416827 100644
--- a/tests/auto/declarative/qdeclarativebehaviors/qdeclarativebehaviors.pro
+++ b/tests/auto/declarative/qdeclarativebehaviors/qdeclarativebehaviors.pro
@@ -6,7 +6,7 @@ macx:CONFIG -= app_bundle
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativebinding/qdeclarativebinding.pro b/tests/auto/declarative/qdeclarativebinding/qdeclarativebinding.pro
index 25bdbec..fe12635 100644
--- a/tests/auto/declarative/qdeclarativebinding/qdeclarativebinding.pro
+++ b/tests/auto/declarative/qdeclarativebinding/qdeclarativebinding.pro
@@ -7,7 +7,7 @@ SOURCES += tst_qdeclarativebinding.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativeborderimage/qdeclarativeborderimage.pro b/tests/auto/declarative/qdeclarativeborderimage/qdeclarativeborderimage.pro
index 05d4cac..a7463e8 100644
--- a/tests/auto/declarative/qdeclarativeborderimage/qdeclarativeborderimage.pro
+++ b/tests/auto/declarative/qdeclarativeborderimage/qdeclarativeborderimage.pro
@@ -8,7 +8,7 @@ SOURCES += tst_qdeclarativeborderimage.cpp ../shared/testhttpserver.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativecomponent/tst_qdeclarativecomponent.cpp b/tests/auto/declarative/qdeclarativecomponent/tst_qdeclarativecomponent.cpp
index 8a19b8b..60ce46d 100644
--- a/tests/auto/declarative/qdeclarativecomponent/tst_qdeclarativecomponent.cpp
+++ b/tests/auto/declarative/qdeclarativecomponent/tst_qdeclarativecomponent.cpp
@@ -57,6 +57,7 @@ public:
tst_qdeclarativecomponent() { }
private slots:
+ void null();
void loadEmptyUrl();
void qmlCreateObject();
@@ -64,6 +65,20 @@ private:
QDeclarativeEngine engine;
};
+void tst_qdeclarativecomponent::null()
+{
+ {
+ QDeclarativeComponent c;
+ QVERIFY(c.isNull());
+ }
+
+ {
+ QDeclarativeComponent c(&engine);
+ QVERIFY(c.isNull());
+ }
+}
+
+
void tst_qdeclarativecomponent::loadEmptyUrl()
{
QDeclarativeComponent c(&engine);
diff --git a/tests/auto/declarative/qdeclarativeconnection/qdeclarativeconnection.pro b/tests/auto/declarative/qdeclarativeconnection/qdeclarativeconnection.pro
index c614571..6f9550d 100644
--- a/tests/auto/declarative/qdeclarativeconnection/qdeclarativeconnection.pro
+++ b/tests/auto/declarative/qdeclarativeconnection/qdeclarativeconnection.pro
@@ -7,7 +7,7 @@ SOURCES += tst_qdeclarativeconnection.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativedom/qdeclarativedom.pro b/tests/auto/declarative/qdeclarativedom/qdeclarativedom.pro
index e8f24a5..8ac69aa 100644
--- a/tests/auto/declarative/qdeclarativedom/qdeclarativedom.pro
+++ b/tests/auto/declarative/qdeclarativedom/qdeclarativedom.pro
@@ -7,7 +7,7 @@ SOURCES += tst_qdeclarativedom.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/AliasBindingsAssignCorrectlyType.qml b/tests/auto/declarative/qdeclarativeecmascript/data/AliasBindingsAssignCorrectlyType.qml
new file mode 100644
index 0000000..0eda67d
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/AliasBindingsAssignCorrectlyType.qml
@@ -0,0 +1,9 @@
+import QtQuick 1.0
+
+QtObject {
+ id: root
+
+ property real realProperty
+ property alias aliasProperty: root.realProperty
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/AliasBindingsOverrideTargetType.qml b/tests/auto/declarative/qdeclarativeecmascript/data/AliasBindingsOverrideTargetType.qml
new file mode 100644
index 0000000..f539fb6
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/AliasBindingsOverrideTargetType.qml
@@ -0,0 +1,14 @@
+import QtQuick 1.0
+import Qt.test 1.0
+
+MyTypeObject {
+ id: root
+
+ property int data: 7
+
+ property int targetProperty: root.data * 43 - root.data
+ property alias aliasProperty: root.targetProperty
+
+ pointProperty: Qt.point(data, data);
+ property alias pointAliasProperty: root.pointProperty
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/AliasBindingsOverrideTargetType3.qml b/tests/auto/declarative/qdeclarativeecmascript/data/AliasBindingsOverrideTargetType3.qml
new file mode 100644
index 0000000..a4b0527
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/AliasBindingsOverrideTargetType3.qml
@@ -0,0 +1,9 @@
+import QtQuick 1.0
+
+QtObject {
+ id: root
+
+ property int testProperty
+ property alias aliasProperty: root.testProperty
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsAssignCorrectly.qml b/tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsAssignCorrectly.qml
new file mode 100644
index 0000000..f0808c4
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsAssignCorrectly.qml
@@ -0,0 +1,59 @@
+import QtQuick 1.0
+
+Item {
+ id: root
+
+ property bool test: false
+
+ property real testData: 9
+ property real testData2: 9
+
+ states: State {
+ name: "change"
+ PropertyChanges {
+ target: myType
+ realProperty: if (testData2 > 3) 9; else 11;
+ }
+ }
+
+ AliasBindingsAssignCorrectlyType {
+ id: myType
+
+ aliasProperty: if (testData > 3) 14; else 12;
+ }
+
+ Component.onCompleted: {
+ // Check original binding works
+ if (myType.aliasProperty != 14) return;
+
+ testData = 2;
+ if (myType.aliasProperty != 12) return;
+
+ // Change binding indirectly by modifying the "realProperty"
+ root.state = "change";
+ if (myType.aliasProperty != 9) return;
+
+ // Check the new binding works
+ testData2 = 1;
+ if (myType.aliasProperty != 11) return;
+
+ // Try and trigger the old binding (that should have been removed)
+ testData = 6;
+ if (myType.aliasProperty != 11) return;
+
+ // Restore the original binding
+ root.state = "";
+ if (myType.aliasProperty != 14) return;
+
+ // Test the restored binding works
+ testData = 0;
+ if (myType.aliasProperty != 12) return;
+
+ // Test the old binding isn't somehow hanging around and still in effect
+ testData2 = 13;
+ if (myType.aliasProperty != 12) return;
+
+ test = true;
+ }
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsOverrideTarget.2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsOverrideTarget.2.qml
new file mode 100644
index 0000000..4f07cbf
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsOverrideTarget.2.qml
@@ -0,0 +1,29 @@
+import QtQuick 1.0
+
+Item {
+ id: me
+ property bool test: false
+
+ property int value: 9
+
+ AliasBindingsOverrideTargetType {
+ id: aliasType
+ pointAliasProperty.x: me.value
+ }
+
+ Component.onCompleted: {
+ if (aliasType.pointAliasProperty.x != 9) return;
+
+ me.value = 11;
+ if (aliasType.pointAliasProperty.x != 11) return;
+
+ aliasType.data = 8;
+ if (aliasType.pointAliasProperty.x != 11) return;
+
+ me.value = 4;
+ if (aliasType.pointAliasProperty.x != 4) return;
+
+ test = true;
+ }
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsOverrideTarget.3.qml b/tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsOverrideTarget.3.qml
new file mode 100644
index 0000000..937ae91
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsOverrideTarget.3.qml
@@ -0,0 +1,24 @@
+import QtQuick 1.0
+
+Item {
+ id: root
+ property bool test: false;
+
+ property int value1: 10
+ property int value2: 11
+
+ AliasBindingsOverrideTargetType3 {
+ id: obj
+
+ testProperty: root.value1 * 9
+ aliasProperty: root.value2 * 10
+ }
+
+ Component.onCompleted: {
+ if (obj.testProperty != 110) return;
+ if (obj.aliasProperty != 110) return;
+
+ test = true;
+ }
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsOverrideTarget.qml b/tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsOverrideTarget.qml
new file mode 100644
index 0000000..a01dc5b
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsOverrideTarget.qml
@@ -0,0 +1,28 @@
+import QtQuick 1.0
+
+Item {
+ id: me
+ property bool test: false
+
+ property int value: 9
+
+ AliasBindingsOverrideTargetType {
+ id: aliasType
+ aliasProperty: me.value
+ }
+
+ Component.onCompleted: {
+ if (aliasType.aliasProperty != 9) return;
+
+ me.value = 11;
+ if (aliasType.aliasProperty != 11) return;
+
+ aliasType.data = 8;
+ if (aliasType.aliasProperty != 11) return;
+
+ me.value = 4;
+ if (aliasType.aliasProperty != 4) return;
+
+ test = true;
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/aliasWritesOverrideBindings.2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/aliasWritesOverrideBindings.2.qml
new file mode 100644
index 0000000..5bf9f6a
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/aliasWritesOverrideBindings.2.qml
@@ -0,0 +1,29 @@
+import QtQuick 1.0
+
+Item {
+ id: me
+ property bool test: false
+
+ property int value: 9
+
+ AliasBindingsOverrideTargetType {
+ id: aliasType
+ }
+
+ Component.onCompleted: {
+ if (aliasType.aliasProperty != 294) return;
+
+ aliasType.data = 8;
+ if (aliasType.aliasProperty != 336) return;
+
+ aliasType.aliasProperty = 4;
+ if (aliasType.aliasProperty != 4) return;
+
+ aliasType.data = 7;
+ if (aliasType.aliasProperty != 4) return;
+
+ test = true;
+ }
+}
+
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/aliasWritesOverrideBindings.3.qml b/tests/auto/declarative/qdeclarativeecmascript/data/aliasWritesOverrideBindings.3.qml
new file mode 100644
index 0000000..a23ad4a
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/aliasWritesOverrideBindings.3.qml
@@ -0,0 +1,23 @@
+import QtQuick 1.0
+
+Item {
+ id: me
+ property bool test: false
+
+ property int value: 9
+
+ AliasBindingsOverrideTargetType {
+ id: aliasType
+ pointAliasProperty.x: 9
+ }
+
+ Component.onCompleted: {
+ if (aliasType.pointAliasProperty.x != 9) return;
+
+ aliasType.data = 8;
+ if (aliasType.pointAliasProperty.x != 9) return;
+
+ test = true;
+ }
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/aliasWritesOverrideBindings.qml b/tests/auto/declarative/qdeclarativeecmascript/data/aliasWritesOverrideBindings.qml
new file mode 100644
index 0000000..ac20371
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/aliasWritesOverrideBindings.qml
@@ -0,0 +1,23 @@
+import QtQuick 1.0
+
+Item {
+ id: me
+ property bool test: false
+
+ property int value: 9
+
+ AliasBindingsOverrideTargetType {
+ id: aliasType
+ aliasProperty: 11
+ }
+
+ Component.onCompleted: {
+ if (aliasType.aliasProperty != 11) return;
+
+ aliasType.data = 8;
+ if (aliasType.aliasProperty != 11) return;
+
+ test = true;
+ }
+}
+
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/writeRemovesBinding.qml b/tests/auto/declarative/qdeclarativeecmascript/data/writeRemovesBinding.qml
new file mode 100644
index 0000000..035f037
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/writeRemovesBinding.qml
@@ -0,0 +1,46 @@
+import QtQuick 1.0
+
+QtObject {
+ id: root
+
+ property bool test: false
+
+ property real data: 9
+ property real binding: data
+
+ property alias aliasProperty: root.aliasBinding
+ property real aliasBinding: data
+
+ Component.onCompleted: {
+ // Non-aliased properties
+ if (binding != 9) return;
+
+ data = 11;
+ if (binding != 11) return;
+
+ binding = 6;
+ if (binding != 6) return;
+
+ data = 3;
+ if (binding != 6) return;
+
+
+ // Writing through an aliased property
+ if (aliasProperty != 3) return;
+ if (aliasBinding != 3) return;
+
+ data = 4;
+ if (aliasProperty != 4) return;
+ if (aliasBinding != 4) return;
+
+ aliasProperty = 19;
+ if (aliasProperty != 19) return;
+ if (aliasBinding != 19) return;
+
+ data = 5;
+ if (aliasProperty != 19) return;
+ if (aliasBinding != 19) return;
+
+ test = true;
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/qdeclarativeecmascript.pro b/tests/auto/declarative/qdeclarativeecmascript/qdeclarativeecmascript.pro
index e7f8636..69d25a4 100644
--- a/tests/auto/declarative/qdeclarativeecmascript/qdeclarativeecmascript.pro
+++ b/tests/auto/declarative/qdeclarativeecmascript/qdeclarativeecmascript.pro
@@ -15,7 +15,7 @@ INCLUDEPATH += ../shared
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
index 652404c..77fab91 100644
--- a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
+++ b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
@@ -135,6 +135,8 @@ private slots:
void scriptConnect();
void scriptDisconnect();
void ownership();
+ void cppOwnershipReturnValue();
+ void ownershipCustomReturnValue();
void qlistqobjectMethods();
void strictlyEquals();
void compiled();
@@ -164,6 +166,10 @@ private slots:
void in();
void sharedAttachedObject();
void objectName();
+ void writeRemovesBinding();
+ void aliasBindingsAssignCorrectly();
+ void aliasBindingsOverrideTarget();
+ void aliasWritesOverrideBindings();
void include();
@@ -741,11 +747,9 @@ void tst_qdeclarativeecmascript::constantsOverrideBindings()
QVERIFY(object != 0);
QCOMPARE(object->property("c1").toInt(), 0);
- QEXPECT_FAIL("", "QTBUG-13719", Continue);
QCOMPARE(object->property("c3").toInt(), 10);
object->setProperty("c1", QVariant(9));
QCOMPARE(object->property("c1").toInt(), 9);
- QEXPECT_FAIL("", "QTBUG-13719", Continue);
QCOMPARE(object->property("c3").toInt(), 10);
}
}
@@ -2098,6 +2102,87 @@ void tst_qdeclarativeecmascript::ownership()
}
}
+class CppOwnershipReturnValue : public QObject
+{
+ Q_OBJECT
+public:
+ CppOwnershipReturnValue() : value(0) {}
+ ~CppOwnershipReturnValue() { delete value; }
+
+ Q_INVOKABLE QObject *create() {
+ Q_ASSERT(value == 0);
+
+ value = new QObject;
+ QDeclarativeEngine::setObjectOwnership(value, QDeclarativeEngine::CppOwnership);
+ return value;
+ }
+
+ Q_INVOKABLE MyQmlObject *createQmlObject() {
+ Q_ASSERT(value == 0);
+
+ MyQmlObject *rv = new MyQmlObject;
+ value = rv;
+ return rv;
+ }
+
+ QPointer<QObject> value;
+};
+
+// QTBUG-15695.
+// Test setObjectOwnership(CppOwnership) works even when there is no QDeclarativeData
+void tst_qdeclarativeecmascript::cppOwnershipReturnValue()
+{
+ CppOwnershipReturnValue source;
+
+ {
+ QDeclarativeEngine engine;
+ engine.rootContext()->setContextProperty("source", &source);
+
+ QVERIFY(source.value == 0);
+
+ QDeclarativeComponent component(&engine);
+ component.setData("import QtQuick 1.0\nQtObject {\nComponent.onCompleted: { var a = source.create(); }\n}\n", QUrl());
+
+ QObject *object = component.create();
+
+ QVERIFY(object != 0);
+ QVERIFY(source.value != 0);
+
+ delete object;
+ }
+
+ QCoreApplication::instance()->processEvents(QEventLoop::DeferredDeletion);
+
+ QVERIFY(source.value != 0);
+}
+
+// QTBUG-15697
+void tst_qdeclarativeecmascript::ownershipCustomReturnValue()
+{
+ CppOwnershipReturnValue source;
+
+ {
+ QDeclarativeEngine engine;
+ engine.rootContext()->setContextProperty("source", &source);
+
+ QVERIFY(source.value == 0);
+
+ QDeclarativeComponent component(&engine);
+ component.setData("import QtQuick 1.0\nQtObject {\nComponent.onCompleted: { var a = source.createQmlObject(); }\n}\n", QUrl());
+
+ QObject *object = component.create();
+
+ QVERIFY(object != 0);
+ QVERIFY(source.value != 0);
+
+ delete object;
+ }
+
+ QCoreApplication::instance()->processEvents(QEventLoop::DeferredDeletion);
+
+ QVERIFY(source.value == 0);
+}
+
class QListQObjectMethodsObject : public QObject
{
Q_OBJECT
@@ -2671,6 +2756,97 @@ void tst_qdeclarativeecmascript::objectName()
delete o;
}
+void tst_qdeclarativeecmascript::writeRemovesBinding()
+{
+ QDeclarativeComponent component(&engine, TEST_FILE("writeRemovesBinding.qml"));
+ QObject *o = component.create();
+ QVERIFY(o != 0);
+
+ QCOMPARE(o->property("test").toBool(), true);
+
+ delete o;
+}
+
+// Test bindings assigned to alias properties actually assign to the alias' target
+void tst_qdeclarativeecmascript::aliasBindingsAssignCorrectly()
+{
+ QDeclarativeComponent component(&engine, TEST_FILE("aliasBindingsAssignCorrectly.qml"));
+ QObject *o = component.create();
+ QVERIFY(o != 0);
+
+ QCOMPARE(o->property("test").toBool(), true);
+
+ delete o;
+}
+
+// Test bindings assigned to alias properties override a binding on the target (QTBUG-13719)
+void tst_qdeclarativeecmascript::aliasBindingsOverrideTarget()
+{
+ {
+ QDeclarativeComponent component(&engine, TEST_FILE("aliasBindingsOverrideTarget.qml"));
+ QObject *o = component.create();
+ QVERIFY(o != 0);
+
+ QCOMPARE(o->property("test").toBool(), true);
+
+ delete o;
+ }
+
+ {
+ QDeclarativeComponent component(&engine, TEST_FILE("aliasBindingsOverrideTarget.2.qml"));
+ QObject *o = component.create();
+ QVERIFY(o != 0);
+
+ QCOMPARE(o->property("test").toBool(), true);
+
+ delete o;
+ }
+
+ {
+ QDeclarativeComponent component(&engine, TEST_FILE("aliasBindingsOverrideTarget.3.qml"));
+ QObject *o = component.create();
+ QVERIFY(o != 0);
+
+ QCOMPARE(o->property("test").toBool(), true);
+
+ delete o;
+ }
+}
+
+// Test that writes to alias properties override bindings on the alias target (QTBUG-13719)
+void tst_qdeclarativeecmascript::aliasWritesOverrideBindings()
+{
+ {
+ QDeclarativeComponent component(&engine, TEST_FILE("aliasWritesOverrideBindings.qml"));
+ QObject *o = component.create();
+ QVERIFY(o != 0);
+
+ QCOMPARE(o->property("test").toBool(), true);
+
+ delete o;
+ }
+
+ {
+ QDeclarativeComponent component(&engine, TEST_FILE("aliasWritesOverrideBindings.2.qml"));
+ QObject *o = component.create();
+ QVERIFY(o != 0);
+
+ QCOMPARE(o->property("test").toBool(), true);
+
+ delete o;
+ }
+
+ {
+ QDeclarativeComponent component(&engine, TEST_FILE("aliasWritesOverrideBindings.3.qml"));
+ QObject *o = component.create();
+ QVERIFY(o != 0);
+
+ QCOMPARE(o->property("test").toBool(), true);
+
+ delete o;
+ }
+}
+
QTEST_MAIN(tst_qdeclarativeecmascript)
#include "tst_qdeclarativeecmascript.moc"
diff --git a/tests/auto/declarative/qdeclarativeflickable/qdeclarativeflickable.pro b/tests/auto/declarative/qdeclarativeflickable/qdeclarativeflickable.pro
index 1fb99d0..c176e07 100644
--- a/tests/auto/declarative/qdeclarativeflickable/qdeclarativeflickable.pro
+++ b/tests/auto/declarative/qdeclarativeflickable/qdeclarativeflickable.pro
@@ -7,7 +7,7 @@ SOURCES += tst_qdeclarativeflickable.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativeflipable/qdeclarativeflipable.pro b/tests/auto/declarative/qdeclarativeflipable/qdeclarativeflipable.pro
index eddd053..3b6d19a 100644
--- a/tests/auto/declarative/qdeclarativeflipable/qdeclarativeflipable.pro
+++ b/tests/auto/declarative/qdeclarativeflipable/qdeclarativeflipable.pro
@@ -7,7 +7,7 @@ SOURCES += tst_qdeclarativeflipable.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativefocusscope/data/forceActiveFocus.qml b/tests/auto/declarative/qdeclarativefocusscope/data/forceActiveFocus.qml
new file mode 100644
index 0000000..6c39d4a
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativefocusscope/data/forceActiveFocus.qml
@@ -0,0 +1,26 @@
+import QtQuick 1.0
+
+Rectangle {
+ objectName: "root"
+ FocusScope {
+ objectName: "scope"
+ Item {
+ objectName: "item-a1"
+ FocusScope {
+ objectName: "scope-a"
+ Item {
+ objectName: "item-a2"
+ }
+ }
+ }
+ Item {
+ objectName: "item-b1"
+ FocusScope {
+ objectName: "scope-b"
+ Item {
+ objectName: "item-b2"
+ }
+ }
+ }
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativefocusscope/qdeclarativefocusscope.pro b/tests/auto/declarative/qdeclarativefocusscope/qdeclarativefocusscope.pro
index fd7f6b8..eab983f 100644
--- a/tests/auto/declarative/qdeclarativefocusscope/qdeclarativefocusscope.pro
+++ b/tests/auto/declarative/qdeclarativefocusscope/qdeclarativefocusscope.pro
@@ -6,7 +6,7 @@ macx:CONFIG -= app_bundle
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativefocusscope/tst_qdeclarativefocusscope.cpp b/tests/auto/declarative/qdeclarativefocusscope/tst_qdeclarativefocusscope.cpp
index 1645dac..6a3627b 100644
--- a/tests/auto/declarative/qdeclarativefocusscope/tst_qdeclarativefocusscope.cpp
+++ b/tests/auto/declarative/qdeclarativefocusscope/tst_qdeclarativefocusscope.cpp
@@ -71,6 +71,7 @@ private slots:
void noParentFocus();
void signalEmission();
void qtBug13380();
+ void forceActiveFocus();
};
/*
@@ -432,6 +433,114 @@ void tst_qdeclarativefocusscope::qtBug13380()
delete view;
}
+void tst_qdeclarativefocusscope::forceActiveFocus()
+{
+ QDeclarativeView *view = new QDeclarativeView;
+ view->setSource(QUrl::fromLocalFile(SRCDIR "/data/forceActiveFocus.qml"));
+
+ QGraphicsObject *rootObject = view->rootObject();
+ QVERIFY(rootObject);
+
+ QDeclarativeItem *scope = findItem<QDeclarativeItem>(rootObject, QLatin1String("scope"));
+ QDeclarativeItem *itemA1 = findItem<QDeclarativeItem>(rootObject, QLatin1String("item-a1"));
+ QDeclarativeItem *scopeA = findItem<QDeclarativeItem>(rootObject, QLatin1String("scope-a"));
+ QDeclarativeItem *itemA2 = findItem<QDeclarativeItem>(rootObject, QLatin1String("item-a2"));
+ QDeclarativeItem *itemB1 = findItem<QDeclarativeItem>(rootObject, QLatin1String("item-b1"));
+ QDeclarativeItem *scopeB = findItem<QDeclarativeItem>(rootObject, QLatin1String("scope-b"));
+ QDeclarativeItem *itemB2 = findItem<QDeclarativeItem>(rootObject, QLatin1String("item-b2"));
+
+ QVERIFY(scope);
+ QVERIFY(itemA1);
+ QVERIFY(scopeA);
+ QVERIFY(itemA2);
+ QVERIFY(itemB1);
+ QVERIFY(scopeB);
+ QVERIFY(itemB2);
+
+ QSignalSpy rootSpy(rootObject, SIGNAL(activeFocusChanged(bool)));
+ QSignalSpy scopeSpy(scope, SIGNAL(activeFocusChanged(bool)));
+ QSignalSpy scopeASpy(scopeA, SIGNAL(activeFocusChanged(bool)));
+ QSignalSpy scopeBSpy(scopeB, SIGNAL(activeFocusChanged(bool)));
+
+ // First, walk the focus from item-a1 down to item-a2 and back again
+ itemA1->forceActiveFocus();
+ QVERIFY(itemA1->hasActiveFocus());
+ QCOMPARE(rootSpy.count(), 1);
+ QCOMPARE(scopeSpy.count(), 1);
+
+ scopeA->forceActiveFocus();
+ QVERIFY(!itemA1->hasActiveFocus());
+ QVERIFY(scopeA->hasActiveFocus());
+ QCOMPARE(scopeASpy.count(), 1);
+ QCOMPARE(rootSpy.count(), 1);
+ QCOMPARE(scopeSpy.count(), 1);
+
+ itemA2->forceActiveFocus();
+ QVERIFY(!itemA1->hasActiveFocus());
+ QVERIFY(itemA2->hasActiveFocus());
+ QVERIFY(scopeA->hasActiveFocus());
+ QCOMPARE(scopeASpy.count(), 1);
+ QCOMPARE(rootSpy.count(), 1);
+ QCOMPARE(scopeSpy.count(), 1);
+
+ scopeA->forceActiveFocus();
+ QVERIFY(!itemA1->hasActiveFocus());
+ QVERIFY(itemA2->hasActiveFocus());
+ QVERIFY(scopeA->hasActiveFocus());
+ QCOMPARE(scopeASpy.count(), 1);
+ QCOMPARE(rootSpy.count(), 1);
+ QCOMPARE(scopeSpy.count(), 1);
+
+ itemA1->forceActiveFocus();
+ QVERIFY(itemA1->hasActiveFocus());
+ QVERIFY(!scopeA->hasActiveFocus());
+ QVERIFY(!itemA2->hasActiveFocus());
+ QCOMPARE(scopeASpy.count(), 2);
+ QCOMPARE(rootSpy.count(), 1);
+ QCOMPARE(scopeSpy.count(), 1);
+
+ // Then jump back and forth between branch 'a' and 'b'
+ itemB1->forceActiveFocus();
+ QVERIFY(itemB1->hasActiveFocus());
+ QCOMPARE(rootSpy.count(), 1);
+ QCOMPARE(scopeSpy.count(), 1);
+
+ scopeA->forceActiveFocus();
+ QVERIFY(!itemA1->hasActiveFocus());
+ QVERIFY(!itemB1->hasActiveFocus());
+ QVERIFY(scopeA->hasActiveFocus());
+ QCOMPARE(scopeASpy.count(), 3);
+ QCOMPARE(rootSpy.count(), 1);
+ QCOMPARE(scopeSpy.count(), 1);
+
+ scopeB->forceActiveFocus();
+ QVERIFY(!scopeA->hasActiveFocus());
+ QVERIFY(!itemB1->hasActiveFocus());
+ QVERIFY(scopeB->hasActiveFocus());
+ QCOMPARE(scopeASpy.count(), 4);
+ QCOMPARE(scopeBSpy.count(), 1);
+ QCOMPARE(rootSpy.count(), 1);
+ QCOMPARE(scopeSpy.count(), 1);
+
+ itemA2->forceActiveFocus();
+ QVERIFY(!scopeB->hasActiveFocus());
+ QVERIFY(itemA2->hasActiveFocus());
+ QCOMPARE(scopeASpy.count(), 5);
+ QCOMPARE(scopeBSpy.count(), 2);
+ QCOMPARE(rootSpy.count(), 1);
+ QCOMPARE(scopeSpy.count(), 1);
+
+ itemB2->forceActiveFocus();
+ QVERIFY(!itemA2->hasActiveFocus());
+ QVERIFY(itemB2->hasActiveFocus());
+ QCOMPARE(scopeASpy.count(), 6);
+ QCOMPARE(scopeBSpy.count(), 3);
+ QCOMPARE(rootSpy.count(), 1);
+ QCOMPARE(scopeSpy.count(), 1);
+
+ delete view;
+}
+
QTEST_MAIN(tst_qdeclarativefocusscope)
#include "tst_qdeclarativefocusscope.moc"
diff --git a/tests/auto/declarative/qdeclarativefolderlistmodel/qdeclarativefolderlistmodel.pro b/tests/auto/declarative/qdeclarativefolderlistmodel/qdeclarativefolderlistmodel.pro
index 50c7ca0..b7e5e5f 100644
--- a/tests/auto/declarative/qdeclarativefolderlistmodel/qdeclarativefolderlistmodel.pro
+++ b/tests/auto/declarative/qdeclarativefolderlistmodel/qdeclarativefolderlistmodel.pro
@@ -7,7 +7,7 @@ SOURCES += tst_qdeclarativefolderlistmodel.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativefontloader/qdeclarativefontloader.pro b/tests/auto/declarative/qdeclarativefontloader/qdeclarativefontloader.pro
index f245a0d..357268b 100644
--- a/tests/auto/declarative/qdeclarativefontloader/qdeclarativefontloader.pro
+++ b/tests/auto/declarative/qdeclarativefontloader/qdeclarativefontloader.pro
@@ -8,7 +8,7 @@ SOURCES += tst_qdeclarativefontloader.cpp ../shared/testhttpserver.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativegridview/data/manual-highlight.qml b/tests/auto/declarative/qdeclarativegridview/data/manual-highlight.qml
index 7bb2c95..d082847 100644
--- a/tests/auto/declarative/qdeclarativegridview/data/manual-highlight.qml
+++ b/tests/auto/declarative/qdeclarativegridview/data/manual-highlight.qml
@@ -28,8 +28,8 @@ Item {
objectName: "highlight"
width: 80; height: 80
color: "lightsteelblue"; radius: 5
- y: grid.currentItem.y
- x: grid.currentItem.x
+ y: grid.currentItem.y+5
+ x: grid.currentItem.x+5
}
}
diff --git a/tests/auto/declarative/qdeclarativegridview/qdeclarativegridview.pro b/tests/auto/declarative/qdeclarativegridview/qdeclarativegridview.pro
index b775b3d..bc196fb 100644
--- a/tests/auto/declarative/qdeclarativegridview/qdeclarativegridview.pro
+++ b/tests/auto/declarative/qdeclarativegridview/qdeclarativegridview.pro
@@ -7,7 +7,7 @@ SOURCES += tst_qdeclarativegridview.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp b/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp
index 327bba2..a2dcf1c 100644
--- a/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp
+++ b/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp
@@ -84,6 +84,7 @@ private slots:
void manualHighlight();
void footer();
void header();
+ void indexAt();
private:
QDeclarativeView *createView();
@@ -1215,15 +1216,22 @@ void tst_QDeclarativeGridView::manualHighlight()
QTRY_COMPARE(gridview->currentIndex(), 0);
QTRY_COMPARE(gridview->currentItem(), findItem<QDeclarativeItem>(contentItem, "wrapper", 0));
- QTRY_COMPARE(gridview->highlightItem()->y(), gridview->currentItem()->y());
- QTRY_COMPARE(gridview->highlightItem()->x(), gridview->currentItem()->x());
+ QTRY_COMPARE(gridview->highlightItem()->y() - 5, gridview->currentItem()->y());
+ QTRY_COMPARE(gridview->highlightItem()->x() - 5, gridview->currentItem()->x());
gridview->setCurrentIndex(2);
QTRY_COMPARE(gridview->currentIndex(), 2);
QTRY_COMPARE(gridview->currentItem(), findItem<QDeclarativeItem>(contentItem, "wrapper", 2));
- QTRY_COMPARE(gridview->highlightItem()->y(), gridview->currentItem()->y());
- QTRY_COMPARE(gridview->highlightItem()->x(), gridview->currentItem()->x());
+ QTRY_COMPARE(gridview->highlightItem()->y() - 5, gridview->currentItem()->y());
+ QTRY_COMPARE(gridview->highlightItem()->x() - 5, gridview->currentItem()->x());
+
+ gridview->positionViewAtIndex(8, QDeclarativeGridView::Contain);
+
+ QTRY_COMPARE(gridview->currentIndex(), 2);
+ 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());
}
void tst_QDeclarativeGridView::footer()
@@ -1263,7 +1271,7 @@ void tst_QDeclarativeGridView::header()
QDeclarativeView *canvas = createView();
TestModel model;
- for (int i = 0; i < 7; i++)
+ for (int i = 0; i < 30; i++)
model.addItem("Item" + QString::number(i), "");
QDeclarativeContext *ctxt = canvas->rootContext();
@@ -1292,6 +1300,42 @@ void tst_QDeclarativeGridView::header()
QTRY_COMPARE(header->y(), 0.0);
}
+void tst_QDeclarativeGridView::indexAt()
+{
+ QDeclarativeView *canvas = createView();
+
+ TestModel model;
+ model.addItem("Fred", "12345");
+ model.addItem("John", "2345");
+ model.addItem("Bob", "54321");
+ model.addItem("Billy", "22345");
+ model.addItem("Sam", "2945");
+ model.addItem("Ben", "04321");
+ model.addItem("Jim", "0780");
+
+ 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);
+
+ QDeclarativeItem *contentItem = gridview->contentItem();
+ QTRY_VERIFY(contentItem != 0);
+
+ QTRY_COMPARE(gridview->count(), model.count());
+
+ QCOMPARE(gridview->indexAt(0, 0), 0);
+ QCOMPARE(gridview->indexAt(79, 59), 0);
+ QCOMPARE(gridview->indexAt(80, 0), 1);
+ QCOMPARE(gridview->indexAt(0, 60), 3);
+ QCOMPARE(gridview->indexAt(240, 0), -1);
+
+ delete canvas;
+}
QDeclarativeView *tst_QDeclarativeGridView::createView()
{
diff --git a/tests/auto/declarative/qdeclarativeimage/data/heart-win32.png b/tests/auto/declarative/qdeclarativeimage/data/heart-win32.png
index 5992e79..351da13 100644
--- a/tests/auto/declarative/qdeclarativeimage/data/heart-win32.png
+++ b/tests/auto/declarative/qdeclarativeimage/data/heart-win32.png
Binary files differ
diff --git a/tests/auto/declarative/qdeclarativeimage/data/heart.png b/tests/auto/declarative/qdeclarativeimage/data/heart.png
index ff93f6c..abe97fe 100644
--- a/tests/auto/declarative/qdeclarativeimage/data/heart.png
+++ b/tests/auto/declarative/qdeclarativeimage/data/heart.png
Binary files differ
diff --git a/tests/auto/declarative/qdeclarativeimage/data/heart200-win32.png b/tests/auto/declarative/qdeclarativeimage/data/heart200-win32.png
index 19b20a8..4976ff9 100644
--- a/tests/auto/declarative/qdeclarativeimage/data/heart200-win32.png
+++ b/tests/auto/declarative/qdeclarativeimage/data/heart200-win32.png
Binary files differ
diff --git a/tests/auto/declarative/qdeclarativeimage/data/heart200.png b/tests/auto/declarative/qdeclarativeimage/data/heart200.png
index 5a31ae8..7fbb13c 100644
--- a/tests/auto/declarative/qdeclarativeimage/data/heart200.png
+++ b/tests/auto/declarative/qdeclarativeimage/data/heart200.png
Binary files differ
diff --git a/tests/auto/declarative/qdeclarativeimage/qdeclarativeimage.pro b/tests/auto/declarative/qdeclarativeimage/qdeclarativeimage.pro
index c87c1d9..a22c8b5 100644
--- a/tests/auto/declarative/qdeclarativeimage/qdeclarativeimage.pro
+++ b/tests/auto/declarative/qdeclarativeimage/qdeclarativeimage.pro
@@ -8,7 +8,7 @@ SOURCES += tst_qdeclarativeimage.cpp ../shared/testhttpserver.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativeimage/tst_qdeclarativeimage.cpp b/tests/auto/declarative/qdeclarativeimage/tst_qdeclarativeimage.cpp
index bf779ad..447210d 100644
--- a/tests/auto/declarative/qdeclarativeimage/tst_qdeclarativeimage.cpp
+++ b/tests/auto/declarative/qdeclarativeimage/tst_qdeclarativeimage.cpp
@@ -87,6 +87,7 @@ private slots:
void noLoading();
void paintedWidthHeight();
void sourceSize_QTBUG_14303();
+ void nullPixmapPaint();
private:
template<typename T>
@@ -540,6 +541,35 @@ void tst_qdeclarativeimage::sourceSize_QTBUG_14303()
QTRY_COMPARE(sourceSizeSpy.count(), 2);
}
+static int numberOfWarnings = 0;
+static void checkWarnings(QtMsgType, const char *)
+{
+ numberOfWarnings++;
+}
+
+// QTBUG-15690
+void tst_qdeclarativeimage::nullPixmapPaint()
+{
+ QString componentStr = QString("import QtQuick 1.0\nImage { width: 10; height:10; fillMode: Image.PreserveAspectFit; source: \"")
+ + SERVER_ADDR + QString("/no-such-file.png\" }");
+ QDeclarativeComponent component(&engine);
+ component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+ QDeclarativeImage *image = qobject_cast<QDeclarativeImage*>(component.create());
+
+ QTRY_VERIFY(image != 0);
+
+ QtMsgHandler previousMsgHandler = qInstallMsgHandler(checkWarnings);
+
+ QPixmap pm(100, 100);
+ QPainter p(&pm);
+
+ // used to print "QTransform::translate with NaN called"
+ image->paint(&p, 0, 0);
+ qInstallMsgHandler(previousMsgHandler);
+ QVERIFY(numberOfWarnings == 0);
+ delete image;
+}
+
/*
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 cd12e3a..5b214e6 100644
--- a/tests/auto/declarative/qdeclarativeimageprovider/tst_qdeclarativeimageprovider.cpp
+++ b/tests/auto/declarative/qdeclarativeimageprovider/tst_qdeclarativeimageprovider.cpp
@@ -100,6 +100,8 @@ public:
QImage requestImage(const QString &id, QSize *size, const QSize& requestedSize)
{
+ lastImageId = id;
+
if (id == QLatin1String("no-such-file.png"))
return QImage();
@@ -114,6 +116,7 @@ public:
}
bool *deleteWatch;
+ QString lastImageId;
};
Q_DECLARE_METATYPE(TestQImageProvider*);
@@ -134,6 +137,8 @@ public:
QPixmap requestPixmap(const QString &id, QSize *size, const QSize& requestedSize)
{
+ lastImageId = id;
+
if (id == QLatin1String("no-such-file.png"))
return QPixmap();
@@ -148,6 +153,7 @@ public:
}
bool *deleteWatch;
+ QString lastImageId;
};
Q_DECLARE_METATYPE(TestQPixmapProvider*);
@@ -164,22 +170,49 @@ QString tst_qdeclarativeimageprovider::newImageFileName() const
void tst_qdeclarativeimageprovider::fillRequestTestsData(const QString &id)
{
QTest::addColumn<QString>("source");
+ QTest::addColumn<QString>("imageId");
QTest::addColumn<QString>("properties");
QTest::addColumn<QSize>("size");
QTest::addColumn<QString>("error");
- QTest::newRow(QTest::toString(id + " exists")) << newImageFileName() << "" << QSize(100,100) << "";
- QTest::newRow(QTest::toString(id + " scaled")) << newImageFileName() << "sourceSize: \"80x30\"" << QSize(80,30) << "";
+ QString fileName = newImageFileName();
+ QTest::newRow(QTest::toString(id + " simple test"))
+ << "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) << "";
+
+ fileName = newImageFileName();
+ QTest::newRow(QTest::toString(id + " url with path"))
+ << "image://test/test/path" + fileName << "test/path" + fileName << "" << QSize(100,100) << "";
+
+ fileName = newImageFileName();
+ QTest::newRow(QTest::toString(id + " url with fragment"))
+ << "image://test/faq.html?#question13" + fileName << "faq.html?#question13" + fileName << "" << QSize(100,100) << "";
- QTest::newRow(QTest::toString(id + " missing")) << "image://test/no-such-file.png" << "" << QSize()
+ fileName = newImageFileName();
+ QTest::newRow(QTest::toString(id + " url with query"))
+ << "image://test/cgi-bin/drawgraph.cgi?type=pie&color=green" + fileName << "cgi-bin/drawgraph.cgi?type=pie&color=green" + fileName
+ << "" << QSize(100,100) << "";
+
+ fileName = newImageFileName();
+ QTest::newRow(QTest::toString(id + " scaled image"))
+ << "image://test/" + fileName << fileName << "sourceSize: \"80x30\"" << QSize(80,30) << "";
+
+ QTest::newRow(QTest::toString(id + " missing"))
+ << "image://test/no-such-file.png" << "no-such-file.png" << "" << QSize(100,100)
<< "file::2:1: QML Image: Failed to get image from provider: image://test/no-such-file.png";
- QTest::newRow(QTest::toString(id + " unknown provider")) << "image://bogus/exists.png" << "" << QSize()
+
+ QTest::newRow(QTest::toString(id + " unknown provider"))
+ << "image://bogus/exists.png" << "" << "" << QSize()
<< "file::2:1: QML Image: Failed to get image from provider: image://bogus/exists.png";
}
void tst_qdeclarativeimageprovider::runTest(bool async, QDeclarativeImageProvider *provider)
{
QFETCH(QString, source);
+ QFETCH(QString, imageId);
QFETCH(QString, properties);
QFETCH(QSize, size);
QFETCH(QString, error);
@@ -210,6 +243,11 @@ void tst_qdeclarativeimageprovider::runTest(bool async, QDeclarativeImageProvide
QTRY_VERIFY(obj->status() == QDeclarativeImage::Ready);
else
QVERIFY(obj->status() == QDeclarativeImage::Ready);
+ if (QByteArray(QTest::currentDataTag()).startsWith("qimage"))
+ QCOMPARE(static_cast<TestQImageProvider*>(provider)->lastImageId, imageId);
+ else
+ QCOMPARE(static_cast<TestQPixmapProvider*>(provider)->lastImageId, imageId);
+
QCOMPARE(obj->width(), qreal(size.width()));
QCOMPARE(obj->height(), qreal(size.height()));
QCOMPARE(obj->pixmap().width(), size.width());
diff --git a/tests/auto/declarative/qdeclarativeinfo/qdeclarativeinfo.pro b/tests/auto/declarative/qdeclarativeinfo/qdeclarativeinfo.pro
index 888596f..423390f 100644
--- a/tests/auto/declarative/qdeclarativeinfo/qdeclarativeinfo.pro
+++ b/tests/auto/declarative/qdeclarativeinfo/qdeclarativeinfo.pro
@@ -7,7 +7,7 @@ SOURCES += tst_qdeclarativeinfo.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativeinstruction/tst_qdeclarativeinstruction.cpp b/tests/auto/declarative/qdeclarativeinstruction/tst_qdeclarativeinstruction.cpp
index db1f191..4470d65 100644
--- a/tests/auto/declarative/qdeclarativeinstruction/tst_qdeclarativeinstruction.cpp
+++ b/tests/auto/declarative/qdeclarativeinstruction/tst_qdeclarativeinstruction.cpp
@@ -458,6 +458,7 @@ void tst_qdeclarativeinstruction::dump()
i.type = QDeclarativeInstruction::FetchValueType;
i.fetchValue.property = 34;
i.fetchValue.type = 6;
+ i.fetchValue.bindingSkipList = 7;
data->bytecode << i;
}
@@ -538,7 +539,7 @@ void tst_qdeclarativeinstruction::dump()
<< "Index\tLine\tOperation\t\tData1\tData2\tData3\tComments"
<< "-------------------------------------------------------------------------------"
<< "0\t\t0\tINIT\t\t\t0\t3\t-1\t-1"
- << "1\t\t1\tCREATE\t\t\t0\t\t\t\"Test\""
+ << "1\t\t1\tCREATE\t\t\t0\t-1\t\t\"Test\""
<< "2\t\t2\tSETID\t\t\t0\t\t\t\"testId\""
<< "3\t\t3\tSET_DEFAULT"
<< "4\t\t4\tCREATE_COMPONENT\t3"
@@ -578,7 +579,7 @@ void tst_qdeclarativeinstruction::dump()
<< "38\t\t40\tFETCH_ATTACHED\t\t23"
<< "39\t\t42\tFETCH_QLIST\t\t32"
<< "40\t\t43\tFETCH\t\t\t33"
- << "41\t\t44\tFETCH_VALUE\t\t34\t6"
+ << "41\t\t44\tFETCH_VALUE\t\t34\t6\t7"
<< "42\t\t45\tPOP"
<< "43\t\t46\tPOP_QLIST"
<< "44\t\t47\tPOP_VALUE\t\t35\t8"
diff --git a/tests/auto/declarative/qdeclarativeitem/data/keynavigationtest.qml b/tests/auto/declarative/qdeclarativeitem/data/keynavigationtest.qml
index 229f969..f614a12 100644
--- a/tests/auto/declarative/qdeclarativeitem/data/keynavigationtest.qml
+++ b/tests/auto/declarative/qdeclarativeitem/data/keynavigationtest.qml
@@ -3,6 +3,46 @@ import QtQuick 1.0
Grid {
columns: 2
width: 100; height: 100
+ function verify() {
+ if (item1.KeyNavigation.right != item2)
+ return false;
+ if (item1.KeyNavigation.down != item3)
+ return false;
+ if (item1.KeyNavigation.tab != item2)
+ return false;
+ if (item1.KeyNavigation.backtab != item4)
+ return false;
+
+ if (item2.KeyNavigation.left != item1)
+ return false;
+ if (item2.KeyNavigation.down != item4)
+ return false;
+ if (item2.KeyNavigation.tab != item3)
+ return false;
+ if (item2.KeyNavigation.backtab != item1)
+ return false;
+
+ if (item3.KeyNavigation.right != item4)
+ return false;
+ if (item3.KeyNavigation.up != item1)
+ return false;
+ if (item3.KeyNavigation.tab != item4)
+ return false;
+ if (item3.KeyNavigation.backtab != item2)
+ return false;
+
+ if (item4.KeyNavigation.left != item3)
+ return false;
+ if (item4.KeyNavigation.up != item2)
+ return false;
+ if (item4.KeyNavigation.tab != item1)
+ return false;
+ if (item4.KeyNavigation.backtab != item3)
+ return false;
+
+ return true;
+ }
+
Rectangle {
id: item1
objectName: "item1"
diff --git a/tests/auto/declarative/qdeclarativeitem/qdeclarativeitem.pro b/tests/auto/declarative/qdeclarativeitem/qdeclarativeitem.pro
index 0fd871e..d8007a0 100644
--- a/tests/auto/declarative/qdeclarativeitem/qdeclarativeitem.pro
+++ b/tests/auto/declarative/qdeclarativeitem/qdeclarativeitem.pro
@@ -7,7 +7,7 @@ SOURCES += tst_qdeclarativeitem.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp b/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp
index 711bf00..0ebb8b7 100644
--- a/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp
+++ b/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp
@@ -393,6 +393,11 @@ void tst_QDeclarativeItem::keyNavigation()
QVERIFY(item);
QVERIFY(item->hasActiveFocus());
+ QVariant result;
+ QVERIFY(QMetaObject::invokeMethod(canvas->rootObject(), "verify",
+ Q_RETURN_ARG(QVariant, result)));
+ QVERIFY(result.toBool());
+
// right
QKeyEvent key(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
QApplication::sendEvent(canvas, &key);
diff --git a/tests/auto/declarative/qdeclarativelanguage/qdeclarativelanguage.pro b/tests/auto/declarative/qdeclarativelanguage/qdeclarativelanguage.pro
index aa69337..cae85a7 100644
--- a/tests/auto/declarative/qdeclarativelanguage/qdeclarativelanguage.pro
+++ b/tests/auto/declarative/qdeclarativelanguage/qdeclarativelanguage.pro
@@ -14,7 +14,7 @@ SOURCES += ../shared/testhttpserver.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativelayoutitem/qdeclarativelayoutitem.pro b/tests/auto/declarative/qdeclarativelayoutitem/qdeclarativelayoutitem.pro
index 42d9a80..d89f16c 100644
--- a/tests/auto/declarative/qdeclarativelayoutitem/qdeclarativelayoutitem.pro
+++ b/tests/auto/declarative/qdeclarativelayoutitem/qdeclarativelayoutitem.pro
@@ -7,7 +7,7 @@ SOURCES += tst_qdeclarativelayoutitem.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativelistmodel/qdeclarativelistmodel.pro b/tests/auto/declarative/qdeclarativelistmodel/qdeclarativelistmodel.pro
index 8a39555..b5c5cf2 100644
--- a/tests/auto/declarative/qdeclarativelistmodel/qdeclarativelistmodel.pro
+++ b/tests/auto/declarative/qdeclarativelistmodel/qdeclarativelistmodel.pro
@@ -8,7 +8,7 @@ SOURCES += tst_qdeclarativelistmodel.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativelistview/data/displaylist.qml b/tests/auto/declarative/qdeclarativelistview/data/displaylist.qml
index 487b70e..9d58530 100644
--- a/tests/auto/declarative/qdeclarativelistview/data/displaylist.qml
+++ b/tests/auto/declarative/qdeclarativelistview/data/displaylist.qml
@@ -1,6 +1,8 @@
import QtQuick 1.0
Rectangle {
+ id: root
+ property real delegateHeight: 20
width: 240
height: 320
color: "#ffffff"
@@ -10,7 +12,8 @@ Rectangle {
Rectangle {
id: wrapper
objectName: "wrapper"
- height: 20
+ height: root.delegateHeight
+ Behavior on height { NumberAnimation {} }
width: 240
Text {
text: index
@@ -20,6 +23,10 @@ Rectangle {
objectName: "displayText"
text: display
}
+ Text {
+ x: 200
+ text: wrapper.y
+ }
color: ListView.isCurrentItem ? "lightsteelblue" : "white"
}
},
diff --git a/tests/auto/declarative/qdeclarativelistview/data/header.qml b/tests/auto/declarative/qdeclarativelistview/data/header.qml
new file mode 100644
index 0000000..6da996e
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelistview/data/header.qml
@@ -0,0 +1,31 @@
+import QtQuick 1.0
+
+Rectangle {
+ width: 240
+ height: 320
+ color: "#ffffff"
+ Component {
+ id: myDelegate
+ Rectangle {
+ id: wrapper
+ objectName: "wrapper"
+ height: 30
+ width: 240
+ Text {
+ text: index
+ }
+ color: ListView.isCurrentItem ? "lightsteelblue" : "white"
+ }
+ }
+ ListView {
+ id: list
+ objectName: "list"
+ focus: true
+ width: 240
+ height: 320
+ snapMode: ListView.SnapToItem
+ model: testModel
+ delegate: myDelegate
+ header: Text { objectName: "header"; text: "Header"; height: 10 }
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativelistview/data/header1.qml b/tests/auto/declarative/qdeclarativelistview/data/header1.qml
new file mode 100644
index 0000000..f2ab4c1
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelistview/data/header1.qml
@@ -0,0 +1,33 @@
+import QtQuick 1.0
+
+Rectangle {
+ width: 240
+ height: 320
+ color: "#ffffff"
+
+ ListModel { id: testModel }
+
+ ListView {
+ id: list
+ objectName: "list"
+ width: parent.width
+ anchors.top: parent.top
+ anchors.bottom: parent.bottom
+ model: testModel
+ delegate: Text {
+ objectName: "wrapper"
+ font.pointSize: 20
+ text: index
+ }
+ footer: Rectangle {
+ width: parent.width
+ height: 40
+ color: "green"
+ }
+ header: Text { objectName: "header"; text: "Header" }
+ }
+
+ Component.onCompleted: {
+ for (var i=0; i<30; i++) testModel.append({"name" : i, "val": i})
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativelistview/data/manual-highlight.qml b/tests/auto/declarative/qdeclarativelistview/data/manual-highlight.qml
index d8cfd9a..a32a194 100644
--- a/tests/auto/declarative/qdeclarativelistview/data/manual-highlight.qml
+++ b/tests/auto/declarative/qdeclarativelistview/data/manual-highlight.qml
@@ -28,7 +28,7 @@ Item {
objectName: "highlight"
width: 180; height: 20
color: "lightsteelblue"; radius: 5
- y: list.currentItem.y
+ y: list.currentItem.y+5
}
}
diff --git a/tests/auto/declarative/qdeclarativelistview/data/qtbug16037.qml b/tests/auto/declarative/qdeclarativelistview/data/qtbug16037.qml
new file mode 100644
index 0000000..0756618
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelistview/data/qtbug16037.qml
@@ -0,0 +1,37 @@
+import QtQuick 1.0
+
+Item {
+ width: 640
+ height: 480
+
+ function setModel() {
+ listView.model = listModel1
+ }
+
+ ListModel {
+ id: listModel1
+ ListElement { text: "Apple" }
+ ListElement { text: "Banana" }
+ ListElement { text: "Orange" }
+ ListElement { text: "Coconut" }
+ }
+
+ Rectangle {
+ width: 200
+ height: listView.contentHeight
+ color: "yellow"
+ anchors.centerIn: parent
+
+ ListView {
+ id: listView
+ objectName: "listview"
+ anchors.fill: parent
+
+ delegate: Item {
+ width: 200
+ height: 20
+ Text { text: model.text; anchors.centerIn: parent }
+ }
+ }
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativelistview/incrementalmodel.cpp b/tests/auto/declarative/qdeclarativelistview/incrementalmodel.cpp
new file mode 100644
index 0000000..b2c9df5
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelistview/incrementalmodel.cpp
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** 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 "incrementalmodel.h"
+#include <QApplication>
+#include <QDebug>
+
+IncrementalModel::IncrementalModel(QObject *parent)
+ : QAbstractListModel(parent), count(0)
+{
+ for (int i = 0; i < 100; ++i)
+ list.append("Item " + QString::number(i));
+}
+
+int IncrementalModel::rowCount(const QModelIndex & /* parent */) const
+{
+ return count;
+}
+
+QVariant IncrementalModel::data(const QModelIndex &index, int role) const
+{
+ if (!index.isValid())
+ return QVariant();
+
+ if (index.row() >= list.size() || index.row() < 0)
+ return QVariant();
+
+ if (role == Qt::DisplayRole)
+ return list.at(index.row());
+ return QVariant();
+}
+
+bool IncrementalModel::canFetchMore(const QModelIndex & /* index */) const
+{
+ if (count < list.size())
+ return true;
+ else
+ return false;
+}
+
+void IncrementalModel::fetchMore(const QModelIndex & /* index */)
+{
+ int remainder = list.size() - count;
+ int itemsToFetch = qMin(5, remainder);
+
+ beginInsertRows(QModelIndex(), count, count+itemsToFetch-1);
+
+ count += itemsToFetch;
+
+ endInsertRows();
+}
diff --git a/tests/auto/declarative/qdeclarativelistview/incrementalmodel.h b/tests/auto/declarative/qdeclarativelistview/incrementalmodel.h
new file mode 100644
index 0000000..b1f7407
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelistview/incrementalmodel.h
@@ -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$
+**
+****************************************************************************/
+
+#ifndef IncrementalModel_H
+#define IncrementalModel_H
+
+#include <QAbstractListModel>
+#include <QList>
+#include <QStringList>
+
+class IncrementalModel : public QAbstractListModel
+{
+ Q_OBJECT
+
+public:
+ IncrementalModel(QObject *parent = 0);
+
+ int rowCount(const QModelIndex &parent = QModelIndex()) const;
+ QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
+
+protected:
+ bool canFetchMore(const QModelIndex &parent) const;
+ void fetchMore(const QModelIndex &parent);
+
+private:
+ QStringList list;
+ int count;
+};
+
+#endif
diff --git a/tests/auto/declarative/qdeclarativelistview/qdeclarativelistview.pro b/tests/auto/declarative/qdeclarativelistview/qdeclarativelistview.pro
index 99eba67..1633ffc 100644
--- a/tests/auto/declarative/qdeclarativelistview/qdeclarativelistview.pro
+++ b/tests/auto/declarative/qdeclarativelistview/qdeclarativelistview.pro
@@ -2,12 +2,13 @@ load(qttest_p4)
contains(QT_CONFIG,declarative): QT += declarative
macx:CONFIG -= app_bundle
-SOURCES += tst_qdeclarativelistview.cpp
+HEADERS += incrementalmodel.h
+SOURCES += tst_qdeclarativelistview.cpp incrementalmodel.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
index 37d836d..e76cb15 100644
--- a/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
+++ b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
@@ -51,6 +51,7 @@
#include <QtDeclarative/private/qdeclarativelistmodel_p.h>
#include <QtDeclarative/private/qlistmodelinterface_p.h>
#include "../../../shared/util.h"
+#include "incrementalmodel.h"
#ifdef Q_OS_SYMBIAN
// In Symbian OS test data is located in applications private dir
@@ -98,10 +99,15 @@ private slots:
void QTBUG_9791();
void manualHighlight();
void QTBUG_11105();
+ void header();
void footer();
void resizeView();
void sizeLessThan1();
void QTBUG_14821();
+ void resizeDelegate();
+ void QTBUG_16037();
+ void indexAt();
+ void incrementalModel();
private:
template <class T> void items();
@@ -663,7 +669,8 @@ void tst_QDeclarativeListView::removed(bool animated)
listview->setContentY(80);
QTest::qWait(300);
- model.removeItems(1, 17);
+ // remove all visible items
+ model.removeItems(1, 18);
QTest::qWait(300);
// Confirm items positioned correctly
@@ -1405,6 +1412,8 @@ void tst_QDeclarativeListView::resetModel()
QTRY_VERIFY(display != 0);
QTRY_COMPARE(display->text(), strings.at(i));
}
+
+ delete canvas;
}
void tst_QDeclarativeListView::propertyChanges()
@@ -1605,13 +1614,22 @@ void tst_QDeclarativeListView::manualHighlight()
QTRY_COMPARE(listview->currentIndex(), 0);
QTRY_COMPARE(listview->currentItem(), findItem<QDeclarativeItem>(contentItem, "wrapper", 0));
- QTRY_COMPARE(listview->highlightItem()->y(), listview->currentItem()->y());
+ QTRY_COMPARE(listview->highlightItem()->y() - 5, listview->currentItem()->y());
listview->setCurrentIndex(2);
QTRY_COMPARE(listview->currentIndex(), 2);
QTRY_COMPARE(listview->currentItem(), findItem<QDeclarativeItem>(contentItem, "wrapper", 2));
- QTRY_COMPARE(listview->highlightItem()->y(), listview->currentItem()->y());
+ QTRY_COMPARE(listview->highlightItem()->y() - 5, listview->currentItem()->y());
+
+ // QTBUG-15972
+ listview->positionViewAtIndex(3, QDeclarativeListView::Contain);
+
+ QTRY_COMPARE(listview->currentIndex(), 2);
+ QTRY_COMPARE(listview->currentItem(), findItem<QDeclarativeItem>(contentItem, "wrapper", 2));
+ QTRY_COMPARE(listview->highlightItem()->y() - 5, listview->currentItem()->y());
+
+ delete canvas;
}
void tst_QDeclarativeListView::QTBUG_11105()
@@ -1661,6 +1679,67 @@ void tst_QDeclarativeListView::QTBUG_11105()
delete canvas;
}
+void tst_QDeclarativeListView::header()
+{
+ {
+ QDeclarativeView *canvas = createView();
+
+ TestModel model;
+ for (int i = 0; i < 30; i++)
+ model.addItem("Item" + QString::number(i), "");
+
+ QDeclarativeContext *ctxt = canvas->rootContext();
+ ctxt->setContextProperty("testModel", &model);
+
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/header.qml"));
+ qApp->processEvents();
+
+ QDeclarativeListView *listview = findItem<QDeclarativeListView>(canvas->rootObject(), "list");
+ QTRY_VERIFY(listview != 0);
+
+ QDeclarativeItem *contentItem = listview->contentItem();
+ QTRY_VERIFY(contentItem != 0);
+
+ QDeclarativeText *header = findItem<QDeclarativeText>(contentItem, "header");
+ QVERIFY(header);
+ QCOMPARE(header->y(), 0.0);
+
+ QCOMPARE(listview->contentY(), 0.0);
+
+ model.clear();
+ QTRY_COMPARE(header->y(), 0.0);
+
+ delete canvas;
+ }
+ {
+ QDeclarativeView *canvas = createView();
+
+ TestModel model;
+
+ QDeclarativeContext *ctxt = canvas->rootContext();
+
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/header1.qml"));
+ qApp->processEvents();
+
+ QDeclarativeListView *listview = findItem<QDeclarativeListView>(canvas->rootObject(), "list");
+ QTRY_VERIFY(listview != 0);
+
+ QDeclarativeItem *contentItem = listview->contentItem();
+ QTRY_VERIFY(contentItem != 0);
+
+ QDeclarativeText *header = findItem<QDeclarativeText>(contentItem, "header");
+ QVERIFY(header);
+ QCOMPARE(header->y(), 0.0);
+
+ QCOMPARE(listview->contentY(), 0.0);
+
+ model.clear();
+ QTRY_COMPARE(header->y(), 0.0);
+
+ delete canvas;
+ }
+}
+
void tst_QDeclarativeListView::footer()
{
QDeclarativeView *canvas = createView();
@@ -1690,6 +1769,8 @@ void tst_QDeclarativeListView::footer()
model.clear();
QTRY_COMPARE(footer->y(), 0.0);
+
+ delete canvas;
}
void tst_QDeclarativeListView::resizeView()
@@ -1732,6 +1813,8 @@ void tst_QDeclarativeListView::resizeView()
QMetaObject::invokeMethod(canvas->rootObject(), "heightRatio", Q_RETURN_ARG(QVariant, heightRatio));
QCOMPARE(heightRatio.toReal(), 0.25);
+
+ delete canvas;
}
void tst_QDeclarativeListView::sizeLessThan1()
@@ -1787,6 +1870,160 @@ void tst_QDeclarativeListView::QTBUG_14821()
listview->incrementCurrentIndex();
QCOMPARE(listview->currentIndex(), 0);
+
+ delete canvas;
+}
+
+void tst_QDeclarativeListView::resizeDelegate()
+{
+ QDeclarativeView *canvas = createView();
+
+ QStringList strings;
+ for (int i = 0; i < 30; ++i)
+ strings << QString::number(i);
+ QStringListModel model(strings);
+
+ QDeclarativeContext *ctxt = canvas->rootContext();
+ ctxt->setContextProperty("testModel", &model);
+
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/displaylist.qml"));
+ qApp->processEvents();
+
+ QDeclarativeListView *listview = findItem<QDeclarativeListView>(canvas->rootObject(), "list");
+ QTRY_VERIFY(listview != 0);
+
+ QDeclarativeItem *contentItem = listview->contentItem();
+ QTRY_VERIFY(contentItem != 0);
+
+ QTRY_COMPARE(listview->count(), model.rowCount());
+
+ listview->setCurrentIndex(25);
+ listview->setContentY(0);
+
+ for (int i = 0; i < 16; ++i) {
+ QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
+ QVERIFY(item != 0);
+ QCOMPARE(item->y(), i*20.0);
+ }
+
+ QCOMPARE(listview->currentItem()->y(), 500.0);
+ QTRY_COMPARE(listview->highlightItem()->y(), 500.0);
+
+ canvas->rootObject()->setProperty("delegateHeight", 30);
+ qApp->processEvents();
+
+ for (int i = 0; i < 11; ++i) {
+ QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
+ QVERIFY(item != 0);
+ QTRY_COMPARE(item->y(), i*30.0);
+ }
+
+ QTRY_COMPARE(listview->currentItem()->y(), 750.0);
+ QTRY_COMPARE(listview->highlightItem()->y(), 750.0);
+
+ listview->setCurrentIndex(1);
+ listview->positionViewAtIndex(25, QDeclarativeListView::Beginning);
+ listview->positionViewAtIndex(5, QDeclarativeListView::Beginning);
+
+ for (int i = 5; i < 16; ++i) {
+ QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
+ QVERIFY(item != 0);
+ QCOMPARE(item->y(), i*30.0);
+ }
+
+ QTRY_COMPARE(listview->currentItem()->y(), 30.0);
+ QTRY_COMPARE(listview->highlightItem()->y(), 30.0);
+
+ canvas->rootObject()->setProperty("delegateHeight", 20);
+ qApp->processEvents();
+
+ for (int i = 5; i < 11; ++i) {
+ QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
+ QVERIFY(item != 0);
+ QTRY_COMPARE(item->y(), 150 + (i-5)*20.0);
+ }
+
+ QTRY_COMPARE(listview->currentItem()->y(), 70.0);
+ QTRY_COMPARE(listview->highlightItem()->y(), 70.0);
+
+ delete canvas;
+}
+
+void tst_QDeclarativeListView::QTBUG_16037()
+{
+ QDeclarativeView *canvas = createView();
+
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/qtbug16037.qml"));
+ qApp->processEvents();
+
+ QDeclarativeListView *listview = findItem<QDeclarativeListView>(canvas->rootObject(), "listview");
+ QTRY_VERIFY(listview != 0);
+
+ QVERIFY(listview->contentHeight() <= 0.0);
+
+ QMetaObject::invokeMethod(canvas->rootObject(), "setModel");
+
+ QTRY_COMPARE(listview->contentHeight(), 80.0);
+
+ delete canvas;
+}
+
+void tst_QDeclarativeListView::indexAt()
+{
+ QDeclarativeView *canvas = createView();
+
+ TestModel model;
+ for (int i = 0; i < 30; i++)
+ model.addItem("Item" + QString::number(i), "");
+
+ QDeclarativeContext *ctxt = canvas->rootContext();
+ ctxt->setContextProperty("testModel", &model);
+
+ TestObject *testObject = new TestObject;
+ ctxt->setContextProperty("testObject", testObject);
+
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml"));
+ qApp->processEvents();
+
+ QDeclarativeListView *listview = findItem<QDeclarativeListView>(canvas->rootObject(), "list");
+ QTRY_VERIFY(listview != 0);
+
+ QDeclarativeItem *contentItem = listview->contentItem();
+ QTRY_VERIFY(contentItem != 0);
+
+ QCOMPARE(listview->indexAt(0,0), 0);
+ QCOMPARE(listview->indexAt(0,19), 0);
+ QCOMPARE(listview->indexAt(239,19), 0);
+ QCOMPARE(listview->indexAt(0,20), 1);
+ QCOMPARE(listview->indexAt(240,20), -1);
+
+ delete canvas;
+}
+
+void tst_QDeclarativeListView::incrementalModel()
+{
+ QDeclarativeView *canvas = createView();
+
+ IncrementalModel model;
+ QDeclarativeContext *ctxt = canvas->rootContext();
+ ctxt->setContextProperty("testModel", &model);
+
+ canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/displaylist.qml"));
+ qApp->processEvents();
+
+ QDeclarativeListView *listview = findItem<QDeclarativeListView>(canvas->rootObject(), "list");
+ QTRY_VERIFY(listview != 0);
+
+ QDeclarativeItem *contentItem = listview->contentItem();
+ QTRY_VERIFY(contentItem != 0);
+
+ QTRY_COMPARE(listview->count(), 20);
+
+ listview->positionViewAtIndex(10, QDeclarativeListView::Beginning);
+
+ QTRY_COMPARE(listview->count(), 25);
+
+ delete canvas;
}
void tst_QDeclarativeListView::qListModelInterface_items()
diff --git a/tests/auto/declarative/qdeclarativeloader/qdeclarativeloader.pro b/tests/auto/declarative/qdeclarativeloader/qdeclarativeloader.pro
index 1e7808a..1ede509 100644
--- a/tests/auto/declarative/qdeclarativeloader/qdeclarativeloader.pro
+++ b/tests/auto/declarative/qdeclarativeloader/qdeclarativeloader.pro
@@ -10,7 +10,7 @@ SOURCES += tst_qdeclarativeloader.cpp \
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.pro b/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.pro
index ec2d25e..2e8aa75 100644
--- a/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.pro
+++ b/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.pro
@@ -6,7 +6,7 @@ CONFIG -= app_bundle
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativemousearea/qdeclarativemousearea.pro b/tests/auto/declarative/qdeclarativemousearea/qdeclarativemousearea.pro
index a93f7af..ed9313f 100644
--- a/tests/auto/declarative/qdeclarativemousearea/qdeclarativemousearea.pro
+++ b/tests/auto/declarative/qdeclarativemousearea/qdeclarativemousearea.pro
@@ -8,7 +8,7 @@ SOURCES += tst_qdeclarativemousearea.cpp ../shared/testhttpserver.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativeparticles/qdeclarativeparticles.pro b/tests/auto/declarative/qdeclarativeparticles/qdeclarativeparticles.pro
index 8f13573..2cf8268 100644
--- a/tests/auto/declarative/qdeclarativeparticles/qdeclarativeparticles.pro
+++ b/tests/auto/declarative/qdeclarativeparticles/qdeclarativeparticles.pro
@@ -7,7 +7,7 @@ SOURCES += tst_qdeclarativeparticles.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativepathview/qdeclarativepathview.pro b/tests/auto/declarative/qdeclarativepathview/qdeclarativepathview.pro
index 4f70a6f..e0404c5 100644
--- a/tests/auto/declarative/qdeclarativepathview/qdeclarativepathview.pro
+++ b/tests/auto/declarative/qdeclarativepathview/qdeclarativepathview.pro
@@ -7,7 +7,7 @@ SOURCES += tst_qdeclarativepathview.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp b/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp
index a2a5363..9193707 100644
--- a/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp
+++ b/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp
@@ -429,6 +429,10 @@ void tst_QDeclarativePathView::dataModel()
pathview->setOffset(0);
QCOMPARE(findItems<QDeclarativeItem>(pathview, "wrapper").count(), 5);
+ pathview->setCurrentIndex(model.count()-1);
+ model.removeItem(model.count()-1);
+ QCOMPARE(pathview->currentIndex(), model.count()-1);
+
delete canvas;
}
diff --git a/tests/auto/declarative/qdeclarativepixmapcache/qdeclarativepixmapcache.pro b/tests/auto/declarative/qdeclarativepixmapcache/qdeclarativepixmapcache.pro
index 47b1b7b..88871e9 100644
--- a/tests/auto/declarative/qdeclarativepixmapcache/qdeclarativepixmapcache.pro
+++ b/tests/auto/declarative/qdeclarativepixmapcache/qdeclarativepixmapcache.pro
@@ -12,7 +12,7 @@ SOURCES += ../shared/testhttpserver.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativepixmapcache/tst_qdeclarativepixmapcache.cpp b/tests/auto/declarative/qdeclarativepixmapcache/tst_qdeclarativepixmapcache.cpp
index 50d0731..1a38e87 100644
--- a/tests/auto/declarative/qdeclarativepixmapcache/tst_qdeclarativepixmapcache.cpp
+++ b/tests/auto/declarative/qdeclarativepixmapcache/tst_qdeclarativepixmapcache.cpp
@@ -74,7 +74,9 @@ private slots:
void massive();
void cancelcrash();
void shrinkcache();
+#ifndef QT_NO_CONCURRENT
void networkCrash();
+#endif
private:
QDeclarativeEngine engine;
QUrl thisfile;
@@ -363,6 +365,7 @@ void createNetworkServer()
eventLoop.exec();
}
+#ifndef QT_NO_CONCURRENT
// QT-3957
void tst_qdeclarativepixmapcache::networkCrash()
{
@@ -377,6 +380,7 @@ void tst_qdeclarativepixmapcache::networkCrash()
}
future.cancel();
}
+#endif
QTEST_MAIN(tst_qdeclarativepixmapcache)
diff --git a/tests/auto/declarative/qdeclarativepositioners/qdeclarativepositioners.pro b/tests/auto/declarative/qdeclarativepositioners/qdeclarativepositioners.pro
index e98aa5c..27e5948 100644
--- a/tests/auto/declarative/qdeclarativepositioners/qdeclarativepositioners.pro
+++ b/tests/auto/declarative/qdeclarativepositioners/qdeclarativepositioners.pro
@@ -6,7 +6,7 @@ macx:CONFIG -= app_bundle
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativeproperty/data/aliasPropertyBindings.qml b/tests/auto/declarative/qdeclarativeproperty/data/aliasPropertyBindings.qml
new file mode 100644
index 0000000..a253a58
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeproperty/data/aliasPropertyBindings.qml
@@ -0,0 +1,19 @@
+import QtQuick 1.0
+
+Item {
+ id: root
+
+ property real test: 9
+ property real test2: 3
+
+ property real realProperty: test * test + test
+ property alias aliasProperty: root.realProperty
+
+ states: State {
+ name: "switch"
+ PropertyChanges {
+ target: root
+ aliasProperty: 32 * test2
+ }
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativeproperty/qdeclarativeproperty.pro b/tests/auto/declarative/qdeclarativeproperty/qdeclarativeproperty.pro
index 9dd727c..1750860 100644
--- a/tests/auto/declarative/qdeclarativeproperty/qdeclarativeproperty.pro
+++ b/tests/auto/declarative/qdeclarativeproperty/qdeclarativeproperty.pro
@@ -7,7 +7,7 @@ SOURCES += tst_qdeclarativeproperty.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativeproperty/tst_qdeclarativeproperty.cpp b/tests/auto/declarative/qdeclarativeproperty/tst_qdeclarativeproperty.cpp
index 0ca0e03..41f2b19 100644
--- a/tests/auto/declarative/qdeclarativeproperty/tst_qdeclarativeproperty.cpp
+++ b/tests/auto/declarative/qdeclarativeproperty/tst_qdeclarativeproperty.cpp
@@ -132,6 +132,7 @@ private slots:
// Bugs
void crashOnValueProperty();
+ void aliasPropertyBindings();
void copy();
private:
@@ -166,6 +167,7 @@ void tst_qdeclarativeproperty::qmlmetaproperty()
QCOMPARE(prop.isWritable(), false);
QCOMPARE(prop.isDesignable(), false);
QCOMPARE(prop.isResettable(), false);
+ QCOMPARE(prop.isSignalProperty(), false);
QCOMPARE(prop.isValid(), false);
QCOMPARE(prop.object(), (QObject *)0);
QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::InvalidCategory);
@@ -262,6 +264,7 @@ void tst_qdeclarativeproperty::qmlmetaproperty_object()
QCOMPARE(prop.isWritable(), false);
QCOMPARE(prop.isDesignable(), false);
QCOMPARE(prop.isResettable(), false);
+ QCOMPARE(prop.isSignalProperty(), false);
QCOMPARE(prop.isValid(), false);
QCOMPARE(prop.object(), (QObject *)0);
QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::InvalidCategory);
@@ -308,6 +311,7 @@ void tst_qdeclarativeproperty::qmlmetaproperty_object()
QCOMPARE(prop.isWritable(), false);
QCOMPARE(prop.isDesignable(), true);
QCOMPARE(prop.isResettable(), false);
+ QCOMPARE(prop.isSignalProperty(), false);
QCOMPARE(prop.isValid(), true);
QCOMPARE(prop.object(), qobject_cast<QObject*>(&dobject));
QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::Normal);
@@ -361,6 +365,7 @@ void tst_qdeclarativeproperty::qmlmetaproperty_object_string()
QCOMPARE(prop.isWritable(), false);
QCOMPARE(prop.isDesignable(), false);
QCOMPARE(prop.isResettable(), false);
+ QCOMPARE(prop.isSignalProperty(), false);
QCOMPARE(prop.isValid(), false);
QCOMPARE(prop.object(), (QObject *)0);
QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::InvalidCategory);
@@ -407,6 +412,7 @@ void tst_qdeclarativeproperty::qmlmetaproperty_object_string()
QCOMPARE(prop.isWritable(), false);
QCOMPARE(prop.isDesignable(), true);
QCOMPARE(prop.isResettable(), false);
+ QCOMPARE(prop.isSignalProperty(), false);
QCOMPARE(prop.isValid(), true);
QCOMPARE(prop.object(), qobject_cast<QObject*>(&dobject));
QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::Normal);
@@ -455,6 +461,7 @@ void tst_qdeclarativeproperty::qmlmetaproperty_object_string()
QCOMPARE(prop.isWritable(), false);
QCOMPARE(prop.isDesignable(), false);
QCOMPARE(prop.isResettable(), false);
+ QCOMPARE(prop.isSignalProperty(), true);
QCOMPARE(prop.isValid(), true);
QCOMPARE(prop.object(), qobject_cast<QObject*>(&dobject));
QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::InvalidCategory);
@@ -502,6 +509,7 @@ void tst_qdeclarativeproperty::qmlmetaproperty_object_string()
QCOMPARE(prop.isWritable(), false);
QCOMPARE(prop.isDesignable(), false);
QCOMPARE(prop.isResettable(), false);
+ QCOMPARE(prop.isSignalProperty(), true);
QCOMPARE(prop.isValid(), true);
QCOMPARE(prop.object(), qobject_cast<QObject*>(&dobject));
QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::InvalidCategory);
@@ -554,6 +562,7 @@ void tst_qdeclarativeproperty::qmlmetaproperty_object_context()
QCOMPARE(prop.isWritable(), false);
QCOMPARE(prop.isDesignable(), false);
QCOMPARE(prop.isResettable(), false);
+ QCOMPARE(prop.isSignalProperty(), false);
QCOMPARE(prop.isValid(), false);
QCOMPARE(prop.object(), (QObject *)0);
QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::InvalidCategory);
@@ -600,6 +609,7 @@ void tst_qdeclarativeproperty::qmlmetaproperty_object_context()
QCOMPARE(prop.isWritable(), false);
QCOMPARE(prop.isDesignable(), true);
QCOMPARE(prop.isResettable(), false);
+ QCOMPARE(prop.isSignalProperty(), false);
QCOMPARE(prop.isValid(), true);
QCOMPARE(prop.object(), qobject_cast<QObject*>(&dobject));
QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::Normal);
@@ -653,6 +663,7 @@ void tst_qdeclarativeproperty::qmlmetaproperty_object_string_context()
QCOMPARE(prop.isWritable(), false);
QCOMPARE(prop.isDesignable(), false);
QCOMPARE(prop.isResettable(), false);
+ QCOMPARE(prop.isSignalProperty(), false);
QCOMPARE(prop.isValid(), false);
QCOMPARE(prop.object(), (QObject *)0);
QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::InvalidCategory);
@@ -699,6 +710,7 @@ void tst_qdeclarativeproperty::qmlmetaproperty_object_string_context()
QCOMPARE(prop.isWritable(), false);
QCOMPARE(prop.isDesignable(), true);
QCOMPARE(prop.isResettable(), false);
+ QCOMPARE(prop.isSignalProperty(), false);
QCOMPARE(prop.isValid(), true);
QCOMPARE(prop.object(), qobject_cast<QObject*>(&dobject));
QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::Normal);
@@ -747,6 +759,7 @@ void tst_qdeclarativeproperty::qmlmetaproperty_object_string_context()
QCOMPARE(prop.isWritable(), false);
QCOMPARE(prop.isDesignable(), false);
QCOMPARE(prop.isResettable(), false);
+ QCOMPARE(prop.isSignalProperty(), true);
QCOMPARE(prop.isValid(), true);
QCOMPARE(prop.object(), qobject_cast<QObject*>(&dobject));
QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::InvalidCategory);
@@ -794,6 +807,7 @@ void tst_qdeclarativeproperty::qmlmetaproperty_object_string_context()
QCOMPARE(prop.isWritable(), false);
QCOMPARE(prop.isDesignable(), false);
QCOMPARE(prop.isResettable(), false);
+ QCOMPARE(prop.isSignalProperty(), true);
QCOMPARE(prop.isValid(), true);
QCOMPARE(prop.object(), qobject_cast<QObject*>(&dobject));
QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::InvalidCategory);
@@ -921,6 +935,17 @@ void tst_qdeclarativeproperty::read()
QCOMPARE(p.read(), QVariant("myName"));
}
+ // Value prop by name (static)
+ {
+ QObject o;
+
+ QCOMPARE(QDeclarativeProperty::read(&o, "objectName"), QVariant(QString()));
+
+ o.setObjectName("myName");
+
+ QCOMPARE(QDeclarativeProperty::read(&o, "objectName"), QVariant("myName"));
+ }
+
// Value-type prop
{
PropertyObject o;
@@ -993,6 +1018,16 @@ void tst_qdeclarativeproperty::read()
QCOMPARE(qvariant_cast<QObject *>(v)->property("a").toInt(), 10);
QCOMPARE(qvariant_cast<QObject *>(v)->property("b").toInt(), 19);
}
+ { // static
+ QDeclarativeComponent component(&engine, TEST_FILE("readSynthesizedObject.qml"));
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+
+ QVariant v = QDeclarativeProperty::read(object, "test", &engine);
+ QVERIFY(v.userType() == QMetaType::QObjectStar);
+ QCOMPARE(qvariant_cast<QObject *>(v)->property("a").toInt(), 10);
+ QCOMPARE(qvariant_cast<QObject *>(v)->property("b").toInt(), 19);
+ }
// Attached property
{
@@ -1025,6 +1060,15 @@ void tst_qdeclarativeproperty::read()
QCOMPARE(p.read(), QVariant(10));
delete object;
}
+ { // static
+ QDeclarativeComponent component(&engine);
+ component.setData("import Test 1.0 as Foo\nFoo.MyContainer { Foo.MyContainer.foo: 10 }", QUrl());
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+
+ QCOMPARE(QDeclarativeProperty::read(object, "Foo.MyContainer.foo", qmlContext(object)), QVariant(10));
+ delete object;
+ }
}
void tst_qdeclarativeproperty::write()
@@ -1065,6 +1109,13 @@ void tst_qdeclarativeproperty::write()
QCOMPARE(o.objectName(), QString("myName"));
}
+ // Writable prop by name (static)
+ {
+ PropertyObject o;
+ QCOMPARE(QDeclarativeProperty::write(&o, QString("objectName"), QVariant(QString("myName"))), true);
+ QCOMPARE(o.objectName(), QString("myName"));
+ }
+
// Deleted object
{
PropertyObject *o = new PropertyObject;
@@ -1137,6 +1188,18 @@ void tst_qdeclarativeproperty::write()
QCOMPARE(p2.write(QUrl("main.qml")), true);
QCOMPARE(o.url(), result);
}
+ { // static
+ PropertyObject o;
+
+ QCOMPARE(QDeclarativeProperty::write(&o, "url", QUrl("main.qml")), true);
+ QCOMPARE(o.url(), QUrl("main.qml"));
+
+ QUrl result = engine.baseUrl().resolved(QUrl("main.qml"));
+ QVERIFY(result != QUrl("main.qml"));
+
+ QCOMPARE(QDeclarativeProperty::write(&o, "url", QUrl("main.qml"), engine.rootContext()), true);
+ QCOMPARE(o.url(), result);
+ }
// Attached property
{
@@ -1308,6 +1371,74 @@ void tst_qdeclarativeproperty::crashOnValueProperty()
QCOMPARE(p.read(), QVariant(20));
}
+// QTBUG-13719
+void tst_qdeclarativeproperty::aliasPropertyBindings()
+{
+ QDeclarativeComponent component(&engine, TEST_FILE("aliasPropertyBindings.qml"));
+
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+
+ QCOMPARE(object->property("realProperty").toReal(), 90.);
+ QCOMPARE(object->property("aliasProperty").toReal(), 90.);
+
+ object->setProperty("test", 10);
+
+ QCOMPARE(object->property("realProperty").toReal(), 110.);
+ QCOMPARE(object->property("aliasProperty").toReal(), 110.);
+
+ QDeclarativeProperty realProperty(object, QLatin1String("realProperty"));
+ QDeclarativeProperty aliasProperty(object, QLatin1String("aliasProperty"));
+
+ // Check there is a binding on these two properties
+ QVERIFY(QDeclarativePropertyPrivate::binding(realProperty) != 0);
+ QVERIFY(QDeclarativePropertyPrivate::binding(aliasProperty) != 0);
+
+ // Check that its the same binding on these two properties
+ QCOMPARE(QDeclarativePropertyPrivate::binding(realProperty),
+ QDeclarativePropertyPrivate::binding(aliasProperty));
+
+ // Change the binding
+ object->setProperty("state", QString("switch"));
+
+ QVERIFY(QDeclarativePropertyPrivate::binding(realProperty) != 0);
+ QVERIFY(QDeclarativePropertyPrivate::binding(aliasProperty) != 0);
+ QCOMPARE(QDeclarativePropertyPrivate::binding(realProperty),
+ QDeclarativePropertyPrivate::binding(aliasProperty));
+
+ QCOMPARE(object->property("realProperty").toReal(), 96.);
+ QCOMPARE(object->property("aliasProperty").toReal(), 96.);
+
+ // Check the old binding really has not effect any more
+ object->setProperty("test", 4);
+
+ QCOMPARE(object->property("realProperty").toReal(), 96.);
+ QCOMPARE(object->property("aliasProperty").toReal(), 96.);
+
+ object->setProperty("test2", 9);
+
+ QCOMPARE(object->property("realProperty").toReal(), 288.);
+ QCOMPARE(object->property("aliasProperty").toReal(), 288.);
+
+ // Revert
+ object->setProperty("state", QString(""));
+
+ QVERIFY(QDeclarativePropertyPrivate::binding(realProperty) != 0);
+ QVERIFY(QDeclarativePropertyPrivate::binding(aliasProperty) != 0);
+ QCOMPARE(QDeclarativePropertyPrivate::binding(realProperty),
+ QDeclarativePropertyPrivate::binding(aliasProperty));
+
+ QCOMPARE(object->property("realProperty").toReal(), 20.);
+ QCOMPARE(object->property("aliasProperty").toReal(), 20.);
+
+ object->setProperty("test2", 3);
+
+ QCOMPARE(object->property("realProperty").toReal(), 20.);
+ QCOMPARE(object->property("aliasProperty").toReal(), 20.);
+
+ delete object;
+}
+
void tst_qdeclarativeproperty::copy()
{
PropertyObject object;
diff --git a/tests/auto/declarative/qdeclarativeqt/qdeclarativeqt.pro b/tests/auto/declarative/qdeclarativeqt/qdeclarativeqt.pro
index a12c439..71ff8a8 100644
--- a/tests/auto/declarative/qdeclarativeqt/qdeclarativeqt.pro
+++ b/tests/auto/declarative/qdeclarativeqt/qdeclarativeqt.pro
@@ -6,7 +6,7 @@ macx:CONFIG -= app_bundle
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativerepeater/qdeclarativerepeater.pro b/tests/auto/declarative/qdeclarativerepeater/qdeclarativerepeater.pro
index 385b8da..5230f69 100644
--- a/tests/auto/declarative/qdeclarativerepeater/qdeclarativerepeater.pro
+++ b/tests/auto/declarative/qdeclarativerepeater/qdeclarativerepeater.pro
@@ -7,7 +7,7 @@ SOURCES += tst_qdeclarativerepeater.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativescriptdebugging/qdeclarativescriptdebugging.pro b/tests/auto/declarative/qdeclarativescriptdebugging/qdeclarativescriptdebugging.pro
index dedb263..171f308 100644
--- a/tests/auto/declarative/qdeclarativescriptdebugging/qdeclarativescriptdebugging.pro
+++ b/tests/auto/declarative/qdeclarativescriptdebugging/qdeclarativescriptdebugging.pro
@@ -11,7 +11,7 @@ INCLUDEPATH += ../shared
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativesmoothedanimation/qdeclarativesmoothedanimation.pro b/tests/auto/declarative/qdeclarativesmoothedanimation/qdeclarativesmoothedanimation.pro
index 69f331b..1e77d6e 100644
--- a/tests/auto/declarative/qdeclarativesmoothedanimation/qdeclarativesmoothedanimation.pro
+++ b/tests/auto/declarative/qdeclarativesmoothedanimation/qdeclarativesmoothedanimation.pro
@@ -7,7 +7,7 @@ SOURCES += tst_qdeclarativesmoothedanimation.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativespringanimation/qdeclarativespringanimation.pro b/tests/auto/declarative/qdeclarativespringanimation/qdeclarativespringanimation.pro
index a59522b..da477fc 100644
--- a/tests/auto/declarative/qdeclarativespringanimation/qdeclarativespringanimation.pro
+++ b/tests/auto/declarative/qdeclarativespringanimation/qdeclarativespringanimation.pro
@@ -7,7 +7,7 @@ SOURCES += tst_qdeclarativespringanimation.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativesqldatabase/qdeclarativesqldatabase.pro b/tests/auto/declarative/qdeclarativesqldatabase/qdeclarativesqldatabase.pro
index d938692..0d335a5 100644
--- a/tests/auto/declarative/qdeclarativesqldatabase/qdeclarativesqldatabase.pro
+++ b/tests/auto/declarative/qdeclarativesqldatabase/qdeclarativesqldatabase.pro
@@ -8,7 +8,7 @@ SOURCES += tst_qdeclarativesqldatabase.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativestates/data/image.png b/tests/auto/declarative/qdeclarativestates/data/image.png
new file mode 100644
index 0000000..ed1833c
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativestates/data/image.png
Binary files differ
diff --git a/tests/auto/declarative/qdeclarativestates/data/reset.qml b/tests/auto/declarative/qdeclarativestates/data/reset.qml
index 8799c97..a140ffa 100644
--- a/tests/auto/declarative/qdeclarativestates/data/reset.qml
+++ b/tests/auto/declarative/qdeclarativestates/data/reset.qml
@@ -3,17 +3,16 @@ import QtQuick 1.0
Rectangle {
width: 640
height: 480
- Text {
- id: theText
+ Image {
+ id: image
width: 40
- wrapMode: Text.WordWrap
- text: "a text string that is longer than 40 pixels"
+ source: "image.png"
}
states: State {
name: "state1"
PropertyChanges {
- target: theText
+ target: image
width: undefined
}
}
diff --git a/tests/auto/declarative/qdeclarativestates/qdeclarativestates.pro b/tests/auto/declarative/qdeclarativestates/qdeclarativestates.pro
index 2f32178..4a0cc24 100644
--- a/tests/auto/declarative/qdeclarativestates/qdeclarativestates.pro
+++ b/tests/auto/declarative/qdeclarativestates/qdeclarativestates.pro
@@ -7,7 +7,7 @@ SOURCES += tst_qdeclarativestates.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativestates/tst_qdeclarativestates.cpp b/tests/auto/declarative/qdeclarativestates/tst_qdeclarativestates.cpp
index b8409a5..870842c 100644
--- a/tests/auto/declarative/qdeclarativestates/tst_qdeclarativestates.cpp
+++ b/tests/auto/declarative/qdeclarativestates/tst_qdeclarativestates.cpp
@@ -44,7 +44,6 @@
#include <private/qdeclarativeanchors_p_p.h>
#include <private/qdeclarativerectangle_p.h>
#include <private/qdeclarativeimage_p.h>
-#include <private/qdeclarativetext_p.h>
#include <private/qdeclarativepropertychanges_p.h>
#include <private/qdeclarativestategroup_p.h>
#include <private/qdeclarativeitem_p.h>
@@ -1126,15 +1125,15 @@ void tst_qdeclarativestates::reset()
QDeclarativeRectangle *rect = qobject_cast<QDeclarativeRectangle*>(c.create());
QVERIFY(rect != 0);
- QDeclarativeText *text = rect->findChild<QDeclarativeText*>();
- QVERIFY(text != 0);
- QCOMPARE(text->width(), qreal(40.));
- QVERIFY(text->width() < text->height());
+ QDeclarativeImage *image = rect->findChild<QDeclarativeImage*>();
+ QVERIFY(image != 0);
+ QCOMPARE(image->width(), qreal(40.));
+ QCOMPARE(image->height(), qreal(20.));
QDeclarativeItemPrivate::get(rect)->setState("state1");
- QVERIFY(text->width() > 41);
- QVERIFY(text->width() > text->height());
+ QCOMPARE(image->width(), 20.0);
+ QCOMPARE(image->height(), qreal(20.));
}
void tst_qdeclarativestates::illegalObjectCreation()
diff --git a/tests/auto/declarative/qdeclarativetext/qdeclarativetext.pro b/tests/auto/declarative/qdeclarativetext/qdeclarativetext.pro
index 362886e..290cda3 100644
--- a/tests/auto/declarative/qdeclarativetext/qdeclarativetext.pro
+++ b/tests/auto/declarative/qdeclarativetext/qdeclarativetext.pro
@@ -12,7 +12,7 @@ SOURCES += ../shared/testhttpserver.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativetextedit/qdeclarativetextedit.pro b/tests/auto/declarative/qdeclarativetextedit/qdeclarativetextedit.pro
index cf706ba..aaf753e 100644
--- a/tests/auto/declarative/qdeclarativetextedit/qdeclarativetextedit.pro
+++ b/tests/auto/declarative/qdeclarativetextedit/qdeclarativetextedit.pro
@@ -8,7 +8,7 @@ HEADERS += ../shared/testhttpserver.h
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp
index a7971cc..c7a51f7 100644
--- a/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp
+++ b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp
@@ -652,6 +652,19 @@ void tst_qdeclarativetextedit::selection()
QVERIFY(textEditObject->selectionEnd() == 0);
QVERIFY(textEditObject->selectedText().isNull());
+ // Verify invalid positions are ignored.
+ textEditObject->setCursorPosition(-1);
+ QVERIFY(textEditObject->cursorPosition() == 0);
+ QVERIFY(textEditObject->selectionStart() == 0);
+ QVERIFY(textEditObject->selectionEnd() == 0);
+ QVERIFY(textEditObject->selectedText().isNull());
+
+ textEditObject->setCursorPosition(textEditObject->text().count()+1);
+ QVERIFY(textEditObject->cursorPosition() == 0);
+ QVERIFY(textEditObject->selectionStart() == 0);
+ QVERIFY(textEditObject->selectionEnd() == 0);
+ QVERIFY(textEditObject->selectedText().isNull());
+
//Test selection
for(int i=0; i<= testStr.size(); i++) {
textEditObject->select(0,i);
diff --git a/tests/auto/declarative/qdeclarativetextinput/qdeclarativetextinput.pro b/tests/auto/declarative/qdeclarativetextinput/qdeclarativetextinput.pro
index 5c45f57..0fee1c9 100644
--- a/tests/auto/declarative/qdeclarativetextinput/qdeclarativetextinput.pro
+++ b/tests/auto/declarative/qdeclarativetextinput/qdeclarativetextinput.pro
@@ -7,7 +7,7 @@ SOURCES += tst_qdeclarativetextinput.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp b/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp
index 76e0102..7b2310a 100644
--- a/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp
+++ b/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp
@@ -354,6 +354,19 @@ void tst_qdeclarativetextinput::selection()
QVERIFY(textinputObject->selectionEnd() == 0);
QVERIFY(textinputObject->selectedText().isNull());
+ // Verify invalid positions are ignored.
+ textinputObject->setCursorPosition(-1);
+ QVERIFY(textinputObject->cursorPosition() == 0);
+ QVERIFY(textinputObject->selectionStart() == 0);
+ QVERIFY(textinputObject->selectionEnd() == 0);
+ QVERIFY(textinputObject->selectedText().isNull());
+
+ textinputObject->setCursorPosition(textinputObject->text().count()+1);
+ QVERIFY(textinputObject->cursorPosition() == 0);
+ QVERIFY(textinputObject->selectionStart() == 0);
+ QVERIFY(textinputObject->selectionEnd() == 0);
+ QVERIFY(textinputObject->selectedText().isNull());
+
//Test selection
for(int i=0; i<= testStr.size(); i++) {
textinputObject->select(0,i);
diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/BindingsSpliceCorrectlyType.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/BindingsSpliceCorrectlyType.qml
new file mode 100644
index 0000000..f625d08
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativevaluetypes/data/BindingsSpliceCorrectlyType.qml
@@ -0,0 +1,7 @@
+import Test 1.0
+
+MyTypeObject {
+ property bool boldProperty: false
+
+ font.bold: boldProperty
+}
diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/BindingsSpliceCorrectlyType4.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/BindingsSpliceCorrectlyType4.qml
new file mode 100644
index 0000000..0bdccce
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativevaluetypes/data/BindingsSpliceCorrectlyType4.qml
@@ -0,0 +1,7 @@
+import Test 1.0
+
+MyTypeObject {
+ property int dataProperty: 7
+
+ point: Qt.point(dataProperty, dataProperty)
+}
diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/BindingsSpliceCorrectlyType5.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/BindingsSpliceCorrectlyType5.qml
new file mode 100644
index 0000000..151c499
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativevaluetypes/data/BindingsSpliceCorrectlyType5.qml
@@ -0,0 +1,7 @@
+import Test 1.0
+
+MyTypeObject {
+ property int dataProperty: 7
+
+ point.x: dataProperty
+}
diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.1.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.1.qml
new file mode 100644
index 0000000..7012143
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.1.qml
@@ -0,0 +1,29 @@
+import Test 1.0
+import QtQuick 1.0
+
+BindingsSpliceCorrectlyType {
+ property bool test: false
+
+ property bool italicProperty: false
+
+ font.italic: italicProperty
+
+ Component.onCompleted: {
+ // Test initial state
+ if (font.italic != false) return;
+ if (font.bold != false) return;
+
+ // Test italic binding worked
+ italicProperty = true;
+
+ if (font.italic != true) return;
+ if (font.bold != false) return;
+
+ // Test bold binding worked
+ boldProperty = true;
+ if (font.italic != true) return;
+ if (font.bold != true) return;
+
+ test = true;
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.2.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.2.qml
new file mode 100644
index 0000000..69dbcab
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.2.qml
@@ -0,0 +1,31 @@
+import Test 1.0
+import QtQuick 1.0
+
+BindingsSpliceCorrectlyType {
+ property bool test: false
+
+ property bool italicProperty: false
+
+ font.italic: italicProperty
+ font.bold: false
+
+ Component.onCompleted: {
+ // Test initial state
+ if (font.italic != false) return;
+ if (font.bold != false) return;
+
+ // Test italic binding worked
+ italicProperty = true;
+
+ if (font.italic != true) return;
+ if (font.bold != false) return;
+
+ // Test bold binding was removed by constant write
+ boldProperty = true;
+ if (font.italic != true) return;
+ if (font.bold != false) return;
+
+ test = true;
+ }
+}
+
diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.3.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.3.qml
new file mode 100644
index 0000000..669feb9
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.3.qml
@@ -0,0 +1,36 @@
+import Test 1.0
+import QtQuick 1.0
+
+BindingsSpliceCorrectlyType {
+ property bool test: false
+
+ property bool italicProperty: false
+ property bool boldProperty2: false
+
+ font.italic: italicProperty
+ font.bold: boldProperty2
+
+ Component.onCompleted: {
+ // Test initial state
+ if (font.italic != false) return;
+ if (font.bold != false) return;
+
+ // Test italic binding worked
+ italicProperty = true;
+
+ if (font.italic != true) return;
+ if (font.bold != false) return;
+
+ // Test bold binding was overridden
+ boldProperty = true;
+ if (font.italic != true) return;
+ if (font.bold != false) return;
+
+ boldProperty2 = true;
+ if (font.italic != true) return;
+ if (font.bold != true) return;
+
+ test = true;
+ }
+}
+
diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.4.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.4.qml
new file mode 100644
index 0000000..f28584f
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.4.qml
@@ -0,0 +1,27 @@
+import Test 1.0
+import QtQuick 1.0
+
+BindingsSpliceCorrectlyType4 {
+ property bool test: false
+
+ property int dataProperty2: 8
+
+ point.x: dataProperty2
+
+ Component.onCompleted: {
+ if (point.x != 8) return;
+ if (point.y != 4) return;
+
+ dataProperty = 9;
+
+ if (point.x != 8) return;
+ if (point.y != 4) return;
+
+ dataProperty2 = 13;
+
+ if (point.x != 13) return;
+ if (point.y != 4) return;
+
+ test = true;
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.5.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.5.qml
new file mode 100644
index 0000000..1214c83
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.5.qml
@@ -0,0 +1,27 @@
+import Test 1.0
+import QtQuick 1.0
+
+BindingsSpliceCorrectlyType5 {
+ property bool test: false
+
+ property int dataProperty2: 8
+
+ point: Qt.point(dataProperty2, dataProperty2);
+
+ Component.onCompleted: {
+ if (point.x != 8) return;
+ if (point.y != 8) return;
+
+ dataProperty = 9;
+
+ if (point.x != 8) return;
+ if (point.y != 8) return;
+
+ dataProperty2 = 13;
+
+ if (point.x != 13) return;
+ if (point.y != 13) return;
+
+ test = true;
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativevaluetypes/qdeclarativevaluetypes.pro b/tests/auto/declarative/qdeclarativevaluetypes/qdeclarativevaluetypes.pro
index a208254..59b3526 100644
--- a/tests/auto/declarative/qdeclarativevaluetypes/qdeclarativevaluetypes.pro
+++ b/tests/auto/declarative/qdeclarativevaluetypes/qdeclarativevaluetypes.pro
@@ -10,7 +10,7 @@ SOURCES += tst_qdeclarativevaluetypes.cpp \
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativevaluetypes/tst_qdeclarativevaluetypes.cpp b/tests/auto/declarative/qdeclarativevaluetypes/tst_qdeclarativevaluetypes.cpp
index a4819f3..c243a75 100644
--- a/tests/auto/declarative/qdeclarativevaluetypes/tst_qdeclarativevaluetypes.cpp
+++ b/tests/auto/declarative/qdeclarativevaluetypes/tst_qdeclarativevaluetypes.cpp
@@ -94,6 +94,7 @@ private slots:
void conflictingBindings();
void returnValues();
void varAssignment();
+ void bindingsSpliceCorrectly();
private:
QDeclarativeEngine engine;
@@ -942,6 +943,61 @@ void tst_qdeclarativevaluetypes::varAssignment()
delete object;
}
+// Test bindings splice together correctly
+void tst_qdeclarativevaluetypes::bindingsSpliceCorrectly()
+{
+ {
+ QDeclarativeComponent component(&engine, TEST_FILE("bindingsSpliceCorrectly.1.qml"));
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+
+ QCOMPARE(object->property("test").toBool(), true);
+
+ delete object;
+ }
+
+ {
+ QDeclarativeComponent component(&engine, TEST_FILE("bindingsSpliceCorrectly.2.qml"));
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+
+ QCOMPARE(object->property("test").toBool(), true);
+
+ delete object;
+ }
+
+
+ {
+ QDeclarativeComponent component(&engine, TEST_FILE("bindingsSpliceCorrectly.3.qml"));
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+
+ QCOMPARE(object->property("test").toBool(), true);
+
+ delete object;
+ }
+
+ {
+ QDeclarativeComponent component(&engine, TEST_FILE("bindingsSpliceCorrectly.4.qml"));
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+
+ QCOMPARE(object->property("test").toBool(), true);
+
+ delete object;
+ }
+
+ {
+ QDeclarativeComponent component(&engine, TEST_FILE("bindingsSpliceCorrectly.5.qml"));
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+
+ QCOMPARE(object->property("test").toBool(), true);
+
+ delete object;
+ }
+}
+
QTEST_MAIN(tst_qdeclarativevaluetypes)
#include "tst_qdeclarativevaluetypes.moc"
diff --git a/tests/auto/declarative/qdeclarativeview/qdeclarativeview.pro b/tests/auto/declarative/qdeclarativeview/qdeclarativeview.pro
index 4436d54..fc4790d 100644
--- a/tests/auto/declarative/qdeclarativeview/qdeclarativeview.pro
+++ b/tests/auto/declarative/qdeclarativeview/qdeclarativeview.pro
@@ -7,7 +7,7 @@ SOURCES += tst_qdeclarativeview.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativeviewer/qdeclarativeviewer.pro b/tests/auto/declarative/qdeclarativeviewer/qdeclarativeviewer.pro
index 5ba416e..8d4b410 100644
--- a/tests/auto/declarative/qdeclarativeviewer/qdeclarativeviewer.pro
+++ b/tests/auto/declarative/qdeclarativeviewer/qdeclarativeviewer.pro
@@ -6,10 +6,12 @@ include(../../../../tools/qml/qml.pri)
SOURCES += tst_qdeclarativeviewer.cpp
+include(../symbianlibs.pri)
+
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativeviewer/tst_qdeclarativeviewer.cpp b/tests/auto/declarative/qdeclarativeviewer/tst_qdeclarativeviewer.cpp
index 21c7197..f19eb03 100644
--- a/tests/auto/declarative/qdeclarativeviewer/tst_qdeclarativeviewer.cpp
+++ b/tests/auto/declarative/qdeclarativeviewer/tst_qdeclarativeviewer.cpp
@@ -238,13 +238,25 @@ void tst_QDeclarativeViewer::loading()
delete viewer;
}
+static int numberOfWarnings = 0;
+static void checkWarnings(QtMsgType, const char *)
+{
+ numberOfWarnings++;
+}
+
void tst_QDeclarativeViewer::fileBrowser()
{
+ QtMsgHandler previousMsgHandler = qInstallMsgHandler(checkWarnings);
QDeclarativeViewer *viewer = new QDeclarativeViewer();
QVERIFY(viewer);
viewer->setUseNativeFileBrowser(false);
viewer->openFile();
viewer->show();
+ QCoreApplication::processEvents();
+ qInstallMsgHandler(previousMsgHandler);
+
+ // QTBUG-15720
+ QVERIFY(numberOfWarnings == 0);
QApplication::setActiveWindow(viewer);
QTest::qWaitForWindowShown(viewer);
diff --git a/tests/auto/declarative/qdeclarativevisualdatamodel/qdeclarativevisualdatamodel.pro b/tests/auto/declarative/qdeclarativevisualdatamodel/qdeclarativevisualdatamodel.pro
index 16154f3..fe3d794 100644
--- a/tests/auto/declarative/qdeclarativevisualdatamodel/qdeclarativevisualdatamodel.pro
+++ b/tests/auto/declarative/qdeclarativevisualdatamodel/qdeclarativevisualdatamodel.pro
@@ -7,7 +7,7 @@ SOURCES += tst_qdeclarativevisualdatamodel.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativewebview/qdeclarativewebview.pro b/tests/auto/declarative/qdeclarativewebview/qdeclarativewebview.pro
index cc7fa43..af13d33 100644
--- a/tests/auto/declarative/qdeclarativewebview/qdeclarativewebview.pro
+++ b/tests/auto/declarative/qdeclarativewebview/qdeclarativewebview.pro
@@ -8,7 +8,7 @@ SOURCES += tst_qdeclarativewebview.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativeworkerscript/qdeclarativeworkerscript.pro b/tests/auto/declarative/qdeclarativeworkerscript/qdeclarativeworkerscript.pro
index eca8a68..e20c3e6 100644
--- a/tests/auto/declarative/qdeclarativeworkerscript/qdeclarativeworkerscript.pro
+++ b/tests/auto/declarative/qdeclarativeworkerscript/qdeclarativeworkerscript.pro
@@ -7,7 +7,7 @@ SOURCES += tst_qdeclarativeworkerscript.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/qdeclarativexmlhttprequest.pro b/tests/auto/declarative/qdeclarativexmlhttprequest/qdeclarativexmlhttprequest.pro
index fbcc597..8aefb8e 100644
--- a/tests/auto/declarative/qdeclarativexmlhttprequest/qdeclarativexmlhttprequest.pro
+++ b/tests/auto/declarative/qdeclarativexmlhttprequest/qdeclarativexmlhttprequest.pro
@@ -11,7 +11,7 @@ SOURCES += tst_qdeclarativexmlhttprequest.cpp \
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativexmllistmodel/qdeclarativexmllistmodel.pro b/tests/auto/declarative/qdeclarativexmllistmodel/qdeclarativexmllistmodel.pro
index 23173f3..64b8267 100644
--- a/tests/auto/declarative/qdeclarativexmllistmodel/qdeclarativexmllistmodel.pro
+++ b/tests/auto/declarative/qdeclarativexmllistmodel/qdeclarativexmllistmodel.pro
@@ -1,5 +1,5 @@
load(qttest_p4)
-contains(QT_CONFIG,declarative): QT += declarative script gui
+contains(QT_CONFIG,declarative): QT += declarative script gui network
contains(QT_CONFIG,xmlpatterns) {
QT += xmlpatterns
DEFINES += QTEST_XMLPATTERNS
@@ -11,7 +11,7 @@ SOURCES += tst_qdeclarativexmllistmodel.cpp
symbian: {
importFiles.files = data
importFiles.path = .
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/auto/declarative/qdeclarativexmllistmodel/tst_qdeclarativexmllistmodel.cpp b/tests/auto/declarative/qdeclarativexmllistmodel/tst_qdeclarativexmllistmodel.cpp
index a14f942..b95b053 100644
--- a/tests/auto/declarative/qdeclarativexmllistmodel/tst_qdeclarativexmllistmodel.cpp
+++ b/tests/auto/declarative/qdeclarativexmllistmodel/tst_qdeclarativexmllistmodel.cpp
@@ -38,8 +38,13 @@
** $QT_END_LICENSE$
**
****************************************************************************/
+#include <private/qdeclarativeengine_p.h>
+
#include <qtest.h>
#include <QtTest/qsignalspy.h>
+#include <QtDeclarative/qdeclarativenetworkaccessmanagerfactory.h>
+#include <QtNetwork/qnetworkaccessmanager.h>
+#include <QtNetwork/qnetworkrequest.h>
#include <QtCore/qtimer.h>
#include <QtCore/qfile.h>
#include <QtCore/qtemporaryfile.h>
@@ -81,6 +86,7 @@ private slots:
void roles();
void roleErrors();
void uniqueRoleNames();
+ void headers();
void xml();
void xml_data();
void source();
@@ -139,6 +145,44 @@ private:
QDeclarativeEngine engine;
};
+class CustomNetworkAccessManagerFactory : public QObject, public QDeclarativeNetworkAccessManagerFactory
+{
+ Q_OBJECT
+public:
+ QVariantMap lastSentHeaders;
+
+protected:
+ QNetworkAccessManager *create(QObject *parent);
+};
+
+class CustomNetworkAccessManager : public QNetworkAccessManager
+{
+ Q_OBJECT
+public:
+ CustomNetworkAccessManager(CustomNetworkAccessManagerFactory *factory, QObject *parent)
+ : QNetworkAccessManager(parent), m_factory(factory) {}
+
+protected:
+ QNetworkReply *createRequest(Operation op, const QNetworkRequest &req, QIODevice * outgoingData = 0)
+ {
+ if (m_factory) {
+ QVariantMap map;
+ foreach (const QString &header, req.rawHeaderList())
+ map[header] = req.rawHeader(header.toUtf8());
+ m_factory->lastSentHeaders = map;
+ }
+ return QNetworkAccessManager::createRequest(op, req, outgoingData);
+ }
+
+ QPointer<CustomNetworkAccessManagerFactory> m_factory;
+};
+
+QNetworkAccessManager *CustomNetworkAccessManagerFactory::create(QObject *parent)
+{
+ return new CustomNetworkAccessManager(this, parent);
+}
+
+
void tst_qdeclarativexmllistmodel::buildModel()
{
QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/model.qml"));
@@ -312,6 +356,31 @@ void tst_qdeclarativexmllistmodel::xml_data()
QTest::newRow("one item") << "<Pets><Pet><name>Hobbes</name><type>Tiger</type><age>7</age><size>Large</size></Pet></Pets>" << 1;
}
+void tst_qdeclarativexmllistmodel::headers()
+{
+ // ensure the QNetworkAccessManagers created for this test are immediately deleted
+ QDeclarativeEngine qmlEng;
+
+ CustomNetworkAccessManagerFactory factory;
+ qmlEng.setNetworkAccessManagerFactory(&factory);
+
+ QDeclarativeComponent component(&qmlEng, QUrl::fromLocalFile(SRCDIR "/data/model.qml"));
+ QDeclarativeXmlListModel *model = qobject_cast<QDeclarativeXmlListModel*>(component.create());
+ QVERIFY(model != 0);
+ QTRY_COMPARE(model->status(), QDeclarativeXmlListModel::Ready);
+
+ QVariantMap expectedHeaders;
+ expectedHeaders["Accept"] = "application/xml";
+
+ QCOMPARE(factory.lastSentHeaders.count(), expectedHeaders.count());
+ foreach (const QString &header, expectedHeaders.keys()) {
+ QVERIFY(factory.lastSentHeaders.contains(header));
+ QCOMPARE(factory.lastSentHeaders[header].toString(), expectedHeaders[header].toString());
+ }
+
+ delete model;
+}
+
void tst_qdeclarativexmllistmodel::source()
{
QFETCH(QUrl, source);
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/listview.5.png b/tests/auto/declarative/qmlvisual/ListView/data/listview.5.png
index d1f06fa..63a594e 100644
--- a/tests/auto/declarative/qmlvisual/ListView/data/listview.5.png
+++ b/tests/auto/declarative/qmlvisual/ListView/data/listview.5.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/listview.6.png b/tests/auto/declarative/qmlvisual/ListView/data/listview.6.png
index 9e6e29c..05e24c6 100644
--- a/tests/auto/declarative/qmlvisual/ListView/data/listview.6.png
+++ b/tests/auto/declarative/qmlvisual/ListView/data/listview.6.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/listview.qml b/tests/auto/declarative/qmlvisual/ListView/data/listview.qml
index b1ffe8f..059128d 100644
--- a/tests/auto/declarative/qmlvisual/ListView/data/listview.qml
+++ b/tests/auto/declarative/qmlvisual/ListView/data/listview.qml
@@ -1550,7 +1550,7 @@ VisualTest {
}
Frame {
msec: 4240
- hash: "ad913e53e63c030ffdf4560766722760"
+ hash: "84b477b46c313d6dcb0a77628182905b"
}
Mouse {
type: 5
@@ -1570,7 +1570,7 @@ VisualTest {
}
Frame {
msec: 4256
- hash: "ef31f8a4d5bde5a2e308d19ee6d5e759"
+ hash: "281c0499db31ca78175ca7af6292b853"
}
Mouse {
type: 5
@@ -1582,7 +1582,7 @@ VisualTest {
}
Frame {
msec: 4272
- hash: "3ba07527f66e8bea5a8fb7647b0b4f3f"
+ hash: "5c29d61f037e4636988fdc99ee2ed8a4"
}
Mouse {
type: 5
@@ -1594,7 +1594,7 @@ VisualTest {
}
Frame {
msec: 4288
- hash: "70e5fe656f5fd843383964825690b678"
+ hash: "a18f5e9f7be932dcd1bcb4c7fe0797e8"
}
Mouse {
type: 5
@@ -1614,7 +1614,7 @@ VisualTest {
}
Frame {
msec: 4304
- hash: "b7d8738be4cd6caa63dbecdb0f810a2f"
+ hash: "85a4130b4a57ef79e90d350cf4816801"
}
Mouse {
type: 5
@@ -1626,7 +1626,7 @@ VisualTest {
}
Frame {
msec: 4320
- hash: "d6312191f9d7bbddc07f9253d8a93469"
+ hash: "364dd89fd6f96e1c77723436c7078a7b"
}
Mouse {
type: 5
@@ -1638,7 +1638,7 @@ VisualTest {
}
Frame {
msec: 4336
- hash: "b182da64886cf4f444296e5fde26701e"
+ hash: "3e37312c45aa92de34d9661f9b482c48"
}
Mouse {
type: 5
@@ -1650,7 +1650,7 @@ VisualTest {
}
Frame {
msec: 4352
- hash: "ebefef14b6fb990e0c6900884528bbd3"
+ hash: "dc2d63ad430ea6214f962629793925f3"
}
Mouse {
type: 5
@@ -1662,7 +1662,7 @@ VisualTest {
}
Frame {
msec: 4368
- hash: "9a3451ed091b1bb6b975a9c5506b1ea4"
+ hash: "188fe1e6af9d02b2680426127ef1d39e"
}
Mouse {
type: 5
@@ -1674,7 +1674,7 @@ VisualTest {
}
Frame {
msec: 4384
- hash: "04290d8d62436c8a812f886e0a56ec1b"
+ hash: "bdb784f5ccf428f8b8a9d29310069808"
}
Mouse {
type: 5
@@ -1686,7 +1686,7 @@ VisualTest {
}
Frame {
msec: 4400
- hash: "eaaf9ea1d7fcf4a2a9dd58b1b5bb3cae"
+ hash: "bb74813667f49b15978aa78843436205"
}
Mouse {
type: 5
@@ -1698,7 +1698,7 @@ VisualTest {
}
Frame {
msec: 4416
- hash: "7ca8e3d76cf913d85f84f0b96acde829"
+ hash: "8e88500470517ed1d7c3ca10edd4e230"
}
Mouse {
type: 5
@@ -1710,7 +1710,7 @@ VisualTest {
}
Frame {
msec: 4432
- hash: "7cfef56b24a552c6d4ecb3d0b88a1d08"
+ hash: "614dc45593db51f467adeda87d84f9a4"
}
Mouse {
type: 5
@@ -1730,7 +1730,7 @@ VisualTest {
}
Frame {
msec: 4448
- hash: "d032b257259810b4fe514c63ca5c9e4b"
+ hash: "b170583b9b284debdd04af643752aa6b"
}
Mouse {
type: 5
@@ -1742,7 +1742,7 @@ VisualTest {
}
Frame {
msec: 4464
- hash: "568f6a57e6f1644b0dc245d03a1d7b85"
+ hash: "dba0394b92f3ee166bc397439a86e6dc"
}
Mouse {
type: 5
@@ -1754,87 +1754,87 @@ VisualTest {
}
Frame {
msec: 4480
- hash: "5cb4cf2c527d821db2a5072dd3702653"
+ hash: "74b499d5d764bf53efbee8932bab3cc3"
}
Frame {
msec: 4496
- hash: "5cb4cf2c527d821db2a5072dd3702653"
+ hash: "74b499d5d764bf53efbee8932bab3cc3"
}
Frame {
msec: 4512
- hash: "5cb4cf2c527d821db2a5072dd3702653"
+ hash: "74b499d5d764bf53efbee8932bab3cc3"
}
Frame {
msec: 4528
- hash: "5cb4cf2c527d821db2a5072dd3702653"
+ hash: "74b499d5d764bf53efbee8932bab3cc3"
}
Frame {
msec: 4544
- hash: "5cb4cf2c527d821db2a5072dd3702653"
+ hash: "74b499d5d764bf53efbee8932bab3cc3"
}
Frame {
msec: 4560
- hash: "5cb4cf2c527d821db2a5072dd3702653"
+ hash: "74b499d5d764bf53efbee8932bab3cc3"
}
Frame {
msec: 4576
- hash: "5cb4cf2c527d821db2a5072dd3702653"
+ hash: "74b499d5d764bf53efbee8932bab3cc3"
}
Frame {
msec: 4592
- hash: "5cb4cf2c527d821db2a5072dd3702653"
+ hash: "74b499d5d764bf53efbee8932bab3cc3"
}
Frame {
msec: 4608
- hash: "5cb4cf2c527d821db2a5072dd3702653"
+ hash: "74b499d5d764bf53efbee8932bab3cc3"
}
Frame {
msec: 4624
- hash: "5cb4cf2c527d821db2a5072dd3702653"
+ hash: "74b499d5d764bf53efbee8932bab3cc3"
}
Frame {
msec: 4640
- hash: "5cb4cf2c527d821db2a5072dd3702653"
+ hash: "74b499d5d764bf53efbee8932bab3cc3"
}
Frame {
msec: 4656
- hash: "5cb4cf2c527d821db2a5072dd3702653"
+ hash: "74b499d5d764bf53efbee8932bab3cc3"
}
Frame {
msec: 4672
- hash: "5cb4cf2c527d821db2a5072dd3702653"
+ hash: "74b499d5d764bf53efbee8932bab3cc3"
}
Frame {
msec: 4688
- hash: "5cb4cf2c527d821db2a5072dd3702653"
+ hash: "74b499d5d764bf53efbee8932bab3cc3"
}
Frame {
msec: 4704
- hash: "5cb4cf2c527d821db2a5072dd3702653"
+ hash: "74b499d5d764bf53efbee8932bab3cc3"
}
Frame {
msec: 4720
- hash: "5cb4cf2c527d821db2a5072dd3702653"
+ hash: "74b499d5d764bf53efbee8932bab3cc3"
}
Frame {
msec: 4736
- hash: "5cb4cf2c527d821db2a5072dd3702653"
+ hash: "74b499d5d764bf53efbee8932bab3cc3"
}
Frame {
msec: 4752
- hash: "5cb4cf2c527d821db2a5072dd3702653"
+ hash: "74b499d5d764bf53efbee8932bab3cc3"
}
Frame {
msec: 4768
- hash: "5cb4cf2c527d821db2a5072dd3702653"
+ hash: "74b499d5d764bf53efbee8932bab3cc3"
}
Frame {
msec: 4784
- hash: "5cb4cf2c527d821db2a5072dd3702653"
+ hash: "74b499d5d764bf53efbee8932bab3cc3"
}
Frame {
msec: 4800
- hash: "5cb4cf2c527d821db2a5072dd3702653"
+ hash: "74b499d5d764bf53efbee8932bab3cc3"
}
Frame {
msec: 4816
@@ -1842,11 +1842,11 @@ VisualTest {
}
Frame {
msec: 4832
- hash: "5cb4cf2c527d821db2a5072dd3702653"
+ hash: "74b499d5d764bf53efbee8932bab3cc3"
}
Frame {
msec: 4848
- hash: "5cb4cf2c527d821db2a5072dd3702653"
+ hash: "74b499d5d764bf53efbee8932bab3cc3"
}
Mouse {
type: 5
@@ -1866,7 +1866,7 @@ VisualTest {
}
Frame {
msec: 4864
- hash: "d48ecbd0661e08b2117fe2fd96ffeb2c"
+ hash: "95ab953fc04389396da9a38d97262d98"
}
Mouse {
type: 5
@@ -1878,7 +1878,7 @@ VisualTest {
}
Frame {
msec: 4880
- hash: "7cfef56b24a552c6d4ecb3d0b88a1d08"
+ hash: "614dc45593db51f467adeda87d84f9a4"
}
Mouse {
type: 5
@@ -1890,7 +1890,7 @@ VisualTest {
}
Frame {
msec: 4896
- hash: "5b12e9d17d9d464b055601db9cf0da44"
+ hash: "0d884cdb22e3668203d07c72055bcb85"
}
Mouse {
type: 5
@@ -1902,7 +1902,7 @@ VisualTest {
}
Frame {
msec: 4912
- hash: "25333e1f0cc9cfc664fd7369af544c06"
+ hash: "23bd71236829253fb3ef18ebc9dd3136"
}
Mouse {
type: 5
@@ -1914,39 +1914,39 @@ VisualTest {
}
Frame {
msec: 4928
- hash: "04290d8d62436c8a812f886e0a56ec1b"
+ hash: "bdb784f5ccf428f8b8a9d29310069808"
}
Frame {
msec: 4944
- hash: "04290d8d62436c8a812f886e0a56ec1b"
+ hash: "bdb784f5ccf428f8b8a9d29310069808"
}
Frame {
msec: 4960
- hash: "04290d8d62436c8a812f886e0a56ec1b"
+ hash: "bdb784f5ccf428f8b8a9d29310069808"
}
Frame {
msec: 4976
- hash: "04290d8d62436c8a812f886e0a56ec1b"
+ hash: "bdb784f5ccf428f8b8a9d29310069808"
}
Frame {
msec: 4992
- hash: "04290d8d62436c8a812f886e0a56ec1b"
+ hash: "bdb784f5ccf428f8b8a9d29310069808"
}
Frame {
msec: 5008
- hash: "04290d8d62436c8a812f886e0a56ec1b"
+ hash: "bdb784f5ccf428f8b8a9d29310069808"
}
Frame {
msec: 5024
- hash: "04290d8d62436c8a812f886e0a56ec1b"
+ hash: "bdb784f5ccf428f8b8a9d29310069808"
}
Frame {
msec: 5040
- hash: "04290d8d62436c8a812f886e0a56ec1b"
+ hash: "bdb784f5ccf428f8b8a9d29310069808"
}
Frame {
msec: 5056
- hash: "04290d8d62436c8a812f886e0a56ec1b"
+ hash: "bdb784f5ccf428f8b8a9d29310069808"
}
Mouse {
type: 3
@@ -1958,179 +1958,179 @@ VisualTest {
}
Frame {
msec: 5072
- hash: "04290d8d62436c8a812f886e0a56ec1b"
+ hash: "bdb784f5ccf428f8b8a9d29310069808"
}
Frame {
msec: 5088
- hash: "04290d8d62436c8a812f886e0a56ec1b"
+ hash: "bdb784f5ccf428f8b8a9d29310069808"
}
Frame {
msec: 5104
- hash: "04290d8d62436c8a812f886e0a56ec1b"
+ hash: "bdb784f5ccf428f8b8a9d29310069808"
}
Frame {
msec: 5120
- hash: "04290d8d62436c8a812f886e0a56ec1b"
+ hash: "bdb784f5ccf428f8b8a9d29310069808"
}
Frame {
msec: 5136
- hash: "04290d8d62436c8a812f886e0a56ec1b"
+ hash: "bdb784f5ccf428f8b8a9d29310069808"
}
Frame {
msec: 5152
- hash: "04290d8d62436c8a812f886e0a56ec1b"
+ hash: "bdb784f5ccf428f8b8a9d29310069808"
}
Frame {
msec: 5168
- hash: "04290d8d62436c8a812f886e0a56ec1b"
+ hash: "bdb784f5ccf428f8b8a9d29310069808"
}
Frame {
msec: 5184
- hash: "04290d8d62436c8a812f886e0a56ec1b"
+ hash: "bdb784f5ccf428f8b8a9d29310069808"
}
Frame {
msec: 5200
- hash: "04290d8d62436c8a812f886e0a56ec1b"
+ hash: "bdb784f5ccf428f8b8a9d29310069808"
}
Frame {
msec: 5216
- hash: "04290d8d62436c8a812f886e0a56ec1b"
+ hash: "bdb784f5ccf428f8b8a9d29310069808"
}
Frame {
msec: 5232
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5248
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5264
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5280
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5296
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5312
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5328
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5344
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5360
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5376
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5392
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5408
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5424
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5440
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5456
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5472
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5488
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5504
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5520
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5536
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5552
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5568
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5584
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5600
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5616
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5632
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5648
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5664
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5680
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5696
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5712
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5728
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5744
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5760
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5776
@@ -2138,90 +2138,90 @@ VisualTest {
}
Frame {
msec: 5792
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5808
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5824
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5840
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5856
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5872
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5888
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5904
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5920
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5936
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5952
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5968
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 5984
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 6000
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 6016
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 6032
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 6048
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 6064
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 6080
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 6096
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 6112
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
Frame {
msec: 6128
- hash: "dbd87bf02d698b7f053d307ef0c98452"
+ hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
}
}
diff --git a/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.0.png b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.0.png
new file mode 100644
index 0000000..99748a7
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.1.png b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.1.png
new file mode 100644
index 0000000..5393dd8
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.2.png b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.2.png
new file mode 100644
index 0000000..8c17bf7
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.2.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.3.png b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.3.png
new file mode 100644
index 0000000..1317eef
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.3.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.qml b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.qml
new file mode 100644
index 0000000..930f08f
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.qml
@@ -0,0 +1,951 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ image: "colorAnimation-visual.0.png"
+ }
+ Frame {
+ msec: 32
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 48
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 64
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 80
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 96
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 112
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 128
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 144
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 160
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 176
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 192
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 208
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 224
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 240
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 256
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 272
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 288
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 304
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 320
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 336
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 352
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 368
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 384
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 400
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 416
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 432
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 448
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 464
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 480
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 496
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 512
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 93; y: 136
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 528
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 544
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 560
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 576
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 592
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 93; y: 136
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 608
+ hash: "acc736435c9f84aa82941ba561bc5dbc"
+ }
+ Frame {
+ msec: 624
+ hash: "e5bda0daf98288ce18db6ce06eda3ba0"
+ }
+ Frame {
+ msec: 640
+ hash: "d35008f75b8c992f80fb16ba7203649d"
+ }
+ Frame {
+ msec: 656
+ hash: "14f43e0784ddf42ea8550db88c501bf1"
+ }
+ Frame {
+ msec: 672
+ hash: "02276e158b5391480b1bdeaadf1fb903"
+ }
+ Frame {
+ msec: 688
+ hash: "35d9513eb97a2c482b7cd197de910934"
+ }
+ Frame {
+ msec: 704
+ hash: "faf0fd681e60bb2489099f5df772b6cd"
+ }
+ Frame {
+ msec: 720
+ hash: "a863d3e346f94785a3a392fdc91526eb"
+ }
+ Frame {
+ msec: 736
+ hash: "fdf328d3f6eb8410da59a91345e41a44"
+ }
+ Frame {
+ msec: 752
+ hash: "83514a3b10d5be8f6c3b128d0f3e0b1c"
+ }
+ Frame {
+ msec: 768
+ hash: "ead0eae76cd00189075964671effbaea"
+ }
+ Frame {
+ msec: 784
+ hash: "24d2457fcd51490fda23071bf9929d12"
+ }
+ Frame {
+ msec: 800
+ hash: "1478683446cf543dacbe31d0b76a98a6"
+ }
+ Frame {
+ msec: 816
+ hash: "99f7da1f31fe920f6c02add4042ae925"
+ }
+ Frame {
+ msec: 832
+ hash: "22def892006cf66667770b0f17baf6c0"
+ }
+ Frame {
+ msec: 848
+ hash: "6a36d5a77099bfd58baf285478ff04e4"
+ }
+ Frame {
+ msec: 864
+ hash: "6258150666b59b20ab476724c07fc20c"
+ }
+ Frame {
+ msec: 880
+ hash: "f1636315bc950a6dd400d9c7ed263b88"
+ }
+ Frame {
+ msec: 896
+ hash: "18447ea8dc2e8da956788e5b3cf3790a"
+ }
+ Frame {
+ msec: 912
+ hash: "1d2a6e65997a73e9e670356c8e8b63b2"
+ }
+ Frame {
+ msec: 928
+ hash: "bed0242c0f9ef229d1392835286d5782"
+ }
+ Frame {
+ msec: 944
+ hash: "88923c190e9e5beadef8a409c06df9d6"
+ }
+ Frame {
+ msec: 960
+ hash: "2d133e7ee60c97386f57838b3f0976c7"
+ }
+ Frame {
+ msec: 976
+ image: "colorAnimation-visual.1.png"
+ }
+ Frame {
+ msec: 992
+ hash: "395195716d76bc0be7b2033ed37a7a1c"
+ }
+ Frame {
+ msec: 1008
+ hash: "243dbffcf416926242bbcb7348974c4c"
+ }
+ Frame {
+ msec: 1024
+ hash: "a755068679616d8ac65c2aa7431f2a19"
+ }
+ Frame {
+ msec: 1040
+ hash: "e8249b35a47eb492cbdf2d91cc8426f0"
+ }
+ Frame {
+ msec: 1056
+ hash: "15f3da1c0e6f0779b96859d51171dd27"
+ }
+ Frame {
+ msec: 1072
+ hash: "258c0c756aac3de743b43051f2aace6b"
+ }
+ Frame {
+ msec: 1088
+ hash: "a58b9fdf301d72b2cc5c93934cc8927b"
+ }
+ Frame {
+ msec: 1104
+ hash: "a9181d30870d472521f8904818ce520f"
+ }
+ Frame {
+ msec: 1120
+ hash: "7f9e94069ccf3897c26a71bd7becd903"
+ }
+ Frame {
+ msec: 1136
+ hash: "bdf305c2f46cdb86dbf57b1e0cc5a65b"
+ }
+ Frame {
+ msec: 1152
+ hash: "fe5b6865d7e4fc7d1d42c1e74f8666f7"
+ }
+ Frame {
+ msec: 1168
+ hash: "734f0de45a6e34c9eab7ef606196f96a"
+ }
+ Frame {
+ msec: 1184
+ hash: "02a361c4534fdf7f286dc3e6dc23275c"
+ }
+ Frame {
+ msec: 1200
+ hash: "e649155ad69999c14b92f6561e4d1185"
+ }
+ Frame {
+ msec: 1216
+ hash: "01af177084fab755d622973f64b92018"
+ }
+ Frame {
+ msec: 1232
+ hash: "097cc4a082dfab995d213a3a73883c97"
+ }
+ Frame {
+ msec: 1248
+ hash: "d7b4239a3280b1eb8e885e3f422df8e9"
+ }
+ Frame {
+ msec: 1264
+ hash: "59893977994e34e83f91e7ce3ad65d6d"
+ }
+ Frame {
+ msec: 1280
+ hash: "b68e3fbb5cdcd6bd96df7dec558db42b"
+ }
+ Frame {
+ msec: 1296
+ hash: "94ad0580648f36a1e18a9ea7e249b04d"
+ }
+ Frame {
+ msec: 1312
+ hash: "750a4c01d2f5806a89a1c6cc6a9b9a68"
+ }
+ Frame {
+ msec: 1328
+ hash: "4f109f50f388f1bfa4bc6b03b3e6e514"
+ }
+ Frame {
+ msec: 1344
+ hash: "c6168d5cf27a533e8ee636637667be47"
+ }
+ Frame {
+ msec: 1360
+ hash: "f8120547bed987aa34c00da5a01a4d1e"
+ }
+ Frame {
+ msec: 1376
+ hash: "cbff526136fa2c128c8b898fbbef9e5c"
+ }
+ Frame {
+ msec: 1392
+ hash: "f29e52398fab1a239a63df4c32f2fc69"
+ }
+ Frame {
+ msec: 1408
+ hash: "7178bfe86fd2fd513218b33760460f8d"
+ }
+ Frame {
+ msec: 1424
+ hash: "ca83285bc8ac633403896fe976896eb0"
+ }
+ Frame {
+ msec: 1440
+ hash: "96ba486c09cc69d5aa38c46c00df1181"
+ }
+ Frame {
+ msec: 1456
+ hash: "b88eab335842787869f4a14824c19dd8"
+ }
+ Frame {
+ msec: 1472
+ hash: "065aa59012729e1e1a246a2083142690"
+ }
+ Frame {
+ msec: 1488
+ hash: "dd0e98c8398861002c5f178c5f9f612d"
+ }
+ Frame {
+ msec: 1504
+ hash: "04192c2b545948048eccf4d81bbde198"
+ }
+ Frame {
+ msec: 1520
+ hash: "bb7502c7208281ef9fd41714ab88a1a8"
+ }
+ Frame {
+ msec: 1536
+ hash: "5397195471890d08b703dca101e5bc7c"
+ }
+ Frame {
+ msec: 1552
+ hash: "4c678cdbebb2ffd2cbf012ca77800cde"
+ }
+ Frame {
+ msec: 1568
+ hash: "0d7a34ecd0c7f52b2c015037bf1902c6"
+ }
+ Frame {
+ msec: 1584
+ hash: "fd9d5048be749ac4369fda2d018b43ae"
+ }
+ Frame {
+ msec: 1600
+ hash: "93ee03795cd57ae6f7fe3a020b039ad4"
+ }
+ Frame {
+ msec: 1616
+ hash: "5e1118963f219c39761ca7fbf564a9ca"
+ }
+ Frame {
+ msec: 1632
+ hash: "8f40038741903150136170503649d941"
+ }
+ Frame {
+ msec: 1648
+ hash: "b087b7d0aa6224821f8e18718ff5e77d"
+ }
+ Frame {
+ msec: 1664
+ hash: "aa46b04a3c67dc772265ed2901955565"
+ }
+ Frame {
+ msec: 1680
+ hash: "ac024bf2aeb4becdf31a09fe0a6db8f3"
+ }
+ Frame {
+ msec: 1696
+ hash: "13745a174e4d06e2108a5bf125ba50cc"
+ }
+ Frame {
+ msec: 1712
+ hash: "bd972f0d8e230eca0b3fea1b8c960c08"
+ }
+ Frame {
+ msec: 1728
+ hash: "cbdbec802a58e7ced0cf45b3ab0bc0ba"
+ }
+ Frame {
+ msec: 1744
+ hash: "5128584c50305c7d218b81b8367fa3d5"
+ }
+ Frame {
+ msec: 1760
+ hash: "a71461d3593f3685620668916de870bd"
+ }
+ Frame {
+ msec: 1776
+ hash: "74ebac8f32cf044b58d9883dbcd9a722"
+ }
+ Frame {
+ msec: 1792
+ hash: "fedc5b638f339b90fe59b478721e65b7"
+ }
+ Frame {
+ msec: 1808
+ hash: "8593a81be812edf54ec94da8ae9c1314"
+ }
+ Frame {
+ msec: 1824
+ hash: "4e9b083075bc5e9287a8abc982778b56"
+ }
+ Frame {
+ msec: 1840
+ hash: "1d6f02aa99afa47d77fc49ab894b365a"
+ }
+ Frame {
+ msec: 1856
+ hash: "a204feec783b3b05de4c209c21745826"
+ }
+ Frame {
+ msec: 1872
+ hash: "665a2a8ff00b9663157802767f504754"
+ }
+ Frame {
+ msec: 1888
+ hash: "624fb09ebe60cb87d767faf8d2420b1e"
+ }
+ Frame {
+ msec: 1904
+ hash: "e5af0cdc33f3275a25abb09e9165f310"
+ }
+ Frame {
+ msec: 1920
+ hash: "02bafb5a81ca66f7670ac93de5123860"
+ }
+ Frame {
+ msec: 1936
+ image: "colorAnimation-visual.2.png"
+ }
+ Frame {
+ msec: 1952
+ hash: "b5abd0dff1ab076faac7cc226e83f5d0"
+ }
+ Frame {
+ msec: 1968
+ hash: "b759acc35bccff8efc2e6fe276ddc0f7"
+ }
+ Frame {
+ msec: 1984
+ hash: "ce52e18c1f7732768779863b45314ff5"
+ }
+ Frame {
+ msec: 2000
+ hash: "99d30652559dd6931e0c95543eeaa149"
+ }
+ Frame {
+ msec: 2016
+ hash: "ffbd9a00e05e085b89296d19d5caec57"
+ }
+ Frame {
+ msec: 2032
+ hash: "9c9d658b9c25602816b8066bf19105db"
+ }
+ Frame {
+ msec: 2048
+ hash: "2b7fd058e6601e22a30bb7106b1c683b"
+ }
+ Frame {
+ msec: 2064
+ hash: "f4c7e26b19ee0a3e7c9688685eb7bd05"
+ }
+ Frame {
+ msec: 2080
+ hash: "0dc6d593bceff56b7f81f2a49d37fefb"
+ }
+ Frame {
+ msec: 2096
+ hash: "9bfd7ad5091ccbdde43c593e133a7b10"
+ }
+ Frame {
+ msec: 2112
+ hash: "2703b617937914a90ea42ebf249d79ee"
+ }
+ Frame {
+ msec: 2128
+ hash: "b77e2983138254016c4cca53100f46fa"
+ }
+ Frame {
+ msec: 2144
+ hash: "60c4dd24187d1281081479e586f02b37"
+ }
+ Frame {
+ msec: 2160
+ hash: "62f2511abd99ef1231c9fa4b91d4abfe"
+ }
+ Frame {
+ msec: 2176
+ hash: "e309b3353fd174e883d309571caddc98"
+ }
+ Frame {
+ msec: 2192
+ hash: "1e2d6a134c7b12dde551b148ef4f088c"
+ }
+ Frame {
+ msec: 2208
+ hash: "e5dc5450604a491cc24a0dcf5c278b58"
+ }
+ Frame {
+ msec: 2224
+ hash: "c8dae97c10e1962c1e6a51ab3ab8579e"
+ }
+ Frame {
+ msec: 2240
+ hash: "4e1b7e06f55fb084080689b474f1fe1d"
+ }
+ Frame {
+ msec: 2256
+ hash: "b4639c907fa937bf15fac62421170cd8"
+ }
+ Frame {
+ msec: 2272
+ hash: "c250208a0caeb5f6cb4d3aac3d7d350b"
+ }
+ Frame {
+ msec: 2288
+ hash: "a73351eabecf0d71149efe31f197413e"
+ }
+ Frame {
+ msec: 2304
+ hash: "479425f1b7aff79e4dfb7fca534af018"
+ }
+ Frame {
+ msec: 2320
+ hash: "046d0f0040a52d1f26ba9f7c5de06ef4"
+ }
+ Frame {
+ msec: 2336
+ hash: "655778bf13c6080903150b0eb43a7edc"
+ }
+ Frame {
+ msec: 2352
+ hash: "72da0bbe81514870655fdd3354adac60"
+ }
+ Frame {
+ msec: 2368
+ hash: "defe0bdf675c65fff55aaaced1e4dae7"
+ }
+ Frame {
+ msec: 2384
+ hash: "c988628b6c3d3780e9a865c7694926cd"
+ }
+ Frame {
+ msec: 2400
+ hash: "5ab17563655231089edd986ff13d6012"
+ }
+ Frame {
+ msec: 2416
+ hash: "c1adff1d2e5800ed466d1691d3b17382"
+ }
+ Frame {
+ msec: 2432
+ hash: "70129ba01fbb19592b9dc0d0a3b3e7df"
+ }
+ Frame {
+ msec: 2448
+ hash: "0000829ef7ed908bf430d42904d59cc2"
+ }
+ Frame {
+ msec: 2464
+ hash: "843d2927f50ab87b4a86b7a6aaeed91f"
+ }
+ Frame {
+ msec: 2480
+ hash: "da86d21756025e7de8050586d5e2a1f8"
+ }
+ Frame {
+ msec: 2496
+ hash: "48dd1bd6580133b0793fee327ea4f1e6"
+ }
+ Frame {
+ msec: 2512
+ hash: "f0618193dcd0ba2837249515a1898b1c"
+ }
+ Frame {
+ msec: 2528
+ hash: "a530184e57251065286c0cbba7301e9c"
+ }
+ Frame {
+ msec: 2544
+ hash: "64a1d7203973d65dd342793007a61c58"
+ }
+ Frame {
+ msec: 2560
+ hash: "5b830dfc6ba442772de87d75d5a578de"
+ }
+ Frame {
+ msec: 2576
+ hash: "5563b056b0409b65f60dd16dd0dd890e"
+ }
+ Frame {
+ msec: 2592
+ hash: "b8bcf9ad2ca8720c11563a23d8280804"
+ }
+ Frame {
+ msec: 2608
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 2624
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 2640
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 2656
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 2672
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 2688
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 2704
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 2720
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 2736
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 2752
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 2768
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 2784
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 2800
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 2816
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 2832
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 2848
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 2864
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 2880
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 2896
+ image: "colorAnimation-visual.3.png"
+ }
+ Frame {
+ msec: 2912
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 2928
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 2944
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 2960
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 2976
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 2992
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3008
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3024
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3040
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3056
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3072
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3088
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3104
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3120
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3136
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3152
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3168
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3184
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3200
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3216
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3232
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3248
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3264
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3280
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3296
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3312
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3328
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3344
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3360
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3376
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3392
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3408
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3424
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3440
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3456
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3472
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3488
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3504
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3520
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3536
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3552
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3568
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3584
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3600
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3616
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3632
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Key {
+ type: 6
+ key: 16777249
+ modifiers: 67108864
+ text: ""
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 3648
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3664
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+ Frame {
+ msec: 3680
+ hash: "8c0fcda4f8956394c53fc4ba18caa850"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/focusscope/data/test2.0.png b/tests/auto/declarative/qmlvisual/focusscope/data/test2.0.png
index 22d7496..396bf2d 100644
--- a/tests/auto/declarative/qmlvisual/focusscope/data/test2.0.png
+++ b/tests/auto/declarative/qmlvisual/focusscope/data/test2.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/focusscope/data/test2.1.png b/tests/auto/declarative/qmlvisual/focusscope/data/test2.1.png
index 22d7496..396bf2d 100644
--- a/tests/auto/declarative/qmlvisual/focusscope/data/test2.1.png
+++ b/tests/auto/declarative/qmlvisual/focusscope/data/test2.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/focusscope/data/test2.qml b/tests/auto/declarative/qmlvisual/focusscope/data/test2.qml
index 62eff17..8669071 100644
--- a/tests/auto/declarative/qmlvisual/focusscope/data/test2.qml
+++ b/tests/auto/declarative/qmlvisual/focusscope/data/test2.qml
@@ -10,239 +10,239 @@ VisualTest {
}
Frame {
msec: 32
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 48
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 64
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 80
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 96
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 112
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 128
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 144
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 160
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 176
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 192
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 208
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 224
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 240
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 256
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 272
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 288
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 304
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 320
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 336
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 352
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 368
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 384
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 400
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 416
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 432
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 448
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 464
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 480
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 496
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 512
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 528
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 544
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 560
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 576
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 592
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 608
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 624
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 640
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 656
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 672
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 688
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 704
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 720
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 736
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 752
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 768
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 784
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 800
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 816
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 832
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 848
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 864
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 880
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 896
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 912
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 928
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 944
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 960
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 976
@@ -250,74 +250,74 @@ VisualTest {
}
Frame {
msec: 992
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 1008
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 1024
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 1040
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 1056
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 1072
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 1088
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 1104
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 1120
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 1136
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 1152
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 1168
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 1184
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 1200
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 1216
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 1232
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 1248
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
Frame {
msec: 1264
- hash: "4823f4520db0c1f64d887f172b3efa17"
+ hash: "f4041fcc91346361df95e344a0ee8e2d"
}
}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.0.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.0.png
new file mode 100644
index 0000000..9a81b29
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.1.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.1.png
new file mode 100644
index 0000000..2d9c4fd
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.2.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.2.png
new file mode 100644
index 0000000..2bb0cb0
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.2.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.3.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.3.png
new file mode 100644
index 0000000..8260a65
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.3.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.4.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.4.png
new file mode 100644
index 0000000..0abcbc2
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.4.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.qml b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.qml
new file mode 100644
index 0000000..f1bb428
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.qml
@@ -0,0 +1,1575 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ image: "flickable-horizontal.0.png"
+ }
+ Frame {
+ msec: 32
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 48
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 64
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 80
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 96
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 112
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 128
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 144
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 160
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 176
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 192
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 208
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 224
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 240
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 256
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 272
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 288
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 304
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 320
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 336
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 352
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 368
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 384
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 400
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 416
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 432
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 448
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 464
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 480
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 496
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 512
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 528
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 544
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 560
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 576
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 592
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 608
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 624
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 640
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 656
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 672
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 688
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 704
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 720
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 447; y: 145
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 736
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 752
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 768
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 446; y: 145
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 784
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 440; y: 146
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 800
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 425; y: 151
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 407; y: 157
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 816
+ hash: "c92e345e4ffdb30c28d9d5aa5400bd30"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 359; y: 169
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 832
+ hash: "90f94986ab44ab59618e9a5da17b8cc9"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 309; y: 181
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 848
+ hash: "0154a65f8693b98576101ac1c2fc8761"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 282; y: 187
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 282; y: 187
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 864
+ hash: "792c1b5267f14c891dae2348a8188a92"
+ }
+ Frame {
+ msec: 880
+ hash: "15ce9e88d4ad2e698bf167d1432c0b8a"
+ }
+ Frame {
+ msec: 896
+ hash: "8f4109ef4c24d286d73f689565a0d056"
+ }
+ Frame {
+ msec: 912
+ hash: "f5728190bf5c94742686f063b4a4b09b"
+ }
+ Frame {
+ msec: 928
+ hash: "a38c7527a9a818b7bc25466b0e4939f9"
+ }
+ Frame {
+ msec: 944
+ hash: "ed3902455fc31a4e3232308b815a4daa"
+ }
+ Frame {
+ msec: 960
+ hash: "a2093589363ac2d50491412e99e0193a"
+ }
+ Frame {
+ msec: 976
+ image: "flickable-horizontal.1.png"
+ }
+ Frame {
+ msec: 992
+ hash: "c32349580e3a9586cc1133c935607cf0"
+ }
+ Frame {
+ msec: 1008
+ hash: "cd2068492e346eb20d50aee69e3a3559"
+ }
+ Frame {
+ msec: 1024
+ hash: "f43a1a38894b8ffad009ba995d84b0ee"
+ }
+ Frame {
+ msec: 1040
+ hash: "2d5c4a73df2a054801571f1ce119e31f"
+ }
+ Frame {
+ msec: 1056
+ hash: "b8825cc6bdca8102a655d797ea41b5b1"
+ }
+ Frame {
+ msec: 1072
+ hash: "3f0be15b85220743d004f2d54b6e137c"
+ }
+ Frame {
+ msec: 1088
+ hash: "4b0952d33149b44ffa0a06723a4116c7"
+ }
+ Frame {
+ msec: 1104
+ hash: "9056bda43259e92cfe56fdf394e2ca54"
+ }
+ Frame {
+ msec: 1120
+ hash: "82ec9f09d2303e5b0b9c05b9a10a84db"
+ }
+ Frame {
+ msec: 1136
+ hash: "751a9b3054c09d900364d7c9cac8bc2b"
+ }
+ Frame {
+ msec: 1152
+ hash: "17dfdfef20f9da7e8b6f16df974baea9"
+ }
+ Frame {
+ msec: 1168
+ hash: "108e6d9a5a81df32823bfd7a90a000a7"
+ }
+ Frame {
+ msec: 1184
+ hash: "71dd0d55a3e837d3a8e4b4e318579ade"
+ }
+ Frame {
+ msec: 1200
+ hash: "8013cdb2615bca89134ea040409af509"
+ }
+ Frame {
+ msec: 1216
+ hash: "4b2826ad4c755690bd837994133f5fac"
+ }
+ Frame {
+ msec: 1232
+ hash: "52d0da7f138bd37ac587a448d6402aca"
+ }
+ Frame {
+ msec: 1248
+ hash: "e634724c5bb294d338210845bf64d2cf"
+ }
+ Frame {
+ msec: 1264
+ hash: "59bc5f0d057ee431f289806377f19213"
+ }
+ Frame {
+ msec: 1280
+ hash: "6ef2c5f7766c2cc77b30d636bfaa4422"
+ }
+ Frame {
+ msec: 1296
+ hash: "578d056c3db094420dbaa51bd08ced20"
+ }
+ Frame {
+ msec: 1312
+ hash: "14c6f7a04a52caffefa07af556ccb262"
+ }
+ Frame {
+ msec: 1328
+ hash: "7cb63d56fec144d0509ce219fc6fe459"
+ }
+ Frame {
+ msec: 1344
+ hash: "462dafa7f6427aecf6c28a5dcf5a10cc"
+ }
+ Frame {
+ msec: 1360
+ hash: "45360814f985ed780a443568a91fc170"
+ }
+ Frame {
+ msec: 1376
+ hash: "0d18ceb2436e4f7eb56a3443fab706e6"
+ }
+ Frame {
+ msec: 1392
+ hash: "1d83f367ba9f7f1d4496208271e925ed"
+ }
+ Frame {
+ msec: 1408
+ hash: "fdbd00ee4c122aef779df42ea53f403a"
+ }
+ Frame {
+ msec: 1424
+ hash: "bedd1cb304efd4851813b39a746198a4"
+ }
+ Frame {
+ msec: 1440
+ hash: "9aa7bed86efa9634466736f20ee0ab5b"
+ }
+ Frame {
+ msec: 1456
+ hash: "00fc8186a7ae44e10195a7b13defa0d2"
+ }
+ Frame {
+ msec: 1472
+ hash: "42d6e8e0bbed879ed63644c83e61e7bd"
+ }
+ Frame {
+ msec: 1488
+ hash: "df074f8c210249e5ef652349479b6325"
+ }
+ Frame {
+ msec: 1504
+ hash: "4f94020437e35cf44dd3576997990ab7"
+ }
+ Frame {
+ msec: 1520
+ hash: "8ca6c3b4fa3be73ac35073356b680a35"
+ }
+ Frame {
+ msec: 1536
+ hash: "c25eee1c5791383ebc59974e7754eacb"
+ }
+ Frame {
+ msec: 1552
+ hash: "f4917ada78942428cc6b9aa5e56c013d"
+ }
+ Frame {
+ msec: 1568
+ hash: "23e1e607101fc7260a4ac841344f5fe0"
+ }
+ Frame {
+ msec: 1584
+ hash: "2dcc7d187d8e0493e5766efbf09ef37c"
+ }
+ Frame {
+ msec: 1600
+ hash: "c1e5602753e80cf44d7b330140c6912e"
+ }
+ Frame {
+ msec: 1616
+ hash: "febaf72d01a3763461b4b7d2ddd7a23e"
+ }
+ Frame {
+ msec: 1632
+ hash: "071262b911b61576f451be25691a57cf"
+ }
+ Frame {
+ msec: 1648
+ hash: "44705db9289fd8753b9d63e8bc963b38"
+ }
+ Frame {
+ msec: 1664
+ hash: "0c41d7b7d36bd083abfc0b83b862cad9"
+ }
+ Frame {
+ msec: 1680
+ hash: "0c41d7b7d36bd083abfc0b83b862cad9"
+ }
+ Frame {
+ msec: 1696
+ hash: "071262b911b61576f451be25691a57cf"
+ }
+ Frame {
+ msec: 1712
+ hash: "a00aa90e894b48203b0446ca287ee712"
+ }
+ Frame {
+ msec: 1728
+ hash: "26c9ca53ee4b084c6595ad65bf4880df"
+ }
+ Frame {
+ msec: 1744
+ hash: "f4917ada78942428cc6b9aa5e56c013d"
+ }
+ Frame {
+ msec: 1760
+ hash: "ffedee7bf2d8099e361b8b1706b03f88"
+ }
+ Frame {
+ msec: 1776
+ hash: "1778ef1629ce977015b641448b46634f"
+ }
+ Frame {
+ msec: 1792
+ hash: "42d6e8e0bbed879ed63644c83e61e7bd"
+ }
+ Frame {
+ msec: 1808
+ hash: "99e843ec69b79b79b0792e0a2f28cd1b"
+ }
+ Frame {
+ msec: 1824
+ hash: "8b3ebca70b50a6a93823e015ea80f0f9"
+ }
+ Frame {
+ msec: 1840
+ hash: "8eaa7f076064ce55051237b04861e408"
+ }
+ Frame {
+ msec: 1856
+ hash: "6acc0ca5e5808d911287edfa78c8ac02"
+ }
+ Frame {
+ msec: 1872
+ hash: "e9f05899e0b53c21f6efe834095a3ea4"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 91; y: 208
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 93; y: 209
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1888
+ hash: "e9f05899e0b53c21f6efe834095a3ea4"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 99; y: 210
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 108; y: 210
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1904
+ hash: "d2dece405f5f6ed1de2acb6615a931de"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 142; y: 214
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1920
+ hash: "21e0f21edc77424e8327c9a3350ecc1d"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 198; y: 216
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1936
+ image: "flickable-horizontal.2.png"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 229; y: 218
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 266; y: 220
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1952
+ hash: "c10c8b0c94f899414d8b3ef0b7c97646"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 322; y: 223
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 322; y: 223
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1968
+ hash: "807aff4e6c96a9d0de7fa55e233446b1"
+ }
+ Frame {
+ msec: 1984
+ hash: "dbd02848cefacbb26f4bcb7d8f073d6c"
+ }
+ Frame {
+ msec: 2000
+ hash: "9a60608d8ea1b39fa2d3851873f2f08e"
+ }
+ Frame {
+ msec: 2016
+ hash: "e7b3e3a40281f63889808211d6746374"
+ }
+ Frame {
+ msec: 2032
+ hash: "188c225c46ec00105df230bfeea09974"
+ }
+ Frame {
+ msec: 2048
+ hash: "e2e977b42e91d8c5dee57fd8245692eb"
+ }
+ Frame {
+ msec: 2064
+ hash: "ca2f12fb173c405f95e608858ab982ad"
+ }
+ Frame {
+ msec: 2080
+ hash: "fa86ee5f25fa425cf2569c8ef570b9d8"
+ }
+ Frame {
+ msec: 2096
+ hash: "9b74656866fb8c7394bbbecec6414aca"
+ }
+ Frame {
+ msec: 2112
+ hash: "87147326d1baab174c0f9a5ccdc2cb84"
+ }
+ Frame {
+ msec: 2128
+ hash: "c0d00f98c71bf3f8e5954b45fbab95a8"
+ }
+ Frame {
+ msec: 2144
+ hash: "c087d1d62e56e573b55c1d8599bba8a6"
+ }
+ Frame {
+ msec: 2160
+ hash: "dd5a94c6febdee58e8f115cb75131aaa"
+ }
+ Frame {
+ msec: 2176
+ hash: "a7465d6137f865f512ce65ceb29533b4"
+ }
+ Frame {
+ msec: 2192
+ hash: "409086f6bb661aab8b548fea56d7e6b1"
+ }
+ Frame {
+ msec: 2208
+ hash: "6a22911e0fb58df31271baa463ff599d"
+ }
+ Frame {
+ msec: 2224
+ hash: "c4f6dd30d5fdfcf91a8b29cf5c622423"
+ }
+ Frame {
+ msec: 2240
+ hash: "5a95b83f237c7243a198a43e9a587179"
+ }
+ Frame {
+ msec: 2256
+ hash: "d79ed290efc6dbd976d574bf0b14a6a3"
+ }
+ Frame {
+ msec: 2272
+ hash: "a7bcb436e96d7c981852239462573495"
+ }
+ Frame {
+ msec: 2288
+ hash: "f63cc82e351daab503e316f8b516990f"
+ }
+ Frame {
+ msec: 2304
+ hash: "4ea63cd25a1424042ffc60549a78563c"
+ }
+ Frame {
+ msec: 2320
+ hash: "ef0fb776012575b3b0dbf6e5f4dee571"
+ }
+ Frame {
+ msec: 2336
+ hash: "e2508faec7737be2666d87ad715b5f74"
+ }
+ Frame {
+ msec: 2352
+ hash: "9fe4e897c6b853f774d11817a0eb53bf"
+ }
+ Frame {
+ msec: 2368
+ hash: "c122ce2e73cbfedcc99d649c21d91f9d"
+ }
+ Frame {
+ msec: 2384
+ hash: "883b8b180853f1f432ae98ddfe1b6ce3"
+ }
+ Frame {
+ msec: 2400
+ hash: "d0808284e431da60f61d571c257a3011"
+ }
+ Frame {
+ msec: 2416
+ hash: "df90f19450bf4d9496aab987a89e3a02"
+ }
+ Frame {
+ msec: 2432
+ hash: "5640c1e64556b90e7fbd4448fa9db462"
+ }
+ Frame {
+ msec: 2448
+ hash: "6d9b5c2f7d0dedbbc444e69bb39fed08"
+ }
+ Frame {
+ msec: 2464
+ hash: "485c4a8049068cf73bf22db5fd3618be"
+ }
+ Frame {
+ msec: 2480
+ hash: "9e25da59c9e7e4cf7796902e8e2ff92a"
+ }
+ Frame {
+ msec: 2496
+ hash: "bd45e8f2442d7c1a1b16a762bc29e7cf"
+ }
+ Frame {
+ msec: 2512
+ hash: "ec1013d23e581dbb39b1549d2e1b3b32"
+ }
+ Frame {
+ msec: 2528
+ hash: "1ea3c2fde8ee3a14406e027f2124d793"
+ }
+ Frame {
+ msec: 2544
+ hash: "3c3f31a05fb2f32538872c9fa158aaab"
+ }
+ Frame {
+ msec: 2560
+ hash: "05a84d9c55e634ec01edd2a63e13613b"
+ }
+ Frame {
+ msec: 2576
+ hash: "0f7ccd2da58e2e73b0ab18bb681dafd5"
+ }
+ Frame {
+ msec: 2592
+ hash: "e481ff78029f8bc4bf7c697db6824f6a"
+ }
+ Frame {
+ msec: 2608
+ hash: "efb92b8b7a90acabeb4a8d5cae52fe3c"
+ }
+ Frame {
+ msec: 2624
+ hash: "4728dd0fac4edf40cfd5ef5a422b4ed9"
+ }
+ Frame {
+ msec: 2640
+ hash: "27641dcd772c979ae22d12bfbadbb67f"
+ }
+ Frame {
+ msec: 2656
+ hash: "26268714105bc4832d336a38a859fc50"
+ }
+ Frame {
+ msec: 2672
+ hash: "caf0d351d3b6914ca52853a30643ea48"
+ }
+ Frame {
+ msec: 2688
+ hash: "319824b1143925162f04aaddcfaa65d9"
+ }
+ Frame {
+ msec: 2704
+ hash: "73aa36815f34bf5e005000e7da38555e"
+ }
+ Frame {
+ msec: 2720
+ hash: "73aa36815f34bf5e005000e7da38555e"
+ }
+ Frame {
+ msec: 2736
+ hash: "319824b1143925162f04aaddcfaa65d9"
+ }
+ Frame {
+ msec: 2752
+ hash: "caf0d351d3b6914ca52853a30643ea48"
+ }
+ Frame {
+ msec: 2768
+ hash: "6608412ee80d14e13a1a05fb4716e719"
+ }
+ Frame {
+ msec: 2784
+ hash: "f4f6f002fb76407a5120329972285dc4"
+ }
+ Frame {
+ msec: 2800
+ hash: "474d8b566b9e4ef7dc125a8df30ccbb1"
+ }
+ Frame {
+ msec: 2816
+ hash: "0133138f30be4ffc7f3af3d9f477c4b4"
+ }
+ Frame {
+ msec: 2832
+ hash: "e9ee9d7d0ab9dcea3f28ae71ee19270f"
+ }
+ Frame {
+ msec: 2848
+ hash: "9fd9eb665a42b48583bc28c6c0118799"
+ }
+ Frame {
+ msec: 2864
+ hash: "94231107bc4a7e900fe5f4eb823bd9bf"
+ }
+ Frame {
+ msec: 2880
+ hash: "6011b10728fb1c83f10d3c27366ea3a5"
+ }
+ Frame {
+ msec: 2896
+ image: "flickable-horizontal.3.png"
+ }
+ Frame {
+ msec: 2912
+ hash: "e456c5fddb5fbcb02662716f19755622"
+ }
+ Frame {
+ msec: 2928
+ hash: "88cef15940302e2b8b43e73234fd7b9c"
+ }
+ Frame {
+ msec: 2944
+ hash: "041aecec2b0b0d59a56e1dd26b45cab1"
+ }
+ Frame {
+ msec: 2960
+ hash: "0d519463c713f3da46ecacd155e1a0f3"
+ }
+ Frame {
+ msec: 2976
+ hash: "5dd0c855b97d298244fb599c9f781651"
+ }
+ Frame {
+ msec: 2992
+ hash: "8677cec5e559e51095d89abfeda8e542"
+ }
+ Frame {
+ msec: 3008
+ hash: "b05fb6e798ab3fed940b5ac4d88ca378"
+ }
+ Frame {
+ msec: 3024
+ hash: "6bc9cc0d3b11ea91856296b0ec934a8b"
+ }
+ Frame {
+ msec: 3040
+ hash: "f4e63f3af69dacbf2d1d719d4d03a266"
+ }
+ Frame {
+ msec: 3056
+ hash: "31ab08997eb86fab062a3128aecbccb5"
+ }
+ Frame {
+ msec: 3072
+ hash: "90736b240ba1e634bd0ea86423908e16"
+ }
+ Frame {
+ msec: 3088
+ hash: "90736b240ba1e634bd0ea86423908e16"
+ }
+ Frame {
+ msec: 3104
+ hash: "e74982557dc06aac572078840c7e889a"
+ }
+ Frame {
+ msec: 3120
+ hash: "e74982557dc06aac572078840c7e889a"
+ }
+ Frame {
+ msec: 3136
+ hash: "ca30c14c7344d1711a35c707f8804f6e"
+ }
+ Frame {
+ msec: 3152
+ hash: "e616110d39009f0d636b816828cc0ccb"
+ }
+ Frame {
+ msec: 3168
+ hash: "e616110d39009f0d636b816828cc0ccb"
+ }
+ Frame {
+ msec: 3184
+ hash: "e616110d39009f0d636b816828cc0ccb"
+ }
+ Frame {
+ msec: 3200
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 412; y: 214
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3216
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 3232
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 3248
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 408; y: 214
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 407; y: 214
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3264
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 403; y: 214
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3280
+ hash: "1991cbb0fb053937f922731d5716032c"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 398; y: 214
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3296
+ hash: "df447575a4734bb5bd9badc6e27d98e4"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 391; y: 214
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3312
+ hash: "0fbfe1e0d7fb54450188398aa40690cd"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 383; y: 214
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3328
+ hash: "cb62e60296046c73d301d7186e14faed"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 369; y: 213
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3344
+ hash: "909cbd1292476584554e22232cb43639"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 352; y: 211
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3360
+ hash: "e63b7e502dfb2834c06a969b683b9bd3"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 331; y: 210
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3376
+ hash: "4ea63cd25a1424042ffc60549a78563c"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 314; y: 210
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3392
+ hash: "77e39d2d4bfcacecdae4f014e4506d71"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 300; y: 210
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3408
+ hash: "db576eca8bad67cb8b994f12fc448969"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 288; y: 210
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3424
+ hash: "efeb3f616da9d78505c3c82fc34ee31c"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 278; y: 210
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3440
+ hash: "e4f8bb02f8ac6bc40e1801cc8f360078"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 266; y: 210
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3456
+ hash: "82118ef71809e3867717232c4d9c5518"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 252; y: 208
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3472
+ hash: "5363451c696f6c6eb792b23d086243d7"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 238; y: 208
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3488
+ hash: "fe6afe8ae8a7c216a1cffc5515f273d5"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 227; y: 206
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3504
+ hash: "9b165741d86c70380c15e15cff3fabb6"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 224; y: 206
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3520
+ hash: "f5e176355468f4fa224d4dfcdd7525a3"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 222; y: 206
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3536
+ hash: "8c5a14a76e052cc6503a3e78245d1da3"
+ }
+ Frame {
+ msec: 3552
+ hash: "8c5a14a76e052cc6503a3e78245d1da3"
+ }
+ Frame {
+ msec: 3568
+ hash: "8c5a14a76e052cc6503a3e78245d1da3"
+ }
+ Frame {
+ msec: 3584
+ hash: "8c5a14a76e052cc6503a3e78245d1da3"
+ }
+ Frame {
+ msec: 3600
+ hash: "8c5a14a76e052cc6503a3e78245d1da3"
+ }
+ Frame {
+ msec: 3616
+ hash: "8c5a14a76e052cc6503a3e78245d1da3"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 224; y: 206
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3632
+ hash: "f5e176355468f4fa224d4dfcdd7525a3"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 232; y: 204
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3648
+ hash: "acf538fce5f1b90b83474d9898b7cdd7"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 246; y: 203
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3664
+ hash: "5a0ee016b8732fbc36064e8a35d91215"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 265; y: 203
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3680
+ hash: "8fd06a14c1de175813845ce8f07db6ec"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 292; y: 201
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3696
+ hash: "26b0ff6ffda0725e0800f7ea3af510ef"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 310; y: 201
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3712
+ hash: "80443f134511be0356a687c9b542b3e7"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 321; y: 199
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3728
+ hash: "3eeb98a829d29b3dc52f3d145ac49d58"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 323; y: 199
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3744
+ hash: "f4d43069b16f41a30e5549aae911d4cd"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 324; y: 199
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3760
+ hash: "661c89fa832f0abdcf4ae0c9e8e2d18f"
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 324; y: 199
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3776
+ hash: "661c89fa832f0abdcf4ae0c9e8e2d18f"
+ }
+ Frame {
+ msec: 3792
+ hash: "1520f54b6c8606b9e8372c5c06180453"
+ }
+ Frame {
+ msec: 3808
+ hash: "0fcf5e2ce47348cbb5bb485f101fe5ac"
+ }
+ Frame {
+ msec: 3824
+ hash: "2eb070e69de07c89830543e0475fc110"
+ }
+ Frame {
+ msec: 3840
+ hash: "d73c1059219c0655968af268d22e2c18"
+ }
+ Frame {
+ msec: 3856
+ image: "flickable-horizontal.4.png"
+ }
+ Frame {
+ msec: 3872
+ hash: "cc969b2c64839ca6d3b5069c0ed938d0"
+ }
+ Frame {
+ msec: 3888
+ hash: "1f819e18d1297a1c7eeebb7b040bdef8"
+ }
+ Frame {
+ msec: 3904
+ hash: "3643b99afbd8af0953cb39b2c8c04b9f"
+ }
+ Frame {
+ msec: 3920
+ hash: "713fd2e2fa38ab27604cb9cae59f1777"
+ }
+ Frame {
+ msec: 3936
+ hash: "e2508faec7737be2666d87ad715b5f74"
+ }
+ Frame {
+ msec: 3952
+ hash: "fc33b1c7479caeff676ffd885a18d618"
+ }
+ Frame {
+ msec: 3968
+ hash: "aca01143db4f870a56bb7546e84cbc5e"
+ }
+ Frame {
+ msec: 3984
+ hash: "442b58c39fd3745c61a1eb5043fcbb53"
+ }
+ Frame {
+ msec: 4000
+ hash: "7983d7183cc11d6819fa0a006c2d67b4"
+ }
+ Frame {
+ msec: 4016
+ hash: "9fe4e897c6b853f774d11817a0eb53bf"
+ }
+ Frame {
+ msec: 4032
+ hash: "43f528c81ccfa5b9921dfa3564a24c68"
+ }
+ Frame {
+ msec: 4048
+ hash: "dfe04ff0b3ccf205bb38beeab58a4411"
+ }
+ Frame {
+ msec: 4064
+ hash: "32ff30b50b500e9feb51e8eef205783c"
+ }
+ Frame {
+ msec: 4080
+ hash: "7d83ab4c336b05bcf2cde4e7d8031f6c"
+ }
+ Frame {
+ msec: 4096
+ hash: "c92e345e4ffdb30c28d9d5aa5400bd30"
+ }
+ Frame {
+ msec: 4112
+ hash: "02eec604d0c00965aae4ac61b91bdc22"
+ }
+ Frame {
+ msec: 4128
+ hash: "df447575a4734bb5bd9badc6e27d98e4"
+ }
+ Frame {
+ msec: 4144
+ hash: "bac10d8f94a39573313b3b8b2f871c49"
+ }
+ Frame {
+ msec: 4160
+ hash: "e5944c5dc6dec8f0c28b7ec3cd58723d"
+ }
+ Frame {
+ msec: 4176
+ hash: "1991cbb0fb053937f922731d5716032c"
+ }
+ Frame {
+ msec: 4192
+ hash: "50d6538bcaffc343f6626635a3e5899c"
+ }
+ Frame {
+ msec: 4208
+ hash: "f3613f57cdb9ed38d8e3fa636962aa99"
+ }
+ Frame {
+ msec: 4224
+ hash: "10a89da9887cb4bbd812c090a8a56797"
+ }
+ Frame {
+ msec: 4240
+ hash: "89ba74d46970ad2edff701475c059ec8"
+ }
+ Frame {
+ msec: 4256
+ hash: "6e8b84c70e81578a2216e9e975b35434"
+ }
+ Frame {
+ msec: 4272
+ hash: "6e8b84c70e81578a2216e9e975b35434"
+ }
+ Frame {
+ msec: 4288
+ hash: "883b8b180853f1f432ae98ddfe1b6ce3"
+ }
+ Frame {
+ msec: 4304
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 4320
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 4336
+ hash: "e616110d39009f0d636b816828cc0ccb"
+ }
+ Frame {
+ msec: 4352
+ hash: "e616110d39009f0d636b816828cc0ccb"
+ }
+ Frame {
+ msec: 4368
+ hash: "e616110d39009f0d636b816828cc0ccb"
+ }
+ Frame {
+ msec: 4384
+ hash: "e616110d39009f0d636b816828cc0ccb"
+ }
+ Frame {
+ msec: 4400
+ hash: "e616110d39009f0d636b816828cc0ccb"
+ }
+ Frame {
+ msec: 4416
+ hash: "e616110d39009f0d636b816828cc0ccb"
+ }
+ Frame {
+ msec: 4432
+ hash: "e616110d39009f0d636b816828cc0ccb"
+ }
+ Frame {
+ msec: 4448
+ hash: "e616110d39009f0d636b816828cc0ccb"
+ }
+ Frame {
+ msec: 4464
+ hash: "e616110d39009f0d636b816828cc0ccb"
+ }
+ Frame {
+ msec: 4480
+ hash: "e616110d39009f0d636b816828cc0ccb"
+ }
+ Frame {
+ msec: 4496
+ hash: "e616110d39009f0d636b816828cc0ccb"
+ }
+ Frame {
+ msec: 4512
+ hash: "e616110d39009f0d636b816828cc0ccb"
+ }
+ Frame {
+ msec: 4528
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 4544
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 4560
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 4576
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 4592
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 4608
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 4624
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 4640
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 4656
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 4672
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 4688
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+ Frame {
+ msec: 4704
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.qml b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.qml
index 5cb4f78..a94aca8 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.qml
@@ -994,7 +994,7 @@ VisualTest {
}
Frame {
msec: 3264
- hash: "10a89da9887cb4bbd812c090a8a56797"
+ hash: "244c12e82ee0b2528a0dbb02a8b8134a"
}
Mouse {
type: 5
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.0.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.0.png
new file mode 100644
index 0000000..464d913
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.1.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.1.png
new file mode 100644
index 0000000..464d913
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.2.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.2.png
new file mode 100644
index 0000000..b16b9f0
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.2.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.3.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.3.png
new file mode 100644
index 0000000..c3d2a6f
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.3.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.4.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.4.png
new file mode 100644
index 0000000..d074e73
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.4.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.5.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.5.png
new file mode 100644
index 0000000..0cac34c
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.5.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.qml b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.qml
new file mode 100644
index 0000000..c418cc8
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.qml
@@ -0,0 +1,2159 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ image: "flickable-nested.0.png"
+ }
+ Frame {
+ msec: 32
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 48
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 64
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 80
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 96
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 112
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 128
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 144
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 160
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 176
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 192
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 208
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 224
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 240
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 256
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 272
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 288
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 304
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 320
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 336
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 352
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 368
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 384
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 400
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 416
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 432
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 448
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 464
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 480
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 496
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 512
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 528
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 544
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 560
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 576
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 592
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 608
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 624
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 640
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 656
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 672
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 688
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 704
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 720
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 736
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 752
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 768
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 784
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 800
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 816
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 832
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 848
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 864
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 880
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 896
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 912
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 928
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 206; y: 205
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 944
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Frame {
+ msec: 960
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 206; y: 204
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 976
+ image: "flickable-nested.1.png"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 206; y: 203
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 206; y: 202
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 992
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 205; y: 201
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 205; y: 199
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1008
+ hash: "7523750f0fd21aff13e6ab379e87640d"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 204; y: 197
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 202; y: 196
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1024
+ hash: "bddf8ca2638c9a04f7029d6982152d11"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 198; y: 191
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 197; y: 189
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1040
+ hash: "bc15f1b562879d5058d3b1336fb9074e"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 194; y: 185
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 194; y: 184
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1056
+ hash: "3572c62d7d2b9b23a8d9d3e5037591dd"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 194; y: 182
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 194; y: 182
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1072
+ hash: "ce9658887cca581a88e7db14b92d46f2"
+ }
+ Frame {
+ msec: 1088
+ hash: "e1fe1a2e1669a200e20468b4aa98dd3d"
+ }
+ Frame {
+ msec: 1104
+ hash: "b7582829bf01223e6641ce82f62047df"
+ }
+ Frame {
+ msec: 1120
+ hash: "80bd41fe22fb84efb011acf50ec38574"
+ }
+ Frame {
+ msec: 1136
+ hash: "04c8d6c3922ce9777ee27d8df59d4729"
+ }
+ Frame {
+ msec: 1152
+ hash: "f84dba18e525f1c06548c0232a244b6d"
+ }
+ Frame {
+ msec: 1168
+ hash: "26c74b95835e8e0da5aadc7c42cac81c"
+ }
+ Frame {
+ msec: 1184
+ hash: "1b4fcb1f0bd83a683cfe0ac303be0033"
+ }
+ Frame {
+ msec: 1200
+ hash: "1b4fcb1f0bd83a683cfe0ac303be0033"
+ }
+ Frame {
+ msec: 1216
+ hash: "4df47f90656fff253883e3e2d33506dc"
+ }
+ Frame {
+ msec: 1232
+ hash: "4df47f90656fff253883e3e2d33506dc"
+ }
+ Frame {
+ msec: 1248
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1264
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1280
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1296
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1312
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1328
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1344
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1360
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1376
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1392
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1408
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1424
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1440
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1456
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1472
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1488
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1504
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1520
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1536
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1552
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1568
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1584
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Frame {
+ msec: 1600
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 226; y: 218
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1616
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 225; y: 218
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1632
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 223; y: 217
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 222; y: 217
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1648
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 220; y: 216
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 218; y: 214
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1664
+ hash: "7d0d94c4a7a9330f5bd17782ca484848"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 214; y: 212
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 212; y: 211
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1680
+ hash: "54b41609ba43f710b08ba63f0b96df99"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 208; y: 208
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 207; y: 207
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1696
+ hash: "8910b66b9eb1b2be80e36ed2824df1a0"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 205; y: 205
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 205; y: 205
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1712
+ hash: "38df31933f34f961a9b7020ad0d469c2"
+ }
+ Frame {
+ msec: 1728
+ hash: "7702a7f710991225d9f411e8f410b515"
+ }
+ Frame {
+ msec: 1744
+ hash: "c90d402e68208ccfd2c7345a2bf650cd"
+ }
+ Frame {
+ msec: 1760
+ hash: "2630ed37aaf37907d1ee48efb0239615"
+ }
+ Frame {
+ msec: 1776
+ hash: "527725818699ce3425b5cb95a25610d5"
+ }
+ Frame {
+ msec: 1792
+ hash: "7bd6e37853946a835973c3da213beddc"
+ }
+ Frame {
+ msec: 1808
+ hash: "e3c5e113d992e5e50b6780185891edd7"
+ }
+ Frame {
+ msec: 1824
+ hash: "e3c5e113d992e5e50b6780185891edd7"
+ }
+ Frame {
+ msec: 1840
+ hash: "20ced2b9960931c4c0cbe8bcc1f9e52a"
+ }
+ Frame {
+ msec: 1856
+ hash: "09710c8964c8b010a90c67f126acdefa"
+ }
+ Frame {
+ msec: 1872
+ hash: "09710c8964c8b010a90c67f126acdefa"
+ }
+ Frame {
+ msec: 1888
+ hash: "09710c8964c8b010a90c67f126acdefa"
+ }
+ Frame {
+ msec: 1904
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 1920
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 1936
+ image: "flickable-nested.2.png"
+ }
+ Frame {
+ msec: 1952
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 1968
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 1984
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2000
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2016
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2032
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2048
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2064
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2080
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2096
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2112
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2128
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2144
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2160
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2176
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2192
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2208
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2224
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2240
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2256
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2272
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2288
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Frame {
+ msec: 2304
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 274; y: 218
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2320
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 273; y: 218
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 273; y: 217
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2336
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 272; y: 215
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 272; y: 213
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2352
+ hash: "e80b03bd168ec62aba64cdf75dcd1d5f"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 271; y: 210
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 270; y: 208
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2368
+ hash: "79a132ab719ccdf48d367cca443cd835"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 269; y: 204
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 269; y: 202
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2384
+ hash: "1f19e7d2c7494f5b603dee16e211d65d"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 268; y: 196
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 268; y: 193
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2400
+ hash: "64fd22407c77fac28d13035ce78c67b2"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 268; y: 186
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 266; y: 177
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2416
+ hash: "f05a0f956b4964d4ebff056b63252297"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 265; y: 173
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 264; y: 167
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2432
+ hash: "3de1e9a2b33e37b0fe3b799b68ec22d6"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 263; y: 164
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 263; y: 164
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2448
+ hash: "71f115c60d4f20422e4ac3f319644c48"
+ }
+ Frame {
+ msec: 2464
+ hash: "c3995ac89f0a4b3fb07401479538d338"
+ }
+ Frame {
+ msec: 2480
+ hash: "950e83408adf55f4e7fc1c0c127caa89"
+ }
+ Frame {
+ msec: 2496
+ hash: "5b335621a76a527d058708384c2e5635"
+ }
+ Frame {
+ msec: 2512
+ hash: "a201ae31d5bb778bd44a49dd21951c1b"
+ }
+ Frame {
+ msec: 2528
+ hash: "550e6708a8999d56d1f57c121228692f"
+ }
+ Frame {
+ msec: 2544
+ hash: "d8eb4dd2b3cf50273cb7dfbb5bd658b9"
+ }
+ Frame {
+ msec: 2560
+ hash: "aa1fd0a990e42175acc84de96b384e9d"
+ }
+ Frame {
+ msec: 2576
+ hash: "0236fb15db30da5ec794444affee1169"
+ }
+ Frame {
+ msec: 2592
+ hash: "a7445a70874a9767462e79e1dff88dbc"
+ }
+ Frame {
+ msec: 2608
+ hash: "339ea6bd5b486ff85272e19e07669f0b"
+ }
+ Frame {
+ msec: 2624
+ hash: "2b24d9d17c77cd0ac52989328dcf499b"
+ }
+ Frame {
+ msec: 2640
+ hash: "2b24d9d17c77cd0ac52989328dcf499b"
+ }
+ Frame {
+ msec: 2656
+ hash: "e2fcfe4f3e14e46404eb6955502180a1"
+ }
+ Frame {
+ msec: 2672
+ hash: "5d0c9601b871690047f4df91723ccfb1"
+ }
+ Frame {
+ msec: 2688
+ hash: "5d0c9601b871690047f4df91723ccfb1"
+ }
+ Frame {
+ msec: 2704
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2720
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2736
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2752
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2768
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2784
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2800
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2816
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2832
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2848
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2864
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2880
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2896
+ image: "flickable-nested.3.png"
+ }
+ Frame {
+ msec: 2912
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2928
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2944
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Frame {
+ msec: 2960
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 268; y: 102
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2976
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 268; y: 103
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 268; y: 104
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 2992
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 268; y: 105
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 269; y: 108
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3008
+ hash: "5b5d7e880e9f4942f52a3cde738dc7fb"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 270; y: 111
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 270; y: 114
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3024
+ hash: "2b24d9d17c77cd0ac52989328dcf499b"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 271; y: 119
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 272; y: 122
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3040
+ hash: "550e6708a8999d56d1f57c121228692f"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 273; y: 130
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 274; y: 138
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3056
+ hash: "57f3c0a49cef2137e3cfa435396c099e"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 274; y: 142
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 274; y: 149
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3072
+ hash: "0fffc659a270cc614d16ddf3fa2ab51d"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 274; y: 153
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 274; y: 161
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3088
+ hash: "a8d937c8379950299a6e3611ff313415"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 273; y: 165
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 272; y: 172
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3104
+ hash: "46cfebbf821a08aa30055bfa8fffd137"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 271; y: 175
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 270; y: 180
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 270; y: 180
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3120
+ hash: "20a32ee8ae2cf88a2cfdb2dd8552255a"
+ }
+ Frame {
+ msec: 3136
+ hash: "20a32ee8ae2cf88a2cfdb2dd8552255a"
+ }
+ Frame {
+ msec: 3152
+ hash: "20a32ee8ae2cf88a2cfdb2dd8552255a"
+ }
+ Frame {
+ msec: 3168
+ hash: "20a32ee8ae2cf88a2cfdb2dd8552255a"
+ }
+ Frame {
+ msec: 3184
+ hash: "20a32ee8ae2cf88a2cfdb2dd8552255a"
+ }
+ Frame {
+ msec: 3200
+ hash: "20a32ee8ae2cf88a2cfdb2dd8552255a"
+ }
+ Frame {
+ msec: 3216
+ hash: "20a32ee8ae2cf88a2cfdb2dd8552255a"
+ }
+ Frame {
+ msec: 3232
+ hash: "20a32ee8ae2cf88a2cfdb2dd8552255a"
+ }
+ Frame {
+ msec: 3248
+ hash: "20a32ee8ae2cf88a2cfdb2dd8552255a"
+ }
+ Frame {
+ msec: 3264
+ hash: "20a32ee8ae2cf88a2cfdb2dd8552255a"
+ }
+ Frame {
+ msec: 3280
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3296
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3312
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3328
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3344
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3360
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3376
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3392
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3408
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3424
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3440
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3456
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3472
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3488
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3504
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3520
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3536
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3552
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3568
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 3584
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 352; y: 206
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3600
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 352; y: 205
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 352; y: 204
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3616
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 352; y: 201
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 352; y: 196
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3632
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 352; y: 193
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 352; y: 185
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3648
+ hash: "eb718f97648438dae1440e2089434b0a"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 352; y: 176
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 352; y: 172
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3664
+ hash: "e4a2b82752939f351ac46032f2d3333e"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 353; y: 163
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 354; y: 158
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3680
+ hash: "ab1099a146433a5ec77b336673d0527c"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 356; y: 148
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 356; y: 142
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3696
+ hash: "7e4ca5ba45d5de10d72ef5ab1171ead5"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 357; y: 130
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 357; y: 130
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3712
+ hash: "417bb78fc4f255194a71193e388b752f"
+ }
+ Frame {
+ msec: 3728
+ hash: "be63b1e57006d881a345db3ca66e7097"
+ }
+ Frame {
+ msec: 3744
+ hash: "e1b96137c2cc0ef18e224a32f665de9d"
+ }
+ Frame {
+ msec: 3760
+ hash: "6157ba3962fc7829e8693e2456fd6e8e"
+ }
+ Frame {
+ msec: 3776
+ hash: "951ae231b7b18517f8d6504ce7f01b3d"
+ }
+ Frame {
+ msec: 3792
+ hash: "57f60f9da1a204cc7eb930575de45ae4"
+ }
+ Frame {
+ msec: 3808
+ hash: "008323603b48a55b589af7cbb2f1c8b0"
+ }
+ Frame {
+ msec: 3824
+ hash: "b8447e994280cba5ccddc36e7ad3c927"
+ }
+ Frame {
+ msec: 3840
+ hash: "98dfc2d6573e5cb7a56a893b8fecf422"
+ }
+ Frame {
+ msec: 3856
+ image: "flickable-nested.4.png"
+ }
+ Frame {
+ msec: 3872
+ hash: "09dabc3ef85dc857719e7d20111e6023"
+ }
+ Frame {
+ msec: 3888
+ hash: "5864c4197fe3269c3f1ad05caf25832e"
+ }
+ Frame {
+ msec: 3904
+ hash: "370a471a614d22d281d9987a5b6a42bf"
+ }
+ Frame {
+ msec: 3920
+ hash: "36c74e2e325807c7c06e941581613f48"
+ }
+ Frame {
+ msec: 3936
+ hash: "e1e2b69992294dc611e6eef7e259d4cd"
+ }
+ Frame {
+ msec: 3952
+ hash: "e1e2b69992294dc611e6eef7e259d4cd"
+ }
+ Frame {
+ msec: 3968
+ hash: "e1e2b69992294dc611e6eef7e259d4cd"
+ }
+ Frame {
+ msec: 3984
+ hash: "36c74e2e325807c7c06e941581613f48"
+ }
+ Frame {
+ msec: 4000
+ hash: "36c74e2e325807c7c06e941581613f48"
+ }
+ Frame {
+ msec: 4016
+ hash: "bd8f39423d96fceaf577c7f792b61211"
+ }
+ Frame {
+ msec: 4032
+ hash: "370a471a614d22d281d9987a5b6a42bf"
+ }
+ Frame {
+ msec: 4048
+ hash: "c8fe4424d96460a2503632e3a54d4f6a"
+ }
+ Frame {
+ msec: 4064
+ hash: "09dabc3ef85dc857719e7d20111e6023"
+ }
+ Frame {
+ msec: 4080
+ hash: "22bff1406eba529d58320b8b19be76d9"
+ }
+ Frame {
+ msec: 4096
+ hash: "478bc04322b93b75b5185d047c2898b7"
+ }
+ Frame {
+ msec: 4112
+ hash: "98dfc2d6573e5cb7a56a893b8fecf422"
+ }
+ Frame {
+ msec: 4128
+ hash: "03b96d3e148e86f1150b09696012d07c"
+ }
+ Frame {
+ msec: 4144
+ hash: "735b24d2811beef969477c8b0f400d32"
+ }
+ Frame {
+ msec: 4160
+ hash: "b8399d2a7a6de0b5f81e68e8f8825622"
+ }
+ Frame {
+ msec: 4176
+ hash: "766a97e0881b623a0de93babfa841125"
+ }
+ Frame {
+ msec: 4192
+ hash: "008323603b48a55b589af7cbb2f1c8b0"
+ }
+ Frame {
+ msec: 4208
+ hash: "3da913235e4916b4691e3d089dc7b52f"
+ }
+ Frame {
+ msec: 4224
+ hash: "3da913235e4916b4691e3d089dc7b52f"
+ }
+ Frame {
+ msec: 4240
+ hash: "8c7f6ff7b3db65d7dd9ac4d18545f0d1"
+ }
+ Frame {
+ msec: 4256
+ hash: "8c7f6ff7b3db65d7dd9ac4d18545f0d1"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 346; y: 95
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4272
+ hash: "8c7f6ff7b3db65d7dd9ac4d18545f0d1"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 346; y: 98
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 346; y: 103
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4288
+ hash: "951ae231b7b18517f8d6504ce7f01b3d"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 348; y: 110
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 348; y: 115
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4304
+ hash: "364283bbbcedabc87689ec174ae29818"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 351; y: 124
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 353; y: 129
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4320
+ hash: "6a8a59ba8cf0539704fc035d7d5def41"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 358; y: 141
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 361; y: 145
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4336
+ hash: "d4626b39fbf24cc6a4e23ef33a570add"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 370; y: 163
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4352
+ hash: "255604ac684a18e272dccfa9a81fa1bb"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 376; y: 172
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4368
+ hash: "2696641e48ea2a0ccfc65057b283814f"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 377; y: 175
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 377; y: 175
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 4384
+ hash: "4ae011d8d81c57f9e2495d32a90fb5c0"
+ }
+ Frame {
+ msec: 4400
+ hash: "c07f57059244b1164e698430b20aac8e"
+ }
+ Frame {
+ msec: 4416
+ hash: "d39c21bc6fc079c76ea78d1a3fb0c974"
+ }
+ Frame {
+ msec: 4432
+ hash: "f955985ee02fcb810ab8c5f4790f5c12"
+ }
+ Frame {
+ msec: 4448
+ hash: "d06b83769bf0f0331e53c270f5dc294c"
+ }
+ Frame {
+ msec: 4464
+ hash: "a49ef3866e3f71c26c57fcd616a6dc4c"
+ }
+ Frame {
+ msec: 4480
+ hash: "086f4bb966b2076f51b1f615368afda5"
+ }
+ Frame {
+ msec: 4496
+ hash: "898de0b200cb83c9724869dd2b74ed52"
+ }
+ Frame {
+ msec: 4512
+ hash: "47833f93c5c55f57de5733950ba53714"
+ }
+ Frame {
+ msec: 4528
+ hash: "0ced71db7e8c5b8ce8e195a7b821507d"
+ }
+ Frame {
+ msec: 4544
+ hash: "84888b8748e297ed4e0525019865ea2b"
+ }
+ Frame {
+ msec: 4560
+ hash: "0f62d1aaa0fec0dd90351258a3745869"
+ }
+ Frame {
+ msec: 4576
+ hash: "e34a874942161ea830907f94040fc0a5"
+ }
+ Frame {
+ msec: 4592
+ hash: "9031e4ad8ee57a8b826d6a6394f0feb9"
+ }
+ Frame {
+ msec: 4608
+ hash: "9031e4ad8ee57a8b826d6a6394f0feb9"
+ }
+ Frame {
+ msec: 4624
+ hash: "cc8a2477368001015b68c99db95ebaa1"
+ }
+ Frame {
+ msec: 4640
+ hash: "01c0f4d5b155eb16ac364b24d5085bac"
+ }
+ Frame {
+ msec: 4656
+ hash: "4c4f318b03e0da461bcecb61f43ef3cd"
+ }
+ Frame {
+ msec: 4672
+ hash: "dffd22d719f18c943cd0c30afe272434"
+ }
+ Frame {
+ msec: 4688
+ hash: "4f7ab0450512ae1319dad22a6e0400b7"
+ }
+ Frame {
+ msec: 4704
+ hash: "ea29e23bdb49a30694640dfb078c796a"
+ }
+ Frame {
+ msec: 4720
+ hash: "80739ed287906d0b55297be4b74a54cb"
+ }
+ Frame {
+ msec: 4736
+ hash: "8d9117cf841c4b158f30b79ac8f2afb0"
+ }
+ Frame {
+ msec: 4752
+ hash: "1850e9117160b2bd1865274092f9ec84"
+ }
+ Frame {
+ msec: 4768
+ hash: "07945c8954860895f95f8e352c49e0a5"
+ }
+ Frame {
+ msec: 4784
+ hash: "d0fa6087d2859446ff8f317c9d7dafe1"
+ }
+ Frame {
+ msec: 4800
+ hash: "8ebba2084793d90a640ec2fb12dc0547"
+ }
+ Frame {
+ msec: 4816
+ image: "flickable-nested.5.png"
+ }
+ Frame {
+ msec: 4832
+ hash: "77d479675c36ecda0926061449f5a60b"
+ }
+ Frame {
+ msec: 4848
+ hash: "77d479675c36ecda0926061449f5a60b"
+ }
+ Frame {
+ msec: 4864
+ hash: "b968c1528ce7ecf80008fbd56f0ca9a9"
+ }
+ Frame {
+ msec: 4880
+ hash: "b968c1528ce7ecf80008fbd56f0ca9a9"
+ }
+ Frame {
+ msec: 4896
+ hash: "b968c1528ce7ecf80008fbd56f0ca9a9"
+ }
+ Frame {
+ msec: 4912
+ hash: "b968c1528ce7ecf80008fbd56f0ca9a9"
+ }
+ Frame {
+ msec: 4928
+ hash: "b968c1528ce7ecf80008fbd56f0ca9a9"
+ }
+ Frame {
+ msec: 4944
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 4960
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 4976
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 4992
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5008
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5024
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5040
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5056
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5072
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5088
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5104
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5120
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5136
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5152
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5168
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5184
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5200
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5216
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5232
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5248
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5264
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5280
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5296
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5312
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5328
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5344
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5360
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5376
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5392
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5408
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5424
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5440
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5456
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5472
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5488
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5504
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5520
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5536
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5552
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5568
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5584
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5600
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5616
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5632
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5648
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5664
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5680
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+ Frame {
+ msec: 5696
+ hash: "38f29e86bd9bfe4df04c6411374f76ae"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.qml b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.qml
index 8c746bf..920a48f 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.qml
@@ -1922,7 +1922,7 @@ VisualTest {
}
Frame {
msec: 4480
- hash: "155a834ddaa7128b6f5a2a406b340315"
+ hash: "16b99c9cf5297a5251869a3935084cf7"
}
Mouse {
type: 5
@@ -2106,7 +2106,7 @@ VisualTest {
}
Frame {
msec: 4768
- hash: "155a834ddaa7128b6f5a2a406b340315"
+ hash: "d315f82e175361fed83193ce550cb6e9"
}
Mouse {
type: 5
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/flickable-nested.qml b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/flickable-nested.qml
new file mode 100644
index 0000000..9335b9e
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/flickable-nested.qml
@@ -0,0 +1,50 @@
+import QtQuick 1.0
+
+Item {
+ width: 640
+ height: 400
+
+ Flickable {
+ objectName: "flick 1"
+ anchors.fill: parent
+ contentWidth: width + 100
+ contentHeight: height + 100
+
+ Rectangle {
+ width: 300
+ height: 300
+ color: "blue"
+
+ Flickable {
+ objectName: "flick 2"
+ width: 300
+ height: 300
+ clip: true
+ contentWidth: 400
+ contentHeight: 400
+
+ Rectangle {
+ width: 100
+ height: 100
+ anchors.centerIn: parent
+ color: "yellow"
+
+ Flickable {
+ objectName: "flick 3"
+ anchors.fill: parent
+ clip: true
+ contentWidth: 150
+ contentHeight: 150
+ Rectangle {
+ x: 80
+ y: 80
+ width: 50
+ height: 50
+ color: "green"
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.0.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.0.png
index 699f83e..347e773 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.1.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.1.png
index a742a6a..370ca80 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.1.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.2.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.2.png
index 71abae2..97e3906 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.2.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.2.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.3.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.3.png
index a6e6b3e..5fa3c67 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.3.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.3.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.4.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.4.png
index 9f125c4..ce11c09 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.4.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.4.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.5.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.5.png
index 41d0cd5..d155742 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.5.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.5.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.qml b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.qml
index b75d140..304d5c7 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.qml
@@ -222,7 +222,7 @@ VisualTest {
}
Frame {
msec: 752
- hash: "e21cac055208e47e267ac906c7c2ca9c"
+ hash: "d2dda5bec262721d653e88ec3eaeca57"
}
Mouse {
type: 5
@@ -234,7 +234,7 @@ VisualTest {
}
Frame {
msec: 768
- hash: "131e094a79edbeea9a1b981592e55abf"
+ hash: "d61d21ab4d83b8578494720d9bfe6fa8"
}
Mouse {
type: 5
@@ -254,7 +254,7 @@ VisualTest {
}
Frame {
msec: 784
- hash: "73faabf52bd2af8d8b9d28ce21e5e77b"
+ hash: "0a178235529d721529e8dc3b439a64c9"
}
Mouse {
type: 5
@@ -266,7 +266,7 @@ VisualTest {
}
Frame {
msec: 800
- hash: "359554a95362db1734f606cf677001fc"
+ hash: "c800609ffea814ba7cc2441790157245"
}
Mouse {
type: 5
@@ -286,43 +286,43 @@ VisualTest {
}
Frame {
msec: 816
- hash: "8ef4ecc5c5ba578f0279dc57a6c17ccd"
+ hash: "afcb452d41c6e895309bb921a1ad1d31"
}
Frame {
msec: 832
- hash: "69c3d9d2700dd395b656b0b09fa63511"
+ hash: "02d8f91c33f62aaf366bcfd03d232269"
}
Frame {
msec: 848
- hash: "2bbcc36d72c3e9a4b672a46f2aae5076"
+ hash: "1ba9bc8c2b941fd0ec82f211eb559682"
}
Frame {
msec: 864
- hash: "125a5f0c8efdf97676edbe379660dcce"
+ hash: "ee8680df3c58a48f3fff4a8fc221e38c"
}
Frame {
msec: 880
- hash: "4347a02227207fbf870b6aed76131619"
+ hash: "36c04a2bd58124877a332bb6a262a7e5"
}
Frame {
msec: 896
- hash: "e08b494c818669bfc48273598574d22e"
+ hash: "e6ea836d68c54a8308e10f33d4eb8b98"
}
Frame {
msec: 912
- hash: "186cb5465f45c0df8082ec8cad6ee8b1"
+ hash: "f2400819feb116ae3b327284bbb292ff"
}
Frame {
msec: 928
- hash: "91d04d4469492c3bb2a1ed415dcd904c"
+ hash: "5d9a3458cb59ede36e7b51bac869785a"
}
Frame {
msec: 944
- hash: "8cc8ef251d68af926a8f300b8666ecfd"
+ hash: "b859b690c633a9fec87941e7c89f5d19"
}
Frame {
msec: 960
- hash: "42f64722245f8519386e75ce7e3c0cd9"
+ hash: "ef0b66e789a8e88389e16bfa36b9f6e2"
}
Frame {
msec: 976
@@ -330,195 +330,195 @@ VisualTest {
}
Frame {
msec: 992
- hash: "058311da9dcf73a4b4928038334b04b5"
+ hash: "493e3c7b0de4a7b4b46678fe4ce9a763"
}
Frame {
msec: 1008
- hash: "ea662934ee0c3c8d4dbde3ad49448922"
+ hash: "b7056d635c69b8e5bf98872f4c07ed43"
}
Frame {
msec: 1024
- hash: "01991a871819e7bdbf817580f720ead6"
+ hash: "68aa8bd6709e1b49cfefc4594c236c46"
}
Frame {
msec: 1040
- hash: "69a7fe47ae589bcc2607cc42fcea7451"
+ hash: "4b28ebf737b8c4228771122d844b8166"
}
Frame {
msec: 1056
- hash: "8240d087b767311e00b7dd4b8726246c"
+ hash: "b04155316770a1265e5dc431e1b9a9a1"
}
Frame {
msec: 1072
- hash: "cc70c8e79d68f09e6db0dd43b99906b7"
+ hash: "d540453541aba394b0958cdc48f91d48"
}
Frame {
msec: 1088
- hash: "2bfabef74bc6e1dbf72111838a0e7557"
+ hash: "b3e7cbc83c65ec61c768757798b17c58"
}
Frame {
msec: 1104
- hash: "66616f01553364c5bd589b781e22163a"
+ hash: "b12b31d4959a697fcc8e54f1c846eef9"
}
Frame {
msec: 1120
- hash: "58b9de84ebdaabee3917608f2af3bbdb"
+ hash: "77c3bbb94471cfbfd23cc3914d796dfc"
}
Frame {
msec: 1136
- hash: "964d96b9b783efb1053501f8a6931248"
+ hash: "41975592e60f08a0296a8babe1da2df3"
}
Frame {
msec: 1152
- hash: "055b77b921a2bac71b6780ab3179f19f"
+ hash: "0a5eea8a11b15ee8583f187f336f56c7"
}
Frame {
msec: 1168
- hash: "074904f31b4f7cf0679f0bf7bba30af2"
+ hash: "bf9c02945fdee4b06353f8f7f4fca2a3"
}
Frame {
msec: 1184
- hash: "f020a490b6800d5b4402ecb9a8bcd436"
+ hash: "157c92d133a39a2b1d20a551303d2f6f"
}
Frame {
msec: 1200
- hash: "1615bdedf92f91f089e494d893840c4b"
+ hash: "213716cad9fa2179a17a512e8c03c8f5"
}
Frame {
msec: 1216
- hash: "b6892f6a5db6d211f0d1bb2bbe5045bf"
+ hash: "0ec517c50e9e36fef4fb14318e298723"
}
Frame {
msec: 1232
- hash: "5f0d903ba682923ac69454026a359ed9"
+ hash: "bab010fe0f5d3b57fd556a9b709c285e"
}
Frame {
msec: 1248
- hash: "da5bae496a9ad28585151f4c75ee0c9f"
+ hash: "b6bdf2f21c4137d4b5f25e0fe728bba5"
}
Frame {
msec: 1264
- hash: "68f553248f7ca116671782d1c357b552"
+ hash: "c091e46064c8096568224ed7e4c8dc4f"
}
Frame {
msec: 1280
- hash: "5503df04dd7f4c88314f9d309a5b36b4"
+ hash: "c0a6ede96566533ab35384afa535530f"
}
Frame {
msec: 1296
- hash: "cc48c1f58b553adcb27d60f176e2b910"
+ hash: "f61f5c7617700b9aad71206cfc9e402e"
}
Frame {
msec: 1312
- hash: "661f546199d8753a7b6f6ccea5928c12"
+ hash: "c70c106d128051c06da3acdf817f5ffb"
}
Frame {
msec: 1328
- hash: "0fd70052c100f77bddbad177d9e5573d"
+ hash: "624d7c7fb2f39225d51d1a548aa186ed"
}
Frame {
msec: 1344
- hash: "488e0652c0ed82a014de63a64145c34c"
+ hash: "f052610f17a7484bf6cb2bd07aa91af6"
}
Frame {
msec: 1360
- hash: "8b6bf2519080a6e4a61fe216f72dfa09"
+ hash: "44cd80041a1965c8c60fdffd9ae19395"
}
Frame {
msec: 1376
- hash: "4dab1827f6ce9561297fce8e067df1bd"
+ hash: "7597f86b537fbd70260908c973f9db21"
}
Frame {
msec: 1392
- hash: "b3f4c5cd728eaf2b791612a7fea64e7b"
+ hash: "30cd60db9aa2df2adc7d01091c905cb4"
}
Frame {
msec: 1408
- hash: "3d01abd0b8a5a62d58a4c09546f212d8"
+ hash: "8da4613759e9bcb926a0c84556213eb5"
}
Frame {
msec: 1424
- hash: "e76796498cf595c60d4b60cc0e320601"
+ hash: "1085fcc81f0aed8508817839ca748359"
}
Frame {
msec: 1440
- hash: "1b31e96f2823e78a0c4029e7bc45b9f2"
+ hash: "b87f002bf6fb0684f0b3cf565507e066"
}
Frame {
msec: 1456
- hash: "f75c182dc24f4fabe1034ee494dba2ad"
+ hash: "b60916a57aec6ebbd8b69be7c8d66e19"
}
Frame {
msec: 1472
- hash: "646c12edadf350405709860381cfced6"
+ hash: "a28e1538d18ccb7485d0306b9f7b18a6"
}
Frame {
msec: 1488
- hash: "b6719406da9f2484fe55e3c69184f86c"
+ hash: "832c857f2e05f2f82308cbf91f7bf401"
}
Frame {
msec: 1504
- hash: "5456857d6d48d064df1cb3f35d8447b5"
+ hash: "ca3e50cd337a07ef07f063be28fa6dc2"
}
Frame {
msec: 1520
- hash: "8d1809b568345e1532fb6d9428fc9729"
+ hash: "3ecf7faa733653ef20e4a26eb47d63d1"
}
Frame {
msec: 1536
- hash: "5cffa76fe09a771a9f62a9f0392f0431"
+ hash: "f17a6be2e183f4c87e31004458e5052c"
}
Frame {
msec: 1552
- hash: "8de59915e874ce829c691a19ac930f28"
+ hash: "bfa62672ee7fcd9c3a75b63198a4c2bf"
}
Frame {
msec: 1568
- hash: "9027bbf8121f70d26530f70423ec05b7"
+ hash: "cdaafe7f622c18c2409ac539649de1cd"
}
Frame {
msec: 1584
- hash: "d3d1d8b9f7b4eb74a8b7ae5cf19a8e20"
+ hash: "c957f5c58e0a9b315b51ac1012709493"
}
Frame {
msec: 1600
- hash: "81ffcc0147e3124a3015deb7c0dbfd90"
+ hash: "925c55a8564f2318f9de4bd406cb5b13"
}
Frame {
msec: 1616
- hash: "ca0c96e908f05c4ee1af1f80d7b432aa"
+ hash: "466208a8f6ecf45393be01a6dd7f2b0f"
}
Frame {
msec: 1632
- hash: "2bdb6fbf942623856a6963c335794dd2"
+ hash: "35cff8c0f4b503ba4948966079484feb"
}
Frame {
msec: 1648
- hash: "18ac264d9ea9b592b0738f1cf732f678"
+ hash: "47472faf5e9bf4b4e514abe55f1e0b72"
}
Frame {
msec: 1664
- hash: "1ee9adbbae7b97dc050c82b8ed7b0aad"
+ hash: "b699165e354bcadfd0d914d9ecb3d2aa"
}
Frame {
msec: 1680
- hash: "b502390c452883ade550d2761bb09d3d"
+ hash: "e255c047ce78f5677ccec8bd9737201a"
}
Frame {
msec: 1696
- hash: "31a6f573fbb3f545ee051e2290938004"
+ hash: "bd4f08095a9c546a42c85e6df6eaf655"
}
Frame {
msec: 1712
- hash: "3be9788228d9e540313e75671319c5b7"
+ hash: "ca65869f48b169260c3756d846a12f36"
}
Frame {
msec: 1728
- hash: "23cbd718154f939d8270674e8f7607f0"
+ hash: "1921889beb8e61c8b959d4affa814465"
}
Frame {
msec: 1744
- hash: "5f7f49b894b80ddd7cdc544a49ec24a2"
+ hash: "a9dda9ebaa97133c671917473721272c"
}
Mouse {
type: 2
@@ -538,11 +538,11 @@ VisualTest {
}
Frame {
msec: 1760
- hash: "2a1ddee3d3a0c2a4fffab3988e35e274"
+ hash: "cab96d2118b31d43e85dc902df2ed8ed"
}
Frame {
msec: 1776
- hash: "2a1ddee3d3a0c2a4fffab3988e35e274"
+ hash: "cab96d2118b31d43e85dc902df2ed8ed"
}
Mouse {
type: 5
@@ -562,7 +562,7 @@ VisualTest {
}
Frame {
msec: 1792
- hash: "5594b9139480ba1c814509a049f9b6c5"
+ hash: "d21c8af68b314800b86922493db6553e"
}
Mouse {
type: 5
@@ -574,7 +574,7 @@ VisualTest {
}
Frame {
msec: 1808
- hash: "d8729deb404f5b821264743943adb288"
+ hash: "a80c0f6f679ba5f1354f8e16677c1125"
}
Mouse {
type: 5
@@ -586,7 +586,7 @@ VisualTest {
}
Frame {
msec: 1824
- hash: "6de642baf7698ec65d48ccf0a1e8e7db"
+ hash: "d8729deb404f5b821264743943adb288"
}
Mouse {
type: 5
@@ -606,7 +606,7 @@ VisualTest {
}
Frame {
msec: 1840
- hash: "f6732999861d1f638484a5aaa9cf0550"
+ hash: "87d41239eb7e170fa7a1ed523a9af942"
}
Mouse {
type: 5
@@ -618,7 +618,7 @@ VisualTest {
}
Frame {
msec: 1856
- hash: "7cd7c1679838f35556bd4ee4565b7a86"
+ hash: "1c185649e08a54a6949409ed7ee5dc60"
}
Mouse {
type: 5
@@ -638,7 +638,7 @@ VisualTest {
}
Frame {
msec: 1872
- hash: "4276a4d9350503603b0c9c98552697b3"
+ hash: "d82969ef0f4baf3c51e112e049cb1334"
}
Mouse {
type: 5
@@ -650,7 +650,7 @@ VisualTest {
}
Frame {
msec: 1888
- hash: "954a47627aee0a1128a78191bf32d984"
+ hash: "e746a3eb8527036b09afb9cdd3d15648"
}
Mouse {
type: 5
@@ -662,7 +662,7 @@ VisualTest {
}
Frame {
msec: 1904
- hash: "360a47795f7f9389f82f2f55fa1fe83f"
+ hash: "e1d6c01f6cd66a5bcdb08ca810a07282"
}
Mouse {
type: 5
@@ -674,7 +674,7 @@ VisualTest {
}
Frame {
msec: 1920
- hash: "19d4284791d0031342ba995bd17a7833"
+ hash: "fd0e9cf835131ee6cc5ecf67c6724d73"
}
Mouse {
type: 5
@@ -706,7 +706,7 @@ VisualTest {
}
Frame {
msec: 1952
- hash: "e9cd8fb810ecf39a90af039ead97aaf1"
+ hash: "69c17a9c18795b1d8ae63d36d76af626"
}
Mouse {
type: 5
@@ -726,7 +726,7 @@ VisualTest {
}
Frame {
msec: 1968
- hash: "42df1a0fbbe7cce5f2359d9e02696299"
+ hash: "c7ca4762498af158a2f2da6f5ae560ce"
}
Mouse {
type: 5
@@ -738,7 +738,7 @@ VisualTest {
}
Frame {
msec: 1984
- hash: "cc71434d6bd162386b80cb3b7e387116"
+ hash: "f500232133ec07a3b833b06425379484"
}
Mouse {
type: 5
@@ -758,7 +758,7 @@ VisualTest {
}
Frame {
msec: 2000
- hash: "a130b471b3903f3f1d77f2306da2b92e"
+ hash: "0a0cd0433e206dfc923ec0d3617e04a1"
}
Mouse {
type: 5
@@ -770,7 +770,7 @@ VisualTest {
}
Frame {
msec: 2016
- hash: "5bdb7472e325651e891c115953afdb39"
+ hash: "1754875ee6a5712ffb8ce1bbae6d4ed1"
}
Mouse {
type: 5
@@ -782,7 +782,7 @@ VisualTest {
}
Frame {
msec: 2032
- hash: "ab3a64b41c67a0b8a6c0830c0e0cb797"
+ hash: "1e743264f0a312bc0d0a023fbc6db832"
}
Mouse {
type: 5
@@ -794,7 +794,7 @@ VisualTest {
}
Frame {
msec: 2048
- hash: "8eb1f2c8c02c2acf4262e05000045649"
+ hash: "ab3a64b41c67a0b8a6c0830c0e0cb797"
}
Mouse {
type: 5
@@ -806,7 +806,7 @@ VisualTest {
}
Frame {
msec: 2064
- hash: "514220d357c4a26e4aaf9ed20d3f4f33"
+ hash: "d05f721f1d7d23d6e0cc67993bf1fa8f"
}
Mouse {
type: 5
@@ -818,7 +818,7 @@ VisualTest {
}
Frame {
msec: 2080
- hash: "e44526ef273048028d5989fc662eb7e6"
+ hash: "419c09739f855c53be3427a71aa3faf9"
}
Mouse {
type: 5
@@ -838,7 +838,7 @@ VisualTest {
}
Frame {
msec: 2096
- hash: "29ac091428a89cfcb4c52c08e0e10327"
+ hash: "f0ae80ed5965d7531d6a653c80eed444"
}
Mouse {
type: 5
@@ -858,7 +858,7 @@ VisualTest {
}
Frame {
msec: 2112
- hash: "82beb845af88fc9432dc104ff805a146"
+ hash: "1419fe55cc28ce9690846d4c03275fe7"
}
Mouse {
type: 5
@@ -870,7 +870,7 @@ VisualTest {
}
Frame {
msec: 2128
- hash: "371392f267b2c1f4e29963506180e246"
+ hash: "2e22df53697a599b0e44fb2a3986dcd0"
}
Mouse {
type: 5
@@ -882,11 +882,11 @@ VisualTest {
}
Frame {
msec: 2144
- hash: "1da06d036cc0a2d2de34eee37b6981c0"
+ hash: "96f763c555b523d9b7ed7a0a159db368"
}
Frame {
msec: 2160
- hash: "1da06d036cc0a2d2de34eee37b6981c0"
+ hash: "96f763c555b523d9b7ed7a0a159db368"
}
Mouse {
type: 5
@@ -898,31 +898,31 @@ VisualTest {
}
Frame {
msec: 2176
- hash: "4980de22342d1085e205401090777d24"
+ hash: "20f9cf7787c8cfd4843289f5ab2012e7"
}
Frame {
msec: 2192
- hash: "4980de22342d1085e205401090777d24"
+ hash: "20f9cf7787c8cfd4843289f5ab2012e7"
}
Frame {
msec: 2208
- hash: "4980de22342d1085e205401090777d24"
+ hash: "20f9cf7787c8cfd4843289f5ab2012e7"
}
Frame {
msec: 2224
- hash: "4980de22342d1085e205401090777d24"
+ hash: "20f9cf7787c8cfd4843289f5ab2012e7"
}
Frame {
msec: 2240
- hash: "4980de22342d1085e205401090777d24"
+ hash: "20f9cf7787c8cfd4843289f5ab2012e7"
}
Frame {
msec: 2256
- hash: "4980de22342d1085e205401090777d24"
+ hash: "20f9cf7787c8cfd4843289f5ab2012e7"
}
Frame {
msec: 2272
- hash: "4980de22342d1085e205401090777d24"
+ hash: "20f9cf7787c8cfd4843289f5ab2012e7"
}
Mouse {
type: 5
@@ -934,7 +934,7 @@ VisualTest {
}
Frame {
msec: 2288
- hash: "e0a52543b976dc998615704c63b1f3e9"
+ hash: "1241895174f4d8e4386c3957e3d2e292"
}
Mouse {
type: 5
@@ -946,7 +946,7 @@ VisualTest {
}
Frame {
msec: 2304
- hash: "82beb845af88fc9432dc104ff805a146"
+ hash: "1419fe55cc28ce9690846d4c03275fe7"
}
Mouse {
type: 5
@@ -958,7 +958,7 @@ VisualTest {
}
Frame {
msec: 2320
- hash: "e44526ef273048028d5989fc662eb7e6"
+ hash: "419c09739f855c53be3427a71aa3faf9"
}
Mouse {
type: 5
@@ -978,7 +978,7 @@ VisualTest {
}
Frame {
msec: 2336
- hash: "8eb1f2c8c02c2acf4262e05000045649"
+ hash: "ab3a64b41c67a0b8a6c0830c0e0cb797"
}
Mouse {
type: 5
@@ -990,7 +990,7 @@ VisualTest {
}
Frame {
msec: 2352
- hash: "442958c3a705745204db96ff9902b7fc"
+ hash: "a130b471b3903f3f1d77f2306da2b92e"
}
Mouse {
type: 5
@@ -1002,31 +1002,31 @@ VisualTest {
}
Frame {
msec: 2368
- hash: "a130b471b3903f3f1d77f2306da2b92e"
+ hash: "0a0cd0433e206dfc923ec0d3617e04a1"
}
Frame {
msec: 2384
- hash: "a130b471b3903f3f1d77f2306da2b92e"
+ hash: "0a0cd0433e206dfc923ec0d3617e04a1"
}
Frame {
msec: 2400
- hash: "a130b471b3903f3f1d77f2306da2b92e"
+ hash: "0a0cd0433e206dfc923ec0d3617e04a1"
}
Frame {
msec: 2416
- hash: "a130b471b3903f3f1d77f2306da2b92e"
+ hash: "0a0cd0433e206dfc923ec0d3617e04a1"
}
Frame {
msec: 2432
- hash: "a130b471b3903f3f1d77f2306da2b92e"
+ hash: "0a0cd0433e206dfc923ec0d3617e04a1"
}
Frame {
msec: 2448
- hash: "a130b471b3903f3f1d77f2306da2b92e"
+ hash: "0a0cd0433e206dfc923ec0d3617e04a1"
}
Frame {
msec: 2464
- hash: "a130b471b3903f3f1d77f2306da2b92e"
+ hash: "0a0cd0433e206dfc923ec0d3617e04a1"
}
Mouse {
type: 5
@@ -1046,7 +1046,7 @@ VisualTest {
}
Frame {
msec: 2480
- hash: "374dc7c3ea0c93ac93a857a4620bc031"
+ hash: "47e86b008567366f37ac043ed8802d53"
}
Mouse {
type: 5
@@ -1058,7 +1058,7 @@ VisualTest {
}
Frame {
msec: 2496
- hash: "0b943f48b39053bfc906a4a47a37d68a"
+ hash: "92e1d5dbc85e777785cc68171a0a3fbf"
}
Mouse {
type: 5
@@ -1070,7 +1070,7 @@ VisualTest {
}
Frame {
msec: 2512
- hash: "099fbdf1560dd79b700914863406c904"
+ hash: "360a47795f7f9389f82f2f55fa1fe83f"
}
Mouse {
type: 5
@@ -1090,7 +1090,7 @@ VisualTest {
}
Frame {
msec: 2528
- hash: "3aa1614cc49504d19e979ebf190f2970"
+ hash: "acefb43050e140d689f1d377f50f5c83"
}
Mouse {
type: 5
@@ -1102,7 +1102,7 @@ VisualTest {
}
Frame {
msec: 2544
- hash: "837420c71a5010f25cccd05e5e9b3eec"
+ hash: "4bc43ae81aac757c872157ac9b41a2d9"
}
Mouse {
type: 5
@@ -1114,7 +1114,7 @@ VisualTest {
}
Frame {
msec: 2560
- hash: "871349fc09f418717231b8f8e20a7fff"
+ hash: "41421089f087c54ebcd9fa44e95bd96e"
}
Mouse {
type: 5
@@ -1134,7 +1134,7 @@ VisualTest {
}
Frame {
msec: 2576
- hash: "9b6022024aae22ec1f522fd00ed29e9b"
+ hash: "db0f09393b5c9284142f9eb3cb5952ce"
}
Mouse {
type: 5
@@ -1154,79 +1154,79 @@ VisualTest {
}
Frame {
msec: 2592
- hash: "8d9410909ae259388fa94b3a60342608"
+ hash: "9491689e51ec46bec07fb8b280daef80"
}
Frame {
msec: 2608
- hash: "0ceb355351ac99458ba75776c11b3039"
+ hash: "44a30531642ada65c052afe30874d7ba"
}
Frame {
msec: 2624
- hash: "61ca917ecc8ad4c35b7f2a3b828542bf"
+ hash: "6bf415b82e7cfa68b8321571ab619c3f"
}
Frame {
msec: 2640
- hash: "fd5db933d1d8684b15eb5239d19d8919"
+ hash: "645e43948279d528020070125b71c33b"
}
Frame {
msec: 2656
- hash: "13f466a82ee22cabf5cbd2463f55b46a"
+ hash: "495d14df729eede7e560f2e841bae142"
}
Frame {
msec: 2672
- hash: "3b7f7880f5b568a0e45cd0e268822f3a"
+ hash: "fa3b12e9869bf4254c8cdf6e5b10bb2d"
}
Frame {
msec: 2688
- hash: "cca22501c3b5a2ed4264ba060eeb1a6e"
+ hash: "482ce41c4b918a71b803c5f521ea494e"
}
Frame {
msec: 2704
- hash: "efe5258ac5962d1d2bfa4286c1621830"
+ hash: "79d70563c7e139d9f9785565219133c7"
}
Frame {
msec: 2720
- hash: "141998cff765a4e90836b871f229a1ca"
+ hash: "0dc70772aa50445c1cb7dbd8ee0092b0"
}
Frame {
msec: 2736
- hash: "9d684675fa883d5488194effcb1d8d0a"
+ hash: "222d638b8fb896563028f029e6fb3c49"
}
Frame {
msec: 2752
- hash: "fa87f781048f264ddf447441a714ee50"
+ hash: "20b8fc718d9329c9c8901fdfe14557a2"
}
Frame {
msec: 2768
- hash: "61b4992b9c52222345c9ada3148d50f9"
+ hash: "e3972b3244e4a98c9ee4df2d4b623c12"
}
Frame {
msec: 2784
- hash: "3e255a634d215746cb95f5d765335ea2"
+ hash: "e3a4b357c00d3d49e4a7d90f6f57054c"
}
Frame {
msec: 2800
- hash: "d64a755e47a502244e7f14f2091f0ca6"
+ hash: "44ad81d2ad0d502b003e148412871a41"
}
Frame {
msec: 2816
- hash: "582562992b0652f995b439897182e0f8"
+ hash: "47d757dab5c72cad08cb8026631d67e6"
}
Frame {
msec: 2832
- hash: "2d69b1a274c262faf5ce9ed3191c7d22"
+ hash: "8522a3b6202b303a9e65a9e136423e27"
}
Frame {
msec: 2848
- hash: "36c04a2bd58124877a332bb6a262a7e5"
+ hash: "70e3cd650472d0e95f4d6ca9e34a2ce1"
}
Frame {
msec: 2864
- hash: "798711925da8f5034039dad86cc1fad1"
+ hash: "19a7825cd8c0eaa6f313ec77fff9ec1b"
}
Frame {
msec: 2880
- hash: "31495157a10c3bb4dd70cfd857fd07e6"
+ hash: "579688ff6ec910570c0c0c60fdf44cf6"
}
Frame {
msec: 2896
@@ -1234,207 +1234,207 @@ VisualTest {
}
Frame {
msec: 2912
- hash: "b81330eb50dbd39f1abcdb8ff1553d08"
+ hash: "7ab8cf0d0b650e8f994a9beed8be29fb"
}
Frame {
msec: 2928
- hash: "ececcb86b76e9cd2f57585bd87e16bef"
+ hash: "92e9be6d36844bb475b861ba9c4bc3ff"
}
Frame {
msec: 2944
- hash: "2c37e2c24cf22a334cfcc6f2691ad9fb"
+ hash: "08b9cce3b2071b328054af6bcb6755c7"
}
Frame {
msec: 2960
- hash: "ad0572020d273dbca046357aa0f8bf3b"
+ hash: "b505d2f41a6db06d4ca03f5340800aa6"
}
Frame {
msec: 2976
- hash: "51a469e059a5e1a3675db731f55209d3"
+ hash: "f0267f59e247e24e4cf9c56f8931112b"
}
Frame {
msec: 2992
- hash: "dca7d50a3faab1f049bece34bd16b8c4"
+ hash: "ddbc73e2df4da11d5122539a00c126de"
}
Frame {
msec: 3008
- hash: "86dc86bafb01fa086caa3b22f9d393d9"
+ hash: "8dd67df95fae14079ed5b83c421a5b6e"
}
Frame {
msec: 3024
- hash: "05754bd86070a6f01bf90ca2b964f695"
+ hash: "7b217f7c51087a07e8922b0286b2c1dc"
}
Frame {
msec: 3040
- hash: "911ec290ba303f0cac258cbb893bbf78"
+ hash: "e464b5121f3204c64cafe2f5e31cf497"
}
Frame {
msec: 3056
- hash: "f27f29249426f46b8fb508372bcbb32d"
+ hash: "7fc2018f8db17b65fd01b2ddfa44f66d"
}
Frame {
msec: 3072
- hash: "2f452e2d519f33ee03db67ebd7f69e3b"
+ hash: "a5d1871511eac7224292b3552da466a8"
}
Frame {
msec: 3088
- hash: "35cf7747a75ea3f727c2fe1dae6136c5"
+ hash: "2f0a55cf3cd30da77fbb73e749b729a3"
}
Frame {
msec: 3104
- hash: "6773187693f52a8f2c0e358e379b4d21"
+ hash: "9aab649b6664c179878d0ead438dd751"
}
Frame {
msec: 3120
- hash: "abca1f00f7ec60c8c80ba5345898e54b"
+ hash: "2ad733363d239d9a3ea1c31427a3b3fe"
}
Frame {
msec: 3136
- hash: "9bee1da64534da97de349e1ee973cc9c"
+ hash: "e73b4fd7cb6285df9a77d666f25ab245"
}
Frame {
msec: 3152
- hash: "087df06ca720918482f2e29653c7fbac"
+ hash: "53b05d8be52a74c3a24b88779d4927bf"
}
Frame {
msec: 3168
- hash: "5b08911bf0975bd6615bf29294e4b1f5"
+ hash: "04fc6aac5f090960cd87eefb4273fb0f"
}
Frame {
msec: 3184
- hash: "dead4bb3768b65418f68bae7dd0bf004"
+ hash: "294c842a71b5e4927146952ce865c8a2"
}
Frame {
msec: 3200
- hash: "6bfe4c866936d8ae509650419ae12455"
+ hash: "ac6f7afb4a5e67e2edd8300e7dfdff13"
}
Frame {
msec: 3216
- hash: "7428bdd9609a2594be08fdeac6ff1e17"
+ hash: "8a7ab6dc549b247f3b897e098d784dd8"
}
Frame {
msec: 3232
- hash: "d02f9f693e0ae8c7034bf727064ec28a"
+ hash: "0a3144254f66a6b005b95a026496cd32"
}
Frame {
msec: 3248
- hash: "b6284efd849547bbfefc22ec77d61062"
+ hash: "ca457a1c503a980687926e31ac16995b"
}
Frame {
msec: 3264
- hash: "4b78b647be8e918e85edab0c23b6f882"
+ hash: "c17922ca04f5ce9916e2907a6c28bf8b"
}
Frame {
msec: 3280
- hash: "c4a02c18ce3574d057e6a54b30efadb3"
+ hash: "b2a071734226b905f6c6f5652f645517"
}
Frame {
msec: 3296
- hash: "d1d190010239d0b02a697d1c63c748ab"
+ hash: "1f41a314699151771d7d1ca672aaba8f"
}
Frame {
msec: 3312
- hash: "b198689d11aa59d937297e6fcf675c93"
+ hash: "de94c2ad2e74036d975e8402dd8b06e9"
}
Frame {
msec: 3328
- hash: "218f3371beea895aefd28aa874012dcc"
+ hash: "9cfe0627852cefe67fc0b44b31085b4a"
}
Frame {
msec: 3344
- hash: "1135de1b9a4ebf1d2829546d3c3f3903"
+ hash: "de7ab5230efb63264f76fa1f1b61dcfa"
}
Frame {
msec: 3360
- hash: "773a64cc7bb8e99a25078f348986e28f"
+ hash: "5ad22cf9e1c9a02cfc570beaac55bee0"
}
Frame {
msec: 3376
- hash: "e8ce58aeb18b3f56ebd3d6f61ac94657"
+ hash: "9e6210d9e6bfda4fe0695b75d03435e2"
}
Frame {
msec: 3392
- hash: "6de92679c32c7f3e9d9b6ba3a47e65eb"
+ hash: "d3989a9fb7e99d16032fa1842364f2ed"
}
Frame {
msec: 3408
- hash: "339b37207af10ad986269e21ab37ff6d"
+ hash: "2f3e7040a4966e56858312f6534e9e77"
}
Frame {
msec: 3424
- hash: "ac01f0708800fdfdacec67ac9e80602f"
+ hash: "16bb17f511519337be2e60d8b9f95149"
}
Frame {
msec: 3440
- hash: "9de89a748b1e18eb6ed94875af6f26de"
+ hash: "819250fd9899a9457a9300f942f4d8bf"
}
Frame {
msec: 3456
- hash: "d091e4a93c2beafb0ce4b6dff6d5b05f"
+ hash: "6639a15d4d23540ccf63c9bea0e1689e"
}
Frame {
msec: 3472
- hash: "9532271085864d2fde3aa6e572599588"
+ hash: "14b553132a86e57577c416e6f6c53433"
}
Frame {
msec: 3488
- hash: "d00804b42ab1c1f082a9f394ff4d666e"
+ hash: "f7a95239db44b66698d29f0daae826f1"
}
Frame {
msec: 3504
- hash: "2c745f007353e6f8a7195470ba9492c2"
+ hash: "b5a6abb5294fb9b069ab8a075003cb61"
}
Frame {
msec: 3520
- hash: "b4e952acb734ab1a608297fcb44fbe46"
+ hash: "391c1c43ce893aeefc42d164e6e8aaac"
}
Frame {
msec: 3536
- hash: "75ceed3c2ddd557866145393fa50a12f"
+ hash: "271addef36d51d904bc1d68f65b66de3"
}
Frame {
msec: 3552
- hash: "8b83b80554dd4a1266184092d380554c"
+ hash: "73a23e56edcd64ac6147aff27b785ebb"
}
Frame {
msec: 3568
- hash: "973bddb1b2f9dbadd40c0de3ca7c3510"
+ hash: "bd43145ae22086348cb5e68765a42ac1"
}
Frame {
msec: 3584
- hash: "5691b5bf54b50d4ff0a717873e001c00"
+ hash: "4b2706d1215f2b5b08ac87e40ba8c21b"
}
Frame {
msec: 3600
- hash: "8b26b0aa8b06da031354c59d7fb41bf0"
+ hash: "6420fd46fd8068010d3caaa68eea457e"
}
Frame {
msec: 3616
- hash: "45786c39a10b8e1cf399df98f3fb7ffb"
+ hash: "188499a79313d984ed1d710329b0237f"
}
Frame {
msec: 3632
- hash: "c6d0be03e167c16566372cc992604dfb"
+ hash: "12da197320858ea4f8a1437b7ceac95a"
}
Frame {
msec: 3648
- hash: "8d6e057550632d143faf996a62bbd1cd"
+ hash: "14bdec5663d1a81fa617d3b81e19f8b4"
}
Frame {
msec: 3664
- hash: "7e3a321b95d5f62f0da2b10324b485b6"
+ hash: "3430047eca214a217aca0bd71814f4db"
}
Frame {
msec: 3680
- hash: "e842f18dfd36947b2fa086a4d0bb2ec5"
+ hash: "974c431fe7030990389c7fc719655cfd"
}
Frame {
msec: 3696
- hash: "a9359e143dae4113437a43cc00493479"
+ hash: "d38f3153b3cf39a278dc6948ff9ef71d"
}
Frame {
msec: 3712
- hash: "2eca61c837cca9beb6d1834eafe8c538"
+ hash: "0c6eec50abcf4afc20311ffa1326d4e8"
}
Frame {
msec: 3728
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.0.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.0.png
index af0e781..da688c7 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.1.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.1.png
index 6f1878f..618d238 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.1.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.2.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.2.png
index 97f09f7..0688ed1 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.2.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.2.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.3.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.3.png
index 878875a..ec6e330 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.3.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.3.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.4.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.4.png
index cdbe606..1692d17 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.4.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.4.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.5.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.5.png
index 7b78f7a..d70704d 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.5.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.5.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.6.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.6.png
index d7b5943..f8f37c6 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.6.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.6.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.qml b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.qml
index bc900c6..3828e76 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.qml
@@ -182,7 +182,7 @@ VisualTest {
}
Frame {
msec: 592
- hash: "731c8547a72c64ac86aec87c0a9a12cb"
+ hash: "683d9f54c75f5b1ed082edb0b4559bc8"
}
Mouse {
type: 5
@@ -202,7 +202,7 @@ VisualTest {
}
Frame {
msec: 608
- hash: "d9d7dd7ea05499f028964fdd11af0fe6"
+ hash: "02e5238c0764f370d0f463cc3f477df7"
}
Mouse {
type: 5
@@ -214,7 +214,7 @@ VisualTest {
}
Frame {
msec: 624
- hash: "361879f350c448a484b71a9e7a42b87f"
+ hash: "02239cd84ce630a89b94dbcf469d9a70"
}
Mouse {
type: 5
@@ -226,7 +226,7 @@ VisualTest {
}
Frame {
msec: 640
- hash: "998da4b3e36ee3e17deb2b5a097661da"
+ hash: "6cdaa8ffc906ade671fe259711e76f24"
}
Mouse {
type: 5
@@ -246,7 +246,7 @@ VisualTest {
}
Frame {
msec: 656
- hash: "1b3f9758bd9842cc9545b494499f87c4"
+ hash: "db00a0d69efd43f69c83dafbf38a06a6"
}
Mouse {
type: 5
@@ -258,7 +258,7 @@ VisualTest {
}
Frame {
msec: 672
- hash: "7e87f7c233dad50549e4bdafe10bb48e"
+ hash: "76fdf4cb75376ec3a9e084d93765c5cb"
}
Mouse {
type: 5
@@ -286,75 +286,75 @@ VisualTest {
}
Frame {
msec: 688
- hash: "01ceb2fea81f2192ab11d7d6e1df879a"
+ hash: "b12e86c13e012c5992930b3e559c337c"
}
Frame {
msec: 704
- hash: "9afa862248bd527e07374a5c2f2036a1"
+ hash: "4056e78a59e8f1e030f3e3a51c436b46"
}
Frame {
msec: 720
- hash: "e06439495148bfbf059cfe2b5df22840"
+ hash: "c84781b7586943ef889b8911c23e91db"
}
Frame {
msec: 736
- hash: "b206a28d6f3be8cba9595849328b27b8"
+ hash: "cd952ffa63dbcb772b666ce755c9a2f1"
}
Frame {
msec: 752
- hash: "646e4529bf554dceee0140ec56a02d1c"
+ hash: "2a31778e3ab7c676ae82278948cef12a"
}
Frame {
msec: 768
- hash: "31bdcf1f178d65e033e23dfbdcb9dc5f"
+ hash: "ef6319b262fc299b14b40d1521f9c9c3"
}
Frame {
msec: 784
- hash: "b4e897356814ca2dddbc3644b1782f36"
+ hash: "05ccb24a2025df31188b413c8d837232"
}
Frame {
msec: 800
- hash: "669e5d682aae8727640e0e0f4e855a60"
+ hash: "df31f9dba1a762397c0364d7e83052ef"
}
Frame {
msec: 816
- hash: "892007b1a379c617412502499df92d01"
+ hash: "6eec07606ef320072ea23ceedb3f6b29"
}
Frame {
msec: 832
- hash: "f4d66daa2d428aa712a73ded2de7a361"
+ hash: "e3502cb53c6e17373de3b718a8212f4d"
}
Frame {
msec: 848
- hash: "0c21e69bed6dc2d6b7c23c20714aca67"
+ hash: "2e01e2e252ca9fb3e7107f04a3ba4031"
}
Frame {
msec: 864
- hash: "189909bdbfeb1f02ad527fbc438d567d"
+ hash: "547a9f25404c2bf7737526faf67a459d"
}
Frame {
msec: 880
- hash: "b2fcbc0657474e1b6d27e1f2f93be35b"
+ hash: "aa9c3122e3c2a7ed450a0afffbcf4e6a"
}
Frame {
msec: 896
- hash: "4407d7ad1b6a40b2355145aee136ff15"
+ hash: "1535dea92038cf87395a616841fd9bf6"
}
Frame {
msec: 912
- hash: "347ada687af0a97f0a862a1f3a1132be"
+ hash: "1535dea92038cf87395a616841fd9bf6"
}
Frame {
msec: 928
- hash: "db6217ff0194c5a3f9ca9ea7e3b3dfd8"
+ hash: "1535dea92038cf87395a616841fd9bf6"
}
Frame {
msec: 944
- hash: "8a94ca0ee93daaa1bdcdbfc8a80713c1"
+ hash: "1535dea92038cf87395a616841fd9bf6"
}
Frame {
msec: 960
- hash: "ab24d0c8545518cbaff876976247be2c"
+ hash: "1535dea92038cf87395a616841fd9bf6"
}
Frame {
msec: 976
@@ -450,7 +450,7 @@ VisualTest {
}
Frame {
msec: 1216
- hash: "c612bb9906f18786ef7cc6f4e56de218"
+ hash: "aa9c3122e3c2a7ed450a0afffbcf4e6a"
}
Mouse {
type: 5
@@ -470,7 +470,7 @@ VisualTest {
}
Frame {
msec: 1232
- hash: "ffec210dd863ed32a780506f61b06056"
+ hash: "b889647c08af7db2e6582d9927cb1cf7"
}
Mouse {
type: 5
@@ -490,7 +490,7 @@ VisualTest {
}
Frame {
msec: 1248
- hash: "9613c658f267d19b84d6e7ef2a676fed"
+ hash: "ac97616fc3c54711bb067cc72c15d4c5"
}
Mouse {
type: 5
@@ -510,7 +510,7 @@ VisualTest {
}
Frame {
msec: 1264
- hash: "8c5dd8d0f9f434530b20e14a84af9f46"
+ hash: "b38c46d537e6e622c8a0ecae76dbe506"
}
Mouse {
type: 5
@@ -530,7 +530,7 @@ VisualTest {
}
Frame {
msec: 1280
- hash: "a956e8e9ca8958c387f8f5ce374cdec9"
+ hash: "6261f2f16bdd89142cfbf1de4ce64a32"
}
Mouse {
type: 5
@@ -550,87 +550,87 @@ VisualTest {
}
Frame {
msec: 1296
- hash: "712e865d894f179cfd9d86b08e60811a"
+ hash: "d4f8d57bae3d5bc888a4bbe2812b3fdf"
}
Frame {
msec: 1312
- hash: "db5c1f2af2e72ff4edce83cb342b5263"
+ hash: "4e0a90dda433c1615ea367ec90917409"
}
Frame {
msec: 1328
- hash: "834f0aa26c66234491468c1b27a2d329"
+ hash: "b20e244f27dae505568fcba25cccb5d8"
}
Frame {
msec: 1344
- hash: "78a2a4b60db730a7367bc77e1dfc1a1b"
+ hash: "f31d264a002718787ea55a6312c7f9f2"
}
Frame {
msec: 1360
- hash: "a8ff2277b5f7d515bc5a9af1f0e77197"
+ hash: "0abbf36b5e3f2db9288bde05825dc111"
}
Frame {
msec: 1376
- hash: "e05d730624025000b831860f5b99e8ac"
+ hash: "64fc0f18174f5e8002cf79a908cc08df"
}
Frame {
msec: 1392
- hash: "54aa124492ea742e4327f1d2b45ab620"
+ hash: "430d7719ebf3b5835af92683cff10e56"
}
Frame {
msec: 1408
- hash: "bc700bee41ac384a2555723b010e9041"
+ hash: "411a8fe1ee3a0510574cbf6a69d23456"
}
Frame {
msec: 1424
- hash: "26f66098c505cea4715a89b6a2232759"
+ hash: "47e431bf01575c44f7c1fa3e20409866"
}
Frame {
msec: 1440
- hash: "00f3255a3ead315410d8c0d338779689"
+ hash: "d17b62a0b52b4a5220b29b55f764abc6"
}
Frame {
msec: 1456
- hash: "154e7d86d7602ebba38a0d63b211894d"
+ hash: "9bd0d8dfbee424bd0ccf72703a7c51c2"
}
Frame {
msec: 1472
- hash: "87cf2bff69ebd75af69d0a7c7f668b07"
+ hash: "8ef880c18ecd8adb66e7e0a2dceb61fc"
}
Frame {
msec: 1488
- hash: "f221b870ecccb1669b6223e5431c31d1"
+ hash: "fcc1bc7f35342f595448ca2870478b50"
}
Frame {
msec: 1504
- hash: "40a9d4c522d9fd831be2ca698ac10670"
+ hash: "cf360de1c6649e45beb974ddbe436ea9"
}
Frame {
msec: 1520
- hash: "7ad47479d99fd4d9fde96fef242bdc20"
+ hash: "b2a6acf1fed92069fd2779b1fa236c95"
}
Frame {
msec: 1536
- hash: "b91912801c790d849399306c693a4d33"
+ hash: "7128a442b6bb06038477d46ac3da5021"
}
Frame {
msec: 1552
- hash: "e5c8d361abcbc15df0b0b82728cb5b84"
+ hash: "6a0ab3ccc3749b9a2b9a5b5851b0cf70"
}
Frame {
msec: 1568
- hash: "3f2f82c925e93d4593581cdba16f361f"
+ hash: "18f6cdad215c55ea8335d06110715aa8"
}
Frame {
msec: 1584
- hash: "7007fd0595c188a9a5b3ff31b0514aa5"
+ hash: "137420f4b1f51440c3aefd18dbdad71d"
}
Frame {
msec: 1600
- hash: "118661091df765ae35c152c7fe818029"
+ hash: "faf898388f87948fbacd74589cb18af0"
}
Frame {
msec: 1616
- hash: "0a8edd2a35f7921ced6e3aa7e571bc4b"
+ hash: "b818181b3fee6f5a35a0da6c0f8e240e"
}
Mouse {
type: 2
@@ -650,7 +650,7 @@ VisualTest {
}
Frame {
msec: 1632
- hash: "ef734ce4d7e1aee19a78b743c9923f90"
+ hash: "2e74cc22a4e5b20cc231bc08e15e662a"
}
Mouse {
type: 5
@@ -670,7 +670,7 @@ VisualTest {
}
Frame {
msec: 1648
- hash: "09a9925d5ec2fd03cfbf469bc22bf201"
+ hash: "27be226c985bb0143d1dca3e4be4b10a"
}
Mouse {
type: 5
@@ -690,71 +690,71 @@ VisualTest {
}
Frame {
msec: 1664
- hash: "6babcbf5582d5ed8f0cf52e233867055"
+ hash: "9384d46806b2a8091b6d16f7636d6ae4"
}
Frame {
msec: 1680
- hash: "94dae9d52f3523e17f3f0e59ca24a069"
+ hash: "684a17820c3693d893f8199cd7c7076f"
}
Frame {
msec: 1696
- hash: "0d417d25893a0454a729f5c23a2a6c28"
+ hash: "dc1facc91b6935983bbcd2eada452d4d"
}
Frame {
msec: 1712
- hash: "afd1bbca1dcfea8d1f0a340d86b07fa8"
+ hash: "6bb08cc431a3ecca1a553ea10669bb0c"
}
Frame {
msec: 1728
- hash: "97e98982742b94dba8b6cb59397bcb66"
+ hash: "1330640d4ca9ac69dd089cea34b7f61d"
}
Frame {
msec: 1744
- hash: "a0ad8cbbd0daa0afd3831e8a071b9a0e"
+ hash: "95370207a55b56c41923937b40d5fe6b"
}
Frame {
msec: 1760
- hash: "f71826bcd6ea91d2f64d627a390c379d"
+ hash: "c36b60f81e7de5c0e5a59655041adff2"
}
Frame {
msec: 1776
- hash: "7699da01cf1ee9a7f404ab053241b530"
+ hash: "297abbc6b38a1909324fcee6d8b1d908"
}
Frame {
msec: 1792
- hash: "6aba727ecc562d7b5555eae427e6978b"
+ hash: "0af89e3bab7c517f375897239ea35153"
}
Frame {
msec: 1808
- hash: "ef9c6daa5b04b0be9159594e04524fba"
+ hash: "05109c3dfac7f65fe00e81d1a145f048"
}
Frame {
msec: 1824
- hash: "6293ede5de83f3b01a3b4d8d87648089"
+ hash: "57e1e871cbbc627f2fb9bf5583c4f097"
}
Frame {
msec: 1840
- hash: "c3b34d8592f88622cad0f9353d08e739"
+ hash: "5220aecdd1516d94f0698e79f17fee57"
}
Frame {
msec: 1856
- hash: "880f3cb9d5dbe06cdf17e3a953d4562d"
+ hash: "f3d8c908e61e5d61bbeeb9c6b5e8a704"
}
Frame {
msec: 1872
- hash: "ed381ce920863a5a6627f383a88ea2fe"
+ hash: "f27867aeb39ef64ebd50b5d79b69337e"
}
Frame {
msec: 1888
- hash: "b5bc40b8c4abb6458aeb67eda73507b6"
+ hash: "b807b4e74a0f008df3f4534901debe38"
}
Frame {
msec: 1904
- hash: "482cb61b7fac4b1654483f846b8b6717"
+ hash: "e19832a0a7fcd57efe46cb0102a8d418"
}
Frame {
msec: 1920
- hash: "e1a4a16d2cf5132a9fbb0869ed6082d9"
+ hash: "f0dcfd9b22f385fedfde964774480f85"
}
Frame {
msec: 1936
@@ -762,171 +762,171 @@ VisualTest {
}
Frame {
msec: 1952
- hash: "f8874aaab1e65cf9b86d6b5174c3d2c8"
+ hash: "746c60e03c50dc2e28c62fe52a8dd9d2"
}
Frame {
msec: 1968
- hash: "d8490adeaa793352b812e832f4cb079a"
+ hash: "27d6da44b605cb38552147fdf451ef45"
}
Frame {
msec: 1984
- hash: "85fdb99926ba34a25fa964df11af9a5a"
+ hash: "c41d5491c417531ee86ac6ec8571c6a8"
}
Frame {
msec: 2000
- hash: "ad137a75981c181838d97cbe313063ac"
+ hash: "ac57c578e7e2cbb57e982d6da5fb7268"
}
Frame {
msec: 2016
- hash: "bfa5cecfc0058b56ca66aa816ea098dc"
+ hash: "db40e242fabf119f0e7187eeb96a34a5"
}
Frame {
msec: 2032
- hash: "53fe3960c2f332eb099fedd8421fcc94"
+ hash: "0850d4b73a664ee0f1ed6d6e0615ea80"
}
Frame {
msec: 2048
- hash: "61b99ff526560c1589d2fc8737af2af2"
+ hash: "ae6cb0bfda1cea70b3641251d0dc60c4"
}
Frame {
msec: 2064
- hash: "f9dd63709bed985f5d691d27c0d32484"
+ hash: "67a28c2188aecfc5dcccedd257789dbc"
}
Frame {
msec: 2080
- hash: "964c20ada9ad9e83edd9b429bf681b83"
+ hash: "4355f220c8a87ad981088fb23bb15f11"
}
Frame {
msec: 2096
- hash: "997bc44a319c8ce8212387f7564c4005"
+ hash: "2081c1ffe35f20dd827b3d9f52be90b3"
}
Frame {
msec: 2112
- hash: "892eda6e7446321483ffb1dbf44a0432"
+ hash: "ba13b0b4790aec7084b5553fe0b0d72b"
}
Frame {
msec: 2128
- hash: "62068dca6da7227882b6c3bc147c6f24"
+ hash: "7f289e50f1bbd570b6bc2ca1998f8493"
}
Frame {
msec: 2144
- hash: "2cd0c351c53234d4bbf4d2c74d313f59"
+ hash: "8bb3a37f416032d40cb5f919abb42e30"
}
Frame {
msec: 2160
- hash: "cf812f971bb4f8ab3116cf2b14c325df"
+ hash: "bcc69f859b3bff759e0c732c7adc23f0"
}
Frame {
msec: 2176
- hash: "be296bd9ab4c38d95e6d7d445d8c7f68"
+ hash: "d3e8aae08a2518c039d6bda80fc520a4"
}
Frame {
msec: 2192
- hash: "536d0214c8c3f69ce8d4e1585128b2b8"
+ hash: "955212dc28a6f8fe59c658401284d3a3"
}
Frame {
msec: 2208
- hash: "f71452a0a6ef80758800d67e601a162b"
+ hash: "8eebcff152288a4ab2a3e64fd7ba6f80"
}
Frame {
msec: 2224
- hash: "e57c099beb70d0a4ca2cbc94a2c3887e"
+ hash: "85fe363271d480163fb7847a3501472f"
}
Frame {
msec: 2240
- hash: "84cea22f64ff8b8838a7db0b19af1a4e"
+ hash: "23190380ddcc4e3afce2164a4743d179"
}
Frame {
msec: 2256
- hash: "04aa0d5d089779977f569d0f849b97dd"
+ hash: "40ca7c3d24883a8d3457de934b247280"
}
Frame {
msec: 2272
- hash: "85b52e125142d52d531132939930dd93"
+ hash: "299ed19fa4d213e0e9dd127e8799d5fc"
}
Frame {
msec: 2288
- hash: "19bc7b318c21a6ce2be8ebde2e624fc3"
+ hash: "e39a067860fa7dcb4efba87aee58cc77"
}
Frame {
msec: 2304
- hash: "9cc744249cb031f0400e87893c1642af"
+ hash: "a709045723c4a9a2e85295fcc360eea9"
}
Frame {
msec: 2320
- hash: "a834706bbf573f37cf9f59c6c6cbbfa5"
+ hash: "029428301287e4c7cd2f8a1fa6a25381"
}
Frame {
msec: 2336
- hash: "8db3eea9d47a162d8b0ee9cd18e194f3"
+ hash: "aef25177af3511dc99004a1e37f7f5d3"
}
Frame {
msec: 2352
- hash: "29da9b8da8f572ace93250abb8626a90"
+ hash: "f9e11fd7023a72366dacaaf19b2eb81c"
}
Frame {
msec: 2368
- hash: "179b74316d885f9ee41066b9c475b57f"
+ hash: "51f7c896d79c900a2b54a8c756228200"
}
Frame {
msec: 2384
- hash: "35464509ef5a9919af46a30d40c3edc7"
+ hash: "28c18081813c801c6793873ec23e6c0c"
}
Frame {
msec: 2400
- hash: "aadec42355d38d149421ef6c93783e69"
+ hash: "39df3050c4100e8a4f6e648b4aa16ba7"
}
Frame {
msec: 2416
- hash: "cb8609791270e8e3c13da4579f85595f"
+ hash: "752cb6969fa8b76abf4bb229edb2c21f"
}
Frame {
msec: 2432
- hash: "93e81e036a1bc30cc63ce703f8f43a34"
+ hash: "54d50f6c980cb04a1634622a29a6f0e9"
}
Frame {
msec: 2448
- hash: "d08d18adf9ca92cd6597c2f51ae90383"
+ hash: "d510db233f025b026f896b760848cc07"
}
Frame {
msec: 2464
- hash: "f54ec103787023647beaa4b992340385"
+ hash: "e5c8d361abcbc15df0b0b82728cb5b84"
}
Frame {
msec: 2480
- hash: "61c9f72d78fce0b966a278abacc97ce6"
+ hash: "e5c8d361abcbc15df0b0b82728cb5b84"
}
Frame {
msec: 2496
- hash: "5b0500ed0562b11280c3424412f74188"
+ hash: "e5c8d361abcbc15df0b0b82728cb5b84"
}
Frame {
msec: 2512
- hash: "b8ee7bc1e94ce35bf946ee71fa03d72c"
+ hash: "e5c8d361abcbc15df0b0b82728cb5b84"
}
Frame {
msec: 2528
- hash: "60ec6aceeaf82fc730c3df55b5c06f90"
+ hash: "e5c8d361abcbc15df0b0b82728cb5b84"
}
Frame {
msec: 2544
- hash: "01cc732bad8b28483e79115c117ee26d"
+ hash: "e5c8d361abcbc15df0b0b82728cb5b84"
}
Frame {
msec: 2560
- hash: "b39c8d373524ba679c8567d16e6c5fe0"
+ hash: "e5c8d361abcbc15df0b0b82728cb5b84"
}
Frame {
msec: 2576
- hash: "2474476dfd021ff485c3a127bd22367e"
+ hash: "e5c8d361abcbc15df0b0b82728cb5b84"
}
Frame {
msec: 2592
- hash: "1342a1a0f6bc02159de1be058cf2411b"
+ hash: "e5c8d361abcbc15df0b0b82728cb5b84"
}
Frame {
msec: 2608
- hash: "a9721b64b9a5526335937245302249ae"
+ hash: "e5c8d361abcbc15df0b0b82728cb5b84"
}
Mouse {
type: 2
@@ -938,15 +938,15 @@ VisualTest {
}
Frame {
msec: 2624
- hash: "109dc503ee86e731f52d25908daf5d36"
+ hash: "e5c8d361abcbc15df0b0b82728cb5b84"
}
Frame {
msec: 2640
- hash: "94998dbab6792c518ca1f37f060f1d4b"
+ hash: "e5c8d361abcbc15df0b0b82728cb5b84"
}
Frame {
msec: 2656
- hash: "3146ba4e63fa74279939b8de935f067c"
+ hash: "e5c8d361abcbc15df0b0b82728cb5b84"
}
Mouse {
type: 5
@@ -966,7 +966,7 @@ VisualTest {
}
Frame {
msec: 2672
- hash: "1aaea4143076bf8ba8190d94fcc89e64"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Mouse {
type: 5
@@ -986,7 +986,7 @@ VisualTest {
}
Frame {
msec: 2688
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Mouse {
type: 5
@@ -1006,7 +1006,7 @@ VisualTest {
}
Frame {
msec: 2704
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Mouse {
type: 5
@@ -1026,7 +1026,7 @@ VisualTest {
}
Frame {
msec: 2720
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Mouse {
type: 5
@@ -1046,7 +1046,7 @@ VisualTest {
}
Frame {
msec: 2736
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Mouse {
type: 5
@@ -1066,39 +1066,39 @@ VisualTest {
}
Frame {
msec: 2752
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2768
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2784
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2800
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2816
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2832
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2848
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2864
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2880
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2896
@@ -1106,51 +1106,51 @@ VisualTest {
}
Frame {
msec: 2912
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2928
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2944
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2960
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2976
- hash: "a0d8bb20189c3c65e5e72671788d9493"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 2992
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 3008
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 3024
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 3040
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 3056
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 3072
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 3088
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Mouse {
type: 2
@@ -1162,23 +1162,23 @@ VisualTest {
}
Frame {
msec: 3104
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 3120
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 3136
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 3152
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 3168
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Mouse {
type: 5
@@ -1190,11 +1190,11 @@ VisualTest {
}
Frame {
msec: 3184
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Frame {
msec: 3200
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Mouse {
type: 5
@@ -1214,7 +1214,7 @@ VisualTest {
}
Frame {
msec: 3216
- hash: "1236a317e60f7ae3d3fb2fb521bad2a2"
+ hash: "f728208b0fc2f230313c86378cf7f419"
}
Mouse {
type: 5
@@ -1234,7 +1234,7 @@ VisualTest {
}
Frame {
msec: 3232
- hash: "1b604ea70459a768fb37a6333000174b"
+ hash: "7d43010a9951054df82571936a04cc50"
}
Mouse {
type: 5
@@ -1254,7 +1254,7 @@ VisualTest {
}
Frame {
msec: 3248
- hash: "25e0aabe364085a61b4572ef015dac2c"
+ hash: "ab1980970c82238d2c37d61db4fc5153"
}
Mouse {
type: 5
@@ -1274,7 +1274,7 @@ VisualTest {
}
Frame {
msec: 3264
- hash: "ee6fc5c1de08e6f13f23b26829d2cba2"
+ hash: "849ffa1fdd718a48e9570b88987f9203"
}
Mouse {
type: 5
@@ -1294,7 +1294,7 @@ VisualTest {
}
Frame {
msec: 3280
- hash: "b077c59359d047738d9ba739f591393b"
+ hash: "d497eff3c8879d30619630e7ffcbf5c9"
}
Mouse {
type: 5
@@ -1314,7 +1314,7 @@ VisualTest {
}
Frame {
msec: 3296
- hash: "2cc0b8d7bd088f2277f5e939c234114c"
+ hash: "b0679dfe2f631e41f5cc269bd16d742c"
}
Mouse {
type: 5
@@ -1334,7 +1334,7 @@ VisualTest {
}
Frame {
msec: 3312
- hash: "64703db84cd5bda3109546293783804d"
+ hash: "ab2d88a4cd58d0064c32660272ff1dbd"
}
Mouse {
type: 5
@@ -1354,7 +1354,7 @@ VisualTest {
}
Frame {
msec: 3328
- hash: "137cd88932ad1fdbfdbf1a80cccf7b3f"
+ hash: "ea3cff28ff3be273332b19a2b8acb95e"
}
Mouse {
type: 5
@@ -1374,7 +1374,7 @@ VisualTest {
}
Frame {
msec: 3344
- hash: "ff9011d861c64bcad214b52cb4245583"
+ hash: "458decd62af57d333a07459c89e62393"
}
Mouse {
type: 5
@@ -1394,7 +1394,7 @@ VisualTest {
}
Frame {
msec: 3360
- hash: "c3f0132e472d29ddee95c7349243d33e"
+ hash: "1347a26241ed98d4913e1cb6cda58286"
}
Mouse {
type: 5
@@ -1414,87 +1414,87 @@ VisualTest {
}
Frame {
msec: 3376
- hash: "42ae9c21dce6a7cd59de228dac775dd5"
+ hash: "2efe07858c0c4de7fd3e339d7a24d5f5"
}
Frame {
msec: 3392
- hash: "3f8631caf6a98d83356b188d6f94e9a6"
+ hash: "3edbe6755710ce148341faeb6980707a"
}
Frame {
msec: 3408
- hash: "b2788cd1939a6dd42f12d8fd1282a122"
+ hash: "0f53231de64ac5b0503e92ad10155dea"
}
Frame {
msec: 3424
- hash: "0d1ab6e9f2780be0c392d20f4b3b9619"
+ hash: "f2be693c23ea0885d6e8180c3062ba76"
}
Frame {
msec: 3440
- hash: "03fdd91b352798b1ff958c23c0bc5f35"
+ hash: "207003ce6908f9707e9193a6c82a40c0"
}
Frame {
msec: 3456
- hash: "028fee3630fdb3cf862213c0466a56fe"
+ hash: "ba86efade16e8965f59f6257ae90d131"
}
Frame {
msec: 3472
- hash: "3ab76009ca029723e5cf0bf9bc154102"
+ hash: "1fdaaa68c4ed484536c207a0eacf6e72"
}
Frame {
msec: 3488
- hash: "866c59b7dd545364b70ddbf21a8ee874"
+ hash: "d1223c8254f9e7e37c4e09628f38bce2"
}
Frame {
msec: 3504
- hash: "9b4ff972b1055db38900fc0c5007e7b0"
+ hash: "c822447614f47b5e15ffad967964a061"
}
Frame {
msec: 3520
- hash: "cbe0073c84617e23f0679a08c1a78492"
+ hash: "5eb2e64f11847cc9360291e14e866611"
}
Frame {
msec: 3536
- hash: "374a5e6070dd628ed031e80d44be1f3f"
+ hash: "545dcc2645b50d78c84c658880d0500c"
}
Frame {
msec: 3552
- hash: "4d16c81f877585a82549cfc4f68c574d"
+ hash: "9d984e07b99137b3cb57dd4df16b8237"
}
Frame {
msec: 3568
- hash: "64b2b4c374a730b138b3573095f45d2c"
+ hash: "da27085e7a3cccde7cc3db2d9c6cc2cd"
}
Frame {
msec: 3584
- hash: "26c59f4131fdb01ac4771231341c75c3"
+ hash: "8d8c117ca102cb93e752904fe3aee7bc"
}
Frame {
msec: 3600
- hash: "bf6a3fdb7c516ca9cfc09f1059cc8cdf"
+ hash: "bfb5ed7b65f36d80e3156560a0ec58b7"
}
Frame {
msec: 3616
- hash: "1bfb86796087cd293c68205cce6ac294"
+ hash: "bbd5f2b95325fde3b8759f2ef713c6bd"
}
Frame {
msec: 3632
- hash: "e0f76f8fc7bd7756a4e004655f97f782"
+ hash: "1c36be8deb2079ed81f1718c92e44803"
}
Frame {
msec: 3648
- hash: "61d3aa5f827452482d8a4a903fe64acc"
+ hash: "5a424e7e66d87d278483c43070920d56"
}
Frame {
msec: 3664
- hash: "c8e42d3a5df195eaa091e50fc9dcd51e"
+ hash: "ae28bc20e20e022e1ac9bc2ddac0e134"
}
Frame {
msec: 3680
- hash: "bb684dccf4c0a74dc091fb78c1be4f2b"
+ hash: "1551c4aae06a258bdadc9ef356724871"
}
Frame {
msec: 3696
- hash: "54341e5a76fb4657021c41e6e3f3d496"
+ hash: "526aec43f710e524d247f8a4b08c261c"
}
Mouse {
type: 2
@@ -1514,7 +1514,7 @@ VisualTest {
}
Frame {
msec: 3712
- hash: "435ee710e108df42f659250ad7dbdb5e"
+ hash: "b50ef7198c1831623ed2210e651ac618"
}
Mouse {
type: 5
@@ -1526,7 +1526,7 @@ VisualTest {
}
Frame {
msec: 3728
- hash: "0c7078ec0d4a1dea84e0fba06323c533"
+ hash: "913269856c18d4f478eed1aa1d5ae293"
}
Mouse {
type: 5
@@ -1546,7 +1546,7 @@ VisualTest {
}
Frame {
msec: 3744
- hash: "854103790c02ca86fa011ef1b0f2be0a"
+ hash: "2c6a32e167bef4c3de0ca97e5764f31b"
}
Mouse {
type: 5
@@ -1566,7 +1566,7 @@ VisualTest {
}
Frame {
msec: 3760
- hash: "1a5995196e5bb4d1464ca76191af72d5"
+ hash: "88386cf4d982c5ca4e3fbd3519d9bd9c"
}
Mouse {
type: 5
@@ -1586,7 +1586,7 @@ VisualTest {
}
Frame {
msec: 3776
- hash: "397bbd080cae99790621642fab6ded91"
+ hash: "ecf04273061af5f881925f3a33015fbb"
}
Mouse {
type: 5
@@ -1606,7 +1606,7 @@ VisualTest {
}
Frame {
msec: 3792
- hash: "66ecad306911060329dcf7695c358e87"
+ hash: "b09c45ea79cd818bac6fe35e4167d4bd"
}
Mouse {
type: 5
@@ -1626,7 +1626,7 @@ VisualTest {
}
Frame {
msec: 3808
- hash: "c06da5f40f3f59f576a1d540d0b3244f"
+ hash: "4a1dbbac65a3caac16b38c45be61003c"
}
Mouse {
type: 5
@@ -1646,7 +1646,7 @@ VisualTest {
}
Frame {
msec: 3824
- hash: "a88d97691539dce19af4c14baf610275"
+ hash: "f4a805fc5c12cc3b2a22ef01050bf3aa"
}
Mouse {
type: 5
@@ -1666,7 +1666,7 @@ VisualTest {
}
Frame {
msec: 3840
- hash: "a07dca2c0014609ca5241612550992f5"
+ hash: "aa7805e4d806c4c56ded804145c44464"
}
Mouse {
type: 5
@@ -1706,7 +1706,7 @@ VisualTest {
}
Frame {
msec: 3872
- hash: "e5a4e76dd607ba1bae97aaf184ee009a"
+ hash: "fd2eab6b3a65713f057da22a412512c7"
}
Mouse {
type: 5
@@ -1726,7 +1726,7 @@ VisualTest {
}
Frame {
msec: 3888
- hash: "bb1d2614e590562479fc8d301bc7402f"
+ hash: "0dda191a66162db6365c663979b0990d"
}
Mouse {
type: 5
@@ -1746,7 +1746,7 @@ VisualTest {
}
Frame {
msec: 3904
- hash: "5d9fd2238666d3ae04613f1bba0fab05"
+ hash: "72a57fe4fc34a19040890a9e2a11dae5"
}
Mouse {
type: 5
@@ -1766,7 +1766,7 @@ VisualTest {
}
Frame {
msec: 3920
- hash: "b12a944cb5e593afbb21a10453879b52"
+ hash: "fd18bd5f8f09c995f122b8b4ecb80279"
}
Mouse {
type: 5
@@ -1786,7 +1786,7 @@ VisualTest {
}
Frame {
msec: 3936
- hash: "2f04c990978627b86fb2ad04579db0db"
+ hash: "8d33b6fa9d6525902e5611cf8ed2fa1f"
}
Mouse {
type: 5
@@ -1798,7 +1798,7 @@ VisualTest {
}
Frame {
msec: 3952
- hash: "e7ddf142fc36174fcaaa70b9340ef7a8"
+ hash: "d73a8eba0c43f214946052481f3db98f"
}
Mouse {
type: 5
@@ -1818,7 +1818,7 @@ VisualTest {
}
Frame {
msec: 3968
- hash: "4fce53c6f5347fe03ecf17b07fabe3ac"
+ hash: "c2f101636963ff5c61be2ad83c6b7ceb"
}
Mouse {
type: 5
@@ -1846,111 +1846,111 @@ VisualTest {
}
Frame {
msec: 3984
- hash: "75a0ec2c0158c55a90147c3f4afaa19c"
+ hash: "54630f489303c7ec2e94b4c941bd310f"
}
Frame {
msec: 4000
- hash: "e89e98b7c1f36b74c664c77e121dedcb"
+ hash: "357106c752b13bcca047d55a3c7cd486"
}
Frame {
msec: 4016
- hash: "f4c1e52a7b97a25fba640be2a1430d2d"
+ hash: "b00b78122721ddcded2c7131cfe40d53"
}
Frame {
msec: 4032
- hash: "be58ca8f63dac8373825231512f483ca"
+ hash: "7da9e4197cb9be292e561790af1caa27"
}
Frame {
msec: 4048
- hash: "755b16d4be00cb52595d42775d6227ac"
+ hash: "076fefc33455667af954dcc5a06017d3"
}
Frame {
msec: 4064
- hash: "c62f1ebbb1e4ae4ca22c060078d6240b"
+ hash: "76edfedd2b9edcc5770dcce87b022427"
}
Frame {
msec: 4080
- hash: "5f1187e9530584f9eb81ce1ce8267da0"
+ hash: "12e6711077da076b737aef1aaa336d42"
}
Frame {
msec: 4096
- hash: "5dc9921e9ddf15ee0457fcdc834544c5"
+ hash: "1e19329fb839a00faa3b95d13b7a9015"
}
Frame {
msec: 4112
- hash: "efacedc2782435ef4e269e6956fb3547"
+ hash: "7469fb57ce0b7ea9a7cc6da14f6a245a"
}
Frame {
msec: 4128
- hash: "5b356dd3082f6b0920bb41d332595ce1"
+ hash: "17e3aca0838e2ba75cc9b869bb969220"
}
Frame {
msec: 4144
- hash: "5d8afcc1abd890beb2badf85bcf02897"
+ hash: "32ebb24cee3ba65f9242708538203553"
}
Frame {
msec: 4160
- hash: "03c56ab4fea11cce19fcbb62dccb7683"
+ hash: "948429b8ded1f688cd7e27e0f056f40c"
}
Frame {
msec: 4176
- hash: "236254ce32a8e06dc42f2fd3c9ac6c7c"
+ hash: "c6fc2e8519a31bc18eb924ca98cd24be"
}
Frame {
msec: 4192
- hash: "4beb33da77bc2b41eb882a2a5cdeb539"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 4208
- hash: "b345470adead1ffb3af4d1091ffbd95c"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 4224
- hash: "c2677f1653b08952338a5c26a724ebe7"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 4240
- hash: "45b6633acf0ac28c5b5462920cf61282"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 4256
- hash: "26a9a6609ce8eee1f744c2bd43494f22"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 4272
- hash: "9373a8010a05d05cb5b3c2ec75359493"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 4288
- hash: "d0c561761825512a02a9e3640139cadc"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 4304
- hash: "d0c561761825512a02a9e3640139cadc"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 4320
- hash: "d0c561761825512a02a9e3640139cadc"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 4336
- hash: "d0c561761825512a02a9e3640139cadc"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 4352
- hash: "d0c561761825512a02a9e3640139cadc"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 4368
- hash: "d0c561761825512a02a9e3640139cadc"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 4384
- hash: "d0c561761825512a02a9e3640139cadc"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 4400
- hash: "d0c561761825512a02a9e3640139cadc"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Mouse {
type: 2
@@ -1962,7 +1962,7 @@ VisualTest {
}
Frame {
msec: 4416
- hash: "d0c561761825512a02a9e3640139cadc"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Mouse {
type: 5
@@ -1974,7 +1974,7 @@ VisualTest {
}
Frame {
msec: 4432
- hash: "d0c561761825512a02a9e3640139cadc"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Mouse {
type: 5
@@ -1994,7 +1994,7 @@ VisualTest {
}
Frame {
msec: 4448
- hash: "d0c561761825512a02a9e3640139cadc"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Mouse {
type: 5
@@ -2014,7 +2014,7 @@ VisualTest {
}
Frame {
msec: 4464
- hash: "0e7554f077e2d6d8c6cf9496b20ab009"
+ hash: "d8f9d016318e0bd38d4654b4850da952"
}
Mouse {
type: 5
@@ -2034,7 +2034,7 @@ VisualTest {
}
Frame {
msec: 4480
- hash: "d6e78f43c971abcc1d2aadb96e8b80b0"
+ hash: "13a2382e08ab10ecb40f9c24c682a797"
}
Mouse {
type: 5
@@ -2054,7 +2054,7 @@ VisualTest {
}
Frame {
msec: 4496
- hash: "10d8e0ee5bd432c639963c9cedd25b85"
+ hash: "cef145c5d105466f3913bb81bb2b58df"
}
Mouse {
type: 5
@@ -2074,7 +2074,7 @@ VisualTest {
}
Frame {
msec: 4512
- hash: "53e142d6b0112644d75df29f7865fbb4"
+ hash: "9bc0a21266bebbf8fc3509e5f92dd77f"
}
Mouse {
type: 5
@@ -2086,7 +2086,7 @@ VisualTest {
}
Frame {
msec: 4528
- hash: "9609807e6c2a27a8b9f1d5c878c3dadf"
+ hash: "e419dbe857667b014e4dd9b57b01bbe4"
}
Mouse {
type: 5
@@ -2098,7 +2098,7 @@ VisualTest {
}
Frame {
msec: 4544
- hash: "a0a1e5fd37e9d8033f182f4f2b20fd26"
+ hash: "411cb7a7f331161059faba4ae6549229"
}
Mouse {
type: 5
@@ -2110,7 +2110,7 @@ VisualTest {
}
Frame {
msec: 4560
- hash: "b40e553dc373e4018488d5421b9a8914"
+ hash: "b008d6b2b444881c36521595f6b31539"
}
Mouse {
type: 5
@@ -2122,7 +2122,7 @@ VisualTest {
}
Frame {
msec: 4576
- hash: "22e36512a0af86fac12c09f735dcb1f7"
+ hash: "77fcc3c74c3832ae6b80aec420cb06e0"
}
Mouse {
type: 5
@@ -2142,59 +2142,59 @@ VisualTest {
}
Frame {
msec: 4592
- hash: "70e9ad0f56e4c37f8684e38f614b889d"
+ hash: "41d1c54bc76caeae057fb1bdb3b93843"
}
Frame {
msec: 4608
- hash: "0754126f5738e3dcec35fc1ef65fdec3"
+ hash: "03fdd91b352798b1ff958c23c0bc5f35"
}
Frame {
msec: 4624
- hash: "b3d84ceeecc294d21bc09a3197195c20"
+ hash: "2098ea8b55b54ca8dd648fb285c43ebf"
}
Frame {
msec: 4640
- hash: "ce00501e194b1056edf1ebd43b954a70"
+ hash: "9929c509654819fd04da4e4b5c8e22b4"
}
Frame {
msec: 4656
- hash: "793f41ac2568530e6d630446216833dc"
+ hash: "c470d3a57c6b56f9f56b176823b27d53"
}
Frame {
msec: 4672
- hash: "e8573de724b653439bde85c15e9555ab"
+ hash: "37474b3a23f90dafee6b9e0043a702fa"
}
Frame {
msec: 4688
- hash: "bfb3f3645c7b2425b686ac23bcef82b8"
+ hash: "0fbb6a9fded011b010fa6f3a2819630c"
}
Frame {
msec: 4704
- hash: "faa78596e208c2cf4593ea25e31fabde"
+ hash: "6c5a7dad864999548257e4bf0ddc3687"
}
Frame {
msec: 4720
- hash: "f1b0931bffce37abfe5a6d635f1f8454"
+ hash: "339bc42e559c66d07f37af5e06feacef"
}
Frame {
msec: 4736
- hash: "0975630a55bfd56eb3e39426c1c3f1e5"
+ hash: "513dc773dc93275e32fa9ac61e6dcb46"
}
Frame {
msec: 4752
- hash: "98f1d79153a8009123abc94141375779"
+ hash: "b725c84435b1f387dc3f375280e39de6"
}
Frame {
msec: 4768
- hash: "d864817f877a9eeb44c665518ea19687"
+ hash: "f3d04b513df286aacb9ebdb107d7a0b4"
}
Frame {
msec: 4784
- hash: "79745c267d14e7790e1bb3a7e76f20b4"
+ hash: "c22839005ed0cb6b2fa9c958d17fd948"
}
Frame {
msec: 4800
- hash: "ec038d4cec64b847711fa221f808bead"
+ hash: "2fb9a2d5d22a6d0ed567328ffaa512f0"
}
Frame {
msec: 4816
@@ -2202,239 +2202,239 @@ VisualTest {
}
Frame {
msec: 4832
- hash: "ef7b3f93abbf210f8f0d38a58380dc8f"
+ hash: "ba13b0b4790aec7084b5553fe0b0d72b"
}
Frame {
msec: 4848
- hash: "f0eea63127df25f7f818596fc034fef8"
+ hash: "2bc983733d4004cc67a56d77e9f48e5d"
}
Frame {
msec: 4864
- hash: "8000dee3ea54522a8193a7f9f2e86023"
+ hash: "0f729cbe41b155b6eef20a4be207b853"
}
Frame {
msec: 4880
- hash: "111485ebaf93aae4f5e0a83da898bbac"
+ hash: "c2ca47a7d70ef827029b32c11a052b83"
}
Frame {
msec: 4896
- hash: "4b2dee1fd88dcaeabc8235f6a0e5c090"
+ hash: "803aefca7f1cbd494d2d2f7e7eea9a3f"
}
Frame {
msec: 4912
- hash: "5e560c777d0294dfa8f249232bfcf3a2"
+ hash: "2641683e1fa9ed418ac89631be7922f1"
}
Frame {
msec: 4928
- hash: "d8b490092ca5ce3ef9b078f4768c382a"
+ hash: "3d9370305ca147625828f7ee3b34ca33"
}
Frame {
msec: 4944
- hash: "28b2bbc3fd19786dd9c0ab718141c525"
+ hash: "5cdfdd22a0dc1ed78035ae4b5e2e26a7"
}
Frame {
msec: 4960
- hash: "d1a61000ebc5a475c0223dde649c8054"
+ hash: "2af663981b43dbe699849eff4731829a"
}
Frame {
msec: 4976
- hash: "d3e8aae08a2518c039d6bda80fc520a4"
+ hash: "b159d3a09666327bd2d860bf56920734"
}
Frame {
msec: 4992
- hash: "9f3bd8654adb9af0457dd50ff71fcd43"
+ hash: "a1ed6f686f4cda9aa59bfd49deb8a075"
}
Frame {
msec: 5008
- hash: "befe00fef613b7616e2dc668a5ed59c7"
+ hash: "c5f1862e7cbb1dcd6b303e58c525ab5c"
}
Frame {
msec: 5024
- hash: "24e84e6998389aa119d7d9e0ac2206ac"
+ hash: "3cc5e5d87067978961eee6e7b33ada06"
}
Frame {
msec: 5040
- hash: "2d3d2b66bf016c8e499f527dbf8923db"
+ hash: "74f3b0eae443bd9f171020fd973ca960"
}
Frame {
msec: 5056
- hash: "52d24673729dbd53d3227675b7001b24"
+ hash: "432037812ab1a09e0d0b32dfaf0f876e"
}
Frame {
msec: 5072
- hash: "4e5c807682d7b6b7839c047a7fb4ad93"
+ hash: "0eec7146b8df3b4892e89abd13b8bc9d"
}
Frame {
msec: 5088
- hash: "319affea47c4a0b0e2c3db51b85430bc"
+ hash: "a01dc5f4b4307aa66068d21159dd64d5"
}
Frame {
msec: 5104
- hash: "344962f0b88c7e8a33df71b4708fd1c0"
+ hash: "11eefdf5b1be8493a6ed9aaf519c7e17"
}
Frame {
msec: 5120
- hash: "ac099ba8a5639b9c83b6f58f2b5bcf93"
+ hash: "55ed797b82f5bca2ac2b5954c44c041e"
}
Frame {
msec: 5136
- hash: "2f8e57c93289dcdc758281531300e949"
+ hash: "498d4ca9faabf8b59e2359b60dc1aff2"
}
Frame {
msec: 5152
- hash: "e4cc3bdf6068064bcfdd0014cc301e65"
+ hash: "78895368b141ab6d3a16f65f4389b2d5"
}
Frame {
msec: 5168
- hash: "598c8a33e2bbf47b21df8b0636e0f0bc"
+ hash: "c73b27167bad79f3f3c5ebb64fa579c2"
}
Frame {
msec: 5184
- hash: "6aea67c85370eee8447a22e2b9e8c44c"
+ hash: "fb05312d65155f0300f456d727698b80"
}
Frame {
msec: 5200
- hash: "39e27a3376f4aba8510f7b0d90ca0e33"
+ hash: "6e974736a0ecea6a71c1a7052a14fa20"
}
Frame {
msec: 5216
- hash: "0ff93a16a07af43bd5e22a2b00fd2588"
+ hash: "f5daf5bec03d3e56c877e9b2dc5701b6"
}
Frame {
msec: 5232
- hash: "8b6004368b9b0a766f6b519820fe1ff6"
+ hash: "29793d2147563feb9ed0ebff18b303cd"
}
Frame {
msec: 5248
- hash: "5d92c0a12ff138d1b2c75bd042be4ea2"
+ hash: "5b63dfa3cb7ac0847f2e63f9d2a0b2b6"
}
Frame {
msec: 5264
- hash: "4386b0abe49106a0174154c726c301f6"
+ hash: "cf2f42dd9830d80f50df30e93a0b1ad2"
}
Frame {
msec: 5280
- hash: "832da8d2a86caa3ca96f33d2cd49178e"
+ hash: "8abb0aa8951612338c3bb87c7a0d2509"
}
Frame {
msec: 5296
- hash: "efee6ab1ba4a1112f2129aad12825667"
+ hash: "8abb0aa8951612338c3bb87c7a0d2509"
}
Frame {
msec: 5312
- hash: "f20a7e67a4789c559b0b0a7656bd89b1"
+ hash: "8abb0aa8951612338c3bb87c7a0d2509"
}
Frame {
msec: 5328
- hash: "350cc8c0085a8f79c9ea8880737a0b75"
+ hash: "8abb0aa8951612338c3bb87c7a0d2509"
}
Frame {
msec: 5344
- hash: "b19715b4029ea489debf7c5a269aca98"
+ hash: "8abb0aa8951612338c3bb87c7a0d2509"
}
Frame {
msec: 5360
- hash: "f383fcaf603af41650c5622bfaf136b3"
+ hash: "8abb0aa8951612338c3bb87c7a0d2509"
}
Frame {
msec: 5376
- hash: "0c62a442367fc0bac5117da1327ed39a"
+ hash: "8abb0aa8951612338c3bb87c7a0d2509"
}
Frame {
msec: 5392
- hash: "323ba45d158d983f359211f1a87b7ebd"
+ hash: "8abb0aa8951612338c3bb87c7a0d2509"
}
Frame {
msec: 5408
- hash: "aeed1a31b8b77dac2c2858969ff2d86c"
+ hash: "8abb0aa8951612338c3bb87c7a0d2509"
}
Frame {
msec: 5424
- hash: "27a9357730a97846ffeddd18492df04d"
+ hash: "8abb0aa8951612338c3bb87c7a0d2509"
}
Frame {
msec: 5440
- hash: "42f78593e64585b33c8854e8ea92710e"
+ hash: "8abb0aa8951612338c3bb87c7a0d2509"
}
Frame {
msec: 5456
- hash: "064f5cec99b9a351bebe2088019f46d1"
+ hash: "8abb0aa8951612338c3bb87c7a0d2509"
}
Frame {
msec: 5472
- hash: "d3669826f94aa2afc1069ab967f677a3"
+ hash: "8abb0aa8951612338c3bb87c7a0d2509"
}
Frame {
msec: 5488
- hash: "a118cf8892d29e6b70b4e65e42380c15"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5504
- hash: "f254260f01ff4697e9e3146cc106140d"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5520
- hash: "ec062b2bb87444115c2e8744b7f80bde"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5536
- hash: "4d45522a4e4253c810cac9cbf24c9b76"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5552
- hash: "532c3d3ead73836948a1036e8e69cadf"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5568
- hash: "4debea14aeac85ff4e64387938d8b010"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5584
- hash: "d8940cf6e39a1bd5e7216a83ce87a676"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5600
- hash: "fba6485f8a60a38ce2f3110137b1f2df"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5616
- hash: "8a8909b114332dd932b784a2640e9ff4"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5632
- hash: "fd901422400333c137240ef5f91928a3"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5648
- hash: "97b84a957515d5823e381fdd86d31fb8"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5664
- hash: "f3547ea694b88dd7d2fb8b04d6bf76a9"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5680
- hash: "9eb0da29d0c323b45e62d31bee97ce8c"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5696
- hash: "9d814096d27e9fbcffdf7e29866e0059"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5712
- hash: "6087185e1e8bf17545a7372be2990ab2"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5728
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5744
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5760
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5776
@@ -2442,126 +2442,126 @@ VisualTest {
}
Frame {
msec: 5792
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5808
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5824
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5840
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5856
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5872
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5888
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5904
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5920
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5936
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5952
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5968
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 5984
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6000
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6016
- hash: "82e534c416dfe884e5abc2f91d902484"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6032
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6048
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6064
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6080
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6096
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6112
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6128
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6144
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6160
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6176
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6192
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6208
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6224
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6240
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6256
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
Frame {
msec: 6272
- hash: "6839b467f32eaa79d4c1ce4905145350"
+ hash: "a29d4b3fa16829823e63bf83e7b62aff"
}
}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/test-pathview.qml b/tests/auto/declarative/qmlvisual/qdeclarativepathview/test-pathview.qml
index 4374b84..08499e7 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/test-pathview.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/test-pathview.qml
@@ -35,6 +35,8 @@ Rectangle {
id: photoPathView; model: rssModel; delegate: photoDelegate
anchors.fill: parent; z: 1
anchors.topMargin:40
+ highlightMoveDuration: 200
+ flickDeceleration: 200
path: Path {
startX: -50; startY: 40;
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/usingRepeater.0.png b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/usingRepeater.0.png
index 75a6c49..0efb20a 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/usingRepeater.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/usingRepeater.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/usingRepeater.qml b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/usingRepeater.qml
index 3365d40..365c25f 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/usingRepeater.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/usingRepeater.qml
@@ -10,126 +10,126 @@ VisualTest {
}
Frame {
msec: 32
- hash: "1a396cf01a6c31155609532654653599"
+ hash: "e76f50af76d6ee5925b183f9e2316b78"
}
Frame {
msec: 48
- hash: "1a396cf01a6c31155609532654653599"
+ hash: "e76f50af76d6ee5925b183f9e2316b78"
}
Frame {
msec: 64
- hash: "1a396cf01a6c31155609532654653599"
+ hash: "e76f50af76d6ee5925b183f9e2316b78"
}
Frame {
msec: 80
- hash: "1a396cf01a6c31155609532654653599"
+ hash: "e76f50af76d6ee5925b183f9e2316b78"
}
Frame {
msec: 96
- hash: "1a396cf01a6c31155609532654653599"
+ hash: "e76f50af76d6ee5925b183f9e2316b78"
}
Frame {
msec: 112
- hash: "1a396cf01a6c31155609532654653599"
+ hash: "e76f50af76d6ee5925b183f9e2316b78"
}
Frame {
msec: 128
- hash: "1a396cf01a6c31155609532654653599"
+ hash: "e76f50af76d6ee5925b183f9e2316b78"
}
Frame {
msec: 144
- hash: "1a396cf01a6c31155609532654653599"
+ hash: "e76f50af76d6ee5925b183f9e2316b78"
}
Frame {
msec: 160
- hash: "1a396cf01a6c31155609532654653599"
+ hash: "e76f50af76d6ee5925b183f9e2316b78"
}
Frame {
msec: 176
- hash: "1a396cf01a6c31155609532654653599"
+ hash: "e76f50af76d6ee5925b183f9e2316b78"
}
Frame {
msec: 192
- hash: "1a396cf01a6c31155609532654653599"
+ hash: "e76f50af76d6ee5925b183f9e2316b78"
}
Frame {
msec: 208
- hash: "1a396cf01a6c31155609532654653599"
+ hash: "e76f50af76d6ee5925b183f9e2316b78"
}
Frame {
msec: 224
- hash: "1a396cf01a6c31155609532654653599"
+ hash: "e76f50af76d6ee5925b183f9e2316b78"
}
Frame {
msec: 240
- hash: "1a396cf01a6c31155609532654653599"
+ hash: "e76f50af76d6ee5925b183f9e2316b78"
}
Frame {
msec: 256
- hash: "1a396cf01a6c31155609532654653599"
+ hash: "e76f50af76d6ee5925b183f9e2316b78"
}
Frame {
msec: 272
- hash: "8a4565aee33d40840bda26b65b6a0d90"
+ hash: "c98a904eb5da750f4cabf787e253b2ec"
}
Frame {
msec: 288
- hash: "8a4565aee33d40840bda26b65b6a0d90"
+ hash: "c98a904eb5da750f4cabf787e253b2ec"
}
Frame {
msec: 304
- hash: "8a4565aee33d40840bda26b65b6a0d90"
+ hash: "c98a904eb5da750f4cabf787e253b2ec"
}
Frame {
msec: 320
- hash: "8a4565aee33d40840bda26b65b6a0d90"
+ hash: "c98a904eb5da750f4cabf787e253b2ec"
}
Frame {
msec: 336
- hash: "8a4565aee33d40840bda26b65b6a0d90"
+ hash: "c98a904eb5da750f4cabf787e253b2ec"
}
Frame {
msec: 352
- hash: "8a4565aee33d40840bda26b65b6a0d90"
+ hash: "c98a904eb5da750f4cabf787e253b2ec"
}
Frame {
msec: 368
- hash: "8a4565aee33d40840bda26b65b6a0d90"
+ hash: "c98a904eb5da750f4cabf787e253b2ec"
}
Frame {
msec: 384
- hash: "8a4565aee33d40840bda26b65b6a0d90"
+ hash: "c98a904eb5da750f4cabf787e253b2ec"
}
Frame {
msec: 400
- hash: "8a4565aee33d40840bda26b65b6a0d90"
+ hash: "c98a904eb5da750f4cabf787e253b2ec"
}
Frame {
msec: 416
- hash: "8a4565aee33d40840bda26b65b6a0d90"
+ hash: "c98a904eb5da750f4cabf787e253b2ec"
}
Frame {
msec: 432
- hash: "8a4565aee33d40840bda26b65b6a0d90"
+ hash: "c98a904eb5da750f4cabf787e253b2ec"
}
Frame {
msec: 448
- hash: "8a4565aee33d40840bda26b65b6a0d90"
+ hash: "c98a904eb5da750f4cabf787e253b2ec"
}
Frame {
msec: 464
- hash: "8a4565aee33d40840bda26b65b6a0d90"
+ hash: "c98a904eb5da750f4cabf787e253b2ec"
}
Frame {
msec: 480
- hash: "8a4565aee33d40840bda26b65b6a0d90"
+ hash: "c98a904eb5da750f4cabf787e253b2ec"
}
Frame {
msec: 496
- hash: "8a4565aee33d40840bda26b65b6a0d90"
+ hash: "c98a904eb5da750f4cabf787e253b2ec"
}
Frame {
msec: 512
- hash: "8a4565aee33d40840bda26b65b6a0d90"
+ hash: "c98a904eb5da750f4cabf787e253b2ec"
}
}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.0.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.0.png
new file mode 100644
index 0000000..8714f58
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.1.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.1.png
new file mode 100644
index 0000000..05e4a98
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.2.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.2.png
new file mode 100644
index 0000000..29df073
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.2.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.3.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.3.png
new file mode 100644
index 0000000..b38486e
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.3.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.4.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.4.png
new file mode 100644
index 0000000..4de915b
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.4.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.5.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.5.png
new file mode 100644
index 0000000..61a4684
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.5.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.6.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.6.png
new file mode 100644
index 0000000..4ce5e30
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.6.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.7.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.7.png
new file mode 100644
index 0000000..2376b13
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.7.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.qml b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.qml
new file mode 100644
index 0000000..893355b
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.qml
@@ -0,0 +1,1763 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ image: "follow.0.png"
+ }
+ Frame {
+ msec: 32
+ hash: "e94ba580322887dbbbf9cb6309e39c23"
+ }
+ Frame {
+ msec: 48
+ hash: "787a59cda2c0b27d8959026e6d1b9427"
+ }
+ Frame {
+ msec: 64
+ hash: "9ca724d4b31aa16015b5cbb50eea0c3a"
+ }
+ Frame {
+ msec: 80
+ hash: "8a2c62a0190da1b7c1bade243baea6b8"
+ }
+ Frame {
+ msec: 96
+ hash: "e129bebca7ad348c3134569d8eee4efc"
+ }
+ Frame {
+ msec: 112
+ hash: "fd6387415e1c02fe6d17d9c3aa1d1ed8"
+ }
+ Frame {
+ msec: 128
+ hash: "a82a4042fdca7c30facd2c4740c455f7"
+ }
+ Frame {
+ msec: 144
+ hash: "62195722eb3acbfbad137ec71fd50bfe"
+ }
+ Frame {
+ msec: 160
+ hash: "449819cdc880d59650732b5447ec6237"
+ }
+ Frame {
+ msec: 176
+ hash: "552a838ebcacc0e08fa93b64a2433831"
+ }
+ Frame {
+ msec: 192
+ hash: "3984992606d54f05eb31dd0974af2183"
+ }
+ Frame {
+ msec: 208
+ hash: "3fd7225bbb0215ca8b6397580f2352a5"
+ }
+ Frame {
+ msec: 224
+ hash: "0fd8f26f40a9049de1cf2a9493d579d1"
+ }
+ Frame {
+ msec: 240
+ hash: "d08f0c57f071dc42e79fc5e0e3c32eeb"
+ }
+ Frame {
+ msec: 256
+ hash: "084c2db330ee82cd032df248ecc9629d"
+ }
+ Frame {
+ msec: 272
+ hash: "98da0d7f280d7fc4579c970c9a173b51"
+ }
+ Frame {
+ msec: 288
+ hash: "4c819c54ced1b6ef0574417a7e11f2e7"
+ }
+ Frame {
+ msec: 304
+ hash: "3dc5f7b412cb176c3b23d37cda3ef87c"
+ }
+ Frame {
+ msec: 320
+ hash: "c368a01b43d94205c03f9c750c37f330"
+ }
+ Frame {
+ msec: 336
+ hash: "8842bd0c8b17cac4fc9df84835999174"
+ }
+ Frame {
+ msec: 352
+ hash: "26829e9c7ca44dfcb0c03852f4158a18"
+ }
+ Frame {
+ msec: 368
+ hash: "ecffdb0888f1721e27b163e1f29a1950"
+ }
+ Frame {
+ msec: 384
+ hash: "eaead96f2683c464a12df8aadba20691"
+ }
+ Frame {
+ msec: 400
+ hash: "1e931963925bd208dce1ec9011372a3b"
+ }
+ Frame {
+ msec: 416
+ hash: "1c3fd049001c1e883f21d0d1e0e32cba"
+ }
+ Frame {
+ msec: 432
+ hash: "e8c3422ca637750ac52565594737d092"
+ }
+ Frame {
+ msec: 448
+ hash: "b1c36322cf89e15a80af7c43f2aebca1"
+ }
+ Frame {
+ msec: 464
+ hash: "f676c3171495f7bb2cb1812cfebaa17a"
+ }
+ Frame {
+ msec: 480
+ hash: "255119e2efa99c8e31fee611aaaa5137"
+ }
+ Frame {
+ msec: 496
+ hash: "e0bd32e3d44cfc2351db105f4595f18a"
+ }
+ Frame {
+ msec: 512
+ hash: "b7f23b8f3769f929b42491efda7ebe19"
+ }
+ Frame {
+ msec: 528
+ hash: "718cee11d869a8a8c5191cc0c09f2d30"
+ }
+ Frame {
+ msec: 544
+ hash: "fbdbf92f8c5f507605ff50abc594682b"
+ }
+ Frame {
+ msec: 560
+ hash: "c07fdc69c72b40d3c8dd1cc499008888"
+ }
+ Frame {
+ msec: 576
+ hash: "38e17ecd537dc0f51211ad672a2ebb21"
+ }
+ Frame {
+ msec: 592
+ hash: "2cbdc8728ef779c62f9938672986658a"
+ }
+ Frame {
+ msec: 608
+ hash: "7fb66509d5d1df34861e9c70f9a579f0"
+ }
+ Frame {
+ msec: 624
+ hash: "410b89392e859058718a08b79ec3d8fa"
+ }
+ Frame {
+ msec: 640
+ hash: "9bd90f80700217d08dafed93b81ee9cf"
+ }
+ Frame {
+ msec: 656
+ hash: "6d83671504a4274887b4e0d9bd2b24e7"
+ }
+ Frame {
+ msec: 672
+ hash: "51ff7bd3fd4a776af33fce7b935b145c"
+ }
+ Frame {
+ msec: 688
+ hash: "20f27392368b63b248bcd455cf3c9106"
+ }
+ Frame {
+ msec: 704
+ hash: "1a5ab296bd55aa215c9b04a7ff6c73a1"
+ }
+ Frame {
+ msec: 720
+ hash: "020fd7b14e8662fc006b0c39adca7c6a"
+ }
+ Frame {
+ msec: 736
+ hash: "2619120bdb25a153963bdf05c4a16d44"
+ }
+ Frame {
+ msec: 752
+ hash: "fd321314031efeb9ce71146764289d9f"
+ }
+ Frame {
+ msec: 768
+ hash: "378a71f09445dfff284db919787cbf87"
+ }
+ Frame {
+ msec: 784
+ hash: "d59eefe82ab8a00c903141dd9ea767ef"
+ }
+ Frame {
+ msec: 800
+ hash: "0a65004d69a4567f2a5c7e84dab3a905"
+ }
+ Frame {
+ msec: 816
+ hash: "92a4631716a51ff484ca14d9cfe05b2e"
+ }
+ Frame {
+ msec: 832
+ hash: "87203f627cf410cad56d6ba38a140efa"
+ }
+ Frame {
+ msec: 848
+ hash: "054cc085998cc059a6b7b4a7300dd36b"
+ }
+ Frame {
+ msec: 864
+ hash: "af3fefeb908a0485c723d36f61eff0a4"
+ }
+ Frame {
+ msec: 880
+ hash: "3f905d1e1ea79858b5a9bbfeab4eb255"
+ }
+ Frame {
+ msec: 896
+ hash: "f935f1fc5f26a201098d894fca9a4d1f"
+ }
+ Frame {
+ msec: 912
+ hash: "42b003dbb531da514716b9c32bdd3614"
+ }
+ Frame {
+ msec: 928
+ hash: "a82fed83ee4efee7896b639c7691b13a"
+ }
+ Frame {
+ msec: 944
+ hash: "31ad8cbf875233ea495330b0d3d4d2dd"
+ }
+ Frame {
+ msec: 960
+ hash: "00586f2f1d49fa81f90f7b06614311b4"
+ }
+ Frame {
+ msec: 976
+ image: "follow.1.png"
+ }
+ Frame {
+ msec: 992
+ hash: "5d71ff48b865ad4266eb8292f981b04e"
+ }
+ Frame {
+ msec: 1008
+ hash: "df599d934d131c92b209284277009efb"
+ }
+ Frame {
+ msec: 1024
+ hash: "5aaf33d11eb70ffdfe89246c637caed7"
+ }
+ Frame {
+ msec: 1040
+ hash: "9648cf623a66ded145c4fd23a42917b3"
+ }
+ Frame {
+ msec: 1056
+ hash: "9d33c2cc44ceac5a527ddcf809a51df6"
+ }
+ Frame {
+ msec: 1072
+ hash: "6d0ad2e0d012e53a03e246e6d5e49e13"
+ }
+ Frame {
+ msec: 1088
+ hash: "d33fa68796e38b19f44571d11c1bcd33"
+ }
+ Frame {
+ msec: 1104
+ hash: "636680f49bbf30b0fac31a6c581f18dd"
+ }
+ Frame {
+ msec: 1120
+ hash: "66801dbc39301e6b46b244fe502e0340"
+ }
+ Frame {
+ msec: 1136
+ hash: "f8fa6a033483279e78636f26493b10ac"
+ }
+ Frame {
+ msec: 1152
+ hash: "11b46611550173df42986dee4339d907"
+ }
+ Frame {
+ msec: 1168
+ hash: "5c9afdb519006079ee8d28b2b60d0b76"
+ }
+ Frame {
+ msec: 1184
+ hash: "9a55c38b2cd8abf25fbe448c7ef80971"
+ }
+ Frame {
+ msec: 1200
+ hash: "27ebdf1424e892b35c93ec009d942407"
+ }
+ Frame {
+ msec: 1216
+ hash: "2d9e3f0ae56f7337012b51c4dd173108"
+ }
+ Frame {
+ msec: 1232
+ hash: "e6f89ca892131d68ff1f4ca95c95d807"
+ }
+ Frame {
+ msec: 1248
+ hash: "f75791f1b12a217d37acb09bdb114cc5"
+ }
+ Frame {
+ msec: 1264
+ hash: "94c5ab1460fb1b0f957a9718b45bca36"
+ }
+ Frame {
+ msec: 1280
+ hash: "e246c8a0ec3d01ea20258b24a5673fe1"
+ }
+ Frame {
+ msec: 1296
+ hash: "529de7735e73409dff266d8c1275215c"
+ }
+ Frame {
+ msec: 1312
+ hash: "330400763a670580570cb62241ebec62"
+ }
+ Frame {
+ msec: 1328
+ hash: "ae444d1de9c509fc6f74136ca90f927a"
+ }
+ Frame {
+ msec: 1344
+ hash: "c43631ca8ee90ea5dc7664be5bc45429"
+ }
+ Frame {
+ msec: 1360
+ hash: "b366ac4a5b66c331a7667e9df0fc4eda"
+ }
+ Frame {
+ msec: 1376
+ hash: "1c7f4c47a9c57a34787cc9703e99bff1"
+ }
+ Frame {
+ msec: 1392
+ hash: "5555535609d512e8d34549b6624f74b8"
+ }
+ Frame {
+ msec: 1408
+ hash: "be59df714541923494b59f31f57e310e"
+ }
+ Frame {
+ msec: 1424
+ hash: "63e434f053032e54298f6e61c8d4da7d"
+ }
+ Frame {
+ msec: 1440
+ hash: "b0bb838637eceb6f8993ebc5b887afed"
+ }
+ Frame {
+ msec: 1456
+ hash: "fc39f33add4ebcaf578558ecd4aea281"
+ }
+ Frame {
+ msec: 1472
+ hash: "3f36faa7cc1e5898d4d5890c47633ff3"
+ }
+ Frame {
+ msec: 1488
+ hash: "4b328002b4461869b1f7de48e7291902"
+ }
+ Frame {
+ msec: 1504
+ hash: "26252c63924d2abcaebea2c7caf1d7aa"
+ }
+ Frame {
+ msec: 1520
+ hash: "a9a6023484ae439be86b2c2ff59dc40b"
+ }
+ Frame {
+ msec: 1536
+ hash: "620dab11bd4aab84cc0d949c48dd9a5d"
+ }
+ Frame {
+ msec: 1552
+ hash: "3b45ef80ee3e6fbbd3533bfa0d666e2f"
+ }
+ Frame {
+ msec: 1568
+ hash: "b33306abcb6a8402e491b7216495c778"
+ }
+ Frame {
+ msec: 1584
+ hash: "3cc52e8649a02e87785f1dc63f5c1efd"
+ }
+ Frame {
+ msec: 1600
+ hash: "fe21141f48da685213ed9d7641b2e7a0"
+ }
+ Frame {
+ msec: 1616
+ hash: "205aac4e822e20bd32f637256250f3c8"
+ }
+ Frame {
+ msec: 1632
+ hash: "124df0948f36aaf6151556d301f4b930"
+ }
+ Frame {
+ msec: 1648
+ hash: "c1701edd5eaf143fd1dbdc4a5324b48a"
+ }
+ Frame {
+ msec: 1664
+ hash: "117402df55367c918a3835958f4ab1d6"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 195; y: 95
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1680
+ hash: "73e3b86a1da28490cae4b03fdceefe19"
+ }
+ Frame {
+ msec: 1696
+ hash: "172e329fb47d6db0180242990a84fe3b"
+ }
+ Frame {
+ msec: 1712
+ hash: "82cf704cdfd406bab22689bc888ddc8d"
+ }
+ Frame {
+ msec: 1728
+ hash: "4c288f198a06d1b2815d34c3c8f97051"
+ }
+ Frame {
+ msec: 1744
+ hash: "6404d81456bb95a6b1c1ae55a181e40e"
+ }
+ Frame {
+ msec: 1760
+ hash: "6c11b9f079936ea08d11aa1172bfd954"
+ }
+ Frame {
+ msec: 1776
+ hash: "95388037c1f79a9dab951031f1d7c307"
+ }
+ Frame {
+ msec: 1792
+ hash: "c4ee57d9bffbb5f0ff173db48eadf2e3"
+ }
+ Frame {
+ msec: 1808
+ hash: "703ac9672a9c55cf08e6381ef76ac13c"
+ }
+ Frame {
+ msec: 1824
+ hash: "ea7726d2a2923290398262c8f70d511e"
+ }
+ Frame {
+ msec: 1840
+ hash: "9897c12603326a30c62381015c9adae3"
+ }
+ Frame {
+ msec: 1856
+ hash: "a52aa37b10a05382f1b136896b7e00e8"
+ }
+ Frame {
+ msec: 1872
+ hash: "a5acc1a45c95a67725e5e15084b7be18"
+ }
+ Frame {
+ msec: 1888
+ hash: "c9fac8b5a4110493958d49b073ea96ed"
+ }
+ Frame {
+ msec: 1904
+ hash: "6fca3a5c6d1cfbf1b905aca25b7785c5"
+ }
+ Frame {
+ msec: 1920
+ hash: "a40e5e2744d1d84c8b9a45525801a745"
+ }
+ Frame {
+ msec: 1936
+ image: "follow.2.png"
+ }
+ Frame {
+ msec: 1952
+ hash: "b2f980ab19d44ee98ab3e82a19adfe2d"
+ }
+ Frame {
+ msec: 1968
+ hash: "e01732623930aebefd76ab62c81dc722"
+ }
+ Frame {
+ msec: 1984
+ hash: "3a59c6851bc89eb31100092b1ceddbd9"
+ }
+ Frame {
+ msec: 2000
+ hash: "2949de19eacb9f35816aa7ba69614f2c"
+ }
+ Frame {
+ msec: 2016
+ hash: "f2c4c1f4429cbb6bd10f2318b2cb6904"
+ }
+ Frame {
+ msec: 2032
+ hash: "2c48af64162e7e028cd536dba03eab71"
+ }
+ Frame {
+ msec: 2048
+ hash: "7fe13b8f9253f720b6591b396cfba2d1"
+ }
+ Frame {
+ msec: 2064
+ hash: "559947a03e650575a764801366cc504b"
+ }
+ Frame {
+ msec: 2080
+ hash: "a8d09f6c862fd5ec2dcf34f06d1ef744"
+ }
+ Frame {
+ msec: 2096
+ hash: "e3bb4b62209631ff84134f2243bfdb42"
+ }
+ Frame {
+ msec: 2112
+ hash: "a1956a9d1939bc154ea0c88d596948cc"
+ }
+ Frame {
+ msec: 2128
+ hash: "c98a375727860da1e827d4dd74af8f63"
+ }
+ Frame {
+ msec: 2144
+ hash: "df4edcbb2ef5348341ff55c808609b6c"
+ }
+ Frame {
+ msec: 2160
+ hash: "6287564be85b7cbadc6bb6f0232bc837"
+ }
+ Frame {
+ msec: 2176
+ hash: "9826fdb48f7ea770fa5f198ec49d7cb7"
+ }
+ Frame {
+ msec: 2192
+ hash: "56f82641a5591df9bb929cc0d32eb95d"
+ }
+ Frame {
+ msec: 2208
+ hash: "526c55e555fb2e58796561efa3568c50"
+ }
+ Frame {
+ msec: 2224
+ hash: "6b4b74613421c1841a17c369cb316754"
+ }
+ Frame {
+ msec: 2240
+ hash: "37f785c30947d5eec113dcf6af649abf"
+ }
+ Frame {
+ msec: 2256
+ hash: "5ff2c975dd9e261c764537c836627c4d"
+ }
+ Frame {
+ msec: 2272
+ hash: "efe554981583749c3d09988bce7fed02"
+ }
+ Frame {
+ msec: 2288
+ hash: "0f7204b4afb0ea5d58e49650e8027c0c"
+ }
+ Frame {
+ msec: 2304
+ hash: "817291f91f4b309710ad3aed53a7d47a"
+ }
+ Frame {
+ msec: 2320
+ hash: "c15c9cd03089090cf8a777c1f0d88de7"
+ }
+ Frame {
+ msec: 2336
+ hash: "05f45cb8d0856dcc81091351615e35d6"
+ }
+ Frame {
+ msec: 2352
+ hash: "99785a16fed6d6409b4b47ec55afb56b"
+ }
+ Frame {
+ msec: 2368
+ hash: "39032cb4432ee9536af500673fccf526"
+ }
+ Frame {
+ msec: 2384
+ hash: "9057653e3cd6042831037d3590e7595b"
+ }
+ Frame {
+ msec: 2400
+ hash: "76c772eb2ab8f117c260c9c96bc99e1d"
+ }
+ Frame {
+ msec: 2416
+ hash: "b6474665b8f8bcdd76d1a38efecad889"
+ }
+ Frame {
+ msec: 2432
+ hash: "106c2d2efafad0181e3ded3a6805f2c6"
+ }
+ Frame {
+ msec: 2448
+ hash: "5275fa4ffef6c1909f9d03bb1e7b9cae"
+ }
+ Frame {
+ msec: 2464
+ hash: "0c1043c0087d60000dc7259d4ac03618"
+ }
+ Frame {
+ msec: 2480
+ hash: "645748569b4f5cb9b206b0808bb7d23d"
+ }
+ Frame {
+ msec: 2496
+ hash: "dd95dfa80e1b3ff511e7c75efd0d87ce"
+ }
+ Frame {
+ msec: 2512
+ hash: "86b3dd03b04d7610837cdc67cad07e0a"
+ }
+ Frame {
+ msec: 2528
+ hash: "8264f67ac92e4ebcfe4cc8e954f8c5d2"
+ }
+ Frame {
+ msec: 2544
+ hash: "6bf52377d822b09eb28a1ec36d3a36a9"
+ }
+ Frame {
+ msec: 2560
+ hash: "7ae1d65cdaf7fa71eb4ec318b37bb0aa"
+ }
+ Frame {
+ msec: 2576
+ hash: "860f5ce9844c90cf9e6a6d383ff0972f"
+ }
+ Frame {
+ msec: 2592
+ hash: "5502229c038dfc59d966f69ae6ed8957"
+ }
+ Frame {
+ msec: 2608
+ hash: "21843c027bc1434ae60b3bb0fced2c54"
+ }
+ Frame {
+ msec: 2624
+ hash: "962df45680949c3eb6c968f98cd76b20"
+ }
+ Frame {
+ msec: 2640
+ hash: "f313c26fa76a0edce61244bdf92528e4"
+ }
+ Frame {
+ msec: 2656
+ hash: "b7bbde239e98cbd66b1e51b54b747f51"
+ }
+ Frame {
+ msec: 2672
+ hash: "62340707fbc832fcb805c8f80ab353d1"
+ }
+ Frame {
+ msec: 2688
+ hash: "d008a3f7af1810ff70b68b38a4cd0f0d"
+ }
+ Frame {
+ msec: 2704
+ hash: "e651dd628af24faf34d716beb392b052"
+ }
+ Frame {
+ msec: 2720
+ hash: "a97733963c7a7616b25741545b07ffba"
+ }
+ Frame {
+ msec: 2736
+ hash: "3e017cc1db720cf16521bd17308e4f44"
+ }
+ Frame {
+ msec: 2752
+ hash: "13652ebaa610cca71486517e2eed21a5"
+ }
+ Frame {
+ msec: 2768
+ hash: "09f0f500c6f7d11be39c31f9e589b38a"
+ }
+ Frame {
+ msec: 2784
+ hash: "b87968cbc60ddc6a5f5699e830410eab"
+ }
+ Frame {
+ msec: 2800
+ hash: "50e65b043d1f07a321a08ee4c25204f6"
+ }
+ Frame {
+ msec: 2816
+ hash: "122d1ffa1510468e8c4067e0f511588f"
+ }
+ Frame {
+ msec: 2832
+ hash: "585f6c25caaafb99a22a23d8a998d202"
+ }
+ Frame {
+ msec: 2848
+ hash: "9b245a00ad576666c10f509d8a80a61e"
+ }
+ Frame {
+ msec: 2864
+ hash: "9b245a00ad576666c10f509d8a80a61e"
+ }
+ Frame {
+ msec: 2880
+ hash: "3c5d3d10bacc093afc6a9c0b5aa4cddc"
+ }
+ Frame {
+ msec: 2896
+ image: "follow.3.png"
+ }
+ Frame {
+ msec: 2912
+ hash: "31926d69c2309fdf13fbd7f0e9868c3d"
+ }
+ Frame {
+ msec: 2928
+ hash: "eb3acacce5dd31b0e94b59b9e546ccae"
+ }
+ Frame {
+ msec: 2944
+ hash: "9a51cff3276d75803a0a6e480f7ecb70"
+ }
+ Frame {
+ msec: 2960
+ hash: "fbbd8b9d519993a699815d935bcd2b9f"
+ }
+ Frame {
+ msec: 2976
+ hash: "0314190c6de73f9f374a4eaed0709645"
+ }
+ Frame {
+ msec: 2992
+ hash: "8ca1a203bdb5446094eb948aeb0a333e"
+ }
+ Frame {
+ msec: 3008
+ hash: "301e1b86ce38e11ad9d0d7aba0909985"
+ }
+ Frame {
+ msec: 3024
+ hash: "922095867d0a91b73ab7a63df2041279"
+ }
+ Frame {
+ msec: 3040
+ hash: "ba8275f3ba4633bf64a1f81f630c90f1"
+ }
+ Frame {
+ msec: 3056
+ hash: "efe39545279a7bd015d2de75d2b9d8b1"
+ }
+ Frame {
+ msec: 3072
+ hash: "78926c3c0c6fcf89b9291f9902710964"
+ }
+ Frame {
+ msec: 3088
+ hash: "ea63dcb7f00d3ddede0d8be59ad9d6bc"
+ }
+ Frame {
+ msec: 3104
+ hash: "286ad493301b713a49e378f123482a53"
+ }
+ Frame {
+ msec: 3120
+ hash: "a4bbbb8bb88188d3e99996502e3eebd1"
+ }
+ Frame {
+ msec: 3136
+ hash: "a6100e79f3dc5af594e86ab6cd8dfb76"
+ }
+ Frame {
+ msec: 3152
+ hash: "d9e3f777dc89bcf1b7f712206db768e2"
+ }
+ Frame {
+ msec: 3168
+ hash: "768045c600c0aa0b1e9e6f012733c600"
+ }
+ Frame {
+ msec: 3184
+ hash: "d8b4caa641ddee786f7898359efe9d07"
+ }
+ Frame {
+ msec: 3200
+ hash: "f7c3b76d5bb7c263ac9447eaad685158"
+ }
+ Frame {
+ msec: 3216
+ hash: "f7f97db815d653ec29fa31b87f72af2a"
+ }
+ Frame {
+ msec: 3232
+ hash: "18524623762487b60943312cd8bd4388"
+ }
+ Frame {
+ msec: 3248
+ hash: "5823dee5dd56e9f7515601f9629ccbae"
+ }
+ Frame {
+ msec: 3264
+ hash: "5823dee5dd56e9f7515601f9629ccbae"
+ }
+ Frame {
+ msec: 3280
+ hash: "5823dee5dd56e9f7515601f9629ccbae"
+ }
+ Frame {
+ msec: 3296
+ hash: "5823dee5dd56e9f7515601f9629ccbae"
+ }
+ Frame {
+ msec: 3312
+ hash: "18524623762487b60943312cd8bd4388"
+ }
+ Frame {
+ msec: 3328
+ hash: "430995770b655054aaeda383df8e27f7"
+ }
+ Frame {
+ msec: 3344
+ hash: "16a3a00f2b89aed676f80d63c4933ec3"
+ }
+ Frame {
+ msec: 3360
+ hash: "6c55aa62079ec546522edbf69c37b270"
+ }
+ Frame {
+ msec: 3376
+ hash: "0d68ca3ccecdd831013950cc7405e46e"
+ }
+ Frame {
+ msec: 3392
+ hash: "9da2511bc8b434218695fa74ed543439"
+ }
+ Frame {
+ msec: 3408
+ hash: "05afdd0b99dab81a500cdc2b2f0786fe"
+ }
+ Frame {
+ msec: 3424
+ hash: "e6f8882d146ae60bcc6ea47ff41a637b"
+ }
+ Frame {
+ msec: 3440
+ hash: "154542ed0e88321294f382501819aefc"
+ }
+ Frame {
+ msec: 3456
+ hash: "8f47b6980c387c5020145bf04645fd2d"
+ }
+ Frame {
+ msec: 3472
+ hash: "b34b055c7602f1f4e1cde875b258120c"
+ }
+ Frame {
+ msec: 3488
+ hash: "5a697f675575f05e297d4877604b9a47"
+ }
+ Frame {
+ msec: 3504
+ hash: "729dff1d1b357d19fc81804ec8940d0e"
+ }
+ Frame {
+ msec: 3520
+ hash: "c6f3fee46baa94a6139d2ee40254b160"
+ }
+ Frame {
+ msec: 3536
+ hash: "af0e700bb8ae34834510830f8b44afdb"
+ }
+ Frame {
+ msec: 3552
+ hash: "9c87bb54c2dfe58c2da9194dae6f7502"
+ }
+ Frame {
+ msec: 3568
+ hash: "2132356a92c75d725f9feafb8201b142"
+ }
+ Frame {
+ msec: 3584
+ hash: "50d855d2595eeae2bfd6aaa8c2fa0454"
+ }
+ Frame {
+ msec: 3600
+ hash: "5fde3c62d6e53a9056e3586f9dcda59e"
+ }
+ Frame {
+ msec: 3616
+ hash: "8f04460254a1e9fb949d5165894cd92a"
+ }
+ Frame {
+ msec: 3632
+ hash: "2b514c5e3b20d30f9c7e71092c69f081"
+ }
+ Frame {
+ msec: 3648
+ hash: "2c1ba6224037790e15f5c0f2864ace4d"
+ }
+ Frame {
+ msec: 3664
+ hash: "0d5b8e7bd5f560888aacaf2b3c6827a8"
+ }
+ Frame {
+ msec: 3680
+ hash: "ae25004530e7df134414018e4a34780e"
+ }
+ Frame {
+ msec: 3696
+ hash: "1a8fd9eaf9a91f1b42924f8986fbed9a"
+ }
+ Frame {
+ msec: 3712
+ hash: "2ea6de2025d40ed5beeff12a5b70ccc9"
+ }
+ Frame {
+ msec: 3728
+ hash: "624e417718d3cac1e4b7e4ce258ce6ea"
+ }
+ Frame {
+ msec: 3744
+ hash: "8b56d29391257c7be8966af6be26ea9f"
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 195; y: 95
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 3760
+ hash: "5c0d977d8b446d9191bde57335cf1062"
+ }
+ Frame {
+ msec: 3776
+ hash: "100be2b21d069e3a5dbb694a90da4d4f"
+ }
+ Frame {
+ msec: 3792
+ hash: "caab03f6c81080dd8fdbedb4e94ae4a5"
+ }
+ Frame {
+ msec: 3808
+ hash: "3328a4d06f2f80a7e9ccf2ff21522fca"
+ }
+ Frame {
+ msec: 3824
+ hash: "a534e6cc28daf3eff6a9cf8379bd6375"
+ }
+ Frame {
+ msec: 3840
+ hash: "6686f9c1a814c6a6b785b70f94937b68"
+ }
+ Frame {
+ msec: 3856
+ image: "follow.4.png"
+ }
+ Frame {
+ msec: 3872
+ hash: "d3f1c3593375ca5c022a1361a7ec70bd"
+ }
+ Frame {
+ msec: 3888
+ hash: "67843e6192e2ecaa3820c37dc2f93106"
+ }
+ Frame {
+ msec: 3904
+ hash: "19a022f678e5b8f4ebdff936162323dc"
+ }
+ Frame {
+ msec: 3920
+ hash: "34e55ae70c9e156db339ae15642359c3"
+ }
+ Frame {
+ msec: 3936
+ hash: "3784778c817f9d9bb73d990cfe12685a"
+ }
+ Frame {
+ msec: 3952
+ hash: "0403fdf79e3ba339c7e3786db0c9c0f0"
+ }
+ Frame {
+ msec: 3968
+ hash: "93e4a0d5645d1cfc916f1e8422655555"
+ }
+ Frame {
+ msec: 3984
+ hash: "29080bfabb87160b7c51385fb36b474b"
+ }
+ Frame {
+ msec: 4000
+ hash: "9da2d83edc9d35f00fb8a159e79de4d9"
+ }
+ Frame {
+ msec: 4016
+ hash: "5505a42d4788f00cfc7499fbfda851ce"
+ }
+ Frame {
+ msec: 4032
+ hash: "bdd3040ab16fa9ffdd2fbc66b06699f8"
+ }
+ Frame {
+ msec: 4048
+ hash: "2a347e30a20c693a9440caa60ade0a0f"
+ }
+ Frame {
+ msec: 4064
+ hash: "0307f1857c091a639d47f112ce1a2f5a"
+ }
+ Frame {
+ msec: 4080
+ hash: "778d18e539bbd562ebe39283a6315df1"
+ }
+ Frame {
+ msec: 4096
+ hash: "0369cf6c3d1f5db2e92ee1f7c5d3b8ed"
+ }
+ Frame {
+ msec: 4112
+ hash: "9f7413587ab50f1abf776bf180ec2d6f"
+ }
+ Frame {
+ msec: 4128
+ hash: "7d04a27236485808e571e8a39f23ea17"
+ }
+ Frame {
+ msec: 4144
+ hash: "a1dff63b723473d5a4c9c59975a2fb81"
+ }
+ Frame {
+ msec: 4160
+ hash: "9795ea70a3b9d3b7805221a58c19e5da"
+ }
+ Frame {
+ msec: 4176
+ hash: "f1392c489e21107136eb8e0d1e8b427e"
+ }
+ Frame {
+ msec: 4192
+ hash: "95c225ef07171a96335e99078195b06a"
+ }
+ Frame {
+ msec: 4208
+ hash: "d46ef3e7f9cec06e8c18afc0d07be4f3"
+ }
+ Frame {
+ msec: 4224
+ hash: "b017f5b51d423bb0fca0d6df3aaded8b"
+ }
+ Frame {
+ msec: 4240
+ hash: "60584d085b0cd6fbc436773be678597e"
+ }
+ Frame {
+ msec: 4256
+ hash: "117951465dfd5c386826b295560d2dec"
+ }
+ Frame {
+ msec: 4272
+ hash: "1b70137da5f4e024593999e93121fe8b"
+ }
+ Frame {
+ msec: 4288
+ hash: "bd50dffd41941fef127f39b55c4748e0"
+ }
+ Frame {
+ msec: 4304
+ hash: "8eec34d8e1d2e22d11b85a671cd4d3aa"
+ }
+ Frame {
+ msec: 4320
+ hash: "9e3c97cfad5002ef5f3fcc365aeb7bd0"
+ }
+ Frame {
+ msec: 4336
+ hash: "28e1cf1ee033915ea2ee39c9ab00a73d"
+ }
+ Frame {
+ msec: 4352
+ hash: "99101a156a553f441f00221f6facbf1f"
+ }
+ Frame {
+ msec: 4368
+ hash: "419023e5d59d16c26b35bee7d3cea559"
+ }
+ Frame {
+ msec: 4384
+ hash: "485d23519293975b04031fe4baa5c276"
+ }
+ Frame {
+ msec: 4400
+ hash: "c8bc60735e0ede26dbaf228294853f9a"
+ }
+ Frame {
+ msec: 4416
+ hash: "ada3680b807d59843e3adf6640704066"
+ }
+ Frame {
+ msec: 4432
+ hash: "3e28f3adf9241512cd0d6918d81ffffb"
+ }
+ Frame {
+ msec: 4448
+ hash: "8f339acc33cbc89ae1c62391ce021bb3"
+ }
+ Frame {
+ msec: 4464
+ hash: "d303960c0853a90557d64a04b8283c94"
+ }
+ Frame {
+ msec: 4480
+ hash: "f907dbdacf2cfa9fdf8f9c8dead5b4c4"
+ }
+ Frame {
+ msec: 4496
+ hash: "30c6e6f283f4a3f538cdda9c2e92de8c"
+ }
+ Frame {
+ msec: 4512
+ hash: "04d2ac55774b43107a43a7d33764199b"
+ }
+ Frame {
+ msec: 4528
+ hash: "cddf3e111cbc59e721725daa1d8a0c31"
+ }
+ Frame {
+ msec: 4544
+ hash: "15b1b63cd1695207ebf9f04387be0739"
+ }
+ Frame {
+ msec: 4560
+ hash: "690769b9bbe86a3c5b1fbdee39615fbd"
+ }
+ Frame {
+ msec: 4576
+ hash: "2bd640d8ddbf878d808f22656fef1ed9"
+ }
+ Frame {
+ msec: 4592
+ hash: "a654f1e4519bf883d554276ebbe96323"
+ }
+ Frame {
+ msec: 4608
+ hash: "68f0313cfc3f51a0bb9b47c5407c19b6"
+ }
+ Frame {
+ msec: 4624
+ hash: "77f29806b084de4cabf7ab9bf1a93d5e"
+ }
+ Frame {
+ msec: 4640
+ hash: "f9991189e3282d107b98fb0ae5f5ef00"
+ }
+ Frame {
+ msec: 4656
+ hash: "0cd1f2f6e347d48feea1b26a4968dec7"
+ }
+ Frame {
+ msec: 4672
+ hash: "e75a6f6a088e2289042572a161ffb0e9"
+ }
+ Frame {
+ msec: 4688
+ hash: "5a541081444c0a71128223a4c4c3144c"
+ }
+ Frame {
+ msec: 4704
+ hash: "6813d442cc610f346a5441ed0cd723e5"
+ }
+ Frame {
+ msec: 4720
+ hash: "24ec539bc57899819915f833f26deacd"
+ }
+ Frame {
+ msec: 4736
+ hash: "3a7ed1b4b533b817674aa141c420cd61"
+ }
+ Frame {
+ msec: 4752
+ hash: "d0a643fae97bb152e97ca60e96299003"
+ }
+ Frame {
+ msec: 4768
+ hash: "c84093931520f4661eff6645091a294b"
+ }
+ Frame {
+ msec: 4784
+ hash: "81e7ceaece82505a4a16ead195a66162"
+ }
+ Frame {
+ msec: 4800
+ hash: "315764d20b647f6ab1ba30239a69bf72"
+ }
+ Frame {
+ msec: 4816
+ image: "follow.5.png"
+ }
+ Frame {
+ msec: 4832
+ hash: "d1824ced8af34ad9edb36a58ae9aa7f5"
+ }
+ Frame {
+ msec: 4848
+ hash: "167b9a49fbb94908e09e7e9c9147cd8b"
+ }
+ Frame {
+ msec: 4864
+ hash: "442d5f0906840de526d59a80ada322c0"
+ }
+ Frame {
+ msec: 4880
+ hash: "78206c4d4d23c7c1ba888b9062b09432"
+ }
+ Frame {
+ msec: 4896
+ hash: "e898202cfebbff1952efc6e01254d855"
+ }
+ Frame {
+ msec: 4912
+ hash: "ab31dc7bbad2b0552359866bb8d92f0c"
+ }
+ Frame {
+ msec: 4928
+ hash: "f093304e88964376baf9721d53d4fb49"
+ }
+ Frame {
+ msec: 4944
+ hash: "3ef76f3e1c44d13c3a469bd192ff7b5d"
+ }
+ Frame {
+ msec: 4960
+ hash: "5d3b6d0d91f8cc5b89e39407bc3b5a15"
+ }
+ Frame {
+ msec: 4976
+ hash: "3c73573f12f49b34e1d990a55ad913fa"
+ }
+ Frame {
+ msec: 4992
+ hash: "d1bac071b01a1c6fddab90cdc435fad4"
+ }
+ Frame {
+ msec: 5008
+ hash: "36a219aadec910f1dbef616c641e1d2b"
+ }
+ Frame {
+ msec: 5024
+ hash: "5871fc67d361cc988551592ee21dfb23"
+ }
+ Frame {
+ msec: 5040
+ hash: "6e65ee6c814b9a9da205c36925e663bf"
+ }
+ Frame {
+ msec: 5056
+ hash: "290b20fa8e91d34000d7c2d81745f6d2"
+ }
+ Frame {
+ msec: 5072
+ hash: "19e7405a9083a8143f7bb040f8837b29"
+ }
+ Frame {
+ msec: 5088
+ hash: "c0a0fa2b4c1ceb6c70594994a1ac8713"
+ }
+ Frame {
+ msec: 5104
+ hash: "c236224c16743fb606deb78bcb8afc8d"
+ }
+ Frame {
+ msec: 5120
+ hash: "7d44db15eb300b4338ffc26e9bcfce20"
+ }
+ Frame {
+ msec: 5136
+ hash: "067a79148a194c45c6f32d85316a1e11"
+ }
+ Frame {
+ msec: 5152
+ hash: "9075c379044476994a87f0fdcce8e332"
+ }
+ Frame {
+ msec: 5168
+ hash: "b2316988fbd51096a4f512e71fe7d0a2"
+ }
+ Frame {
+ msec: 5184
+ hash: "280f70877d93af5f84e178aad6a102d8"
+ }
+ Frame {
+ msec: 5200
+ hash: "3eef4ae7e43a8cf1cd9dd562237296f8"
+ }
+ Frame {
+ msec: 5216
+ hash: "e3184f77ce3a47ca4dca6386f42d7fec"
+ }
+ Frame {
+ msec: 5232
+ hash: "a2a5df66fe4808ea8d466cac84ba910c"
+ }
+ Frame {
+ msec: 5248
+ hash: "9f8a0e54788112d6c30482e840504f35"
+ }
+ Frame {
+ msec: 5264
+ hash: "ae69cf84798844f9f360c86790feaecd"
+ }
+ Frame {
+ msec: 5280
+ hash: "0244526572acb6266db5b7eb9d29c6fc"
+ }
+ Frame {
+ msec: 5296
+ hash: "8fb53d60b95ddb5aef27442934ea9983"
+ }
+ Frame {
+ msec: 5312
+ hash: "930fcfde491b4f5681e3861764003895"
+ }
+ Frame {
+ msec: 5328
+ hash: "bcdcd0a637112d113ebe11dc18823237"
+ }
+ Frame {
+ msec: 5344
+ hash: "65a564d5a5afbc14c0cdad4d52753507"
+ }
+ Frame {
+ msec: 5360
+ hash: "0c5056d438d2d54938f31ef5f996673a"
+ }
+ Frame {
+ msec: 5376
+ hash: "11c157ad2236fc390ffbdf339366cbc1"
+ }
+ Frame {
+ msec: 5392
+ hash: "6cb341b1f281a97a35c2e41bfd4c4d9d"
+ }
+ Frame {
+ msec: 5408
+ hash: "553a945f7f19f70ddae4ebe88e52a79b"
+ }
+ Frame {
+ msec: 5424
+ hash: "d10b42b4095a2474e66a5a322f72e936"
+ }
+ Frame {
+ msec: 5440
+ hash: "0f943d61e8072d70eddee8aa1ba0de5a"
+ }
+ Frame {
+ msec: 5456
+ hash: "3df18e237b666e78d57857739b759e6d"
+ }
+ Frame {
+ msec: 5472
+ hash: "1ddc0bfdb2ca7b6dee63f1024e62f26e"
+ }
+ Frame {
+ msec: 5488
+ hash: "aaa397714528f41238059e3a88833abc"
+ }
+ Frame {
+ msec: 5504
+ hash: "c94bd69f925c782656afc5f9618180a6"
+ }
+ Frame {
+ msec: 5520
+ hash: "824ff8c0e1ab43e3c0eaa79b7cc19b9c"
+ }
+ Frame {
+ msec: 5536
+ hash: "6c440a0b2293811335bdbf2c4f25f47d"
+ }
+ Frame {
+ msec: 5552
+ hash: "bfc7936cdf833d5b720ec9baca740112"
+ }
+ Frame {
+ msec: 5568
+ hash: "375fa305dbae2872dc9b20e59381cc0c"
+ }
+ Frame {
+ msec: 5584
+ hash: "fffd6173aa49e74164dc17a238bcd830"
+ }
+ Frame {
+ msec: 5600
+ hash: "44d9007e00fab161fd393b653255d7f4"
+ }
+ Frame {
+ msec: 5616
+ hash: "f669ee25c58b4fa20a01705d334f0065"
+ }
+ Frame {
+ msec: 5632
+ hash: "2dbb7d57711b67d5d9e1b81f70e22d34"
+ }
+ Frame {
+ msec: 5648
+ hash: "19351b91448265cb95c1670ee283c611"
+ }
+ Frame {
+ msec: 5664
+ hash: "19351b91448265cb95c1670ee283c611"
+ }
+ Frame {
+ msec: 5680
+ hash: "3a24b99d048348a21f4e4bd69393de89"
+ }
+ Frame {
+ msec: 5696
+ hash: "35a6fe955a52950bbfa954a453e4008e"
+ }
+ Frame {
+ msec: 5712
+ hash: "896f4ec28c976237b34fb2725a44460e"
+ }
+ Frame {
+ msec: 5728
+ hash: "ed3008ea950ec84c57518e573ea36d15"
+ }
+ Frame {
+ msec: 5744
+ hash: "3447c7be992759f772c1db2033eead99"
+ }
+ Frame {
+ msec: 5760
+ hash: "b7133225daa03563d3f5b1dac5f56a23"
+ }
+ Frame {
+ msec: 5776
+ image: "follow.6.png"
+ }
+ Frame {
+ msec: 5792
+ hash: "adc55f2fcf312a90b025a75fa80aa079"
+ }
+ Frame {
+ msec: 5808
+ hash: "3ac85cad400d2b8e4f33798f4f6b7b42"
+ }
+ Frame {
+ msec: 5824
+ hash: "1c115efd84ccbe489d24c3c521c4a61c"
+ }
+ Frame {
+ msec: 5840
+ hash: "39518f1bbc0c4aba6ff517bc3dc7c279"
+ }
+ Frame {
+ msec: 5856
+ hash: "7bd28d32996f4de61c415d3217da16d0"
+ }
+ Frame {
+ msec: 5872
+ hash: "f5d06e25d775bf8db07e95625a712733"
+ }
+ Frame {
+ msec: 5888
+ hash: "4820ea6ea3be88af2f86111c547a19d7"
+ }
+ Frame {
+ msec: 5904
+ hash: "fa6e681c368118b7f135a47ae8fc12ff"
+ }
+ Frame {
+ msec: 5920
+ hash: "f6b30e618aeeb837d2b3eca270b0a060"
+ }
+ Frame {
+ msec: 5936
+ hash: "ac8504bde8d3063a8bf02b9d4b69d755"
+ }
+ Frame {
+ msec: 5952
+ hash: "9670537bb77caa8e23fda7bbfa96ca60"
+ }
+ Frame {
+ msec: 5968
+ hash: "8cd292865ce5c1d240e9ddc93881a0ed"
+ }
+ Frame {
+ msec: 5984
+ hash: "de112013e526203d151c46e6cfba9f92"
+ }
+ Frame {
+ msec: 6000
+ hash: "cd61066e697de8c055aaa168791c2d8c"
+ }
+ Frame {
+ msec: 6016
+ hash: "cd61066e697de8c055aaa168791c2d8c"
+ }
+ Frame {
+ msec: 6032
+ hash: "e68b27ff14aac03c827fd43ac488d23e"
+ }
+ Frame {
+ msec: 6048
+ hash: "e68b27ff14aac03c827fd43ac488d23e"
+ }
+ Frame {
+ msec: 6064
+ hash: "1f61d857a8c26587fbda5895c603441a"
+ }
+ Frame {
+ msec: 6080
+ hash: "1e0dffdd02e05ade1ae444427d4aa345"
+ }
+ Frame {
+ msec: 6096
+ hash: "9a416ee7a1de9ac45ab2d609233c9520"
+ }
+ Frame {
+ msec: 6112
+ hash: "dfa35bf1cd908011c3214a506bcbdcb8"
+ }
+ Frame {
+ msec: 6128
+ hash: "bd502dc72dce4af3036f7af9ed7cf9e9"
+ }
+ Frame {
+ msec: 6144
+ hash: "c77280527612408daa3037aab45da59d"
+ }
+ Frame {
+ msec: 6160
+ hash: "a38ed1532a40210ad7da4c0d4d1a7195"
+ }
+ Frame {
+ msec: 6176
+ hash: "8ac8a8df937da526bbffb9a3590d89ac"
+ }
+ Frame {
+ msec: 6192
+ hash: "07527cb9a4494e11f4c9f99eb72598b9"
+ }
+ Frame {
+ msec: 6208
+ hash: "655b0327ef0f8711810714ba50f2f8cc"
+ }
+ Frame {
+ msec: 6224
+ hash: "549fd25292012a2be1f78118998ca892"
+ }
+ Frame {
+ msec: 6240
+ hash: "7a382ae4e6a48826eaa2c83ee7a73fb2"
+ }
+ Frame {
+ msec: 6256
+ hash: "5acd5f250c5b32d9006ed68dfecbfa1c"
+ }
+ Frame {
+ msec: 6272
+ hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1"
+ }
+ Frame {
+ msec: 6288
+ hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1"
+ }
+ Frame {
+ msec: 6304
+ hash: "07e5f1277558bfe7638b00cf9d967baf"
+ }
+ Frame {
+ msec: 6320
+ hash: "07e5f1277558bfe7638b00cf9d967baf"
+ }
+ Frame {
+ msec: 6336
+ hash: "07e5f1277558bfe7638b00cf9d967baf"
+ }
+ Frame {
+ msec: 6352
+ hash: "07e5f1277558bfe7638b00cf9d967baf"
+ }
+ Frame {
+ msec: 6368
+ hash: "07e5f1277558bfe7638b00cf9d967baf"
+ }
+ Frame {
+ msec: 6384
+ hash: "877aca1c64e588845329ca8a38222604"
+ }
+ Frame {
+ msec: 6400
+ hash: "877aca1c64e588845329ca8a38222604"
+ }
+ Frame {
+ msec: 6416
+ hash: "877aca1c64e588845329ca8a38222604"
+ }
+ Frame {
+ msec: 6432
+ hash: "877aca1c64e588845329ca8a38222604"
+ }
+ Frame {
+ msec: 6448
+ hash: "877aca1c64e588845329ca8a38222604"
+ }
+ Frame {
+ msec: 6464
+ hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ }
+ Frame {
+ msec: 6480
+ hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ }
+ Frame {
+ msec: 6496
+ hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ }
+ Frame {
+ msec: 6512
+ hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ }
+ Frame {
+ msec: 6528
+ hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ }
+ Frame {
+ msec: 6544
+ hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ }
+ Frame {
+ msec: 6560
+ hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ }
+ Frame {
+ msec: 6576
+ hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ }
+ Frame {
+ msec: 6592
+ hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ }
+ Frame {
+ msec: 6608
+ hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ }
+ Frame {
+ msec: 6624
+ hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ }
+ Frame {
+ msec: 6640
+ hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ }
+ Frame {
+ msec: 6656
+ hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ }
+ Frame {
+ msec: 6672
+ hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ }
+ Frame {
+ msec: 6688
+ hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ }
+ Frame {
+ msec: 6704
+ hash: "228920e994ebf71d542c71ce8263614e"
+ }
+ Frame {
+ msec: 6720
+ hash: "228920e994ebf71d542c71ce8263614e"
+ }
+ Frame {
+ msec: 6736
+ image: "follow.7.png"
+ }
+ Frame {
+ msec: 6752
+ hash: "228920e994ebf71d542c71ce8263614e"
+ }
+ Frame {
+ msec: 6768
+ hash: "228920e994ebf71d542c71ce8263614e"
+ }
+ Frame {
+ msec: 6784
+ hash: "228920e994ebf71d542c71ce8263614e"
+ }
+ Frame {
+ msec: 6800
+ hash: "228920e994ebf71d542c71ce8263614e"
+ }
+ Frame {
+ msec: 6816
+ hash: "228920e994ebf71d542c71ce8263614e"
+ }
+ Frame {
+ msec: 6832
+ hash: "07e5f1277558bfe7638b00cf9d967baf"
+ }
+ Key {
+ type: 6
+ key: 16777249
+ modifiers: 0
+ text: ""
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 6848
+ hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1"
+ }
+ Frame {
+ msec: 6864
+ hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1"
+ }
+ Frame {
+ msec: 6880
+ hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1"
+ }
+ Frame {
+ msec: 6896
+ hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1"
+ }
+ Frame {
+ msec: 6912
+ hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1"
+ }
+ Frame {
+ msec: 6928
+ hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.0.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.0.png
index ae89849..6525dbb 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.1.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.1.png
index 7b7db05..5b8d209 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.1.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.2.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.2.png
index 7c1442f..cf012ba 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.2.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.2.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.3.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.3.png
index c01c980..57e77a4 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.3.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.3.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.4.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.4.png
index 8806e4c..24d26bd 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.4.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.4.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.5.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.5.png
index b331119..a540734 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.5.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.5.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.6.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.6.png
index 76e3c6f..17da643 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.6.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.6.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.7.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.7.png
index 141753c..e03cfe4 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.7.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.7.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.qml b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.qml
index 4548e5b..2cbd278 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.qml
@@ -10,239 +10,239 @@ VisualTest {
}
Frame {
msec: 32
- hash: "e94ba580322887dbbbf9cb6309e39c23"
+ hash: "2ddcb50f5d285eb80a8136f0cf4cf85a"
}
Frame {
msec: 48
- hash: "787a59cda2c0b27d8959026e6d1b9427"
+ hash: "519d93a844e05f8215139d91c9aef58b"
}
Frame {
msec: 64
- hash: "9ca724d4b31aa16015b5cbb50eea0c3a"
+ hash: "9f075a5547e4dc67cbe2ace2766395bb"
}
Frame {
msec: 80
- hash: "8a2c62a0190da1b7c1bade243baea6b8"
+ hash: "8fc48f74a51d45b4ea1fb7bd1d48002f"
}
Frame {
msec: 96
- hash: "e129bebca7ad348c3134569d8eee4efc"
+ hash: "a28fc4be5a5bb9ff36f796d9b071f02c"
}
Frame {
msec: 112
- hash: "fd6387415e1c02fe6d17d9c3aa1d1ed8"
+ hash: "ebc14c2905f3596ec451dd96409e6001"
}
Frame {
msec: 128
- hash: "a82a4042fdca7c30facd2c4740c455f7"
+ hash: "4f270bdcff44006a56055edb1cda522a"
}
Frame {
msec: 144
- hash: "62195722eb3acbfbad137ec71fd50bfe"
+ hash: "571f347e764bf38985768c85c2a13ba1"
}
Frame {
msec: 160
- hash: "449819cdc880d59650732b5447ec6237"
+ hash: "b1aa23268167b7e2a1190288926f52c0"
}
Frame {
msec: 176
- hash: "552a838ebcacc0e08fa93b64a2433831"
+ hash: "06d548aef9a678edbf3ab4d3ce62a647"
}
Frame {
msec: 192
- hash: "3984992606d54f05eb31dd0974af2183"
+ hash: "daf6af0ae78f39566913c656450a66e5"
}
Frame {
msec: 208
- hash: "3fd7225bbb0215ca8b6397580f2352a5"
+ hash: "f101cd0c026ee0ed6ccef7a4aed302a0"
}
Frame {
msec: 224
- hash: "0fd8f26f40a9049de1cf2a9493d579d1"
+ hash: "b3caa673f072c53d31d71109c9b33357"
}
Frame {
msec: 240
- hash: "d08f0c57f071dc42e79fc5e0e3c32eeb"
+ hash: "8596f1d305d6b8f97b9feda9e69bdefe"
}
Frame {
msec: 256
- hash: "084c2db330ee82cd032df248ecc9629d"
+ hash: "23c23df2c130aafb2092fe47a958a4cd"
}
Frame {
msec: 272
- hash: "98da0d7f280d7fc4579c970c9a173b51"
+ hash: "66a4f2d8213264437a5f4d6cf10cd442"
}
Frame {
msec: 288
- hash: "4c819c54ced1b6ef0574417a7e11f2e7"
+ hash: "6392490111813bad0a9467cc0c1746ed"
}
Frame {
msec: 304
- hash: "3dc5f7b412cb176c3b23d37cda3ef87c"
+ hash: "c115a47e0ecab63b881e2ec492d24e68"
}
Frame {
msec: 320
- hash: "c368a01b43d94205c03f9c750c37f330"
+ hash: "c2a2b57e6f9ea2975c0846124d2dbc66"
}
Frame {
msec: 336
- hash: "8842bd0c8b17cac4fc9df84835999174"
+ hash: "8286c315dfda4241607b2de1154f869d"
}
Frame {
msec: 352
- hash: "26829e9c7ca44dfcb0c03852f4158a18"
+ hash: "3f0f7cae80357176892ff7628ec3153a"
}
Frame {
msec: 368
- hash: "ecffdb0888f1721e27b163e1f29a1950"
+ hash: "d13bde4a5b5ed8202f92ae33913166c9"
}
Frame {
msec: 384
- hash: "eaead96f2683c464a12df8aadba20691"
+ hash: "b70cc32134b1b0d31a5e7f145af09495"
}
Frame {
msec: 400
- hash: "1e931963925bd208dce1ec9011372a3b"
+ hash: "03ebc2ff317ac840f4508e8701d66955"
}
Frame {
msec: 416
- hash: "1c3fd049001c1e883f21d0d1e0e32cba"
+ hash: "8dff08e72365e8e2fee8088c386dedca"
}
Frame {
msec: 432
- hash: "e8c3422ca637750ac52565594737d092"
+ hash: "720f3bbaf3fa3e3a064747d5689e47a0"
}
Frame {
msec: 448
- hash: "b1c36322cf89e15a80af7c43f2aebca1"
+ hash: "350e3ebfcfef96969ef5b8d5944f7e62"
}
Frame {
msec: 464
- hash: "f676c3171495f7bb2cb1812cfebaa17a"
+ hash: "1e4e6e68b3a8eac0c5cd039164eec166"
}
Frame {
msec: 480
- hash: "255119e2efa99c8e31fee611aaaa5137"
+ hash: "62a10c4250ad025139a3f9e72109e8e1"
}
Frame {
msec: 496
- hash: "e0bd32e3d44cfc2351db105f4595f18a"
+ hash: "23cfd643adfc98f6a06c7e7b15dac954"
}
Frame {
msec: 512
- hash: "b7f23b8f3769f929b42491efda7ebe19"
+ hash: "3a78930d5b86b886723fad85e77dd075"
}
Frame {
msec: 528
- hash: "718cee11d869a8a8c5191cc0c09f2d30"
+ hash: "64dc878e2f527e80403c766e61fe14a6"
}
Frame {
msec: 544
- hash: "fbdbf92f8c5f507605ff50abc594682b"
+ hash: "d79160989d2584044042271e79a88e69"
}
Frame {
msec: 560
- hash: "c07fdc69c72b40d3c8dd1cc499008888"
+ hash: "22cbaea4affc88433834c7d0dc1f1644"
}
Frame {
msec: 576
- hash: "38e17ecd537dc0f51211ad672a2ebb21"
+ hash: "77cb616902257e1f239a0e6bfaabb33c"
}
Frame {
msec: 592
- hash: "2cbdc8728ef779c62f9938672986658a"
+ hash: "a2fe73dced03b23c4acb9aae9b774b41"
}
Frame {
msec: 608
- hash: "7fb66509d5d1df34861e9c70f9a579f0"
+ hash: "230e21d3a9ed0e185593677233af1275"
}
Frame {
msec: 624
- hash: "410b89392e859058718a08b79ec3d8fa"
+ hash: "4e10ecffac4e06d624855d3f8917f76c"
}
Frame {
msec: 640
- hash: "9bd90f80700217d08dafed93b81ee9cf"
+ hash: "84f49d56baace4a02e50d3eafaea04ec"
}
Frame {
msec: 656
- hash: "6d83671504a4274887b4e0d9bd2b24e7"
+ hash: "e3cd0b334551a9f91723eb2c876d335a"
}
Frame {
msec: 672
- hash: "51ff7bd3fd4a776af33fce7b935b145c"
+ hash: "259330f3ec390c9926d9c2ddc2d77319"
}
Frame {
msec: 688
- hash: "20f27392368b63b248bcd455cf3c9106"
+ hash: "cc659623bfa385d282d608684d7cdc2b"
}
Frame {
msec: 704
- hash: "1a5ab296bd55aa215c9b04a7ff6c73a1"
+ hash: "47ed75d077143a6bfa0e10158550c542"
}
Frame {
msec: 720
- hash: "020fd7b14e8662fc006b0c39adca7c6a"
+ hash: "0de93bbd9f9ee63e97968089321003e1"
}
Frame {
msec: 736
- hash: "2619120bdb25a153963bdf05c4a16d44"
+ hash: "b33d867d4399879256a01344ce0b81f2"
}
Frame {
msec: 752
- hash: "fd321314031efeb9ce71146764289d9f"
+ hash: "97c31fce937d11f62bebc6169b464a42"
}
Frame {
msec: 768
- hash: "378a71f09445dfff284db919787cbf87"
+ hash: "ea4166b8a4001bca3f27af30f251267f"
}
Frame {
msec: 784
- hash: "d59eefe82ab8a00c903141dd9ea767ef"
+ hash: "b56d270b7893565f8d7ed2a0bfe10d60"
}
Frame {
msec: 800
- hash: "0a65004d69a4567f2a5c7e84dab3a905"
+ hash: "88a42559fe22b45cff379258dd40ced9"
}
Frame {
msec: 816
- hash: "92a4631716a51ff484ca14d9cfe05b2e"
+ hash: "4ee1a711cb8d26087e1b75a3166ca5f0"
}
Frame {
msec: 832
- hash: "87203f627cf410cad56d6ba38a140efa"
+ hash: "9b88a00d041092e79b4a08bccbaca0e1"
}
Frame {
msec: 848
- hash: "054cc085998cc059a6b7b4a7300dd36b"
+ hash: "afea397b3d740dc42f0313624fc10efd"
}
Frame {
msec: 864
- hash: "af3fefeb908a0485c723d36f61eff0a4"
+ hash: "39fd8e4cefbd9fed283d62a7aecded22"
}
Frame {
msec: 880
- hash: "3f905d1e1ea79858b5a9bbfeab4eb255"
+ hash: "916b783d2379ac054c749e7b6eae7ddf"
}
Frame {
msec: 896
- hash: "f935f1fc5f26a201098d894fca9a4d1f"
+ hash: "fccd44740ff7ffb0f2adccf00a7588bd"
}
Frame {
msec: 912
- hash: "42b003dbb531da514716b9c32bdd3614"
+ hash: "c064f20703a13543e8273d251fd645fe"
}
Frame {
msec: 928
- hash: "a82fed83ee4efee7896b639c7691b13a"
+ hash: "1b9b0755101841e3d1cbe208d81575d5"
}
Frame {
msec: 944
- hash: "31ad8cbf875233ea495330b0d3d4d2dd"
+ hash: "1eb5e4a301b565012bc8f6af8e879eb9"
}
Frame {
msec: 960
- hash: "00586f2f1d49fa81f90f7b06614311b4"
+ hash: "032db65eb5c405e433f88df3975c322b"
}
Frame {
msec: 976
@@ -250,175 +250,175 @@ VisualTest {
}
Frame {
msec: 992
- hash: "5d71ff48b865ad4266eb8292f981b04e"
+ hash: "fdb67e11d7cc767b2389a8bbef752c7e"
}
Frame {
msec: 1008
- hash: "df599d934d131c92b209284277009efb"
+ hash: "ed89cb161336c61b13e3514fdf816023"
}
Frame {
msec: 1024
- hash: "5aaf33d11eb70ffdfe89246c637caed7"
+ hash: "331b873c5367e0aaa62af85cb54a6a96"
}
Frame {
msec: 1040
- hash: "9648cf623a66ded145c4fd23a42917b3"
+ hash: "cde4503f02f0c3732e310a7d0418cd1e"
}
Frame {
msec: 1056
- hash: "9d33c2cc44ceac5a527ddcf809a51df6"
+ hash: "f8c028c591fc1495d5bec8763da6f011"
}
Frame {
msec: 1072
- hash: "6d0ad2e0d012e53a03e246e6d5e49e13"
+ hash: "9dc68483218335afe41aa3cd052a98b5"
}
Frame {
msec: 1088
- hash: "d33fa68796e38b19f44571d11c1bcd33"
+ hash: "31105c455418a3284700cf9c88571507"
}
Frame {
msec: 1104
- hash: "636680f49bbf30b0fac31a6c581f18dd"
+ hash: "72724947167a1ac600aaa1d7f331f7ec"
}
Frame {
msec: 1120
- hash: "66801dbc39301e6b46b244fe502e0340"
+ hash: "a4a1243326de6b9e93948fcb22fecac4"
}
Frame {
msec: 1136
- hash: "f8fa6a033483279e78636f26493b10ac"
+ hash: "c3e26e62f12dd658f21a0330fefb0533"
}
Frame {
msec: 1152
- hash: "11b46611550173df42986dee4339d907"
+ hash: "15d85b4a9ad761a911bbaa3e0c4b2b61"
}
Frame {
msec: 1168
- hash: "5c9afdb519006079ee8d28b2b60d0b76"
+ hash: "bce1400b437cc43b8ff57b1a5fbc9551"
}
Frame {
msec: 1184
- hash: "9a55c38b2cd8abf25fbe448c7ef80971"
+ hash: "5d05848afcd8f697c1b3762f00a759f6"
}
Frame {
msec: 1200
- hash: "27ebdf1424e892b35c93ec009d942407"
+ hash: "6c83f68ea72cd54793149f4c9e759d44"
}
Frame {
msec: 1216
- hash: "2d9e3f0ae56f7337012b51c4dd173108"
+ hash: "5206b93666e51cee3e25a7a85e27b5b8"
}
Frame {
msec: 1232
- hash: "e6f89ca892131d68ff1f4ca95c95d807"
+ hash: "a3ef5c76efece4455e5ad12bcc8bd8f5"
}
Frame {
msec: 1248
- hash: "f75791f1b12a217d37acb09bdb114cc5"
+ hash: "c36c6ee7b6c8074f5dc1af7446fad1ad"
}
Frame {
msec: 1264
- hash: "94c5ab1460fb1b0f957a9718b45bca36"
+ hash: "bb0887f1f10548bb53f0dc1ffeec25ee"
}
Frame {
msec: 1280
- hash: "e246c8a0ec3d01ea20258b24a5673fe1"
+ hash: "ebffe547a7c3528e5deddc590510506d"
}
Frame {
msec: 1296
- hash: "529de7735e73409dff266d8c1275215c"
+ hash: "18962faef1a1a1207a3c6783116154a2"
}
Frame {
msec: 1312
- hash: "330400763a670580570cb62241ebec62"
+ hash: "8aaa876e4a6c4de04e557f35ddd4fb61"
}
Frame {
msec: 1328
- hash: "ae444d1de9c509fc6f74136ca90f927a"
+ hash: "c66123bb4e01ce267629f5b50d147db1"
}
Frame {
msec: 1344
- hash: "c43631ca8ee90ea5dc7664be5bc45429"
+ hash: "334e5acf84d90e70ca3085b9d5e057a7"
}
Frame {
msec: 1360
- hash: "b366ac4a5b66c331a7667e9df0fc4eda"
+ hash: "9bb49ddcc775307c3c1159908323e010"
}
Frame {
msec: 1376
- hash: "1c7f4c47a9c57a34787cc9703e99bff1"
+ hash: "1b3cfb8b6b6c39a34ea86a66ea1cc6b1"
}
Frame {
msec: 1392
- hash: "5555535609d512e8d34549b6624f74b8"
+ hash: "d2a68c6eb2b05390ab1049137f96f227"
}
Frame {
msec: 1408
- hash: "be59df714541923494b59f31f57e310e"
+ hash: "91e254fd2376ba35a283b18b947ca1a8"
}
Frame {
msec: 1424
- hash: "63e434f053032e54298f6e61c8d4da7d"
+ hash: "fe94e2e8b4978390e9e8cbfe77dfc241"
}
Frame {
msec: 1440
- hash: "b0bb838637eceb6f8993ebc5b887afed"
+ hash: "e3d32b73c5c50e7aa59f4e4725de170e"
}
Frame {
msec: 1456
- hash: "fc39f33add4ebcaf578558ecd4aea281"
+ hash: "a73b90254d7da5557cc3941db0017a65"
}
Frame {
msec: 1472
- hash: "3f36faa7cc1e5898d4d5890c47633ff3"
+ hash: "9aa49cce5d63f8dd6409995ac6d91d63"
}
Frame {
msec: 1488
- hash: "4b328002b4461869b1f7de48e7291902"
+ hash: "0ba674df46accec28a3c1b81e656adc7"
}
Frame {
msec: 1504
- hash: "26252c63924d2abcaebea2c7caf1d7aa"
+ hash: "025a45417b8c75d47b5dac6c5ef913e9"
}
Frame {
msec: 1520
- hash: "a9a6023484ae439be86b2c2ff59dc40b"
+ hash: "742527b97c7f580b0b7ff9d6aa105d31"
}
Frame {
msec: 1536
- hash: "620dab11bd4aab84cc0d949c48dd9a5d"
+ hash: "965ec8315d45894e704fcc5a3efc8c55"
}
Frame {
msec: 1552
- hash: "3b45ef80ee3e6fbbd3533bfa0d666e2f"
+ hash: "6abdd59e6bd2c31124eab254418a5322"
}
Frame {
msec: 1568
- hash: "b33306abcb6a8402e491b7216495c778"
+ hash: "9f6d06b176c55fa292e7f0ef4b5cd1cb"
}
Frame {
msec: 1584
- hash: "3cc52e8649a02e87785f1dc63f5c1efd"
+ hash: "05eba8c6e02c0d4af49e59b3346c9e68"
}
Frame {
msec: 1600
- hash: "fe21141f48da685213ed9d7641b2e7a0"
+ hash: "3c4215f6253aba836516cd51368bc471"
}
Frame {
msec: 1616
- hash: "205aac4e822e20bd32f637256250f3c8"
+ hash: "c6339a290007c0106cb18ecef5b7392b"
}
Frame {
msec: 1632
- hash: "124df0948f36aaf6151556d301f4b930"
+ hash: "39a4bcd2ce84035f9db70f196ca00971"
}
Frame {
msec: 1648
- hash: "c1701edd5eaf143fd1dbdc4a5324b48a"
+ hash: "b75a4be472583c3b893fc894ebe7d4d8"
}
Frame {
msec: 1664
- hash: "117402df55367c918a3835958f4ab1d6"
+ hash: "d1efebbe748c43b3c1241753612e100d"
}
Mouse {
type: 2
@@ -430,67 +430,67 @@ VisualTest {
}
Frame {
msec: 1680
- hash: "73e3b86a1da28490cae4b03fdceefe19"
+ hash: "f6f3ad64fb71ffb68a5ea0375cc94bae"
}
Frame {
msec: 1696
- hash: "172e329fb47d6db0180242990a84fe3b"
+ hash: "778ecbafb5d235edde1683cabe3c3cfe"
}
Frame {
msec: 1712
- hash: "82cf704cdfd406bab22689bc888ddc8d"
+ hash: "5a41b9196fe4a97e6ba2400806299bd8"
}
Frame {
msec: 1728
- hash: "4c288f198a06d1b2815d34c3c8f97051"
+ hash: "1c8ddbc5910e35be389a1cb34fab9dec"
}
Frame {
msec: 1744
- hash: "6404d81456bb95a6b1c1ae55a181e40e"
+ hash: "5e8b236c00087a067d366afde67184f3"
}
Frame {
msec: 1760
- hash: "b2b4b3de77e2b7fd58d3da1ad52355a9"
+ hash: "72fe42361833054cd9388bb98ac9b150"
}
Frame {
msec: 1776
- hash: "95388037c1f79a9dab951031f1d7c307"
+ hash: "bbe9f0b030efa716f34a05f0af929c66"
}
Frame {
msec: 1792
- hash: "c4ee57d9bffbb5f0ff173db48eadf2e3"
+ hash: "cd393fc19a30d896bfe62aa0000308f8"
}
Frame {
msec: 1808
- hash: "703ac9672a9c55cf08e6381ef76ac13c"
+ hash: "c390f5b1bcff54de203490d8f2616fcd"
}
Frame {
msec: 1824
- hash: "ea7726d2a2923290398262c8f70d511e"
+ hash: "b5da2ea467c334dd13c75b811b94efb1"
}
Frame {
msec: 1840
- hash: "5d1af6cbdb4ee5b00045751204408632"
+ hash: "49887c9312c3a4dfc2d9719f47c83a15"
}
Frame {
msec: 1856
- hash: "a52aa37b10a05382f1b136896b7e00e8"
+ hash: "7f077703e49f154d01c12a44f53469c5"
}
Frame {
msec: 1872
- hash: "a5acc1a45c95a67725e5e15084b7be18"
+ hash: "7be4130ed767f0e0bf41c3bebf050cac"
}
Frame {
msec: 1888
- hash: "c9fac8b5a4110493958d49b073ea96ed"
+ hash: "cc1590486c172000557b76c6eadb51e0"
}
Frame {
msec: 1904
- hash: "6fca3a5c6d1cfbf1b905aca25b7785c5"
+ hash: "7ccd05236d9c1f8af0e9645404326122"
}
Frame {
msec: 1920
- hash: "a40e5e2744d1d84c8b9a45525801a745"
+ hash: "2da165bf7e868b53b85bb630649ddc3e"
}
Frame {
msec: 1936
@@ -498,239 +498,239 @@ VisualTest {
}
Frame {
msec: 1952
- hash: "b2f980ab19d44ee98ab3e82a19adfe2d"
+ hash: "2b6a24b6ceeaa956527c872af70fb5f9"
}
Frame {
msec: 1968
- hash: "e01732623930aebefd76ab62c81dc722"
+ hash: "8c882de21f4ed0fb68433c19b114c3f8"
}
Frame {
msec: 1984
- hash: "3a59c6851bc89eb31100092b1ceddbd9"
+ hash: "f75226c58726a687079d0d24e865ee6f"
}
Frame {
msec: 2000
- hash: "2949de19eacb9f35816aa7ba69614f2c"
+ hash: "2fa9b69fe85b4e1361ba260545c10e06"
}
Frame {
msec: 2016
- hash: "f2c4c1f4429cbb6bd10f2318b2cb6904"
+ hash: "6d513bc03f2798fbce1a0790969da6b5"
}
Frame {
msec: 2032
- hash: "2c48af64162e7e028cd536dba03eab71"
+ hash: "7e359e605483493e9a865f6eb912c394"
}
Frame {
msec: 2048
- hash: "7fe13b8f9253f720b6591b396cfba2d1"
+ hash: "497c7c82c24408dcaff5ec981d3d4f35"
}
Frame {
msec: 2064
- hash: "559947a03e650575a764801366cc504b"
+ hash: "8738b024cf75ef970ffe20166e85141c"
}
Frame {
msec: 2080
- hash: "a8d09f6c862fd5ec2dcf34f06d1ef744"
+ hash: "014b805eb1ecf2ea1cd61727bfd1ca08"
}
Frame {
msec: 2096
- hash: "e3bb4b62209631ff84134f2243bfdb42"
+ hash: "a81cde60979300f397054ea017382114"
}
Frame {
msec: 2112
- hash: "a1956a9d1939bc154ea0c88d596948cc"
+ hash: "c46183b5224e762335eea98d9da65465"
}
Frame {
msec: 2128
- hash: "c98a375727860da1e827d4dd74af8f63"
+ hash: "11afbb88994f298a1fed6575fae3d7fd"
}
Frame {
msec: 2144
- hash: "df4edcbb2ef5348341ff55c808609b6c"
+ hash: "0195fa503143561d9ae3ffe68739ca3f"
}
Frame {
msec: 2160
- hash: "6287564be85b7cbadc6bb6f0232bc837"
+ hash: "6d298df37d2116eb9a62b58853cb3344"
}
Frame {
msec: 2176
- hash: "9826fdb48f7ea770fa5f198ec49d7cb7"
+ hash: "1660865f00ea9adf94c8e56c7a8a73b2"
}
Frame {
msec: 2192
- hash: "56f82641a5591df9bb929cc0d32eb95d"
+ hash: "9835b5527b84e8e8a8fea2bdf9653a99"
}
Frame {
msec: 2208
- hash: "526c55e555fb2e58796561efa3568c50"
+ hash: "ec1158b83daa9e98437abc9ce90b70f0"
}
Frame {
msec: 2224
- hash: "6b4b74613421c1841a17c369cb316754"
+ hash: "11ce5e37747e05ff5f5071b13324ce9e"
}
Frame {
msec: 2240
- hash: "37f785c30947d5eec113dcf6af649abf"
+ hash: "6d7d427d5a15a31fd395f26c94ea455e"
}
Frame {
msec: 2256
- hash: "5ff2c975dd9e261c764537c836627c4d"
+ hash: "828949e0fbdb7c79719fb533febb5b35"
}
Frame {
msec: 2272
- hash: "efe554981583749c3d09988bce7fed02"
+ hash: "7ef7f73ef6a59c9210cfa37df3894cb1"
}
Frame {
msec: 2288
- hash: "0f7204b4afb0ea5d58e49650e8027c0c"
+ hash: "e74bec397b32ba2934ffdde23a3d60c6"
}
Frame {
msec: 2304
- hash: "817291f91f4b309710ad3aed53a7d47a"
+ hash: "09c2ca9c22e9b77bc166b4567b29bca7"
}
Frame {
msec: 2320
- hash: "c15c9cd03089090cf8a777c1f0d88de7"
+ hash: "44d87983f33c4e03f4be70b406bb9bd9"
}
Frame {
msec: 2336
- hash: "05f45cb8d0856dcc81091351615e35d6"
+ hash: "92844b36c2f30e618f04bfbc5cfbcad6"
}
Frame {
msec: 2352
- hash: "99785a16fed6d6409b4b47ec55afb56b"
+ hash: "0245f39a8966c4addb3f8dbcee93cd3f"
}
Frame {
msec: 2368
- hash: "39032cb4432ee9536af500673fccf526"
+ hash: "eb1e81cfa29295d4b1522c69d4501f51"
}
Frame {
msec: 2384
- hash: "9057653e3cd6042831037d3590e7595b"
+ hash: "2af9c3bea11b25c0f6c2b780d533a968"
}
Frame {
msec: 2400
- hash: "76c772eb2ab8f117c260c9c96bc99e1d"
+ hash: "5062e9ab29c4a7a9657a4d29249ca822"
}
Frame {
msec: 2416
- hash: "b6474665b8f8bcdd76d1a38efecad889"
+ hash: "d7652ddc85d3be3bb3a2fc268ae9bc29"
}
Frame {
msec: 2432
- hash: "106c2d2efafad0181e3ded3a6805f2c6"
+ hash: "7c924bf2ad6167db439723679b373a3a"
}
Frame {
msec: 2448
- hash: "5275fa4ffef6c1909f9d03bb1e7b9cae"
+ hash: "a93b61dd26a2ca72100b747ac3ed81b6"
}
Frame {
msec: 2464
- hash: "0c1043c0087d60000dc7259d4ac03618"
+ hash: "5fedc849d3d21e0acf0ab4a4815a1285"
}
Frame {
msec: 2480
- hash: "645748569b4f5cb9b206b0808bb7d23d"
+ hash: "4313d2458f4bede8d3b02ac60135e728"
}
Frame {
msec: 2496
- hash: "dd95dfa80e1b3ff511e7c75efd0d87ce"
+ hash: "0f09e81d89262b569c56a9c876f3898d"
}
Frame {
msec: 2512
- hash: "86b3dd03b04d7610837cdc67cad07e0a"
+ hash: "ea932789ded14fc5c8bae565b67d004c"
}
Frame {
msec: 2528
- hash: "8264f67ac92e4ebcfe4cc8e954f8c5d2"
+ hash: "fd1f7b9b51f1284fee4d777ef83bba3f"
}
Frame {
msec: 2544
- hash: "6bf52377d822b09eb28a1ec36d3a36a9"
+ hash: "e98b884a1ec8ce4b4dc20749b85b571e"
}
Frame {
msec: 2560
- hash: "7ae1d65cdaf7fa71eb4ec318b37bb0aa"
+ hash: "d144072bb87bb88750b9df9cd92f7a4b"
}
Frame {
msec: 2576
- hash: "860f5ce9844c90cf9e6a6d383ff0972f"
+ hash: "9d8ad80d3367292d7e89d67cf49862b8"
}
Frame {
msec: 2592
- hash: "5502229c038dfc59d966f69ae6ed8957"
+ hash: "c09b89e71e862da15d2b9edb0e00aa7b"
}
Frame {
msec: 2608
- hash: "21843c027bc1434ae60b3bb0fced2c54"
+ hash: "551277add3f8f09951d9c8f55ccd40f7"
}
Frame {
msec: 2624
- hash: "962df45680949c3eb6c968f98cd76b20"
+ hash: "1d0be0e7108516869374a9b985fd7543"
}
Frame {
msec: 2640
- hash: "f313c26fa76a0edce61244bdf92528e4"
+ hash: "12e7cfb6c4a26af54c4b35182294a7b7"
}
Frame {
msec: 2656
- hash: "b7bbde239e98cbd66b1e51b54b747f51"
+ hash: "a666a5a59d5854973668798eb8d508ba"
}
Frame {
msec: 2672
- hash: "62340707fbc832fcb805c8f80ab353d1"
+ hash: "420d2e21461dc45f134b7dfa11d04d25"
}
Frame {
msec: 2688
- hash: "d008a3f7af1810ff70b68b38a4cd0f0d"
+ hash: "95f848874899fb58a81c62b5921cf857"
}
Frame {
msec: 2704
- hash: "e651dd628af24faf34d716beb392b052"
+ hash: "fa3ea7a0f90ca549cc9a857f0647b061"
}
Frame {
msec: 2720
- hash: "a97733963c7a7616b25741545b07ffba"
+ hash: "cbc5338de6157cd5dad511b246f5093b"
}
Frame {
msec: 2736
- hash: "3e017cc1db720cf16521bd17308e4f44"
+ hash: "e26b43c83197abab3746830bbfacc0f4"
}
Frame {
msec: 2752
- hash: "13652ebaa610cca71486517e2eed21a5"
+ hash: "5225e854ff2763e562dee2810331d560"
}
Frame {
msec: 2768
- hash: "09f0f500c6f7d11be39c31f9e589b38a"
+ hash: "a1d114ea67233ac4c6351e18e3afa64e"
}
Frame {
msec: 2784
- hash: "b87968cbc60ddc6a5f5699e830410eab"
+ hash: "bc9f12af2d0816bb84fd5040ed29bdad"
}
Frame {
msec: 2800
- hash: "50e65b043d1f07a321a08ee4c25204f6"
+ hash: "d9337da38caa4ad3385249602a830df3"
}
Frame {
msec: 2816
- hash: "122d1ffa1510468e8c4067e0f511588f"
+ hash: "6ce20e0c89181b0f11e609b248da71d7"
}
Frame {
msec: 2832
- hash: "585f6c25caaafb99a22a23d8a998d202"
+ hash: "bbc8337950a78c7bfa48aab2635120a8"
}
Frame {
msec: 2848
- hash: "9b245a00ad576666c10f509d8a80a61e"
+ hash: "0e28ade7f52f3c27e1dbdd6e98be8c7d"
}
Frame {
msec: 2864
- hash: "9b245a00ad576666c10f509d8a80a61e"
+ hash: "0e28ade7f52f3c27e1dbdd6e98be8c7d"
}
Frame {
msec: 2880
- hash: "3c5d3d10bacc093afc6a9c0b5aa4cddc"
+ hash: "b496af17513d60d4028bd7402fbfba93"
}
Frame {
msec: 2896
@@ -738,215 +738,215 @@ VisualTest {
}
Frame {
msec: 2912
- hash: "31926d69c2309fdf13fbd7f0e9868c3d"
+ hash: "29aa7ce0fb1aa350753d3ec6da05bdf9"
}
Frame {
msec: 2928
- hash: "eb3acacce5dd31b0e94b59b9e546ccae"
+ hash: "fde474797d8105d9d004a7020e010fa4"
}
Frame {
msec: 2944
- hash: "9a51cff3276d75803a0a6e480f7ecb70"
+ hash: "5a553d9a4bd2ef5d86f5eb37a863d28f"
}
Frame {
msec: 2960
- hash: "fbbd8b9d519993a699815d935bcd2b9f"
+ hash: "2dcbf6c84abd49529f0b5d85bfb74808"
}
Frame {
msec: 2976
- hash: "0314190c6de73f9f374a4eaed0709645"
+ hash: "e96ec3b7d37bbf4c9ca297ad5afde31c"
}
Frame {
msec: 2992
- hash: "8ca1a203bdb5446094eb948aeb0a333e"
+ hash: "9d824068affe32c143226b0b530206fc"
}
Frame {
msec: 3008
- hash: "301e1b86ce38e11ad9d0d7aba0909985"
+ hash: "3e85f0ace68cffed47f4c9b00145f0f0"
}
Frame {
msec: 3024
- hash: "922095867d0a91b73ab7a63df2041279"
+ hash: "540b8e1e2bee7d2ba5e29fd3b1086cd1"
}
Frame {
msec: 3040
- hash: "ba8275f3ba4633bf64a1f81f630c90f1"
+ hash: "0786585d11934c5e4a7e965eaac9a152"
}
Frame {
msec: 3056
- hash: "efe39545279a7bd015d2de75d2b9d8b1"
+ hash: "8271705df2ca697f4343007a7810d4ac"
}
Frame {
msec: 3072
- hash: "78926c3c0c6fcf89b9291f9902710964"
+ hash: "b98e1cd20ab2e4239f35d04df5e5175a"
}
Frame {
msec: 3088
- hash: "ea63dcb7f00d3ddede0d8be59ad9d6bc"
+ hash: "ab1a7eaa5c5d919ee76cba405d0dd4cd"
}
Frame {
msec: 3104
- hash: "286ad493301b713a49e378f123482a53"
+ hash: "52682386448379a395dc6c541224b7d4"
}
Frame {
msec: 3120
- hash: "a4bbbb8bb88188d3e99996502e3eebd1"
+ hash: "31dffcb9da94dfc085ab8c561404c248"
}
Frame {
msec: 3136
- hash: "a6100e79f3dc5af594e86ab6cd8dfb76"
+ hash: "f3703eed8ebf9ece776ebe51e4c60ae6"
}
Frame {
msec: 3152
- hash: "d9e3f777dc89bcf1b7f712206db768e2"
+ hash: "1126b90345bb42691cd17f37ecec6bdb"
}
Frame {
msec: 3168
- hash: "768045c600c0aa0b1e9e6f012733c600"
+ hash: "7a63ab96d1c8d4992c03a6f59bba4e7e"
}
Frame {
msec: 3184
- hash: "d8b4caa641ddee786f7898359efe9d07"
+ hash: "91f4a00c9a7ea6164b334aa4b90da862"
}
Frame {
msec: 3200
- hash: "f7c3b76d5bb7c263ac9447eaad685158"
+ hash: "485471140f6a5336837377612e7a85bf"
}
Frame {
msec: 3216
- hash: "f7f97db815d653ec29fa31b87f72af2a"
+ hash: "96881b4021aff05020e0a9342fbae75d"
}
Frame {
msec: 3232
- hash: "18524623762487b60943312cd8bd4388"
+ hash: "9891326646c3da4ff250aab69c862f96"
}
Frame {
msec: 3248
- hash: "5823dee5dd56e9f7515601f9629ccbae"
+ hash: "f00f36bbb5a828824c596ee6f85bec2f"
}
Frame {
msec: 3264
- hash: "5823dee5dd56e9f7515601f9629ccbae"
+ hash: "f00f36bbb5a828824c596ee6f85bec2f"
}
Frame {
msec: 3280
- hash: "5823dee5dd56e9f7515601f9629ccbae"
+ hash: "f00f36bbb5a828824c596ee6f85bec2f"
}
Frame {
msec: 3296
- hash: "5823dee5dd56e9f7515601f9629ccbae"
+ hash: "f00f36bbb5a828824c596ee6f85bec2f"
}
Frame {
msec: 3312
- hash: "18524623762487b60943312cd8bd4388"
+ hash: "9891326646c3da4ff250aab69c862f96"
}
Frame {
msec: 3328
- hash: "430995770b655054aaeda383df8e27f7"
+ hash: "c766238db55f4704c2f29a6be6ee6907"
}
Frame {
msec: 3344
- hash: "16a3a00f2b89aed676f80d63c4933ec3"
+ hash: "0254665427dcbd1c155bc954cc7aa7cd"
}
Frame {
msec: 3360
- hash: "6c55aa62079ec546522edbf69c37b270"
+ hash: "33ae1012816b997ef5c61c03ccfcc590"
}
Frame {
msec: 3376
- hash: "0d68ca3ccecdd831013950cc7405e46e"
+ hash: "4c7857bbbcb9aa812fc2503af2b395cf"
}
Frame {
msec: 3392
- hash: "9da2511bc8b434218695fa74ed543439"
+ hash: "3a570e4af992d35e55923cea23c3c11b"
}
Frame {
msec: 3408
- hash: "05afdd0b99dab81a500cdc2b2f0786fe"
+ hash: "533ef554538005512ce37c73c6def722"
}
Frame {
msec: 3424
- hash: "e6f8882d146ae60bcc6ea47ff41a637b"
+ hash: "f863fa215d0642708bfa82780c766dc4"
}
Frame {
msec: 3440
- hash: "154542ed0e88321294f382501819aefc"
+ hash: "fcca3ec34521c4b9087a102ba1e47293"
}
Frame {
msec: 3456
- hash: "8f47b6980c387c5020145bf04645fd2d"
+ hash: "47d67cd74cb96b12801842b288a8b9ff"
}
Frame {
msec: 3472
- hash: "b34b055c7602f1f4e1cde875b258120c"
+ hash: "34c5ea76f297ec68cba70521caa468e4"
}
Frame {
msec: 3488
- hash: "5a697f675575f05e297d4877604b9a47"
+ hash: "7be247cc7a4032ff0478fca1a2aace8a"
}
Frame {
msec: 3504
- hash: "729dff1d1b357d19fc81804ec8940d0e"
+ hash: "3ade2a1a48edef15f522b9fc016e137e"
}
Frame {
msec: 3520
- hash: "c6f3fee46baa94a6139d2ee40254b160"
+ hash: "8b37b9d123504931d82bb06f6981bade"
}
Frame {
msec: 3536
- hash: "af0e700bb8ae34834510830f8b44afdb"
+ hash: "5eb39825003f405f353f629e236b3395"
}
Frame {
msec: 3552
- hash: "9c87bb54c2dfe58c2da9194dae6f7502"
+ hash: "c4550722260c4a30ab1176c7e5cb62bf"
}
Frame {
msec: 3568
- hash: "2132356a92c75d725f9feafb8201b142"
+ hash: "bd33e3ecd4b59cd659588c0298b61095"
}
Frame {
msec: 3584
- hash: "50d855d2595eeae2bfd6aaa8c2fa0454"
+ hash: "4b3a62bff0019df7412aa2e1c07c0a23"
}
Frame {
msec: 3600
- hash: "5fde3c62d6e53a9056e3586f9dcda59e"
+ hash: "a9b98adcc3350febbb89dbf725b81436"
}
Frame {
msec: 3616
- hash: "8f04460254a1e9fb949d5165894cd92a"
+ hash: "66eb8c84e75141d1575caf7d3cbc1ceb"
}
Frame {
msec: 3632
- hash: "2b514c5e3b20d30f9c7e71092c69f081"
+ hash: "238f2b1dc5bf5b65e827c860f9ee76b5"
}
Frame {
msec: 3648
- hash: "2c1ba6224037790e15f5c0f2864ace4d"
+ hash: "6d1fed0697370b2a2163c369fe559739"
}
Frame {
msec: 3664
- hash: "0d5b8e7bd5f560888aacaf2b3c6827a8"
+ hash: "04ea478c785586d900bbe3472371bbc7"
}
Frame {
msec: 3680
- hash: "ae25004530e7df134414018e4a34780e"
+ hash: "ba429e711c9363eebfb20e641fa44c84"
}
Frame {
msec: 3696
- hash: "1a8fd9eaf9a91f1b42924f8986fbed9a"
+ hash: "0129dfba166ffcbaa15087467c864068"
}
Frame {
msec: 3712
- hash: "2ea6de2025d40ed5beeff12a5b70ccc9"
+ hash: "3fb340c874eee94e8baa1453b37c3fb5"
}
Frame {
msec: 3728
- hash: "624e417718d3cac1e4b7e4ce258ce6ea"
+ hash: "068c51d99c458f3edefe3371f46de260"
}
Frame {
msec: 3744
- hash: "8b56d29391257c7be8966af6be26ea9f"
+ hash: "dd1e04ed3d610c2712158d73ee2c5b9d"
}
Mouse {
type: 3
@@ -958,27 +958,27 @@ VisualTest {
}
Frame {
msec: 3760
- hash: "5c0d977d8b446d9191bde57335cf1062"
+ hash: "840154afb9e7e0c859c66667bb6944b6"
}
Frame {
msec: 3776
- hash: "100be2b21d069e3a5dbb694a90da4d4f"
+ hash: "239c2e33800e386b468a95341d0e23f4"
}
Frame {
msec: 3792
- hash: "caab03f6c81080dd8fdbedb4e94ae4a5"
+ hash: "0a00515f2d297362862c1a5cf6519845"
}
Frame {
msec: 3808
- hash: "3328a4d06f2f80a7e9ccf2ff21522fca"
+ hash: "f855df3495e44291aed8f085163c804b"
}
Frame {
msec: 3824
- hash: "a534e6cc28daf3eff6a9cf8379bd6375"
+ hash: "b4eb31e48c65550bb78d175b48e0e9fb"
}
Frame {
msec: 3840
- hash: "6686f9c1a814c6a6b785b70f94937b68"
+ hash: "70243664f9db83614e5972fc18ee81a1"
}
Frame {
msec: 3856
@@ -986,239 +986,239 @@ VisualTest {
}
Frame {
msec: 3872
- hash: "d3f1c3593375ca5c022a1361a7ec70bd"
+ hash: "c48ce2a4cf28ab706b9c097bddc74c27"
}
Frame {
msec: 3888
- hash: "67843e6192e2ecaa3820c37dc2f93106"
+ hash: "754a957e0df02839dd2fe33fefb7a721"
}
Frame {
msec: 3904
- hash: "19a022f678e5b8f4ebdff936162323dc"
+ hash: "ec3ebe7b941af9bf2163634d7f15e8aa"
}
Frame {
msec: 3920
- hash: "34e55ae70c9e156db339ae15642359c3"
+ hash: "a76423ff2184cd9dac47abf7ae52ce5a"
}
Frame {
msec: 3936
- hash: "3784778c817f9d9bb73d990cfe12685a"
+ hash: "559bec54f51c36c6e90004ca5e77c23c"
}
Frame {
msec: 3952
- hash: "0403fdf79e3ba339c7e3786db0c9c0f0"
+ hash: "dc6fdd6a867a675afcb58f7052605614"
}
Frame {
msec: 3968
- hash: "93e4a0d5645d1cfc916f1e8422655555"
+ hash: "b2fb0dbbec01490243f37fe5f80ab6c7"
}
Frame {
msec: 3984
- hash: "29080bfabb87160b7c51385fb36b474b"
+ hash: "2bc1df7a913b1948ee7bb77eeaa55aa2"
}
Frame {
msec: 4000
- hash: "9da2d83edc9d35f00fb8a159e79de4d9"
+ hash: "82c6430d85c6a94c4b55a9529d2bc78f"
}
Frame {
msec: 4016
- hash: "5505a42d4788f00cfc7499fbfda851ce"
+ hash: "463e70dc9a9bdabdc158199bdcd7d2fa"
}
Frame {
msec: 4032
- hash: "bdd3040ab16fa9ffdd2fbc66b06699f8"
+ hash: "c1e9553327f060b70caa713bf3015342"
}
Frame {
msec: 4048
- hash: "2a347e30a20c693a9440caa60ade0a0f"
+ hash: "42f7f505d4e5ef316240e4f287a039bf"
}
Frame {
msec: 4064
- hash: "0307f1857c091a639d47f112ce1a2f5a"
+ hash: "200500f600ffe43c5ad4d057bcfc0831"
}
Frame {
msec: 4080
- hash: "778d18e539bbd562ebe39283a6315df1"
+ hash: "22e78edb813f7830776b2603b0aaae5c"
}
Frame {
msec: 4096
- hash: "0369cf6c3d1f5db2e92ee1f7c5d3b8ed"
+ hash: "32ebf3490832fd0693b1b922b4501251"
}
Frame {
msec: 4112
- hash: "9f7413587ab50f1abf776bf180ec2d6f"
+ hash: "1be622caa5ef94f87e2ec8297b6e1caa"
}
Frame {
msec: 4128
- hash: "7d04a27236485808e571e8a39f23ea17"
+ hash: "d1480529e0cb94c51c412109663e5fab"
}
Frame {
msec: 4144
- hash: "a1dff63b723473d5a4c9c59975a2fb81"
+ hash: "e55e627d6d13b647f35233f18f0cbe89"
}
Frame {
msec: 4160
- hash: "9795ea70a3b9d3b7805221a58c19e5da"
+ hash: "87d7b349cd2898de7686e5f1a14f6338"
}
Frame {
msec: 4176
- hash: "f1392c489e21107136eb8e0d1e8b427e"
+ hash: "2ac974836ee5e6092b55fcda20d7c35d"
}
Frame {
msec: 4192
- hash: "95c225ef07171a96335e99078195b06a"
+ hash: "53867256c1dac4de2f02af1ae000b49f"
}
Frame {
msec: 4208
- hash: "d46ef3e7f9cec06e8c18afc0d07be4f3"
+ hash: "08623509e9e5089fdaa1af2bf9a77eb1"
}
Frame {
msec: 4224
- hash: "b017f5b51d423bb0fca0d6df3aaded8b"
+ hash: "e4692f42c12593ee865048aef00cbeb2"
}
Frame {
msec: 4240
- hash: "60584d085b0cd6fbc436773be678597e"
+ hash: "981ad6459e3e7483bb323ab4bc514630"
}
Frame {
msec: 4256
- hash: "117951465dfd5c386826b295560d2dec"
+ hash: "79e8adfcdc9d6dae0d2b6a69e8e322fa"
}
Frame {
msec: 4272
- hash: "1b70137da5f4e024593999e93121fe8b"
+ hash: "58f967a607972faa9daa13402eeb9912"
}
Frame {
msec: 4288
- hash: "bd50dffd41941fef127f39b55c4748e0"
+ hash: "1fd5b002b049132565b6a963fb7b3bb6"
}
Frame {
msec: 4304
- hash: "8eec34d8e1d2e22d11b85a671cd4d3aa"
+ hash: "a16c96598f47404ec5f4ef55e87a1e70"
}
Frame {
msec: 4320
- hash: "9e3c97cfad5002ef5f3fcc365aeb7bd0"
+ hash: "3c632899804812c93c7edd3e3f3d2bac"
}
Frame {
msec: 4336
- hash: "28e1cf1ee033915ea2ee39c9ab00a73d"
+ hash: "af0eb810e0273f9bacb082d9f90612df"
}
Frame {
msec: 4352
- hash: "99101a156a553f441f00221f6facbf1f"
+ hash: "728d7ac4a5410482c7d86d03c2d8a996"
}
Frame {
msec: 4368
- hash: "419023e5d59d16c26b35bee7d3cea559"
+ hash: "416e76064f2be71a03eddddf61a33cb0"
}
Frame {
msec: 4384
- hash: "485d23519293975b04031fe4baa5c276"
+ hash: "c41f20b4ac9a7b34eefd066f77ea351a"
}
Frame {
msec: 4400
- hash: "c8bc60735e0ede26dbaf228294853f9a"
+ hash: "821d51db415a210b09ebdf8d861aadf2"
}
Frame {
msec: 4416
- hash: "ada3680b807d59843e3adf6640704066"
+ hash: "9394266815a52f1779858bb088d557dc"
}
Frame {
msec: 4432
- hash: "3e28f3adf9241512cd0d6918d81ffffb"
+ hash: "cc475d1589665414e5aef051ec237ef4"
}
Frame {
msec: 4448
- hash: "8f339acc33cbc89ae1c62391ce021bb3"
+ hash: "a95f3b8128faa7820f36391fa9bd579f"
}
Frame {
msec: 4464
- hash: "d303960c0853a90557d64a04b8283c94"
+ hash: "d52687293a11891c364de52525039203"
}
Frame {
msec: 4480
- hash: "f907dbdacf2cfa9fdf8f9c8dead5b4c4"
+ hash: "5333dc4f65b2f1e066edcd23f7621bd7"
}
Frame {
msec: 4496
- hash: "30c6e6f283f4a3f538cdda9c2e92de8c"
+ hash: "797bb5e27b2fe2b733a54402433901b4"
}
Frame {
msec: 4512
- hash: "04d2ac55774b43107a43a7d33764199b"
+ hash: "84c610cdff7f8b04a34977216e37847d"
}
Frame {
msec: 4528
- hash: "cddf3e111cbc59e721725daa1d8a0c31"
+ hash: "0317f0406a566b2851c8bda62900e40c"
}
Frame {
msec: 4544
- hash: "15b1b63cd1695207ebf9f04387be0739"
+ hash: "6538ecd7abd35234c5cc5c2a17249fc1"
}
Frame {
msec: 4560
- hash: "690769b9bbe86a3c5b1fbdee39615fbd"
+ hash: "f9019150a132eb5f5cfafcd5337aff7a"
}
Frame {
msec: 4576
- hash: "2bd640d8ddbf878d808f22656fef1ed9"
+ hash: "0f0136fffbc65c02cee249ece4c8c0ef"
}
Frame {
msec: 4592
- hash: "a654f1e4519bf883d554276ebbe96323"
+ hash: "0027e0d236b8b33a451a0cc35e81b4ce"
}
Frame {
msec: 4608
- hash: "68f0313cfc3f51a0bb9b47c5407c19b6"
+ hash: "ac2f86b2d4f29f223fb78440d67ccd31"
}
Frame {
msec: 4624
- hash: "77f29806b084de4cabf7ab9bf1a93d5e"
+ hash: "a6eb112a10c849e337f816ee408f22a6"
}
Frame {
msec: 4640
- hash: "f9991189e3282d107b98fb0ae5f5ef00"
+ hash: "dafbb01f2615a2513310478ebe484a05"
}
Frame {
msec: 4656
- hash: "0cd1f2f6e347d48feea1b26a4968dec7"
+ hash: "17c400c4c29652dc278980ab578b75b3"
}
Frame {
msec: 4672
- hash: "e75a6f6a088e2289042572a161ffb0e9"
+ hash: "48696c02a2a4839b893a4c0b431b78a3"
}
Frame {
msec: 4688
- hash: "5a541081444c0a71128223a4c4c3144c"
+ hash: "04e05c7e722e53299d24cd0f1b7d17ee"
}
Frame {
msec: 4704
- hash: "6813d442cc610f346a5441ed0cd723e5"
+ hash: "55d158f13ffc7ccde5ee368656d2830b"
}
Frame {
msec: 4720
- hash: "24ec539bc57899819915f833f26deacd"
+ hash: "fa478e1575acedae023322a520171a5b"
}
Frame {
msec: 4736
- hash: "3a7ed1b4b533b817674aa141c420cd61"
+ hash: "e2147ddd6e19fde80bb76da24011400c"
}
Frame {
msec: 4752
- hash: "d0a643fae97bb152e97ca60e96299003"
+ hash: "44ee0144db4c55aa90d2a931d83a895e"
}
Frame {
msec: 4768
- hash: "c84093931520f4661eff6645091a294b"
+ hash: "552e87bbce4ad48006c899052a2c8cad"
}
Frame {
msec: 4784
- hash: "81e7ceaece82505a4a16ead195a66162"
+ hash: "3b6efe225303566f751c3f884ac8c069"
}
Frame {
msec: 4800
- hash: "315764d20b647f6ab1ba30239a69bf72"
+ hash: "3a7175916d1dc103506061607b910550"
}
Frame {
msec: 4816
@@ -1226,239 +1226,239 @@ VisualTest {
}
Frame {
msec: 4832
- hash: "d1824ced8af34ad9edb36a58ae9aa7f5"
+ hash: "b2e5d5c14b02a13bca62673f87e85627"
}
Frame {
msec: 4848
- hash: "167b9a49fbb94908e09e7e9c9147cd8b"
+ hash: "bd89a911d6fb13e4e841f8ee5b8b42af"
}
Frame {
msec: 4864
- hash: "442d5f0906840de526d59a80ada322c0"
+ hash: "89795784185e83d0299e656f2eec73c8"
}
Frame {
msec: 4880
- hash: "78206c4d4d23c7c1ba888b9062b09432"
+ hash: "5b6d6fe78f341bdf0eb4bedfe3d975d0"
}
Frame {
msec: 4896
- hash: "e898202cfebbff1952efc6e01254d855"
+ hash: "e246bc451ee48e16ef6dee20d6256e9c"
}
Frame {
msec: 4912
- hash: "ab31dc7bbad2b0552359866bb8d92f0c"
+ hash: "8c1bc37b1b268743aa314247ea949ef5"
}
Frame {
msec: 4928
- hash: "f093304e88964376baf9721d53d4fb49"
+ hash: "04f34203c34dc87efc708bfb232663df"
}
Frame {
msec: 4944
- hash: "3ef76f3e1c44d13c3a469bd192ff7b5d"
+ hash: "d37a48545e81970d16951e3388f0ff8c"
}
Frame {
msec: 4960
- hash: "5d3b6d0d91f8cc5b89e39407bc3b5a15"
+ hash: "9411e846c9f59cc915288efb59d4c9de"
}
Frame {
msec: 4976
- hash: "3c73573f12f49b34e1d990a55ad913fa"
+ hash: "6ee179741ac74837708afb55943f15bd"
}
Frame {
msec: 4992
- hash: "d1bac071b01a1c6fddab90cdc435fad4"
+ hash: "f626fc3166bd5b01171271ae9bfa9b22"
}
Frame {
msec: 5008
- hash: "36a219aadec910f1dbef616c641e1d2b"
+ hash: "e22898b2c0c566bbf531223234f98327"
}
Frame {
msec: 5024
- hash: "5871fc67d361cc988551592ee21dfb23"
+ hash: "1343d90c5eae70713cd49110fe61237b"
}
Frame {
msec: 5040
- hash: "6e65ee6c814b9a9da205c36925e663bf"
+ hash: "493d9322da6d01979a3f1a120c265f8c"
}
Frame {
msec: 5056
- hash: "290b20fa8e91d34000d7c2d81745f6d2"
+ hash: "defccc76caf3a7c7c67e8abf5ccc2def"
}
Frame {
msec: 5072
- hash: "19e7405a9083a8143f7bb040f8837b29"
+ hash: "fe3cad9227fcfa7ba2238465078f2ac7"
}
Frame {
msec: 5088
- hash: "c0a0fa2b4c1ceb6c70594994a1ac8713"
+ hash: "66ebfeee3a63323c7d8b949db9aafd7e"
}
Frame {
msec: 5104
- hash: "c236224c16743fb606deb78bcb8afc8d"
+ hash: "805820b382d005894f9a615004b97b0d"
}
Frame {
msec: 5120
- hash: "7d44db15eb300b4338ffc26e9bcfce20"
+ hash: "eee1620f47bb071de8a9c788d1fd258e"
}
Frame {
msec: 5136
- hash: "067a79148a194c45c6f32d85316a1e11"
+ hash: "f5a7d9a81fcfc8cfb9e7cc8ead0f1ff8"
}
Frame {
msec: 5152
- hash: "9075c379044476994a87f0fdcce8e332"
+ hash: "249903ee123090b27019350f120c8b79"
}
Frame {
msec: 5168
- hash: "b2316988fbd51096a4f512e71fe7d0a2"
+ hash: "019793a363c905809af32bf34ef52ec0"
}
Frame {
msec: 5184
- hash: "280f70877d93af5f84e178aad6a102d8"
+ hash: "4f5ad5a3ebb6eca73dd7567199d07b08"
}
Frame {
msec: 5200
- hash: "3eef4ae7e43a8cf1cd9dd562237296f8"
+ hash: "fdc1b42d50c7a5c45458498788ff0abd"
}
Frame {
msec: 5216
- hash: "e3184f77ce3a47ca4dca6386f42d7fec"
+ hash: "cc091469598cad28d0a00690f1acb412"
}
Frame {
msec: 5232
- hash: "a2a5df66fe4808ea8d466cac84ba910c"
+ hash: "5c8757e1f8f34a31d8b3717b64b84c07"
}
Frame {
msec: 5248
- hash: "9f8a0e54788112d6c30482e840504f35"
+ hash: "5da75559f60eac1b9f518ed55a174e5b"
}
Frame {
msec: 5264
- hash: "ae69cf84798844f9f360c86790feaecd"
+ hash: "1214c08daec4dcfb27690fdc18f2ac28"
}
Frame {
msec: 5280
- hash: "0244526572acb6266db5b7eb9d29c6fc"
+ hash: "87d92c1ba694d0cf187d8616b0f622f0"
}
Frame {
msec: 5296
- hash: "8fb53d60b95ddb5aef27442934ea9983"
+ hash: "d4af63638fe69b6c4f087a935351057e"
}
Frame {
msec: 5312
- hash: "930fcfde491b4f5681e3861764003895"
+ hash: "0573c41f34c2c117cada987e4ee813a5"
}
Frame {
msec: 5328
- hash: "bcdcd0a637112d113ebe11dc18823237"
+ hash: "f179ef4b7bf0f915e25ffd8168a9126f"
}
Frame {
msec: 5344
- hash: "65a564d5a5afbc14c0cdad4d52753507"
+ hash: "1618bf7c94e7898392eb5ffbf44b8aff"
}
Frame {
msec: 5360
- hash: "0c5056d438d2d54938f31ef5f996673a"
+ hash: "5af24b902e3729d544f70c77e189b8a7"
}
Frame {
msec: 5376
- hash: "11c157ad2236fc390ffbdf339366cbc1"
+ hash: "4e5789404e58113cc2d8aa737a03ab58"
}
Frame {
msec: 5392
- hash: "6cb341b1f281a97a35c2e41bfd4c4d9d"
+ hash: "e4bf91a249e47597e959bbaf25f0724d"
}
Frame {
msec: 5408
- hash: "553a945f7f19f70ddae4ebe88e52a79b"
+ hash: "39a3e3d6269522ed57a0e37319ab94d5"
}
Frame {
msec: 5424
- hash: "d10b42b4095a2474e66a5a322f72e936"
+ hash: "f2e2e47922e7e058e14537a0455cd77f"
}
Frame {
msec: 5440
- hash: "0f943d61e8072d70eddee8aa1ba0de5a"
+ hash: "64abb3f2c9e05fd1dd7490d11c74f06a"
}
Frame {
msec: 5456
- hash: "3df18e237b666e78d57857739b759e6d"
+ hash: "a9bf45c29536ca34c42aa916747b485b"
}
Frame {
msec: 5472
- hash: "1ddc0bfdb2ca7b6dee63f1024e62f26e"
+ hash: "da21839b6635e5c4e0a589d163e62752"
}
Frame {
msec: 5488
- hash: "aaa397714528f41238059e3a88833abc"
+ hash: "f31e49258bcbb2a144daa320e4567df1"
}
Frame {
msec: 5504
- hash: "c94bd69f925c782656afc5f9618180a6"
+ hash: "f96c5b39f94bf2ac1e3f4de96767d720"
}
Frame {
msec: 5520
- hash: "824ff8c0e1ab43e3c0eaa79b7cc19b9c"
+ hash: "281b90d1056803093cc37f30465f0e73"
}
Frame {
msec: 5536
- hash: "6c440a0b2293811335bdbf2c4f25f47d"
+ hash: "d63a2424e1947328957ad8f5f0bec043"
}
Frame {
msec: 5552
- hash: "bfc7936cdf833d5b720ec9baca740112"
+ hash: "bd510a0de7df02b1b5741824b6f90944"
}
Frame {
msec: 5568
- hash: "375fa305dbae2872dc9b20e59381cc0c"
+ hash: "47dc4e5ff91cb84c89dd0fc0459f75f2"
}
Frame {
msec: 5584
- hash: "fffd6173aa49e74164dc17a238bcd830"
+ hash: "4bc46b5e116dd30e1db4d4bb650ed6ed"
}
Frame {
msec: 5600
- hash: "44d9007e00fab161fd393b653255d7f4"
+ hash: "c6964b89f1962f120028057d1c588694"
}
Frame {
msec: 5616
- hash: "f669ee25c58b4fa20a01705d334f0065"
+ hash: "39a77544a1c88b68cb63da9a8910a35e"
}
Frame {
msec: 5632
- hash: "2dbb7d57711b67d5d9e1b81f70e22d34"
+ hash: "bd8ac21d7a507a8e195437ccac254ecc"
}
Frame {
msec: 5648
- hash: "19351b91448265cb95c1670ee283c611"
+ hash: "7b39b2667a8f8efae20ec8696e35dbc4"
}
Frame {
msec: 5664
- hash: "19351b91448265cb95c1670ee283c611"
+ hash: "7b39b2667a8f8efae20ec8696e35dbc4"
}
Frame {
msec: 5680
- hash: "3a24b99d048348a21f4e4bd69393de89"
+ hash: "8628f4f24670d17965fec40a02e0196f"
}
Frame {
msec: 5696
- hash: "35a6fe955a52950bbfa954a453e4008e"
+ hash: "515903d9896a853cb18cc7b7c45c1cce"
}
Frame {
msec: 5712
- hash: "896f4ec28c976237b34fb2725a44460e"
+ hash: "b7a3f70bedcb3f90a2e294b447e05f70"
}
Frame {
msec: 5728
- hash: "ed3008ea950ec84c57518e573ea36d15"
+ hash: "8e8b104ef82b1e219021aa38276f8b45"
}
Frame {
msec: 5744
- hash: "3447c7be992759f772c1db2033eead99"
+ hash: "70abe79da860bebd2d17a8c7abb20b4e"
}
Frame {
msec: 5760
- hash: "b7133225daa03563d3f5b1dac5f56a23"
+ hash: "d99af176fb6cf9d9cbcf7cf4286a165c"
}
Frame {
msec: 5776
@@ -1466,239 +1466,239 @@ VisualTest {
}
Frame {
msec: 5792
- hash: "adc55f2fcf312a90b025a75fa80aa079"
+ hash: "67809c7daad6716d0a664c52de9906ce"
}
Frame {
msec: 5808
- hash: "3ac85cad400d2b8e4f33798f4f6b7b42"
+ hash: "29a27fd59b7316ce305803482686ea58"
}
Frame {
msec: 5824
- hash: "1c115efd84ccbe489d24c3c521c4a61c"
+ hash: "25b9ca40d1d6208d026e5c965923f8fb"
}
Frame {
msec: 5840
- hash: "39518f1bbc0c4aba6ff517bc3dc7c279"
+ hash: "126b1542415aea11dbb35492be4f66aa"
}
Frame {
msec: 5856
- hash: "7bd28d32996f4de61c415d3217da16d0"
+ hash: "26ca7034536e0e690236797df740f19a"
}
Frame {
msec: 5872
- hash: "f5d06e25d775bf8db07e95625a712733"
+ hash: "fec9db60af63a4712b0da037cf1d89cd"
}
Frame {
msec: 5888
- hash: "4820ea6ea3be88af2f86111c547a19d7"
+ hash: "d9b7e2729c75ca0c0f33b542525c4880"
}
Frame {
msec: 5904
- hash: "fa6e681c368118b7f135a47ae8fc12ff"
+ hash: "89149d16b893ea432b6d0fb05ead48cb"
}
Frame {
msec: 5920
- hash: "f6b30e618aeeb837d2b3eca270b0a060"
+ hash: "8e389d2ca706277ce06e1da557e2e6c1"
}
Frame {
msec: 5936
- hash: "ac8504bde8d3063a8bf02b9d4b69d755"
+ hash: "fc5c74473410da1ddd451c5901572172"
}
Frame {
msec: 5952
- hash: "9670537bb77caa8e23fda7bbfa96ca60"
+ hash: "54514970eadff9362d31499a737e4c95"
}
Frame {
msec: 5968
- hash: "8cd292865ce5c1d240e9ddc93881a0ed"
+ hash: "d5953bc29532ec49c20ee552c8756ba1"
}
Frame {
msec: 5984
- hash: "de112013e526203d151c46e6cfba9f92"
+ hash: "5f03be3ed5824e6a6f8f371ce6a47997"
}
Frame {
msec: 6000
- hash: "cd61066e697de8c055aaa168791c2d8c"
+ hash: "0431e2ec4765167d0099c59df400f3fd"
}
Frame {
msec: 6016
- hash: "cd61066e697de8c055aaa168791c2d8c"
+ hash: "0431e2ec4765167d0099c59df400f3fd"
}
Frame {
msec: 6032
- hash: "e68b27ff14aac03c827fd43ac488d23e"
+ hash: "403e1f235770f2b7c8b1b2e86aea69a5"
}
Frame {
msec: 6048
- hash: "e68b27ff14aac03c827fd43ac488d23e"
+ hash: "403e1f235770f2b7c8b1b2e86aea69a5"
}
Frame {
msec: 6064
- hash: "1f61d857a8c26587fbda5895c603441a"
+ hash: "32ff9f959598972f5a264418587dca1f"
}
Frame {
msec: 6080
- hash: "1e0dffdd02e05ade1ae444427d4aa345"
+ hash: "b4c7c07e52a684f7ce21e47a4d66356a"
}
Frame {
msec: 6096
- hash: "9a416ee7a1de9ac45ab2d609233c9520"
+ hash: "e0f214bed2c3a31f473952929b8f3ea9"
}
Frame {
msec: 6112
- hash: "dfa35bf1cd908011c3214a506bcbdcb8"
+ hash: "15328b8a205965f3f29fc63a6a8ac8ed"
}
Frame {
msec: 6128
- hash: "bd502dc72dce4af3036f7af9ed7cf9e9"
+ hash: "72c46ed63633e6879373f4783df25d8b"
}
Frame {
msec: 6144
- hash: "8cd5edce652013a2ed4bf95693259538"
+ hash: "ae73e0adbdaacc648c2e97840cef4194"
}
Frame {
msec: 6160
- hash: "a38ed1532a40210ad7da4c0d4d1a7195"
+ hash: "df9451c6634d72e6f794e962b3591086"
}
Frame {
msec: 6176
- hash: "8ac8a8df937da526bbffb9a3590d89ac"
+ hash: "773e10bbd133e64457e7ddbc73a10fc2"
}
Frame {
msec: 6192
- hash: "07527cb9a4494e11f4c9f99eb72598b9"
+ hash: "c79abb97eb86761b69053d77156dffd4"
}
Frame {
msec: 6208
- hash: "655b0327ef0f8711810714ba50f2f8cc"
+ hash: "d927934b19ffd55ea7cea1916983351a"
}
Frame {
msec: 6224
- hash: "4c1ce8b4eb16c69614e2560c04ad48cf"
+ hash: "ae5058d935c1e44d103be66921b19e77"
}
Frame {
msec: 6240
- hash: "7a382ae4e6a48826eaa2c83ee7a73fb2"
+ hash: "b6a1446b6be054d5785ba52ac23f8aa8"
}
Frame {
msec: 6256
- hash: "5acd5f250c5b32d9006ed68dfecbfa1c"
+ hash: "3dffbffded44249fdbe58aecd24ab97f"
}
Frame {
msec: 6272
- hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1"
+ hash: "56445ab8554a23a786b70e4fd9f40451"
}
Frame {
msec: 6288
- hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1"
+ hash: "56445ab8554a23a786b70e4fd9f40451"
}
Frame {
msec: 6304
- hash: "07e5f1277558bfe7638b00cf9d967baf"
+ hash: "257ce16f529b99f28beb2e57625f52ee"
}
Frame {
msec: 6320
- hash: "07e5f1277558bfe7638b00cf9d967baf"
+ hash: "257ce16f529b99f28beb2e57625f52ee"
}
Frame {
msec: 6336
- hash: "07e5f1277558bfe7638b00cf9d967baf"
+ hash: "257ce16f529b99f28beb2e57625f52ee"
}
Frame {
msec: 6352
- hash: "07e5f1277558bfe7638b00cf9d967baf"
+ hash: "257ce16f529b99f28beb2e57625f52ee"
}
Frame {
msec: 6368
- hash: "07e5f1277558bfe7638b00cf9d967baf"
+ hash: "257ce16f529b99f28beb2e57625f52ee"
}
Frame {
msec: 6384
- hash: "877aca1c64e588845329ca8a38222604"
+ hash: "cb2b0ddbc7b8485fbf32a537e5a98d0e"
}
Frame {
msec: 6400
- hash: "877aca1c64e588845329ca8a38222604"
+ hash: "cb2b0ddbc7b8485fbf32a537e5a98d0e"
}
Frame {
msec: 6416
- hash: "877aca1c64e588845329ca8a38222604"
+ hash: "cb2b0ddbc7b8485fbf32a537e5a98d0e"
}
Frame {
msec: 6432
- hash: "877aca1c64e588845329ca8a38222604"
+ hash: "cb2b0ddbc7b8485fbf32a537e5a98d0e"
}
Frame {
msec: 6448
- hash: "877aca1c64e588845329ca8a38222604"
+ hash: "cb2b0ddbc7b8485fbf32a537e5a98d0e"
}
Frame {
msec: 6464
- hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ hash: "fa87436d5e51122022a005d815f97c32"
}
Frame {
msec: 6480
- hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ hash: "fa87436d5e51122022a005d815f97c32"
}
Frame {
msec: 6496
- hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ hash: "fa87436d5e51122022a005d815f97c32"
}
Frame {
msec: 6512
- hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ hash: "fa87436d5e51122022a005d815f97c32"
}
Frame {
msec: 6528
- hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ hash: "fa87436d5e51122022a005d815f97c32"
}
Frame {
msec: 6544
- hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ hash: "fa87436d5e51122022a005d815f97c32"
}
Frame {
msec: 6560
- hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ hash: "fa87436d5e51122022a005d815f97c32"
}
Frame {
msec: 6576
- hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ hash: "fa87436d5e51122022a005d815f97c32"
}
Frame {
msec: 6592
- hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ hash: "fa87436d5e51122022a005d815f97c32"
}
Frame {
msec: 6608
- hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ hash: "fa87436d5e51122022a005d815f97c32"
}
Frame {
msec: 6624
- hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ hash: "fa87436d5e51122022a005d815f97c32"
}
Frame {
msec: 6640
- hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ hash: "fa87436d5e51122022a005d815f97c32"
}
Frame {
msec: 6656
- hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ hash: "fa87436d5e51122022a005d815f97c32"
}
Frame {
msec: 6672
- hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ hash: "fa87436d5e51122022a005d815f97c32"
}
Frame {
msec: 6688
- hash: "b0f28e923f93dcdcea8460ca9d8cd674"
+ hash: "fa87436d5e51122022a005d815f97c32"
}
Frame {
msec: 6704
- hash: "228920e994ebf71d542c71ce8263614e"
+ hash: "da52e87ccd157c0330c07e480b8b0c06"
}
Frame {
msec: 6720
- hash: "228920e994ebf71d542c71ce8263614e"
+ hash: "da52e87ccd157c0330c07e480b8b0c06"
}
Frame {
msec: 6736
@@ -1706,58 +1706,58 @@ VisualTest {
}
Frame {
msec: 6752
- hash: "228920e994ebf71d542c71ce8263614e"
+ hash: "da52e87ccd157c0330c07e480b8b0c06"
}
Frame {
msec: 6768
- hash: "228920e994ebf71d542c71ce8263614e"
+ hash: "da52e87ccd157c0330c07e480b8b0c06"
}
Frame {
msec: 6784
- hash: "228920e994ebf71d542c71ce8263614e"
+ hash: "da52e87ccd157c0330c07e480b8b0c06"
}
Frame {
msec: 6800
- hash: "228920e994ebf71d542c71ce8263614e"
+ hash: "da52e87ccd157c0330c07e480b8b0c06"
}
Frame {
msec: 6816
- hash: "228920e994ebf71d542c71ce8263614e"
+ hash: "da52e87ccd157c0330c07e480b8b0c06"
}
Frame {
msec: 6832
- hash: "07e5f1277558bfe7638b00cf9d967baf"
+ hash: "257ce16f529b99f28beb2e57625f52ee"
}
Key {
type: 6
key: 16777249
- modifiers: 67108864
+ modifiers: 0
text: ""
autorep: false
count: 1
}
Frame {
msec: 6848
- hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1"
+ hash: "56445ab8554a23a786b70e4fd9f40451"
}
Frame {
msec: 6864
- hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1"
+ hash: "56445ab8554a23a786b70e4fd9f40451"
}
Frame {
msec: 6880
- hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1"
+ hash: "56445ab8554a23a786b70e4fd9f40451"
}
Frame {
msec: 6896
- hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1"
+ hash: "56445ab8554a23a786b70e4fd9f40451"
}
Frame {
msec: 6912
- hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1"
+ hash: "56445ab8554a23a786b70e4fd9f40451"
}
Frame {
msec: 6928
- hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1"
+ hash: "56445ab8554a23a786b70e4fd9f40451"
}
}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.0.png
index 87bc640..1b808ef 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.qml
index f56f498..5485174 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.qml
@@ -10,238 +10,238 @@ VisualTest {
}
Frame {
msec: 32
- hash: "7fb2062f5786da9323db4286688682a0"
+ hash: "3fc7ab44f913d350f7aef342b958e56d"
}
Frame {
msec: 48
- hash: "7fb2062f5786da9323db4286688682a0"
+ hash: "3fc7ab44f913d350f7aef342b958e56d"
}
Frame {
msec: 64
- hash: "7fb2062f5786da9323db4286688682a0"
+ hash: "3fc7ab44f913d350f7aef342b958e56d"
}
Frame {
msec: 80
- hash: "7fb2062f5786da9323db4286688682a0"
+ hash: "3fc7ab44f913d350f7aef342b958e56d"
}
Frame {
msec: 96
- hash: "7fb2062f5786da9323db4286688682a0"
+ hash: "3fc7ab44f913d350f7aef342b958e56d"
}
Frame {
msec: 112
- hash: "7fb2062f5786da9323db4286688682a0"
+ hash: "3fc7ab44f913d350f7aef342b958e56d"
}
Frame {
msec: 128
- hash: "7fb2062f5786da9323db4286688682a0"
+ hash: "3fc7ab44f913d350f7aef342b958e56d"
}
Frame {
msec: 144
- hash: "7fb2062f5786da9323db4286688682a0"
+ hash: "3fc7ab44f913d350f7aef342b958e56d"
}
Frame {
msec: 160
- hash: "7fb2062f5786da9323db4286688682a0"
+ hash: "3fc7ab44f913d350f7aef342b958e56d"
}
Frame {
msec: 176
- hash: "c67a5ae840827487ab618ff2d4e9a056"
+ hash: "a495a8a95c8aa82ac437c2f2970bd42d"
}
Frame {
msec: 192
- hash: "c67a5ae840827487ab618ff2d4e9a056"
+ hash: "a495a8a95c8aa82ac437c2f2970bd42d"
}
Frame {
msec: 208
- hash: "c67a5ae840827487ab618ff2d4e9a056"
+ hash: "a495a8a95c8aa82ac437c2f2970bd42d"
}
Frame {
msec: 224
- hash: "c67a5ae840827487ab618ff2d4e9a056"
+ hash: "a495a8a95c8aa82ac437c2f2970bd42d"
}
Frame {
msec: 240
- hash: "c67a5ae840827487ab618ff2d4e9a056"
+ hash: "a495a8a95c8aa82ac437c2f2970bd42d"
}
Frame {
msec: 256
- hash: "c67a5ae840827487ab618ff2d4e9a056"
+ hash: "a495a8a95c8aa82ac437c2f2970bd42d"
}
Frame {
msec: 272
- hash: "c67a5ae840827487ab618ff2d4e9a056"
+ hash: "a495a8a95c8aa82ac437c2f2970bd42d"
}
Frame {
msec: 288
- hash: "c67a5ae840827487ab618ff2d4e9a056"
+ hash: "a495a8a95c8aa82ac437c2f2970bd42d"
}
Frame {
msec: 304
- hash: "c67a5ae840827487ab618ff2d4e9a056"
+ hash: "a495a8a95c8aa82ac437c2f2970bd42d"
}
Frame {
msec: 320
- hash: "c67a5ae840827487ab618ff2d4e9a056"
+ hash: "a495a8a95c8aa82ac437c2f2970bd42d"
}
Frame {
msec: 336
- hash: "c7986aca05835e238ee95be063bdd032"
+ hash: "e2d2a6e60537b9a434d0029ef5ff26dc"
}
Frame {
msec: 352
- hash: "c7986aca05835e238ee95be063bdd032"
+ hash: "e2d2a6e60537b9a434d0029ef5ff26dc"
}
Frame {
msec: 368
- hash: "c7986aca05835e238ee95be063bdd032"
+ hash: "e2d2a6e60537b9a434d0029ef5ff26dc"
}
Frame {
msec: 384
- hash: "c7986aca05835e238ee95be063bdd032"
+ hash: "e2d2a6e60537b9a434d0029ef5ff26dc"
}
Frame {
msec: 400
- hash: "c7986aca05835e238ee95be063bdd032"
+ hash: "e2d2a6e60537b9a434d0029ef5ff26dc"
}
Frame {
msec: 416
- hash: "c7986aca05835e238ee95be063bdd032"
+ hash: "e2d2a6e60537b9a434d0029ef5ff26dc"
}
Frame {
msec: 432
- hash: "c7986aca05835e238ee95be063bdd032"
+ hash: "e2d2a6e60537b9a434d0029ef5ff26dc"
}
Frame {
msec: 448
- hash: "c7986aca05835e238ee95be063bdd032"
+ hash: "e2d2a6e60537b9a434d0029ef5ff26dc"
}
Frame {
msec: 464
- hash: "c7986aca05835e238ee95be063bdd032"
+ hash: "e2d2a6e60537b9a434d0029ef5ff26dc"
}
Frame {
msec: 480
- hash: "c7986aca05835e238ee95be063bdd032"
+ hash: "e2d2a6e60537b9a434d0029ef5ff26dc"
}
Frame {
msec: 496
- hash: "dd8ee9c060450beef6cc2494fa463e0a"
+ hash: "00cba961e67c2124ace75dddb657cd6c"
}
Frame {
msec: 512
- hash: "dd8ee9c060450beef6cc2494fa463e0a"
+ hash: "00cba961e67c2124ace75dddb657cd6c"
}
Frame {
msec: 528
- hash: "dd8ee9c060450beef6cc2494fa463e0a"
+ hash: "00cba961e67c2124ace75dddb657cd6c"
}
Frame {
msec: 544
- hash: "dd8ee9c060450beef6cc2494fa463e0a"
+ hash: "00cba961e67c2124ace75dddb657cd6c"
}
Frame {
msec: 560
- hash: "dd8ee9c060450beef6cc2494fa463e0a"
+ hash: "00cba961e67c2124ace75dddb657cd6c"
}
Frame {
msec: 576
- hash: "dd8ee9c060450beef6cc2494fa463e0a"
+ hash: "00cba961e67c2124ace75dddb657cd6c"
}
Frame {
msec: 592
- hash: "dd8ee9c060450beef6cc2494fa463e0a"
+ hash: "00cba961e67c2124ace75dddb657cd6c"
}
Frame {
msec: 608
- hash: "dd8ee9c060450beef6cc2494fa463e0a"
+ hash: "00cba961e67c2124ace75dddb657cd6c"
}
Frame {
msec: 624
- hash: "dd8ee9c060450beef6cc2494fa463e0a"
+ hash: "00cba961e67c2124ace75dddb657cd6c"
}
Frame {
msec: 640
- hash: "dd8ee9c060450beef6cc2494fa463e0a"
+ hash: "00cba961e67c2124ace75dddb657cd6c"
}
Frame {
msec: 656
- hash: "f55ebe08f1b538d085cda157f566859e"
+ hash: "31d518de83e195def2d957b7d86b98e5"
}
Frame {
msec: 672
- hash: "f55ebe08f1b538d085cda157f566859e"
+ hash: "31d518de83e195def2d957b7d86b98e5"
}
Frame {
msec: 688
- hash: "f55ebe08f1b538d085cda157f566859e"
+ hash: "31d518de83e195def2d957b7d86b98e5"
}
Frame {
msec: 704
- hash: "f55ebe08f1b538d085cda157f566859e"
+ hash: "31d518de83e195def2d957b7d86b98e5"
}
Frame {
msec: 720
- hash: "f55ebe08f1b538d085cda157f566859e"
+ hash: "31d518de83e195def2d957b7d86b98e5"
}
Frame {
msec: 736
- hash: "f55ebe08f1b538d085cda157f566859e"
+ hash: "31d518de83e195def2d957b7d86b98e5"
}
Frame {
msec: 752
- hash: "f55ebe08f1b538d085cda157f566859e"
+ hash: "31d518de83e195def2d957b7d86b98e5"
}
Frame {
msec: 768
- hash: "f55ebe08f1b538d085cda157f566859e"
+ hash: "31d518de83e195def2d957b7d86b98e5"
}
Frame {
msec: 784
- hash: "f55ebe08f1b538d085cda157f566859e"
+ hash: "31d518de83e195def2d957b7d86b98e5"
}
Frame {
msec: 800
- hash: "f55ebe08f1b538d085cda157f566859e"
+ hash: "31d518de83e195def2d957b7d86b98e5"
}
Frame {
msec: 816
- hash: "f55ebe08f1b538d085cda157f566859e"
+ hash: "31d518de83e195def2d957b7d86b98e5"
}
Frame {
msec: 832
- hash: "f55ebe08f1b538d085cda157f566859e"
+ hash: "31d518de83e195def2d957b7d86b98e5"
}
Frame {
msec: 848
- hash: "f55ebe08f1b538d085cda157f566859e"
+ hash: "31d518de83e195def2d957b7d86b98e5"
}
Frame {
msec: 864
- hash: "f55ebe08f1b538d085cda157f566859e"
+ hash: "31d518de83e195def2d957b7d86b98e5"
}
Frame {
msec: 880
- hash: "f55ebe08f1b538d085cda157f566859e"
+ hash: "31d518de83e195def2d957b7d86b98e5"
}
Frame {
msec: 896
- hash: "f55ebe08f1b538d085cda157f566859e"
+ hash: "31d518de83e195def2d957b7d86b98e5"
}
Frame {
msec: 912
- hash: "f55ebe08f1b538d085cda157f566859e"
+ hash: "31d518de83e195def2d957b7d86b98e5"
}
Frame {
msec: 928
- hash: "f55ebe08f1b538d085cda157f566859e"
+ hash: "31d518de83e195def2d957b7d86b98e5"
}
Frame {
msec: 944
- hash: "f55ebe08f1b538d085cda157f566859e"
+ hash: "31d518de83e195def2d957b7d86b98e5"
}
Frame {
msec: 960
- hash: "f55ebe08f1b538d085cda157f566859e"
+ hash: "31d518de83e195def2d957b7d86b98e5"
}
}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-X11/multilineAlign.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-X11/multilineAlign.0.png
index 38f2051..666d272 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-X11/multilineAlign.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-X11/multilineAlign.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-X11/multilineAlign.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-X11/multilineAlign.qml
index d431bb8..75e6859 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-X11/multilineAlign.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-X11/multilineAlign.qml
@@ -10,238 +10,238 @@ VisualTest {
}
Frame {
msec: 32
- hash: "d80fd046c582a26230e547471f290f12"
+ hash: "377fd9e347a2e6e0930d1422ce744c5c"
}
Frame {
msec: 48
- hash: "d80fd046c582a26230e547471f290f12"
+ hash: "377fd9e347a2e6e0930d1422ce744c5c"
}
Frame {
msec: 64
- hash: "d80fd046c582a26230e547471f290f12"
+ hash: "377fd9e347a2e6e0930d1422ce744c5c"
}
Frame {
msec: 80
- hash: "d80fd046c582a26230e547471f290f12"
+ hash: "377fd9e347a2e6e0930d1422ce744c5c"
}
Frame {
msec: 96
- hash: "d80fd046c582a26230e547471f290f12"
+ hash: "377fd9e347a2e6e0930d1422ce744c5c"
}
Frame {
msec: 112
- hash: "d80fd046c582a26230e547471f290f12"
+ hash: "377fd9e347a2e6e0930d1422ce744c5c"
}
Frame {
msec: 128
- hash: "d80fd046c582a26230e547471f290f12"
+ hash: "377fd9e347a2e6e0930d1422ce744c5c"
}
Frame {
msec: 144
- hash: "d80fd046c582a26230e547471f290f12"
+ hash: "377fd9e347a2e6e0930d1422ce744c5c"
}
Frame {
msec: 160
- hash: "d80fd046c582a26230e547471f290f12"
+ hash: "377fd9e347a2e6e0930d1422ce744c5c"
}
Frame {
msec: 176
- hash: "f9e466557e920150c638621536d94e5b"
+ hash: "36106ba13106d262c02c67e82bba1443"
}
Frame {
msec: 192
- hash: "f9e466557e920150c638621536d94e5b"
+ hash: "36106ba13106d262c02c67e82bba1443"
}
Frame {
msec: 208
- hash: "f9e466557e920150c638621536d94e5b"
+ hash: "36106ba13106d262c02c67e82bba1443"
}
Frame {
msec: 224
- hash: "f9e466557e920150c638621536d94e5b"
+ hash: "36106ba13106d262c02c67e82bba1443"
}
Frame {
msec: 240
- hash: "f9e466557e920150c638621536d94e5b"
+ hash: "36106ba13106d262c02c67e82bba1443"
}
Frame {
msec: 256
- hash: "f9e466557e920150c638621536d94e5b"
+ hash: "36106ba13106d262c02c67e82bba1443"
}
Frame {
msec: 272
- hash: "f9e466557e920150c638621536d94e5b"
+ hash: "36106ba13106d262c02c67e82bba1443"
}
Frame {
msec: 288
- hash: "f9e466557e920150c638621536d94e5b"
+ hash: "36106ba13106d262c02c67e82bba1443"
}
Frame {
msec: 304
- hash: "f9e466557e920150c638621536d94e5b"
+ hash: "36106ba13106d262c02c67e82bba1443"
}
Frame {
msec: 320
- hash: "f9e466557e920150c638621536d94e5b"
+ hash: "36106ba13106d262c02c67e82bba1443"
}
Frame {
msec: 336
- hash: "40b5718a9370c332f254a3ead05dfe5b"
+ hash: "509d31a486ae2f83055b52ec12f33e76"
}
Frame {
msec: 352
- hash: "40b5718a9370c332f254a3ead05dfe5b"
+ hash: "509d31a486ae2f83055b52ec12f33e76"
}
Frame {
msec: 368
- hash: "40b5718a9370c332f254a3ead05dfe5b"
+ hash: "509d31a486ae2f83055b52ec12f33e76"
}
Frame {
msec: 384
- hash: "40b5718a9370c332f254a3ead05dfe5b"
+ hash: "509d31a486ae2f83055b52ec12f33e76"
}
Frame {
msec: 400
- hash: "40b5718a9370c332f254a3ead05dfe5b"
+ hash: "509d31a486ae2f83055b52ec12f33e76"
}
Frame {
msec: 416
- hash: "40b5718a9370c332f254a3ead05dfe5b"
+ hash: "509d31a486ae2f83055b52ec12f33e76"
}
Frame {
msec: 432
- hash: "40b5718a9370c332f254a3ead05dfe5b"
+ hash: "509d31a486ae2f83055b52ec12f33e76"
}
Frame {
msec: 448
- hash: "40b5718a9370c332f254a3ead05dfe5b"
+ hash: "509d31a486ae2f83055b52ec12f33e76"
}
Frame {
msec: 464
- hash: "40b5718a9370c332f254a3ead05dfe5b"
+ hash: "509d31a486ae2f83055b52ec12f33e76"
}
Frame {
msec: 480
- hash: "40b5718a9370c332f254a3ead05dfe5b"
+ hash: "509d31a486ae2f83055b52ec12f33e76"
}
Frame {
msec: 496
- hash: "3249c560c69e915020f9632acd1c5eca"
+ hash: "09b9249750ba637ef659cbc7b9a6055f"
}
Frame {
msec: 512
- hash: "3249c560c69e915020f9632acd1c5eca"
+ hash: "09b9249750ba637ef659cbc7b9a6055f"
}
Frame {
msec: 528
- hash: "3249c560c69e915020f9632acd1c5eca"
+ hash: "09b9249750ba637ef659cbc7b9a6055f"
}
Frame {
msec: 544
- hash: "3249c560c69e915020f9632acd1c5eca"
+ hash: "09b9249750ba637ef659cbc7b9a6055f"
}
Frame {
msec: 560
- hash: "3249c560c69e915020f9632acd1c5eca"
+ hash: "09b9249750ba637ef659cbc7b9a6055f"
}
Frame {
msec: 576
- hash: "3249c560c69e915020f9632acd1c5eca"
+ hash: "09b9249750ba637ef659cbc7b9a6055f"
}
Frame {
msec: 592
- hash: "3249c560c69e915020f9632acd1c5eca"
+ hash: "09b9249750ba637ef659cbc7b9a6055f"
}
Frame {
msec: 608
- hash: "3249c560c69e915020f9632acd1c5eca"
+ hash: "09b9249750ba637ef659cbc7b9a6055f"
}
Frame {
msec: 624
- hash: "3249c560c69e915020f9632acd1c5eca"
+ hash: "09b9249750ba637ef659cbc7b9a6055f"
}
Frame {
msec: 640
- hash: "3249c560c69e915020f9632acd1c5eca"
+ hash: "09b9249750ba637ef659cbc7b9a6055f"
}
Frame {
msec: 656
- hash: "2df61c56ba08ef258a0d493760127a8d"
+ hash: "1ac7017fcf7c9775b66ed1fb78930a45"
}
Frame {
msec: 672
- hash: "2df61c56ba08ef258a0d493760127a8d"
+ hash: "1ac7017fcf7c9775b66ed1fb78930a45"
}
Frame {
msec: 688
- hash: "2df61c56ba08ef258a0d493760127a8d"
+ hash: "1ac7017fcf7c9775b66ed1fb78930a45"
}
Frame {
msec: 704
- hash: "2df61c56ba08ef258a0d493760127a8d"
+ hash: "1ac7017fcf7c9775b66ed1fb78930a45"
}
Frame {
msec: 720
- hash: "2df61c56ba08ef258a0d493760127a8d"
+ hash: "1ac7017fcf7c9775b66ed1fb78930a45"
}
Frame {
msec: 736
- hash: "2df61c56ba08ef258a0d493760127a8d"
+ hash: "1ac7017fcf7c9775b66ed1fb78930a45"
}
Frame {
msec: 752
- hash: "2df61c56ba08ef258a0d493760127a8d"
+ hash: "1ac7017fcf7c9775b66ed1fb78930a45"
}
Frame {
msec: 768
- hash: "2df61c56ba08ef258a0d493760127a8d"
+ hash: "1ac7017fcf7c9775b66ed1fb78930a45"
}
Frame {
msec: 784
- hash: "2df61c56ba08ef258a0d493760127a8d"
+ hash: "1ac7017fcf7c9775b66ed1fb78930a45"
}
Frame {
msec: 800
- hash: "2df61c56ba08ef258a0d493760127a8d"
+ hash: "1ac7017fcf7c9775b66ed1fb78930a45"
}
Frame {
msec: 816
- hash: "2df61c56ba08ef258a0d493760127a8d"
+ hash: "1ac7017fcf7c9775b66ed1fb78930a45"
}
Frame {
msec: 832
- hash: "2df61c56ba08ef258a0d493760127a8d"
+ hash: "1ac7017fcf7c9775b66ed1fb78930a45"
}
Frame {
msec: 848
- hash: "2df61c56ba08ef258a0d493760127a8d"
+ hash: "1ac7017fcf7c9775b66ed1fb78930a45"
}
Frame {
msec: 864
- hash: "2df61c56ba08ef258a0d493760127a8d"
+ hash: "1ac7017fcf7c9775b66ed1fb78930a45"
}
Frame {
msec: 880
- hash: "2df61c56ba08ef258a0d493760127a8d"
+ hash: "1ac7017fcf7c9775b66ed1fb78930a45"
}
Frame {
msec: 896
- hash: "2df61c56ba08ef258a0d493760127a8d"
+ hash: "1ac7017fcf7c9775b66ed1fb78930a45"
}
Frame {
msec: 912
- hash: "2df61c56ba08ef258a0d493760127a8d"
+ hash: "1ac7017fcf7c9775b66ed1fb78930a45"
}
Frame {
msec: 928
- hash: "2df61c56ba08ef258a0d493760127a8d"
+ hash: "1ac7017fcf7c9775b66ed1fb78930a45"
}
Frame {
msec: 944
- hash: "2df61c56ba08ef258a0d493760127a8d"
+ hash: "1ac7017fcf7c9775b66ed1fb78930a45"
}
Frame {
msec: 960
- hash: "2df61c56ba08ef258a0d493760127a8d"
+ hash: "1ac7017fcf7c9775b66ed1fb78930a45"
}
}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.0.png
index 4b78165..1fd0213 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.qml
index 7c557e0..c5a5a76 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.qml
@@ -10,122 +10,122 @@ VisualTest {
}
Frame {
msec: 32
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 48
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 64
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 80
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 96
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 112
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 128
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 144
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 160
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 176
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 192
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 208
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 224
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 240
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 256
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 272
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 288
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 304
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 320
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 336
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 352
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 368
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 384
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 400
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 416
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 432
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 448
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 464
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 480
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
Frame {
msec: 496
- hash: "455caf06270992e3367c2a5a4371b6ac"
+ hash: "f45eda9414f7db5ed1f97a8275459abd"
}
}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-X11/parentanchor.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-X11/parentanchor.0.png
index d85498b..823199c 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-X11/parentanchor.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-X11/parentanchor.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-X11/parentanchor.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-X11/parentanchor.qml
index 26cd97b..4bf0697 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-X11/parentanchor.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-X11/parentanchor.qml
@@ -10,122 +10,122 @@ VisualTest {
}
Frame {
msec: 32
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 48
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 64
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 80
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 96
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 112
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 128
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 144
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 160
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 176
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 192
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 208
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 224
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 240
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 256
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 272
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 288
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 304
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 320
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 336
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 352
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 368
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 384
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 400
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 416
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 432
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 448
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 464
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 480
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
Frame {
msec: 496
- hash: "8e36621abce059cb8579dd04b28e8d58"
+ hash: "7e082fa05e000cc20fcda7cb61d98edd"
}
}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.0.png
new file mode 100644
index 0000000..4d6bf55
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.1.png
new file mode 100644
index 0000000..a75da16
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.qml
new file mode 100644
index 0000000..002e1c8
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.qml
@@ -0,0 +1,475 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ image: "QTBUG-14469.0.png"
+ }
+ Frame {
+ msec: 32
+ hash: "fab978e1e0ee5140d8131320ff2322e9"
+ }
+ Frame {
+ msec: 48
+ hash: "fab978e1e0ee5140d8131320ff2322e9"
+ }
+ Frame {
+ msec: 64
+ hash: "fab978e1e0ee5140d8131320ff2322e9"
+ }
+ Frame {
+ msec: 80
+ hash: "fab978e1e0ee5140d8131320ff2322e9"
+ }
+ Frame {
+ msec: 96
+ hash: "fab978e1e0ee5140d8131320ff2322e9"
+ }
+ Frame {
+ msec: 112
+ hash: "fab978e1e0ee5140d8131320ff2322e9"
+ }
+ Frame {
+ msec: 128
+ hash: "cf74324c2a0c8f45c728d42390aac1e0"
+ }
+ Frame {
+ msec: 144
+ hash: "cf74324c2a0c8f45c728d42390aac1e0"
+ }
+ Frame {
+ msec: 160
+ hash: "cf74324c2a0c8f45c728d42390aac1e0"
+ }
+ Frame {
+ msec: 176
+ hash: "cf74324c2a0c8f45c728d42390aac1e0"
+ }
+ Frame {
+ msec: 192
+ hash: "cf74324c2a0c8f45c728d42390aac1e0"
+ }
+ Frame {
+ msec: 208
+ hash: "cf74324c2a0c8f45c728d42390aac1e0"
+ }
+ Frame {
+ msec: 224
+ hash: "07c938ac9ff9f591e84fc553291c7c49"
+ }
+ Frame {
+ msec: 240
+ hash: "07c938ac9ff9f591e84fc553291c7c49"
+ }
+ Frame {
+ msec: 256
+ hash: "07c938ac9ff9f591e84fc553291c7c49"
+ }
+ Frame {
+ msec: 272
+ hash: "07c938ac9ff9f591e84fc553291c7c49"
+ }
+ Frame {
+ msec: 288
+ hash: "07c938ac9ff9f591e84fc553291c7c49"
+ }
+ Frame {
+ msec: 304
+ hash: "07c938ac9ff9f591e84fc553291c7c49"
+ }
+ Frame {
+ msec: 320
+ hash: "7b585eb6226e6ce2de355f9730dba377"
+ }
+ Frame {
+ msec: 336
+ hash: "7b585eb6226e6ce2de355f9730dba377"
+ }
+ Frame {
+ msec: 352
+ hash: "7b585eb6226e6ce2de355f9730dba377"
+ }
+ Frame {
+ msec: 368
+ hash: "7b585eb6226e6ce2de355f9730dba377"
+ }
+ Frame {
+ msec: 384
+ hash: "7b585eb6226e6ce2de355f9730dba377"
+ }
+ Frame {
+ msec: 400
+ hash: "7b585eb6226e6ce2de355f9730dba377"
+ }
+ Frame {
+ msec: 416
+ hash: "a7817a7d902ab2fe2875183feb6513dd"
+ }
+ Frame {
+ msec: 432
+ hash: "a7817a7d902ab2fe2875183feb6513dd"
+ }
+ Frame {
+ msec: 448
+ hash: "a7817a7d902ab2fe2875183feb6513dd"
+ }
+ Frame {
+ msec: 464
+ hash: "a7817a7d902ab2fe2875183feb6513dd"
+ }
+ Frame {
+ msec: 480
+ hash: "a7817a7d902ab2fe2875183feb6513dd"
+ }
+ Frame {
+ msec: 496
+ hash: "a7817a7d902ab2fe2875183feb6513dd"
+ }
+ Frame {
+ msec: 512
+ hash: "a7817a7d902ab2fe2875183feb6513dd"
+ }
+ Frame {
+ msec: 528
+ hash: "067dfe70eca44e2157b723858897c90e"
+ }
+ Frame {
+ msec: 544
+ hash: "067dfe70eca44e2157b723858897c90e"
+ }
+ Frame {
+ msec: 560
+ hash: "067dfe70eca44e2157b723858897c90e"
+ }
+ Frame {
+ msec: 576
+ hash: "067dfe70eca44e2157b723858897c90e"
+ }
+ Frame {
+ msec: 592
+ hash: "067dfe70eca44e2157b723858897c90e"
+ }
+ Frame {
+ msec: 608
+ hash: "067dfe70eca44e2157b723858897c90e"
+ }
+ Frame {
+ msec: 624
+ hash: "b1ac0015f173bf5789daa5d45d04dadd"
+ }
+ Frame {
+ msec: 640
+ hash: "b1ac0015f173bf5789daa5d45d04dadd"
+ }
+ Frame {
+ msec: 656
+ hash: "b1ac0015f173bf5789daa5d45d04dadd"
+ }
+ Frame {
+ msec: 672
+ hash: "b1ac0015f173bf5789daa5d45d04dadd"
+ }
+ Frame {
+ msec: 688
+ hash: "b1ac0015f173bf5789daa5d45d04dadd"
+ }
+ Frame {
+ msec: 704
+ hash: "b1ac0015f173bf5789daa5d45d04dadd"
+ }
+ Frame {
+ msec: 720
+ hash: "431cb09ccdcfab7c3ff7d498aa1f0816"
+ }
+ Frame {
+ msec: 736
+ hash: "431cb09ccdcfab7c3ff7d498aa1f0816"
+ }
+ Frame {
+ msec: 752
+ hash: "431cb09ccdcfab7c3ff7d498aa1f0816"
+ }
+ Frame {
+ msec: 768
+ hash: "431cb09ccdcfab7c3ff7d498aa1f0816"
+ }
+ Frame {
+ msec: 784
+ hash: "431cb09ccdcfab7c3ff7d498aa1f0816"
+ }
+ Frame {
+ msec: 800
+ hash: "431cb09ccdcfab7c3ff7d498aa1f0816"
+ }
+ Frame {
+ msec: 816
+ hash: "533b23f29fe5f9dc85a6ca390c6dd023"
+ }
+ Frame {
+ msec: 832
+ hash: "533b23f29fe5f9dc85a6ca390c6dd023"
+ }
+ Frame {
+ msec: 848
+ hash: "533b23f29fe5f9dc85a6ca390c6dd023"
+ }
+ Frame {
+ msec: 864
+ hash: "533b23f29fe5f9dc85a6ca390c6dd023"
+ }
+ Frame {
+ msec: 880
+ hash: "533b23f29fe5f9dc85a6ca390c6dd023"
+ }
+ Frame {
+ msec: 896
+ hash: "533b23f29fe5f9dc85a6ca390c6dd023"
+ }
+ Frame {
+ msec: 912
+ hash: "533b23f29fe5f9dc85a6ca390c6dd023"
+ }
+ Frame {
+ msec: 928
+ hash: "cd397908009ddf16ec3101efb0d7468e"
+ }
+ Frame {
+ msec: 944
+ hash: "cd397908009ddf16ec3101efb0d7468e"
+ }
+ Frame {
+ msec: 960
+ hash: "cd397908009ddf16ec3101efb0d7468e"
+ }
+ Frame {
+ msec: 976
+ image: "QTBUG-14469.1.png"
+ }
+ Frame {
+ msec: 992
+ hash: "cd397908009ddf16ec3101efb0d7468e"
+ }
+ Frame {
+ msec: 1008
+ hash: "cd397908009ddf16ec3101efb0d7468e"
+ }
+ Frame {
+ msec: 1024
+ hash: "a1eebf1a97314851b5154802f05abe8d"
+ }
+ Frame {
+ msec: 1040
+ hash: "a1eebf1a97314851b5154802f05abe8d"
+ }
+ Frame {
+ msec: 1056
+ hash: "a1eebf1a97314851b5154802f05abe8d"
+ }
+ Frame {
+ msec: 1072
+ hash: "a1eebf1a97314851b5154802f05abe8d"
+ }
+ Frame {
+ msec: 1088
+ hash: "a1eebf1a97314851b5154802f05abe8d"
+ }
+ Frame {
+ msec: 1104
+ hash: "a1eebf1a97314851b5154802f05abe8d"
+ }
+ Frame {
+ msec: 1120
+ hash: "71d91d85b9c555eb9b39dac79b35dd46"
+ }
+ Frame {
+ msec: 1136
+ hash: "71d91d85b9c555eb9b39dac79b35dd46"
+ }
+ Frame {
+ msec: 1152
+ hash: "71d91d85b9c555eb9b39dac79b35dd46"
+ }
+ Frame {
+ msec: 1168
+ hash: "71d91d85b9c555eb9b39dac79b35dd46"
+ }
+ Frame {
+ msec: 1184
+ hash: "71d91d85b9c555eb9b39dac79b35dd46"
+ }
+ Frame {
+ msec: 1200
+ hash: "71d91d85b9c555eb9b39dac79b35dd46"
+ }
+ Frame {
+ msec: 1216
+ hash: "b1da2d1f4aad2a197a80788607bd867d"
+ }
+ Frame {
+ msec: 1232
+ hash: "b1da2d1f4aad2a197a80788607bd867d"
+ }
+ Frame {
+ msec: 1248
+ hash: "b1da2d1f4aad2a197a80788607bd867d"
+ }
+ Frame {
+ msec: 1264
+ hash: "b1da2d1f4aad2a197a80788607bd867d"
+ }
+ Frame {
+ msec: 1280
+ hash: "b1da2d1f4aad2a197a80788607bd867d"
+ }
+ Frame {
+ msec: 1296
+ hash: "b1da2d1f4aad2a197a80788607bd867d"
+ }
+ Frame {
+ msec: 1312
+ hash: "b1da2d1f4aad2a197a80788607bd867d"
+ }
+ Frame {
+ msec: 1328
+ hash: "df14e9cfeba3850bae7cad111fdbc8df"
+ }
+ Frame {
+ msec: 1344
+ hash: "df14e9cfeba3850bae7cad111fdbc8df"
+ }
+ Frame {
+ msec: 1360
+ hash: "df14e9cfeba3850bae7cad111fdbc8df"
+ }
+ Frame {
+ msec: 1376
+ hash: "df14e9cfeba3850bae7cad111fdbc8df"
+ }
+ Frame {
+ msec: 1392
+ hash: "df14e9cfeba3850bae7cad111fdbc8df"
+ }
+ Frame {
+ msec: 1408
+ hash: "df14e9cfeba3850bae7cad111fdbc8df"
+ }
+ Frame {
+ msec: 1424
+ hash: "fab978e1e0ee5140d8131320ff2322e9"
+ }
+ Frame {
+ msec: 1440
+ hash: "fab978e1e0ee5140d8131320ff2322e9"
+ }
+ Frame {
+ msec: 1456
+ hash: "fab978e1e0ee5140d8131320ff2322e9"
+ }
+ Frame {
+ msec: 1472
+ hash: "fab978e1e0ee5140d8131320ff2322e9"
+ }
+ Frame {
+ msec: 1488
+ hash: "fab978e1e0ee5140d8131320ff2322e9"
+ }
+ Frame {
+ msec: 1504
+ hash: "fab978e1e0ee5140d8131320ff2322e9"
+ }
+ Frame {
+ msec: 1520
+ hash: "cf74324c2a0c8f45c728d42390aac1e0"
+ }
+ Frame {
+ msec: 1536
+ hash: "cf74324c2a0c8f45c728d42390aac1e0"
+ }
+ Frame {
+ msec: 1552
+ hash: "cf74324c2a0c8f45c728d42390aac1e0"
+ }
+ Frame {
+ msec: 1568
+ hash: "cf74324c2a0c8f45c728d42390aac1e0"
+ }
+ Frame {
+ msec: 1584
+ hash: "cf74324c2a0c8f45c728d42390aac1e0"
+ }
+ Frame {
+ msec: 1600
+ hash: "cf74324c2a0c8f45c728d42390aac1e0"
+ }
+ Frame {
+ msec: 1616
+ hash: "07c938ac9ff9f591e84fc553291c7c49"
+ }
+ Frame {
+ msec: 1632
+ hash: "07c938ac9ff9f591e84fc553291c7c49"
+ }
+ Frame {
+ msec: 1648
+ hash: "07c938ac9ff9f591e84fc553291c7c49"
+ }
+ Frame {
+ msec: 1664
+ hash: "07c938ac9ff9f591e84fc553291c7c49"
+ }
+ Frame {
+ msec: 1680
+ hash: "07c938ac9ff9f591e84fc553291c7c49"
+ }
+ Frame {
+ msec: 1696
+ hash: "07c938ac9ff9f591e84fc553291c7c49"
+ }
+ Frame {
+ msec: 1712
+ hash: "07c938ac9ff9f591e84fc553291c7c49"
+ }
+ Frame {
+ msec: 1728
+ hash: "7b585eb6226e6ce2de355f9730dba377"
+ }
+ Frame {
+ msec: 1744
+ hash: "7b585eb6226e6ce2de355f9730dba377"
+ }
+ Frame {
+ msec: 1760
+ hash: "7b585eb6226e6ce2de355f9730dba377"
+ }
+ Frame {
+ msec: 1776
+ hash: "7b585eb6226e6ce2de355f9730dba377"
+ }
+ Frame {
+ msec: 1792
+ hash: "7b585eb6226e6ce2de355f9730dba377"
+ }
+ Frame {
+ msec: 1808
+ hash: "7b585eb6226e6ce2de355f9730dba377"
+ }
+ Frame {
+ msec: 1824
+ hash: "a7817a7d902ab2fe2875183feb6513dd"
+ }
+ Frame {
+ msec: 1840
+ hash: "a7817a7d902ab2fe2875183feb6513dd"
+ }
+ Frame {
+ msec: 1856
+ hash: "a7817a7d902ab2fe2875183feb6513dd"
+ }
+ Frame {
+ msec: 1872
+ hash: "a7817a7d902ab2fe2875183feb6513dd"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.0.png
index 804a443..7e84164 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.1.png
index 804a443..7e84164 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.1.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.qml
index efdb916..d6d8c2a 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.qml
@@ -10,239 +10,239 @@ VisualTest {
}
Frame {
msec: 32
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 48
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 64
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 80
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 96
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 112
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 128
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 144
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 160
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 176
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 192
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 208
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 224
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 240
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 256
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 272
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 288
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 304
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 320
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 336
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 352
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 368
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 384
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 400
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 416
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 432
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 448
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 464
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 480
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 496
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 512
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 528
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 544
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 560
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 576
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 592
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 608
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 624
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 640
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 656
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 672
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 688
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 704
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 720
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 736
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 752
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 768
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 784
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 800
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 816
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 832
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 848
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 864
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 880
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 896
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 912
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 928
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 944
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 960
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 976
@@ -250,11 +250,11 @@ VisualTest {
}
Frame {
msec: 992
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 1008
- hash: "9886d2b883d236bd0a346c6763c1f245"
+ hash: "212d34fa7425fe24398c9de6d4f10422"
}
Frame {
msec: 1024
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.0.png
index 026d06c..6119f92 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.1.png
index 026d06c..6119f92 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.1.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.qml
index 26d0656..481c9aa 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.qml
@@ -10,239 +10,239 @@ VisualTest {
}
Frame {
msec: 32
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 48
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 64
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 80
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 96
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 112
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 128
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 144
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 160
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 176
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 192
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 208
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 224
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 240
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 256
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 272
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 288
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 304
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 320
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 336
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 352
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 368
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 384
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 400
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 416
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 432
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 448
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 464
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 480
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 496
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 512
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 528
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 544
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 560
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 576
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 592
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 608
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 624
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 640
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 656
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 672
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 688
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 704
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 720
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 736
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 752
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 768
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 784
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 800
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 816
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 832
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 848
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 864
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 880
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 896
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 912
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 928
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 944
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 960
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 976
@@ -250,198 +250,198 @@ VisualTest {
}
Frame {
msec: 992
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 1008
- hash: "4235bd6abcbdf6621c4c41153fbaada5"
+ hash: "bd09363ea401e07a38d216bf29806592"
}
Frame {
msec: 1024
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1040
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1056
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1072
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1088
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1104
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1120
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1136
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1152
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1168
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1184
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1200
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1216
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1232
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1248
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1264
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1280
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1296
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1312
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1328
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1344
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1360
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1376
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1392
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1408
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1424
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1440
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1456
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1472
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1488
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1504
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1520
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1536
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1552
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1568
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1584
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1600
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1616
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1632
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1648
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1664
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1680
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1696
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1712
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1728
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1744
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
Frame {
msec: 1760
- hash: "3ccd3d26158a50d8f0567bafd7a23e06"
+ hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596"
}
}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.0.png
index 99f0eb7..749a9c5 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.1.png
index 99f0eb7..749a9c5 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.1.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.qml
index 6dc7f4f..fbb542e 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.qml
@@ -10,239 +10,239 @@ VisualTest {
}
Frame {
msec: 32
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 48
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 64
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 80
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 96
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 112
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 128
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 144
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 160
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 176
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 192
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 208
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 224
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 240
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 256
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 272
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 288
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 304
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 320
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 336
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 352
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 368
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 384
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 400
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 416
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 432
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 448
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 464
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 480
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 496
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 512
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 528
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 544
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 560
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 576
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 592
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 608
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 624
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 640
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 656
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 672
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 688
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 704
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 720
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 736
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 752
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 768
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 784
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 800
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 816
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 832
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 848
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 864
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 880
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 896
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 912
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 928
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 944
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 960
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 976
@@ -251,29 +251,29 @@ VisualTest {
Key {
type: 6
key: 16777249
- modifiers: 67108864
+ modifiers: 0
text: ""
autorep: false
count: 1
}
Frame {
msec: 992
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 1008
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 1024
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 1040
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
Frame {
msec: 1056
- hash: "8401ef19b1e07ca917b8b061888d4e70"
+ hash: "4d49ec1a14a321ea9c0d506663df55c2"
}
}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.0.png
index 0b08fba..b84b8a9 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.1.png
index dbf8cd3..dbae0ce 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.1.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.2.png
index 09646f8..bf56c80 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.2.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.2.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.3.png
index b6734b4..c4f6e18 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.3.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.3.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.4.png
index 861f6b0..ea86925 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.4.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.4.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.qml
index 026f880..e780ea6 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.qml
@@ -10,239 +10,239 @@ VisualTest {
}
Frame {
msec: 32
- hash: "d482dd54c0f3876a11d80979ada91fa9"
+ hash: "1c45bbf4494aeb017d7ad53c5e29cbc0"
}
Frame {
msec: 48
- hash: "d482dd54c0f3876a11d80979ada91fa9"
+ hash: "1c45bbf4494aeb017d7ad53c5e29cbc0"
}
Frame {
msec: 64
- hash: "d482dd54c0f3876a11d80979ada91fa9"
+ hash: "1c45bbf4494aeb017d7ad53c5e29cbc0"
}
Frame {
msec: 80
- hash: "d482dd54c0f3876a11d80979ada91fa9"
+ hash: "1c45bbf4494aeb017d7ad53c5e29cbc0"
}
Frame {
msec: 96
- hash: "d482dd54c0f3876a11d80979ada91fa9"
+ hash: "1c45bbf4494aeb017d7ad53c5e29cbc0"
}
Frame {
msec: 112
- hash: "3eb1cc8fa11ae88a3bf5004263805264"
+ hash: "452d8e4da326413e4961f20a0d24d0f0"
}
Frame {
msec: 128
- hash: "3eb1cc8fa11ae88a3bf5004263805264"
+ hash: "452d8e4da326413e4961f20a0d24d0f0"
}
Frame {
msec: 144
- hash: "3eb1cc8fa11ae88a3bf5004263805264"
+ hash: "452d8e4da326413e4961f20a0d24d0f0"
}
Frame {
msec: 160
- hash: "3eb1cc8fa11ae88a3bf5004263805264"
+ hash: "452d8e4da326413e4961f20a0d24d0f0"
}
Frame {
msec: 176
- hash: "3eb1cc8fa11ae88a3bf5004263805264"
+ hash: "452d8e4da326413e4961f20a0d24d0f0"
}
Frame {
msec: 192
- hash: "b169f3828fafa79245bd5886d94a33b2"
+ hash: "8dc43f316fd36a877c773c10c23b5703"
}
Frame {
msec: 208
- hash: "b169f3828fafa79245bd5886d94a33b2"
+ hash: "8dc43f316fd36a877c773c10c23b5703"
}
Frame {
msec: 224
- hash: "b169f3828fafa79245bd5886d94a33b2"
+ hash: "8dc43f316fd36a877c773c10c23b5703"
}
Frame {
msec: 240
- hash: "b169f3828fafa79245bd5886d94a33b2"
+ hash: "8dc43f316fd36a877c773c10c23b5703"
}
Frame {
msec: 256
- hash: "c9a22f77cce333ea041730bc76d9bb96"
+ hash: "b7e055ce8d510c5ec66e71fa5a78fddf"
}
Frame {
msec: 272
- hash: "c9a22f77cce333ea041730bc76d9bb96"
+ hash: "b7e055ce8d510c5ec66e71fa5a78fddf"
}
Frame {
msec: 288
- hash: "c9a22f77cce333ea041730bc76d9bb96"
+ hash: "b7e055ce8d510c5ec66e71fa5a78fddf"
}
Frame {
msec: 304
- hash: "c9a22f77cce333ea041730bc76d9bb96"
+ hash: "b7e055ce8d510c5ec66e71fa5a78fddf"
}
Frame {
msec: 320
- hash: "958e5805b2bc2ffeaf8a6c8c24721dd5"
+ hash: "e9b0abe5719027348cd267eb4823fc5f"
}
Frame {
msec: 336
- hash: "958e5805b2bc2ffeaf8a6c8c24721dd5"
+ hash: "e9b0abe5719027348cd267eb4823fc5f"
}
Frame {
msec: 352
- hash: "958e5805b2bc2ffeaf8a6c8c24721dd5"
+ hash: "e9b0abe5719027348cd267eb4823fc5f"
}
Frame {
msec: 368
- hash: "958e5805b2bc2ffeaf8a6c8c24721dd5"
+ hash: "e9b0abe5719027348cd267eb4823fc5f"
}
Frame {
msec: 384
- hash: "958e5805b2bc2ffeaf8a6c8c24721dd5"
+ hash: "e9b0abe5719027348cd267eb4823fc5f"
}
Frame {
msec: 400
- hash: "ed14c796dc2980f7a1bdedb15698ae01"
+ hash: "441102f2f69e9f4e10335c1746d47bd3"
}
Frame {
msec: 416
- hash: "ed14c796dc2980f7a1bdedb15698ae01"
+ hash: "441102f2f69e9f4e10335c1746d47bd3"
}
Frame {
msec: 432
- hash: "ed14c796dc2980f7a1bdedb15698ae01"
+ hash: "441102f2f69e9f4e10335c1746d47bd3"
}
Frame {
msec: 448
- hash: "ed14c796dc2980f7a1bdedb15698ae01"
+ hash: "441102f2f69e9f4e10335c1746d47bd3"
}
Frame {
msec: 464
- hash: "ed14c796dc2980f7a1bdedb15698ae01"
+ hash: "441102f2f69e9f4e10335c1746d47bd3"
}
Frame {
msec: 480
- hash: "24d811c9b98b0cb140e7e82090e793ab"
+ hash: "95668288170720989adde2a0b41d5ee8"
}
Frame {
msec: 496
- hash: "24d811c9b98b0cb140e7e82090e793ab"
+ hash: "95668288170720989adde2a0b41d5ee8"
}
Frame {
msec: 512
- hash: "24d811c9b98b0cb140e7e82090e793ab"
+ hash: "95668288170720989adde2a0b41d5ee8"
}
Frame {
msec: 528
- hash: "24d811c9b98b0cb140e7e82090e793ab"
+ hash: "95668288170720989adde2a0b41d5ee8"
}
Frame {
msec: 544
- hash: "afa28a6a682128b1b44df31c78b63b04"
+ hash: "16bba6b72993e474b4c302af3f682834"
}
Frame {
msec: 560
- hash: "afa28a6a682128b1b44df31c78b63b04"
+ hash: "16bba6b72993e474b4c302af3f682834"
}
Frame {
msec: 576
- hash: "afa28a6a682128b1b44df31c78b63b04"
+ hash: "16bba6b72993e474b4c302af3f682834"
}
Frame {
msec: 592
- hash: "afa28a6a682128b1b44df31c78b63b04"
+ hash: "16bba6b72993e474b4c302af3f682834"
}
Frame {
msec: 608
- hash: "c43bba2d3406fabdafac344102d7d72c"
+ hash: "86c4d8bd1b19116411b6a6e450547425"
}
Frame {
msec: 624
- hash: "c43bba2d3406fabdafac344102d7d72c"
+ hash: "86c4d8bd1b19116411b6a6e450547425"
}
Frame {
msec: 640
- hash: "c43bba2d3406fabdafac344102d7d72c"
+ hash: "86c4d8bd1b19116411b6a6e450547425"
}
Frame {
msec: 656
- hash: "c43bba2d3406fabdafac344102d7d72c"
+ hash: "86c4d8bd1b19116411b6a6e450547425"
}
Frame {
msec: 672
- hash: "c43bba2d3406fabdafac344102d7d72c"
+ hash: "86c4d8bd1b19116411b6a6e450547425"
}
Frame {
msec: 688
- hash: "0e1fb18acb72ca1da6fd619e31dd2c86"
+ hash: "d0d3cfa922ebca20c590ab7e59985268"
}
Frame {
msec: 704
- hash: "0e1fb18acb72ca1da6fd619e31dd2c86"
+ hash: "d0d3cfa922ebca20c590ab7e59985268"
}
Frame {
msec: 720
- hash: "0e1fb18acb72ca1da6fd619e31dd2c86"
+ hash: "d0d3cfa922ebca20c590ab7e59985268"
}
Frame {
msec: 736
- hash: "0e1fb18acb72ca1da6fd619e31dd2c86"
+ hash: "d0d3cfa922ebca20c590ab7e59985268"
}
Frame {
msec: 752
- hash: "0e1fb18acb72ca1da6fd619e31dd2c86"
+ hash: "d0d3cfa922ebca20c590ab7e59985268"
}
Frame {
msec: 768
- hash: "d5780e5b30828f33d18c1f4e32ba8c3f"
+ hash: "397d72a090171090f897283729b19bc8"
}
Frame {
msec: 784
- hash: "d5780e5b30828f33d18c1f4e32ba8c3f"
+ hash: "397d72a090171090f897283729b19bc8"
}
Frame {
msec: 800
- hash: "d5780e5b30828f33d18c1f4e32ba8c3f"
+ hash: "397d72a090171090f897283729b19bc8"
}
Frame {
msec: 816
- hash: "d5780e5b30828f33d18c1f4e32ba8c3f"
+ hash: "397d72a090171090f897283729b19bc8"
}
Frame {
msec: 832
- hash: "28bdd1ab1c1af1b39a2f9d11be456682"
+ hash: "2b038e59289d2e3cef02245d2d128271"
}
Frame {
msec: 848
- hash: "28bdd1ab1c1af1b39a2f9d11be456682"
+ hash: "2b038e59289d2e3cef02245d2d128271"
}
Frame {
msec: 864
- hash: "28bdd1ab1c1af1b39a2f9d11be456682"
+ hash: "2b038e59289d2e3cef02245d2d128271"
}
Frame {
msec: 880
- hash: "28bdd1ab1c1af1b39a2f9d11be456682"
+ hash: "2b038e59289d2e3cef02245d2d128271"
}
Frame {
msec: 896
- hash: "28bdd1ab1c1af1b39a2f9d11be456682"
+ hash: "2b038e59289d2e3cef02245d2d128271"
}
Frame {
msec: 912
- hash: "e34a9080716cebc0260e682960cc7c6e"
+ hash: "5f64aa763acdd8f5d6cc249be36e226a"
}
Frame {
msec: 928
- hash: "e34a9080716cebc0260e682960cc7c6e"
+ hash: "5f64aa763acdd8f5d6cc249be36e226a"
}
Frame {
msec: 944
- hash: "e34a9080716cebc0260e682960cc7c6e"
+ hash: "5f64aa763acdd8f5d6cc249be36e226a"
}
Frame {
msec: 960
- hash: "e34a9080716cebc0260e682960cc7c6e"
+ hash: "5f64aa763acdd8f5d6cc249be36e226a"
}
Frame {
msec: 976
@@ -250,247 +250,247 @@ VisualTest {
}
Frame {
msec: 992
- hash: "61959fc3d6f84a9fe88ec1a2979da9af"
+ hash: "4f8c81adc72fce17c7e54f4d45ec08e4"
}
Frame {
msec: 1008
- hash: "61959fc3d6f84a9fe88ec1a2979da9af"
+ hash: "4f8c81adc72fce17c7e54f4d45ec08e4"
}
Frame {
msec: 1024
- hash: "61959fc3d6f84a9fe88ec1a2979da9af"
+ hash: "4f8c81adc72fce17c7e54f4d45ec08e4"
}
Frame {
msec: 1040
- hash: "47794b18771d6d558ebbca881de92377"
+ hash: "91a7a0c0f686975d0087ee0e066911eb"
}
Frame {
msec: 1056
- hash: "47794b18771d6d558ebbca881de92377"
+ hash: "91a7a0c0f686975d0087ee0e066911eb"
}
Frame {
msec: 1072
- hash: "47794b18771d6d558ebbca881de92377"
+ hash: "91a7a0c0f686975d0087ee0e066911eb"
}
Frame {
msec: 1088
- hash: "47794b18771d6d558ebbca881de92377"
+ hash: "91a7a0c0f686975d0087ee0e066911eb"
}
Frame {
msec: 1104
- hash: "47794b18771d6d558ebbca881de92377"
+ hash: "91a7a0c0f686975d0087ee0e066911eb"
}
Frame {
msec: 1120
- hash: "ba34b024ddb4e701d1d7f0c19e24d6cf"
+ hash: "b19f6b8b4dc9d2a2d9aba82983e41889"
}
Frame {
msec: 1136
- hash: "ba34b024ddb4e701d1d7f0c19e24d6cf"
+ hash: "b19f6b8b4dc9d2a2d9aba82983e41889"
}
Frame {
msec: 1152
- hash: "ba34b024ddb4e701d1d7f0c19e24d6cf"
+ hash: "b19f6b8b4dc9d2a2d9aba82983e41889"
}
Frame {
msec: 1168
- hash: "ba34b024ddb4e701d1d7f0c19e24d6cf"
+ hash: "b19f6b8b4dc9d2a2d9aba82983e41889"
}
Frame {
msec: 1184
- hash: "ba34b024ddb4e701d1d7f0c19e24d6cf"
+ hash: "b19f6b8b4dc9d2a2d9aba82983e41889"
}
Frame {
msec: 1200
- hash: "e94344268d2a118053ecc3aef278d91d"
+ hash: "456542b672303ddae500b96e9b66a558"
}
Frame {
msec: 1216
- hash: "e94344268d2a118053ecc3aef278d91d"
+ hash: "456542b672303ddae500b96e9b66a558"
}
Frame {
msec: 1232
- hash: "e94344268d2a118053ecc3aef278d91d"
+ hash: "456542b672303ddae500b96e9b66a558"
}
Frame {
msec: 1248
- hash: "e94344268d2a118053ecc3aef278d91d"
+ hash: "456542b672303ddae500b96e9b66a558"
}
Frame {
msec: 1264
- hash: "df1959605d3bd74e84e51cbd4d322235"
+ hash: "8ec69f05d929c3b397dc721198ccacd4"
}
Frame {
msec: 1280
- hash: "df1959605d3bd74e84e51cbd4d322235"
+ hash: "8ec69f05d929c3b397dc721198ccacd4"
}
Frame {
msec: 1296
- hash: "df1959605d3bd74e84e51cbd4d322235"
+ hash: "8ec69f05d929c3b397dc721198ccacd4"
}
Frame {
msec: 1312
- hash: "df1959605d3bd74e84e51cbd4d322235"
+ hash: "8ec69f05d929c3b397dc721198ccacd4"
}
Frame {
msec: 1328
- hash: "26e1c8d13f0dd3713dce24211a8d26c1"
+ hash: "2d63fd91f4b01f6b178c795838e78990"
}
Frame {
msec: 1344
- hash: "26e1c8d13f0dd3713dce24211a8d26c1"
+ hash: "2d63fd91f4b01f6b178c795838e78990"
}
Frame {
msec: 1360
- hash: "26e1c8d13f0dd3713dce24211a8d26c1"
+ hash: "2d63fd91f4b01f6b178c795838e78990"
}
Frame {
msec: 1376
- hash: "26e1c8d13f0dd3713dce24211a8d26c1"
+ hash: "2d63fd91f4b01f6b178c795838e78990"
}
Frame {
msec: 1392
- hash: "26e1c8d13f0dd3713dce24211a8d26c1"
+ hash: "2d63fd91f4b01f6b178c795838e78990"
}
Frame {
msec: 1408
- hash: "fd1344db48093182eb2c2872ceb887df"
+ hash: "c7c1d2c288653b414fe534ff6fab3381"
}
Frame {
msec: 1424
- hash: "fd1344db48093182eb2c2872ceb887df"
+ hash: "c7c1d2c288653b414fe534ff6fab3381"
}
Frame {
msec: 1440
- hash: "fd1344db48093182eb2c2872ceb887df"
+ hash: "c7c1d2c288653b414fe534ff6fab3381"
}
Frame {
msec: 1456
- hash: "fd1344db48093182eb2c2872ceb887df"
+ hash: "c7c1d2c288653b414fe534ff6fab3381"
}
Frame {
msec: 1472
- hash: "fd1344db48093182eb2c2872ceb887df"
+ hash: "c7c1d2c288653b414fe534ff6fab3381"
}
Frame {
msec: 1488
- hash: "a4bf54bbb5bcbf54de6a7a2be9b73b81"
+ hash: "23188e926a855a7a06211783ee51d22a"
}
Frame {
msec: 1504
- hash: "a4bf54bbb5bcbf54de6a7a2be9b73b81"
+ hash: "23188e926a855a7a06211783ee51d22a"
}
Frame {
msec: 1520
- hash: "a4bf54bbb5bcbf54de6a7a2be9b73b81"
+ hash: "23188e926a855a7a06211783ee51d22a"
}
Frame {
msec: 1536
- hash: "a4bf54bbb5bcbf54de6a7a2be9b73b81"
+ hash: "23188e926a855a7a06211783ee51d22a"
}
Frame {
msec: 1552
- hash: "072a6c0e64853f57487845f2ff376c12"
+ hash: "cfc64d8876d59e0d75f079c2e08cea5f"
}
Frame {
msec: 1568
- hash: "072a6c0e64853f57487845f2ff376c12"
+ hash: "cfc64d8876d59e0d75f079c2e08cea5f"
}
Frame {
msec: 1584
- hash: "072a6c0e64853f57487845f2ff376c12"
+ hash: "cfc64d8876d59e0d75f079c2e08cea5f"
}
Frame {
msec: 1600
- hash: "072a6c0e64853f57487845f2ff376c12"
+ hash: "cfc64d8876d59e0d75f079c2e08cea5f"
}
Frame {
msec: 1616
- hash: "072a6c0e64853f57487845f2ff376c12"
+ hash: "cfc64d8876d59e0d75f079c2e08cea5f"
}
Frame {
msec: 1632
- hash: "d4183aba9cd5607ea1ff1572c78d33cc"
+ hash: "766c679eaec4bd28dc92cb3642d5be83"
}
Frame {
msec: 1648
- hash: "d4183aba9cd5607ea1ff1572c78d33cc"
+ hash: "766c679eaec4bd28dc92cb3642d5be83"
}
Frame {
msec: 1664
- hash: "d4183aba9cd5607ea1ff1572c78d33cc"
+ hash: "766c679eaec4bd28dc92cb3642d5be83"
}
Frame {
msec: 1680
- hash: "d4183aba9cd5607ea1ff1572c78d33cc"
+ hash: "766c679eaec4bd28dc92cb3642d5be83"
}
Frame {
msec: 1696
- hash: "31cb8e151b34187f712b269b38a317a7"
+ hash: "a86ba05a854fde208e6cf7849327d5d0"
}
Frame {
msec: 1712
- hash: "31cb8e151b34187f712b269b38a317a7"
+ hash: "a86ba05a854fde208e6cf7849327d5d0"
}
Frame {
msec: 1728
- hash: "31cb8e151b34187f712b269b38a317a7"
+ hash: "a86ba05a854fde208e6cf7849327d5d0"
}
Frame {
msec: 1744
- hash: "31cb8e151b34187f712b269b38a317a7"
+ hash: "a86ba05a854fde208e6cf7849327d5d0"
}
Key {
type: 6
key: 16777249
- modifiers: 67108864
+ modifiers: 0
text: ""
autorep: false
count: 1
}
Frame {
msec: 1760
- hash: "31cb8e151b34187f712b269b38a317a7"
+ hash: "a86ba05a854fde208e6cf7849327d5d0"
}
Frame {
msec: 1776
- hash: "e24ad0aed6a071d6da9f51af00c69300"
+ hash: "23b60817be2a741cada2af663b0d7f54"
}
Frame {
msec: 1792
- hash: "e24ad0aed6a071d6da9f51af00c69300"
+ hash: "23b60817be2a741cada2af663b0d7f54"
}
Frame {
msec: 1808
- hash: "e24ad0aed6a071d6da9f51af00c69300"
+ hash: "23b60817be2a741cada2af663b0d7f54"
}
Frame {
msec: 1824
- hash: "e24ad0aed6a071d6da9f51af00c69300"
+ hash: "23b60817be2a741cada2af663b0d7f54"
}
Frame {
msec: 1840
- hash: "760eea420a5eb52ccd1f6a29d6701338"
+ hash: "c098c1c0d5239c59735a5c9450e9d531"
}
Frame {
msec: 1856
- hash: "760eea420a5eb52ccd1f6a29d6701338"
+ hash: "c098c1c0d5239c59735a5c9450e9d531"
}
Frame {
msec: 1872
- hash: "760eea420a5eb52ccd1f6a29d6701338"
+ hash: "c098c1c0d5239c59735a5c9450e9d531"
}
Frame {
msec: 1888
- hash: "760eea420a5eb52ccd1f6a29d6701338"
+ hash: "c098c1c0d5239c59735a5c9450e9d531"
}
Frame {
msec: 1904
- hash: "760eea420a5eb52ccd1f6a29d6701338"
+ hash: "c098c1c0d5239c59735a5c9450e9d531"
}
Frame {
msec: 1920
- hash: "07cdcdb9b551750c4a742ee6dff9f3f9"
+ hash: "09f6ee218d314d3a405ae43e32588c07"
}
Frame {
msec: 1936
@@ -498,239 +498,239 @@ VisualTest {
}
Frame {
msec: 1952
- hash: "07cdcdb9b551750c4a742ee6dff9f3f9"
+ hash: "09f6ee218d314d3a405ae43e32588c07"
}
Frame {
msec: 1968
- hash: "07cdcdb9b551750c4a742ee6dff9f3f9"
+ hash: "09f6ee218d314d3a405ae43e32588c07"
}
Frame {
msec: 1984
- hash: "ec4dada16fb19fb4cf24367c9f25f161"
+ hash: "6ee480e7d8b0abe295ae12a660119102"
}
Frame {
msec: 2000
- hash: "ec4dada16fb19fb4cf24367c9f25f161"
+ hash: "6ee480e7d8b0abe295ae12a660119102"
}
Frame {
msec: 2016
- hash: "ec4dada16fb19fb4cf24367c9f25f161"
+ hash: "6ee480e7d8b0abe295ae12a660119102"
}
Frame {
msec: 2032
- hash: "ec4dada16fb19fb4cf24367c9f25f161"
+ hash: "6ee480e7d8b0abe295ae12a660119102"
}
Frame {
msec: 2048
- hash: "ec4dada16fb19fb4cf24367c9f25f161"
+ hash: "6ee480e7d8b0abe295ae12a660119102"
}
Frame {
msec: 2064
- hash: "f5ef19dc69f8b6060056f7005f613ca3"
+ hash: "b43ca0ea75f4c17c09248f78170d3839"
}
Frame {
msec: 2080
- hash: "f5ef19dc69f8b6060056f7005f613ca3"
+ hash: "b43ca0ea75f4c17c09248f78170d3839"
}
Frame {
msec: 2096
- hash: "f5ef19dc69f8b6060056f7005f613ca3"
+ hash: "b43ca0ea75f4c17c09248f78170d3839"
}
Frame {
msec: 2112
- hash: "f5ef19dc69f8b6060056f7005f613ca3"
+ hash: "b43ca0ea75f4c17c09248f78170d3839"
}
Frame {
msec: 2128
- hash: "6bd00519ea14f0dd34d45de4deaaa65e"
+ hash: "92e0ee1174ffcb710403bb831aeec353"
}
Frame {
msec: 2144
- hash: "6bd00519ea14f0dd34d45de4deaaa65e"
+ hash: "92e0ee1174ffcb710403bb831aeec353"
}
Frame {
msec: 2160
- hash: "6bd00519ea14f0dd34d45de4deaaa65e"
+ hash: "92e0ee1174ffcb710403bb831aeec353"
}
Frame {
msec: 2176
- hash: "6bd00519ea14f0dd34d45de4deaaa65e"
+ hash: "92e0ee1174ffcb710403bb831aeec353"
}
Frame {
msec: 2192
- hash: "6bd00519ea14f0dd34d45de4deaaa65e"
+ hash: "92e0ee1174ffcb710403bb831aeec353"
}
Frame {
msec: 2208
- hash: "1c3e491e889e408f705477f060103243"
+ hash: "bba79ad6f3630b7aa382541cc2d3a2cd"
}
Frame {
msec: 2224
- hash: "1c3e491e889e408f705477f060103243"
+ hash: "bba79ad6f3630b7aa382541cc2d3a2cd"
}
Frame {
msec: 2240
- hash: "1c3e491e889e408f705477f060103243"
+ hash: "bba79ad6f3630b7aa382541cc2d3a2cd"
}
Frame {
msec: 2256
- hash: "1c3e491e889e408f705477f060103243"
+ hash: "bba79ad6f3630b7aa382541cc2d3a2cd"
}
Frame {
msec: 2272
- hash: "80bc59211ffab64820e306e6eb13d2fc"
+ hash: "7efeb1565125f25252ce3f03dadc3bea"
}
Frame {
msec: 2288
- hash: "80bc59211ffab64820e306e6eb13d2fc"
+ hash: "7efeb1565125f25252ce3f03dadc3bea"
}
Frame {
msec: 2304
- hash: "80bc59211ffab64820e306e6eb13d2fc"
+ hash: "7efeb1565125f25252ce3f03dadc3bea"
}
Frame {
msec: 2320
- hash: "80bc59211ffab64820e306e6eb13d2fc"
+ hash: "7efeb1565125f25252ce3f03dadc3bea"
}
Frame {
msec: 2336
- hash: "80bc59211ffab64820e306e6eb13d2fc"
+ hash: "7efeb1565125f25252ce3f03dadc3bea"
}
Frame {
msec: 2352
- hash: "7765c76dd2ef99e4d7286fcb3a172a07"
+ hash: "9086d24dff90f8c9e4543c6b14c99bf6"
}
Frame {
msec: 2368
- hash: "7765c76dd2ef99e4d7286fcb3a172a07"
+ hash: "9086d24dff90f8c9e4543c6b14c99bf6"
}
Frame {
msec: 2384
- hash: "7765c76dd2ef99e4d7286fcb3a172a07"
+ hash: "9086d24dff90f8c9e4543c6b14c99bf6"
}
Frame {
msec: 2400
- hash: "7765c76dd2ef99e4d7286fcb3a172a07"
+ hash: "9086d24dff90f8c9e4543c6b14c99bf6"
}
Frame {
msec: 2416
- hash: "7765c76dd2ef99e4d7286fcb3a172a07"
+ hash: "9086d24dff90f8c9e4543c6b14c99bf6"
}
Frame {
msec: 2432
- hash: "8fedc4d5d4161922c1d9d50adcf67e4a"
+ hash: "15d8e99a0676e0a1588dfddc00ab0d16"
}
Frame {
msec: 2448
- hash: "8fedc4d5d4161922c1d9d50adcf67e4a"
+ hash: "15d8e99a0676e0a1588dfddc00ab0d16"
}
Frame {
msec: 2464
- hash: "8fedc4d5d4161922c1d9d50adcf67e4a"
+ hash: "15d8e99a0676e0a1588dfddc00ab0d16"
}
Frame {
msec: 2480
- hash: "8fedc4d5d4161922c1d9d50adcf67e4a"
+ hash: "15d8e99a0676e0a1588dfddc00ab0d16"
}
Frame {
msec: 2496
- hash: "4f26d7ab05e6d39a869be1259e33c739"
+ hash: "ecc25b88c29dc9d6c70df6e36a91f95c"
}
Frame {
msec: 2512
- hash: "4f26d7ab05e6d39a869be1259e33c739"
+ hash: "ecc25b88c29dc9d6c70df6e36a91f95c"
}
Frame {
msec: 2528
- hash: "4f26d7ab05e6d39a869be1259e33c739"
+ hash: "ecc25b88c29dc9d6c70df6e36a91f95c"
}
Frame {
msec: 2544
- hash: "4f26d7ab05e6d39a869be1259e33c739"
+ hash: "ecc25b88c29dc9d6c70df6e36a91f95c"
}
Frame {
msec: 2560
- hash: "d4ead42bcc2e283e513f1ab4f8a89f27"
+ hash: "905c81686d8d2ecdde513622c35c0ea6"
}
Frame {
msec: 2576
- hash: "d4ead42bcc2e283e513f1ab4f8a89f27"
+ hash: "905c81686d8d2ecdde513622c35c0ea6"
}
Frame {
msec: 2592
- hash: "d4ead42bcc2e283e513f1ab4f8a89f27"
+ hash: "905c81686d8d2ecdde513622c35c0ea6"
}
Frame {
msec: 2608
- hash: "d4ead42bcc2e283e513f1ab4f8a89f27"
+ hash: "905c81686d8d2ecdde513622c35c0ea6"
}
Frame {
msec: 2624
- hash: "d4ead42bcc2e283e513f1ab4f8a89f27"
+ hash: "905c81686d8d2ecdde513622c35c0ea6"
}
Frame {
msec: 2640
- hash: "6d91b100f369381b24052e5a4466e24d"
+ hash: "537a2cf41a5e15220d2ca2218ac49a5a"
}
Frame {
msec: 2656
- hash: "6d91b100f369381b24052e5a4466e24d"
+ hash: "537a2cf41a5e15220d2ca2218ac49a5a"
}
Frame {
msec: 2672
- hash: "6d91b100f369381b24052e5a4466e24d"
+ hash: "537a2cf41a5e15220d2ca2218ac49a5a"
}
Frame {
msec: 2688
- hash: "6d91b100f369381b24052e5a4466e24d"
+ hash: "537a2cf41a5e15220d2ca2218ac49a5a"
}
Frame {
msec: 2704
- hash: "2d6082b41e3cfdc3be9c130311ac854a"
+ hash: "53325ce7d011eeb72369463721f15e87"
}
Frame {
msec: 2720
- hash: "2d6082b41e3cfdc3be9c130311ac854a"
+ hash: "53325ce7d011eeb72369463721f15e87"
}
Frame {
msec: 2736
- hash: "2d6082b41e3cfdc3be9c130311ac854a"
+ hash: "53325ce7d011eeb72369463721f15e87"
}
Frame {
msec: 2752
- hash: "2d6082b41e3cfdc3be9c130311ac854a"
+ hash: "53325ce7d011eeb72369463721f15e87"
}
Frame {
msec: 2768
- hash: "2d6082b41e3cfdc3be9c130311ac854a"
+ hash: "53325ce7d011eeb72369463721f15e87"
}
Frame {
msec: 2784
- hash: "78732b58812f202768fa224aefce187d"
+ hash: "9ad2565cc95647a83d3ce3acc106485a"
}
Frame {
msec: 2800
- hash: "78732b58812f202768fa224aefce187d"
+ hash: "9ad2565cc95647a83d3ce3acc106485a"
}
Frame {
msec: 2816
- hash: "78732b58812f202768fa224aefce187d"
+ hash: "9ad2565cc95647a83d3ce3acc106485a"
}
Frame {
msec: 2832
- hash: "78732b58812f202768fa224aefce187d"
+ hash: "9ad2565cc95647a83d3ce3acc106485a"
}
Frame {
msec: 2848
- hash: "54d728d677cf3a07c4da7727a75e6c59"
+ hash: "de7b66581e0743385a984f76c993b01b"
}
Frame {
msec: 2864
- hash: "54d728d677cf3a07c4da7727a75e6c59"
+ hash: "de7b66581e0743385a984f76c993b01b"
}
Frame {
msec: 2880
- hash: "54d728d677cf3a07c4da7727a75e6c59"
+ hash: "de7b66581e0743385a984f76c993b01b"
}
Frame {
msec: 2896
@@ -738,239 +738,239 @@ VisualTest {
}
Frame {
msec: 2912
- hash: "54d728d677cf3a07c4da7727a75e6c59"
+ hash: "de7b66581e0743385a984f76c993b01b"
}
Frame {
msec: 2928
- hash: "45ec3534077f6fa66d7710010cceb332"
+ hash: "f66852df1738e4fe29ac1f6938d814c2"
}
Frame {
msec: 2944
- hash: "45ec3534077f6fa66d7710010cceb332"
+ hash: "f66852df1738e4fe29ac1f6938d814c2"
}
Frame {
msec: 2960
- hash: "45ec3534077f6fa66d7710010cceb332"
+ hash: "f66852df1738e4fe29ac1f6938d814c2"
}
Frame {
msec: 2976
- hash: "45ec3534077f6fa66d7710010cceb332"
+ hash: "f66852df1738e4fe29ac1f6938d814c2"
}
Frame {
msec: 2992
- hash: "ef909728fa59292ffed1d047835439d6"
+ hash: "cf6dde6c590879a9e905a0f559f089ca"
}
Frame {
msec: 3008
- hash: "ef909728fa59292ffed1d047835439d6"
+ hash: "cf6dde6c590879a9e905a0f559f089ca"
}
Frame {
msec: 3024
- hash: "ef909728fa59292ffed1d047835439d6"
+ hash: "cf6dde6c590879a9e905a0f559f089ca"
}
Frame {
msec: 3040
- hash: "ef909728fa59292ffed1d047835439d6"
+ hash: "cf6dde6c590879a9e905a0f559f089ca"
}
Frame {
msec: 3056
- hash: "ef909728fa59292ffed1d047835439d6"
+ hash: "cf6dde6c590879a9e905a0f559f089ca"
}
Frame {
msec: 3072
- hash: "454741313d087e5d13ddeaf02663746f"
+ hash: "bd63e4df280010ed9f67fc7976b86cb5"
}
Frame {
msec: 3088
- hash: "454741313d087e5d13ddeaf02663746f"
+ hash: "bd63e4df280010ed9f67fc7976b86cb5"
}
Frame {
msec: 3104
- hash: "454741313d087e5d13ddeaf02663746f"
+ hash: "bd63e4df280010ed9f67fc7976b86cb5"
}
Frame {
msec: 3120
- hash: "454741313d087e5d13ddeaf02663746f"
+ hash: "bd63e4df280010ed9f67fc7976b86cb5"
}
Frame {
msec: 3136
- hash: "454741313d087e5d13ddeaf02663746f"
+ hash: "bd63e4df280010ed9f67fc7976b86cb5"
}
Frame {
msec: 3152
- hash: "02928f0a8f8f1011028114487b8dccf8"
+ hash: "065d3d370faa58aed9899cae0f86f032"
}
Frame {
msec: 3168
- hash: "02928f0a8f8f1011028114487b8dccf8"
+ hash: "065d3d370faa58aed9899cae0f86f032"
}
Frame {
msec: 3184
- hash: "02928f0a8f8f1011028114487b8dccf8"
+ hash: "065d3d370faa58aed9899cae0f86f032"
}
Frame {
msec: 3200
- hash: "02928f0a8f8f1011028114487b8dccf8"
+ hash: "065d3d370faa58aed9899cae0f86f032"
}
Frame {
msec: 3216
- hash: "e0fca67bb095c9891831cd9355b4880d"
+ hash: "b5623d05c578a6f09bcfacd4d3163b09"
}
Frame {
msec: 3232
- hash: "e0fca67bb095c9891831cd9355b4880d"
+ hash: "b5623d05c578a6f09bcfacd4d3163b09"
}
Frame {
msec: 3248
- hash: "e0fca67bb095c9891831cd9355b4880d"
+ hash: "b5623d05c578a6f09bcfacd4d3163b09"
}
Frame {
msec: 3264
- hash: "e0fca67bb095c9891831cd9355b4880d"
+ hash: "b5623d05c578a6f09bcfacd4d3163b09"
}
Frame {
msec: 3280
- hash: "f5ae54931d953fc95cfbdbde1993bebe"
+ hash: "83c70529d05911ea26a5cbbab5aa20f2"
}
Frame {
msec: 3296
- hash: "f5ae54931d953fc95cfbdbde1993bebe"
+ hash: "83c70529d05911ea26a5cbbab5aa20f2"
}
Frame {
msec: 3312
- hash: "f5ae54931d953fc95cfbdbde1993bebe"
+ hash: "83c70529d05911ea26a5cbbab5aa20f2"
}
Frame {
msec: 3328
- hash: "f5ae54931d953fc95cfbdbde1993bebe"
+ hash: "83c70529d05911ea26a5cbbab5aa20f2"
}
Frame {
msec: 3344
- hash: "f5ae54931d953fc95cfbdbde1993bebe"
+ hash: "83c70529d05911ea26a5cbbab5aa20f2"
}
Frame {
msec: 3360
- hash: "9afb0b2a185e2f825e9fad1c3644f6cb"
+ hash: "17927c706da1bc222ba5462af66a9d2f"
}
Frame {
msec: 3376
- hash: "9afb0b2a185e2f825e9fad1c3644f6cb"
+ hash: "17927c706da1bc222ba5462af66a9d2f"
}
Frame {
msec: 3392
- hash: "9afb0b2a185e2f825e9fad1c3644f6cb"
+ hash: "17927c706da1bc222ba5462af66a9d2f"
}
Frame {
msec: 3408
- hash: "9afb0b2a185e2f825e9fad1c3644f6cb"
+ hash: "17927c706da1bc222ba5462af66a9d2f"
}
Frame {
msec: 3424
- hash: "9afb0b2a185e2f825e9fad1c3644f6cb"
+ hash: "17927c706da1bc222ba5462af66a9d2f"
}
Frame {
msec: 3440
- hash: "f3f5a81d3b5f644a00cea6203f38994c"
+ hash: "f49627ba8d3e257e0e94404da24d12dc"
}
Frame {
msec: 3456
- hash: "f3f5a81d3b5f644a00cea6203f38994c"
+ hash: "f49627ba8d3e257e0e94404da24d12dc"
}
Frame {
msec: 3472
- hash: "f3f5a81d3b5f644a00cea6203f38994c"
+ hash: "f49627ba8d3e257e0e94404da24d12dc"
}
Frame {
msec: 3488
- hash: "f3f5a81d3b5f644a00cea6203f38994c"
+ hash: "f49627ba8d3e257e0e94404da24d12dc"
}
Frame {
msec: 3504
- hash: "bd9884712fd5afe67a3622c809bf4e76"
+ hash: "37a0c9dc20431c8398409d4522a0fdd3"
}
Frame {
msec: 3520
- hash: "bd9884712fd5afe67a3622c809bf4e76"
+ hash: "37a0c9dc20431c8398409d4522a0fdd3"
}
Frame {
msec: 3536
- hash: "bd9884712fd5afe67a3622c809bf4e76"
+ hash: "37a0c9dc20431c8398409d4522a0fdd3"
}
Frame {
msec: 3552
- hash: "bd9884712fd5afe67a3622c809bf4e76"
+ hash: "37a0c9dc20431c8398409d4522a0fdd3"
}
Frame {
msec: 3568
- hash: "c9324386954380a72ef4084d13e623b5"
+ hash: "67bebfe9fb5ac745f40040ff8083e999"
}
Frame {
msec: 3584
- hash: "c9324386954380a72ef4084d13e623b5"
+ hash: "67bebfe9fb5ac745f40040ff8083e999"
}
Frame {
msec: 3600
- hash: "c9324386954380a72ef4084d13e623b5"
+ hash: "67bebfe9fb5ac745f40040ff8083e999"
}
Frame {
msec: 3616
- hash: "c9324386954380a72ef4084d13e623b5"
+ hash: "67bebfe9fb5ac745f40040ff8083e999"
}
Frame {
msec: 3632
- hash: "c9324386954380a72ef4084d13e623b5"
+ hash: "67bebfe9fb5ac745f40040ff8083e999"
}
Frame {
msec: 3648
- hash: "6d05fd8e8690e44293af1809f359aa72"
+ hash: "84f8b27b83b566c99e65ea39b29772c1"
}
Frame {
msec: 3664
- hash: "6d05fd8e8690e44293af1809f359aa72"
+ hash: "84f8b27b83b566c99e65ea39b29772c1"
}
Frame {
msec: 3680
- hash: "6d05fd8e8690e44293af1809f359aa72"
+ hash: "84f8b27b83b566c99e65ea39b29772c1"
}
Frame {
msec: 3696
- hash: "6d05fd8e8690e44293af1809f359aa72"
+ hash: "84f8b27b83b566c99e65ea39b29772c1"
}
Frame {
msec: 3712
- hash: "6d05fd8e8690e44293af1809f359aa72"
+ hash: "84f8b27b83b566c99e65ea39b29772c1"
}
Frame {
msec: 3728
- hash: "2d7350a79f5a68d3e3dfc994c6e002ed"
+ hash: "c6ba663536f19b9f291ef35b7a70e490"
}
Frame {
msec: 3744
- hash: "2d7350a79f5a68d3e3dfc994c6e002ed"
+ hash: "c6ba663536f19b9f291ef35b7a70e490"
}
Frame {
msec: 3760
- hash: "2d7350a79f5a68d3e3dfc994c6e002ed"
+ hash: "c6ba663536f19b9f291ef35b7a70e490"
}
Frame {
msec: 3776
- hash: "2d7350a79f5a68d3e3dfc994c6e002ed"
+ hash: "c6ba663536f19b9f291ef35b7a70e490"
}
Frame {
msec: 3792
- hash: "edb5d50f23a293a7791122fc159aaaa0"
+ hash: "65f22784730aa27b2628d015a1cc4abe"
}
Frame {
msec: 3808
- hash: "edb5d50f23a293a7791122fc159aaaa0"
+ hash: "65f22784730aa27b2628d015a1cc4abe"
}
Frame {
msec: 3824
- hash: "edb5d50f23a293a7791122fc159aaaa0"
+ hash: "65f22784730aa27b2628d015a1cc4abe"
}
Frame {
msec: 3840
- hash: "edb5d50f23a293a7791122fc159aaaa0"
+ hash: "65f22784730aa27b2628d015a1cc4abe"
}
Frame {
msec: 3856
@@ -978,14 +978,14 @@ VisualTest {
}
Frame {
msec: 3872
- hash: "a863480fec9abf817752c5eb62a2ddf4"
+ hash: "b11a511d80de87329501b9c11aebbc58"
}
Frame {
msec: 3888
- hash: "a863480fec9abf817752c5eb62a2ddf4"
+ hash: "b11a511d80de87329501b9c11aebbc58"
}
Frame {
msec: 3904
- hash: "a863480fec9abf817752c5eb62a2ddf4"
+ hash: "b11a511d80de87329501b9c11aebbc58"
}
}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.0.png
index e1d3b75..3861b4f 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.1.png
index 8013dc9..ce166f1 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.1.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.qml
index 77a7b2f..84778ac 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.qml
@@ -10,239 +10,239 @@ VisualTest {
}
Frame {
msec: 32
- hash: "ef2b4cc93e5bf5e64d3338921fe36336"
+ hash: "58d757783e6d57c5ac2596219dfd37be"
}
Frame {
msec: 48
- hash: "3ddbd1a53a36b0f8b36d87e742f3b1bd"
+ hash: "e76b3b98f447b706c59ba0c175e1829d"
}
Frame {
msec: 64
- hash: "f7acfdaf29a3d7bd179b30db784ca01b"
+ hash: "f0dbb0b55d1d27bf7c0260db5b5782a2"
}
Frame {
msec: 80
- hash: "b5277d02ed63180e845c60e1dd4da7d0"
+ hash: "00845517336befd7ead0141312ea38ce"
}
Frame {
msec: 96
- hash: "a7964577d77943d5a62c02ea1e689eb7"
+ hash: "99723ae092407e5291ed3a13f5a7be61"
}
Frame {
msec: 112
- hash: "fc597a07209bfea49227ec491b033af1"
+ hash: "2d531f1dd1545a4e2f8ca4c65338e0c3"
}
Frame {
msec: 128
- hash: "429a7dd5a23a5012f1985bcddd27ba0c"
+ hash: "9f273323f48a70be279302b194203a36"
}
Frame {
msec: 144
- hash: "fbf845e137e0b389babdcd71a95c3060"
+ hash: "7de4bd5f82369953c2a4a990ddaf4339"
}
Frame {
msec: 160
- hash: "1d1272df3a53cb9860d23be3343a143e"
+ hash: "96c5f74c01723a15a57db161604bc245"
}
Frame {
msec: 176
- hash: "cef05f6564b21fd2cbd02f6def604c0b"
+ hash: "df2eac6300919044cfe2a2f591c3bd99"
}
Frame {
msec: 192
- hash: "be0ca54bc7aa23c2b9c56e3a0444197a"
+ hash: "a153904cdfa0be697a25bebc4ce1fbca"
}
Frame {
msec: 208
- hash: "5372a7052d10b8c6c2204efdc88c2f48"
+ hash: "de243731b92ac1cac05e194aed0acd1e"
}
Frame {
msec: 224
- hash: "43b775c558843c1334e86ca4fcf07ae2"
+ hash: "f6ccc0f127bfc6212885c3c6470639ed"
}
Frame {
msec: 240
- hash: "10daf71511454ef4db3692a19ecbcbaa"
+ hash: "a2d56227aebedb9590a1124e44fe8e84"
}
Frame {
msec: 256
- hash: "5c545ecb0ddfaa5d6cde266be6fae35c"
+ hash: "5f8c0a42a231580dcfff6a534e77bef8"
}
Frame {
msec: 272
- hash: "1a3c05b189c3adf87710eeb03296aec2"
+ hash: "e631663ac692ab097cb28095b45e8563"
}
Frame {
msec: 288
- hash: "de2c6f4d3bf4d245e45e47a743808f5d"
+ hash: "2a03f6ba3c67a9e9732cc1f5cdc42c23"
}
Frame {
msec: 304
- hash: "7c71dcbd8e2be19ac2d090ab3e012a62"
+ hash: "26b85080d624b232e5209aa082fc11b1"
}
Frame {
msec: 320
- hash: "3bd42257fe4a5d941a8755e66db94870"
+ hash: "1c027f4a0114bb9050a3a8d9de2b8a56"
}
Frame {
msec: 336
- hash: "d52f57a1f289d2c697fd1db2086a4df3"
+ hash: "788e6ad3cb5f6e120e40fd3dc6ac8483"
}
Frame {
msec: 352
- hash: "5d9e22ca6b6f8e4805a49fcf9c6a4dd6"
+ hash: "7e1b0fb71528dfa17a87950c0ff86111"
}
Frame {
msec: 368
- hash: "cbafada44b434ac7fe64fdebef7a816e"
+ hash: "e1878e6e8ba14d8945e1f71ac8d42c1e"
}
Frame {
msec: 384
- hash: "4ac900c005cfedb9e3367a4612334cc1"
+ hash: "556f42297eb1e57d6a8af0946651a75e"
}
Frame {
msec: 400
- hash: "3dbe30edac497ca316bf39e55ff9580a"
+ hash: "73df08e7e3391b339cea9f5f082fd83a"
}
Frame {
msec: 416
- hash: "e892891c063172d513f4f8c0a0b2644f"
+ hash: "de3bd8a12c2a448738ce77036b97bda7"
}
Frame {
msec: 432
- hash: "7c214a442c8f37d22f74343fdb7f7faa"
+ hash: "0ab187aa7a478dbf005f35416a93c456"
}
Frame {
msec: 448
- hash: "c4461c6c26eb9689e640149b7755bf14"
+ hash: "e5baf64ccafa6a4d2bf74aacf52019c6"
}
Frame {
msec: 464
- hash: "e7be611f007716a80698558d0600f5b6"
+ hash: "0ed2ee4a773ade712ef207549006aa7b"
}
Frame {
msec: 480
- hash: "5a3abaa7b36fcd7e2279318671597386"
+ hash: "b23dd49bdfe8fb155e2055262e6a1478"
}
Frame {
msec: 496
- hash: "2dba1fcba5bdce948fa56ffc02a7f80c"
+ hash: "871f82636a03d6fa8cbfb580038bd0b7"
}
Frame {
msec: 512
- hash: "55043bcce83e4f8899b1a692fe30fa67"
+ hash: "463cdc2cbde034d7d7a5061338b319c7"
}
Frame {
msec: 528
- hash: "f92df1fb28a7da39ed907dd2bc177ab8"
+ hash: "22ff8e25136877fd6f5dce1b01e65c08"
}
Frame {
msec: 544
- hash: "7dcf90cd5f81999359ed389c7050d934"
+ hash: "97d4e49622d877e9e1e0102786e1ee55"
}
Frame {
msec: 560
- hash: "021014366809103b76bd5d472c43b062"
+ hash: "ebf5304185abe4bc33be44c3df09a93a"
}
Frame {
msec: 576
- hash: "fff5b2c8d63083d132c0f106fad84fa1"
+ hash: "307887d9973e807c52b2143cdfe438ad"
}
Frame {
msec: 592
- hash: "ab3a6a6c646d31be97884484a6647330"
+ hash: "d89547539741f387fdd6aa80ef239fbd"
}
Frame {
msec: 608
- hash: "d46a168f89d94a32496b75ee5d3794e4"
+ hash: "b818215b4cdd6e811057f1a0f5eb1a5a"
}
Frame {
msec: 624
- hash: "f7b62e86595a4d2c7f5a2cd52e0938b9"
+ hash: "84f7e523c0f21236ff8aad1333470d11"
}
Frame {
msec: 640
- hash: "df95a29a101889c50537cfb1b027f9a6"
+ hash: "7f974663c7add6d10ebdd401794e087a"
}
Frame {
msec: 656
- hash: "4c6691ef37222260dce72868ae809d68"
+ hash: "4c824dc01e8fead2706608ca68293d11"
}
Frame {
msec: 672
- hash: "ad816534dcf446a1456894ff2b1afa33"
+ hash: "86b0f617eb3bfff944c3b670b3b51c71"
}
Frame {
msec: 688
- hash: "bfa9f9f833f38aedf766e061f3a18c48"
+ hash: "86c5660c22003099cc4121381c11de85"
}
Frame {
msec: 704
- hash: "f4a6786e9db58cf3fd3f3b896d3cf84f"
+ hash: "3c2bd08ea17aaa920949239f06b255cf"
}
Frame {
msec: 720
- hash: "e51e8b766e5d4a0f061dc6885fcf8eb3"
+ hash: "2380278cc065a3ac5355127d9873796c"
}
Frame {
msec: 736
- hash: "eab6d261429c36c4e37005f37b7823d5"
+ hash: "e5d8624e841476926b3e2a5ebca8c65f"
}
Frame {
msec: 752
- hash: "3cc5db209a98daef06127bae53b1929d"
+ hash: "eab70f5005a6b39e3ead6e4452df1a54"
}
Frame {
msec: 768
- hash: "230cd6e6ca18a921a21379dd85e24822"
+ hash: "46acef023d154bad3f91e0267996421b"
}
Frame {
msec: 784
- hash: "e3a877e8f01bf17fe6ea8b9fbb780f14"
+ hash: "26ba9f30a4bfd72c9b6dae2a25660ea9"
}
Frame {
msec: 800
- hash: "a19f504a81409dea775481f21f992ba6"
+ hash: "9fabdd5cf1190fb34bdc7834eba01cd3"
}
Frame {
msec: 816
- hash: "e77cc3ab14551638e704a1493189d5d1"
+ hash: "b1e7af47d4ee706374365fdd4b4d52be"
}
Frame {
msec: 832
- hash: "613bdf9d32358ab0db310ae1e2246d52"
+ hash: "86fa2e142e75d9d2a074a5376992f139"
}
Frame {
msec: 848
- hash: "d4fab0193f567cce4ad1e1cf6b156ce5"
+ hash: "a3dea2bf8f84743d35070e82ec585c9a"
}
Frame {
msec: 864
- hash: "03ce3083411d10b14ac0bb85b22bfbd1"
+ hash: "ab649fbbe0ca508812de9839d14b3f8c"
}
Frame {
msec: 880
- hash: "4be10fb14abf82705d8071cf75956ece"
+ hash: "08f8a334e121d4edb0ca1617353bfebc"
}
Frame {
msec: 896
- hash: "4c1f150fb5ba1194ad198eb32f705af6"
+ hash: "bb7997c1e18b90cfaad4c3e4ec44356e"
}
Frame {
msec: 912
- hash: "5ddfd98c8a49eefe08ae33d0c0ea52ff"
+ hash: "31a7e5d71c28eebfcd29e9ea4950ad17"
}
Frame {
msec: 928
- hash: "f2018d16f38e113c9477c19431e3d1e4"
+ hash: "2b759276e03c2884bff7ed863c032dfc"
}
Frame {
msec: 944
- hash: "9fe6406d65978dba74716f1ba02bdf76"
+ hash: "aa0868f006097a435c46368ea9e3ba36"
}
Frame {
msec: 960
- hash: "265d92edca113f465e624079c266b213"
+ hash: "6454753699c21589d2523a83da0aaa34"
}
Frame {
msec: 976
@@ -250,54 +250,54 @@ VisualTest {
}
Frame {
msec: 992
- hash: "6beb60f7645be5f1d07449610b5e13b0"
+ hash: "ac26abff68fbc1cf89dc5efc4a714a04"
}
Frame {
msec: 1008
- hash: "55c34cb290732a1fa94b5037477fd882"
+ hash: "d3f9dc8cb653d996fb57652f85abcbc1"
}
Frame {
msec: 1024
- hash: "4d6ed8044e3ac5da61cf61f4d08c5a19"
+ hash: "002a94f067eef532f63b6ef916977c2c"
}
Frame {
msec: 1040
- hash: "83657cfa447060a01d5fbdb890ad3fb9"
+ hash: "f7935d01ee9b497034cc1d8f007a0fdf"
}
Frame {
msec: 1056
- hash: "b04b6cb7e5e464ecee15a2c9803a857f"
+ hash: "4a1bfdcc85e5444c1bd836399e86ee05"
}
Frame {
msec: 1072
- hash: "ea4f1707e49527f6cae0a3df1b75137b"
+ hash: "1b86514f3c85a8438ef183cc4772e997"
}
Frame {
msec: 1088
- hash: "ae4893aca919be2d89f1107185b5fe9a"
+ hash: "7bf4c1ca946288e9d1a7ad055d8cacaa"
}
Frame {
msec: 1104
- hash: "d991c469947a94ffcfb63716226fa912"
+ hash: "b3a00861967157786a80c80030d5495b"
}
Frame {
msec: 1120
- hash: "df63c1dba0399d1fe5e7b9c9c794b598"
+ hash: "b9c6195d3336d7519cc72b16e75d00f6"
}
Frame {
msec: 1136
- hash: "305d263f68b4ccd78bffccd887870f97"
+ hash: "6dba6d030a5ff6a92a57f0bdcf0fe781"
}
Frame {
msec: 1152
- hash: "f4d1f7245b519d623defdc12e76285d2"
+ hash: "cc97a2721f4339094819c8b7aec6d74c"
}
Frame {
msec: 1168
- hash: "5a47e6498ddf8a02cb1df7a3510bac37"
+ hash: "190f67abce51f58fdd1591651633d67e"
}
Frame {
msec: 1184
- hash: "358b9b6be7f8379815d8ee828eed3e43"
+ hash: "b255f75cfc4918663b8bd47c887cfb3c"
}
}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.0.png
index 16202c4..f2e6117 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.1.png
index 16202c4..f2e6117 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.1.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.qml
index c911b0a9..f306f5c 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.qml
@@ -10,239 +10,239 @@ VisualTest {
}
Frame {
msec: 32
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 48
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 64
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 80
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 96
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 112
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 128
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 144
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 160
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 176
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 192
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 208
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 224
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 240
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 256
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 272
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 288
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 304
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 320
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 336
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 352
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 368
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 384
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 400
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 416
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 432
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 448
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 464
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 480
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 496
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 512
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 528
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 544
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 560
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 576
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 592
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 608
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 624
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 640
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 656
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 672
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 688
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 704
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 720
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 736
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 752
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 768
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 784
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 800
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 816
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 832
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 848
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 864
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 880
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 896
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 912
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 928
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 944
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 960
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 976
@@ -251,29 +251,29 @@ VisualTest {
Key {
type: 6
key: 16777249
- modifiers: 67108864
+ modifiers: 0
text: ""
autorep: false
count: 1
}
Frame {
msec: 992
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 1008
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 1024
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 1040
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
Frame {
msec: 1056
- hash: "bfcbea92ed5278c01642fd3cd6d3175c"
+ hash: "a2003f5b238564e9b68b38db156431d2"
}
}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.0.png
index 38b9668..2f4c84a 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.1.png
index 801ec2b..ae786a2 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.1.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.qml
index 5275c05..6e9057c 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.qml
@@ -10,239 +10,239 @@ VisualTest {
}
Frame {
msec: 32
- hash: "0922fd48af050774d53e0b3815d57d8e"
+ hash: "716f5d150bd8757952d7b4ba327fb8bd"
}
Frame {
msec: 48
- hash: "0922fd48af050774d53e0b3815d57d8e"
+ hash: "716f5d150bd8757952d7b4ba327fb8bd"
}
Frame {
msec: 64
- hash: "0922fd48af050774d53e0b3815d57d8e"
+ hash: "716f5d150bd8757952d7b4ba327fb8bd"
}
Frame {
msec: 80
- hash: "0922fd48af050774d53e0b3815d57d8e"
+ hash: "716f5d150bd8757952d7b4ba327fb8bd"
}
Frame {
msec: 96
- hash: "0922fd48af050774d53e0b3815d57d8e"
+ hash: "716f5d150bd8757952d7b4ba327fb8bd"
}
Frame {
msec: 112
- hash: "0922fd48af050774d53e0b3815d57d8e"
+ hash: "716f5d150bd8757952d7b4ba327fb8bd"
}
Frame {
msec: 128
- hash: "6ed734d7092a34e440628dc70db97ac5"
+ hash: "8ec55fba2017a56c641c7baca5345b8b"
}
Frame {
msec: 144
- hash: "6ed734d7092a34e440628dc70db97ac5"
+ hash: "8ec55fba2017a56c641c7baca5345b8b"
}
Frame {
msec: 160
- hash: "6ed734d7092a34e440628dc70db97ac5"
+ hash: "8ec55fba2017a56c641c7baca5345b8b"
}
Frame {
msec: 176
- hash: "6ed734d7092a34e440628dc70db97ac5"
+ hash: "8ec55fba2017a56c641c7baca5345b8b"
}
Frame {
msec: 192
- hash: "a74b735016141dccf2c84fe9ee1e3ab2"
+ hash: "79dc1645a5486ddfa3d957f3bd4ffbda"
}
Frame {
msec: 208
- hash: "a74b735016141dccf2c84fe9ee1e3ab2"
+ hash: "79dc1645a5486ddfa3d957f3bd4ffbda"
}
Frame {
msec: 224
- hash: "a74b735016141dccf2c84fe9ee1e3ab2"
+ hash: "79dc1645a5486ddfa3d957f3bd4ffbda"
}
Frame {
msec: 240
- hash: "a74b735016141dccf2c84fe9ee1e3ab2"
+ hash: "79dc1645a5486ddfa3d957f3bd4ffbda"
}
Frame {
msec: 256
- hash: "047416b9368fb352b7da1e073d863e96"
+ hash: "476eae8ca9f6698cf67e2d20c5c24b66"
}
Frame {
msec: 272
- hash: "047416b9368fb352b7da1e073d863e96"
+ hash: "476eae8ca9f6698cf67e2d20c5c24b66"
}
Frame {
msec: 288
- hash: "047416b9368fb352b7da1e073d863e96"
+ hash: "476eae8ca9f6698cf67e2d20c5c24b66"
}
Frame {
msec: 304
- hash: "047416b9368fb352b7da1e073d863e96"
+ hash: "476eae8ca9f6698cf67e2d20c5c24b66"
}
Frame {
msec: 320
- hash: "f2d62e8675b8bba924b27db689c9cd7f"
+ hash: "bef1a9585daf30f1739a190ffa2e4b46"
}
Frame {
msec: 336
- hash: "f2d62e8675b8bba924b27db689c9cd7f"
+ hash: "bef1a9585daf30f1739a190ffa2e4b46"
}
Frame {
msec: 352
- hash: "f2d62e8675b8bba924b27db689c9cd7f"
+ hash: "bef1a9585daf30f1739a190ffa2e4b46"
}
Frame {
msec: 368
- hash: "f2d62e8675b8bba924b27db689c9cd7f"
+ hash: "bef1a9585daf30f1739a190ffa2e4b46"
}
Frame {
msec: 384
- hash: "f2d62e8675b8bba924b27db689c9cd7f"
+ hash: "bef1a9585daf30f1739a190ffa2e4b46"
}
Frame {
msec: 400
- hash: "9498a80d60ab24d82ffb935979e1cf1b"
+ hash: "156dfc4e9fbc1af5e8c6c48ecd2afe8f"
}
Frame {
msec: 416
- hash: "9498a80d60ab24d82ffb935979e1cf1b"
+ hash: "156dfc4e9fbc1af5e8c6c48ecd2afe8f"
}
Frame {
msec: 432
- hash: "9498a80d60ab24d82ffb935979e1cf1b"
+ hash: "156dfc4e9fbc1af5e8c6c48ecd2afe8f"
}
Frame {
msec: 448
- hash: "9498a80d60ab24d82ffb935979e1cf1b"
+ hash: "156dfc4e9fbc1af5e8c6c48ecd2afe8f"
}
Frame {
msec: 464
- hash: "ee3cb45a15460f4235fc22ca97e0303d"
+ hash: "2fe675a360e61452c31dda42070c137f"
}
Frame {
msec: 480
- hash: "ee3cb45a15460f4235fc22ca97e0303d"
+ hash: "2fe675a360e61452c31dda42070c137f"
}
Frame {
msec: 496
- hash: "ee3cb45a15460f4235fc22ca97e0303d"
+ hash: "2fe675a360e61452c31dda42070c137f"
}
Frame {
msec: 512
- hash: "ee3cb45a15460f4235fc22ca97e0303d"
+ hash: "2fe675a360e61452c31dda42070c137f"
}
Frame {
msec: 528
- hash: "94464db418aec12b451e9dc106deec73"
+ hash: "0f1bac7c35b9f5bdbce10fb577c9cf28"
}
Frame {
msec: 544
- hash: "94464db418aec12b451e9dc106deec73"
+ hash: "0f1bac7c35b9f5bdbce10fb577c9cf28"
}
Frame {
msec: 560
- hash: "94464db418aec12b451e9dc106deec73"
+ hash: "0f1bac7c35b9f5bdbce10fb577c9cf28"
}
Frame {
msec: 576
- hash: "94464db418aec12b451e9dc106deec73"
+ hash: "0f1bac7c35b9f5bdbce10fb577c9cf28"
}
Frame {
msec: 592
- hash: "94464db418aec12b451e9dc106deec73"
+ hash: "0f1bac7c35b9f5bdbce10fb577c9cf28"
}
Frame {
msec: 608
- hash: "22b23a55986e912cf38239d5e68f0c4a"
+ hash: "c79f68e9481f91f6f6a6816a655efc24"
}
Frame {
msec: 624
- hash: "22b23a55986e912cf38239d5e68f0c4a"
+ hash: "c79f68e9481f91f6f6a6816a655efc24"
}
Frame {
msec: 640
- hash: "22b23a55986e912cf38239d5e68f0c4a"
+ hash: "c79f68e9481f91f6f6a6816a655efc24"
}
Frame {
msec: 656
- hash: "22b23a55986e912cf38239d5e68f0c4a"
+ hash: "c79f68e9481f91f6f6a6816a655efc24"
}
Frame {
msec: 672
- hash: "3836d0aaf354d147dc6ffe3ace184ba5"
+ hash: "9a189e9d9249fb04fd98c4e91aba1cb5"
}
Frame {
msec: 688
- hash: "3836d0aaf354d147dc6ffe3ace184ba5"
+ hash: "9a189e9d9249fb04fd98c4e91aba1cb5"
}
Frame {
msec: 704
- hash: "3836d0aaf354d147dc6ffe3ace184ba5"
+ hash: "9a189e9d9249fb04fd98c4e91aba1cb5"
}
Frame {
msec: 720
- hash: "3836d0aaf354d147dc6ffe3ace184ba5"
+ hash: "9a189e9d9249fb04fd98c4e91aba1cb5"
}
Frame {
msec: 736
- hash: "3836d0aaf354d147dc6ffe3ace184ba5"
+ hash: "9a189e9d9249fb04fd98c4e91aba1cb5"
}
Frame {
msec: 752
- hash: "20ccea5bc4c15401a7c660b1801488dd"
+ hash: "42c1ac48858ab5901601dc5a950a398f"
}
Frame {
msec: 768
- hash: "20ccea5bc4c15401a7c660b1801488dd"
+ hash: "42c1ac48858ab5901601dc5a950a398f"
}
Frame {
msec: 784
- hash: "20ccea5bc4c15401a7c660b1801488dd"
+ hash: "42c1ac48858ab5901601dc5a950a398f"
}
Frame {
msec: 800
- hash: "20ccea5bc4c15401a7c660b1801488dd"
+ hash: "42c1ac48858ab5901601dc5a950a398f"
}
Frame {
msec: 816
- hash: "31ffa9cfd6f60a33ed3b052e45ee5080"
+ hash: "f05bf4e3cc562c5a900fb389a7c093de"
}
Frame {
msec: 832
- hash: "31ffa9cfd6f60a33ed3b052e45ee5080"
+ hash: "f05bf4e3cc562c5a900fb389a7c093de"
}
Frame {
msec: 848
- hash: "31ffa9cfd6f60a33ed3b052e45ee5080"
+ hash: "f05bf4e3cc562c5a900fb389a7c093de"
}
Frame {
msec: 864
- hash: "31ffa9cfd6f60a33ed3b052e45ee5080"
+ hash: "f05bf4e3cc562c5a900fb389a7c093de"
}
Frame {
msec: 880
- hash: "7138b38fcff27e85aaf3179c6e81ac69"
+ hash: "1b5d1234aa02009ec447ac8fefc403bb"
}
Frame {
msec: 896
- hash: "7138b38fcff27e85aaf3179c6e81ac69"
+ hash: "1b5d1234aa02009ec447ac8fefc403bb"
}
Frame {
msec: 912
- hash: "7138b38fcff27e85aaf3179c6e81ac69"
+ hash: "1b5d1234aa02009ec447ac8fefc403bb"
}
Frame {
msec: 928
- hash: "7138b38fcff27e85aaf3179c6e81ac69"
+ hash: "1b5d1234aa02009ec447ac8fefc403bb"
}
Frame {
msec: 944
- hash: "7138b38fcff27e85aaf3179c6e81ac69"
+ hash: "1b5d1234aa02009ec447ac8fefc403bb"
}
Frame {
msec: 960
- hash: "78854022288d4cd50bb9141896403d35"
+ hash: "ec7cfc539d7bde448c631da211de8f44"
}
Frame {
msec: 976
@@ -250,151 +250,151 @@ VisualTest {
}
Frame {
msec: 992
- hash: "78854022288d4cd50bb9141896403d35"
+ hash: "ec7cfc539d7bde448c631da211de8f44"
}
Frame {
msec: 1008
- hash: "78854022288d4cd50bb9141896403d35"
+ hash: "ec7cfc539d7bde448c631da211de8f44"
}
Frame {
msec: 1024
- hash: "8730d8adb4029b157e39b90e3cb2b879"
+ hash: "646394dd534a32bc3a066e606cc485f3"
}
Frame {
msec: 1040
- hash: "8730d8adb4029b157e39b90e3cb2b879"
+ hash: "646394dd534a32bc3a066e606cc485f3"
}
Frame {
msec: 1056
- hash: "8730d8adb4029b157e39b90e3cb2b879"
+ hash: "646394dd534a32bc3a066e606cc485f3"
}
Frame {
msec: 1072
- hash: "8730d8adb4029b157e39b90e3cb2b879"
+ hash: "646394dd534a32bc3a066e606cc485f3"
}
Frame {
msec: 1088
- hash: "9edb542976d1acd86be3d516276dee1f"
+ hash: "6b66b968aaed1896e2e9fafe27bba50f"
}
Frame {
msec: 1104
- hash: "9edb542976d1acd86be3d516276dee1f"
+ hash: "6b66b968aaed1896e2e9fafe27bba50f"
}
Frame {
msec: 1120
- hash: "9edb542976d1acd86be3d516276dee1f"
+ hash: "6b66b968aaed1896e2e9fafe27bba50f"
}
Frame {
msec: 1136
- hash: "9edb542976d1acd86be3d516276dee1f"
+ hash: "6b66b968aaed1896e2e9fafe27bba50f"
}
Frame {
msec: 1152
- hash: "9edb542976d1acd86be3d516276dee1f"
+ hash: "6b66b968aaed1896e2e9fafe27bba50f"
}
Frame {
msec: 1168
- hash: "1a394542b01712fbd67b78a69733b324"
+ hash: "869f75182b9a4b452da1689a5921085f"
}
Frame {
msec: 1184
- hash: "1a394542b01712fbd67b78a69733b324"
+ hash: "869f75182b9a4b452da1689a5921085f"
}
Frame {
msec: 1200
- hash: "1a394542b01712fbd67b78a69733b324"
+ hash: "869f75182b9a4b452da1689a5921085f"
}
Frame {
msec: 1216
- hash: "1a394542b01712fbd67b78a69733b324"
+ hash: "869f75182b9a4b452da1689a5921085f"
}
Frame {
msec: 1232
- hash: "4825f9a6679fdee8efe89507d384c07c"
+ hash: "b2017890ac543b9224e85a44157d9fbb"
}
Frame {
msec: 1248
- hash: "4825f9a6679fdee8efe89507d384c07c"
+ hash: "b2017890ac543b9224e85a44157d9fbb"
}
Frame {
msec: 1264
- hash: "4825f9a6679fdee8efe89507d384c07c"
+ hash: "b2017890ac543b9224e85a44157d9fbb"
}
Frame {
msec: 1280
- hash: "4825f9a6679fdee8efe89507d384c07c"
+ hash: "b2017890ac543b9224e85a44157d9fbb"
}
Frame {
msec: 1296
- hash: "4825f9a6679fdee8efe89507d384c07c"
+ hash: "b2017890ac543b9224e85a44157d9fbb"
}
Frame {
msec: 1312
- hash: "0ed5382fd2e370bad934647d7abf293f"
+ hash: "acac3eb92619e01b3470511cef1a91c8"
}
Frame {
msec: 1328
- hash: "0ed5382fd2e370bad934647d7abf293f"
+ hash: "acac3eb92619e01b3470511cef1a91c8"
}
Frame {
msec: 1344
- hash: "0ed5382fd2e370bad934647d7abf293f"
+ hash: "acac3eb92619e01b3470511cef1a91c8"
}
Frame {
msec: 1360
- hash: "0ed5382fd2e370bad934647d7abf293f"
+ hash: "acac3eb92619e01b3470511cef1a91c8"
}
Frame {
msec: 1376
- hash: "6206435ab4d05d5d5f84b362d45c30f9"
+ hash: "7f6d45b22e5cb86a7fb45d3f9bcebfc1"
}
Frame {
msec: 1392
- hash: "6206435ab4d05d5d5f84b362d45c30f9"
+ hash: "7f6d45b22e5cb86a7fb45d3f9bcebfc1"
}
Frame {
msec: 1408
- hash: "6206435ab4d05d5d5f84b362d45c30f9"
+ hash: "7f6d45b22e5cb86a7fb45d3f9bcebfc1"
}
Frame {
msec: 1424
- hash: "6206435ab4d05d5d5f84b362d45c30f9"
+ hash: "7f6d45b22e5cb86a7fb45d3f9bcebfc1"
}
Frame {
msec: 1440
- hash: "b0eb92df767e7cb61cc69d7363041263"
+ hash: "481f661e2613242d253498e467c91105"
}
Frame {
msec: 1456
- hash: "b0eb92df767e7cb61cc69d7363041263"
+ hash: "481f661e2613242d253498e467c91105"
}
Frame {
msec: 1472
- hash: "b0eb92df767e7cb61cc69d7363041263"
+ hash: "481f661e2613242d253498e467c91105"
}
Frame {
msec: 1488
- hash: "b0eb92df767e7cb61cc69d7363041263"
+ hash: "481f661e2613242d253498e467c91105"
}
Frame {
msec: 1504
- hash: "b0eb92df767e7cb61cc69d7363041263"
+ hash: "481f661e2613242d253498e467c91105"
}
Frame {
msec: 1520
- hash: "0306262c9594536e0eecf3d67e5910cf"
+ hash: "4c342918351f0165ce63129afbd60074"
}
Frame {
msec: 1536
- hash: "0306262c9594536e0eecf3d67e5910cf"
+ hash: "4c342918351f0165ce63129afbd60074"
}
Frame {
msec: 1552
- hash: "0306262c9594536e0eecf3d67e5910cf"
+ hash: "4c342918351f0165ce63129afbd60074"
}
Frame {
msec: 1568
- hash: "0306262c9594536e0eecf3d67e5910cf"
+ hash: "4c342918351f0165ce63129afbd60074"
}
Frame {
msec: 1584
@@ -443,7 +443,7 @@ VisualTest {
Key {
type: 6
key: 16777249
- modifiers: 0
+ modifiers: 67108864
text: ""
autorep: false
count: 1
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.0.png
index 730925e..f71c1ac 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.1.png
index ddd6cc5..93c16dc 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.1.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.2.png
index 4679774..acec1ee 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.2.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.2.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.3.png
index 51018b4..f380c08 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.3.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.3.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.4.png
index f5ed905..18142dd 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.4.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.4.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.5.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.5.png
index 5005724..c7f59b8 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.5.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.5.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.qml
index faf7240..6e802f4 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.qml
@@ -10,239 +10,239 @@ VisualTest {
}
Frame {
msec: 32
- hash: "12cd5401549bc43283d6c46964528b9b"
+ hash: "fde26fa3d17fb92d676afe61ca6a2170"
}
Frame {
msec: 48
- hash: "ae042a0f3c6e32550288a9b0e6a0ce0d"
+ hash: "54c7a0ea10fa212959dc4f7606c31f3c"
}
Frame {
msec: 64
- hash: "9124b4e5f5dd374e44f3f57fe3d6809b"
+ hash: "e73c4521144b2c810f15239e6d8fa468"
}
Frame {
msec: 80
- hash: "54dabe45069a00c8759bb5560c9b269f"
+ hash: "31a68bfd57846795db57bb30d1d60341"
}
Frame {
msec: 96
- hash: "0d908ef6e3ea15455e35a9ebbc90c735"
+ hash: "55edcaeed37c1390eee2619d52a2eb03"
}
Frame {
msec: 112
- hash: "de5fcf719cd096b99a531e7af9b26e35"
+ hash: "2c27d9c3dc215c68630495e255c1670e"
}
Frame {
msec: 128
- hash: "d48ccb7c22c2606ef814cd5abd3888f3"
+ hash: "b27dd9260f6da3ab414076e83bf5a2bd"
}
Frame {
msec: 144
- hash: "2ec7418477158ee60afe123fa2b7ce4b"
+ hash: "bfcbba7e970af922ee87fbbe936eaa84"
}
Frame {
msec: 160
- hash: "418d6d46726c688bee6f415eb2ff2e43"
+ hash: "75af84ff6f21648737cef4a215410cc6"
}
Frame {
msec: 176
- hash: "e754141341d9f81366f21820e46bd1ca"
+ hash: "71fd1fe13a14632ff54ad7a87be68bca"
}
Frame {
msec: 192
- hash: "89b4b5f7563bfdb5d1e636a5462e0d8e"
+ hash: "69f553a1893403dc6fc82d3c9c47f501"
}
Frame {
msec: 208
- hash: "46c3a7d4700a9599d474b7de1ab44a18"
+ hash: "9456b12d49cc2a1f9212dba98a83c8ab"
}
Frame {
msec: 224
- hash: "c50698470bc6c1ea04633b9e819a2d4d"
+ hash: "cfd826f91f6f880816d505c93a8f125a"
}
Frame {
msec: 240
- hash: "dc7d5345363cad6ee007f162f9ea75e2"
+ hash: "d8e3291525eff9f905102ed7654f986b"
}
Frame {
msec: 256
- hash: "3b9ccb93f6375ea401c1fc3bcdf847d5"
+ hash: "044c1f37e37a68fbfbb9ddbc2da4300a"
}
Frame {
msec: 272
- hash: "6d034da407af9e27ce70e9dbfee3bb38"
+ hash: "d640cba5f14d9c065bec6f6c23f2831f"
}
Frame {
msec: 288
- hash: "3bce938e5db4c2295cd25a6e2b33738c"
+ hash: "9e15b68dace4b39b937dfea8777ae503"
}
Frame {
msec: 304
- hash: "68266f4f9da256b9df499285ebb842fb"
+ hash: "7ea72711e3f8bdd1087181e127e093c7"
}
Frame {
msec: 320
- hash: "a9c912fd159baadc4afcd963f857e91b"
+ hash: "c45dae8eb1768c8aba2d92dea4f268a2"
}
Frame {
msec: 336
- hash: "85cb9086774297b2772e71229f7d84fc"
+ hash: "181ebf6597be2d9e54c1d01a5ab54b46"
}
Frame {
msec: 352
- hash: "585e6f2d28ec70d10741a52fb68d718c"
+ hash: "094b6cc486b60882836a9ba35411ae7d"
}
Frame {
msec: 368
- hash: "bfd552ccaccc569d2478ac4d92fe2eb0"
+ hash: "031f1bcb864b4507bf93caab88756317"
}
Frame {
msec: 384
- hash: "748d57dff4cdc09a842353e51de41e5a"
+ hash: "42b4d89a1026327f180ecc414dcd0ef0"
}
Frame {
msec: 400
- hash: "e0012622a4ef1d5b2090c02020b676c2"
+ hash: "a99c5d1d434687e2f16e7054bcff8a69"
}
Frame {
msec: 416
- hash: "8e4d4a808564a8ba80578600104f230d"
+ hash: "91cf18d3f8538ee8550f7e190911b072"
}
Frame {
msec: 432
- hash: "d92e44d8e1f7651a9d256e9e4f3e8168"
+ hash: "1c11a328d74bc7bf77da10f094db8d4a"
}
Frame {
msec: 448
- hash: "d99b016a0dfdb332dbb1a2c10f53bc05"
+ hash: "e4da6dc99c962e8f37dc8d99669616d0"
}
Frame {
msec: 464
- hash: "3ce4357881a34f4c9e2f0d684218e253"
+ hash: "628d4c1455f58a304887050c0552499a"
}
Frame {
msec: 480
- hash: "07ee4bb59f7ee591bd7a6f117d9f1aa6"
+ hash: "dd17a403f45bcd1001cb08e7f4ae8443"
}
Frame {
msec: 496
- hash: "f66ce51f2eece9f0fa89c41340245976"
+ hash: "1ed042d0289fc6167143ddcd92f708f6"
}
Frame {
msec: 512
- hash: "a9d2b2d4f6ae5e071897d17469a5bad3"
+ hash: "b55abb6249925cf06439b3177310dcfc"
}
Frame {
msec: 528
- hash: "55db2dbd65cae186d59cb2edb5841880"
+ hash: "251c3346640a2aa7a9c18ca84ff2d5bb"
}
Frame {
msec: 544
- hash: "576297445ee3f89994538fcd8c8b102c"
+ hash: "6f5e18d84c4107213599b57bf7284c4b"
}
Frame {
msec: 560
- hash: "6ca41b83b8ff27f97c71a23d1c7f9765"
+ hash: "2179c1d7d7acb3c2f6354b493cfe74e0"
}
Frame {
msec: 576
- hash: "7e41ef79cae5966821106df39f6a748d"
+ hash: "bbc757e8f3c08f93ffcdd68b392c8cdb"
}
Frame {
msec: 592
- hash: "9e8b750bbb3680f90d6bbddb6e394d5e"
+ hash: "7eefd9c7291c1a23679efd42f2c29539"
}
Frame {
msec: 608
- hash: "9a61dddcc33ff2b778097b5edb706912"
+ hash: "fa375510d3850614aebceb2bc31ab4de"
}
Frame {
msec: 624
- hash: "395d015e538dde494059df392379ba26"
+ hash: "f643c5ba39bb90f396f00c0a9df995c8"
}
Frame {
msec: 640
- hash: "d1db5dc62ca702f4241e45811aebe6f3"
+ hash: "c6b7792f780b00b1b07c0ce948dff13b"
}
Frame {
msec: 656
- hash: "18f1a038041bd8a51f3375ca64084251"
+ hash: "d43d82ee9b0da8f237469c555b48bee8"
}
Frame {
msec: 672
- hash: "6c0f6360156cb806a8b30cafc69013af"
+ hash: "addaa9d2aa8f54d6a4e82dc7e029f19d"
}
Frame {
msec: 688
- hash: "69525e71fe8fe9847ff956e40c2c45ec"
+ hash: "b12af2fd05a1ccd4664c5093456bae01"
}
Frame {
msec: 704
- hash: "ac7ae453f35a05e760976df6d91206e2"
+ hash: "982d3505c51fc1bac026c744e2d1db11"
}
Frame {
msec: 720
- hash: "c96358482f0900a906b2fc4742981e3a"
+ hash: "a67a0705ce893dcafdcfc3a7fe71f608"
}
Frame {
msec: 736
- hash: "2cccb8f6a63f21d01cd3b61a97730bf8"
+ hash: "6e00f746695ca67fb4c4462740b13c8f"
}
Frame {
msec: 752
- hash: "bf01c0cb968768199f3158e6cefcb09f"
+ hash: "bc4235d556a1e18d591b9afd87b29826"
}
Frame {
msec: 768
- hash: "0ac63c33649462f06979de77c042476c"
+ hash: "830ebf4b9214f1dc31975c83cf49d31e"
}
Frame {
msec: 784
- hash: "61931edba8d1abcdc07bb43e17446f4e"
+ hash: "bac049ae3d6676db8bca99620c9f5bd3"
}
Frame {
msec: 800
- hash: "e8122f997a4076055d8addda88c4ad6e"
+ hash: "0f9623c23e4e45126078c3c93015d26c"
}
Frame {
msec: 816
- hash: "cc7e654138605c25cb21aa8966361cf4"
+ hash: "bedde76baa8905970ea5fa8da62355a6"
}
Frame {
msec: 832
- hash: "177aaec34c677b21798de1e024860490"
+ hash: "018b9b1444d921b8cfd823265556c8f6"
}
Frame {
msec: 848
- hash: "d0fe9544e55f6876908d9c118366f038"
+ hash: "2be3e0693f54ffefd24e44f552d59e3f"
}
Frame {
msec: 864
- hash: "f713b7e11bf61a0f0a06e6aedb36b7f1"
+ hash: "c8c99f68125df2a1f41f6b44fdcc0406"
}
Frame {
msec: 880
- hash: "b703bd46b9f355711318882194f28d52"
+ hash: "3e18d6a24a1c6983f3f2ce984d22dbe4"
}
Frame {
msec: 896
- hash: "047dad73e6c845704f3de6b317ce9290"
+ hash: "aa336c4e5ace2b33689ca280de2299db"
}
Frame {
msec: 912
- hash: "8c48b0963af8d71fc245373083c14a93"
+ hash: "fd7245f879bbd72b6e72c563a588eea7"
}
Frame {
msec: 928
- hash: "d11944e0d9035b6eff85ca9fc5adc2c0"
+ hash: "e484656517fcb5763c0c8992b22efe91"
}
Frame {
msec: 944
- hash: "d650943a979c7bf52fff77063406c46d"
+ hash: "fbd58b050963fc7cdbd5ae89aa7a4a70"
}
Frame {
msec: 960
- hash: "13d533b5b3b01be7dbad7b8403ce1c24"
+ hash: "b47ad6fb8b364e3c2764bf31e62f21e0"
}
Frame {
msec: 976
@@ -250,239 +250,239 @@ VisualTest {
}
Frame {
msec: 992
- hash: "ba51fa05accf637b31328ab0a11e4b61"
+ hash: "ac1a6692030ed80cd34c082ac70ea06e"
}
Frame {
msec: 1008
- hash: "25c783c07b5eb03c351274c3b6494e24"
+ hash: "068a6b82a35d94e3db3eae772c7da56a"
}
Frame {
msec: 1024
- hash: "5665113db0b932b07ac707875e5d77e6"
+ hash: "8252bb45e74bc09e1d5e6b3951fbb08e"
}
Frame {
msec: 1040
- hash: "aceeb64e5935f1889828f3487767db3e"
+ hash: "a5d7ad9287238780cb45c61bb70d6cd4"
}
Frame {
msec: 1056
- hash: "7c66c51a9fd694940a93a7acf036e6d3"
+ hash: "e0307f3a1193af0df0cd52d7dac44db9"
}
Frame {
msec: 1072
- hash: "8b699d11b0a8c7df7df448f5c27a0bc2"
+ hash: "d649cf0c4a768dba1a0380b64bc7e48b"
}
Frame {
msec: 1088
- hash: "c592cebdfadf68eecbddb0add92afa42"
+ hash: "3fd512a0860c17abbb6ed71488cd7255"
}
Frame {
msec: 1104
- hash: "e175f718809eea5b38a1de46f061871f"
+ hash: "26032efe6efd1de4b5fae23ce4e28a0a"
}
Frame {
msec: 1120
- hash: "3182ba22228e8cd056db81eea4678b5d"
+ hash: "846652a87d93e397d1a84b187b7aafea"
}
Frame {
msec: 1136
- hash: "e09776f37769f34bd2d856c6af3a1e53"
+ hash: "4dfdaa030da4c72a0e1a19bfd70b5856"
}
Frame {
msec: 1152
- hash: "085f9dd2539b950d9f62bdcdf4f3b172"
+ hash: "365ad99db7302dfe078f4283af13f5ca"
}
Frame {
msec: 1168
- hash: "3c290084b9c251e039aef4df8581ed31"
+ hash: "f378a096243bd2c6f7e33e0baf24716a"
}
Frame {
msec: 1184
- hash: "893f5dc3cd01ace8d31ebc63e0d7e132"
+ hash: "e972a84715d314e8814cb7fcab1ad379"
}
Frame {
msec: 1200
- hash: "5cadde434641daffa52965659a4a056f"
+ hash: "8826dbafd12ba2a7437623c8967f2699"
}
Frame {
msec: 1216
- hash: "741d34abca5ba1a2e5678f3ca272dbd3"
+ hash: "effa889b33b97f665a21d6562acc45fc"
}
Frame {
msec: 1232
- hash: "96dd3f940c637b085026e224021239bd"
+ hash: "6ebb408651cf5fbb2fa8788e0ec544d6"
}
Frame {
msec: 1248
- hash: "df8334c4ce1ca5f2317a771e787aea96"
+ hash: "c4f45fd05b7b4f00acf80f768e99af38"
}
Frame {
msec: 1264
- hash: "aeef63be208b75c9246248025c977b75"
+ hash: "735a7c461f6b10cd967b03c173bfd81d"
}
Frame {
msec: 1280
- hash: "8722a8e9b1cca4cf20ec31da27f38614"
+ hash: "608cf5ebac88726ffe7e66d763d74e27"
}
Frame {
msec: 1296
- hash: "bdc1392f8e1a55e7c970502785024a89"
+ hash: "6322c5aebdf814bfc5bfaef8b6bb4d91"
}
Frame {
msec: 1312
- hash: "ed2be797ca3d623ca532fea7ca5b1f2c"
+ hash: "730b7cef2e0cf57a4721e77e6849b862"
}
Frame {
msec: 1328
- hash: "bb79d75488df131bf5443371c6b4464f"
+ hash: "13879c0772938e39d820b6fc10e0f7e5"
}
Frame {
msec: 1344
- hash: "0b7dd91d5bc8290d4be1a0af6b2756c2"
+ hash: "0710bf8a2beff02009d4bb02f2404b7b"
}
Frame {
msec: 1360
- hash: "4f1c88a745105934fb94a6a3e3620602"
+ hash: "2cd38c2cbf3d8b7eb3a50b9db4bb8f7f"
}
Frame {
msec: 1376
- hash: "c5a3b476c66e9b6a33f93d5114303669"
+ hash: "4e988a74a3846171f86d4d69ce3407d9"
}
Frame {
msec: 1392
- hash: "3104791545798f8e43ca976c893d078f"
+ hash: "82cc4b40fe1190de5a2cbbf3f11ac7b0"
}
Frame {
msec: 1408
- hash: "3c8c329b4c757ab37054cbcc93840a75"
+ hash: "f15bd345b992b39167165a640ad45794"
}
Frame {
msec: 1424
- hash: "36b1fc7d93664005449d818dd063c8e7"
+ hash: "be5ca66da00327ecc9f5dde2aa3660d2"
}
Frame {
msec: 1440
- hash: "25927d84d7394e912977d25ddf555ddf"
+ hash: "f97a1e863c36477d31a78342c7aa21b7"
}
Frame {
msec: 1456
- hash: "6f226e26d6a40b3688923fb833ce0fd9"
+ hash: "d137a2a6ae95aba3f7a2b2a0560718a5"
}
Frame {
msec: 1472
- hash: "75aaa5301fc8d716371d9fcec6491e81"
+ hash: "e7529db7cf310e41eb0ac42ab86ae317"
}
Frame {
msec: 1488
- hash: "fb87bcb1b620d48d6bfa6eeb94025907"
+ hash: "66914e90881a4a8751ba5391ac41a70b"
}
Frame {
msec: 1504
- hash: "88231c28ef82974f8eb47060e64176d0"
+ hash: "249863a5ef1a14ca0eb4397d206dfc1e"
}
Frame {
msec: 1520
- hash: "06db390a17fc2fa4a93012a168801d05"
+ hash: "26095384b724a5e704c7b627930f4e22"
}
Frame {
msec: 1536
- hash: "41400211939574696e04bcd615130f34"
+ hash: "98281eed5ae9d9f933e47a8fba8709f1"
}
Frame {
msec: 1552
- hash: "ca979c24603d8cd31583c1670f15b1a9"
+ hash: "d9b50c54255edb300e36af2648ef8f30"
}
Frame {
msec: 1568
- hash: "515a32b5c4567c8dec3004c41214daa1"
+ hash: "9bde860d92f5ec979fa5c274fd1c13a1"
}
Frame {
msec: 1584
- hash: "d4fbe8e354db8b1b5fc543daf7007fdb"
+ hash: "39c13a42f920f57d9f9fe85ebc4e68fa"
}
Frame {
msec: 1600
- hash: "ec6351064566a120836cb115bb81e46a"
+ hash: "e80bd130bad05078212089586d6c2731"
}
Frame {
msec: 1616
- hash: "74dcd99e1ba3e5e8447d2695e4c4acd9"
+ hash: "753732b5309fd8dd7daa16761dd7dad0"
}
Frame {
msec: 1632
- hash: "7a751f44c384b87b0c2f633932587795"
+ hash: "2eb56a98f728b224f7db073c6ea3c3b9"
}
Frame {
msec: 1648
- hash: "04e45b241cf498777835f74feeea0c15"
+ hash: "21ab167d173e244ffb471faddf704e81"
}
Frame {
msec: 1664
- hash: "66096d2ef700bb64771fa192219e034a"
+ hash: "9964a0386ae349b909424f588d8decf5"
}
Frame {
msec: 1680
- hash: "1dd2437b0f63a8acaa8c62819d7de10e"
+ hash: "cee42f46df4c879fa6fc378481ec728c"
}
Frame {
msec: 1696
- hash: "89e6b25fc16c5d1eba04cd0f7bd2f910"
+ hash: "4779aeed276cbe4112484d189d1baf8b"
}
Frame {
msec: 1712
- hash: "7cd23dbc40340bc3652255d4a65ce7ec"
+ hash: "d482cd14db734f5fed2eaec7d8c0c555"
}
Frame {
msec: 1728
- hash: "5f94c6ba73d2dbeb8ec90b17cb7fab6f"
+ hash: "1f8b0681711c46afcf8af66df6d7caf8"
}
Frame {
msec: 1744
- hash: "e8e01bc97bbd349e2f64a59d13ca25a3"
+ hash: "44b0e6d69fcd2b7acb499dfdfced026b"
}
Frame {
msec: 1760
- hash: "a0cf054ef1005191637173a22e325891"
+ hash: "b6e25c4a276917b7f7f9189e65d965a8"
}
Frame {
msec: 1776
- hash: "fa8b35c0141049d691735b26eb9410ac"
+ hash: "07e5da936f8d5c84606fcdc49fc6aca2"
}
Frame {
msec: 1792
- hash: "c55b4d3a3ee530480d0a0e0aa52f340f"
+ hash: "f27a54a8d37ec62f54e083f1ca65aada"
}
Frame {
msec: 1808
- hash: "b2639e3e32e513c991525a87448e805d"
+ hash: "074403259022efd08fcbd9d3a3052c79"
}
Frame {
msec: 1824
- hash: "d66f25378bbec3eca675a90795567825"
+ hash: "a126762087c8f94beef81216b6010f0c"
}
Frame {
msec: 1840
- hash: "13bb009108dfcdc861a16ab33a3c4f3a"
+ hash: "96b8c7cebbb9676ea4f028907de71bbf"
}
Frame {
msec: 1856
- hash: "3a09ccaf62d8929def529260da98dc7a"
+ hash: "e6f073522d0af8e504fdb7df971f5e0a"
}
Frame {
msec: 1872
- hash: "79564d7447732fcfdbb81ff2bcd85a4f"
+ hash: "9223ed285f322fae3ba2b52afb408586"
}
Frame {
msec: 1888
- hash: "149c65ef5ec18af4fd264fa284bfa027"
+ hash: "b24575dd4c0b0da0b99a03c46209ed3a"
}
Frame {
msec: 1904
- hash: "e5370728e870ac9f907aafbd17526631"
+ hash: "5c82bc860f64183e66aead451ee5b893"
}
Frame {
msec: 1920
- hash: "98034cff5b93c905bbc53cf9582bc4be"
+ hash: "3172ab9c62b0870d6894b13720e54918"
}
Frame {
msec: 1936
@@ -490,239 +490,239 @@ VisualTest {
}
Frame {
msec: 1952
- hash: "05c3a8016110ad576c349964af3d4d05"
+ hash: "5f8e85839f9ac82f46a17f871c3fffbc"
}
Frame {
msec: 1968
- hash: "91caa4f007dfd1ab7994a11bf4b4fa94"
+ hash: "245219fb6c4aa37d8cba7b5e1f74265f"
}
Frame {
msec: 1984
- hash: "d1fb233313ef6e7be742a504e171f6c0"
+ hash: "b68cfc5366c4ed8d1e5950a1facf0d85"
}
Frame {
msec: 2000
- hash: "0e20bbd3c80189a6d8ea23205bf7b278"
+ hash: "dd5c2d2470cc87d57d35ecc9ae8a3528"
}
Frame {
msec: 2016
- hash: "6f2b8de20e5800bda7a533353bb5805a"
+ hash: "1a15d7f02b35d046305b40f9e6a6839d"
}
Frame {
msec: 2032
- hash: "e25e8c3e7df20b0b7e8f25fba5d2608a"
+ hash: "d44c382ea28d429e6f8bbef9ae17338a"
}
Frame {
msec: 2048
- hash: "8802faef3121ac361b448b42b89d2176"
+ hash: "63598cb09d5ecbeb991c6db778c5c002"
}
Frame {
msec: 2064
- hash: "567c710da8f36b51192a8994611a50a8"
+ hash: "b3fcd0180ecd01e2ad0c0114b3dfbf78"
}
Frame {
msec: 2080
- hash: "d45309aabf9c510234276c28ef4e3c35"
+ hash: "8d441044f5f10da23708d7ddf0472989"
}
Frame {
msec: 2096
- hash: "ef698cc1ea8eee480c57f38a8f704e6b"
+ hash: "6e87518a368c39d68521046773c2f922"
}
Frame {
msec: 2112
- hash: "5301682074b5343d18748cf6e7bada1c"
+ hash: "59e377ccc851ee361e3874ad5ec18e55"
}
Frame {
msec: 2128
- hash: "dd5220c0d94b747cd462e35e41945ae8"
+ hash: "57a9b0431c7db130bfe4d6603f98c1f5"
}
Frame {
msec: 2144
- hash: "0d1c246956283f80eff128bbb5241e03"
+ hash: "526c93727c6321782a373ea6952a8784"
}
Frame {
msec: 2160
- hash: "7b57a3c6ee9b8ae316e2a2d7a1ab630d"
+ hash: "fcd0a4605e27ecb0bac18686e7846b3b"
}
Frame {
msec: 2176
- hash: "61780d8d53f21b275f9ee795c5519cbf"
+ hash: "d697892f9944c67b5aadd7ad641e3ee5"
}
Frame {
msec: 2192
- hash: "1876746b0b6bdc40c808c3afb0ad00e8"
+ hash: "f46fd7e568d0995c518749ec0f5a0882"
}
Frame {
msec: 2208
- hash: "6f7e9a1d8240b037501b486245eb5c33"
+ hash: "31cd2243fb23d4332c02e91f9956f648"
}
Frame {
msec: 2224
- hash: "8a5f3d8d9e0147072690740d567f8a2a"
+ hash: "3b29a9c0121ff127b69abba9c0b13c2c"
}
Frame {
msec: 2240
- hash: "2ea7f42b92e407b50ebf82c841e77f7f"
+ hash: "ecd789e744ebb5dee7f25ebb089407bf"
}
Frame {
msec: 2256
- hash: "7ce3e829b75be2f2f72952c614748b51"
+ hash: "c99a6dfad8d750b7e67c1e3ef1021cbb"
}
Frame {
msec: 2272
- hash: "112cbf9bf521c2fb0f0573081feb6051"
+ hash: "82d18b0c193f0ada9cae68e9f6ad5ff5"
}
Frame {
msec: 2288
- hash: "c6d16bde84f714d3f14a105deb68e989"
+ hash: "a09e8144b06db76f5849561d880f037e"
}
Frame {
msec: 2304
- hash: "f1e3f7416233bc8b3bce90672185cbd2"
+ hash: "3e6922ca54c809a32ed5ef72e19d7ff0"
}
Frame {
msec: 2320
- hash: "009fd4bfc354c91f3766bcf32732b027"
+ hash: "28e46da32bf34b3e1cd3d351e4c40317"
}
Frame {
msec: 2336
- hash: "67220a780fc2cd8e9fbd314c5f000f7c"
+ hash: "297aeeaadc5f3268d95320bc3b33a429"
}
Frame {
msec: 2352
- hash: "c306d1be1dc40fb115b583a83497fbb0"
+ hash: "31721528cdb17b03d3d6ca9f9a91370b"
}
Frame {
msec: 2368
- hash: "f6bedbbffec4447da8fda2d75169644c"
+ hash: "52fd1721330321daaea0b56122a72e5b"
}
Frame {
msec: 2384
- hash: "be4f28bd814ce3688bd7a28a2dc71606"
+ hash: "739c5179b9739021dbb522d01812388c"
}
Frame {
msec: 2400
- hash: "130ec2ff6e06927a02df769743de19b5"
+ hash: "4ae07f58d3a514f5c08f314c5dd445c4"
}
Frame {
msec: 2416
- hash: "34ffeec40133a30903809a30d9108887"
+ hash: "4305ea97d47bac3fb0eebf9181b3ce48"
}
Frame {
msec: 2432
- hash: "133a89cf6c784106066b96f51e43f43a"
+ hash: "21c99059dba068bc145896217cc0883c"
}
Frame {
msec: 2448
- hash: "6336801efb0d62e5b790ff67b76754a5"
+ hash: "0a514ae5d36acc07c7809a7b4f21ed8e"
}
Frame {
msec: 2464
- hash: "04d50179982fdf346a33e346eeb9eb62"
+ hash: "550ce887f462ace686bc6a9021c5cb73"
}
Frame {
msec: 2480
- hash: "5432d629a9bce20e041841d79acf91ab"
+ hash: "b65857dcfa0b1281dd5b9821a12dd8e8"
}
Frame {
msec: 2496
- hash: "afbdef35aae3d79f0ba992a34c46b1dc"
+ hash: "5a6bb448a570e1a3eef142b8054f3717"
}
Frame {
msec: 2512
- hash: "18a051efc4bf47515d2220549970fa69"
+ hash: "b38e2f6b4063e1b8a40292017c5ed4ec"
}
Frame {
msec: 2528
- hash: "a0cde51080347ba164227c8a40cf37c1"
+ hash: "fa7545e6e3fc92d62af2f7651077da5b"
}
Frame {
msec: 2544
- hash: "b2eeabc7208b7a3f9e5a7d16f984be86"
+ hash: "ebf0c79720a5692b761b62c4ba360875"
}
Frame {
msec: 2560
- hash: "ee5c97a5bd22b22a4e18998b6d056517"
+ hash: "cb5356376d97308a4d102c9a53e93abe"
}
Frame {
msec: 2576
- hash: "84f4575d2c4ba3a91ef72cb8caf64e63"
+ hash: "879f434f4901bdcb166294336c60e26a"
}
Frame {
msec: 2592
- hash: "bd14115e10086864de3ab6a7bc13f9a2"
+ hash: "3ab575ac04bdd455346c0460aed413a0"
}
Frame {
msec: 2608
- hash: "9b3672f731fad142ae7e3621a325cf21"
+ hash: "8f08366cb474ca2a1988ebba9d65ecaa"
}
Frame {
msec: 2624
- hash: "17d1887942d2b7297b6f3a2545ec8bf2"
+ hash: "2939cf0235f98aeaf48b3f28964cdddd"
}
Frame {
msec: 2640
- hash: "c5c8b41e74b90fcb9d4da432fa01e361"
+ hash: "9cf4b339914e48f896dda17e08759472"
}
Frame {
msec: 2656
- hash: "a2992b652305077906db9dcbb90c1a23"
+ hash: "3f5568ac7a4386f1d5072f1cda0c35b8"
}
Frame {
msec: 2672
- hash: "bfb30aa4caa43833eca59ceaaca04084"
+ hash: "107edbf8181f79cd7847d0154b6eda11"
}
Frame {
msec: 2688
- hash: "cbb06915ae6176ef52fdb518fb5a12de"
+ hash: "9254497b95b89a7d40903edb04a3764a"
}
Frame {
msec: 2704
- hash: "a894d34c39b274149a9391a5956f0666"
+ hash: "7e7d25a2ee3fbfd67a3b8fecb9fe9202"
}
Frame {
msec: 2720
- hash: "7dcc1008d2287ca15f726854e5e204f2"
+ hash: "03759f59bbd2be573acd6c03eb088edd"
}
Frame {
msec: 2736
- hash: "811db22f9a25dd594f59d97adb41b9ce"
+ hash: "58689762be6c7d3d6de6f23580ec8886"
}
Frame {
msec: 2752
- hash: "6535cb3f4cf2839158f172bd0c1baf88"
+ hash: "0d4e315f9b079a30e6a4294a667f9ebc"
}
Frame {
msec: 2768
- hash: "1919a3d079c06fbb00b6a23d4a47951a"
+ hash: "3f3dfa1c8d160238dae2da79a6a569f3"
}
Frame {
msec: 2784
- hash: "69f3525379f7628c4435d2681a2a0bb8"
+ hash: "b3cd7c3034e2a34c4ae9ed7f3144b2cc"
}
Frame {
msec: 2800
- hash: "4ce4253e733c24a1a988de018916d0b2"
+ hash: "c27d3a9057d1f15c6e0b2d427ac12ad2"
}
Frame {
msec: 2816
- hash: "7610bee04c98b9af5e6ae34f4a1a4a09"
+ hash: "9b25ab315d9bfc582e41c05e88812cbe"
}
Frame {
msec: 2832
- hash: "5e2a2c16c0a218afc3eb9095f3432f41"
+ hash: "e75671bfb99741dcff476690ede42166"
}
Frame {
msec: 2848
- hash: "0124a41ff860d31b3e36973226db2916"
+ hash: "7dd3307fb41277ebcc4339cdb7747d7c"
}
Frame {
msec: 2864
- hash: "a1126e1d8cce43dfb571803a62f790de"
+ hash: "a148bce140f1637e27ae5f0207b75351"
}
Frame {
msec: 2880
- hash: "6eee371fe5cc8b052ca49bb5e3509307"
+ hash: "64e57a31c1baa16bcf47f2202fd6e2ed"
}
Frame {
msec: 2896
@@ -730,239 +730,239 @@ VisualTest {
}
Frame {
msec: 2912
- hash: "331bcae7bd6aeaede3556cf926bd1a0c"
+ hash: "83381c54b1923356c403cad2ae2c3519"
}
Frame {
msec: 2928
- hash: "a7561f3a6ce4fee43e4b06dfe5ee7844"
+ hash: "e110f28619c2ec7c1c8d479793b93e54"
}
Frame {
msec: 2944
- hash: "712e52e72cc01ae29cd7e736a78f94b3"
+ hash: "996a9a698f1a7c673eeef67501d7b81b"
}
Frame {
msec: 2960
- hash: "d34a4414fca4ef7a2cce288d438bfcc1"
+ hash: "6cf2465c8b7c70343a26e981e6492212"
}
Frame {
msec: 2976
- hash: "1c2c5241aee7efcc9a6adcbe01f56609"
+ hash: "3a9078adf3d4ca207c97b62ad525998f"
}
Frame {
msec: 2992
- hash: "90a8547113c36002f62405aac41de5b1"
+ hash: "0bf0d9a6a202119daa6a44f17d03b9ed"
}
Frame {
msec: 3008
- hash: "5726801ea37dcfd2c087c9523b360b55"
+ hash: "6dfadc21810c9176dad599a6f7f672b9"
}
Frame {
msec: 3024
- hash: "a371d1f9ef687f50d433b0efb6bb57c9"
+ hash: "f1f866c6245bd6fd8141abfb8a040d46"
}
Frame {
msec: 3040
- hash: "75e0e2728e2160dcc012a21c759c62d0"
+ hash: "84329287c7555bc6207039ea632632b2"
}
Frame {
msec: 3056
- hash: "428e6d8adbd0e85790365d7537dc37c8"
+ hash: "da7e80527f58c93bce9267958ce4c5d7"
}
Frame {
msec: 3072
- hash: "798babedde2192b4ac9becc5bae3ea62"
+ hash: "cd8eea7543ebc42971b3f41ea21dd4ed"
}
Frame {
msec: 3088
- hash: "39745e87e8e96993fccfed6710c3c14f"
+ hash: "b9abb526dc3447370d847a5bca868b50"
}
Frame {
msec: 3104
- hash: "08624110f2bba4e676b4a339ead23f78"
+ hash: "b8d63ac8331a9375ca06adacb56d12ea"
}
Frame {
msec: 3120
- hash: "1d45fc90eb70a3c21d503284637355de"
+ hash: "20fcdd73a4cc2abebbc462c32fb9b2c8"
}
Frame {
msec: 3136
- hash: "37c6eed126e265f4a60a1bc92879e18e"
+ hash: "3f656f80771828ee6696a2e0a0626ae4"
}
Frame {
msec: 3152
- hash: "a25f2accf6e19eb293a5540efa9447ec"
+ hash: "0d99110edca4f8ec544d10d680d27092"
}
Frame {
msec: 3168
- hash: "5212d86075595cb1a9c47cf683ac411a"
+ hash: "48026f803bd17f56d13dd946fb359e3a"
}
Frame {
msec: 3184
- hash: "8f43028def9e949ca3a15fdec9932a59"
+ hash: "40759d794139327e2e66685c9fcb047b"
}
Frame {
msec: 3200
- hash: "90b55602b8aa530d634db72c202f2d75"
+ hash: "419953a3f882008e82bd733e63e66ab6"
}
Frame {
msec: 3216
- hash: "f5a84978918f8987b49ce500959d81ef"
+ hash: "ddcd288b0a825ef6899755fbad56f2dd"
}
Frame {
msec: 3232
- hash: "588382357311925157e12ae7a576426c"
+ hash: "bc203d9f0f32efdd177353b9589bd127"
}
Frame {
msec: 3248
- hash: "ce3e9a93f60579f77f6503637cb316d0"
+ hash: "a4ae6c449b53545a683cd33bc9274d59"
}
Frame {
msec: 3264
- hash: "63c2ba78f5a81375fe79c5b2b2030b55"
+ hash: "59e7c218b5a1b857469972f966489a43"
}
Frame {
msec: 3280
- hash: "7dceb950e0cae31bddeca1d279a688f3"
+ hash: "521fc5833ab0e3088200e1fea9a887b0"
}
Frame {
msec: 3296
- hash: "c6681bcf60562b16eb515f6b0bfdc751"
+ hash: "bd2386f85afb7516d147bff4c07e239f"
}
Frame {
msec: 3312
- hash: "cd2b41f01af6b80622158bf38a13c609"
+ hash: "5298fdee07ff2ff34121f064fed3db4e"
}
Frame {
msec: 3328
- hash: "69401bc38be274791a26f6ea161eb296"
+ hash: "311a8f163cebf7bafcb47c8e6db40ed1"
}
Frame {
msec: 3344
- hash: "425238342219c4fc66c4a0a8b16c5345"
+ hash: "ad6342bed57257a1616a74e19f2bb484"
}
Frame {
msec: 3360
- hash: "a501082add225fa59f468808d34d1c16"
+ hash: "4eb186c5f4963dc72b3dbc3a9da4df65"
}
Frame {
msec: 3376
- hash: "58bba6d1eb3166e7ac9bfe36cd9a4fa9"
+ hash: "58f1f128001dd1ce0d405595acbaab2a"
}
Frame {
msec: 3392
- hash: "293df1a2bdd526e97d5783f46f74262c"
+ hash: "ba4a39b66cac22fceba9c4ecfdbae363"
}
Frame {
msec: 3408
- hash: "6808ee202e8eae3c72474126b59aa0dc"
+ hash: "bbfde54a4de637bc1c54248e2e342544"
}
Frame {
msec: 3424
- hash: "7ef977f275851649324e333d58777156"
+ hash: "ddc3b4e87782e0472630e2f9f8a57099"
}
Frame {
msec: 3440
- hash: "12007edff45f9cc21a2f633052e4b9d6"
+ hash: "1bf1212686520da772fc18ca7684a924"
}
Frame {
msec: 3456
- hash: "bc1d362d3a42ab3610136727605222dc"
+ hash: "706ec5a3b48123d3b5113d55b71f7968"
}
Frame {
msec: 3472
- hash: "6bfead8d9644f5abdd3b896714521002"
+ hash: "62b08db0c3c4f1313bcf4a1e7b90badb"
}
Frame {
msec: 3488
- hash: "341c311e4b08d69a053c1faffc208838"
+ hash: "ae8409fed9d8919b1af2b4d0eafce670"
}
Frame {
msec: 3504
- hash: "54e4c8001d06c7c48180865598f5f5df"
+ hash: "9f6ed6ada78e42f06f33514e363c736f"
}
Frame {
msec: 3520
- hash: "e69c142bf2a6cf85194de5df91e54886"
+ hash: "97e9a504c2c4ba5329a616810fc19505"
}
Frame {
msec: 3536
- hash: "fb9fda1e790c64aea264a6af0020ce33"
+ hash: "348b6d15b8ef6862818b4fbdb938f241"
}
Frame {
msec: 3552
- hash: "74c27a13090e8eb78bc157daff840e07"
+ hash: "c1845df466f5690a8d7a439d33a27f7d"
}
Frame {
msec: 3568
- hash: "f9a8c1764b0a1625ce336e80a91db00e"
+ hash: "aee2486331275b9f4116b61588ce169e"
}
Frame {
msec: 3584
- hash: "11fd6f7cee3971ebce744f20da77139f"
+ hash: "efca3eaffa3421d68d788ee3f0ec068c"
}
Frame {
msec: 3600
- hash: "6cea030cfc1c53772f14d760d046d7f8"
+ hash: "35f2940b51ed8c4734c23a43bf6fe448"
}
Frame {
msec: 3616
- hash: "599cf14ec73f6812ffb49312d3d8f742"
+ hash: "92b7d34480b7fab4dd39bbccfa8455a5"
}
Frame {
msec: 3632
- hash: "879798ae161f1550096abdfa113e3eac"
+ hash: "4408049f405ecf5c3c696780390e2155"
}
Frame {
msec: 3648
- hash: "4cc9b679554a2a8b809a88504c17f86a"
+ hash: "29aa30678d5c87c79ac67198e4dd7bd4"
}
Frame {
msec: 3664
- hash: "943bca80ab42c1856aa095add705a3fe"
+ hash: "2f88ac156017b20795f01716d9e9f2e8"
}
Frame {
msec: 3680
- hash: "0386a55ebc0cd32b4b7727eac2908a59"
+ hash: "4d72dec4a2e8edcff806c11f3742cf07"
}
Frame {
msec: 3696
- hash: "74ed8ea60f1c1b3fb097eb7f5bca43e8"
+ hash: "3f5ebad282a4aa9c03a17d32aea03151"
}
Frame {
msec: 3712
- hash: "225f78966947d20268f1bea32093c0c9"
+ hash: "a8d289d15353d45159607377de285732"
}
Frame {
msec: 3728
- hash: "d2ed6af6fbdfbdcd9c82a588b72c5f6b"
+ hash: "af2d2fcfa4510e0d26ea90fc7711b0cf"
}
Frame {
msec: 3744
- hash: "3c0e45078e5223335a4204fb8904d116"
+ hash: "aed6897bc8b2163822a052e1cc9ad36b"
}
Frame {
msec: 3760
- hash: "58ad3d7030b079cdedf1a84d6c6a59fc"
+ hash: "bf7077614b5045f79c8697bab1e83839"
}
Frame {
msec: 3776
- hash: "2c8ce9f237a2c373584b661defe84e7f"
+ hash: "e5c8c0bf1fce3a964f4bb911ffee0bdb"
}
Frame {
msec: 3792
- hash: "c2f2ae8c7481036ddda01776db61ef0a"
+ hash: "bcfe4aebc880809f56d480f23b17dfd1"
}
Frame {
msec: 3808
- hash: "7236e9d1e086479acd5047070a4ae700"
+ hash: "2ce342f7864ab26124093edc88585c97"
}
Frame {
msec: 3824
- hash: "7f95776ac1804971cc939f8f1f0fee70"
+ hash: "8be15d95125e03a0282e897096abb443"
}
Frame {
msec: 3840
- hash: "d6d76b50b7d2ec522a51d2512a5aeff8"
+ hash: "a4486f30becceca3ec3cc5c8718af82a"
}
Frame {
msec: 3856
@@ -970,239 +970,239 @@ VisualTest {
}
Frame {
msec: 3872
- hash: "29b8b535c9321752a68b17400c7133ac"
+ hash: "38de7ed0d05015f9b06a4bb278fc96c1"
}
Frame {
msec: 3888
- hash: "846f4f5718bce8dc7a333d8603bfe729"
+ hash: "1cd9a38bb1fc8b06d5c05cd28719d4b3"
}
Frame {
msec: 3904
- hash: "b285f6a417bfb46add698f4193b39552"
+ hash: "682ba6e2eb83ce1b6bf8526b21cf2694"
}
Frame {
msec: 3920
- hash: "b79708e4aa2b05a1c285dd075127460d"
+ hash: "3da075fccb3d26f30530a69f86d999a8"
}
Frame {
msec: 3936
- hash: "0cdded9c7796292cd38a3bc2fdc65597"
+ hash: "b0fb39798dfa94d0898e5e0d7afd1277"
}
Frame {
msec: 3952
- hash: "6f8855c20666a58bbf4ade762403180e"
+ hash: "7e41bbe233d6bc7354ba4516edec4841"
}
Frame {
msec: 3968
- hash: "1a7979b578c8b330099a5e840d5d2bd8"
+ hash: "1d3f24f20ba123940d97f09949cfcc0f"
}
Frame {
msec: 3984
- hash: "30fb74a2bf4e1ec57332713994e405cd"
+ hash: "abc7a82d91e28c5a3ee9ffd663c8c7bd"
}
Frame {
msec: 4000
- hash: "1c7df42f90a867350adca840106d3ba1"
+ hash: "e685c0218a3d80584013806707693eb0"
}
Frame {
msec: 4016
- hash: "5509a232afe047f365465ef8fd9f0af0"
+ hash: "6ff98dc7eb0453f058a5d4cadf86ddf4"
}
Frame {
msec: 4032
- hash: "2149d59ffd7c07bdc0bcb2d8ad9b1ca3"
+ hash: "5a3d0c2c95cb85678f32a8b68dc8d399"
}
Frame {
msec: 4048
- hash: "4b8848019eaf4af67db4db09b98b183e"
+ hash: "d5bde2f063d524ac0e7bcef26d543668"
}
Frame {
msec: 4064
- hash: "e3f6f9db89bd81ce68f8dfd401f1baa8"
+ hash: "64e7bc5e0798ecd009fd05cbc1523977"
}
Frame {
msec: 4080
- hash: "6e8d991c83094c89025148bc0943e554"
+ hash: "3c87a9ee92661da2aacc09b71dd393ca"
}
Frame {
msec: 4096
- hash: "ed4d8bde61581cdcf6128c65d427846c"
+ hash: "bf4806e0e8cb73cded37ca97966078d7"
}
Frame {
msec: 4112
- hash: "c63d0baaa43c4f6a0f0150ecf268b06d"
+ hash: "a5956031dac15dba64bf49c9d308c9c7"
}
Frame {
msec: 4128
- hash: "b36c6a0092f400bb99b2c68a0ba4e6ce"
+ hash: "51395284acf731266eaed86387ad768a"
}
Frame {
msec: 4144
- hash: "b4b1059c1e00ee77fda538f9e71a6206"
+ hash: "489ab28b773d48b8fdf9cf674b1da87f"
}
Frame {
msec: 4160
- hash: "e7c36e10dee12ea2d22d7c17cde9d8ca"
+ hash: "4c6a5b7442a4ff241329157657b8c9f7"
}
Frame {
msec: 4176
- hash: "78d070c37bbc707e38db98896f997349"
+ hash: "629faa780676c705ca8349b8765ed38b"
}
Frame {
msec: 4192
- hash: "e56cb5fbb7713a66ef1f1577eff20db8"
+ hash: "28654cb8801bea906a4f181004ed0e85"
}
Frame {
msec: 4208
- hash: "17e466af39cdde893cf93fa38392bb90"
+ hash: "2abf774ccf33e6d0af4a8c4154e2ab2a"
}
Frame {
msec: 4224
- hash: "75bf32afe1071794bba58623d7165a22"
+ hash: "f1cbdf35081b08b676d1661834829c9a"
}
Frame {
msec: 4240
- hash: "6de50f6748021b99731f6cb25d6d6ec3"
+ hash: "a49ef4ec40d59be1e872c6f8bcdbbb4c"
}
Frame {
msec: 4256
- hash: "cbd224a02668f57413b6999dfb141723"
+ hash: "dab02c8afd3914177bfdf29e68b54291"
}
Frame {
msec: 4272
- hash: "f770a74ce40615095798b244af3cc097"
+ hash: "7bdca9571a346117277b0de6fa1f6e5e"
}
Frame {
msec: 4288
- hash: "faea3d28eb65656392860d888ec087b1"
+ hash: "11dc19768b1a4a787f46082a583c068c"
}
Frame {
msec: 4304
- hash: "1f1d5ee10403184ab83ec5c1f94c4290"
+ hash: "5e72d13702108d55d650a01c1caf2cfb"
}
Frame {
msec: 4320
- hash: "501253b40939d98beac9db85d3cd5b4b"
+ hash: "e5a379841ae54f07d54c4baa78fa7b69"
}
Frame {
msec: 4336
- hash: "0819ece70a98a3ea4371947375b52d46"
+ hash: "88d2363709d377cad251dc956b0ff866"
}
Frame {
msec: 4352
- hash: "2b5f64e4a03aa416a4cf172c99aec498"
+ hash: "5e6db7322e69f41d37efdd35a769df4e"
}
Frame {
msec: 4368
- hash: "931a6fa175b8d540fc745d425a9b93b3"
+ hash: "cc781d136bb48a1a41bd9243327bacc3"
}
Frame {
msec: 4384
- hash: "fa6f54fae79a428029fbd0ae6481bcc5"
+ hash: "69612d6379a204fa1e1c6d7b58f78370"
}
Frame {
msec: 4400
- hash: "7796756dfd30688ed74c2e6e0b05ca5a"
+ hash: "a81c15225bc81a19e22375532a5457ab"
}
Frame {
msec: 4416
- hash: "b42cfbfe1527412b977b8e2c7506cdf0"
+ hash: "a97bb0ac528a1377ef8f6bf655795b69"
}
Frame {
msec: 4432
- hash: "c81300e8d29770c0efd2ab91d75a669a"
+ hash: "7fa6d66219c66ae8aec43e44626b427a"
}
Frame {
msec: 4448
- hash: "923494f5147a85432e6efbcf5b79e26a"
+ hash: "99f47bc80b706692f16c6c5fa3c0c85d"
}
Frame {
msec: 4464
- hash: "3aaffee732cb243bbda5df938f487b2d"
+ hash: "55d6cf7f545c74ed59a8bf040f9d5d58"
}
Frame {
msec: 4480
- hash: "ce8e33f621c7f5cd5047da86bdef4084"
+ hash: "1a07d14fa7866c5268e622d0925cbf4d"
}
Frame {
msec: 4496
- hash: "55e2bc371ea853ee4f3ba22e35c20e8e"
+ hash: "a41b281563c401d0e4ff55f4a3c45e18"
}
Frame {
msec: 4512
- hash: "e8bec4813a6c8f212c70019f907ba904"
+ hash: "6bff67c2f53a4e620c63eea539f4abe0"
}
Frame {
msec: 4528
- hash: "aae9dd25ca9935c478e5d9fa629c6f70"
+ hash: "a5f06e5ff2fd7f390279f7df822c8297"
}
Frame {
msec: 4544
- hash: "30828a796072deb6e6505090dbc2c840"
+ hash: "213b174770c13105b89a1d88cd2f0b7c"
}
Frame {
msec: 4560
- hash: "c8ebeb539a6ebb2ca47544f7f1617da9"
+ hash: "dde34ca92317a54ddaa2f9bff515d91c"
}
Frame {
msec: 4576
- hash: "3ad9a23b57b0938a430c636910dc312f"
+ hash: "12446cca2aae19fd721cda11bbb51bae"
}
Frame {
msec: 4592
- hash: "1a12587ebbae18dd761c70c4ed845fa5"
+ hash: "f4d00502cab0a843563fcfd336b74596"
}
Frame {
msec: 4608
- hash: "f1d6ee0cd7aaa221d151c2d32e963358"
+ hash: "b6ae2b396adf6068ef3a6027e4b175db"
}
Frame {
msec: 4624
- hash: "e9bbf398abc09d9740dce4e3843c53f4"
+ hash: "370dabffdfc0bebf5d25abfaefff399c"
}
Frame {
msec: 4640
- hash: "f839c105f1897f028611d557b11f5814"
+ hash: "fd496e8c03f85a872bd5ee6e8a85db7f"
}
Frame {
msec: 4656
- hash: "b923b46ccfe53ceb7ea228b12f44842d"
+ hash: "0999335427d63f318e166ea8662c4c22"
}
Frame {
msec: 4672
- hash: "8e3708a8f2ba63f7cb01b8d66d1b3dec"
+ hash: "5a4eb9267cd35a71f6c2daaca1a582be"
}
Frame {
msec: 4688
- hash: "68659fce94c9d019a1d5da6273186674"
+ hash: "4270d7a26d56f1d805b647c5ec7cc6ce"
}
Frame {
msec: 4704
- hash: "56797caf6f2987b7d03c0401871d87e3"
+ hash: "334f1e3c8520196016352bf4d00fbc18"
}
Frame {
msec: 4720
- hash: "de0d89aaa5b1ce0ed99d2906b63e7434"
+ hash: "2bf704e85c197c776a188927a80deaad"
}
Frame {
msec: 4736
- hash: "e3802a76b64eeaeae06b23134b5198a9"
+ hash: "e2c5c42e55dc185977bd5049eb4bd3d2"
}
Frame {
msec: 4752
- hash: "1a3ddf57aa429a407705ae268441c5b5"
+ hash: "7ead4353fdc135d6b959be0ce22955e3"
}
Frame {
msec: 4768
- hash: "319b09c0e4a8c0d1f507594b53a407c4"
+ hash: "ab42998e1e17ac8637d76dc0cf356c7a"
}
Frame {
msec: 4784
- hash: "fd54c9ee19133b0f75c56e4d6472cdad"
+ hash: "030f34f8caf0814eaaf18ea5fda669dd"
}
Frame {
msec: 4800
- hash: "e6b983b491133a41b753411c587c69ec"
+ hash: "6e12a04ac25553142875a10a5c8e46e8"
}
Frame {
msec: 4816
@@ -1210,114 +1210,114 @@ VisualTest {
}
Frame {
msec: 4832
- hash: "2760407d7defa4738d7b9ecb243f41a9"
+ hash: "e2f2ab9a3fe6a3a375341010c91017bd"
}
Frame {
msec: 4848
- hash: "1ff562f05454980d4f677e783ba4bf75"
+ hash: "9301889debd3932772a1c81314eb1ef2"
}
Frame {
msec: 4864
- hash: "43ad6e0926f812af5553e3a8492404e9"
+ hash: "671feec6eb1166c612a22405db9c044e"
}
Frame {
msec: 4880
- hash: "b9c34d52c0c44dcdf8a2ca8a0e20ae65"
+ hash: "648215ffa5448dc173165d24389c014e"
}
Frame {
msec: 4896
- hash: "4fd7f6d183626686569462a9828837d2"
+ hash: "a70806b54806f29d0e240cd63d86b77e"
}
Frame {
msec: 4912
- hash: "3b904440f68aa0009707b5f3a0c2af74"
+ hash: "4bf9ffe611c52c21fbdb84221d3d4dba"
}
Frame {
msec: 4928
- hash: "cc58910f0881ec5b3cb2eec404c19e16"
+ hash: "ae78202b0ebd4c13a92d468a7470bdc9"
}
Frame {
msec: 4944
- hash: "8b638f369c3629530d91e6acac8c5fdf"
+ hash: "fb0c3d6c3e3479abb6a1b44b1a5f3785"
}
Frame {
msec: 4960
- hash: "b403e21b14646ac0cdaee2027125c0ad"
+ hash: "48906c21e17479807f736d7f7713f6b0"
}
Frame {
msec: 4976
- hash: "d037545cc68b7582c400c8c9da49ff2a"
+ hash: "a661a461542b3078dd1dad25bf6d8414"
}
Frame {
msec: 4992
- hash: "551435ecb008ff217eb65a5a77a28090"
+ hash: "387deb0df0c59cfb120313946c4e5c9a"
}
Frame {
msec: 5008
- hash: "a1684c1c0938386bbfb309969114beee"
+ hash: "f2473c6e4877f3035f0b511ff2d27684"
}
Frame {
msec: 5024
- hash: "f803bd7bdc97bb8bbb5103a54901d756"
+ hash: "f88d3767ccd773930ef9d99dfd0e8c17"
}
Frame {
msec: 5040
- hash: "de956b3223e24a615713c35faa403128"
+ hash: "aef8a93d2caafec839d425184176bcc7"
}
Frame {
msec: 5056
- hash: "9124b4e5f5dd374e44f3f57fe3d6809b"
+ hash: "e73c4521144b2c810f15239e6d8fa468"
}
Frame {
msec: 5072
- hash: "5b8313c622796aa87248b38ab336bcf8"
+ hash: "a66856750cc5aa7a21ffb6e0a9c94306"
}
Frame {
msec: 5088
- hash: "de6477fc7e6b8f14a7a51f9cf762ee79"
+ hash: "22bce57e360790c356564a0568ec3bee"
}
Frame {
msec: 5104
- hash: "0d908ef6e3ea15455e35a9ebbc90c735"
+ hash: "55edcaeed37c1390eee2619d52a2eb03"
}
Frame {
msec: 5120
- hash: "bd1d7ad510cd5e04283f6167a5a8e2df"
+ hash: "51d8495324954f1bd62caa67d15e9ab2"
}
Frame {
msec: 5136
- hash: "2ec7418477158ee60afe123fa2b7ce4b"
+ hash: "bfcbba7e970af922ee87fbbe936eaa84"
}
Frame {
msec: 5152
- hash: "04c671070b1eba13380aa2fbb672d3a1"
+ hash: "a7652fe427ca7b8ef37dbf9a6097f8af"
}
Frame {
msec: 5168
- hash: "ce031ba5b388dfaff34674eb71f790f2"
+ hash: "d5ab00fc274a7fd568af514c55f24e04"
}
Frame {
msec: 5184
- hash: "e754141341d9f81366f21820e46bd1ca"
+ hash: "71fd1fe13a14632ff54ad7a87be68bca"
}
Frame {
msec: 5200
- hash: "acf56542617bc742ad729709645ac919"
+ hash: "761f9b41ce4136619f89c73746ab176e"
}
Frame {
msec: 5216
- hash: "c50698470bc6c1ea04633b9e819a2d4d"
+ hash: "cfd826f91f6f880816d505c93a8f125a"
}
Frame {
msec: 5232
- hash: "c156d3540c3cf6d406b72696fd6e9148"
+ hash: "33fbc77640cc73c17a0f68db5f70ddec"
}
Frame {
msec: 5248
- hash: "82a04f09cd35db0dbf012797625368e4"
+ hash: "ef925f6709f7603d8acddbbe3e3b0426"
}
Frame {
msec: 5264
- hash: "3b9ccb93f6375ea401c1fc3bcdf847d5"
+ hash: "044c1f37e37a68fbfbb9ddbc2da4300a"
}
}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext.0.png
index 591c1ef..cfa61a9 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.0.png
index dc90e0d..be676c0 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext3.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext3.0.png
index c787029..df2fe2f 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext3.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext3.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext.0.png
index fdd64ac..76e5b9f 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext2.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext2.0.png
index 1286e54..bb65ade 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext2.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext2.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext.0.png
index 56d98ff..b4e1d3a 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext2.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext2.0.png
index 1ab1eb5..4177b9e 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext2.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext2.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext.0.png
index 68921f6..36e5d35 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext2.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext2.0.png
index c9450c7..34f8e38 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext2.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext2.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.0.png
index 59fc0fc..8d74b8d 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.1.png
index 2747b50..8a642d2 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.1.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.2.png
index 74efe73..5698741 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.2.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.2.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.3.png
index 02f6e17..7f56f34 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.3.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.3.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.4.png
index 59fc0fc..8d74b8d 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.4.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.4.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.qml
index 760a831..a4ba005 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.qml
@@ -10,95 +10,95 @@ VisualTest {
}
Frame {
msec: 32
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 48
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 64
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 80
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 96
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 112
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 128
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 144
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 160
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 176
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 192
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 208
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 224
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 240
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 256
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 272
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 288
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 304
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 320
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 336
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 352
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 368
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 384
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Key {
type: 6
@@ -110,15 +110,15 @@ VisualTest {
}
Frame {
msec: 400
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 416
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 432
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Key {
type: 7
@@ -130,27 +130,27 @@ VisualTest {
}
Frame {
msec: 448
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 464
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 480
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 496
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 512
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 528
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Key {
type: 6
@@ -162,15 +162,15 @@ VisualTest {
}
Frame {
msec: 544
- hash: "1465f1f32ba4a6180ab3460298febe26"
+ hash: "53f9d63bacad27fd73c2f84b82599dbc"
}
Frame {
msec: 560
- hash: "1465f1f32ba4a6180ab3460298febe26"
+ hash: "53f9d63bacad27fd73c2f84b82599dbc"
}
Frame {
msec: 576
- hash: "1465f1f32ba4a6180ab3460298febe26"
+ hash: "53f9d63bacad27fd73c2f84b82599dbc"
}
Key {
type: 7
@@ -182,27 +182,27 @@ VisualTest {
}
Frame {
msec: 592
- hash: "1465f1f32ba4a6180ab3460298febe26"
+ hash: "53f9d63bacad27fd73c2f84b82599dbc"
}
Frame {
msec: 608
- hash: "1465f1f32ba4a6180ab3460298febe26"
+ hash: "53f9d63bacad27fd73c2f84b82599dbc"
}
Frame {
msec: 624
- hash: "1465f1f32ba4a6180ab3460298febe26"
+ hash: "53f9d63bacad27fd73c2f84b82599dbc"
}
Frame {
msec: 640
- hash: "1465f1f32ba4a6180ab3460298febe26"
+ hash: "53f9d63bacad27fd73c2f84b82599dbc"
}
Frame {
msec: 656
- hash: "1465f1f32ba4a6180ab3460298febe26"
+ hash: "53f9d63bacad27fd73c2f84b82599dbc"
}
Frame {
msec: 672
- hash: "1465f1f32ba4a6180ab3460298febe26"
+ hash: "53f9d63bacad27fd73c2f84b82599dbc"
}
Key {
type: 6
@@ -214,19 +214,19 @@ VisualTest {
}
Frame {
msec: 688
- hash: "1bcb9bc9d6606329ad5376ea6f608bf8"
+ hash: "b069c174a1b9589ed3137cd01f870b17"
}
Frame {
msec: 704
- hash: "1bcb9bc9d6606329ad5376ea6f608bf8"
+ hash: "b069c174a1b9589ed3137cd01f870b17"
}
Frame {
msec: 720
- hash: "1bcb9bc9d6606329ad5376ea6f608bf8"
+ hash: "b069c174a1b9589ed3137cd01f870b17"
}
Frame {
msec: 736
- hash: "1bcb9bc9d6606329ad5376ea6f608bf8"
+ hash: "b069c174a1b9589ed3137cd01f870b17"
}
Key {
type: 7
@@ -238,23 +238,23 @@ VisualTest {
}
Frame {
msec: 752
- hash: "1bcb9bc9d6606329ad5376ea6f608bf8"
+ hash: "b069c174a1b9589ed3137cd01f870b17"
}
Frame {
msec: 768
- hash: "1bcb9bc9d6606329ad5376ea6f608bf8"
+ hash: "b069c174a1b9589ed3137cd01f870b17"
}
Frame {
msec: 784
- hash: "1bcb9bc9d6606329ad5376ea6f608bf8"
+ hash: "b069c174a1b9589ed3137cd01f870b17"
}
Frame {
msec: 800
- hash: "1bcb9bc9d6606329ad5376ea6f608bf8"
+ hash: "b069c174a1b9589ed3137cd01f870b17"
}
Frame {
msec: 816
- hash: "1bcb9bc9d6606329ad5376ea6f608bf8"
+ hash: "b069c174a1b9589ed3137cd01f870b17"
}
Key {
type: 6
@@ -266,19 +266,19 @@ VisualTest {
}
Frame {
msec: 832
- hash: "9eda76efdd179847e89b9e96ead51e4a"
+ hash: "fa22742b8778a3b63ce7d6699dbf7482"
}
Frame {
msec: 848
- hash: "9eda76efdd179847e89b9e96ead51e4a"
+ hash: "fa22742b8778a3b63ce7d6699dbf7482"
}
Frame {
msec: 864
- hash: "9eda76efdd179847e89b9e96ead51e4a"
+ hash: "fa22742b8778a3b63ce7d6699dbf7482"
}
Frame {
msec: 880
- hash: "9eda76efdd179847e89b9e96ead51e4a"
+ hash: "fa22742b8778a3b63ce7d6699dbf7482"
}
Key {
type: 7
@@ -290,19 +290,19 @@ VisualTest {
}
Frame {
msec: 896
- hash: "9eda76efdd179847e89b9e96ead51e4a"
+ hash: "fa22742b8778a3b63ce7d6699dbf7482"
}
Frame {
msec: 912
- hash: "9eda76efdd179847e89b9e96ead51e4a"
+ hash: "fa22742b8778a3b63ce7d6699dbf7482"
}
Frame {
msec: 928
- hash: "9eda76efdd179847e89b9e96ead51e4a"
+ hash: "fa22742b8778a3b63ce7d6699dbf7482"
}
Frame {
msec: 944
- hash: "9eda76efdd179847e89b9e96ead51e4a"
+ hash: "fa22742b8778a3b63ce7d6699dbf7482"
}
Key {
type: 6
@@ -314,7 +314,7 @@ VisualTest {
}
Frame {
msec: 960
- hash: "a7415d0abcc670ba02c2a00b3b5fc647"
+ hash: "3624b85c9362dfeff911cd5426f11ada"
}
Frame {
msec: 976
@@ -322,11 +322,11 @@ VisualTest {
}
Frame {
msec: 992
- hash: "a7415d0abcc670ba02c2a00b3b5fc647"
+ hash: "3624b85c9362dfeff911cd5426f11ada"
}
Frame {
msec: 1008
- hash: "a7415d0abcc670ba02c2a00b3b5fc647"
+ hash: "3624b85c9362dfeff911cd5426f11ada"
}
Key {
type: 7
@@ -338,23 +338,23 @@ VisualTest {
}
Frame {
msec: 1024
- hash: "a7415d0abcc670ba02c2a00b3b5fc647"
+ hash: "3624b85c9362dfeff911cd5426f11ada"
}
Frame {
msec: 1040
- hash: "a7415d0abcc670ba02c2a00b3b5fc647"
+ hash: "3624b85c9362dfeff911cd5426f11ada"
}
Frame {
msec: 1056
- hash: "a7415d0abcc670ba02c2a00b3b5fc647"
+ hash: "3624b85c9362dfeff911cd5426f11ada"
}
Frame {
msec: 1072
- hash: "a7415d0abcc670ba02c2a00b3b5fc647"
+ hash: "3624b85c9362dfeff911cd5426f11ada"
}
Frame {
msec: 1088
- hash: "a7415d0abcc670ba02c2a00b3b5fc647"
+ hash: "3624b85c9362dfeff911cd5426f11ada"
}
Key {
type: 6
@@ -366,15 +366,15 @@ VisualTest {
}
Frame {
msec: 1104
- hash: "fe998f3c7c780fddfa6a595936d2e78e"
+ hash: "c8b5e39f4930399527236905cdbcb546"
}
Frame {
msec: 1120
- hash: "fe998f3c7c780fddfa6a595936d2e78e"
+ hash: "c8b5e39f4930399527236905cdbcb546"
}
Frame {
msec: 1136
- hash: "fe998f3c7c780fddfa6a595936d2e78e"
+ hash: "c8b5e39f4930399527236905cdbcb546"
}
Key {
type: 7
@@ -386,23 +386,23 @@ VisualTest {
}
Frame {
msec: 1152
- hash: "fe998f3c7c780fddfa6a595936d2e78e"
+ hash: "c8b5e39f4930399527236905cdbcb546"
}
Frame {
msec: 1168
- hash: "fe998f3c7c780fddfa6a595936d2e78e"
+ hash: "c8b5e39f4930399527236905cdbcb546"
}
Frame {
msec: 1184
- hash: "fe998f3c7c780fddfa6a595936d2e78e"
+ hash: "c8b5e39f4930399527236905cdbcb546"
}
Frame {
msec: 1200
- hash: "fe998f3c7c780fddfa6a595936d2e78e"
+ hash: "c8b5e39f4930399527236905cdbcb546"
}
Frame {
msec: 1216
- hash: "fe998f3c7c780fddfa6a595936d2e78e"
+ hash: "c8b5e39f4930399527236905cdbcb546"
}
Key {
type: 6
@@ -414,19 +414,19 @@ VisualTest {
}
Frame {
msec: 1232
- hash: "6ec9e863238467c249f62bdd38b68490"
+ hash: "b80db720c6371aeaf99f4787fec2c5a3"
}
Frame {
msec: 1248
- hash: "6ec9e863238467c249f62bdd38b68490"
+ hash: "b80db720c6371aeaf99f4787fec2c5a3"
}
Frame {
msec: 1264
- hash: "6ec9e863238467c249f62bdd38b68490"
+ hash: "b80db720c6371aeaf99f4787fec2c5a3"
}
Frame {
msec: 1280
- hash: "6ec9e863238467c249f62bdd38b68490"
+ hash: "b80db720c6371aeaf99f4787fec2c5a3"
}
Key {
type: 7
@@ -438,19 +438,19 @@ VisualTest {
}
Frame {
msec: 1296
- hash: "6ec9e863238467c249f62bdd38b68490"
+ hash: "b80db720c6371aeaf99f4787fec2c5a3"
}
Frame {
msec: 1312
- hash: "6ec9e863238467c249f62bdd38b68490"
+ hash: "b80db720c6371aeaf99f4787fec2c5a3"
}
Frame {
msec: 1328
- hash: "6ec9e863238467c249f62bdd38b68490"
+ hash: "b80db720c6371aeaf99f4787fec2c5a3"
}
Frame {
msec: 1344
- hash: "6ec9e863238467c249f62bdd38b68490"
+ hash: "b80db720c6371aeaf99f4787fec2c5a3"
}
Key {
type: 6
@@ -462,19 +462,19 @@ VisualTest {
}
Frame {
msec: 1360
- hash: "7f895d1255301397298cd6b92282e4f7"
+ hash: "6f08f7b6337d5ebb305579bb71ba31d8"
}
Frame {
msec: 1376
- hash: "7f895d1255301397298cd6b92282e4f7"
+ hash: "6f08f7b6337d5ebb305579bb71ba31d8"
}
Frame {
msec: 1392
- hash: "7f895d1255301397298cd6b92282e4f7"
+ hash: "6f08f7b6337d5ebb305579bb71ba31d8"
}
Frame {
msec: 1408
- hash: "7f895d1255301397298cd6b92282e4f7"
+ hash: "6f08f7b6337d5ebb305579bb71ba31d8"
}
Key {
type: 7
@@ -486,23 +486,23 @@ VisualTest {
}
Frame {
msec: 1424
- hash: "7f895d1255301397298cd6b92282e4f7"
+ hash: "6f08f7b6337d5ebb305579bb71ba31d8"
}
Frame {
msec: 1440
- hash: "7f895d1255301397298cd6b92282e4f7"
+ hash: "6f08f7b6337d5ebb305579bb71ba31d8"
}
Frame {
msec: 1456
- hash: "7f895d1255301397298cd6b92282e4f7"
+ hash: "6f08f7b6337d5ebb305579bb71ba31d8"
}
Frame {
msec: 1472
- hash: "7f895d1255301397298cd6b92282e4f7"
+ hash: "6f08f7b6337d5ebb305579bb71ba31d8"
}
Frame {
msec: 1488
- hash: "7f895d1255301397298cd6b92282e4f7"
+ hash: "6f08f7b6337d5ebb305579bb71ba31d8"
}
Key {
type: 6
@@ -514,15 +514,15 @@ VisualTest {
}
Frame {
msec: 1504
- hash: "64f5712c1f96345f2a2ad103e6fbd734"
+ hash: "da047993eb77afffee6b8f0f210ca2d6"
}
Frame {
msec: 1520
- hash: "64f5712c1f96345f2a2ad103e6fbd734"
+ hash: "da047993eb77afffee6b8f0f210ca2d6"
}
Frame {
msec: 1536
- hash: "64f5712c1f96345f2a2ad103e6fbd734"
+ hash: "da047993eb77afffee6b8f0f210ca2d6"
}
Key {
type: 7
@@ -534,79 +534,79 @@ VisualTest {
}
Frame {
msec: 1552
- hash: "64f5712c1f96345f2a2ad103e6fbd734"
+ hash: "da047993eb77afffee6b8f0f210ca2d6"
}
Frame {
msec: 1568
- hash: "64f5712c1f96345f2a2ad103e6fbd734"
+ hash: "da047993eb77afffee6b8f0f210ca2d6"
}
Frame {
msec: 1584
- hash: "64f5712c1f96345f2a2ad103e6fbd734"
+ hash: "da047993eb77afffee6b8f0f210ca2d6"
}
Frame {
msec: 1600
- hash: "64f5712c1f96345f2a2ad103e6fbd734"
+ hash: "da047993eb77afffee6b8f0f210ca2d6"
}
Frame {
msec: 1616
- hash: "64f5712c1f96345f2a2ad103e6fbd734"
+ hash: "da047993eb77afffee6b8f0f210ca2d6"
}
Frame {
msec: 1632
- hash: "64f5712c1f96345f2a2ad103e6fbd734"
+ hash: "da047993eb77afffee6b8f0f210ca2d6"
}
Frame {
msec: 1648
- hash: "64f5712c1f96345f2a2ad103e6fbd734"
+ hash: "da047993eb77afffee6b8f0f210ca2d6"
}
Frame {
msec: 1664
- hash: "64f5712c1f96345f2a2ad103e6fbd734"
+ hash: "da047993eb77afffee6b8f0f210ca2d6"
}
Frame {
msec: 1680
- hash: "64f5712c1f96345f2a2ad103e6fbd734"
+ hash: "da047993eb77afffee6b8f0f210ca2d6"
}
Frame {
msec: 1696
- hash: "64f5712c1f96345f2a2ad103e6fbd734"
+ hash: "da047993eb77afffee6b8f0f210ca2d6"
}
Frame {
msec: 1712
- hash: "64f5712c1f96345f2a2ad103e6fbd734"
+ hash: "da047993eb77afffee6b8f0f210ca2d6"
}
Frame {
msec: 1728
- hash: "64f5712c1f96345f2a2ad103e6fbd734"
+ hash: "da047993eb77afffee6b8f0f210ca2d6"
}
Frame {
msec: 1744
- hash: "64f5712c1f96345f2a2ad103e6fbd734"
+ hash: "da047993eb77afffee6b8f0f210ca2d6"
}
Frame {
msec: 1760
- hash: "64f5712c1f96345f2a2ad103e6fbd734"
+ hash: "da047993eb77afffee6b8f0f210ca2d6"
}
Frame {
msec: 1776
- hash: "64f5712c1f96345f2a2ad103e6fbd734"
+ hash: "da047993eb77afffee6b8f0f210ca2d6"
}
Frame {
msec: 1792
- hash: "64f5712c1f96345f2a2ad103e6fbd734"
+ hash: "da047993eb77afffee6b8f0f210ca2d6"
}
Frame {
msec: 1808
- hash: "64f5712c1f96345f2a2ad103e6fbd734"
+ hash: "da047993eb77afffee6b8f0f210ca2d6"
}
Frame {
msec: 1824
- hash: "64f5712c1f96345f2a2ad103e6fbd734"
+ hash: "da047993eb77afffee6b8f0f210ca2d6"
}
Frame {
msec: 1840
- hash: "64f5712c1f96345f2a2ad103e6fbd734"
+ hash: "da047993eb77afffee6b8f0f210ca2d6"
}
Key {
type: 6
@@ -618,23 +618,23 @@ VisualTest {
}
Frame {
msec: 1856
- hash: "7f895d1255301397298cd6b92282e4f7"
+ hash: "6f08f7b6337d5ebb305579bb71ba31d8"
}
Frame {
msec: 1872
- hash: "7f895d1255301397298cd6b92282e4f7"
+ hash: "6f08f7b6337d5ebb305579bb71ba31d8"
}
Frame {
msec: 1888
- hash: "7f895d1255301397298cd6b92282e4f7"
+ hash: "6f08f7b6337d5ebb305579bb71ba31d8"
}
Frame {
msec: 1904
- hash: "7f895d1255301397298cd6b92282e4f7"
+ hash: "6f08f7b6337d5ebb305579bb71ba31d8"
}
Frame {
msec: 1920
- hash: "7f895d1255301397298cd6b92282e4f7"
+ hash: "6f08f7b6337d5ebb305579bb71ba31d8"
}
Frame {
msec: 1936
@@ -642,15 +642,15 @@ VisualTest {
}
Frame {
msec: 1952
- hash: "7f895d1255301397298cd6b92282e4f7"
+ hash: "6f08f7b6337d5ebb305579bb71ba31d8"
}
Frame {
msec: 1968
- hash: "7f895d1255301397298cd6b92282e4f7"
+ hash: "6f08f7b6337d5ebb305579bb71ba31d8"
}
Frame {
msec: 1984
- hash: "7f895d1255301397298cd6b92282e4f7"
+ hash: "6f08f7b6337d5ebb305579bb71ba31d8"
}
Key {
type: 7
@@ -662,23 +662,23 @@ VisualTest {
}
Frame {
msec: 2000
- hash: "7f895d1255301397298cd6b92282e4f7"
+ hash: "6f08f7b6337d5ebb305579bb71ba31d8"
}
Frame {
msec: 2016
- hash: "7f895d1255301397298cd6b92282e4f7"
+ hash: "6f08f7b6337d5ebb305579bb71ba31d8"
}
Frame {
msec: 2032
- hash: "7f895d1255301397298cd6b92282e4f7"
+ hash: "6f08f7b6337d5ebb305579bb71ba31d8"
}
Frame {
msec: 2048
- hash: "7f895d1255301397298cd6b92282e4f7"
+ hash: "6f08f7b6337d5ebb305579bb71ba31d8"
}
Frame {
msec: 2064
- hash: "7f895d1255301397298cd6b92282e4f7"
+ hash: "6f08f7b6337d5ebb305579bb71ba31d8"
}
Key {
type: 6
@@ -690,23 +690,23 @@ VisualTest {
}
Frame {
msec: 2080
- hash: "6ec9e863238467c249f62bdd38b68490"
+ hash: "b80db720c6371aeaf99f4787fec2c5a3"
}
Frame {
msec: 2096
- hash: "6ec9e863238467c249f62bdd38b68490"
+ hash: "b80db720c6371aeaf99f4787fec2c5a3"
}
Frame {
msec: 2112
- hash: "6ec9e863238467c249f62bdd38b68490"
+ hash: "b80db720c6371aeaf99f4787fec2c5a3"
}
Frame {
msec: 2128
- hash: "6ec9e863238467c249f62bdd38b68490"
+ hash: "b80db720c6371aeaf99f4787fec2c5a3"
}
Frame {
msec: 2144
- hash: "6ec9e863238467c249f62bdd38b68490"
+ hash: "b80db720c6371aeaf99f4787fec2c5a3"
}
Key {
type: 7
@@ -718,23 +718,23 @@ VisualTest {
}
Frame {
msec: 2160
- hash: "6ec9e863238467c249f62bdd38b68490"
+ hash: "b80db720c6371aeaf99f4787fec2c5a3"
}
Frame {
msec: 2176
- hash: "6ec9e863238467c249f62bdd38b68490"
+ hash: "b80db720c6371aeaf99f4787fec2c5a3"
}
Frame {
msec: 2192
- hash: "6ec9e863238467c249f62bdd38b68490"
+ hash: "b80db720c6371aeaf99f4787fec2c5a3"
}
Frame {
msec: 2208
- hash: "6ec9e863238467c249f62bdd38b68490"
+ hash: "b80db720c6371aeaf99f4787fec2c5a3"
}
Frame {
msec: 2224
- hash: "6ec9e863238467c249f62bdd38b68490"
+ hash: "b80db720c6371aeaf99f4787fec2c5a3"
}
Key {
type: 6
@@ -746,11 +746,11 @@ VisualTest {
}
Frame {
msec: 2240
- hash: "fe998f3c7c780fddfa6a595936d2e78e"
+ hash: "c8b5e39f4930399527236905cdbcb546"
}
Frame {
msec: 2256
- hash: "fe998f3c7c780fddfa6a595936d2e78e"
+ hash: "c8b5e39f4930399527236905cdbcb546"
}
Key {
type: 7
@@ -762,23 +762,23 @@ VisualTest {
}
Frame {
msec: 2272
- hash: "fe998f3c7c780fddfa6a595936d2e78e"
+ hash: "c8b5e39f4930399527236905cdbcb546"
}
Frame {
msec: 2288
- hash: "fe998f3c7c780fddfa6a595936d2e78e"
+ hash: "c8b5e39f4930399527236905cdbcb546"
}
Frame {
msec: 2304
- hash: "fe998f3c7c780fddfa6a595936d2e78e"
+ hash: "c8b5e39f4930399527236905cdbcb546"
}
Frame {
msec: 2320
- hash: "fe998f3c7c780fddfa6a595936d2e78e"
+ hash: "c8b5e39f4930399527236905cdbcb546"
}
Frame {
msec: 2336
- hash: "fe998f3c7c780fddfa6a595936d2e78e"
+ hash: "c8b5e39f4930399527236905cdbcb546"
}
Key {
type: 6
@@ -790,15 +790,15 @@ VisualTest {
}
Frame {
msec: 2352
- hash: "a7415d0abcc670ba02c2a00b3b5fc647"
+ hash: "3624b85c9362dfeff911cd5426f11ada"
}
Frame {
msec: 2368
- hash: "a7415d0abcc670ba02c2a00b3b5fc647"
+ hash: "3624b85c9362dfeff911cd5426f11ada"
}
Frame {
msec: 2384
- hash: "a7415d0abcc670ba02c2a00b3b5fc647"
+ hash: "3624b85c9362dfeff911cd5426f11ada"
}
Key {
type: 7
@@ -810,55 +810,55 @@ VisualTest {
}
Frame {
msec: 2400
- hash: "a7415d0abcc670ba02c2a00b3b5fc647"
+ hash: "3624b85c9362dfeff911cd5426f11ada"
}
Frame {
msec: 2416
- hash: "a7415d0abcc670ba02c2a00b3b5fc647"
+ hash: "3624b85c9362dfeff911cd5426f11ada"
}
Frame {
msec: 2432
- hash: "a7415d0abcc670ba02c2a00b3b5fc647"
+ hash: "3624b85c9362dfeff911cd5426f11ada"
}
Frame {
msec: 2448
- hash: "a7415d0abcc670ba02c2a00b3b5fc647"
+ hash: "3624b85c9362dfeff911cd5426f11ada"
}
Frame {
msec: 2464
- hash: "a7415d0abcc670ba02c2a00b3b5fc647"
+ hash: "3624b85c9362dfeff911cd5426f11ada"
}
Frame {
msec: 2480
- hash: "a7415d0abcc670ba02c2a00b3b5fc647"
+ hash: "3624b85c9362dfeff911cd5426f11ada"
}
Frame {
msec: 2496
- hash: "a7415d0abcc670ba02c2a00b3b5fc647"
+ hash: "3624b85c9362dfeff911cd5426f11ada"
}
Frame {
msec: 2512
- hash: "a7415d0abcc670ba02c2a00b3b5fc647"
+ hash: "3624b85c9362dfeff911cd5426f11ada"
}
Frame {
msec: 2528
- hash: "a7415d0abcc670ba02c2a00b3b5fc647"
+ hash: "3624b85c9362dfeff911cd5426f11ada"
}
Frame {
msec: 2544
- hash: "a7415d0abcc670ba02c2a00b3b5fc647"
+ hash: "3624b85c9362dfeff911cd5426f11ada"
}
Frame {
msec: 2560
- hash: "a7415d0abcc670ba02c2a00b3b5fc647"
+ hash: "3624b85c9362dfeff911cd5426f11ada"
}
Frame {
msec: 2576
- hash: "a7415d0abcc670ba02c2a00b3b5fc647"
+ hash: "3624b85c9362dfeff911cd5426f11ada"
}
Frame {
msec: 2592
- hash: "a7415d0abcc670ba02c2a00b3b5fc647"
+ hash: "3624b85c9362dfeff911cd5426f11ada"
}
Key {
type: 6
@@ -870,23 +870,23 @@ VisualTest {
}
Frame {
msec: 2608
- hash: "9eda76efdd179847e89b9e96ead51e4a"
+ hash: "fa22742b8778a3b63ce7d6699dbf7482"
}
Frame {
msec: 2624
- hash: "9eda76efdd179847e89b9e96ead51e4a"
+ hash: "fa22742b8778a3b63ce7d6699dbf7482"
}
Frame {
msec: 2640
- hash: "9eda76efdd179847e89b9e96ead51e4a"
+ hash: "fa22742b8778a3b63ce7d6699dbf7482"
}
Frame {
msec: 2656
- hash: "9eda76efdd179847e89b9e96ead51e4a"
+ hash: "fa22742b8778a3b63ce7d6699dbf7482"
}
Frame {
msec: 2672
- hash: "9eda76efdd179847e89b9e96ead51e4a"
+ hash: "fa22742b8778a3b63ce7d6699dbf7482"
}
Key {
type: 7
@@ -898,23 +898,23 @@ VisualTest {
}
Frame {
msec: 2688
- hash: "9eda76efdd179847e89b9e96ead51e4a"
+ hash: "fa22742b8778a3b63ce7d6699dbf7482"
}
Frame {
msec: 2704
- hash: "9eda76efdd179847e89b9e96ead51e4a"
+ hash: "fa22742b8778a3b63ce7d6699dbf7482"
}
Frame {
msec: 2720
- hash: "9eda76efdd179847e89b9e96ead51e4a"
+ hash: "fa22742b8778a3b63ce7d6699dbf7482"
}
Frame {
msec: 2736
- hash: "9eda76efdd179847e89b9e96ead51e4a"
+ hash: "fa22742b8778a3b63ce7d6699dbf7482"
}
Frame {
msec: 2752
- hash: "9eda76efdd179847e89b9e96ead51e4a"
+ hash: "fa22742b8778a3b63ce7d6699dbf7482"
}
Key {
type: 6
@@ -926,15 +926,15 @@ VisualTest {
}
Frame {
msec: 2768
- hash: "1bcb9bc9d6606329ad5376ea6f608bf8"
+ hash: "b069c174a1b9589ed3137cd01f870b17"
}
Frame {
msec: 2784
- hash: "1bcb9bc9d6606329ad5376ea6f608bf8"
+ hash: "b069c174a1b9589ed3137cd01f870b17"
}
Frame {
msec: 2800
- hash: "1bcb9bc9d6606329ad5376ea6f608bf8"
+ hash: "b069c174a1b9589ed3137cd01f870b17"
}
Key {
type: 7
@@ -946,19 +946,19 @@ VisualTest {
}
Frame {
msec: 2816
- hash: "1bcb9bc9d6606329ad5376ea6f608bf8"
+ hash: "b069c174a1b9589ed3137cd01f870b17"
}
Frame {
msec: 2832
- hash: "1bcb9bc9d6606329ad5376ea6f608bf8"
+ hash: "b069c174a1b9589ed3137cd01f870b17"
}
Frame {
msec: 2848
- hash: "1bcb9bc9d6606329ad5376ea6f608bf8"
+ hash: "b069c174a1b9589ed3137cd01f870b17"
}
Frame {
msec: 2864
- hash: "1bcb9bc9d6606329ad5376ea6f608bf8"
+ hash: "b069c174a1b9589ed3137cd01f870b17"
}
Key {
type: 6
@@ -970,7 +970,7 @@ VisualTest {
}
Frame {
msec: 2880
- hash: "1465f1f32ba4a6180ab3460298febe26"
+ hash: "53f9d63bacad27fd73c2f84b82599dbc"
}
Frame {
msec: 2896
@@ -978,11 +978,11 @@ VisualTest {
}
Frame {
msec: 2912
- hash: "1465f1f32ba4a6180ab3460298febe26"
+ hash: "53f9d63bacad27fd73c2f84b82599dbc"
}
Frame {
msec: 2928
- hash: "1465f1f32ba4a6180ab3460298febe26"
+ hash: "53f9d63bacad27fd73c2f84b82599dbc"
}
Key {
type: 7
@@ -994,23 +994,23 @@ VisualTest {
}
Frame {
msec: 2944
- hash: "1465f1f32ba4a6180ab3460298febe26"
+ hash: "53f9d63bacad27fd73c2f84b82599dbc"
}
Frame {
msec: 2960
- hash: "1465f1f32ba4a6180ab3460298febe26"
+ hash: "53f9d63bacad27fd73c2f84b82599dbc"
}
Frame {
msec: 2976
- hash: "1465f1f32ba4a6180ab3460298febe26"
+ hash: "53f9d63bacad27fd73c2f84b82599dbc"
}
Frame {
msec: 2992
- hash: "1465f1f32ba4a6180ab3460298febe26"
+ hash: "53f9d63bacad27fd73c2f84b82599dbc"
}
Frame {
msec: 3008
- hash: "1465f1f32ba4a6180ab3460298febe26"
+ hash: "53f9d63bacad27fd73c2f84b82599dbc"
}
Key {
type: 6
@@ -1022,23 +1022,23 @@ VisualTest {
}
Frame {
msec: 3024
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3040
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3056
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3072
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3088
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Key {
type: 7
@@ -1050,155 +1050,155 @@ VisualTest {
}
Frame {
msec: 3104
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3120
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3136
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3152
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3168
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3184
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3200
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3216
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3232
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3248
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3264
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3280
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3296
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3312
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3328
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3344
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3360
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3376
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3392
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3408
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3424
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3440
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3456
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3472
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3488
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3504
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3520
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3536
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3552
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3568
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3584
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3600
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3616
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3632
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3648
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3664
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3680
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Frame {
msec: 3696
- hash: "89f3a1c5080d5d742e4455a8818a715c"
+ hash: "9294b20b7160322e1f2eecaee6ebf856"
}
Key {
type: 6
@@ -1210,27 +1210,27 @@ VisualTest {
}
Frame {
msec: 3712
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 3728
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 3744
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 3760
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 3776
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 3792
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Key {
type: 7
@@ -1242,15 +1242,15 @@ VisualTest {
}
Frame {
msec: 3808
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 3824
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 3840
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 3856
@@ -1258,114 +1258,114 @@ VisualTest {
}
Frame {
msec: 3872
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 3888
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 3904
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 3920
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 3936
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 3952
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 3968
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 3984
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 4000
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 4016
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 4032
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 4048
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 4064
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 4080
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 4096
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 4112
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 4128
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 4144
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 4160
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 4176
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 4192
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 4208
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 4224
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 4240
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 4256
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 4272
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 4288
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
Frame {
msec: 4304
- hash: "0051b27d72a917e2af72c4b953877d42"
+ hash: "80122e3e0d124c01b2769c1c88aa4a13"
}
}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.0.png
index d63f753..da3b971 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.1.png
index bb7daa3..8ea0787 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.1.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.2.png
index bcad242..33328db 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.2.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.2.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.3.png
index 7be45e7..222ba53 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.3.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.3.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.4.png
index 42f7f51..970e73d 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.4.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.4.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.5.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.5.png
index 147632a..4dc64a1 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.5.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.5.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.6.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.6.png
index d624a71..99d451c 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.6.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.6.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.7.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.7.png
index d624a71..99d451c 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.7.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.7.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.qml
index 72f68e7..13834f0 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.qml
@@ -18,7 +18,7 @@ VisualTest {
}
Frame {
msec: 32
- hash: "3e34b9a8c5df08caa18f37289c25138f"
+ hash: "ca07773bf0df96be1f23d13c4d6e2bfd"
}
Key {
type: 7
@@ -30,11 +30,11 @@ VisualTest {
}
Frame {
msec: 48
- hash: "3e34b9a8c5df08caa18f37289c25138f"
+ hash: "ca07773bf0df96be1f23d13c4d6e2bfd"
}
Frame {
msec: 64
- hash: "3e34b9a8c5df08caa18f37289c25138f"
+ hash: "ca07773bf0df96be1f23d13c4d6e2bfd"
}
Key {
type: 7
@@ -46,11 +46,11 @@ VisualTest {
}
Frame {
msec: 80
- hash: "3e34b9a8c5df08caa18f37289c25138f"
+ hash: "ca07773bf0df96be1f23d13c4d6e2bfd"
}
Frame {
msec: 96
- hash: "3e34b9a8c5df08caa18f37289c25138f"
+ hash: "ca07773bf0df96be1f23d13c4d6e2bfd"
}
Key {
type: 6
@@ -62,15 +62,15 @@ VisualTest {
}
Frame {
msec: 112
- hash: "4242081446f2a3122bbd4f8c03a67e5c"
+ hash: "fc223de2e1f35db08d9689bc41f02304"
}
Frame {
msec: 128
- hash: "4242081446f2a3122bbd4f8c03a67e5c"
+ hash: "fc223de2e1f35db08d9689bc41f02304"
}
Frame {
msec: 144
- hash: "4242081446f2a3122bbd4f8c03a67e5c"
+ hash: "fc223de2e1f35db08d9689bc41f02304"
}
Key {
type: 6
@@ -82,15 +82,15 @@ VisualTest {
}
Frame {
msec: 160
- hash: "79c4a9defe89f99b3f6b3c25bd81fc7e"
+ hash: "dc208fb5236b0a2a54bf9aaf7a9d60cd"
}
Frame {
msec: 176
- hash: "79c4a9defe89f99b3f6b3c25bd81fc7e"
+ hash: "dc208fb5236b0a2a54bf9aaf7a9d60cd"
}
Frame {
msec: 192
- hash: "79c4a9defe89f99b3f6b3c25bd81fc7e"
+ hash: "dc208fb5236b0a2a54bf9aaf7a9d60cd"
}
Key {
type: 7
@@ -102,11 +102,11 @@ VisualTest {
}
Frame {
msec: 208
- hash: "79c4a9defe89f99b3f6b3c25bd81fc7e"
+ hash: "dc208fb5236b0a2a54bf9aaf7a9d60cd"
}
Frame {
msec: 224
- hash: "79c4a9defe89f99b3f6b3c25bd81fc7e"
+ hash: "dc208fb5236b0a2a54bf9aaf7a9d60cd"
}
Key {
type: 6
@@ -118,7 +118,7 @@ VisualTest {
}
Frame {
msec: 240
- hash: "0bee22de7793974cadec12dfb5df16aa"
+ hash: "c017468afd522089b5c9f42dd61be1b4"
}
Key {
type: 7
@@ -130,19 +130,19 @@ VisualTest {
}
Frame {
msec: 256
- hash: "0bee22de7793974cadec12dfb5df16aa"
+ hash: "c017468afd522089b5c9f42dd61be1b4"
}
Frame {
msec: 272
- hash: "0bee22de7793974cadec12dfb5df16aa"
+ hash: "c017468afd522089b5c9f42dd61be1b4"
}
Frame {
msec: 288
- hash: "0bee22de7793974cadec12dfb5df16aa"
+ hash: "c017468afd522089b5c9f42dd61be1b4"
}
Frame {
msec: 304
- hash: "0bee22de7793974cadec12dfb5df16aa"
+ hash: "c017468afd522089b5c9f42dd61be1b4"
}
Key {
type: 7
@@ -154,11 +154,11 @@ VisualTest {
}
Frame {
msec: 320
- hash: "0bee22de7793974cadec12dfb5df16aa"
+ hash: "c017468afd522089b5c9f42dd61be1b4"
}
Frame {
msec: 336
- hash: "0bee22de7793974cadec12dfb5df16aa"
+ hash: "c017468afd522089b5c9f42dd61be1b4"
}
Key {
type: 6
@@ -170,19 +170,19 @@ VisualTest {
}
Frame {
msec: 352
- hash: "07393d1c1bb6da436700881ebcd38195"
+ hash: "84b1f1bf26af0da07006bb102d22693f"
}
Frame {
msec: 368
- hash: "07393d1c1bb6da436700881ebcd38195"
+ hash: "84b1f1bf26af0da07006bb102d22693f"
}
Frame {
msec: 384
- hash: "07393d1c1bb6da436700881ebcd38195"
+ hash: "84b1f1bf26af0da07006bb102d22693f"
}
Frame {
msec: 400
- hash: "07393d1c1bb6da436700881ebcd38195"
+ hash: "84b1f1bf26af0da07006bb102d22693f"
}
Key {
type: 7
@@ -194,19 +194,19 @@ VisualTest {
}
Frame {
msec: 416
- hash: "07393d1c1bb6da436700881ebcd38195"
+ hash: "84b1f1bf26af0da07006bb102d22693f"
}
Frame {
msec: 432
- hash: "07393d1c1bb6da436700881ebcd38195"
+ hash: "84b1f1bf26af0da07006bb102d22693f"
}
Frame {
msec: 448
- hash: "07393d1c1bb6da436700881ebcd38195"
+ hash: "84b1f1bf26af0da07006bb102d22693f"
}
Frame {
msec: 464
- hash: "07393d1c1bb6da436700881ebcd38195"
+ hash: "84b1f1bf26af0da07006bb102d22693f"
}
Key {
type: 6
@@ -218,19 +218,19 @@ VisualTest {
}
Frame {
msec: 480
- hash: "b12a4550ae068d157d340c008047d6f1"
+ hash: "a16f5aa01bd07de4ef7f868b7b6116f7"
}
Frame {
msec: 496
- hash: "b12a4550ae068d157d340c008047d6f1"
+ hash: "a16f5aa01bd07de4ef7f868b7b6116f7"
}
Frame {
msec: 512
- hash: "b12a4550ae068d157d340c008047d6f1"
+ hash: "a16f5aa01bd07de4ef7f868b7b6116f7"
}
Frame {
msec: 528
- hash: "b12a4550ae068d157d340c008047d6f1"
+ hash: "a16f5aa01bd07de4ef7f868b7b6116f7"
}
Key {
type: 6
@@ -250,23 +250,23 @@ VisualTest {
}
Frame {
msec: 544
- hash: "f291de0963549b92d607f38d2d08c551"
+ hash: "e25e16d0d7b223b243d466630b901f68"
}
Frame {
msec: 560
- hash: "f291de0963549b92d607f38d2d08c551"
+ hash: "e25e16d0d7b223b243d466630b901f68"
}
Frame {
msec: 576
- hash: "f291de0963549b92d607f38d2d08c551"
+ hash: "e25e16d0d7b223b243d466630b901f68"
}
Frame {
msec: 592
- hash: "f291de0963549b92d607f38d2d08c551"
+ hash: "e25e16d0d7b223b243d466630b901f68"
}
Frame {
msec: 608
- hash: "f291de0963549b92d607f38d2d08c551"
+ hash: "e25e16d0d7b223b243d466630b901f68"
}
Key {
type: 7
@@ -286,19 +286,19 @@ VisualTest {
}
Frame {
msec: 624
- hash: "b7eedae59cc521aa8222596cd97bf129"
+ hash: "a53520edb9c117aa53abc42fce3505be"
}
Frame {
msec: 640
- hash: "b7eedae59cc521aa8222596cd97bf129"
+ hash: "a53520edb9c117aa53abc42fce3505be"
}
Frame {
msec: 656
- hash: "b7eedae59cc521aa8222596cd97bf129"
+ hash: "a53520edb9c117aa53abc42fce3505be"
}
Frame {
msec: 672
- hash: "b7eedae59cc521aa8222596cd97bf129"
+ hash: "a53520edb9c117aa53abc42fce3505be"
}
Key {
type: 7
@@ -310,11 +310,11 @@ VisualTest {
}
Frame {
msec: 688
- hash: "b7eedae59cc521aa8222596cd97bf129"
+ hash: "a53520edb9c117aa53abc42fce3505be"
}
Frame {
msec: 704
- hash: "b7eedae59cc521aa8222596cd97bf129"
+ hash: "a53520edb9c117aa53abc42fce3505be"
}
Key {
type: 6
@@ -326,23 +326,23 @@ VisualTest {
}
Frame {
msec: 720
- hash: "98ef281d984841075f2fc82cebcba3a9"
+ hash: "a7ef30038b24e8bf946bdd38aaac6430"
}
Frame {
msec: 736
- hash: "98ef281d984841075f2fc82cebcba3a9"
+ hash: "a7ef30038b24e8bf946bdd38aaac6430"
}
Frame {
msec: 752
- hash: "98ef281d984841075f2fc82cebcba3a9"
+ hash: "a7ef30038b24e8bf946bdd38aaac6430"
}
Frame {
msec: 768
- hash: "98ef281d984841075f2fc82cebcba3a9"
+ hash: "a7ef30038b24e8bf946bdd38aaac6430"
}
Frame {
msec: 784
- hash: "98ef281d984841075f2fc82cebcba3a9"
+ hash: "a7ef30038b24e8bf946bdd38aaac6430"
}
Key {
type: 7
@@ -354,7 +354,7 @@ VisualTest {
}
Frame {
msec: 800
- hash: "98ef281d984841075f2fc82cebcba3a9"
+ hash: "a7ef30038b24e8bf946bdd38aaac6430"
}
Key {
type: 6
@@ -366,15 +366,15 @@ VisualTest {
}
Frame {
msec: 816
- hash: "e7b8f24ba55765e2fc1f386d510b402f"
+ hash: "026b29fc03bd22e15ff725d34dee91eb"
}
Frame {
msec: 832
- hash: "e7b8f24ba55765e2fc1f386d510b402f"
+ hash: "026b29fc03bd22e15ff725d34dee91eb"
}
Frame {
msec: 848
- hash: "e7b8f24ba55765e2fc1f386d510b402f"
+ hash: "026b29fc03bd22e15ff725d34dee91eb"
}
Key {
type: 7
@@ -386,15 +386,15 @@ VisualTest {
}
Frame {
msec: 864
- hash: "e7b8f24ba55765e2fc1f386d510b402f"
+ hash: "026b29fc03bd22e15ff725d34dee91eb"
}
Frame {
msec: 880
- hash: "e7b8f24ba55765e2fc1f386d510b402f"
+ hash: "026b29fc03bd22e15ff725d34dee91eb"
}
Frame {
msec: 896
- hash: "e7b8f24ba55765e2fc1f386d510b402f"
+ hash: "026b29fc03bd22e15ff725d34dee91eb"
}
Key {
type: 6
@@ -406,19 +406,19 @@ VisualTest {
}
Frame {
msec: 912
- hash: "38a3062cb4f23993416f83ff6acbe189"
+ hash: "2b1cef34dff32e36e3c44f2ffb2be66e"
}
Frame {
msec: 928
- hash: "38a3062cb4f23993416f83ff6acbe189"
+ hash: "2b1cef34dff32e36e3c44f2ffb2be66e"
}
Frame {
msec: 944
- hash: "38a3062cb4f23993416f83ff6acbe189"
+ hash: "2b1cef34dff32e36e3c44f2ffb2be66e"
}
Frame {
msec: 960
- hash: "38a3062cb4f23993416f83ff6acbe189"
+ hash: "2b1cef34dff32e36e3c44f2ffb2be66e"
}
Frame {
msec: 976
@@ -426,7 +426,7 @@ VisualTest {
}
Frame {
msec: 992
- hash: "38a3062cb4f23993416f83ff6acbe189"
+ hash: "2b1cef34dff32e36e3c44f2ffb2be66e"
}
Key {
type: 6
@@ -446,23 +446,23 @@ VisualTest {
}
Frame {
msec: 1008
- hash: "daef9995a008f0ca672adc98315a6b9f"
+ hash: "f619bc4148876effc459127009d4cc3a"
}
Frame {
msec: 1024
- hash: "daef9995a008f0ca672adc98315a6b9f"
+ hash: "f619bc4148876effc459127009d4cc3a"
}
Frame {
msec: 1040
- hash: "daef9995a008f0ca672adc98315a6b9f"
+ hash: "f619bc4148876effc459127009d4cc3a"
}
Frame {
msec: 1056
- hash: "daef9995a008f0ca672adc98315a6b9f"
+ hash: "f619bc4148876effc459127009d4cc3a"
}
Frame {
msec: 1072
- hash: "daef9995a008f0ca672adc98315a6b9f"
+ hash: "f619bc4148876effc459127009d4cc3a"
}
Key {
type: 7
@@ -474,31 +474,31 @@ VisualTest {
}
Frame {
msec: 1088
- hash: "daef9995a008f0ca672adc98315a6b9f"
+ hash: "f619bc4148876effc459127009d4cc3a"
}
Frame {
msec: 1104
- hash: "daef9995a008f0ca672adc98315a6b9f"
+ hash: "f619bc4148876effc459127009d4cc3a"
}
Frame {
msec: 1120
- hash: "daef9995a008f0ca672adc98315a6b9f"
+ hash: "f619bc4148876effc459127009d4cc3a"
}
Frame {
msec: 1136
- hash: "daef9995a008f0ca672adc98315a6b9f"
+ hash: "f619bc4148876effc459127009d4cc3a"
}
Frame {
msec: 1152
- hash: "daef9995a008f0ca672adc98315a6b9f"
+ hash: "f619bc4148876effc459127009d4cc3a"
}
Frame {
msec: 1168
- hash: "daef9995a008f0ca672adc98315a6b9f"
+ hash: "f619bc4148876effc459127009d4cc3a"
}
Frame {
msec: 1184
- hash: "daef9995a008f0ca672adc98315a6b9f"
+ hash: "f619bc4148876effc459127009d4cc3a"
}
Key {
type: 6
@@ -510,23 +510,23 @@ VisualTest {
}
Frame {
msec: 1200
- hash: "da27d35f241ccc7c1ee2832e491fa726"
+ hash: "c7fbee3129141e8493b7bc4f85fdc2d0"
}
Frame {
msec: 1216
- hash: "da27d35f241ccc7c1ee2832e491fa726"
+ hash: "c7fbee3129141e8493b7bc4f85fdc2d0"
}
Frame {
msec: 1232
- hash: "da27d35f241ccc7c1ee2832e491fa726"
+ hash: "c7fbee3129141e8493b7bc4f85fdc2d0"
}
Frame {
msec: 1248
- hash: "da27d35f241ccc7c1ee2832e491fa726"
+ hash: "c7fbee3129141e8493b7bc4f85fdc2d0"
}
Frame {
msec: 1264
- hash: "da27d35f241ccc7c1ee2832e491fa726"
+ hash: "c7fbee3129141e8493b7bc4f85fdc2d0"
}
Key {
type: 7
@@ -546,11 +546,11 @@ VisualTest {
}
Frame {
msec: 1280
- hash: "7136f5cfcca4a86b8764667895efa813"
+ hash: "f2a45d80148ee1b5f1cd8cb6ddd0c5ed"
}
Frame {
msec: 1296
- hash: "7136f5cfcca4a86b8764667895efa813"
+ hash: "f2a45d80148ee1b5f1cd8cb6ddd0c5ed"
}
Key {
type: 6
@@ -562,15 +562,15 @@ VisualTest {
}
Frame {
msec: 1312
- hash: "b99aec3d97f4442378a18ac88d50b97d"
+ hash: "147efa341e4dc39cdd555c2c81e5c603"
}
Frame {
msec: 1328
- hash: "b99aec3d97f4442378a18ac88d50b97d"
+ hash: "147efa341e4dc39cdd555c2c81e5c603"
}
Frame {
msec: 1344
- hash: "b99aec3d97f4442378a18ac88d50b97d"
+ hash: "147efa341e4dc39cdd555c2c81e5c603"
}
Key {
type: 7
@@ -582,11 +582,11 @@ VisualTest {
}
Frame {
msec: 1360
- hash: "b99aec3d97f4442378a18ac88d50b97d"
+ hash: "147efa341e4dc39cdd555c2c81e5c603"
}
Frame {
msec: 1376
- hash: "b99aec3d97f4442378a18ac88d50b97d"
+ hash: "147efa341e4dc39cdd555c2c81e5c603"
}
Key {
type: 7
@@ -598,19 +598,19 @@ VisualTest {
}
Frame {
msec: 1392
- hash: "b99aec3d97f4442378a18ac88d50b97d"
+ hash: "147efa341e4dc39cdd555c2c81e5c603"
}
Frame {
msec: 1408
- hash: "b99aec3d97f4442378a18ac88d50b97d"
+ hash: "147efa341e4dc39cdd555c2c81e5c603"
}
Frame {
msec: 1424
- hash: "b99aec3d97f4442378a18ac88d50b97d"
+ hash: "147efa341e4dc39cdd555c2c81e5c603"
}
Frame {
msec: 1440
- hash: "b99aec3d97f4442378a18ac88d50b97d"
+ hash: "147efa341e4dc39cdd555c2c81e5c603"
}
Key {
type: 6
@@ -622,23 +622,23 @@ VisualTest {
}
Frame {
msec: 1456
- hash: "c32293903502fd1964cfbc10515b2ef7"
+ hash: "d5b19a6d767a08f488cc8fc5c427a2dd"
}
Frame {
msec: 1472
- hash: "c32293903502fd1964cfbc10515b2ef7"
+ hash: "d5b19a6d767a08f488cc8fc5c427a2dd"
}
Frame {
msec: 1488
- hash: "c32293903502fd1964cfbc10515b2ef7"
+ hash: "d5b19a6d767a08f488cc8fc5c427a2dd"
}
Frame {
msec: 1504
- hash: "c32293903502fd1964cfbc10515b2ef7"
+ hash: "d5b19a6d767a08f488cc8fc5c427a2dd"
}
Frame {
msec: 1520
- hash: "c32293903502fd1964cfbc10515b2ef7"
+ hash: "d5b19a6d767a08f488cc8fc5c427a2dd"
}
Key {
type: 7
@@ -650,11 +650,11 @@ VisualTest {
}
Frame {
msec: 1536
- hash: "c32293903502fd1964cfbc10515b2ef7"
+ hash: "d5b19a6d767a08f488cc8fc5c427a2dd"
}
Frame {
msec: 1552
- hash: "c32293903502fd1964cfbc10515b2ef7"
+ hash: "d5b19a6d767a08f488cc8fc5c427a2dd"
}
Key {
type: 6
@@ -666,23 +666,23 @@ VisualTest {
}
Frame {
msec: 1568
- hash: "47371eb93a2a8fac7afb53990fac9130"
+ hash: "bf6265ca859f700fb07f8b992255787d"
}
Frame {
msec: 1584
- hash: "47371eb93a2a8fac7afb53990fac9130"
+ hash: "bf6265ca859f700fb07f8b992255787d"
}
Frame {
msec: 1600
- hash: "47371eb93a2a8fac7afb53990fac9130"
+ hash: "bf6265ca859f700fb07f8b992255787d"
}
Frame {
msec: 1616
- hash: "47371eb93a2a8fac7afb53990fac9130"
+ hash: "bf6265ca859f700fb07f8b992255787d"
}
Frame {
msec: 1632
- hash: "47371eb93a2a8fac7afb53990fac9130"
+ hash: "bf6265ca859f700fb07f8b992255787d"
}
Key {
type: 6
@@ -702,23 +702,23 @@ VisualTest {
}
Frame {
msec: 1648
- hash: "5c22c2566b437497dd6fd908135ec39e"
+ hash: "329e4cd26283eb08188d96b2b0325733"
}
Frame {
msec: 1664
- hash: "5c22c2566b437497dd6fd908135ec39e"
+ hash: "329e4cd26283eb08188d96b2b0325733"
}
Frame {
msec: 1680
- hash: "5c22c2566b437497dd6fd908135ec39e"
+ hash: "329e4cd26283eb08188d96b2b0325733"
}
Frame {
msec: 1696
- hash: "5c22c2566b437497dd6fd908135ec39e"
+ hash: "329e4cd26283eb08188d96b2b0325733"
}
Frame {
msec: 1712
- hash: "5c22c2566b437497dd6fd908135ec39e"
+ hash: "329e4cd26283eb08188d96b2b0325733"
}
Key {
type: 6
@@ -730,15 +730,15 @@ VisualTest {
}
Frame {
msec: 1728
- hash: "29b4e69de4c83ccdee6ef116ab3785ee"
+ hash: "7b5ac2afafbbaf1e13c70a11461820ad"
}
Frame {
msec: 1744
- hash: "29b4e69de4c83ccdee6ef116ab3785ee"
+ hash: "7b5ac2afafbbaf1e13c70a11461820ad"
}
Frame {
msec: 1760
- hash: "29b4e69de4c83ccdee6ef116ab3785ee"
+ hash: "7b5ac2afafbbaf1e13c70a11461820ad"
}
Key {
type: 7
@@ -750,7 +750,7 @@ VisualTest {
}
Frame {
msec: 1776
- hash: "29b4e69de4c83ccdee6ef116ab3785ee"
+ hash: "7b5ac2afafbbaf1e13c70a11461820ad"
}
Key {
type: 6
@@ -762,11 +762,11 @@ VisualTest {
}
Frame {
msec: 1792
- hash: "5ab8ecb0ca9fed70f1d8add6b7b3972d"
+ hash: "bcfa1aa48767f70541a70cb5f85792ba"
}
Frame {
msec: 1808
- hash: "5ab8ecb0ca9fed70f1d8add6b7b3972d"
+ hash: "bcfa1aa48767f70541a70cb5f85792ba"
}
Key {
type: 7
@@ -778,19 +778,19 @@ VisualTest {
}
Frame {
msec: 1824
- hash: "5ab8ecb0ca9fed70f1d8add6b7b3972d"
+ hash: "bcfa1aa48767f70541a70cb5f85792ba"
}
Frame {
msec: 1840
- hash: "5ab8ecb0ca9fed70f1d8add6b7b3972d"
+ hash: "bcfa1aa48767f70541a70cb5f85792ba"
}
Frame {
msec: 1856
- hash: "5ab8ecb0ca9fed70f1d8add6b7b3972d"
+ hash: "bcfa1aa48767f70541a70cb5f85792ba"
}
Frame {
msec: 1872
- hash: "5ab8ecb0ca9fed70f1d8add6b7b3972d"
+ hash: "bcfa1aa48767f70541a70cb5f85792ba"
}
Key {
type: 7
@@ -802,15 +802,15 @@ VisualTest {
}
Frame {
msec: 1888
- hash: "5ab8ecb0ca9fed70f1d8add6b7b3972d"
+ hash: "bcfa1aa48767f70541a70cb5f85792ba"
}
Frame {
msec: 1904
- hash: "5ab8ecb0ca9fed70f1d8add6b7b3972d"
+ hash: "bcfa1aa48767f70541a70cb5f85792ba"
}
Frame {
msec: 1920
- hash: "5ab8ecb0ca9fed70f1d8add6b7b3972d"
+ hash: "bcfa1aa48767f70541a70cb5f85792ba"
}
Frame {
msec: 1936
@@ -818,7 +818,7 @@ VisualTest {
}
Frame {
msec: 1952
- hash: "5ab8ecb0ca9fed70f1d8add6b7b3972d"
+ hash: "bcfa1aa48767f70541a70cb5f85792ba"
}
Key {
type: 6
@@ -830,27 +830,27 @@ VisualTest {
}
Frame {
msec: 1968
- hash: "2a43f5ac0c7bdf38e367b0cdb0bccea9"
+ hash: "e89f7cf38b3b596298d6c649a1207469"
}
Frame {
msec: 1984
- hash: "2a43f5ac0c7bdf38e367b0cdb0bccea9"
+ hash: "e89f7cf38b3b596298d6c649a1207469"
}
Frame {
msec: 2000
- hash: "2a43f5ac0c7bdf38e367b0cdb0bccea9"
+ hash: "e89f7cf38b3b596298d6c649a1207469"
}
Frame {
msec: 2016
- hash: "2a43f5ac0c7bdf38e367b0cdb0bccea9"
+ hash: "e89f7cf38b3b596298d6c649a1207469"
}
Frame {
msec: 2032
- hash: "2a43f5ac0c7bdf38e367b0cdb0bccea9"
+ hash: "e89f7cf38b3b596298d6c649a1207469"
}
Frame {
msec: 2048
- hash: "2a43f5ac0c7bdf38e367b0cdb0bccea9"
+ hash: "e89f7cf38b3b596298d6c649a1207469"
}
Key {
type: 6
@@ -862,7 +862,7 @@ VisualTest {
}
Frame {
msec: 2064
- hash: "0f28c7855c7fde3390d16a2638e23bd0"
+ hash: "18e71331b42a115f7f9d5c09e235b944"
}
Key {
type: 7
@@ -874,15 +874,15 @@ VisualTest {
}
Frame {
msec: 2080
- hash: "0f28c7855c7fde3390d16a2638e23bd0"
+ hash: "18e71331b42a115f7f9d5c09e235b944"
}
Frame {
msec: 2096
- hash: "0f28c7855c7fde3390d16a2638e23bd0"
+ hash: "18e71331b42a115f7f9d5c09e235b944"
}
Frame {
msec: 2112
- hash: "0f28c7855c7fde3390d16a2638e23bd0"
+ hash: "18e71331b42a115f7f9d5c09e235b944"
}
Key {
type: 7
@@ -894,27 +894,27 @@ VisualTest {
}
Frame {
msec: 2128
- hash: "0f28c7855c7fde3390d16a2638e23bd0"
+ hash: "18e71331b42a115f7f9d5c09e235b944"
}
Frame {
msec: 2144
- hash: "0f28c7855c7fde3390d16a2638e23bd0"
+ hash: "18e71331b42a115f7f9d5c09e235b944"
}
Frame {
msec: 2160
- hash: "0f28c7855c7fde3390d16a2638e23bd0"
+ hash: "18e71331b42a115f7f9d5c09e235b944"
}
Frame {
msec: 2176
- hash: "0f28c7855c7fde3390d16a2638e23bd0"
+ hash: "18e71331b42a115f7f9d5c09e235b944"
}
Frame {
msec: 2192
- hash: "0f28c7855c7fde3390d16a2638e23bd0"
+ hash: "18e71331b42a115f7f9d5c09e235b944"
}
Frame {
msec: 2208
- hash: "0f28c7855c7fde3390d16a2638e23bd0"
+ hash: "18e71331b42a115f7f9d5c09e235b944"
}
Key {
type: 6
@@ -926,23 +926,23 @@ VisualTest {
}
Frame {
msec: 2224
- hash: "b56e002e5eddde0245f7ad4c75339968"
+ hash: "3630abd7cc6ab303d08f30dea7b1eec1"
}
Frame {
msec: 2240
- hash: "b56e002e5eddde0245f7ad4c75339968"
+ hash: "3630abd7cc6ab303d08f30dea7b1eec1"
}
Frame {
msec: 2256
- hash: "b56e002e5eddde0245f7ad4c75339968"
+ hash: "3630abd7cc6ab303d08f30dea7b1eec1"
}
Frame {
msec: 2272
- hash: "b56e002e5eddde0245f7ad4c75339968"
+ hash: "3630abd7cc6ab303d08f30dea7b1eec1"
}
Frame {
msec: 2288
- hash: "b56e002e5eddde0245f7ad4c75339968"
+ hash: "3630abd7cc6ab303d08f30dea7b1eec1"
}
Key {
type: 6
@@ -954,7 +954,7 @@ VisualTest {
}
Frame {
msec: 2304
- hash: "0bdd50e3c8b382b464c82d791ae6c1e5"
+ hash: "83e7b8c680cda95ec0a669b8030a3efd"
}
Key {
type: 7
@@ -966,15 +966,15 @@ VisualTest {
}
Frame {
msec: 2320
- hash: "0bdd50e3c8b382b464c82d791ae6c1e5"
+ hash: "83e7b8c680cda95ec0a669b8030a3efd"
}
Frame {
msec: 2336
- hash: "0bdd50e3c8b382b464c82d791ae6c1e5"
+ hash: "83e7b8c680cda95ec0a669b8030a3efd"
}
Frame {
msec: 2352
- hash: "0bdd50e3c8b382b464c82d791ae6c1e5"
+ hash: "83e7b8c680cda95ec0a669b8030a3efd"
}
Key {
type: 6
@@ -986,11 +986,11 @@ VisualTest {
}
Frame {
msec: 2368
- hash: "b61b475b84c6e6a149f6262fc560b741"
+ hash: "cc826833607ae754e633d21ca67a6b5a"
}
Frame {
msec: 2384
- hash: "b61b475b84c6e6a149f6262fc560b741"
+ hash: "cc826833607ae754e633d21ca67a6b5a"
}
Key {
type: 7
@@ -1002,15 +1002,15 @@ VisualTest {
}
Frame {
msec: 2400
- hash: "b61b475b84c6e6a149f6262fc560b741"
+ hash: "cc826833607ae754e633d21ca67a6b5a"
}
Frame {
msec: 2416
- hash: "b61b475b84c6e6a149f6262fc560b741"
+ hash: "cc826833607ae754e633d21ca67a6b5a"
}
Frame {
msec: 2432
- hash: "b61b475b84c6e6a149f6262fc560b741"
+ hash: "cc826833607ae754e633d21ca67a6b5a"
}
Key {
type: 7
@@ -1022,15 +1022,15 @@ VisualTest {
}
Frame {
msec: 2448
- hash: "b61b475b84c6e6a149f6262fc560b741"
+ hash: "cc826833607ae754e633d21ca67a6b5a"
}
Frame {
msec: 2464
- hash: "b61b475b84c6e6a149f6262fc560b741"
+ hash: "cc826833607ae754e633d21ca67a6b5a"
}
Frame {
msec: 2480
- hash: "b61b475b84c6e6a149f6262fc560b741"
+ hash: "cc826833607ae754e633d21ca67a6b5a"
}
Key {
type: 6
@@ -1042,19 +1042,19 @@ VisualTest {
}
Frame {
msec: 2496
- hash: "1acd6152f317a6c8f6aca52ccf62a8c6"
+ hash: "2b4c812fac4e84909cc8fc70d8966a27"
}
Frame {
msec: 2512
- hash: "1acd6152f317a6c8f6aca52ccf62a8c6"
+ hash: "2b4c812fac4e84909cc8fc70d8966a27"
}
Frame {
msec: 2528
- hash: "1acd6152f317a6c8f6aca52ccf62a8c6"
+ hash: "2b4c812fac4e84909cc8fc70d8966a27"
}
Frame {
msec: 2544
- hash: "1acd6152f317a6c8f6aca52ccf62a8c6"
+ hash: "2b4c812fac4e84909cc8fc70d8966a27"
}
Key {
type: 7
@@ -1066,27 +1066,27 @@ VisualTest {
}
Frame {
msec: 2560
- hash: "1acd6152f317a6c8f6aca52ccf62a8c6"
+ hash: "2b4c812fac4e84909cc8fc70d8966a27"
}
Frame {
msec: 2576
- hash: "1acd6152f317a6c8f6aca52ccf62a8c6"
+ hash: "2b4c812fac4e84909cc8fc70d8966a27"
}
Frame {
msec: 2592
- hash: "1acd6152f317a6c8f6aca52ccf62a8c6"
+ hash: "2b4c812fac4e84909cc8fc70d8966a27"
}
Frame {
msec: 2608
- hash: "1acd6152f317a6c8f6aca52ccf62a8c6"
+ hash: "2b4c812fac4e84909cc8fc70d8966a27"
}
Frame {
msec: 2624
- hash: "1acd6152f317a6c8f6aca52ccf62a8c6"
+ hash: "2b4c812fac4e84909cc8fc70d8966a27"
}
Frame {
msec: 2640
- hash: "1acd6152f317a6c8f6aca52ccf62a8c6"
+ hash: "2b4c812fac4e84909cc8fc70d8966a27"
}
Key {
type: 6
@@ -1098,19 +1098,19 @@ VisualTest {
}
Frame {
msec: 2656
- hash: "90ab887de5fbf34f4d45e13c4b211490"
+ hash: "c1aabf4b43cbae0d7654ba78fc870fdd"
}
Frame {
msec: 2672
- hash: "90ab887de5fbf34f4d45e13c4b211490"
+ hash: "c1aabf4b43cbae0d7654ba78fc870fdd"
}
Frame {
msec: 2688
- hash: "90ab887de5fbf34f4d45e13c4b211490"
+ hash: "c1aabf4b43cbae0d7654ba78fc870fdd"
}
Frame {
msec: 2704
- hash: "90ab887de5fbf34f4d45e13c4b211490"
+ hash: "c1aabf4b43cbae0d7654ba78fc870fdd"
}
Key {
type: 7
@@ -1122,15 +1122,15 @@ VisualTest {
}
Frame {
msec: 2720
- hash: "90ab887de5fbf34f4d45e13c4b211490"
+ hash: "c1aabf4b43cbae0d7654ba78fc870fdd"
}
Frame {
msec: 2736
- hash: "90ab887de5fbf34f4d45e13c4b211490"
+ hash: "c1aabf4b43cbae0d7654ba78fc870fdd"
}
Frame {
msec: 2752
- hash: "90ab887de5fbf34f4d45e13c4b211490"
+ hash: "c1aabf4b43cbae0d7654ba78fc870fdd"
}
Key {
type: 6
@@ -1142,23 +1142,23 @@ VisualTest {
}
Frame {
msec: 2768
- hash: "fc91281749bf1a844a19f20d87a17126"
+ hash: "a707dd726c777a661e4f12d27a75cf63"
}
Frame {
msec: 2784
- hash: "fc91281749bf1a844a19f20d87a17126"
+ hash: "a707dd726c777a661e4f12d27a75cf63"
}
Frame {
msec: 2800
- hash: "fc91281749bf1a844a19f20d87a17126"
+ hash: "a707dd726c777a661e4f12d27a75cf63"
}
Frame {
msec: 2816
- hash: "fc91281749bf1a844a19f20d87a17126"
+ hash: "a707dd726c777a661e4f12d27a75cf63"
}
Frame {
msec: 2832
- hash: "fc91281749bf1a844a19f20d87a17126"
+ hash: "a707dd726c777a661e4f12d27a75cf63"
}
Key {
type: 6
@@ -1178,15 +1178,15 @@ VisualTest {
}
Frame {
msec: 2848
- hash: "dcf6e510866fa20e54255c2c980d7b4b"
+ hash: "bdaa69c1074f9820901ce31ea24383ca"
}
Frame {
msec: 2864
- hash: "dcf6e510866fa20e54255c2c980d7b4b"
+ hash: "bdaa69c1074f9820901ce31ea24383ca"
}
Frame {
msec: 2880
- hash: "dcf6e510866fa20e54255c2c980d7b4b"
+ hash: "bdaa69c1074f9820901ce31ea24383ca"
}
Frame {
msec: 2896
@@ -1202,11 +1202,11 @@ VisualTest {
}
Frame {
msec: 2912
- hash: "a26b06714f951084f2ee5ee4b4e67e43"
+ hash: "f703f87031be4f9d7409fb145343c02b"
}
Frame {
msec: 2928
- hash: "a26b06714f951084f2ee5ee4b4e67e43"
+ hash: "f703f87031be4f9d7409fb145343c02b"
}
Key {
type: 7
@@ -1218,11 +1218,11 @@ VisualTest {
}
Frame {
msec: 2944
- hash: "a26b06714f951084f2ee5ee4b4e67e43"
+ hash: "f703f87031be4f9d7409fb145343c02b"
}
Frame {
msec: 2960
- hash: "a26b06714f951084f2ee5ee4b4e67e43"
+ hash: "f703f87031be4f9d7409fb145343c02b"
}
Key {
type: 7
@@ -1234,35 +1234,35 @@ VisualTest {
}
Frame {
msec: 2976
- hash: "a26b06714f951084f2ee5ee4b4e67e43"
+ hash: "f703f87031be4f9d7409fb145343c02b"
}
Frame {
msec: 2992
- hash: "a26b06714f951084f2ee5ee4b4e67e43"
+ hash: "f703f87031be4f9d7409fb145343c02b"
}
Frame {
msec: 3008
- hash: "a26b06714f951084f2ee5ee4b4e67e43"
+ hash: "f703f87031be4f9d7409fb145343c02b"
}
Frame {
msec: 3024
- hash: "a26b06714f951084f2ee5ee4b4e67e43"
+ hash: "f703f87031be4f9d7409fb145343c02b"
}
Frame {
msec: 3040
- hash: "a26b06714f951084f2ee5ee4b4e67e43"
+ hash: "f703f87031be4f9d7409fb145343c02b"
}
Frame {
msec: 3056
- hash: "a26b06714f951084f2ee5ee4b4e67e43"
+ hash: "f703f87031be4f9d7409fb145343c02b"
}
Frame {
msec: 3072
- hash: "a26b06714f951084f2ee5ee4b4e67e43"
+ hash: "f703f87031be4f9d7409fb145343c02b"
}
Frame {
msec: 3088
- hash: "a26b06714f951084f2ee5ee4b4e67e43"
+ hash: "f703f87031be4f9d7409fb145343c02b"
}
Key {
type: 6
@@ -1274,23 +1274,23 @@ VisualTest {
}
Frame {
msec: 3104
- hash: "832c43553cea6d22b7664ef6f145d1c6"
+ hash: "cb2660df955b757b00661a1acb5f22d2"
}
Frame {
msec: 3120
- hash: "832c43553cea6d22b7664ef6f145d1c6"
+ hash: "cb2660df955b757b00661a1acb5f22d2"
}
Frame {
msec: 3136
- hash: "832c43553cea6d22b7664ef6f145d1c6"
+ hash: "cb2660df955b757b00661a1acb5f22d2"
}
Frame {
msec: 3152
- hash: "832c43553cea6d22b7664ef6f145d1c6"
+ hash: "cb2660df955b757b00661a1acb5f22d2"
}
Frame {
msec: 3168
- hash: "832c43553cea6d22b7664ef6f145d1c6"
+ hash: "cb2660df955b757b00661a1acb5f22d2"
}
Key {
type: 7
@@ -1302,23 +1302,23 @@ VisualTest {
}
Frame {
msec: 3184
- hash: "832c43553cea6d22b7664ef6f145d1c6"
+ hash: "cb2660df955b757b00661a1acb5f22d2"
}
Frame {
msec: 3200
- hash: "832c43553cea6d22b7664ef6f145d1c6"
+ hash: "cb2660df955b757b00661a1acb5f22d2"
}
Frame {
msec: 3216
- hash: "832c43553cea6d22b7664ef6f145d1c6"
+ hash: "cb2660df955b757b00661a1acb5f22d2"
}
Frame {
msec: 3232
- hash: "832c43553cea6d22b7664ef6f145d1c6"
+ hash: "cb2660df955b757b00661a1acb5f22d2"
}
Frame {
msec: 3248
- hash: "832c43553cea6d22b7664ef6f145d1c6"
+ hash: "cb2660df955b757b00661a1acb5f22d2"
}
Key {
type: 6
@@ -1330,15 +1330,15 @@ VisualTest {
}
Frame {
msec: 3264
- hash: "081c183901aadcc6406f4ad9f41efa7e"
+ hash: "8ea510d25195956fa42eabfe3bb9f230"
}
Frame {
msec: 3280
- hash: "081c183901aadcc6406f4ad9f41efa7e"
+ hash: "8ea510d25195956fa42eabfe3bb9f230"
}
Frame {
msec: 3296
- hash: "081c183901aadcc6406f4ad9f41efa7e"
+ hash: "8ea510d25195956fa42eabfe3bb9f230"
}
Key {
type: 7
@@ -1350,15 +1350,15 @@ VisualTest {
}
Frame {
msec: 3312
- hash: "081c183901aadcc6406f4ad9f41efa7e"
+ hash: "8ea510d25195956fa42eabfe3bb9f230"
}
Frame {
msec: 3328
- hash: "081c183901aadcc6406f4ad9f41efa7e"
+ hash: "8ea510d25195956fa42eabfe3bb9f230"
}
Frame {
msec: 3344
- hash: "081c183901aadcc6406f4ad9f41efa7e"
+ hash: "8ea510d25195956fa42eabfe3bb9f230"
}
Key {
type: 6
@@ -1370,23 +1370,23 @@ VisualTest {
}
Frame {
msec: 3360
- hash: "9bd3c76a58f942880f40566cfbaa2e99"
+ hash: "26b58aef7b1f50a5d261718e8266a3fb"
}
Frame {
msec: 3376
- hash: "9bd3c76a58f942880f40566cfbaa2e99"
+ hash: "26b58aef7b1f50a5d261718e8266a3fb"
}
Frame {
msec: 3392
- hash: "9bd3c76a58f942880f40566cfbaa2e99"
+ hash: "26b58aef7b1f50a5d261718e8266a3fb"
}
Frame {
msec: 3408
- hash: "9bd3c76a58f942880f40566cfbaa2e99"
+ hash: "26b58aef7b1f50a5d261718e8266a3fb"
}
Frame {
msec: 3424
- hash: "9bd3c76a58f942880f40566cfbaa2e99"
+ hash: "26b58aef7b1f50a5d261718e8266a3fb"
}
Key {
type: 7
@@ -1398,15 +1398,15 @@ VisualTest {
}
Frame {
msec: 3440
- hash: "9bd3c76a58f942880f40566cfbaa2e99"
+ hash: "26b58aef7b1f50a5d261718e8266a3fb"
}
Frame {
msec: 3456
- hash: "9bd3c76a58f942880f40566cfbaa2e99"
+ hash: "26b58aef7b1f50a5d261718e8266a3fb"
}
Frame {
msec: 3472
- hash: "9bd3c76a58f942880f40566cfbaa2e99"
+ hash: "26b58aef7b1f50a5d261718e8266a3fb"
}
Key {
type: 6
@@ -1418,19 +1418,19 @@ VisualTest {
}
Frame {
msec: 3488
- hash: "204a2ee8a33e5452d47d95ad4142d417"
+ hash: "012854de1c9d1a772994d02f52bdcd7c"
}
Frame {
msec: 3504
- hash: "204a2ee8a33e5452d47d95ad4142d417"
+ hash: "012854de1c9d1a772994d02f52bdcd7c"
}
Frame {
msec: 3520
- hash: "204a2ee8a33e5452d47d95ad4142d417"
+ hash: "012854de1c9d1a772994d02f52bdcd7c"
}
Frame {
msec: 3536
- hash: "204a2ee8a33e5452d47d95ad4142d417"
+ hash: "012854de1c9d1a772994d02f52bdcd7c"
}
Key {
type: 7
@@ -1442,11 +1442,11 @@ VisualTest {
}
Frame {
msec: 3552
- hash: "204a2ee8a33e5452d47d95ad4142d417"
+ hash: "012854de1c9d1a772994d02f52bdcd7c"
}
Frame {
msec: 3568
- hash: "204a2ee8a33e5452d47d95ad4142d417"
+ hash: "012854de1c9d1a772994d02f52bdcd7c"
}
Key {
type: 6
@@ -1458,27 +1458,27 @@ VisualTest {
}
Frame {
msec: 3584
- hash: "4729d1f555fe604d4660f02673f9c5f3"
+ hash: "660a31e1c0d573f4155cfa8fe2323413"
}
Frame {
msec: 3600
- hash: "4729d1f555fe604d4660f02673f9c5f3"
+ hash: "660a31e1c0d573f4155cfa8fe2323413"
}
Frame {
msec: 3616
- hash: "4729d1f555fe604d4660f02673f9c5f3"
+ hash: "660a31e1c0d573f4155cfa8fe2323413"
}
Frame {
msec: 3632
- hash: "4729d1f555fe604d4660f02673f9c5f3"
+ hash: "660a31e1c0d573f4155cfa8fe2323413"
}
Frame {
msec: 3648
- hash: "4729d1f555fe604d4660f02673f9c5f3"
+ hash: "660a31e1c0d573f4155cfa8fe2323413"
}
Frame {
msec: 3664
- hash: "4729d1f555fe604d4660f02673f9c5f3"
+ hash: "660a31e1c0d573f4155cfa8fe2323413"
}
Key {
type: 6
@@ -1490,7 +1490,7 @@ VisualTest {
}
Frame {
msec: 3680
- hash: "2c0e0951ce4839b302a6e2735adc6c09"
+ hash: "bea00f5e628e40b679eb8829c16c6260"
}
Key {
type: 7
@@ -1502,23 +1502,23 @@ VisualTest {
}
Frame {
msec: 3696
- hash: "2c0e0951ce4839b302a6e2735adc6c09"
+ hash: "bea00f5e628e40b679eb8829c16c6260"
}
Frame {
msec: 3712
- hash: "2c0e0951ce4839b302a6e2735adc6c09"
+ hash: "bea00f5e628e40b679eb8829c16c6260"
}
Frame {
msec: 3728
- hash: "2c0e0951ce4839b302a6e2735adc6c09"
+ hash: "bea00f5e628e40b679eb8829c16c6260"
}
Frame {
msec: 3744
- hash: "2c0e0951ce4839b302a6e2735adc6c09"
+ hash: "bea00f5e628e40b679eb8829c16c6260"
}
Frame {
msec: 3760
- hash: "2c0e0951ce4839b302a6e2735adc6c09"
+ hash: "bea00f5e628e40b679eb8829c16c6260"
}
Key {
type: 7
@@ -1530,23 +1530,23 @@ VisualTest {
}
Frame {
msec: 3776
- hash: "2c0e0951ce4839b302a6e2735adc6c09"
+ hash: "bea00f5e628e40b679eb8829c16c6260"
}
Frame {
msec: 3792
- hash: "2c0e0951ce4839b302a6e2735adc6c09"
+ hash: "bea00f5e628e40b679eb8829c16c6260"
}
Frame {
msec: 3808
- hash: "2c0e0951ce4839b302a6e2735adc6c09"
+ hash: "bea00f5e628e40b679eb8829c16c6260"
}
Frame {
msec: 3824
- hash: "2c0e0951ce4839b302a6e2735adc6c09"
+ hash: "bea00f5e628e40b679eb8829c16c6260"
}
Frame {
msec: 3840
- hash: "2c0e0951ce4839b302a6e2735adc6c09"
+ hash: "bea00f5e628e40b679eb8829c16c6260"
}
Frame {
msec: 3856
@@ -1554,15 +1554,15 @@ VisualTest {
}
Frame {
msec: 3872
- hash: "2c0e0951ce4839b302a6e2735adc6c09"
+ hash: "bea00f5e628e40b679eb8829c16c6260"
}
Frame {
msec: 3888
- hash: "2c0e0951ce4839b302a6e2735adc6c09"
+ hash: "bea00f5e628e40b679eb8829c16c6260"
}
Frame {
msec: 3904
- hash: "2c0e0951ce4839b302a6e2735adc6c09"
+ hash: "bea00f5e628e40b679eb8829c16c6260"
}
Key {
type: 6
@@ -1574,23 +1574,23 @@ VisualTest {
}
Frame {
msec: 3920
- hash: "28c2ffe2ad35010dc077625cde7d21b6"
+ hash: "c5c60cd10a1106161cde5f51dbdec5ad"
}
Frame {
msec: 3936
- hash: "28c2ffe2ad35010dc077625cde7d21b6"
+ hash: "c5c60cd10a1106161cde5f51dbdec5ad"
}
Frame {
msec: 3952
- hash: "28c2ffe2ad35010dc077625cde7d21b6"
+ hash: "c5c60cd10a1106161cde5f51dbdec5ad"
}
Frame {
msec: 3968
- hash: "28c2ffe2ad35010dc077625cde7d21b6"
+ hash: "c5c60cd10a1106161cde5f51dbdec5ad"
}
Frame {
msec: 3984
- hash: "28c2ffe2ad35010dc077625cde7d21b6"
+ hash: "c5c60cd10a1106161cde5f51dbdec5ad"
}
Key {
type: 7
@@ -1602,11 +1602,11 @@ VisualTest {
}
Frame {
msec: 4000
- hash: "28c2ffe2ad35010dc077625cde7d21b6"
+ hash: "c5c60cd10a1106161cde5f51dbdec5ad"
}
Frame {
msec: 4016
- hash: "28c2ffe2ad35010dc077625cde7d21b6"
+ hash: "c5c60cd10a1106161cde5f51dbdec5ad"
}
Key {
type: 6
@@ -1618,15 +1618,15 @@ VisualTest {
}
Frame {
msec: 4032
- hash: "6f206482adcd45a2b0d8d3c8b85f53c6"
+ hash: "41c26e6a4c911f9ecd082c4d3366806b"
}
Frame {
msec: 4048
- hash: "6f206482adcd45a2b0d8d3c8b85f53c6"
+ hash: "41c26e6a4c911f9ecd082c4d3366806b"
}
Frame {
msec: 4064
- hash: "6f206482adcd45a2b0d8d3c8b85f53c6"
+ hash: "41c26e6a4c911f9ecd082c4d3366806b"
}
Key {
type: 7
@@ -1638,7 +1638,7 @@ VisualTest {
}
Frame {
msec: 4080
- hash: "6f206482adcd45a2b0d8d3c8b85f53c6"
+ hash: "41c26e6a4c911f9ecd082c4d3366806b"
}
Key {
type: 6
@@ -1650,19 +1650,19 @@ VisualTest {
}
Frame {
msec: 4096
- hash: "4685a786f36cb821a69b0ac059145a5f"
+ hash: "e212938ce981ed4e8d7a993468bc9377"
}
Frame {
msec: 4112
- hash: "4685a786f36cb821a69b0ac059145a5f"
+ hash: "e212938ce981ed4e8d7a993468bc9377"
}
Frame {
msec: 4128
- hash: "4685a786f36cb821a69b0ac059145a5f"
+ hash: "e212938ce981ed4e8d7a993468bc9377"
}
Frame {
msec: 4144
- hash: "4685a786f36cb821a69b0ac059145a5f"
+ hash: "e212938ce981ed4e8d7a993468bc9377"
}
Key {
type: 7
@@ -1674,15 +1674,15 @@ VisualTest {
}
Frame {
msec: 4160
- hash: "4685a786f36cb821a69b0ac059145a5f"
+ hash: "e212938ce981ed4e8d7a993468bc9377"
}
Frame {
msec: 4176
- hash: "4685a786f36cb821a69b0ac059145a5f"
+ hash: "e212938ce981ed4e8d7a993468bc9377"
}
Frame {
msec: 4192
- hash: "4685a786f36cb821a69b0ac059145a5f"
+ hash: "e212938ce981ed4e8d7a993468bc9377"
}
Key {
type: 6
@@ -1694,23 +1694,23 @@ VisualTest {
}
Frame {
msec: 4208
- hash: "d0efb89ee3e2d2b18429b57dcfe13f33"
+ hash: "55df0528a97d77d0a4b513aeedd34440"
}
Frame {
msec: 4224
- hash: "d0efb89ee3e2d2b18429b57dcfe13f33"
+ hash: "55df0528a97d77d0a4b513aeedd34440"
}
Frame {
msec: 4240
- hash: "d0efb89ee3e2d2b18429b57dcfe13f33"
+ hash: "55df0528a97d77d0a4b513aeedd34440"
}
Frame {
msec: 4256
- hash: "d0efb89ee3e2d2b18429b57dcfe13f33"
+ hash: "55df0528a97d77d0a4b513aeedd34440"
}
Frame {
msec: 4272
- hash: "d0efb89ee3e2d2b18429b57dcfe13f33"
+ hash: "55df0528a97d77d0a4b513aeedd34440"
}
Key {
type: 6
@@ -1722,7 +1722,7 @@ VisualTest {
}
Frame {
msec: 4288
- hash: "cbe0bb714b2e9b63af978f666292d8f0"
+ hash: "2165091c97a891560bf3afab879e6dbc"
}
Key {
type: 7
@@ -1734,15 +1734,15 @@ VisualTest {
}
Frame {
msec: 4304
- hash: "cbe0bb714b2e9b63af978f666292d8f0"
+ hash: "2165091c97a891560bf3afab879e6dbc"
}
Frame {
msec: 4320
- hash: "cbe0bb714b2e9b63af978f666292d8f0"
+ hash: "2165091c97a891560bf3afab879e6dbc"
}
Frame {
msec: 4336
- hash: "cbe0bb714b2e9b63af978f666292d8f0"
+ hash: "2165091c97a891560bf3afab879e6dbc"
}
Key {
type: 7
@@ -1754,23 +1754,23 @@ VisualTest {
}
Frame {
msec: 4352
- hash: "cbe0bb714b2e9b63af978f666292d8f0"
+ hash: "2165091c97a891560bf3afab879e6dbc"
}
Frame {
msec: 4368
- hash: "cbe0bb714b2e9b63af978f666292d8f0"
+ hash: "2165091c97a891560bf3afab879e6dbc"
}
Frame {
msec: 4384
- hash: "cbe0bb714b2e9b63af978f666292d8f0"
+ hash: "2165091c97a891560bf3afab879e6dbc"
}
Frame {
msec: 4400
- hash: "cbe0bb714b2e9b63af978f666292d8f0"
+ hash: "2165091c97a891560bf3afab879e6dbc"
}
Frame {
msec: 4416
- hash: "cbe0bb714b2e9b63af978f666292d8f0"
+ hash: "2165091c97a891560bf3afab879e6dbc"
}
Key {
type: 6
@@ -1782,15 +1782,15 @@ VisualTest {
}
Frame {
msec: 4432
- hash: "d15a45a86874daaff5f2e6afae43b2f4"
+ hash: "a3d7968e13768c4ec538fe9ba7edf142"
}
Frame {
msec: 4448
- hash: "d15a45a86874daaff5f2e6afae43b2f4"
+ hash: "a3d7968e13768c4ec538fe9ba7edf142"
}
Frame {
msec: 4464
- hash: "d15a45a86874daaff5f2e6afae43b2f4"
+ hash: "a3d7968e13768c4ec538fe9ba7edf142"
}
Key {
type: 7
@@ -1802,23 +1802,23 @@ VisualTest {
}
Frame {
msec: 4480
- hash: "d15a45a86874daaff5f2e6afae43b2f4"
+ hash: "a3d7968e13768c4ec538fe9ba7edf142"
}
Frame {
msec: 4496
- hash: "d15a45a86874daaff5f2e6afae43b2f4"
+ hash: "a3d7968e13768c4ec538fe9ba7edf142"
}
Frame {
msec: 4512
- hash: "d15a45a86874daaff5f2e6afae43b2f4"
+ hash: "a3d7968e13768c4ec538fe9ba7edf142"
}
Frame {
msec: 4528
- hash: "d15a45a86874daaff5f2e6afae43b2f4"
+ hash: "a3d7968e13768c4ec538fe9ba7edf142"
}
Frame {
msec: 4544
- hash: "d15a45a86874daaff5f2e6afae43b2f4"
+ hash: "a3d7968e13768c4ec538fe9ba7edf142"
}
Key {
type: 6
@@ -1830,19 +1830,19 @@ VisualTest {
}
Frame {
msec: 4560
- hash: "b0c3ef9c5331af8768b23537d1d38311"
+ hash: "3b18ada8637d4024acfe88718765f71c"
}
Frame {
msec: 4576
- hash: "b0c3ef9c5331af8768b23537d1d38311"
+ hash: "3b18ada8637d4024acfe88718765f71c"
}
Frame {
msec: 4592
- hash: "b0c3ef9c5331af8768b23537d1d38311"
+ hash: "3b18ada8637d4024acfe88718765f71c"
}
Frame {
msec: 4608
- hash: "b0c3ef9c5331af8768b23537d1d38311"
+ hash: "3b18ada8637d4024acfe88718765f71c"
}
Key {
type: 7
@@ -1854,19 +1854,19 @@ VisualTest {
}
Frame {
msec: 4624
- hash: "b0c3ef9c5331af8768b23537d1d38311"
+ hash: "3b18ada8637d4024acfe88718765f71c"
}
Frame {
msec: 4640
- hash: "b0c3ef9c5331af8768b23537d1d38311"
+ hash: "3b18ada8637d4024acfe88718765f71c"
}
Frame {
msec: 4656
- hash: "b0c3ef9c5331af8768b23537d1d38311"
+ hash: "3b18ada8637d4024acfe88718765f71c"
}
Frame {
msec: 4672
- hash: "b0c3ef9c5331af8768b23537d1d38311"
+ hash: "3b18ada8637d4024acfe88718765f71c"
}
Key {
type: 6
@@ -1878,19 +1878,19 @@ VisualTest {
}
Frame {
msec: 4688
- hash: "3be1d2faec1ab5d3d1ab72c25db95059"
+ hash: "c419775870b0c5e41b5156c840e6a298"
}
Frame {
msec: 4704
- hash: "3be1d2faec1ab5d3d1ab72c25db95059"
+ hash: "c419775870b0c5e41b5156c840e6a298"
}
Frame {
msec: 4720
- hash: "3be1d2faec1ab5d3d1ab72c25db95059"
+ hash: "c419775870b0c5e41b5156c840e6a298"
}
Frame {
msec: 4736
- hash: "3be1d2faec1ab5d3d1ab72c25db95059"
+ hash: "c419775870b0c5e41b5156c840e6a298"
}
Key {
type: 7
@@ -1902,15 +1902,15 @@ VisualTest {
}
Frame {
msec: 4752
- hash: "3be1d2faec1ab5d3d1ab72c25db95059"
+ hash: "c419775870b0c5e41b5156c840e6a298"
}
Frame {
msec: 4768
- hash: "3be1d2faec1ab5d3d1ab72c25db95059"
+ hash: "c419775870b0c5e41b5156c840e6a298"
}
Frame {
msec: 4784
- hash: "3be1d2faec1ab5d3d1ab72c25db95059"
+ hash: "c419775870b0c5e41b5156c840e6a298"
}
Key {
type: 6
@@ -1922,7 +1922,7 @@ VisualTest {
}
Frame {
msec: 4800
- hash: "db999862fcf827930098b3f129ff567f"
+ hash: "81a744f02650728c7557a27c94056e64"
}
Frame {
msec: 4816
@@ -1938,19 +1938,19 @@ VisualTest {
}
Frame {
msec: 4832
- hash: "db999862fcf827930098b3f129ff567f"
+ hash: "81a744f02650728c7557a27c94056e64"
}
Frame {
msec: 4848
- hash: "db999862fcf827930098b3f129ff567f"
+ hash: "81a744f02650728c7557a27c94056e64"
}
Frame {
msec: 4864
- hash: "db999862fcf827930098b3f129ff567f"
+ hash: "81a744f02650728c7557a27c94056e64"
}
Frame {
msec: 4880
- hash: "db999862fcf827930098b3f129ff567f"
+ hash: "81a744f02650728c7557a27c94056e64"
}
Key {
type: 6
@@ -1962,19 +1962,19 @@ VisualTest {
}
Frame {
msec: 4896
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 4912
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 4928
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 4944
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Key {
type: 7
@@ -1986,207 +1986,207 @@ VisualTest {
}
Frame {
msec: 4960
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 4976
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 4992
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5008
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5024
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5040
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5056
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5072
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5088
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5104
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5120
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5136
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5152
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5168
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5184
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5200
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5216
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5232
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5248
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5264
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5280
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5296
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5312
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5328
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5344
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5360
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5376
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5392
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5408
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5424
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5440
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5456
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5472
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5488
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5504
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5520
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5536
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5552
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5568
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5584
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5600
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5616
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5632
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5648
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5664
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5680
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5696
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5712
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5728
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5744
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5760
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5776
@@ -2194,239 +2194,239 @@ VisualTest {
}
Frame {
msec: 5792
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5808
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5824
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5840
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5856
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5872
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5888
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5904
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5920
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5936
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5952
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5968
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 5984
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6000
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6016
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6032
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6048
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6064
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6080
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6096
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6112
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6128
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6144
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6160
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6176
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6192
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6208
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6224
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6240
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6256
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6272
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6288
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6304
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6320
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6336
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6352
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6368
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6384
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6400
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6416
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6432
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6448
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6464
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6480
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6496
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6512
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6528
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6544
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6560
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6576
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6592
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6608
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6624
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6640
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6656
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6672
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6688
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6704
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6720
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6736
@@ -2434,34 +2434,34 @@ VisualTest {
}
Frame {
msec: 6752
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6768
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6784
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6800
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6816
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6832
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6848
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
Frame {
msec: 6864
- hash: "6557c4982e2c23d0ef5ec8a594df7277"
+ hash: "ed1520bf20159e60c6a75bbf07f3a6ee"
}
}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.1.png
index 05dd690..060be22 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.1.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.2.png
index eb74cc5..d373aef 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.2.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.2.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.3.png
index 3aed06c..5dad108 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.3.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.3.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.qml
index 2de4a10..6081aaf 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.qml
@@ -110,23 +110,23 @@ VisualTest {
}
Frame {
msec: 368
- hash: "bc06530170cf26690a09ed9f6c4014fd"
+ hash: "593867b082681c362d7dffda12615284"
}
Frame {
msec: 384
- hash: "bc06530170cf26690a09ed9f6c4014fd"
+ hash: "593867b082681c362d7dffda12615284"
}
Frame {
msec: 400
- hash: "bc06530170cf26690a09ed9f6c4014fd"
+ hash: "593867b082681c362d7dffda12615284"
}
Frame {
msec: 416
- hash: "bc06530170cf26690a09ed9f6c4014fd"
+ hash: "593867b082681c362d7dffda12615284"
}
Frame {
msec: 432
- hash: "bc06530170cf26690a09ed9f6c4014fd"
+ hash: "593867b082681c362d7dffda12615284"
}
Key {
type: 7
@@ -138,27 +138,27 @@ VisualTest {
}
Frame {
msec: 448
- hash: "bc06530170cf26690a09ed9f6c4014fd"
+ hash: "593867b082681c362d7dffda12615284"
}
Frame {
msec: 464
- hash: "bc06530170cf26690a09ed9f6c4014fd"
+ hash: "593867b082681c362d7dffda12615284"
}
Frame {
msec: 480
- hash: "bc06530170cf26690a09ed9f6c4014fd"
+ hash: "593867b082681c362d7dffda12615284"
}
Frame {
msec: 496
- hash: "bc06530170cf26690a09ed9f6c4014fd"
+ hash: "593867b082681c362d7dffda12615284"
}
Frame {
msec: 512
- hash: "bc06530170cf26690a09ed9f6c4014fd"
+ hash: "593867b082681c362d7dffda12615284"
}
Frame {
msec: 528
- hash: "bc06530170cf26690a09ed9f6c4014fd"
+ hash: "593867b082681c362d7dffda12615284"
}
Key {
type: 7
@@ -170,43 +170,43 @@ VisualTest {
}
Frame {
msec: 544
- hash: "bc06530170cf26690a09ed9f6c4014fd"
+ hash: "593867b082681c362d7dffda12615284"
}
Frame {
msec: 560
- hash: "bc06530170cf26690a09ed9f6c4014fd"
+ hash: "593867b082681c362d7dffda12615284"
}
Frame {
msec: 576
- hash: "bc06530170cf26690a09ed9f6c4014fd"
+ hash: "593867b082681c362d7dffda12615284"
}
Frame {
msec: 592
- hash: "bc06530170cf26690a09ed9f6c4014fd"
+ hash: "593867b082681c362d7dffda12615284"
}
Frame {
msec: 608
- hash: "bc06530170cf26690a09ed9f6c4014fd"
+ hash: "593867b082681c362d7dffda12615284"
}
Frame {
msec: 624
- hash: "bc06530170cf26690a09ed9f6c4014fd"
+ hash: "593867b082681c362d7dffda12615284"
}
Frame {
msec: 640
- hash: "bc06530170cf26690a09ed9f6c4014fd"
+ hash: "593867b082681c362d7dffda12615284"
}
Frame {
msec: 656
- hash: "bc06530170cf26690a09ed9f6c4014fd"
+ hash: "593867b082681c362d7dffda12615284"
}
Frame {
msec: 672
- hash: "bc06530170cf26690a09ed9f6c4014fd"
+ hash: "593867b082681c362d7dffda12615284"
}
Frame {
msec: 688
- hash: "bc06530170cf26690a09ed9f6c4014fd"
+ hash: "593867b082681c362d7dffda12615284"
}
Key {
type: 6
@@ -218,23 +218,23 @@ VisualTest {
}
Frame {
msec: 704
- hash: "8c64a986ce7bd19dcc88785309456f4e"
+ hash: "8d4a4baca932c318fba437b05962a635"
}
Frame {
msec: 720
- hash: "8c64a986ce7bd19dcc88785309456f4e"
+ hash: "8d4a4baca932c318fba437b05962a635"
}
Frame {
msec: 736
- hash: "8c64a986ce7bd19dcc88785309456f4e"
+ hash: "8d4a4baca932c318fba437b05962a635"
}
Frame {
msec: 752
- hash: "8c64a986ce7bd19dcc88785309456f4e"
+ hash: "8d4a4baca932c318fba437b05962a635"
}
Frame {
msec: 768
- hash: "8c64a986ce7bd19dcc88785309456f4e"
+ hash: "8d4a4baca932c318fba437b05962a635"
}
Key {
type: 7
@@ -246,23 +246,23 @@ VisualTest {
}
Frame {
msec: 784
- hash: "8c64a986ce7bd19dcc88785309456f4e"
+ hash: "8d4a4baca932c318fba437b05962a635"
}
Frame {
msec: 800
- hash: "8c64a986ce7bd19dcc88785309456f4e"
+ hash: "8d4a4baca932c318fba437b05962a635"
}
Frame {
msec: 816
- hash: "8c64a986ce7bd19dcc88785309456f4e"
+ hash: "8d4a4baca932c318fba437b05962a635"
}
Frame {
msec: 832
- hash: "8c64a986ce7bd19dcc88785309456f4e"
+ hash: "8d4a4baca932c318fba437b05962a635"
}
Frame {
msec: 848
- hash: "8c64a986ce7bd19dcc88785309456f4e"
+ hash: "8d4a4baca932c318fba437b05962a635"
}
Key {
type: 6
@@ -274,15 +274,15 @@ VisualTest {
}
Frame {
msec: 864
- hash: "4cfca8edcb96b1d9986db4ee491bf857"
+ hash: "b2698dba3a5ebe80e26f273b32857506"
}
Frame {
msec: 880
- hash: "4cfca8edcb96b1d9986db4ee491bf857"
+ hash: "b2698dba3a5ebe80e26f273b32857506"
}
Frame {
msec: 896
- hash: "4cfca8edcb96b1d9986db4ee491bf857"
+ hash: "b2698dba3a5ebe80e26f273b32857506"
}
Key {
type: 7
@@ -294,19 +294,19 @@ VisualTest {
}
Frame {
msec: 912
- hash: "4cfca8edcb96b1d9986db4ee491bf857"
+ hash: "b2698dba3a5ebe80e26f273b32857506"
}
Frame {
msec: 928
- hash: "4cfca8edcb96b1d9986db4ee491bf857"
+ hash: "b2698dba3a5ebe80e26f273b32857506"
}
Frame {
msec: 944
- hash: "4cfca8edcb96b1d9986db4ee491bf857"
+ hash: "b2698dba3a5ebe80e26f273b32857506"
}
Frame {
msec: 960
- hash: "4cfca8edcb96b1d9986db4ee491bf857"
+ hash: "b2698dba3a5ebe80e26f273b32857506"
}
Frame {
msec: 976
@@ -322,19 +322,19 @@ VisualTest {
}
Frame {
msec: 992
- hash: "3d25316ea23ace5a88dbe8765b743eb3"
+ hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
}
Frame {
msec: 1008
- hash: "3d25316ea23ace5a88dbe8765b743eb3"
+ hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
}
Frame {
msec: 1024
- hash: "3d25316ea23ace5a88dbe8765b743eb3"
+ hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
}
Frame {
msec: 1040
- hash: "3d25316ea23ace5a88dbe8765b743eb3"
+ hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
}
Key {
type: 7
@@ -346,51 +346,51 @@ VisualTest {
}
Frame {
msec: 1056
- hash: "3d25316ea23ace5a88dbe8765b743eb3"
+ hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
}
Frame {
msec: 1072
- hash: "3d25316ea23ace5a88dbe8765b743eb3"
+ hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
}
Frame {
msec: 1088
- hash: "3d25316ea23ace5a88dbe8765b743eb3"
+ hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
}
Frame {
msec: 1104
- hash: "3d25316ea23ace5a88dbe8765b743eb3"
+ hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
}
Frame {
msec: 1120
- hash: "3d25316ea23ace5a88dbe8765b743eb3"
+ hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
}
Frame {
msec: 1136
- hash: "3d25316ea23ace5a88dbe8765b743eb3"
+ hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
}
Frame {
msec: 1152
- hash: "3d25316ea23ace5a88dbe8765b743eb3"
+ hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
}
Frame {
msec: 1168
- hash: "3d25316ea23ace5a88dbe8765b743eb3"
+ hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
}
Frame {
msec: 1184
- hash: "3d25316ea23ace5a88dbe8765b743eb3"
+ hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
}
Frame {
msec: 1200
- hash: "3d25316ea23ace5a88dbe8765b743eb3"
+ hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
}
Frame {
msec: 1216
- hash: "3d25316ea23ace5a88dbe8765b743eb3"
+ hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
}
Frame {
msec: 1232
- hash: "3d25316ea23ace5a88dbe8765b743eb3"
+ hash: "3ea06a90d633d5e9fe5a11cc4ed67764"
}
Key {
type: 6
@@ -402,15 +402,15 @@ VisualTest {
}
Frame {
msec: 1248
- hash: "fea82a32ec46a88027cc9b0c00aa0aba"
+ hash: "a190bbf59ec807391077b9d1183f72b5"
}
Frame {
msec: 1264
- hash: "fea82a32ec46a88027cc9b0c00aa0aba"
+ hash: "a190bbf59ec807391077b9d1183f72b5"
}
Frame {
msec: 1280
- hash: "fea82a32ec46a88027cc9b0c00aa0aba"
+ hash: "a190bbf59ec807391077b9d1183f72b5"
}
Key {
type: 7
@@ -422,15 +422,15 @@ VisualTest {
}
Frame {
msec: 1296
- hash: "fea82a32ec46a88027cc9b0c00aa0aba"
+ hash: "a190bbf59ec807391077b9d1183f72b5"
}
Frame {
msec: 1312
- hash: "fea82a32ec46a88027cc9b0c00aa0aba"
+ hash: "a190bbf59ec807391077b9d1183f72b5"
}
Frame {
msec: 1328
- hash: "fea82a32ec46a88027cc9b0c00aa0aba"
+ hash: "a190bbf59ec807391077b9d1183f72b5"
}
Key {
type: 6
@@ -442,39 +442,39 @@ VisualTest {
}
Frame {
msec: 1344
- hash: "fffa6f462ea15fe3bdbf2c199881fce4"
+ hash: "f171a98a3a726b517ad4b401a0720ba2"
}
Frame {
msec: 1360
- hash: "fffa6f462ea15fe3bdbf2c199881fce4"
+ hash: "f171a98a3a726b517ad4b401a0720ba2"
}
Frame {
msec: 1376
- hash: "fffa6f462ea15fe3bdbf2c199881fce4"
+ hash: "f171a98a3a726b517ad4b401a0720ba2"
}
Frame {
msec: 1392
- hash: "fffa6f462ea15fe3bdbf2c199881fce4"
+ hash: "f171a98a3a726b517ad4b401a0720ba2"
}
Frame {
msec: 1408
- hash: "fffa6f462ea15fe3bdbf2c199881fce4"
+ hash: "f171a98a3a726b517ad4b401a0720ba2"
}
Frame {
msec: 1424
- hash: "fffa6f462ea15fe3bdbf2c199881fce4"
+ hash: "f171a98a3a726b517ad4b401a0720ba2"
}
Frame {
msec: 1440
- hash: "fffa6f462ea15fe3bdbf2c199881fce4"
+ hash: "f171a98a3a726b517ad4b401a0720ba2"
}
Frame {
msec: 1456
- hash: "fffa6f462ea15fe3bdbf2c199881fce4"
+ hash: "f171a98a3a726b517ad4b401a0720ba2"
}
Frame {
msec: 1472
- hash: "fffa6f462ea15fe3bdbf2c199881fce4"
+ hash: "f171a98a3a726b517ad4b401a0720ba2"
}
Key {
type: 7
@@ -486,7 +486,7 @@ VisualTest {
}
Frame {
msec: 1488
- hash: "fffa6f462ea15fe3bdbf2c199881fce4"
+ hash: "f171a98a3a726b517ad4b401a0720ba2"
}
Key {
type: 6
@@ -498,19 +498,19 @@ VisualTest {
}
Frame {
msec: 1504
- hash: "d874584748e4aa14fd71730aa36d676c"
+ hash: "e7199e4284be9dea34caff7bde0f6303"
}
Frame {
msec: 1520
- hash: "d874584748e4aa14fd71730aa36d676c"
+ hash: "e7199e4284be9dea34caff7bde0f6303"
}
Frame {
msec: 1536
- hash: "d874584748e4aa14fd71730aa36d676c"
+ hash: "e7199e4284be9dea34caff7bde0f6303"
}
Frame {
msec: 1552
- hash: "d874584748e4aa14fd71730aa36d676c"
+ hash: "e7199e4284be9dea34caff7bde0f6303"
}
Key {
type: 7
@@ -522,27 +522,27 @@ VisualTest {
}
Frame {
msec: 1568
- hash: "d874584748e4aa14fd71730aa36d676c"
+ hash: "e7199e4284be9dea34caff7bde0f6303"
}
Frame {
msec: 1584
- hash: "d874584748e4aa14fd71730aa36d676c"
+ hash: "e7199e4284be9dea34caff7bde0f6303"
}
Frame {
msec: 1600
- hash: "d874584748e4aa14fd71730aa36d676c"
+ hash: "e7199e4284be9dea34caff7bde0f6303"
}
Frame {
msec: 1616
- hash: "d874584748e4aa14fd71730aa36d676c"
+ hash: "e7199e4284be9dea34caff7bde0f6303"
}
Frame {
msec: 1632
- hash: "d874584748e4aa14fd71730aa36d676c"
+ hash: "e7199e4284be9dea34caff7bde0f6303"
}
Frame {
msec: 1648
- hash: "d874584748e4aa14fd71730aa36d676c"
+ hash: "e7199e4284be9dea34caff7bde0f6303"
}
Key {
type: 6
@@ -554,23 +554,23 @@ VisualTest {
}
Frame {
msec: 1664
- hash: "5eac6452c3c01de25633be412b2c9fd6"
+ hash: "1d9d3c6435f2fa06bda16ef4a2ff238f"
}
Frame {
msec: 1680
- hash: "5eac6452c3c01de25633be412b2c9fd6"
+ hash: "1d9d3c6435f2fa06bda16ef4a2ff238f"
}
Frame {
msec: 1696
- hash: "5eac6452c3c01de25633be412b2c9fd6"
+ hash: "1d9d3c6435f2fa06bda16ef4a2ff238f"
}
Frame {
msec: 1712
- hash: "5eac6452c3c01de25633be412b2c9fd6"
+ hash: "1d9d3c6435f2fa06bda16ef4a2ff238f"
}
Frame {
msec: 1728
- hash: "5eac6452c3c01de25633be412b2c9fd6"
+ hash: "1d9d3c6435f2fa06bda16ef4a2ff238f"
}
Key {
type: 6
@@ -582,7 +582,7 @@ VisualTest {
}
Frame {
msec: 1744
- hash: "8bf395bd43cf0483aea0ddf3e8ab8c56"
+ hash: "9d8cb02bbc4f39d38ccdf8e9bda0ed5c"
}
Key {
type: 7
@@ -594,15 +594,15 @@ VisualTest {
}
Frame {
msec: 1760
- hash: "8bf395bd43cf0483aea0ddf3e8ab8c56"
+ hash: "9d8cb02bbc4f39d38ccdf8e9bda0ed5c"
}
Frame {
msec: 1776
- hash: "8bf395bd43cf0483aea0ddf3e8ab8c56"
+ hash: "9d8cb02bbc4f39d38ccdf8e9bda0ed5c"
}
Frame {
msec: 1792
- hash: "8bf395bd43cf0483aea0ddf3e8ab8c56"
+ hash: "9d8cb02bbc4f39d38ccdf8e9bda0ed5c"
}
Key {
type: 7
@@ -614,19 +614,19 @@ VisualTest {
}
Frame {
msec: 1808
- hash: "8bf395bd43cf0483aea0ddf3e8ab8c56"
+ hash: "9d8cb02bbc4f39d38ccdf8e9bda0ed5c"
}
Frame {
msec: 1824
- hash: "8bf395bd43cf0483aea0ddf3e8ab8c56"
+ hash: "9d8cb02bbc4f39d38ccdf8e9bda0ed5c"
}
Frame {
msec: 1840
- hash: "8bf395bd43cf0483aea0ddf3e8ab8c56"
+ hash: "9d8cb02bbc4f39d38ccdf8e9bda0ed5c"
}
Frame {
msec: 1856
- hash: "8bf395bd43cf0483aea0ddf3e8ab8c56"
+ hash: "9d8cb02bbc4f39d38ccdf8e9bda0ed5c"
}
Key {
type: 6
@@ -638,19 +638,19 @@ VisualTest {
}
Frame {
msec: 1872
- hash: "4a31bba56f9adaccf47e6335ed4e284f"
+ hash: "2af75935ad1d3be02c6481c094737575"
}
Frame {
msec: 1888
- hash: "4a31bba56f9adaccf47e6335ed4e284f"
+ hash: "2af75935ad1d3be02c6481c094737575"
}
Frame {
msec: 1904
- hash: "4a31bba56f9adaccf47e6335ed4e284f"
+ hash: "2af75935ad1d3be02c6481c094737575"
}
Frame {
msec: 1920
- hash: "4a31bba56f9adaccf47e6335ed4e284f"
+ hash: "2af75935ad1d3be02c6481c094737575"
}
Key {
type: 7
@@ -666,23 +666,23 @@ VisualTest {
}
Frame {
msec: 1952
- hash: "4a31bba56f9adaccf47e6335ed4e284f"
+ hash: "2af75935ad1d3be02c6481c094737575"
}
Frame {
msec: 1968
- hash: "4a31bba56f9adaccf47e6335ed4e284f"
+ hash: "2af75935ad1d3be02c6481c094737575"
}
Frame {
msec: 1984
- hash: "4a31bba56f9adaccf47e6335ed4e284f"
+ hash: "2af75935ad1d3be02c6481c094737575"
}
Frame {
msec: 2000
- hash: "4a31bba56f9adaccf47e6335ed4e284f"
+ hash: "2af75935ad1d3be02c6481c094737575"
}
Frame {
msec: 2016
- hash: "4a31bba56f9adaccf47e6335ed4e284f"
+ hash: "2af75935ad1d3be02c6481c094737575"
}
Key {
type: 6
@@ -694,11 +694,11 @@ VisualTest {
}
Frame {
msec: 2032
- hash: "8bbabbbe84de490438d1111aa728c15f"
+ hash: "c3512d6a7ead481aa6fec8ef8ee2f1d1"
}
Frame {
msec: 2048
- hash: "8bbabbbe84de490438d1111aa728c15f"
+ hash: "c3512d6a7ead481aa6fec8ef8ee2f1d1"
}
Key {
type: 7
@@ -710,11 +710,11 @@ VisualTest {
}
Frame {
msec: 2064
- hash: "8bbabbbe84de490438d1111aa728c15f"
+ hash: "c3512d6a7ead481aa6fec8ef8ee2f1d1"
}
Frame {
msec: 2080
- hash: "8bbabbbe84de490438d1111aa728c15f"
+ hash: "c3512d6a7ead481aa6fec8ef8ee2f1d1"
}
Key {
type: 6
@@ -726,19 +726,19 @@ VisualTest {
}
Frame {
msec: 2096
- hash: "5877f1d527fecaf1077ff5bd2fe1934f"
+ hash: "064e1fc885ab7f07dad1770361087bef"
}
Frame {
msec: 2112
- hash: "5877f1d527fecaf1077ff5bd2fe1934f"
+ hash: "064e1fc885ab7f07dad1770361087bef"
}
Frame {
msec: 2128
- hash: "5877f1d527fecaf1077ff5bd2fe1934f"
+ hash: "064e1fc885ab7f07dad1770361087bef"
}
Frame {
msec: 2144
- hash: "5877f1d527fecaf1077ff5bd2fe1934f"
+ hash: "064e1fc885ab7f07dad1770361087bef"
}
Key {
type: 6
@@ -758,19 +758,19 @@ VisualTest {
}
Frame {
msec: 2160
- hash: "1593ef669fdff28c33f54c12c7e7424e"
+ hash: "9b764f6e9cc3d30446e1b32f7ab94f66"
}
Frame {
msec: 2176
- hash: "1593ef669fdff28c33f54c12c7e7424e"
+ hash: "9b764f6e9cc3d30446e1b32f7ab94f66"
}
Frame {
msec: 2192
- hash: "1593ef669fdff28c33f54c12c7e7424e"
+ hash: "9b764f6e9cc3d30446e1b32f7ab94f66"
}
Frame {
msec: 2208
- hash: "1593ef669fdff28c33f54c12c7e7424e"
+ hash: "9b764f6e9cc3d30446e1b32f7ab94f66"
}
Key {
type: 6
@@ -782,7 +782,7 @@ VisualTest {
}
Frame {
msec: 2224
- hash: "da746581451954d7d941fbac825a1009"
+ hash: "18eff632e106f632aad481ab40f985d7"
}
Key {
type: 7
@@ -794,23 +794,23 @@ VisualTest {
}
Frame {
msec: 2240
- hash: "da746581451954d7d941fbac825a1009"
+ hash: "18eff632e106f632aad481ab40f985d7"
}
Frame {
msec: 2256
- hash: "da746581451954d7d941fbac825a1009"
+ hash: "18eff632e106f632aad481ab40f985d7"
}
Frame {
msec: 2272
- hash: "da746581451954d7d941fbac825a1009"
+ hash: "18eff632e106f632aad481ab40f985d7"
}
Frame {
msec: 2288
- hash: "da746581451954d7d941fbac825a1009"
+ hash: "18eff632e106f632aad481ab40f985d7"
}
Frame {
msec: 2304
- hash: "da746581451954d7d941fbac825a1009"
+ hash: "18eff632e106f632aad481ab40f985d7"
}
Key {
type: 7
@@ -822,11 +822,11 @@ VisualTest {
}
Frame {
msec: 2320
- hash: "da746581451954d7d941fbac825a1009"
+ hash: "18eff632e106f632aad481ab40f985d7"
}
Frame {
msec: 2336
- hash: "da746581451954d7d941fbac825a1009"
+ hash: "18eff632e106f632aad481ab40f985d7"
}
Key {
type: 6
@@ -838,27 +838,27 @@ VisualTest {
}
Frame {
msec: 2352
- hash: "3e008b7ead8459c1667f4f385d4c5372"
+ hash: "eaabd4617081e3bc68a5b9099c63272a"
}
Frame {
msec: 2368
- hash: "3e008b7ead8459c1667f4f385d4c5372"
+ hash: "eaabd4617081e3bc68a5b9099c63272a"
}
Frame {
msec: 2384
- hash: "3e008b7ead8459c1667f4f385d4c5372"
+ hash: "eaabd4617081e3bc68a5b9099c63272a"
}
Frame {
msec: 2400
- hash: "3e008b7ead8459c1667f4f385d4c5372"
+ hash: "eaabd4617081e3bc68a5b9099c63272a"
}
Frame {
msec: 2416
- hash: "3e008b7ead8459c1667f4f385d4c5372"
+ hash: "eaabd4617081e3bc68a5b9099c63272a"
}
Frame {
msec: 2432
- hash: "3e008b7ead8459c1667f4f385d4c5372"
+ hash: "eaabd4617081e3bc68a5b9099c63272a"
}
Key {
type: 7
@@ -870,19 +870,19 @@ VisualTest {
}
Frame {
msec: 2448
- hash: "3e008b7ead8459c1667f4f385d4c5372"
+ hash: "eaabd4617081e3bc68a5b9099c63272a"
}
Frame {
msec: 2464
- hash: "3e008b7ead8459c1667f4f385d4c5372"
+ hash: "eaabd4617081e3bc68a5b9099c63272a"
}
Frame {
msec: 2480
- hash: "3e008b7ead8459c1667f4f385d4c5372"
+ hash: "eaabd4617081e3bc68a5b9099c63272a"
}
Frame {
msec: 2496
- hash: "3e008b7ead8459c1667f4f385d4c5372"
+ hash: "eaabd4617081e3bc68a5b9099c63272a"
}
Key {
type: 6
@@ -894,15 +894,15 @@ VisualTest {
}
Frame {
msec: 2512
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2528
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2544
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Key {
type: 7
@@ -914,87 +914,87 @@ VisualTest {
}
Frame {
msec: 2560
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2576
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2592
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2608
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2624
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2640
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2656
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2672
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2688
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2704
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2720
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2736
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2752
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2768
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2784
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2800
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2816
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2832
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2848
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2864
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2880
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2896
@@ -1002,42 +1002,42 @@ VisualTest {
}
Frame {
msec: 2912
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2928
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2944
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2960
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2976
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 2992
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 3008
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 3024
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 3040
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
Frame {
msec: 3056
- hash: "1dbc7e1ab58dcec8691ff4195b0d581c"
+ hash: "fec019ea87914d30b5bf4754ce8ba916"
}
}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.qml
index a1a0821..fc8a115 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.qml
@@ -379,7 +379,7 @@ VisualTest {
Key {
type: 6
key: 16777249
- modifiers: 67108864
+ modifiers: 0
text: ""
autorep: false
count: 1
@@ -583,7 +583,7 @@ VisualTest {
Key {
type: 7
key: 16777249
- modifiers: 0
+ modifiers: 67108864
text: ""
autorep: false
count: 1
@@ -783,7 +783,7 @@ VisualTest {
Key {
type: 6
key: 16777249
- modifiers: 67108864
+ modifiers: 0
text: ""
autorep: false
count: 1
@@ -1175,7 +1175,7 @@ VisualTest {
Key {
type: 7
key: 16777249
- modifiers: 0
+ modifiers: 67108864
text: ""
autorep: false
count: 1
@@ -1823,7 +1823,7 @@ VisualTest {
Key {
type: 6
key: 16777249
- modifiers: 67108864
+ modifiers: 0
text: ""
autorep: false
count: 1
@@ -2327,7 +2327,7 @@ VisualTest {
Key {
type: 7
key: 16777249
- modifiers: 0
+ modifiers: 67108864
text: ""
autorep: false
count: 1
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.0.png
index a6593c9..63b1779 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.1.png
index 914f1b1..7924652 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.1.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.2.png
index dd2b946..e77bfde 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.2.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.2.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.3.png
index 629b84b..67d7e52 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.3.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.3.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.qml
index 211ca68..ee29db6 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.qml
@@ -10,7 +10,7 @@ VisualTest {
}
Frame {
msec: 32
- hash: "eff6a4491bc00e5570ea73a1371f63fc"
+ hash: "75bcecaf83ffc9b851894db0be2c02bc"
}
Key {
type: 6
@@ -22,83 +22,83 @@ VisualTest {
}
Frame {
msec: 48
- hash: "eff6a4491bc00e5570ea73a1371f63fc"
+ hash: "75bcecaf83ffc9b851894db0be2c02bc"
}
Frame {
msec: 64
- hash: "eff6a4491bc00e5570ea73a1371f63fc"
+ hash: "75bcecaf83ffc9b851894db0be2c02bc"
}
Frame {
msec: 80
- hash: "eff6a4491bc00e5570ea73a1371f63fc"
+ hash: "75bcecaf83ffc9b851894db0be2c02bc"
}
Frame {
msec: 96
- hash: "eff6a4491bc00e5570ea73a1371f63fc"
+ hash: "75bcecaf83ffc9b851894db0be2c02bc"
}
Frame {
msec: 112
- hash: "eff6a4491bc00e5570ea73a1371f63fc"
+ hash: "75bcecaf83ffc9b851894db0be2c02bc"
}
Frame {
msec: 128
- hash: "eff6a4491bc00e5570ea73a1371f63fc"
+ hash: "75bcecaf83ffc9b851894db0be2c02bc"
}
Frame {
msec: 144
- hash: "eff6a4491bc00e5570ea73a1371f63fc"
+ hash: "75bcecaf83ffc9b851894db0be2c02bc"
}
Frame {
msec: 160
- hash: "eff6a4491bc00e5570ea73a1371f63fc"
+ hash: "75bcecaf83ffc9b851894db0be2c02bc"
}
Frame {
msec: 176
- hash: "eff6a4491bc00e5570ea73a1371f63fc"
+ hash: "75bcecaf83ffc9b851894db0be2c02bc"
}
Frame {
msec: 192
- hash: "eff6a4491bc00e5570ea73a1371f63fc"
+ hash: "75bcecaf83ffc9b851894db0be2c02bc"
}
Frame {
msec: 208
- hash: "eff6a4491bc00e5570ea73a1371f63fc"
+ hash: "75bcecaf83ffc9b851894db0be2c02bc"
}
Frame {
msec: 224
- hash: "eff6a4491bc00e5570ea73a1371f63fc"
+ hash: "75bcecaf83ffc9b851894db0be2c02bc"
}
Frame {
msec: 240
- hash: "eff6a4491bc00e5570ea73a1371f63fc"
+ hash: "75bcecaf83ffc9b851894db0be2c02bc"
}
Frame {
msec: 256
- hash: "eff6a4491bc00e5570ea73a1371f63fc"
+ hash: "75bcecaf83ffc9b851894db0be2c02bc"
}
Frame {
msec: 272
- hash: "eff6a4491bc00e5570ea73a1371f63fc"
+ hash: "75bcecaf83ffc9b851894db0be2c02bc"
}
Frame {
msec: 288
- hash: "eff6a4491bc00e5570ea73a1371f63fc"
+ hash: "75bcecaf83ffc9b851894db0be2c02bc"
}
Frame {
msec: 304
- hash: "eff6a4491bc00e5570ea73a1371f63fc"
+ hash: "75bcecaf83ffc9b851894db0be2c02bc"
}
Frame {
msec: 320
- hash: "eff6a4491bc00e5570ea73a1371f63fc"
+ hash: "75bcecaf83ffc9b851894db0be2c02bc"
}
Frame {
msec: 336
- hash: "eff6a4491bc00e5570ea73a1371f63fc"
+ hash: "75bcecaf83ffc9b851894db0be2c02bc"
}
Frame {
msec: 352
- hash: "eff6a4491bc00e5570ea73a1371f63fc"
+ hash: "75bcecaf83ffc9b851894db0be2c02bc"
}
Key {
type: 6
@@ -110,23 +110,23 @@ VisualTest {
}
Frame {
msec: 368
- hash: "00097f2bb5cf4ea412db48acb93ffd76"
+ hash: "1a9f4d47e3982ce68eee8446fd735487"
}
Frame {
msec: 384
- hash: "00097f2bb5cf4ea412db48acb93ffd76"
+ hash: "1a9f4d47e3982ce68eee8446fd735487"
}
Frame {
msec: 400
- hash: "00097f2bb5cf4ea412db48acb93ffd76"
+ hash: "1a9f4d47e3982ce68eee8446fd735487"
}
Frame {
msec: 416
- hash: "00097f2bb5cf4ea412db48acb93ffd76"
+ hash: "1a9f4d47e3982ce68eee8446fd735487"
}
Frame {
msec: 432
- hash: "00097f2bb5cf4ea412db48acb93ffd76"
+ hash: "1a9f4d47e3982ce68eee8446fd735487"
}
Key {
type: 7
@@ -138,27 +138,27 @@ VisualTest {
}
Frame {
msec: 448
- hash: "00097f2bb5cf4ea412db48acb93ffd76"
+ hash: "1a9f4d47e3982ce68eee8446fd735487"
}
Frame {
msec: 464
- hash: "00097f2bb5cf4ea412db48acb93ffd76"
+ hash: "1a9f4d47e3982ce68eee8446fd735487"
}
Frame {
msec: 480
- hash: "00097f2bb5cf4ea412db48acb93ffd76"
+ hash: "1a9f4d47e3982ce68eee8446fd735487"
}
Frame {
msec: 496
- hash: "00097f2bb5cf4ea412db48acb93ffd76"
+ hash: "1a9f4d47e3982ce68eee8446fd735487"
}
Frame {
msec: 512
- hash: "00097f2bb5cf4ea412db48acb93ffd76"
+ hash: "1a9f4d47e3982ce68eee8446fd735487"
}
Frame {
msec: 528
- hash: "00097f2bb5cf4ea412db48acb93ffd76"
+ hash: "1a9f4d47e3982ce68eee8446fd735487"
}
Key {
type: 7
@@ -170,43 +170,43 @@ VisualTest {
}
Frame {
msec: 544
- hash: "00097f2bb5cf4ea412db48acb93ffd76"
+ hash: "1a9f4d47e3982ce68eee8446fd735487"
}
Frame {
msec: 560
- hash: "00097f2bb5cf4ea412db48acb93ffd76"
+ hash: "1a9f4d47e3982ce68eee8446fd735487"
}
Frame {
msec: 576
- hash: "00097f2bb5cf4ea412db48acb93ffd76"
+ hash: "1a9f4d47e3982ce68eee8446fd735487"
}
Frame {
msec: 592
- hash: "00097f2bb5cf4ea412db48acb93ffd76"
+ hash: "1a9f4d47e3982ce68eee8446fd735487"
}
Frame {
msec: 608
- hash: "00097f2bb5cf4ea412db48acb93ffd76"
+ hash: "1a9f4d47e3982ce68eee8446fd735487"
}
Frame {
msec: 624
- hash: "00097f2bb5cf4ea412db48acb93ffd76"
+ hash: "1a9f4d47e3982ce68eee8446fd735487"
}
Frame {
msec: 640
- hash: "00097f2bb5cf4ea412db48acb93ffd76"
+ hash: "1a9f4d47e3982ce68eee8446fd735487"
}
Frame {
msec: 656
- hash: "00097f2bb5cf4ea412db48acb93ffd76"
+ hash: "1a9f4d47e3982ce68eee8446fd735487"
}
Frame {
msec: 672
- hash: "00097f2bb5cf4ea412db48acb93ffd76"
+ hash: "1a9f4d47e3982ce68eee8446fd735487"
}
Frame {
msec: 688
- hash: "00097f2bb5cf4ea412db48acb93ffd76"
+ hash: "1a9f4d47e3982ce68eee8446fd735487"
}
Key {
type: 6
@@ -218,23 +218,23 @@ VisualTest {
}
Frame {
msec: 704
- hash: "94e683223900efc840296b86ce934ec3"
+ hash: "9ab137169f2ea0f4b140a6e668f59ad2"
}
Frame {
msec: 720
- hash: "94e683223900efc840296b86ce934ec3"
+ hash: "9ab137169f2ea0f4b140a6e668f59ad2"
}
Frame {
msec: 736
- hash: "94e683223900efc840296b86ce934ec3"
+ hash: "9ab137169f2ea0f4b140a6e668f59ad2"
}
Frame {
msec: 752
- hash: "94e683223900efc840296b86ce934ec3"
+ hash: "9ab137169f2ea0f4b140a6e668f59ad2"
}
Frame {
msec: 768
- hash: "94e683223900efc840296b86ce934ec3"
+ hash: "9ab137169f2ea0f4b140a6e668f59ad2"
}
Key {
type: 7
@@ -246,23 +246,23 @@ VisualTest {
}
Frame {
msec: 784
- hash: "94e683223900efc840296b86ce934ec3"
+ hash: "9ab137169f2ea0f4b140a6e668f59ad2"
}
Frame {
msec: 800
- hash: "94e683223900efc840296b86ce934ec3"
+ hash: "9ab137169f2ea0f4b140a6e668f59ad2"
}
Frame {
msec: 816
- hash: "94e683223900efc840296b86ce934ec3"
+ hash: "9ab137169f2ea0f4b140a6e668f59ad2"
}
Frame {
msec: 832
- hash: "94e683223900efc840296b86ce934ec3"
+ hash: "9ab137169f2ea0f4b140a6e668f59ad2"
}
Frame {
msec: 848
- hash: "94e683223900efc840296b86ce934ec3"
+ hash: "9ab137169f2ea0f4b140a6e668f59ad2"
}
Key {
type: 6
@@ -274,15 +274,15 @@ VisualTest {
}
Frame {
msec: 864
- hash: "a1c7aeece2891f3ca0103761ffa7f424"
+ hash: "3080734a2da042b87ef9177cbb314835"
}
Frame {
msec: 880
- hash: "a1c7aeece2891f3ca0103761ffa7f424"
+ hash: "3080734a2da042b87ef9177cbb314835"
}
Frame {
msec: 896
- hash: "a1c7aeece2891f3ca0103761ffa7f424"
+ hash: "3080734a2da042b87ef9177cbb314835"
}
Key {
type: 7
@@ -294,19 +294,19 @@ VisualTest {
}
Frame {
msec: 912
- hash: "a1c7aeece2891f3ca0103761ffa7f424"
+ hash: "3080734a2da042b87ef9177cbb314835"
}
Frame {
msec: 928
- hash: "a1c7aeece2891f3ca0103761ffa7f424"
+ hash: "3080734a2da042b87ef9177cbb314835"
}
Frame {
msec: 944
- hash: "a1c7aeece2891f3ca0103761ffa7f424"
+ hash: "3080734a2da042b87ef9177cbb314835"
}
Frame {
msec: 960
- hash: "a1c7aeece2891f3ca0103761ffa7f424"
+ hash: "3080734a2da042b87ef9177cbb314835"
}
Frame {
msec: 976
@@ -322,19 +322,19 @@ VisualTest {
}
Frame {
msec: 992
- hash: "7a4ebe5f0875ded07b44c9ff2d6a4d75"
+ hash: "e591963b05361595383b1a60eec289cb"
}
Frame {
msec: 1008
- hash: "7a4ebe5f0875ded07b44c9ff2d6a4d75"
+ hash: "e591963b05361595383b1a60eec289cb"
}
Frame {
msec: 1024
- hash: "7a4ebe5f0875ded07b44c9ff2d6a4d75"
+ hash: "e591963b05361595383b1a60eec289cb"
}
Frame {
msec: 1040
- hash: "7a4ebe5f0875ded07b44c9ff2d6a4d75"
+ hash: "e591963b05361595383b1a60eec289cb"
}
Key {
type: 7
@@ -346,51 +346,51 @@ VisualTest {
}
Frame {
msec: 1056
- hash: "7a4ebe5f0875ded07b44c9ff2d6a4d75"
+ hash: "e591963b05361595383b1a60eec289cb"
}
Frame {
msec: 1072
- hash: "7a4ebe5f0875ded07b44c9ff2d6a4d75"
+ hash: "e591963b05361595383b1a60eec289cb"
}
Frame {
msec: 1088
- hash: "7a4ebe5f0875ded07b44c9ff2d6a4d75"
+ hash: "e591963b05361595383b1a60eec289cb"
}
Frame {
msec: 1104
- hash: "7a4ebe5f0875ded07b44c9ff2d6a4d75"
+ hash: "e591963b05361595383b1a60eec289cb"
}
Frame {
msec: 1120
- hash: "7a4ebe5f0875ded07b44c9ff2d6a4d75"
+ hash: "e591963b05361595383b1a60eec289cb"
}
Frame {
msec: 1136
- hash: "7a4ebe5f0875ded07b44c9ff2d6a4d75"
+ hash: "e591963b05361595383b1a60eec289cb"
}
Frame {
msec: 1152
- hash: "7a4ebe5f0875ded07b44c9ff2d6a4d75"
+ hash: "e591963b05361595383b1a60eec289cb"
}
Frame {
msec: 1168
- hash: "7a4ebe5f0875ded07b44c9ff2d6a4d75"
+ hash: "e591963b05361595383b1a60eec289cb"
}
Frame {
msec: 1184
- hash: "7a4ebe5f0875ded07b44c9ff2d6a4d75"
+ hash: "e591963b05361595383b1a60eec289cb"
}
Frame {
msec: 1200
- hash: "7a4ebe5f0875ded07b44c9ff2d6a4d75"
+ hash: "e591963b05361595383b1a60eec289cb"
}
Frame {
msec: 1216
- hash: "7a4ebe5f0875ded07b44c9ff2d6a4d75"
+ hash: "e591963b05361595383b1a60eec289cb"
}
Frame {
msec: 1232
- hash: "7a4ebe5f0875ded07b44c9ff2d6a4d75"
+ hash: "e591963b05361595383b1a60eec289cb"
}
Key {
type: 6
@@ -402,15 +402,15 @@ VisualTest {
}
Frame {
msec: 1248
- hash: "b7cdd294253e065c06fabc60895a29c2"
+ hash: "8a528bf3110bace8275f6fe33ce528b9"
}
Frame {
msec: 1264
- hash: "b7cdd294253e065c06fabc60895a29c2"
+ hash: "8a528bf3110bace8275f6fe33ce528b9"
}
Frame {
msec: 1280
- hash: "b7cdd294253e065c06fabc60895a29c2"
+ hash: "8a528bf3110bace8275f6fe33ce528b9"
}
Key {
type: 7
@@ -422,15 +422,15 @@ VisualTest {
}
Frame {
msec: 1296
- hash: "b7cdd294253e065c06fabc60895a29c2"
+ hash: "8a528bf3110bace8275f6fe33ce528b9"
}
Frame {
msec: 1312
- hash: "b7cdd294253e065c06fabc60895a29c2"
+ hash: "8a528bf3110bace8275f6fe33ce528b9"
}
Frame {
msec: 1328
- hash: "b7cdd294253e065c06fabc60895a29c2"
+ hash: "8a528bf3110bace8275f6fe33ce528b9"
}
Key {
type: 6
@@ -442,39 +442,39 @@ VisualTest {
}
Frame {
msec: 1344
- hash: "d8669a3194f485aaef3a1421f7fd50f6"
+ hash: "03d56caa0c86b5544d1f5148e0dccd92"
}
Frame {
msec: 1360
- hash: "d8669a3194f485aaef3a1421f7fd50f6"
+ hash: "03d56caa0c86b5544d1f5148e0dccd92"
}
Frame {
msec: 1376
- hash: "d8669a3194f485aaef3a1421f7fd50f6"
+ hash: "03d56caa0c86b5544d1f5148e0dccd92"
}
Frame {
msec: 1392
- hash: "d8669a3194f485aaef3a1421f7fd50f6"
+ hash: "03d56caa0c86b5544d1f5148e0dccd92"
}
Frame {
msec: 1408
- hash: "d8669a3194f485aaef3a1421f7fd50f6"
+ hash: "03d56caa0c86b5544d1f5148e0dccd92"
}
Frame {
msec: 1424
- hash: "d8669a3194f485aaef3a1421f7fd50f6"
+ hash: "03d56caa0c86b5544d1f5148e0dccd92"
}
Frame {
msec: 1440
- hash: "d8669a3194f485aaef3a1421f7fd50f6"
+ hash: "03d56caa0c86b5544d1f5148e0dccd92"
}
Frame {
msec: 1456
- hash: "d8669a3194f485aaef3a1421f7fd50f6"
+ hash: "03d56caa0c86b5544d1f5148e0dccd92"
}
Frame {
msec: 1472
- hash: "d8669a3194f485aaef3a1421f7fd50f6"
+ hash: "03d56caa0c86b5544d1f5148e0dccd92"
}
Key {
type: 7
@@ -486,7 +486,7 @@ VisualTest {
}
Frame {
msec: 1488
- hash: "d8669a3194f485aaef3a1421f7fd50f6"
+ hash: "03d56caa0c86b5544d1f5148e0dccd92"
}
Key {
type: 6
@@ -498,19 +498,19 @@ VisualTest {
}
Frame {
msec: 1504
- hash: "b53fd36f58dc692856e6a789371aaf33"
+ hash: "d9aac9ed4ca0ad97b440db3ac7384001"
}
Frame {
msec: 1520
- hash: "b53fd36f58dc692856e6a789371aaf33"
+ hash: "d9aac9ed4ca0ad97b440db3ac7384001"
}
Frame {
msec: 1536
- hash: "b53fd36f58dc692856e6a789371aaf33"
+ hash: "d9aac9ed4ca0ad97b440db3ac7384001"
}
Frame {
msec: 1552
- hash: "b53fd36f58dc692856e6a789371aaf33"
+ hash: "d9aac9ed4ca0ad97b440db3ac7384001"
}
Key {
type: 7
@@ -522,27 +522,27 @@ VisualTest {
}
Frame {
msec: 1568
- hash: "b53fd36f58dc692856e6a789371aaf33"
+ hash: "d9aac9ed4ca0ad97b440db3ac7384001"
}
Frame {
msec: 1584
- hash: "b53fd36f58dc692856e6a789371aaf33"
+ hash: "d9aac9ed4ca0ad97b440db3ac7384001"
}
Frame {
msec: 1600
- hash: "b53fd36f58dc692856e6a789371aaf33"
+ hash: "d9aac9ed4ca0ad97b440db3ac7384001"
}
Frame {
msec: 1616
- hash: "b53fd36f58dc692856e6a789371aaf33"
+ hash: "d9aac9ed4ca0ad97b440db3ac7384001"
}
Frame {
msec: 1632
- hash: "b53fd36f58dc692856e6a789371aaf33"
+ hash: "d9aac9ed4ca0ad97b440db3ac7384001"
}
Frame {
msec: 1648
- hash: "b53fd36f58dc692856e6a789371aaf33"
+ hash: "d9aac9ed4ca0ad97b440db3ac7384001"
}
Key {
type: 6
@@ -554,23 +554,23 @@ VisualTest {
}
Frame {
msec: 1664
- hash: "98de66666f6ea1a87bd493db3f67a7c6"
+ hash: "a2e8a6a742b11b4f30a2d75df14d5f47"
}
Frame {
msec: 1680
- hash: "98de66666f6ea1a87bd493db3f67a7c6"
+ hash: "a2e8a6a742b11b4f30a2d75df14d5f47"
}
Frame {
msec: 1696
- hash: "98de66666f6ea1a87bd493db3f67a7c6"
+ hash: "a2e8a6a742b11b4f30a2d75df14d5f47"
}
Frame {
msec: 1712
- hash: "98de66666f6ea1a87bd493db3f67a7c6"
+ hash: "a2e8a6a742b11b4f30a2d75df14d5f47"
}
Frame {
msec: 1728
- hash: "98de66666f6ea1a87bd493db3f67a7c6"
+ hash: "a2e8a6a742b11b4f30a2d75df14d5f47"
}
Key {
type: 6
@@ -582,7 +582,7 @@ VisualTest {
}
Frame {
msec: 1744
- hash: "696807419ef2b228dfb9d85dd79dd293"
+ hash: "021641e69fef4720acf6af15d4a2da82"
}
Key {
type: 7
@@ -594,15 +594,15 @@ VisualTest {
}
Frame {
msec: 1760
- hash: "696807419ef2b228dfb9d85dd79dd293"
+ hash: "021641e69fef4720acf6af15d4a2da82"
}
Frame {
msec: 1776
- hash: "696807419ef2b228dfb9d85dd79dd293"
+ hash: "021641e69fef4720acf6af15d4a2da82"
}
Frame {
msec: 1792
- hash: "696807419ef2b228dfb9d85dd79dd293"
+ hash: "021641e69fef4720acf6af15d4a2da82"
}
Key {
type: 7
@@ -614,19 +614,19 @@ VisualTest {
}
Frame {
msec: 1808
- hash: "696807419ef2b228dfb9d85dd79dd293"
+ hash: "021641e69fef4720acf6af15d4a2da82"
}
Frame {
msec: 1824
- hash: "696807419ef2b228dfb9d85dd79dd293"
+ hash: "021641e69fef4720acf6af15d4a2da82"
}
Frame {
msec: 1840
- hash: "696807419ef2b228dfb9d85dd79dd293"
+ hash: "021641e69fef4720acf6af15d4a2da82"
}
Frame {
msec: 1856
- hash: "696807419ef2b228dfb9d85dd79dd293"
+ hash: "021641e69fef4720acf6af15d4a2da82"
}
Key {
type: 6
@@ -638,19 +638,19 @@ VisualTest {
}
Frame {
msec: 1872
- hash: "4c0a528609872cf65180d336bbca4231"
+ hash: "46ece14e3a61aefcb28b3c888ac7ea59"
}
Frame {
msec: 1888
- hash: "4c0a528609872cf65180d336bbca4231"
+ hash: "46ece14e3a61aefcb28b3c888ac7ea59"
}
Frame {
msec: 1904
- hash: "4c0a528609872cf65180d336bbca4231"
+ hash: "46ece14e3a61aefcb28b3c888ac7ea59"
}
Frame {
msec: 1920
- hash: "4c0a528609872cf65180d336bbca4231"
+ hash: "46ece14e3a61aefcb28b3c888ac7ea59"
}
Key {
type: 7
@@ -666,23 +666,23 @@ VisualTest {
}
Frame {
msec: 1952
- hash: "4c0a528609872cf65180d336bbca4231"
+ hash: "46ece14e3a61aefcb28b3c888ac7ea59"
}
Frame {
msec: 1968
- hash: "4c0a528609872cf65180d336bbca4231"
+ hash: "46ece14e3a61aefcb28b3c888ac7ea59"
}
Frame {
msec: 1984
- hash: "4c0a528609872cf65180d336bbca4231"
+ hash: "46ece14e3a61aefcb28b3c888ac7ea59"
}
Frame {
msec: 2000
- hash: "4c0a528609872cf65180d336bbca4231"
+ hash: "46ece14e3a61aefcb28b3c888ac7ea59"
}
Frame {
msec: 2016
- hash: "4c0a528609872cf65180d336bbca4231"
+ hash: "46ece14e3a61aefcb28b3c888ac7ea59"
}
Key {
type: 6
@@ -694,11 +694,11 @@ VisualTest {
}
Frame {
msec: 2032
- hash: "03b670f413abfa1811d4020de969b2ea"
+ hash: "ffa55ac51f20c82725cadbb445908fd2"
}
Frame {
msec: 2048
- hash: "03b670f413abfa1811d4020de969b2ea"
+ hash: "ffa55ac51f20c82725cadbb445908fd2"
}
Key {
type: 7
@@ -710,11 +710,11 @@ VisualTest {
}
Frame {
msec: 2064
- hash: "03b670f413abfa1811d4020de969b2ea"
+ hash: "ffa55ac51f20c82725cadbb445908fd2"
}
Frame {
msec: 2080
- hash: "03b670f413abfa1811d4020de969b2ea"
+ hash: "ffa55ac51f20c82725cadbb445908fd2"
}
Key {
type: 6
@@ -726,19 +726,19 @@ VisualTest {
}
Frame {
msec: 2096
- hash: "6d478c62fa5bb37f0178e94914473174"
+ hash: "e9e2edb9176cb57506a3f130fca15d1e"
}
Frame {
msec: 2112
- hash: "6d478c62fa5bb37f0178e94914473174"
+ hash: "e9e2edb9176cb57506a3f130fca15d1e"
}
Frame {
msec: 2128
- hash: "6d478c62fa5bb37f0178e94914473174"
+ hash: "e9e2edb9176cb57506a3f130fca15d1e"
}
Frame {
msec: 2144
- hash: "6d478c62fa5bb37f0178e94914473174"
+ hash: "e9e2edb9176cb57506a3f130fca15d1e"
}
Key {
type: 6
@@ -758,19 +758,19 @@ VisualTest {
}
Frame {
msec: 2160
- hash: "2f9803e906ce38a6ade3874bbeb27216"
+ hash: "87c3cf93b47a766d6373ecaec7239dd4"
}
Frame {
msec: 2176
- hash: "2f9803e906ce38a6ade3874bbeb27216"
+ hash: "87c3cf93b47a766d6373ecaec7239dd4"
}
Frame {
msec: 2192
- hash: "2f9803e906ce38a6ade3874bbeb27216"
+ hash: "87c3cf93b47a766d6373ecaec7239dd4"
}
Frame {
msec: 2208
- hash: "2f9803e906ce38a6ade3874bbeb27216"
+ hash: "87c3cf93b47a766d6373ecaec7239dd4"
}
Key {
type: 6
@@ -782,7 +782,7 @@ VisualTest {
}
Frame {
msec: 2224
- hash: "d93582b0c7de46d5ff1c9959c158bfe7"
+ hash: "1fb4aa190807d169d1ceaff7d9fa92ad"
}
Key {
type: 7
@@ -794,23 +794,23 @@ VisualTest {
}
Frame {
msec: 2240
- hash: "d93582b0c7de46d5ff1c9959c158bfe7"
+ hash: "1fb4aa190807d169d1ceaff7d9fa92ad"
}
Frame {
msec: 2256
- hash: "d93582b0c7de46d5ff1c9959c158bfe7"
+ hash: "1fb4aa190807d169d1ceaff7d9fa92ad"
}
Frame {
msec: 2272
- hash: "d93582b0c7de46d5ff1c9959c158bfe7"
+ hash: "1fb4aa190807d169d1ceaff7d9fa92ad"
}
Frame {
msec: 2288
- hash: "d93582b0c7de46d5ff1c9959c158bfe7"
+ hash: "1fb4aa190807d169d1ceaff7d9fa92ad"
}
Frame {
msec: 2304
- hash: "d93582b0c7de46d5ff1c9959c158bfe7"
+ hash: "1fb4aa190807d169d1ceaff7d9fa92ad"
}
Key {
type: 7
@@ -822,11 +822,11 @@ VisualTest {
}
Frame {
msec: 2320
- hash: "d93582b0c7de46d5ff1c9959c158bfe7"
+ hash: "1fb4aa190807d169d1ceaff7d9fa92ad"
}
Frame {
msec: 2336
- hash: "d93582b0c7de46d5ff1c9959c158bfe7"
+ hash: "1fb4aa190807d169d1ceaff7d9fa92ad"
}
Key {
type: 6
@@ -838,27 +838,27 @@ VisualTest {
}
Frame {
msec: 2352
- hash: "8accfa30ddc59803d8f9d2f60dd6a891"
+ hash: "e9cd789b114befb4637fcff39d4413b0"
}
Frame {
msec: 2368
- hash: "8accfa30ddc59803d8f9d2f60dd6a891"
+ hash: "e9cd789b114befb4637fcff39d4413b0"
}
Frame {
msec: 2384
- hash: "8accfa30ddc59803d8f9d2f60dd6a891"
+ hash: "e9cd789b114befb4637fcff39d4413b0"
}
Frame {
msec: 2400
- hash: "8accfa30ddc59803d8f9d2f60dd6a891"
+ hash: "e9cd789b114befb4637fcff39d4413b0"
}
Frame {
msec: 2416
- hash: "8accfa30ddc59803d8f9d2f60dd6a891"
+ hash: "e9cd789b114befb4637fcff39d4413b0"
}
Frame {
msec: 2432
- hash: "8accfa30ddc59803d8f9d2f60dd6a891"
+ hash: "e9cd789b114befb4637fcff39d4413b0"
}
Key {
type: 7
@@ -870,19 +870,19 @@ VisualTest {
}
Frame {
msec: 2448
- hash: "8accfa30ddc59803d8f9d2f60dd6a891"
+ hash: "e9cd789b114befb4637fcff39d4413b0"
}
Frame {
msec: 2464
- hash: "8accfa30ddc59803d8f9d2f60dd6a891"
+ hash: "e9cd789b114befb4637fcff39d4413b0"
}
Frame {
msec: 2480
- hash: "8accfa30ddc59803d8f9d2f60dd6a891"
+ hash: "e9cd789b114befb4637fcff39d4413b0"
}
Frame {
msec: 2496
- hash: "8accfa30ddc59803d8f9d2f60dd6a891"
+ hash: "e9cd789b114befb4637fcff39d4413b0"
}
Key {
type: 6
@@ -894,15 +894,15 @@ VisualTest {
}
Frame {
msec: 2512
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2528
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2544
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Key {
type: 7
@@ -914,87 +914,87 @@ VisualTest {
}
Frame {
msec: 2560
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2576
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2592
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2608
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2624
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2640
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2656
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2672
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2688
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2704
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2720
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2736
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2752
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2768
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2784
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2800
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2816
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2832
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2848
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2864
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2880
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2896
@@ -1002,42 +1002,42 @@ VisualTest {
}
Frame {
msec: 2912
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2928
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2944
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2960
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2976
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 2992
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 3008
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 3024
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 3040
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
Frame {
msec: 3056
- hash: "a444ce402f5dc0d892f66a88b8252301"
+ hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb"
}
}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/hAlign.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/hAlign.0.png
index a12db0a..4c04a1b 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/hAlign.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/hAlign.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/hAlign.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/hAlign.qml
index acc646c..74ee95f 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/hAlign.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/hAlign.qml
@@ -10,98 +10,98 @@ VisualTest {
}
Frame {
msec: 32
- hash: "fe5a0e7ac7ea0796d8cf3e49b513669d"
+ hash: "93758371bdc69b81077989e911f62fb0"
}
Frame {
msec: 48
- hash: "fe5a0e7ac7ea0796d8cf3e49b513669d"
+ hash: "93758371bdc69b81077989e911f62fb0"
}
Frame {
msec: 64
- hash: "fe5a0e7ac7ea0796d8cf3e49b513669d"
+ hash: "93758371bdc69b81077989e911f62fb0"
}
Frame {
msec: 80
- hash: "fe5a0e7ac7ea0796d8cf3e49b513669d"
+ hash: "93758371bdc69b81077989e911f62fb0"
}
Frame {
msec: 96
- hash: "fe5a0e7ac7ea0796d8cf3e49b513669d"
+ hash: "93758371bdc69b81077989e911f62fb0"
}
Frame {
msec: 112
- hash: "fe5a0e7ac7ea0796d8cf3e49b513669d"
+ hash: "93758371bdc69b81077989e911f62fb0"
}
Frame {
msec: 128
- hash: "fe5a0e7ac7ea0796d8cf3e49b513669d"
+ hash: "93758371bdc69b81077989e911f62fb0"
}
Frame {
msec: 144
- hash: "fe5a0e7ac7ea0796d8cf3e49b513669d"
+ hash: "93758371bdc69b81077989e911f62fb0"
}
Frame {
msec: 160
- hash: "fe5a0e7ac7ea0796d8cf3e49b513669d"
+ hash: "93758371bdc69b81077989e911f62fb0"
}
Frame {
msec: 176
- hash: "fe5a0e7ac7ea0796d8cf3e49b513669d"
+ hash: "93758371bdc69b81077989e911f62fb0"
}
Frame {
msec: 192
- hash: "fe5a0e7ac7ea0796d8cf3e49b513669d"
+ hash: "93758371bdc69b81077989e911f62fb0"
}
Frame {
msec: 208
- hash: "fe5a0e7ac7ea0796d8cf3e49b513669d"
+ hash: "93758371bdc69b81077989e911f62fb0"
}
Frame {
msec: 224
- hash: "fe5a0e7ac7ea0796d8cf3e49b513669d"
+ hash: "93758371bdc69b81077989e911f62fb0"
}
Frame {
msec: 240
- hash: "fe5a0e7ac7ea0796d8cf3e49b513669d"
+ hash: "93758371bdc69b81077989e911f62fb0"
}
Frame {
msec: 256
- hash: "fe5a0e7ac7ea0796d8cf3e49b513669d"
+ hash: "93758371bdc69b81077989e911f62fb0"
}
Frame {
msec: 272
- hash: "fe5a0e7ac7ea0796d8cf3e49b513669d"
+ hash: "93758371bdc69b81077989e911f62fb0"
}
Frame {
msec: 288
- hash: "fe5a0e7ac7ea0796d8cf3e49b513669d"
+ hash: "93758371bdc69b81077989e911f62fb0"
}
Frame {
msec: 304
- hash: "fe5a0e7ac7ea0796d8cf3e49b513669d"
+ hash: "93758371bdc69b81077989e911f62fb0"
}
Frame {
msec: 320
- hash: "fe5a0e7ac7ea0796d8cf3e49b513669d"
+ hash: "93758371bdc69b81077989e911f62fb0"
}
Frame {
msec: 336
- hash: "fe5a0e7ac7ea0796d8cf3e49b513669d"
+ hash: "93758371bdc69b81077989e911f62fb0"
}
Frame {
msec: 352
- hash: "fe5a0e7ac7ea0796d8cf3e49b513669d"
+ hash: "93758371bdc69b81077989e911f62fb0"
}
Frame {
msec: 368
- hash: "fe5a0e7ac7ea0796d8cf3e49b513669d"
+ hash: "93758371bdc69b81077989e911f62fb0"
}
Frame {
msec: 384
- hash: "fe5a0e7ac7ea0796d8cf3e49b513669d"
+ hash: "93758371bdc69b81077989e911f62fb0"
}
Frame {
msec: 400
- hash: "fe5a0e7ac7ea0796d8cf3e49b513669d"
+ hash: "93758371bdc69b81077989e911f62fb0"
}
}
diff --git a/tests/auto/declarative/qmlvisual/qmlvisual.pro b/tests/auto/declarative/qmlvisual/qmlvisual.pro
index a424b8f..84df15c 100644
--- a/tests/auto/declarative/qmlvisual/qmlvisual.pro
+++ b/tests/auto/declarative/qmlvisual/qmlvisual.pro
@@ -19,7 +19,6 @@ symbian: {
qdeclarativepathview \
qdeclarativepositioners \
qdeclarativesmoothedanimation \
- qdeclarativespringfollow \
qdeclarativetext \
qdeclarativetextedit \
qdeclarativetextinput \
@@ -27,7 +26,7 @@ symbian: {
repeater \
selftest_noimages \
webview
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += QT_TEST_SOURCE_DIR=\"\\\"$$PWD\\\"\"
}
diff --git a/tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp b/tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp
index 2a15102..3ca6d93 100644
--- a/tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp
+++ b/tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp
@@ -104,10 +104,11 @@ void tst_qmlvisual::visual_data()
QStringList files;
files << findQmlFiles(QDir(QT_TEST_SOURCE_DIR));
if (qgetenv("QMLVISUAL_ALL") != "1") {
-#if defined(Q_WS_X11)
- //Text on X11 varies per distro - and the CI system is currently using something outdated.
- foreach(const QString &str, files.filter(QRegExp(".*text.*")))
- files.removeAll(str);
+#if defined(Q_WS_MAC)
+ //Text on Mac varies per version. Only check the text on 10.6
+ if(QSysInfo::MacintoshVersion != QSysInfo::MV_10_6)
+ foreach(const QString &str, files.filter(QRegExp(".*text.*")))
+ files.removeAll(str);
#endif
#if defined(Q_WS_QWS)
//We don't want QWS test results to mire down the CI system
@@ -132,6 +133,9 @@ void tst_qmlvisual::visual()
QFETCH(QString, testdata);
QStringList arguments;
+#ifdef Q_WS_MAC
+ arguments << "-no-opengl";
+#endif
arguments << "-script" << testdata
<< "-scriptopts" << "play,testimages,testerror,testskip,exitoncomplete,exitonfailure"
<< file;
@@ -141,9 +145,11 @@ void tst_qmlvisual::visual()
QProcess p;
p.start(qmlruntime, arguments);
- QVERIFY(p.waitForFinished());
+ bool finished = p.waitForFinished();
+ QByteArray output = p.readAllStandardOutput() + p.readAllStandardError();
+ QVERIFY2(finished, output.data());
if (p.exitCode() != 0)
- qDebug() << p.readAllStandardError();
+ qDebug() << output;
QCOMPARE(p.exitStatus(), QProcess::NormalExit);
QCOMPARE(p.exitCode(), 0);
}
@@ -233,6 +239,9 @@ void action(Mode mode, const QString &file)
QString testdata = tst_qmlvisual::toTestScript(file,mode);
QStringList arguments;
+#ifdef Q_WS_MAC
+ arguments << "-no-opengl";
+#endif
switch (mode) {
case Test:
// Don't run qml
diff --git a/tests/auto/declarative/symbianlibs.pri b/tests/auto/declarative/symbianlibs.pri
new file mode 100644
index 0000000..4452f67
--- /dev/null
+++ b/tests/auto/declarative/symbianlibs.pri
@@ -0,0 +1,9 @@
+#additional libs required for orientation sensor
+symbian {
+ !contains(S60_VERSION, 3.1):!contains(S60_VERSION, 3.2) {
+ LIBS += -lsensrvclient -lsensrvutil
+ }
+ contains(QT_CONFIG, s60): {
+ LIBS += -lavkon -lcone
+ }
+}
diff --git a/tests/auto/gui.pro b/tests/auto/gui.pro
index c94272c..48b8cec 100644
--- a/tests/auto/gui.pro
+++ b/tests/auto/gui.pro
@@ -146,6 +146,7 @@ SUBDIRS=\
qregion \
qscrollarea \
qscrollbar \
+ qscroller \
qsharedpointer_and_qwidget \
qshortcut \
qsidebar \
diff --git a/tests/auto/guiapplauncher/tst_guiapplauncher.cpp b/tests/auto/guiapplauncher/tst_guiapplauncher.cpp
index 4b3ce18..c223992 100644
--- a/tests/auto/guiapplauncher/tst_guiapplauncher.cpp
+++ b/tests/auto/guiapplauncher/tst_guiapplauncher.cpp
@@ -270,7 +270,7 @@ private:
const QSharedPointer<WindowManager> m_wm;
};
-// Test mask from enviroment as test lib does not allow options.
+// Test mask from environment as test lib does not allow options.
static inline unsigned testMask()
{
unsigned testMask = tst_GuiAppLauncher::TestAll;
diff --git a/tests/auto/lancelot/lancelot.pro b/tests/auto/lancelot/lancelot.pro
index 4535b83..6d6edf8 100644
--- a/tests/auto/lancelot/lancelot.pro
+++ b/tests/auto/lancelot/lancelot.pro
@@ -7,9 +7,6 @@ SOURCES += tst_lancelot.cpp \
HEADERS += $$QT_SOURCE_TREE/tests/arthur/common/paintcommands.h
RESOURCES += $$QT_SOURCE_TREE/tests/arthur/common/images.qrc
-include($$QT_SOURCE_TREE/tests/arthur/common/baselineprotocol.pri)
-win32|symbian*:MKSPEC=$$replace(QMAKESPEC, \\\\, /)
-else:MKSPEC=$$QMAKESPEC
-DEFINES += QMAKESPEC=\\\"$$MKSPEC\\\"
+include($$QT_SOURCE_TREE/tests/arthur/common/qbaselinetest.pri)
!symbian:!wince*:DEFINES += SRCDIR=\\\"$$PWD\\\"
diff --git a/tests/auto/lancelot/tst_lancelot.cpp b/tests/auto/lancelot/tst_lancelot.cpp
index 7c6fe66..4bde927 100644
--- a/tests/auto/lancelot/tst_lancelot.cpp
+++ b/tests/auto/lancelot/tst_lancelot.cpp
@@ -66,10 +66,15 @@ public:
static bool simfail;
private:
- ImageItem render(const ImageItem &item);
+ enum GraphicsEngine {
+ Raster = 0,
+ OpenGL = 1
+ };
+
+ bool setupTestSuite(const QStringList& blacklist);
+ void runTestSuite(GraphicsEngine engine, QImage::Format format);
+ ImageItem render(const ImageItem &item, GraphicsEngine engine, QImage::Format format);
void paint(QPaintDevice *device, const QStringList &script, const QString &filePath);
- void runTestSuite();
- bool setupTestSuite(ImageItem::GraphicsEngine engine, QImage::Format format, const QStringList& blacklist);
BaselineProtocol proto;
ImageItemList baseList;
@@ -108,7 +113,7 @@ void tst_Lancelot::initTestCase()
#if defined(Q_OS_SOMEPLATFORM)
QSKIP("This test is not supported on this platform.", SkipAll);
#endif
- if (!proto.connect(&dryRunMode))
+ if (!proto.connect(QLatin1String("tst_Lancelot"), &dryRunMode))
QSKIP(qPrintable(proto.errorMessage()), SkipAll);
QDir qpsDir(scriptsDir);
@@ -125,8 +130,8 @@ void tst_Lancelot::initTestCase()
file.open(QFile::ReadOnly);
QByteArray cont = file.readAll();
scripts.insert(fileName, QString::fromLatin1(cont).split(QLatin1Char('\n'), QString::SkipEmptyParts));
- it->scriptName = fileName;
- it->scriptChecksum = qChecksum(cont.constData(), cont.size());
+ it->itemName = fileName;
+ it->itemChecksum = qChecksum(cont.constData(), cont.size());
it++;
}
}
@@ -135,42 +140,42 @@ void tst_Lancelot::initTestCase()
void tst_Lancelot::testRasterARGB32PM_data()
{
QStringList localBlacklist;
- if (!setupTestSuite(ImageItem::Raster, QImage::Format_ARGB32_Premultiplied, localBlacklist))
+ if (!setupTestSuite(localBlacklist))
QSKIP("Communication with baseline image server failed.", SkipAll);
}
void tst_Lancelot::testRasterARGB32PM()
{
- runTestSuite();
+ runTestSuite(Raster, QImage::Format_ARGB32_Premultiplied);
}
void tst_Lancelot::testRasterRGB32_data()
{
QStringList localBlacklist;
- if (!setupTestSuite(ImageItem::Raster, QImage::Format_RGB32, localBlacklist))
+ if (!setupTestSuite(localBlacklist))
QSKIP("Communication with baseline image server failed.", SkipAll);
}
void tst_Lancelot::testRasterRGB32()
{
- runTestSuite();
+ runTestSuite(Raster, QImage::Format_RGB32);
}
void tst_Lancelot::testRasterRGB16_data()
{
QStringList localBlacklist;
- if (!setupTestSuite(ImageItem::Raster, QImage::Format_RGB16, localBlacklist))
+ if (!setupTestSuite(localBlacklist))
QSKIP("Communication with baseline image server failed.", SkipAll);
}
void tst_Lancelot::testRasterRGB16()
{
- runTestSuite();
+ runTestSuite(Raster, QImage::Format_RGB16);
}
@@ -178,7 +183,7 @@ void tst_Lancelot::testRasterRGB16()
void tst_Lancelot::testOpenGL_data()
{
QStringList localBlacklist = QStringList() << QLatin1String("rasterops.qps");
- if (!setupTestSuite(ImageItem::OpenGL, QImage::Format_RGB32, localBlacklist))
+ if (!setupTestSuite(localBlacklist))
QSKIP("Communication with baseline image server failed.", SkipAll);
}
@@ -197,45 +202,39 @@ void tst_Lancelot::testOpenGL()
ok = true;
}
if (ok)
- runTestSuite();
+ runTestSuite(OpenGL, QImage::Format_RGB32);
else
QSKIP("System under test does not meet preconditions for GL testing. Skipping.", SkipAll);
}
#endif
-bool tst_Lancelot::setupTestSuite(ImageItem::GraphicsEngine engine, QImage::Format format, const QStringList& blacklist)
+bool tst_Lancelot::setupTestSuite(const QStringList& blacklist)
{
QTest::addColumn<ImageItem>("baseline");
ImageItemList itemList(baseList);
-
- for(ImageItemList::iterator it = itemList.begin(); it != itemList.end(); it++) {
- it->engine = engine;
- it->renderFormat = format;
- }
-
- if (!proto.requestBaselineChecksums(&itemList)) {
+ if (!proto.requestBaselineChecksums(QTest::currentTestFunction(), &itemList)) {
QWARN(qPrintable(proto.errorMessage()));
return false;
}
foreach(const ImageItem& item, itemList) {
- if (!blacklist.contains(item.scriptName))
- QTest::newRow(item.scriptName.toLatin1()) << item;
+ if (!blacklist.contains(item.itemName))
+ QTest::newRow(item.itemName.toLatin1()) << item;
}
return true;
}
-void tst_Lancelot::runTestSuite()
+void tst_Lancelot::runTestSuite(GraphicsEngine engine, QImage::Format format)
{
QFETCH(ImageItem, baseline);
if (baseline.status == ImageItem::IgnoreItem)
QSKIP("Blacklisted by baseline server.", SkipSingle);
- ImageItem rendered = render(baseline);
+ ImageItem rendered = render(baseline, engine, format);
if (rendered.image.isNull()) { // Assume an error in the test environment, not Qt
QWARN("Error: Failed to render image.");
QSKIP("Aborted due to errors.", SkipSingle);
@@ -253,26 +252,26 @@ void tst_Lancelot::runTestSuite()
if (dryRunMode)
qDebug() << "Dryrun mode, ignoring detected mismatch." << serverMsg;
else
- QFAIL("Rendered image differs from baseline.\n" + serverMsg);
+ QFAIL("Rendered image differs from baseline. Report:\n " + serverMsg);
}
}
-ImageItem tst_Lancelot::render(const ImageItem &item)
+ImageItem tst_Lancelot::render(const ImageItem &item, GraphicsEngine engine, QImage::Format format)
{
ImageItem res = item;
res.imageChecksums.clear();
res.image = QImage();
- QString filePath = scriptsDir + item.scriptName;
- QStringList script = scripts.value(item.scriptName);
+ QString filePath = scriptsDir + item.itemName;
+ QStringList script = scripts.value(item.itemName);
- if (item.engine == ImageItem::Raster) {
- QImage img(800, 800, item.renderFormat);
+ if (engine == Raster) {
+ QImage img(800, 800, format);
paint(&img, script, QFileInfo(filePath).absoluteFilePath()); // eh yuck (filePath stuff)
res.image = img;
res.imageChecksums.append(ImageItem::computeChecksum(img));
#ifndef QT_NO_OPENGL
- } else if (item.engine == ImageItem::OpenGL) {
+ } else if (engine == OpenGL) {
QGLWidget glWidget;
if (glWidget.isValid()) {
glWidget.makeCurrent();
@@ -281,7 +280,7 @@ ImageItem tst_Lancelot::render(const ImageItem &item)
fboFormat.setAttachment(QGLFramebufferObject::CombinedDepthStencil);
QGLFramebufferObject fbo(800, 800, fboFormat);
paint(&fbo, script, QFileInfo(filePath).absoluteFilePath()); // eh yuck (filePath stuff)
- res.image = fbo.toImage().convertToFormat(item.renderFormat);
+ res.image = fbo.toImage().convertToFormat(format);
res.imageChecksums.append(ImageItem::computeChecksum(res.image));
}
#endif
diff --git a/tests/auto/macnativeevents/tst_macnativeevents.cpp b/tests/auto/macnativeevents/tst_macnativeevents.cpp
index 742267f..dce768e 100644
--- a/tests/auto/macnativeevents/tst_macnativeevents.cpp
+++ b/tests/auto/macnativeevents/tst_macnativeevents.cpp
@@ -488,7 +488,7 @@ void tst_MacNativeEvents::testModifierCtrlWithDontSwapCtrlAndMeta()
{
// On Mac, we switch the Command and Control modifier by default, so that Command
// means Meta, and Control means Command. Lets check that the flag to swith off
- // this behaviour works. While working on this test I realised that we actually
+ // this behaviour works. While working on this test I realized that we actually
// don't (and never have) respected this flag for raw key events. Only for
// menus, through QKeySequence. I don't want to change this behaviour now, at
// least not until someone complains. So I choose to let the test just stop
diff --git a/tests/auto/networkselftest/networkselftest.pro b/tests/auto/networkselftest/networkselftest.pro
index b7c70a1..98e981c 100644
--- a/tests/auto/networkselftest/networkselftest.pro
+++ b/tests/auto/networkselftest/networkselftest.pro
@@ -6,12 +6,12 @@ QT = core network
wince*: {
addFiles.files = rfc3252.txt
addFiles.path = .
- DEPLOYMENT = addFiles
+ DEPLOYMENT += addFiles
DEFINES += SRCDIR=\\\"\\\"
} else:symbian {
addFiles.files = rfc3252.txt
addFiles.path = .
- DEPLOYMENT = addFiles
+ DEPLOYMENT += addFiles
} else:vxworks*: {
DEFINES += SRCDIR=\\\"\\\"
} else {
diff --git a/tests/auto/networkselftest/tst_networkselftest.cpp b/tests/auto/networkselftest/tst_networkselftest.cpp
index ecbc08c..9486671 100644
--- a/tests/auto/networkselftest/tst_networkselftest.cpp
+++ b/tests/auto/networkselftest/tst_networkselftest.cpp
@@ -345,7 +345,7 @@ QHostAddress tst_NetworkSelfTest::serverIpAddress()
// need resolving
QHostInfo resolved = QHostInfo::fromName(QtNetworkSettings::serverName());
if(resolved.error() != QHostInfo::NoError ||
- !resolved.addresses().isEmpty()) {
+ resolved.addresses().isEmpty()) {
qWarning("QHostInfo::fromName failed (%d).", resolved.error());
return QHostAddress(QHostAddress::Null);
}
diff --git a/tests/auto/other.pro b/tests/auto/other.pro
index d1a7a86..512cd25 100644
--- a/tests/auto/other.pro
+++ b/tests/auto/other.pro
@@ -4,6 +4,7 @@
TEMPLATE=subdirs
SUBDIRS=\
# exceptionsafety_objects \ shouldn't enable it
+# baselineexample \ Just an example demonstrating qbaselinetest usage
lancelot \
qaccessibility \
qalgorithms \
diff --git a/tests/auto/qabstractfileengine/qabstractfileengine.pro b/tests/auto/qabstractfileengine/qabstractfileengine.pro
new file mode 100644
index 0000000..870473a
--- /dev/null
+++ b/tests/auto/qabstractfileengine/qabstractfileengine.pro
@@ -0,0 +1,6 @@
+load(qttest_p4)
+QT = core
+
+SOURCES = tst_qabstractfileengine.cpp
+RESOURCES += qabstractfileengine.qrc
+
diff --git a/tests/auto/qabstractfileengine/qabstractfileengine.qrc b/tests/auto/qabstractfileengine/qabstractfileengine.qrc
new file mode 100644
index 0000000..5401b08
--- /dev/null
+++ b/tests/auto/qabstractfileengine/qabstractfileengine.qrc
@@ -0,0 +1,5 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource prefix="/tst_qabstractfileengine/">
+ <file>resources/</file>
+</qresource>
+</RCC>
diff --git a/tests/auto/qabstractfileengine/resources/file.txt b/tests/auto/qabstractfileengine/resources/file.txt
new file mode 100644
index 0000000..8a03e0e
--- /dev/null
+++ b/tests/auto/qabstractfileengine/resources/file.txt
@@ -0,0 +1 @@
+This is a simple text file.
diff --git a/tests/auto/qabstractfileengine/tst_qabstractfileengine.cpp b/tests/auto/qabstractfileengine/tst_qabstractfileengine.cpp
new file mode 100644
index 0000000..5952252
--- /dev/null
+++ b/tests/auto/qabstractfileengine/tst_qabstractfileengine.cpp
@@ -0,0 +1,765 @@
+/****************************************************************************
+**
+** 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 FOO 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 <QtCore/QAbstractFileEngine>
+#include <QtCore/QFSFileEngine>
+
+#include <QtCore/QMutex>
+#include <QtCore/QMutexLocker>
+#include <QtCore/QSharedPointer>
+#include <QtCore/QScopedPointer>
+#include <QtCore/QHash>
+
+#include <QtTest/QTest>
+
+#include <QtCore/QDebug>
+
+class tst_QAbstractFileEngine
+ : public QObject
+{
+ Q_OBJECT
+public slots:
+ void cleanupTestCase();
+
+private slots:
+ void customHandler();
+
+ void fileIO_data();
+ void fileIO();
+
+private:
+ QStringList filesForRemoval;
+};
+
+class ReferenceFileEngine
+ : public QAbstractFileEngine
+{
+public:
+ ReferenceFileEngine(const QString &fileName)
+ : fileName_(fileName)
+ , position_(-1)
+ , openForRead_(false)
+ , openForWrite_(false)
+ {
+ }
+
+ bool open(QIODevice::OpenMode openMode)
+ {
+ Q_ASSERT(!openForRead_);
+ Q_ASSERT(!openForWrite_);
+
+ openFile_ = resolveFile(openMode & QIODevice::WriteOnly);
+ if (!openFile_)
+ return false;
+
+ position_ = 0;
+ if (openMode & QIODevice::ReadOnly)
+ openForRead_ = true;
+
+ if (openMode & QIODevice::WriteOnly) {
+ openForWrite_ = true;
+
+ QMutexLocker lock(&openFile_->mutex);
+ if (openMode & QIODevice::Truncate
+ || !(openForRead_ || openMode & QIODevice::Append))
+ openFile_->content.clear();
+
+ if (openMode & QIODevice::Append)
+ position_ = openFile_->content.size();
+ }
+
+ return true;
+ }
+
+ bool close()
+ {
+ openFile_.clear();
+
+ openForRead_ = false;
+ openForWrite_ = false;
+ position_ = -1;
+
+ return true;
+ }
+
+ qint64 size() const
+ {
+ QSharedPointer<File> file = resolveFile(false);
+ if (!file)
+ return 0;
+
+ QMutexLocker lock(&file->mutex);
+ return file->content.size();
+ }
+
+ qint64 pos() const
+ {
+ Q_ASSERT(openForRead_ || openForWrite_);
+ return position_;
+ }
+
+ bool seek(qint64 pos)
+ {
+ Q_ASSERT(openForRead_ || openForWrite_);
+
+ if (pos >= 0) {
+ position_ = pos;
+ return true;
+ }
+
+ return false;
+ }
+
+ bool flush()
+ {
+ Q_ASSERT(openForRead_ || openForWrite_);
+ return true;
+ }
+
+ bool remove()
+ {
+ QMutexLocker lock(&fileSystemMutex);
+ int count = fileSystem.remove(fileName_);
+
+ return (count == 1);
+ }
+
+ bool copy(const QString &newName)
+ {
+ QMutexLocker lock(&fileSystemMutex);
+ if (!fileSystem.contains(fileName_)
+ || fileSystem.contains(newName))
+ return false;
+
+ fileSystem.insert(newName, fileSystem.value(fileName_));
+ return true;
+ }
+
+ bool rename(const QString &newName)
+ {
+ QMutexLocker lock(&fileSystemMutex);
+ if (!fileSystem.contains(fileName_)
+ || fileSystem.contains(newName))
+ return false;
+
+ fileSystem.insert(newName, fileSystem.take(fileName_));
+ return true;
+ }
+
+ // bool link(const QString &newName)
+ // {
+ // Q_UNUSED(newName)
+ // return false;
+ // }
+
+ // bool mkdir(const QString &dirName, bool createParentDirectories) const
+ // {
+ // Q_UNUSED(dirName)
+ // Q_UNUSED(createParentDirectories)
+
+ // return false;
+ // }
+
+ // bool rmdir(const QString &dirName, bool recurseParentDirectories) const
+ // {
+ // Q_UNUSED(dirName)
+ // Q_UNUSED(recurseParentDirectories)
+
+ // return false;
+ // }
+
+ bool setSize(qint64 size)
+ {
+ if (size < 0)
+ return false;
+
+ QSharedPointer<File> file = resolveFile(false);
+ if (!file)
+ return false;
+
+ QMutexLocker lock(&file->mutex);
+ file->content.resize(size);
+
+ if (openForRead_ || openForWrite_)
+ if (position_ > size)
+ position_ = size;
+
+ return (file->content.size() == size);
+ }
+
+ FileFlags fileFlags(FileFlags type) const
+ {
+ QSharedPointer<File> file = resolveFile(false);
+ if (file) {
+ QMutexLocker lock(&file->mutex);
+ return (file->fileFlags & type);
+ }
+
+ return FileFlags();
+ }
+
+ // bool setPermissions(uint perms)
+ // {
+ // Q_UNUSED(perms)
+
+ // return false;
+ // }
+
+ QString fileName(FileName file) const
+ {
+ switch (file) {
+ case DefaultName:
+ return QLatin1String("DefaultName");
+ case BaseName:
+ return QLatin1String("BaseName");
+ case PathName:
+ return QLatin1String("PathName");
+ case AbsoluteName:
+ return QLatin1String("AbsoluteName");
+ case AbsolutePathName:
+ return QLatin1String("AbsolutePathName");
+ case LinkName:
+ return QLatin1String("LinkName");
+ case CanonicalName:
+ return QLatin1String("CanonicalName");
+ case CanonicalPathName:
+ return QLatin1String("CanonicalPathName");
+ case BundleName:
+ return QLatin1String("BundleName");
+
+ default:
+ break;
+ }
+
+ return QString();
+ }
+
+ uint ownerId(FileOwner owner) const
+ {
+ QSharedPointer<File> file = resolveFile(false);
+ if (file) {
+ switch (owner) {
+ case OwnerUser:
+ {
+ QMutexLocker lock(&file->mutex);
+ return file->userId;
+ }
+ case OwnerGroup:
+ {
+ QMutexLocker lock(&file->mutex);
+ return file->groupId;
+ }
+ }
+ }
+
+ return -2;
+ }
+
+ QString owner(FileOwner owner) const
+ {
+ QSharedPointer<File> file = resolveFile(false);
+ if (file) {
+ uint ownerId;
+ switch (owner) {
+ case OwnerUser:
+ {
+ QMutexLocker lock(&file->mutex);
+ ownerId = file->userId;
+ }
+
+ {
+ QMutexLocker lock(&fileSystemMutex);
+ return fileSystemUsers.value(ownerId);
+ }
+
+ case OwnerGroup:
+ {
+ QMutexLocker lock(&file->mutex);
+ ownerId = file->groupId;
+ }
+
+ {
+ QMutexLocker lock(&fileSystemMutex);
+ return fileSystemGroups.value(ownerId);
+ }
+ }
+ }
+
+ return QString();
+ }
+
+ QDateTime fileTime(FileTime time) const
+ {
+ QSharedPointer<File> file = resolveFile(false);
+ if (file) {
+ QMutexLocker lock(&file->mutex);
+ switch (time) {
+ case CreationTime:
+ return file->creation;
+ case ModificationTime:
+ return file->modification;
+ case AccessTime:
+ return file->access;
+ }
+ }
+
+ return QDateTime();
+ }
+
+ void setFileName(const QString &file)
+ {
+ Q_ASSERT(!openForRead_);
+ Q_ASSERT(!openForWrite_);
+
+ fileName_ = file;
+ }
+
+ // typedef QAbstractFileEngineIterator Iterator;
+ // Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames)
+ // {
+ // Q_UNUSED(filters)
+ // Q_UNUSED(filterNames)
+
+ // return 0;
+ // }
+
+ // Iterator *endEntryList()
+ // {
+ // return 0;
+ // }
+
+ qint64 read(char *data, qint64 maxLen)
+ {
+ Q_ASSERT(openForRead_);
+
+ Q_ASSERT(!openFile_.isNull());
+ QMutexLocker lock(&openFile_->mutex);
+ qint64 readSize = qMin(openFile_->content.size() - position_, maxLen);
+ if (readSize < 0)
+ return -1;
+
+ qMemCopy(data, openFile_->content.constData() + position_, readSize);
+ position_ += readSize;
+
+ return readSize;
+ }
+
+ qint64 write(const char *data, qint64 length)
+ {
+ Q_ASSERT(openForWrite_);
+
+ if (length < 0)
+ return -1;
+
+ Q_ASSERT(!openFile_.isNull());
+ QMutexLocker lock(&openFile_->mutex);
+ if (openFile_->content.size() == position_)
+ openFile_->content.append(data, length);
+ else {
+ if (position_ + length > openFile_->content.size())
+ openFile_->content.resize(position_ + length);
+ openFile_->content.replace(position_, length, data, length);
+ }
+
+ qint64 writeSize = qMin(length, openFile_->content.size() - position_);
+ position_ += writeSize;
+
+ return writeSize;
+ }
+
+protected:
+ // void setError(QFile::FileError error, const QString &str);
+
+ struct File
+ {
+ File()
+ : userId(0)
+ , groupId(0)
+ , fileFlags(
+ ReadOwnerPerm | WriteOwnerPerm | ExeOwnerPerm
+ | ReadUserPerm | WriteUserPerm | ExeUserPerm
+ | ReadGroupPerm | WriteGroupPerm | ExeGroupPerm
+ | ReadOtherPerm | WriteOtherPerm | ExeOtherPerm
+ | FileType | ExistsFlag)
+ {
+ }
+
+ QMutex mutex;
+
+ uint userId, groupId;
+ QAbstractFileEngine::FileFlags fileFlags;
+ QDateTime creation, modification, access;
+
+ QByteArray content;
+ };
+
+ QSharedPointer<File> resolveFile(bool create) const
+ {
+ if (openForRead_ || openForWrite_) {
+ Q_ASSERT(openFile_);
+ return openFile_;
+ }
+
+ QMutexLocker lock(&fileSystemMutex);
+ if (create) {
+ QSharedPointer<File> &p = fileSystem[fileName_];
+ if (p.isNull())
+ p = QSharedPointer<File>(new File);
+ return p;
+ }
+
+ return fileSystem.value(fileName_);
+ }
+
+ static QMutex fileSystemMutex;
+ static QHash<uint, QString> fileSystemUsers, fileSystemGroups;
+ static QHash<QString, QSharedPointer<File> > fileSystem;
+
+private:
+ QString fileName_;
+ qint64 position_;
+ bool openForRead_;
+ bool openForWrite_;
+
+ mutable QSharedPointer<File> openFile_;
+};
+
+QMutex ReferenceFileEngine::fileSystemMutex;
+QHash<uint, QString> ReferenceFileEngine::fileSystemUsers, ReferenceFileEngine::fileSystemGroups;
+QHash<QString, QSharedPointer<ReferenceFileEngine::File> > ReferenceFileEngine::fileSystem;
+
+class FileEngineHandler
+ : QAbstractFileEngineHandler
+{
+ QAbstractFileEngine *create(const QString &fileName) const
+ {
+ if (fileName.startsWith("QFSFileEngine:"))
+ return new QFSFileEngine(fileName.mid(14));
+ if (fileName.startsWith("reference-file-engine:"))
+ return new ReferenceFileEngine(fileName.mid(22));
+ if (fileName.startsWith("resource:"))
+ return QAbstractFileEngine::create(QLatin1String(":/tst_qabstractfileengine/resources/") + fileName.mid(9));
+ return 0;
+ }
+};
+
+void tst_QAbstractFileEngine::cleanupTestCase()
+{
+ bool failed = false;
+
+ FileEngineHandler handler;
+ Q_FOREACH(QString file, filesForRemoval)
+ if (!QFile::remove(file)
+ || QFile::exists(file)) {
+ failed = true;
+ qDebug() << "Couldn't remove file:" << file;
+ }
+
+ QVERIFY(!failed);
+}
+
+void tst_QAbstractFileEngine::customHandler()
+{
+ QScopedPointer<QAbstractFileEngine> file;
+ {
+ file.reset(QAbstractFileEngine::create("resource:file.txt"));
+
+ QVERIFY(file);
+ }
+
+ {
+ FileEngineHandler handler;
+
+ QFile file("resource:file.txt");
+ QVERIFY(file.exists());
+ }
+
+ {
+ QFile file("resource:file.txt");
+ QVERIFY(!file.exists());
+ }
+}
+
+void tst_QAbstractFileEngine::fileIO_data()
+{
+ QTest::addColumn<QString>("fileName");
+ QTest::addColumn<QByteArray>("readContent");
+ QTest::addColumn<QByteArray>("writeContent");
+ QTest::addColumn<bool>("fileExists");
+
+ QString resourceTxtFile(":/tst_qabstractfileengine/resources/file.txt");
+ QByteArray readContent("This is a simple text file.\n");
+ QByteArray writeContent("This contains two lines of text.\n");
+
+ QTest::newRow("resource") << resourceTxtFile << readContent << QByteArray() << true;
+ QTest::newRow("native") << "native-file.txt" << readContent << writeContent << false;
+ QTest::newRow("Forced QFSFileEngine") << "QFSFileEngine:QFSFileEngine-file.txt" << readContent << writeContent << false;
+ QTest::newRow("Custom FE") << "reference-file-engine:file.txt" << readContent << writeContent << false;
+
+ QTest::newRow("Forced QFSFileEngine (native)") << "QFSFileEngine:native-file.txt" << readContent << writeContent << true;
+ QTest::newRow("native (Forced QFSFileEngine)") << "QFSFileEngine-file.txt" << readContent << writeContent << true;
+ QTest::newRow("Custom FE (2)") << "reference-file-engine:file.txt" << readContent << writeContent << true;
+}
+
+void tst_QAbstractFileEngine::fileIO()
+{
+ QFETCH(QString, fileName);
+ QFETCH(QByteArray, readContent);
+ QFETCH(QByteArray, writeContent);
+ QFETCH(bool, fileExists);
+
+ FileEngineHandler handler;
+
+
+ {
+ QFile file(fileName);
+ QCOMPARE(file.exists(), fileExists);
+
+ if (!fileExists) {
+ QVERIFY(file.open(QIODevice::WriteOnly | QIODevice::Unbuffered));
+ filesForRemoval.append(fileName);
+
+ QCOMPARE(file.write(readContent), qint64(readContent.size()));
+ }
+ }
+
+ //
+ // File content is: readContent
+ //
+
+ qint64 fileSize = readContent.size();
+ {
+ // Reading
+ QFile file(fileName);
+
+ QVERIFY(!file.isOpen());
+ QVERIFY(file.open(QIODevice::ReadOnly | QIODevice::Unbuffered));
+
+ QVERIFY(file.isOpen());
+ QCOMPARE(file.size(), fileSize);
+ QCOMPARE(file.pos(), qint64(0));
+
+ QCOMPARE(file.size(), fileSize);
+ QCOMPARE(file.readAll(), readContent);
+ QCOMPARE(file.pos(), fileSize);
+
+ file.close();
+ QVERIFY(!file.isOpen());
+ QCOMPARE(file.size(), fileSize);
+ }
+
+ if (writeContent.isEmpty())
+ return;
+
+ {
+ // Writing / appending
+ QFile file(fileName);
+
+ QVERIFY(!file.isOpen());
+ QVERIFY(file.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Unbuffered));
+
+ QVERIFY(file.isOpen());
+ QCOMPARE(file.size(), fileSize);
+ QCOMPARE(file.pos(), fileSize);
+
+ QCOMPARE(file.write(writeContent), qint64(writeContent.size()));
+
+ fileSize += writeContent.size();
+ QCOMPARE(file.pos(), fileSize);
+ QCOMPARE(file.size(), fileSize);
+
+ file.close();
+ QVERIFY(!file.isOpen());
+ QCOMPARE(file.size(), fileSize);
+ }
+
+ //
+ // File content is: readContent + writeContent
+ //
+
+ {
+ // Reading and Writing
+ QFile file(fileName);
+
+ QVERIFY(!file.isOpen());
+ QVERIFY(file.open(QIODevice::ReadWrite | QIODevice::Unbuffered));
+
+ QVERIFY(file.isOpen());
+ QCOMPARE(file.size(), fileSize);
+ QCOMPARE(file.pos(), qint64(0));
+
+ QCOMPARE(file.readAll(), readContent + writeContent);
+ QCOMPARE(file.pos(), fileSize);
+ QCOMPARE(file.size(), fileSize);
+
+ QVERIFY(file.seek(writeContent.size()));
+ QCOMPARE(file.pos(), qint64(writeContent.size()));
+ QCOMPARE(file.size(), fileSize);
+
+ QCOMPARE(file.write(readContent), qint64(readContent.size()));
+ QCOMPARE(file.pos(), fileSize);
+ QCOMPARE(file.size(), fileSize);
+
+ QVERIFY(file.seek(0));
+ QCOMPARE(file.pos(), qint64(0));
+ QCOMPARE(file.size(), fileSize);
+
+ QCOMPARE(file.write(writeContent), qint64(writeContent.size()));
+ QCOMPARE(file.pos(), qint64(writeContent.size()));
+ QCOMPARE(file.size(), fileSize);
+
+ QVERIFY(file.seek(0));
+ QCOMPARE(file.read(writeContent.size()), writeContent);
+ QCOMPARE(file.pos(), qint64(writeContent.size()));
+ QCOMPARE(file.size(), fileSize);
+
+ QCOMPARE(file.readAll(), readContent);
+ QCOMPARE(file.pos(), fileSize);
+ QCOMPARE(file.size(), fileSize);
+
+ file.close();
+ QVERIFY(!file.isOpen());
+ QCOMPARE(file.size(), fileSize);
+ }
+
+ //
+ // File content is: writeContent + readContent
+ //
+
+ {
+ // Writing
+ QFile file(fileName);
+
+ QVERIFY(!file.isOpen());
+ QVERIFY(file.open(QIODevice::ReadWrite | QIODevice::Unbuffered));
+
+ QVERIFY(file.isOpen());
+ QCOMPARE(file.size(), fileSize);
+ QCOMPARE(file.pos(), qint64(0));
+
+ QCOMPARE(file.write(writeContent), qint64(writeContent.size()));
+ QCOMPARE(file.pos(), qint64(writeContent.size()));
+ QCOMPARE(file.size(), fileSize);
+
+ QVERIFY(file.resize(writeContent.size()));
+ QCOMPARE(file.size(), qint64(writeContent.size()));
+
+ file.close();
+ QVERIFY(!file.isOpen());
+ QCOMPARE(file.size(), qint64(writeContent.size()));
+
+ QVERIFY(file.resize(fileSize));
+ QCOMPARE(file.size(), fileSize);
+ }
+
+ //
+ // File content is: writeContent + <undefined>
+ // File size is : (readContent + writeContent).size()
+ //
+
+ {
+ // Writing / extending
+ QFile file(fileName);
+
+ QVERIFY(!file.isOpen());
+ QVERIFY(file.open(QIODevice::ReadWrite | QIODevice::Unbuffered));
+
+ QVERIFY(file.isOpen());
+ QCOMPARE(file.size(), fileSize);
+ QCOMPARE(file.pos(), qint64(0));
+
+ QVERIFY(file.seek(1024));
+ QCOMPARE(file.pos(), qint64(1024));
+ QCOMPARE(file.size(), fileSize);
+
+ fileSize = 1024 + writeContent.size();
+ QCOMPARE(file.write(writeContent), qint64(writeContent.size()));
+ QCOMPARE(file.pos(), fileSize);
+ QCOMPARE(file.size(), fileSize);
+
+ QVERIFY(file.seek(1028));
+ QCOMPARE(file.pos(), qint64(1028));
+ QCOMPARE(file.size(), fileSize);
+
+ fileSize = 1028 + writeContent.size();
+ QCOMPARE(file.write(writeContent), qint64(writeContent.size()));
+ QCOMPARE(file.pos(), fileSize);
+ QCOMPARE(file.size(), fileSize);
+
+ file.close();
+ QVERIFY(!file.isOpen());
+ QCOMPARE(file.size(), fileSize);
+ }
+
+ //
+ // File content is: writeContent + <undefined> + writeContent
+ // File size is : 1024 + writeContent.size()
+ //
+
+ {
+ // Writing / truncating
+ QFile file(fileName);
+
+ QVERIFY(!file.isOpen());
+ QVERIFY(file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Unbuffered));
+
+ QVERIFY(file.isOpen());
+ QCOMPARE(file.size(), qint64(0));
+ QCOMPARE(file.pos(), qint64(0));
+
+ fileSize = readContent.size();
+ QCOMPARE(file.write(readContent), fileSize);
+ QCOMPARE(file.pos(), fileSize);
+ QCOMPARE(file.size(), fileSize);
+
+ file.close();
+ QVERIFY(!file.isOpen());
+ QCOMPARE(file.size(), fileSize);
+ }
+
+ //
+ // File content is: readContent
+ //
+}
+
+QTEST_APPLESS_MAIN(tst_QAbstractFileEngine)
+#include "tst_qabstractfileengine.moc"
+
diff --git a/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp b/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp
index 04bd432..fc8a126 100644
--- a/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp
+++ b/tests/auto/qabstractnetworkcache/tst_qabstractnetworkcache.cpp
@@ -58,20 +58,29 @@ public:
private slots:
void expires_data();
void expires();
+ void expiresSynchronous_data();
+ void expiresSynchronous();
void lastModified_data();
void lastModified();
+ void lastModifiedSynchronous_data();
+ void lastModifiedSynchronous();
void etag_data();
void etag();
+ void etagSynchronous_data();
+ void etagSynchronous();
void cacheControl_data();
void cacheControl();
+ void cacheControlSynchronous_data();
+ void cacheControlSynchronous();
void deleteCache();
private:
void check();
+ void checkSynchronous();
};
class NetworkDiskCache : public QNetworkDiskCache
@@ -142,6 +151,16 @@ void tst_QAbstractNetworkCache::expires()
check();
}
+void tst_QAbstractNetworkCache::expiresSynchronous_data()
+{
+ expires_data();
+}
+
+void tst_QAbstractNetworkCache::expiresSynchronous()
+{
+ checkSynchronous();
+}
+
void tst_QAbstractNetworkCache::lastModified_data()
{
QTest::addColumn<QNetworkRequest::CacheLoadControl>("cacheLoadControl");
@@ -164,6 +183,16 @@ void tst_QAbstractNetworkCache::lastModified()
check();
}
+void tst_QAbstractNetworkCache::lastModifiedSynchronous_data()
+{
+ tst_QAbstractNetworkCache::lastModified_data();
+}
+
+void tst_QAbstractNetworkCache::lastModifiedSynchronous()
+{
+ checkSynchronous();
+}
+
void tst_QAbstractNetworkCache::etag_data()
{
QTest::addColumn<QNetworkRequest::CacheLoadControl>("cacheLoadControl");
@@ -186,6 +215,16 @@ void tst_QAbstractNetworkCache::etag()
check();
}
+void tst_QAbstractNetworkCache::etagSynchronous_data()
+{
+ tst_QAbstractNetworkCache::etag_data();
+}
+
+void tst_QAbstractNetworkCache::etagSynchronous()
+{
+ checkSynchronous();
+}
+
void tst_QAbstractNetworkCache::cacheControl_data()
{
QTest::addColumn<QNetworkRequest::CacheLoadControl>("cacheLoadControl");
@@ -217,6 +256,16 @@ void tst_QAbstractNetworkCache::cacheControl()
check();
}
+void tst_QAbstractNetworkCache::cacheControlSynchronous_data()
+{
+ tst_QAbstractNetworkCache::cacheControl_data();
+}
+
+void tst_QAbstractNetworkCache::cacheControlSynchronous()
+{
+ checkSynchronous();
+}
+
void tst_QAbstractNetworkCache::check()
{
QFETCH(QNetworkRequest::CacheLoadControl, cacheLoadControl);
@@ -250,8 +299,6 @@ void tst_QAbstractNetworkCache::check()
QCOMPARE(reply2->error(), QNetworkReply::ContentNotFoundError);
QCOMPARE(secondData, QByteArray());
} else {
- if (reply2->error() != QNetworkReply::NoError)
- qDebug() << reply2->errorString();
QCOMPARE(reply2->error(), QNetworkReply::NoError);
QCOMPARE(QString(secondData), QString(goodData));
QCOMPARE(secondData, goodData);
@@ -263,16 +310,60 @@ void tst_QAbstractNetworkCache::check()
QList<QByteArray> rawHeaderList2 = reply2->rawHeaderList();
qSort(rawHeaderList);
qSort(rawHeaderList2);
+ }
+ QCOMPARE(diskCache->gotData, fetchFromCache);
+}
- // headers can change
- for (int i = 0; i < rawHeaderList.count(); ++i) {
- //qDebug() << i << rawHeaderList.value(i) << reply->rawHeader(rawHeaderList.value(i));
- //qDebug() << i << rawHeaderList2.value(i) << reply2->rawHeader(rawHeaderList2.value(i));
- //QCOMPARE(QString(rawHeaderList.value(i)), QString(rawHeaderList2.value(i)));
- //QCOMPARE(QString(reply->rawHeader(rawHeaderList.value(i))), QString(reply2->rawHeader(rawHeaderList2.value(i))));
- }
- //QCOMPARE(rawHeaderList.count(), rawHeaderList2.count());
+void tst_QAbstractNetworkCache::checkSynchronous()
+{
+ QSKIP("not working yet, see QTBUG-15221", SkipAll);
+ QFETCH(QNetworkRequest::CacheLoadControl, cacheLoadControl);
+ QFETCH(QString, url);
+ QFETCH(bool, fetchFromCache);
+
+ QNetworkAccessManager manager;
+ NetworkDiskCache *diskCache = new NetworkDiskCache(&manager);
+ manager.setCache(diskCache);
+ QCOMPARE(diskCache->gotData, false);
+
+ QUrl realUrl = url.contains("://") ? url : TESTFILE + url;
+ QNetworkRequest request(realUrl);
+
+ request.setAttribute(
+ static_cast<QNetworkRequest::Attribute>(QNetworkRequest::DownloadBufferAttribute + 1),
+ true);
+
+ // prime the cache
+ QNetworkReply *reply = manager.get(request);
+ QVERIFY(reply->isFinished()); // synchronous
+ QCOMPARE(diskCache->gotData, false);
+ QByteArray goodData = reply->readAll();
+
+ request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, cacheLoadControl);
+
+ // should be in the cache now
+ QNetworkReply *reply2 = manager.get(request);
+ QVERIFY(reply2->isFinished()); // synchronous
+
+ QByteArray secondData = reply2->readAll();
+ if (!fetchFromCache && cacheLoadControl == QNetworkRequest::AlwaysCache) {
+ QCOMPARE(reply2->error(), QNetworkReply::ContentNotFoundError);
+ QCOMPARE(secondData, QByteArray());
+ } else {
+ if (reply2->error() != QNetworkReply::NoError)
+ qDebug() << reply2->errorString();
+ QCOMPARE(reply2->error(), QNetworkReply::NoError);
+ QCOMPARE(QString(secondData), QString(goodData));
+ QCOMPARE(secondData, goodData);
+ QCOMPARE(reply2->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200);
+ }
+
+ if (fetchFromCache) {
+ QList<QByteArray> rawHeaderList = reply->rawHeaderList();
+ QList<QByteArray> rawHeaderList2 = reply2->rawHeaderList();
+ qSort(rawHeaderList);
+ qSort(rawHeaderList2);
}
QCOMPARE(diskCache->gotData, fetchFromCache);
}
diff --git a/tests/auto/qapplication/modal/main.cpp b/tests/auto/qapplication/modal/main.cpp
index f9d8fb4..3eaaa0d 100644
--- a/tests/auto/qapplication/modal/main.cpp
+++ b/tests/auto/qapplication/modal/main.cpp
@@ -47,6 +47,7 @@
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
+ QApplication::setAttribute(Qt::AA_NativeWindows); //QTBUG-15774
base *b = new base();
return app.exec();
}
diff --git a/tests/auto/qapplication/test/test.pro b/tests/auto/qapplication/test/test.pro
index 4c8e9b0..73799f4 100644
--- a/tests/auto/qapplication/test/test.pro
+++ b/tests/auto/qapplication/test/test.pro
@@ -8,7 +8,7 @@ wince* {
additional.path = desktopsettingsaware
someTest.files = test.pro
someTest.path = test
- DEPLOYMENT = additional deploy someTest
+ DEPLOYMENT += additional deploy someTest
}
symbian: {
@@ -17,7 +17,7 @@ symbian: {
someTest.files = test.pro
someTest.path = test
windowIcon.files = ../heart.svg
- DEPLOYMENT = additional deploy someTest windowIcon
+ DEPLOYMENT += additional deploy someTest windowIcon
LIBS += -lcone -lavkon
}
diff --git a/tests/auto/qaudioinput/qaudioinput.pro b/tests/auto/qaudioinput/qaudioinput.pro
index 922c3e4..aac7fb4 100644
--- a/tests/auto/qaudioinput/qaudioinput.pro
+++ b/tests/auto/qaudioinput/qaudioinput.pro
@@ -6,7 +6,7 @@ QT = core multimedia
wince* {
deploy.files += 4.wav
- DEPLOYMENT = deploy
+ DEPLOYMENT += deploy
DEFINES += SRCDIR=\\\"\\\"
QT += gui
} else {
diff --git a/tests/auto/qaudiooutput/qaudiooutput.pro b/tests/auto/qaudiooutput/qaudiooutput.pro
index 0bd0151..f4d840a 100644
--- a/tests/auto/qaudiooutput/qaudiooutput.pro
+++ b/tests/auto/qaudiooutput/qaudiooutput.pro
@@ -6,7 +6,7 @@ QT = core multimedia
wince*|symbian: {
deploy.files += 4.wav
- DEPLOYMENT = deploy
+ DEPLOYMENT += deploy
!symbian {
DEFINES += SRCDIR=\\\"\\\"
QT += gui
diff --git a/tests/auto/qchar/qchar.pro b/tests/auto/qchar/qchar.pro
index 9fcf132..1681220 100644
--- a/tests/auto/qchar/qchar.pro
+++ b/tests/auto/qchar/qchar.pro
@@ -5,7 +5,7 @@ QT = core
wince*|symbian: {
deploy.files += NormalizationTest.txt
-DEPLOYMENT = deploy
+DEPLOYMENT += deploy
}
symbian: {
diff --git a/tests/auto/qclipboard/test/test.pro b/tests/auto/qclipboard/test/test.pro
index 6e61b31..12c6b6c 100644
--- a/tests/auto/qclipboard/test/test.pro
+++ b/tests/auto/qclipboard/test/test.pro
@@ -28,5 +28,5 @@ wince*|symbian: {
reg_resource.path = $$REG_RESOURCE_IMPORT_DIR
}
- DEPLOYMENT = copier paster rsc reg_resource
+ DEPLOYMENT += copier paster rsc reg_resource
} \ No newline at end of file
diff --git a/tests/auto/qcompleter/tst_qcompleter.cpp b/tests/auto/qcompleter/tst_qcompleter.cpp
index 650c328..62e64be 100644
--- a/tests/auto/qcompleter/tst_qcompleter.cpp
+++ b/tests/auto/qcompleter/tst_qcompleter.cpp
@@ -49,6 +49,7 @@
#include <QPointer>
#include "../../shared/util.h"
+#include "../../shared/filesystem.h"
//TESTED_CLASS=
//TESTED_FILES=
@@ -1455,24 +1456,16 @@ void tst_QCompleter::task247560_keyboardNavigation()
void tst_QCompleter::QTBUG_14292_filesystem()
{
- QDir tmpDir = QDir::temp();
+ FileSystem fs;
+ QDir tmpDir = QDir::currentPath();
+
qsrand(QTime::currentTime().msec());
QString d = "tst_QCompleter_" + QString::number(qrand());
- QVERIFY(tmpDir.mkdir(d));
-
-#if 0
- struct Cleanup {
- QString dir;
- ~Cleanup() {
- qDebug() << dir <<
- QFile::remove(dir); }
- } cleanup;
- cleanup.dir = tmpDir.absolutePath()+"/" +d;
-#endif
+ QVERIFY(fs.createDirectory(tmpDir.filePath(d)));
QVERIFY(tmpDir.cd(d));
- QVERIFY(tmpDir.mkdir("hello"));
- QVERIFY(tmpDir.mkdir("holla"));
+ QVERIFY(fs.createDirectory(tmpDir.filePath("hello")));
+ QVERIFY(fs.createDirectory(tmpDir.filePath("holla")));
QLineEdit edit;
QCompleter comp;
@@ -1500,12 +1493,12 @@ void tst_QCompleter::QTBUG_14292_filesystem()
QCOMPARE(comp.popup()->model()->rowCount(), 1);
QTest::keyClick(&edit, 'r');
QTRY_VERIFY(!comp.popup()->isVisible());
- QVERIFY(tmpDir.mkdir("hero"));
+ QVERIFY(fs.createDirectory(tmpDir.filePath("hero")));
QTRY_VERIFY(comp.popup()->isVisible());
QCOMPARE(comp.popup()->model()->rowCount(), 1);
QTest::keyClick(comp.popup(), Qt::Key_Escape);
QTRY_VERIFY(!comp.popup()->isVisible());
- QVERIFY(tmpDir.mkdir("nothingThere"));
+ QVERIFY(fs.createDirectory(tmpDir.filePath("nothingThere")));
//there is no reason creating a file should open a popup, it did in Qt 4.7.0
QTest::qWait(60);
QVERIFY(!comp.popup()->isVisible());
@@ -1522,7 +1515,7 @@ void tst_QCompleter::QTBUG_14292_filesystem()
QTest::qWaitForWindowShown(&w);
QTRY_VERIFY(!edit.hasFocus() && !comp.popup()->hasFocus());
- QVERIFY(tmpDir.mkdir("hemo"));
+ QVERIFY(fs.createDirectory(tmpDir.filePath("hemo")));
//there is no reason creating a file should open a popup, it did in Qt 4.7.0
QTest::qWait(60);
QVERIFY(!comp.popup()->isVisible());
diff --git a/tests/auto/qdatastream/tst_qdatastream.cpp b/tests/auto/qdatastream/tst_qdatastream.cpp
index c03bc71..898fb84 100644
--- a/tests/auto/qdatastream/tst_qdatastream.cpp
+++ b/tests/auto/qdatastream/tst_qdatastream.cpp
@@ -168,6 +168,8 @@ private slots:
void stream_atEnd_data();
void stream_atEnd();
+ void stream_writeError();
+
void stream_QByteArray2();
void setVersion_data();
@@ -2345,6 +2347,55 @@ void tst_QDataStream::stream_atEnd()
}
}
+class FakeBuffer : public QBuffer
+{
+protected:
+ qint64 writeData(const char *c, qint64 i) { return m_lock ? 0 : QBuffer::writeData(c, i); }
+public:
+ FakeBuffer(bool locked = false) : m_lock(locked) {}
+ void setLocked(bool locked) { m_lock = locked; }
+private:
+ bool m_lock;
+};
+
+#define TEST_WRITE_ERROR(op) \
+ { \
+ FakeBuffer fb(false); \
+ QVERIFY(fb.open(QBuffer::ReadWrite)); \
+ QDataStream fs(&fb); \
+ fs.writeRawData("hello", 5); \
+ /* first write some initial content */ \
+ QCOMPARE(fs.status(), QDataStream::Ok); \
+ QCOMPARE(fb.data(), QByteArray("hello")); \
+ /* then test that writing can cause an error */ \
+ fb.setLocked(true); \
+ fs op; \
+ QCOMPARE(fs.status(), QDataStream::WriteFailed); \
+ QCOMPARE(fb.data(), QByteArray("hello")); \
+ /* finally test that writing after an error doesn't change the stream any more */ \
+ fb.setLocked(false); \
+ fs op; \
+ QCOMPARE(fs.status(), QDataStream::WriteFailed); \
+ QCOMPARE(fb.data(), QByteArray("hello")); \
+ }
+
+void tst_QDataStream::stream_writeError()
+{
+ TEST_WRITE_ERROR(<< true)
+ TEST_WRITE_ERROR(<< (qint8)1)
+ TEST_WRITE_ERROR(<< (quint8)1)
+ TEST_WRITE_ERROR(<< (qint16)1)
+ TEST_WRITE_ERROR(<< (quint16)1)
+ TEST_WRITE_ERROR(<< (qint32)1)
+ TEST_WRITE_ERROR(<< (quint32)1)
+ TEST_WRITE_ERROR(<< (qint64)1)
+ TEST_WRITE_ERROR(<< (quint64)1)
+ TEST_WRITE_ERROR(<< "hello")
+ TEST_WRITE_ERROR(<< (float)1.0)
+ TEST_WRITE_ERROR(<< (double)1.0)
+ TEST_WRITE_ERROR(.writeRawData("test", 4))
+}
+
void tst_QDataStream::stream_QByteArray2()
{
QByteArray ba;
diff --git a/tests/auto/qdbusconnection/tst_qdbusconnection.cpp b/tests/auto/qdbusconnection/tst_qdbusconnection.cpp
index 599abbd..4494d6f 100644
--- a/tests/auto/qdbusconnection/tst_qdbusconnection.cpp
+++ b/tests/auto/qdbusconnection/tst_qdbusconnection.cpp
@@ -106,6 +106,8 @@ private slots:
void slotsWithLessParameters();
void nestedCallWithCallback();
+ void serviceRegistrationRaceCondition();
+
public:
QString serviceName() const { return "com.trolltech.Qt.Autotests.QDBusConnection"; }
bool callMethod(const QDBusConnection &conn, const QString &path);
@@ -647,6 +649,73 @@ void tst_QDBusConnection::nestedCallWithCallback()
QCOMPARE(signalsReceived, 1);
}
+class RaceConditionSignalWaiter : public QObject
+{
+ Q_OBJECT
+public:
+ int count;
+ RaceConditionSignalWaiter() : count (0) {}
+ virtual ~RaceConditionSignalWaiter() {}
+
+public slots:
+ void countUp() { ++count; emit done(); }
+signals:
+ void done();
+};
+
+void tst_QDBusConnection::serviceRegistrationRaceCondition()
+{
+ // There was a race condition in the updating of list of name owners in
+ // QtDBus. When the user connects to a signal coming from a given
+ // service, we must listen for NameOwnerChanged signals relevant to that
+ // name and update when the owner changes. However, it's possible that we
+ // receive in one chunk from the server both the NameOwnerChanged signal
+ // about the service and the signal we're interested in. Since QtDBus
+ // posts events in order to handle the incoming signals, the update
+ // happens too late.
+
+ const QString connectionName = "testConnectionName";
+ const QString serviceName = "org.example.SecondaryName";
+
+ QDBusConnection session = QDBusConnection::sessionBus();
+ QVERIFY(!session.interface()->isServiceRegistered(serviceName));
+
+ // connect to the signal:
+ RaceConditionSignalWaiter recv;
+ session.connect(serviceName, "/", "com.trolltech.TestCase", "oneSignal", &recv, SLOT(countUp()));
+
+ // create a secondary connection and register a name
+ QDBusConnection connection = QDBusConnection::connectToBus(QDBusConnection::SessionBus, connectionName);
+ QDBusConnection::disconnectFromBus(connectionName); // disconnection happens when "connection" goes out of scope
+ QVERIFY(connection.isConnected());
+ QVERIFY(connection.registerService(serviceName));
+
+ // send a signal
+ QDBusMessage msg = QDBusMessage::createSignal("/", "com.trolltech.TestCase", "oneSignal");
+ connection.send(msg);
+
+ // make a blocking call just to be sure that the buffer was flushed
+ msg = QDBusMessage::createMethodCall("org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus",
+ "NameHasOwner");
+ msg << connectionName;
+ connection.call(msg); // ignore result
+
+ // Now here's the race condition (more info on task QTBUG-15651):
+ // the bus has most likely queued three signals for us to work on:
+ // 1) NameOwnerChanged for the connection we created above
+ // 2) NameOwnerChanged for the service we registered above
+ // 3) The "oneSignal" signal we sent
+ //
+ // We'll most likely receive all three in one go from the server. We must
+ // update the owner of serviceName before we start processing the
+ // "oneSignal" signal.
+
+ QTestEventLoop::instance().connect(&recv, SIGNAL(done()), SLOT(exitLoop()));
+ QTestEventLoop::instance().enterLoop(1);
+ QVERIFY(!QTestEventLoop::instance().timeout());
+ QCOMPARE(recv.count, 1);
+}
+
QString MyObject::path;
QTEST_MAIN(tst_QDBusConnection)
diff --git a/tests/auto/qdir/qdir.pro b/tests/auto/qdir/qdir.pro
index 818f52c..472e646 100644
--- a/tests/auto/qdir/qdir.pro
+++ b/tests/auto/qdir/qdir.pro
@@ -15,8 +15,11 @@ wince* {
TARGET.CAPABILITY += AllFiles
TARGET.UID3 = 0xE0340002
DEFINES += SYMBIAN_SRCDIR_UID=$$lower($$replace(TARGET.UID3,"0x",""))
+ LIBS += -lefsrv
+ INCLUDEPATH += $$MW_LAYER_SYSTEMINCLUDE
} else {
contains(QT_CONFIG, qt3support):QT += qt3support
DEFINES += SRCDIR=\\\"$$PWD/\\\"
}
+CONFIG += parallel_test
diff --git a/tests/auto/qdir/tst_qdir.cpp b/tests/auto/qdir/tst_qdir.cpp
index 9678868..44d1fb6 100644
--- a/tests/auto/qdir/tst_qdir.cpp
+++ b/tests/auto/qdir/tst_qdir.cpp
@@ -57,11 +57,13 @@
#include "../../shared/filesystem.h"
#if defined(Q_OS_SYMBIAN)
+# include <f32file.h>
# define STRINGIFY(x) #x
# define TOSTRING(x) STRINGIFY(x)
# define SRCDIR "C:/Private/" TOSTRING(SYMBIAN_SRCDIR_UID) "/"
#elif defined(Q_OS_UNIX)
# include <unistd.h>
+# include <sys/stat.h>
#endif
#if defined(Q_OS_VXWORKS)
@@ -69,7 +71,7 @@
#endif
#if defined(Q_OS_SYMBIAN)
-// Open C in Symbian doesn't support symbolic links to directories
+#define Q_NO_SYMLINKS
#define Q_NO_SYMLINKS_TO_DIRS
#endif
@@ -103,6 +105,8 @@ private slots:
void mkdir_data();
void mkdir();
+ void makedirReturnCode();
+
void rmdir_data();
void rmdir();
@@ -175,10 +179,31 @@ private slots:
void detachingOperations();
-#if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
+ void testCaching();
+
void isRoot_data();
void isRoot();
+
+#ifndef QT_NO_REGEXP
+ void match_data();
+ void match();
#endif
+
+ void drives();
+
+ void arrayOperator();
+
+#ifdef QT3_SUPPORT
+ void setNameFilter();
+#endif
+
+ void equalityOperator_data();
+ void equalityOperator();
+
+ void isRelative_data();
+ void isRelative();
+
+ void isReadable();
};
// Testing get/set functions
@@ -293,6 +318,17 @@ void tst_QDir::mkdir()
QVERIFY(fi.exists() && fi.isDir());
}
+void tst_QDir::makedirReturnCode()
+{
+ QString dirName = QString::fromLatin1("makedirReturnCode");
+ QDir::current().rmdir(dirName); // cleanup a previous run.
+ QDir dir(dirName);
+ QVERIFY(!dir.exists());
+ QVERIFY(QDir::current().mkdir(dirName));
+ QVERIFY(!QDir::current().mkdir(dirName)); // calling mkdir on an existing dir will fail.
+ QVERIFY(QDir::current().mkpath(dirName)); // calling mkpath on an existing dir will pass
+}
+
void tst_QDir::rmdir_data()
{
QTest::addColumn<QString>("path");
@@ -597,6 +633,7 @@ void tst_QDir::entryList()
expected.removeAll("..");
#endif
+#ifndef Q_NO_SYMLINKS
#if defined(Q_OS_WIN)
// ### Sadly, this is a platform difference right now.
QFile::link(SRCDIR "entryList/file", SRCDIR "entrylist/linktofile.lnk");
@@ -651,6 +688,7 @@ void tst_QDir::entryList()
QFile::link("directory", SRCDIR "entrylist/linktodirectory.lnk");
QFile::link("nothing", SRCDIR "entrylist/brokenlink.lnk");
#endif
+#endif //Q_NO_SYMLINKS
#ifdef Q_WS_MAC
if (qstrcmp(QTest::currentDataTag(), "unprintablenames") == 0)
@@ -813,11 +851,19 @@ void tst_QDir::canonicalPath_data()
#endif
QTest::newRow("nonexistant") << "testd" << QString();
+ QTest::newRow("rootPath") << QDir::rootPath() << QDir::rootPath();
+
+#ifdef Q_OS_MAC
+ // On Mac OS X 10.5 and earlier, canonicalPath depends on cleanPath which
+ // is itself very broken and fundamentally wrong on "/./" which, this would
+ // exercise
+ if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_6)
+#endif
+ QTest::newRow("rootPath + ./") << QDir::rootPath().append("./") << QDir::rootPath();
+
+ QTest::newRow("rootPath + ../.. ") << QDir::rootPath().append("../..") << QDir::rootPath();
#if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
- QTest::newRow("drive:/") << QDir::rootPath() << QDir::rootPath();
QTest::newRow("drive:\\") << QDir::toNativeSeparators(QDir::rootPath()) << QDir::rootPath();
- QTest::newRow("drive:/./") << QDir::rootPath().append("./") << QDir::rootPath();
- QTest::newRow("drive:/../.. ") << QDir::rootPath().append("../..") << QDir::rootPath();
QTest::newRow("drive:\\.\\") << QDir::toNativeSeparators(QDir::rootPath().append("./")) << QDir::rootPath();
QTest::newRow("drive:\\..\\..") << QDir::toNativeSeparators(QDir::rootPath().append("../..")) << QDir::rootPath();
QTest::newRow("drive:") << QDir().canonicalPath().left(2) << QDir().canonicalPath();
@@ -890,7 +936,7 @@ void tst_QDir::current()
if (!path.isEmpty()) {
bool b = QDir::setCurrent(path);
- // If path is non existant, then setCurrent should be false (currentDir is empty in testData)
+ // If path is non existent, then setCurrent should be false (currentDir is empty in testData)
QVERIFY(b == !currentDir.isEmpty());
}
if (!currentDir.isEmpty()) {
@@ -935,6 +981,7 @@ void tst_QDir::cd()
QFETCH(QString, newDir);
QDir d = startDir;
+ bool notUsed = d.exists(); // make sure we cache this before so we can see if 'cd' fails to flush this
QCOMPARE(d.cd(cdDir), successExpected);
if (successExpected)
QCOMPARE(d.absolutePath(), newDir);
@@ -1104,24 +1151,24 @@ void tst_QDir::relativeFilePath_data()
QTest::newRow("14") << "C:/foo/bar" << "/ding/dong" << "../../ding/dong";
QTest::newRow("15") << "C:/foo/bar" << "D:/ding/dong" << "D:/ding/dong";
QTest::newRow("16") << "C:" << "C:/ding/dong" << "ding/dong";
- QTest::newRow("16") << "C:/" << "C:/ding/dong" << "ding/dong";
- QTest::newRow("17") << "C:" << "C:" << "";
- QTest::newRow("18") << "C:/" << "C:" << "";
- QTest::newRow("19") << "C:" << "C:/" << "";
- QTest::newRow("20") << "C:/" << "C:/" << "";
- QTest::newRow("17") << "C:" << "C:file.txt" << "file.txt";
- QTest::newRow("18") << "C:/" << "C:file.txt" << "file.txt";
- QTest::newRow("19") << "C:" << "C:/file.txt" << "file.txt";
- QTest::newRow("20") << "C:/" << "C:/file.txt" << "file.txt";
- QTest::newRow("21") << "C:" << "D:" << "D:";
- QTest::newRow("22") << "C:" << "D:/" << "D:/";
- QTest::newRow("23") << "C:/" << "D:" << "D:";
- QTest::newRow("24") << "C:/" << "D:/" << "D:/";
+ QTest::newRow("17") << "C:/" << "C:/ding/dong" << "ding/dong";
+ QTest::newRow("18") << "C:" << "C:" << "";
+ QTest::newRow("19") << "C:/" << "C:" << "";
+ QTest::newRow("20") << "C:" << "C:/" << "";
+ QTest::newRow("21") << "C:/" << "C:/" << "";
+ QTest::newRow("22") << "C:" << "C:file.txt" << "file.txt";
+ QTest::newRow("23") << "C:/" << "C:file.txt" << "file.txt";
+ QTest::newRow("24") << "C:" << "C:/file.txt" << "file.txt";
+ QTest::newRow("25") << "C:/" << "C:/file.txt" << "file.txt";
+ QTest::newRow("26") << "C:" << "D:" << "D:";
+ QTest::newRow("27") << "C:" << "D:/" << "D:/";
+ QTest::newRow("28") << "C:/" << "D:" << "D:";
+ QTest::newRow("29") << "C:/" << "D:/" << "D:/";
# if !defined(Q_OS_SYMBIAN)
- QTest::newRow("25") << "C:/foo/bar" << "//anotherHost/foo/bar" << "//anotherHost/foo/bar";
- QTest::newRow("26") << "//anotherHost/foo" << "//anotherHost/foo/bar" << "bar";
- QTest::newRow("27") << "//anotherHost/foo" << "bar" << "bar";
- QTest::newRow("28") << "//anotherHost/foo" << "C:/foo/bar" << "C:/foo/bar";
+ QTest::newRow("30") << "C:/foo/bar" << "//anotherHost/foo/bar" << "//anotherHost/foo/bar";
+ QTest::newRow("31") << "//anotherHost/foo" << "//anotherHost/foo/bar" << "bar";
+ QTest::newRow("32") << "//anotherHost/foo" << "bar" << "bar";
+ QTest::newRow("33") << "//anotherHost/foo" << "C:/foo/bar" << "C:/foo/bar";
# endif
#endif
}
@@ -1167,6 +1214,8 @@ void tst_QDir::remove()
QDir dir;
QVERIFY(dir.remove("remove-test"));
QVERIFY(!dir.remove("/remove-test"));
+ QTest::ignoreMessage(QtWarningMsg, "QDir::remove: Empty or null file name");
+ QVERIFY(!dir.remove(""));
}
void tst_QDir::rename()
@@ -1179,10 +1228,18 @@ void tst_QDir::rename()
QVERIFY(dir.rename("rename-test-renamed", "rename-test"));
#if defined(Q_OS_MAC)
QVERIFY(!dir.rename("rename-test", "/etc/rename-test-renamed"));
-#elif !defined(Q_OS_WIN) && !defined(Q_OS_SYMBIAN)
- // on windows/symbian this is possible - maybe make the test a bit better
+#elif defined(Q_OS_SYMBIAN)
+ QVERIFY(!dir.rename("rename-test", "/resource/rename-test-renamed"));
+#elif !defined(Q_OS_WIN)
+ // on windows this is possible - maybe make the test a bit better
QVERIFY(!dir.rename("rename-test", "/rename-test-renamed"));
#endif
+ QTest::ignoreMessage(QtWarningMsg, "QDir::rename: Empty or null file name(s)");
+ QVERIFY(!dir.rename("rename-test", ""));
+ QTest::ignoreMessage(QtWarningMsg, "QDir::rename: Empty or null file name(s)");
+ QVERIFY(!dir.rename("", "rename-test-renamed"));
+ QVERIFY(!dir.rename("some-file-that-does-not-exist", "rename-test-renamed"));
+
QVERIFY(dir.remove("rename-test"));
}
@@ -1256,12 +1313,13 @@ void tst_QDir::dotAndDotDot()
{
#if defined(Q_OS_WINCE) || defined(Q_OS_SYMBIAN)
QSKIP("WinCE and Symbian do not have . nor ..", SkipAll);
-#endif
+#else
QDir dir(QString(SRCDIR "testdir/"));
QStringList entryList = dir.entryList(QDir::Dirs);
QCOMPARE(entryList, QStringList() << QString(".") << QString("..") << QString("dir") << QString("spaces"));
entryList = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
QCOMPARE(entryList, QStringList() << QString("dir") << QString("spaces"));
+#endif
}
#ifdef QT3_SUPPORT
@@ -1416,6 +1474,29 @@ void tst_QDir::searchPaths()
for (int i = 0; i < searchPathPrefixList.count(); ++i) {
QVERIFY(QDir::searchPaths(searchPathPrefixList.at(i)).isEmpty());
}
+
+ for (int i = 0; i < searchPathPrefixList.count(); ++i) {
+ foreach (QString path, searchPathsList.at(i).split(",")) {
+ QDir::addSearchPath(searchPathPrefixList.at(i), path);
+ }
+ }
+ for (int i = 0; i < searchPathPrefixList.count(); ++i) {
+ QVERIFY(QDir::searchPaths(searchPathPrefixList.at(i)) == searchPathsList.at(i).split(","));
+ }
+
+ QCOMPARE(QFile(filename).exists(), exists);
+ QCOMPARE(QFileInfo(filename).exists(), exists);
+
+ if (exists) {
+ QCOMPARE(QFileInfo(filename).absoluteFilePath(), expectedAbsolutePath);
+ }
+
+ for (int i = 0; i < searchPathPrefixList.count(); ++i) {
+ QDir::setSearchPaths(searchPathPrefixList.at(i), QStringList());
+ }
+ for (int i = 0; i < searchPathPrefixList.count(); ++i) {
+ QVERIFY(QDir::searchPaths(searchPathPrefixList.at(i)).isEmpty());
+ }
}
void tst_QDir::entryListWithSearchPaths()
@@ -1660,7 +1741,17 @@ void tst_QDir::detachingOperations()
QCOMPARE(dir1.sorting(), sorting);
}
-#if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
+void tst_QDir::testCaching()
+{
+ QString dirName = QString::fromLatin1("testCaching");
+ QDir::current().rmdir(dirName); // cleanup a previous run.
+ QDir dir(dirName);
+ QVERIFY(!dir.exists());
+ QDir::current().mkdir(dirName);
+ QVERIFY(QDir(dirName).exists()); // dir exists
+ QVERIFY(dir.exists()); // QDir doesn't cache the 'exist' between calls.
+}
+
void tst_QDir::isRoot_data()
{
QTest::addColumn<QString>("path");
@@ -1670,10 +1761,23 @@ void tst_QDir::isRoot_data()
QTest::newRow(QString("rootPath " + test).toLatin1()) << test << true;
test = QDir::rootPath().append("./");
QTest::newRow(QString("./ appended " + test).toLatin1()) << test << false;
+
test = QDir(QDir::rootPath().append("./")).canonicalPath();
- QTest::newRow(QString("canonicalPath " + test).toLatin1()) << test << true;
+#ifdef Q_OS_MAC
+ // On Mac OS X 10.5 and earlier, canonicalPath depends on cleanPath which
+ // is itself very broken and fundamentally wrong on "/./", which this would
+ // exercise
+ if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_6)
+#endif
+ QTest::newRow(QString("canonicalPath " + test).toLatin1()) << test << true;
+
+#if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
test = QDir::rootPath().left(2);
QTest::newRow(QString("drive relative " + test).toLatin1()) << test << false;
+#endif
+
+ QTest::newRow("resources root") << ":/" << true;
+ QTest::newRow("resources nonroot") << ":/entrylist" << false;
}
void tst_QDir::isRoot()
@@ -1684,7 +1788,202 @@ void tst_QDir::isRoot()
QDir dir(path);
QCOMPARE(dir.isRoot(),isRoot);
}
+
+#ifndef QT_NO_REGEXP
+void tst_QDir::match_data()
+{
+ QTest::addColumn<QString>("filter");
+ QTest::addColumn<QString>("filename");
+ QTest::addColumn<bool>("match");
+
+ QTest::newRow("single, matching") << "*.cpp" << "tst_qdir.cpp" << true;
+ QTest::newRow("single, not matching") << "*.cpp" << "tst_qdir.h" << false;
+ QTest::newRow("multi, matching") << "*.cpp;*.h" << "tst_qdir.cpp" << true;
+ QTest::newRow("multi, matching2") << "*.cpp;*.h" << "tst_qdir.h" << true;
+ QTest::newRow("multi, not matching") << "*.cpp;*.h" << "readme.txt" << false;
+}
+
+void tst_QDir::match()
+{
+ QFETCH(QString, filter);
+ QFETCH(QString, filename);
+ QFETCH(bool, match);
+
+ QCOMPARE(QDir::match(filter, filename), match);
+ QCOMPARE(QDir::match(filter.split(QLatin1Char(';')), filename), match);
+}
+#endif
+
+void tst_QDir::drives()
+{
+ QFileInfoList list(QDir::drives());
+#if defined(Q_OS_WIN)
+ QVERIFY(list.count() >= 1); //system
+ QLatin1Char systemdrive('c');
+#elif defined(Q_OS_SYMBIAN)
+ QVERIFY(list.count() >= 2); //system, rom
+ QLatin1Char romdrive('z');
+ QLatin1Char systemdrive('a' + int(RFs::GetSystemDrive()));
+#endif
+#if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
+ QVERIFY(list.count() <= 26);
+ bool foundsystem = false;
+#ifdef Q_OS_SYMBIAN
+ bool foundrom = false;
#endif
+ foreach (QFileInfo fi, list) {
+ QCOMPARE(fi.absolutePath().size(), 3); //"x:/"
+ QCOMPARE(fi.absolutePath().at(1), QChar(QLatin1Char(':')));
+ QCOMPARE(fi.absolutePath().at(2), QChar(QLatin1Char('/')));
+ if (fi.absolutePath().at(0).toLower() == systemdrive)
+ foundsystem = true;
+#ifdef Q_OS_SYMBIAN
+ if (fi.absolutePath().at(0).toLower() == romdrive)
+ foundrom = true;
+#endif
+ }
+ QCOMPARE(foundsystem, true);
+#ifdef Q_OS_SYMBIAN
+ QCOMPARE(foundrom, true);
+#endif
+#else
+ QCOMPARE(list.count(), 1); //root
+ QCOMPARE(list.at(0).absolutePath(), QLatin1String("/"));
+#endif
+}
+
+void tst_QDir::arrayOperator()
+{
+ QDir dir1(SRCDIR "entrylist/");
+ QDir dir2(SRCDIR "entrylist/");
+
+ QStringList entries(dir1.entryList());
+ int i = dir2.count();
+ QCOMPARE(i, entries.count());
+ --i;
+ for (;i>=0;--i) {
+ QCOMPARE(dir2[i], entries.at(i));
+ }
+}
+
+#ifdef QT3_SUPPORT
+void tst_QDir::setNameFilter()
+{
+ QStringList filters;
+ filters << "*.jpg" << "*.png" << "*.gif";
+ QStringList filters2;
+ filters2 << "*.cpp" << "*.h" << "*.c";
+
+ QDir dir(SRCDIR "entrylist/");
+
+ dir.setNameFilter(filters.join(";"));
+ QCOMPARE(filters, dir.nameFilters());
+ QCOMPARE(filters, dir.nameFilter().split(';'));
+
+ dir.setNameFilters(filters2);
+ QCOMPARE(filters2, dir.nameFilter().split(';'));
+
+ dir.setNameFilter(filters.join(" "));
+ QCOMPARE(filters, dir.nameFilters());
+ QCOMPARE(filters, dir.nameFilter().split(' '));
+
+ dir.setNameFilters(filters2);
+ QCOMPARE(filters2, dir.nameFilter().split(' '));
+}
+#endif
+
+void tst_QDir::equalityOperator_data()
+{
+ QTest::addColumn<QString>("leftPath");
+ QTest::addColumn<QString>("leftNameFilters");
+ QTest::addColumn<int>("leftSort");
+ QTest::addColumn<int>("leftFilters");
+ QTest::addColumn<QString>("rightPath");
+ QTest::addColumn<QString>("rightNameFilters");
+ QTest::addColumn<int>("rightSort");
+ QTest::addColumn<int>("rightFilters");
+ QTest::addColumn<bool>("expected");
+
+ QTest::newRow("same") << SRCDIR << "*.cpp" << int(QDir::Name) << int(QDir::Files)
+ << SRCDIR << "*.cpp" << int(QDir::Name) << int(QDir::Files)
+ << true;
+
+ QTest::newRow("relativepaths") << "entrylist/" << "*.cpp" << int(QDir::Name) << int(QDir::Files)
+ << "./entrylist" << "*.cpp" << int(QDir::Name) << int(QDir::Files)
+ << true;
+
+ QTest::newRow("diff-filters") << SRCDIR << "*.cpp" << int(QDir::Name) << int(QDir::Files)
+ << SRCDIR << "*.cpp" << int(QDir::Name) << int(QDir::Dirs)
+ << false;
+
+ QTest::newRow("diff-sort") << SRCDIR << "*.cpp" << int(QDir::Name) << int(QDir::Files)
+ << SRCDIR << "*.cpp" << int(QDir::Time) << int(QDir::Files)
+ << false;
+
+ QTest::newRow("diff-namefilters") << SRCDIR << "*.cpp" << int(QDir::Name) << int(QDir::Files)
+ << SRCDIR << "*.jpg" << int(QDir::Name) << int(QDir::Files)
+ << false;
+}
+
+void tst_QDir::equalityOperator()
+{
+ QFETCH(QString, leftPath);
+ QFETCH(QString, leftNameFilters);
+ QFETCH(int, leftSort);
+ QFETCH(int, leftFilters);
+ QFETCH(QString, rightPath);
+ QFETCH(QString, rightNameFilters);
+ QFETCH(int, rightSort);
+ QFETCH(int, rightFilters);
+ QFETCH(bool, expected);
+
+ QDir dir1(leftPath, leftNameFilters, QDir::SortFlags(leftSort), QDir::Filters(leftFilters));
+ QDir dir2(rightPath, rightNameFilters, QDir::SortFlags(rightSort), QDir::Filters(rightFilters));
+
+ QCOMPARE((dir1 == dir2), expected);
+ QCOMPARE((dir2 == dir1), expected);
+ QCOMPARE((dir1 != dir2), !expected);
+ QCOMPARE((dir2 != dir1), !expected);
+}
+
+void tst_QDir::isRelative_data()
+{
+ QTest::addColumn<QString>("path");
+ QTest::addColumn<bool>("relative");
+
+ QTest::newRow(".") << "./" << true;
+ QTest::newRow("..") << "../" << true;
+ QTest::newRow("content") << "entrylist/" << true;
+ QTest::newRow("current") << QDir::currentPath() << false;
+ QTest::newRow("homepath") << QDir::homePath() << false;
+ QTest::newRow("temppath") << QDir::tempPath() << false;
+ QTest::newRow("rootpath") << QDir::rootPath() << false;
+ foreach (QFileInfo root, QDir::drives()) {
+ QTest::newRow(root.absolutePath().toLocal8Bit()) << root.absolutePath() << false;
+ }
+}
+
+void tst_QDir::isRelative()
+{
+ QFETCH(QString, path);
+ QFETCH(bool, relative);
+
+ QCOMPARE(QDir(path).isRelative(), relative);
+}
+
+void tst_QDir::isReadable()
+{
+ QDir dir;
+
+ QVERIFY(dir.isReadable());
+#if defined (Q_OS_UNIX) && !defined (Q_OS_SYMBIAN)
+ QVERIFY(dir.mkdir("nonreadabledir"));
+ QVERIFY(0 == ::chmod("nonreadabledir", 0));
+ QVERIFY(!QDir("nonreadabledir").isReadable());
+ QVERIFY(0 == ::chmod("nonreadabledir", S_IRUSR | S_IWUSR | S_IXUSR));
+ QVERIFY(dir.rmdir("nonreadabledir"));
+#endif
+}
QTEST_MAIN(tst_QDir)
#include "tst_qdir.moc"
diff --git a/tests/auto/qdiriterator/qdiriterator.pro b/tests/auto/qdiriterator/qdiriterator.pro
index 140b57d..0807a18 100644
--- a/tests/auto/qdiriterator/qdiriterator.pro
+++ b/tests/auto/qdiriterator/qdiriterator.pro
@@ -3,11 +3,6 @@ SOURCES += tst_qdiriterator.cpp
RESOURCES += qdiriterator.qrc
QT = core
-wince*|symbian: {
- addFiles.files = entrylist recursiveDirs foo
- addFiles.path = .
- DEPLOYMENT += addFiles
wince*mips*|wincewm50smart-msvc200*: DEFINES += WINCE_BROKEN_ITERATE=1
-}
CONFIG += parallel_test
diff --git a/tests/auto/qdiriterator/tst_qdiriterator.cpp b/tests/auto/qdiriterator/tst_qdiriterator.cpp
index 1a873b8..3a696b5 100644
--- a/tests/auto/qdiriterator/tst_qdiriterator.cpp
+++ b/tests/auto/qdiriterator/tst_qdiriterator.cpp
@@ -53,10 +53,14 @@
#endif
#if defined(Q_OS_SYMBIAN)
-// Open C in Symbian doesn't support symbolic links to directories
+#define Q_NO_SYMLINKS
#define Q_NO_SYMLINKS_TO_DIRS
#endif
+#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
+#include "../network-settings.h"
+#endif
+
Q_DECLARE_METATYPE(QDirIterator::IteratorFlags)
Q_DECLARE_METATYPE(QDir::Filters)
@@ -118,6 +122,10 @@ private slots:
void longPath();
void task185502_dirorder();
void relativePaths();
+#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
+ void uncPaths_data();
+ void uncPaths();
+#endif
};
tst_QDirIterator::tst_QDirIterator()
@@ -147,6 +155,8 @@ tst_QDirIterator::tst_QDirIterator()
createDirectory("foo/bar");
createFile("foo/bar/readme.txt");
+ createDirectory("empty");
+
#ifndef Q_NO_SYMLINKS
# if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
// ### Sadly, this is a platform difference right now.
@@ -288,6 +298,20 @@ void tst_QDirIterator::iterateRelativeDirectory_data()
#endif
"entrylist/directory/dummy,"
"entrylist/writable").split(',');
+
+ QTest::newRow("empty, default")
+ << QString("empty") << QDirIterator::IteratorFlags(0)
+ << QDir::Filters(QDir::NoFilter) << QStringList("*")
+#if defined(Q_OS_SYMBIAN) || defined(Q_OS_WINCE)
+ << QStringList();
+#else
+ << QString("empty/.,empty/..").split(',');
+#endif
+
+ QTest::newRow("empty, QDir::NoDotAndDotDot")
+ << QString("empty") << QDirIterator::IteratorFlags(0)
+ << QDir::Filters(QDir::NoDotAndDotDot) << QStringList("*")
+ << QStringList();
}
void tst_QDirIterator::iterateRelativeDirectory()
@@ -532,6 +556,28 @@ void tst_QDirIterator::relativePaths()
}
}
+#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
+void tst_QDirIterator::uncPaths_data()
+{
+ QTest::addColumn<QString>("dirName");
+ QTest::newRow("uncserver")
+ <<QString("//" + QtNetworkSettings::winServerName());
+ QTest::newRow("uncserver/testshare")
+ <<QString("//" + QtNetworkSettings::winServerName() + "/testshare");
+ QTest::newRow("uncserver/testshare/tmp")
+ <<QString("//" + QtNetworkSettings::winServerName() + "/testshare/tmp");
+}
+void tst_QDirIterator::uncPaths()
+{
+ QFETCH(QString, dirName);
+ QDirIterator iterator(dirName, QDir::AllEntries|QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
+ while(iterator.hasNext()) {
+ iterator.next();
+ QCOMPARE(iterator.filePath(), QDir::cleanPath(iterator.filePath()));
+ }
+}
+#endif
+
QTEST_MAIN(tst_QDirIterator)
#include "tst_qdiriterator.moc"
diff --git a/tests/auto/qdirmodel/tst_qdirmodel.cpp b/tests/auto/qdirmodel/tst_qdirmodel.cpp
index 41bbd87..e252b82 100644
--- a/tests/auto/qdirmodel/tst_qdirmodel.cpp
+++ b/tests/auto/qdirmodel/tst_qdirmodel.cpp
@@ -583,19 +583,15 @@ void tst_QDirModel::unreadable()
void tst_QDirModel::filePath()
{
+#ifdef Q_OS_SYMBIAN
+ QSKIP("OS doesn't support symbolic links", SkipAll);
+#else
QFile::remove(SRCDIR "test.lnk");
QVERIFY(QFile(SRCDIR "tst_qdirmodel.cpp").link(SRCDIR "test.lnk"));
QDirModel model;
model.setResolveSymlinks(false);
QModelIndex index = model.index(SRCDIR "test.lnk");
QVERIFY(index.isValid());
-#if defined(Q_OS_SYMBIAN)
- // Since model will force lowercase path in Symbian, make case insensitive compare
- // Note: Windows should fail this, too, if test path has any uppercase letters.
- QCOMPARE(model.filePath(index).toLower(), QString(SRCDIR).toLower() + "test.lnk");
- model.setResolveSymlinks(true);
- QCOMPARE(model.filePath(index).toLower(), QString(SRCDIR).toLower() + "tst_qdirmodel.cpp");
-#else
#ifndef Q_OS_WINCE
QString path = SRCDIR;
#else
@@ -604,8 +600,8 @@ void tst_QDirModel::filePath()
QCOMPARE(model.filePath(index), path + QString( "test.lnk"));
model.setResolveSymlinks(true);
QCOMPARE(model.filePath(index), path + QString( "tst_qdirmodel.cpp"));
-#endif
QFile::remove(SRCDIR "test.lnk");
+#endif
}
void tst_QDirModel::task196768_sorting()
@@ -613,11 +609,6 @@ void tst_QDirModel::task196768_sorting()
//this task showed that the persistent model indexes got corrupted when sorting
QString path = SRCDIR;
-#ifdef Q_OS_SYMBIAN
- if(!RProcess().HasCapability(ECapabilityAllFiles))
- QEXPECT_FAIL("", "QTBUG-9746", Continue);
-#endif
-
QDirModel model;
/* QDirModel has a bug if we show the content of the subdirectory inside a hidden directory
@@ -637,6 +628,11 @@ void tst_QDirModel::task196768_sorting()
QCOMPARE(index.data(), index2.data());
view.setSortingEnabled(true);
index2 = model.index(path);
+
+#ifdef Q_OS_SYMBIAN
+ if(!RProcess().HasCapability(ECapabilityAllFiles))
+ QEXPECT_FAIL("", "QTBUG-9746", Continue);
+#endif
QCOMPARE(index.data(), index2.data());
}
diff --git a/tests/auto/qelapsedtimer/tst_qelapsedtimer.cpp b/tests/auto/qelapsedtimer/tst_qelapsedtimer.cpp
index 87df57d..bc61f52 100644
--- a/tests/auto/qelapsedtimer/tst_qelapsedtimer.cpp
+++ b/tests/auto/qelapsedtimer/tst_qelapsedtimer.cpp
@@ -122,11 +122,13 @@ void tst_QElapsedTimer::basics()
quint64 value1 = t1.msecsSinceReference();
qDebug() << value1 << t1;
+ qint64 nsecs = t1.nsecsElapsed();
qint64 elapsed = t1.restart();
QVERIFY(elapsed < minResolution);
+ QVERIFY(nsecs / 1000000 < minResolution);
quint64 value2 = t1.msecsSinceReference();
- qDebug() << value2 << t1 << elapsed;
+ qDebug() << value2 << t1 << elapsed << nsecs;
// in theory, elapsed == value2 - value1
// However, since QElapsedTimer keeps internally the full resolution,
@@ -150,7 +152,10 @@ void tst_QElapsedTimer::elapsed()
// don't check: t1.secsTo(t2)
// QVERIFY(t1 - t2 < 0);
+ QVERIFY(t1.nsecsElapsed() > 0);
QVERIFY(t1.elapsed() > 0);
+ // the number of elapsed nanoseconds and milliseconds should match
+ QVERIFY(t1.nsecsElapsed() - t1.elapsed() * 1000000 < 1000000);
QVERIFY(t1.hasExpired(minResolution));
QVERIFY(!t1.hasExpired(8*minResolution));
QVERIFY(!t2.hasExpired(minResolution));
diff --git a/tests/auto/qfile/largefile/largefile.pro b/tests/auto/qfile/largefile/largefile.pro
index d67cb46..6407cb6 100644
--- a/tests/auto/qfile/largefile/largefile.pro
+++ b/tests/auto/qfile/largefile/largefile.pro
@@ -4,3 +4,5 @@ QT = core
SOURCES += tst_largefile.cpp
wince*: SOURCES += $$QT_SOURCE_TREE/src/corelib/kernel/qfunctions_wince.cpp
+
+CONFIG += parallel_test
diff --git a/tests/auto/qfile/qfile.pro b/tests/auto/qfile/qfile.pro
index 727f660..f41d327 100644
--- a/tests/auto/qfile/qfile.pro
+++ b/tests/auto/qfile/qfile.pro
@@ -7,3 +7,4 @@ wince*|symbian:{
!symbian:SUBDIRS += largefile
+CONFIG += parallel_test
diff --git a/tests/auto/qfile/test/test.pro b/tests/auto/qfile/test/test.pro
index c657e9a..673eacc 100644
--- a/tests/auto/qfile/test/test.pro
+++ b/tests/auto/qfile/test/test.pro
@@ -10,7 +10,7 @@ wince*|symbian {
resour.files += ..\\resources\\file1.ext1
resour.path = resources
- DEPLOYMENT = files resour
+ DEPLOYMENT += files resour
}
wince* {
diff --git a/tests/auto/qfile/tst_qfile.cpp b/tests/auto/qfile/tst_qfile.cpp
index ee799f3..c19079f 100644
--- a/tests/auto/qfile/tst_qfile.cpp
+++ b/tests/auto/qfile/tst_qfile.cpp
@@ -170,6 +170,7 @@ private slots:
void encodeName();
void truncate();
void seekToPos();
+ void seekAfterEndOfFile();
void FILEReadWrite();
void i18nFileName_data();
void i18nFileName();
@@ -210,6 +211,16 @@ private slots:
void openStandardStreams();
+ void resize_data();
+ void resize();
+
+ void objectConstructors();
+#ifdef Q_OS_SYMBIAN
+ void platformSecurity_data();
+ void platformSecurity();
+#endif
+ void caseSensitivity();
+
// --- Task related tests below this line
void task167217();
@@ -394,6 +405,7 @@ void tst_QFile::cleanupTestCase()
QFile::remove("qfile_map_testfile");
QFile::remove("readAllBuffer.txt");
QFile::remove("qt_file.tmp");
+ QFile::remove("File.txt");
}
//------------------------------------------
@@ -402,7 +414,7 @@ void tst_QFile::cleanupTestCase()
// attributes and the contents itself
// will be changed as far as we have a
// proper way to handle files in the
-// testing enviroment.
+// testing environment.
//------------------------------------------
void tst_QFile::exists()
@@ -1108,6 +1120,7 @@ void tst_QFile::permissions()
QFETCH(bool, expected);
QFile f(file);
QCOMPARE(((f.permissions() & perms) == QFile::Permissions(perms)), expected);
+ QCOMPARE(((QFile::permissions(file) & perms) == QFile::Permissions(perms)), expected);
}
void tst_QFile::setPermissions()
@@ -1285,17 +1298,32 @@ static QString getWorkingDirectoryForLink(const QString &linkFileName)
void tst_QFile::link()
{
+#if defined(Q_OS_SYMBIAN)
+ QSKIP("Symbian does not support links", SkipAll);
+#endif
QFile::remove("myLink.lnk");
- QFileInfo info1("tst_qfile.cpp");
- QVERIFY(QFile::link("tst_qfile.cpp", "myLink.lnk"));
+
+ QFileInfo info1(SRCDIR "tst_qfile.cpp");
+ QString referenceTarget = QDir::cleanPath(info1.absoluteFilePath());
+
+ QVERIFY(QFile::link(SRCDIR "tst_qfile.cpp", "myLink.lnk"));
+
QFileInfo info2("myLink.lnk");
QVERIFY(info2.isSymLink());
- QCOMPARE(info2.symLinkTarget(), info1.absoluteFilePath());
+ QCOMPARE(info2.symLinkTarget(), referenceTarget);
+
+ QFile link("myLink.lnk");
+ QVERIFY(link.open(QIODevice::ReadOnly));
+ QCOMPARE(link.symLinkTarget(), referenceTarget);
+ link.close();
+
+ QCOMPARE(QFile::symLinkTarget("myLink.lnk"), referenceTarget);
#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
QString wd = getWorkingDirectoryForLink(info2.absoluteFilePath());
- QCOMPARE(QDir::fromNativeSeparators(wd), info1.absolutePath());
+ QCOMPARE(QDir::fromNativeSeparators(wd), QDir::cleanPath(info1.absolutePath()));
#endif
+
QVERIFY(QFile::remove(info2.absoluteFilePath()));
}
@@ -1324,6 +1352,9 @@ void tst_QFile::linkToDir()
void tst_QFile::absolutePathLinkToRelativePath()
{
+#if defined(Q_OS_SYMBIAN)
+ QSKIP("Symbian does not support links", SkipAll);
+#endif
QFile::remove("myDir/test.txt");
QFile::remove("myDir/myLink.lnk");
QDir dir;
@@ -1346,6 +1377,9 @@ void tst_QFile::absolutePathLinkToRelativePath()
void tst_QFile::readBrokenLink()
{
+#if defined(Q_OS_SYMBIAN)
+ QSKIP("Symbian does not support links", SkipAll);
+#endif
QFile::remove("myLink2.lnk");
QFileInfo info1("file12");
#if defined(Q_OS_SYMBIAN)
@@ -1635,10 +1669,40 @@ void tst_QFile::seekToPos()
}
+void tst_QFile::seekAfterEndOfFile()
+{
+ QLatin1String filename("seekAfterEof.dat");
+ QFile::remove(filename);
+ {
+ QFile file(filename);
+ QVERIFY(file.open(QFile::WriteOnly));
+ file.write("abcd");
+ QCOMPARE(file.size(), qint64(4));
+ file.seek(8);
+ file.write("ijkl");
+ QCOMPARE(file.size(), qint64(12));
+ file.seek(4);
+ file.write("efgh");
+ QCOMPARE(file.size(), qint64(12));
+ file.seek(16);
+ file.write("----");
+ QCOMPARE(file.size(), qint64(20));
+ file.flush();
+ }
+
+ QFile file(filename);
+ QVERIFY(file.open(QFile::ReadOnly));
+ QByteArray contents = file.readAll();
+ QCOMPARE(contents.left(12), QByteArray("abcdefghijkl", 12));
+ //bytes 12-15 are uninitialised so we don't care what they read as.
+ QCOMPARE(contents.mid(16), QByteArray("----", 4));
+ file.close();
+ QFile::remove(filename);
+}
void tst_QFile::FILEReadWrite()
{
- // Tests modifing a file. First creates it then reads in 4 bytes and then overwrites these
+ // Tests modifying a file. First creates it then reads in 4 bytes and then overwrites these
// 4 bytes with new values. At the end check to see the file contains the new values.
QFile::remove("FILEReadWrite.txt");
@@ -2494,10 +2558,11 @@ void tst_QFile::standarderror()
void tst_QFile::handle()
{
-#ifndef Q_OS_WINCE
+ int fd;
+#if !defined(Q_OS_WINCE) && !defined(Q_OS_SYMBIAN)
QFile file(SRCDIR "tst_qfile.cpp");
QVERIFY(file.open(QIODevice::ReadOnly));
- int fd = int(file.handle());
+ fd = int(file.handle());
QVERIFY(fd > 2);
QCOMPARE(int(file.handle()), fd);
char c = '\0';
@@ -2524,6 +2589,7 @@ void tst_QFile::handle()
QCOMPARE(c, '*');
#endif
+ //test round trip of adopted stdio file handle
QFile file2;
FILE *fp = fopen(SRCDIR "tst_qfile.cpp", "r");
file2.open(fp, QIODevice::ReadOnly);
@@ -2531,6 +2597,7 @@ void tst_QFile::handle()
QCOMPARE(int(file2.handle()), int(fileno(fp)));
fclose(fp);
+ //test round trip of adopted posix file handle
#ifdef Q_OS_UNIX
QFile file3;
fd = QT_OPEN(SRCDIR "tst_qfile.cpp", QT_OPEN_RDONLY);
@@ -2542,6 +2609,9 @@ void tst_QFile::handle()
void tst_QFile::nativeHandleLeaks()
{
+#ifdef Q_OS_SYMBIAN
+ QSKIP("test assumptions invalid for symbian", SkipAll);
+#else
int fd1, fd2;
#ifdef Q_OS_WIN
@@ -2583,6 +2653,7 @@ void tst_QFile::nativeHandleLeaks()
#ifdef Q_OS_WIN
QCOMPARE( handle2, handle1 );
#endif
+#endif
}
void tst_QFile::readEof_data()
@@ -2898,6 +2969,7 @@ void tst_QFile::mapOpenMode()
{
QFETCH(int, openMode);
static const qint64 fileSize = 4096;
+
QByteArray pattern(fileSize, 'A');
QString fileName = QDir::currentPath() + '/' + "qfile_map_testfile";
@@ -3037,5 +3109,123 @@ void tst_QFile::writeNothing()
}
}
+void tst_QFile::resize_data()
+{
+ QTest::addColumn<int>("filetype");
+
+ QTest::newRow("native") << int(OpenQFile);
+ QTest::newRow("fileno") << int(OpenFd);
+ QTest::newRow("stream") << int(OpenStream);
+}
+
+void tst_QFile::resize()
+{
+ QFETCH(int, filetype);
+ QString filename(QLatin1String("file.txt"));
+ QFile file(filename);
+ QVERIFY(openFile(file, QIODevice::ReadWrite, FileType(filetype)));
+ QVERIFY(file.resize(8));
+ QCOMPARE(file.size(), qint64(8));
+ closeFile(file);
+ QFile::resize(filename, 4);
+ QCOMPARE(QFileInfo(filename).size(), qint64(4));
+ QVERIFY(QFile::remove(filename));
+}
+
+void tst_QFile::objectConstructors()
+{
+ QObject ob;
+ QFile* file1 = new QFile(SRCDIR "testfile.txt", &ob);
+ QFile* file2 = new QFile(&ob);
+ QVERIFY(file1->exists());
+ QVERIFY(!file2->exists());
+}
+
+#ifdef Q_OS_SYMBIAN
+void tst_QFile::platformSecurity_data()
+{
+ QTest::addColumn<QString>("file");
+ QTest::addColumn<bool>("readable");
+ QTest::addColumn<bool>("writable");
+
+ QString selfname = QCoreApplication::applicationFilePath();
+ QString ownprivate = QCoreApplication::applicationDirPath();
+ QString owndrive = selfname.left(2);
+ bool amiprivileged = RProcess().HasCapability(ECapabilityAllFiles);
+ QTest::newRow("resource") << owndrive + "/resource/apps/tst_qfile.rsc" << true << amiprivileged;
+ QTest::newRow("sys") << selfname << amiprivileged << false;
+ QTest::newRow("own private") << ownprivate + "/testfile.txt" << true << true;
+ QTest::newRow("other private") << owndrive + "/private/10003a3f/import/apps/tst_qfile_reg.rsc" << amiprivileged << amiprivileged;
+}
+
+void tst_QFile::platformSecurity()
+{
+ QFETCH(QString,file);
+ QFETCH(bool,readable);
+ QFETCH(bool,writable);
+
+ {
+ QFile f(file);
+ QCOMPARE(f.open(QIODevice::ReadOnly), readable);
+ }
+
+ {
+ QFile f(file);
+ QCOMPARE(f.open(QIODevice::ReadOnly | QIODevice::Unbuffered), readable);
+ }
+
+ //append mode used to avoid truncating the files.
+ {
+ QFile f(file);
+ QCOMPARE(f.open(QIODevice::WriteOnly | QIODevice::Append), writable);
+ }
+
+ {
+ QFile f(file);
+ QCOMPARE(f.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Unbuffered), writable);
+ }
+
+ {
+ QFile f(file);
+ QCOMPARE(f.open(QIODevice::ReadWrite), writable);
+ }
+
+ {
+ QFile f(file);
+ QCOMPARE(f.open(QIODevice::ReadWrite | QIODevice::Unbuffered), writable);
+ }
+}
+#endif
+
+void tst_QFile::caseSensitivity()
+{
+#if defined(Q_OS_SYMBIAN) || defined(Q_OS_WIN) || defined(Q_OS_MAC)
+ const bool caseSensitive = false;
+#else
+ const bool caseSensitive = true;
+#endif
+ QByteArray testData("a little test");
+ QString filename("File.txt");
+ {
+ QFile f(filename);
+ QVERIFY(f.open(QIODevice::WriteOnly));
+ QVERIFY(f.write(testData));
+ f.close();
+ }
+ QStringList alternates;
+ QFileInfo fi(filename);
+ QVERIFY(fi.exists());
+ alternates << "file.txt" << "File.TXT" << "fIlE.TxT" << fi.absoluteFilePath().toUpper() << fi.absoluteFilePath().toLower();
+ foreach (QString alt, alternates) {
+ QFileInfo fi2(alt);
+ QCOMPARE(fi2.exists(), !caseSensitive);
+ QCOMPARE(fi.size() == fi2.size(), !caseSensitive);
+ QFile f2(alt);
+ QCOMPARE(f2.open(QIODevice::ReadOnly), !caseSensitive);
+ if (!caseSensitive)
+ QCOMPARE(f2.readAll(), testData);
+ }
+}
+
QTEST_MAIN(tst_QFile)
#include "tst_qfile.moc"
diff --git a/tests/auto/qfiledialog/resources/file.txt b/tests/auto/qfiledialog/resources/file.txt
new file mode 100644
index 0000000..8a03e0e
--- /dev/null
+++ b/tests/auto/qfiledialog/resources/file.txt
@@ -0,0 +1 @@
+This is a simple text file.
diff --git a/tests/auto/qfiledialog/tst_qfiledialog.cpp b/tests/auto/qfiledialog/tst_qfiledialog.cpp
index ca7c445..668a3e0 100644
--- a/tests/auto/qfiledialog/tst_qfiledialog.cpp
+++ b/tests/auto/qfiledialog/tst_qfiledialog.cpp
@@ -61,9 +61,13 @@
#include <qlineedit.h>
#include <qlayout.h>
#include "../../shared/util.h"
+#if defined QT_BUILD_INTERNAL
#include "../../../src/gui/dialogs/qsidebar_p.h"
#include "../../../src/gui/dialogs/qfilesystemmodel_p.h"
#include "../../../src/gui/dialogs/qfiledialog_p.h"
+#endif
+#include <QFileDialog>
+#include <QFileSystemModel>
#include "../network-settings.h"
@@ -183,7 +187,7 @@ public:
QSize sizeHint(const QStyleOptionViewItem &, const QModelIndex &) const { return QSize(); }
};
-// emited any time the selection model emits current changed
+// emitted any time the selection model emits current changed
void tst_QFiledialog::currentChangedSignal()
{
QNonNativeFileDialog fd;
@@ -208,7 +212,7 @@ void tst_QFiledialog::currentChangedSignal()
QCOMPARE(spyCurrentChanged.count(), 1);
}
-// only emited from the views, sidebar, or lookin combo
+// only emitted from the views, sidebar, or lookin combo
void tst_QFiledialog::directoryEnteredSignal()
{
#if defined QT_BUILD_INTERNAL
@@ -269,13 +273,13 @@ void tst_QFiledialog::filesSelectedSignal_data()
QTest::newRow("existingFiles") << QFileDialog::ExistingFiles;
}
-// emited when the dialog closes with the selected files
+// emitted when the dialog closes with the selected files
void tst_QFiledialog::filesSelectedSignal()
{
QNonNativeFileDialog fd;
fd.setViewMode(QFileDialog::List);
fd.setOptions(QFileDialog::DontUseNativeDialog);
- QDir testDir(SRCDIR"/../../..");
+ QDir testDir(SRCDIR);
fd.setDirectory(testDir);
QFETCH(QFileDialog::FileMode, fileMode);
fd.setFileMode(fileMode);
@@ -313,7 +317,7 @@ void tst_QFiledialog::filesSelectedSignal()
QCOMPARE(spyFilesSelected.count(), 1);
}
-// only emited when the combo box is activated
+// only emitted when the combo box is activated
void tst_QFiledialog::filterSelectedSignal()
{
QNonNativeFileDialog fd;
@@ -1304,6 +1308,10 @@ QString saveName(QWidget *, const QString &, const QString &, const QString &, Q
void tst_QFiledialog::hooks()
{
+#ifdef Q_OS_SYMBIAN
+ if(QSysInfo::symbianVersion() < QSysInfo::SV_SF_3)
+ QSKIP("writing to data exports in paged dll not supported and crashes on symbian versions prior to ^3", SkipAll);
+#endif
qt_filedialog_existing_directory_hook = &existing;
qt_filedialog_save_filename_hook = &saveName;
qt_filedialog_open_filename_hook = &openName;
diff --git a/tests/auto/qfileinfo/qfileinfo.pro b/tests/auto/qfileinfo/qfileinfo.pro
index 3141db6..b35b1e0 100644
--- a/tests/auto/qfileinfo/qfileinfo.pro
+++ b/tests/auto/qfileinfo/qfileinfo.pro
@@ -10,9 +10,11 @@ wince*:|symbian: {
deploy.files += qfileinfo.qrc tst_qfileinfo.cpp
res.files = resources\\file1 resources\\file1.ext1 resources\\file1.ext1.ext2
res.path = resources
- DEPLOYMENT = deploy res
+ DEPLOYMENT += deploy res
}
+win32*:LIBS += -ladvapi32 -lnetapi32
+
symbian {
TARGET.CAPABILITY=AllFiles
LIBS *= -lefsrv
@@ -28,3 +30,6 @@ wince* {
DEFINES += SRCDIR=\\\"$$PWD/\\\"
}
+contains(QT_CONFIG, qt3support): QT += qt3support
+
+CONFIG += parallel_test
diff --git a/tests/auto/qfileinfo/tst_qfileinfo.cpp b/tests/auto/qfileinfo/tst_qfileinfo.cpp
index 202f212..4d9e80b 100644
--- a/tests/auto/qfileinfo/tst_qfileinfo.cpp
+++ b/tests/auto/qfileinfo/tst_qfileinfo.cpp
@@ -54,11 +54,14 @@
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
+#include <sys/types.h>
+#include <pwd.h>
#endif
#ifdef Q_OS_WIN
#define _WIN32_WINNT 0x500
#include <qt_windows.h>
#include <qlibrary.h>
+#include <lm.h>
#endif
#include <qplatformdefs.h>
#include <qdebug.h>
@@ -72,6 +75,7 @@
#if defined(Q_OS_SYMBIAN)
# define SRCDIR ""
+# define NO_SYMLINKS
#endif
QT_BEGIN_NAMESPACE
@@ -187,6 +191,13 @@ private slots:
void notEqualOperator() const;
void detachingOperations();
+
+#if !defined(Q_OS_WINCE) && !defined(Q_OS_SYMBIAN)
+ void owner();
+#endif
+ void group();
+
+ void invalidState();
};
tst_QFileInfo::tst_QFileInfo()
@@ -415,6 +426,7 @@ void tst_QFileInfo::exists_data()
QTest::newRow("data9") << SRCDIR "resources/file?.ext1" << false;
QTest::newRow("data10") << "." << true;
QTest::newRow("data11") << ". " << false;
+ QTest::newRow("empty") << "" << false;
QTest::newRow("simple dir") << SRCDIR "resources" << true;
QTest::newRow("simple dir with slash") << SRCDIR "resources/" << true;
@@ -517,7 +529,11 @@ void tst_QFileInfo::absFilePath()
QFETCH(QString, expected);
QFileInfo fi(file);
+#if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
+ QVERIFY(QString::compare(fi.absoluteFilePath(), expected, Qt::CaseInsensitive) == 0);
+#else
QCOMPARE(fi.absoluteFilePath(), expected);
+#endif
}
void tst_QFileInfo::canonicalPath()
@@ -607,20 +623,29 @@ void tst_QFileInfo::canonicalFilePath()
#ifdef Q_OS_WIN
typedef BOOL (WINAPI *PtrCreateSymbolicLink)(LPTSTR, LPTSTR, DWORD);
PtrCreateSymbolicLink ptrCreateSymbolicLink =
- (PtrCreateSymbolicLink)QLibrary::resolve(QLatin1String("kernel32"), "CreateSymbolicLink");
+ (PtrCreateSymbolicLink)QLibrary::resolve(QLatin1String("kernel32"), "CreateSymbolicLinkW");
- if (!ptrCreateSymbolicLink ||
- ptrCreateSymbolicLink((wchar_t*)QString("res").utf16(), (wchar_t*)QString("resources").utf16(), 1) == 0) {
+ if (!ptrCreateSymbolicLink) {
QSKIP("Symbolic links aren't supported by FS", SkipAll);
+ } else {
+ // CreateSymbolicLink can return TRUE & still fail to create the link,
+ // the error code in that case is ERROR_PRIVILEGE_NOT_HELD (1314)
+ SetLastError(0);
+ BOOL ret = ptrCreateSymbolicLink((wchar_t*)QString("res").utf16(), (wchar_t*)QString("resources").utf16(), 1);
+ DWORD dwErr = GetLastError();
+ if (!ret)
+ QSKIP("Symbolic links aren't supported by FS", SkipAll);
+ QString currentPath = QDir::currentPath();
+ bool is_res_Current = QDir::setCurrent("res");
+ if (!is_res_Current && dwErr == 1314)
+ QSKIP("Not enough privilages to create Symbolic links", SkipAll);
+ QCOMPARE(is_res_Current, true);
+
+ QCOMPARE(QFileInfo("file1").canonicalFilePath(), currentPath + "/resources/file1");
+
+ QCOMPARE(QDir::setCurrent(currentPath), true);
+ QDir::current().rmdir("res");
}
-
- QString currentPath = QDir::currentPath();
- QCOMPARE(QDir::setCurrent("res"), true);
-
- QCOMPARE(QFileInfo("file1").canonicalFilePath(), currentPath + "/resources/file1");
-
- QCOMPARE(QDir::setCurrent(currentPath), true);
- QFile::remove("res");
#endif
}
@@ -698,10 +723,19 @@ void tst_QFileInfo::dir()
QFETCH(QString, expected);
QFileInfo fi(file);
- if (absPath)
+ if (absPath) {
QCOMPARE(fi.absolutePath(), expected);
- else
+ QCOMPARE(fi.absoluteDir().path(), expected);
+#ifdef QT3_SUPPORT
+ QCOMPARE(fi.dir(true).path(), expected);
+#endif
+ } else {
QCOMPARE(fi.path(), expected);
+ QCOMPARE(fi.dir().path(), expected);
+#ifdef QT3_SUPPORT
+ QCOMPARE(fi.dir(false).path(), expected);
+#endif
+ }
}
@@ -1089,6 +1123,7 @@ void tst_QFileInfo::fileTimes_oldFile()
void tst_QFileInfo::isSymLink_data()
{
+#ifndef NO_SYMLINKS
QFile::remove("link.lnk");
QFile::remove("brokenlink.lnk");
QFile::remove("dummyfile");
@@ -1108,10 +1143,12 @@ void tst_QFileInfo::isSymLink_data()
QTest::newRow("existent file") << SRCDIR "tst_qfileinfo.cpp" << false << "";
QTest::newRow("link") << "link.lnk" << true << QFileInfo(SRCDIR "tst_qfileinfo.cpp").absoluteFilePath();
QTest::newRow("broken link") << "brokenlink.lnk" << true << QFileInfo("dummyfile").absoluteFilePath();
+#endif
}
void tst_QFileInfo::isSymLink()
{
+#ifndef NO_SYMLINKS
QFETCH(QString, path);
QFETCH(bool, isSymLink);
QFETCH(QString, linkTarget);
@@ -1119,6 +1156,9 @@ void tst_QFileInfo::isSymLink()
QFileInfo fi(path);
QCOMPARE(fi.isSymLink(), isSymLink);
QCOMPARE(fi.symLinkTarget(), linkTarget);
+#else
+ QSKIP("no symbolic link support on this platform", SkipAll);
+#endif
}
void tst_QFileInfo::isHidden_data()
@@ -1252,9 +1292,10 @@ void tst_QFileInfo::isLocalFs()
QFileInfo info(path);
QFileInfoPrivate *privateInfo = getPrivate(info);
- QVERIFY(privateInfo->fileEngine);
- QCOMPARE(bool(privateInfo->fileEngine->fileFlags(QAbstractFileEngine::LocalDiskFlag)
- & QAbstractFileEngine::LocalDiskFlag), isLocalFs);
+ QCOMPARE((privateInfo->fileEngine == 0), isLocalFs);
+ if (privateInfo->fileEngine)
+ QCOMPARE(bool(privateInfo->fileEngine->fileFlags(QAbstractFileEngine::LocalDiskFlag)
+ & QAbstractFileEngine::LocalDiskFlag), isLocalFs);
}
void tst_QFileInfo::refresh()
@@ -1343,8 +1384,24 @@ void tst_QFileInfo::ntfsJunctionPointsAndSymlinks_data()
file.open(QIODevice::ReadWrite);
file.close();
- QVERIFY(pwd.exists("abs_symlink") || createSymbolicLinkW((wchar_t*)absSymlink.utf16(),(wchar_t*)absTarget.utf16(),0x1));
- QVERIFY(pwd.exists(relSymlink) || createSymbolicLinkW((wchar_t*)relSymlink.utf16(),(wchar_t*)relTarget.utf16(),0x1));
+ DWORD err = ERROR_SUCCESS ;
+ if (!pwd.exists("abs_symlink"))
+ if (!createSymbolicLinkW((wchar_t*)absSymlink.utf16(),(wchar_t*)absTarget.utf16(),0x1))
+ err = GetLastError();
+ if (err == ERROR_SUCCESS && !pwd.exists(relSymlink))
+ if (!createSymbolicLinkW((wchar_t*)relSymlink.utf16(),(wchar_t*)relTarget.utf16(),0x1))
+ err = GetLastError();
+ if (err != ERROR_SUCCESS) {
+ wchar_t errstr[0x100];
+ DWORD count = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM,
+ 0, err, 0, errstr, 0x100, 0);
+ QString error(QString::fromUtf16(errstr, count));
+ qWarning() << error;
+ //we need at least one data set for the test not to assert fail when skipping _data function
+ QDir target("target");
+ QTest::newRow("dummy") << target.path() << false << "" << target.canonicalPath();
+ QSKIP("link not supported by FS or insufficient privilege", SkipSingle);
+ }
QVERIFY(file.exists());
QTest::newRow("absolute dir symlink") << absSymlink << true << QDir::fromNativeSeparators(absTarget) << target.canonicalPath();
@@ -1433,10 +1490,6 @@ void tst_QFileInfo::brokenShortcut()
void tst_QFileInfo::isWritable()
{
-#ifdef Q_OS_SYMBIAN
- QSKIP("Currently skipped on Symbian OS, but surely there is a writeable file somewhere???", SkipAll);
-#endif
-
QFile tempfile("tempfile.txt");
tempfile.open(QIODevice::WriteOnly);
tempfile.write("This file is generated by the QFileInfo autotest.");
@@ -1454,7 +1507,7 @@ void tst_QFileInfo::isWritable()
QVERIFY(fi.exists());
QVERIFY(!fi.isWritable());
#endif
-#ifdef Q_OS_UNIX
+#if defined (Q_OS_UNIX) && !defined (Q_OS_SYMBIAN)
if (::getuid() == 0)
QVERIFY(QFileInfo("/etc/passwd").isWritable());
else
@@ -1465,9 +1518,6 @@ void tst_QFileInfo::isWritable()
void tst_QFileInfo::isExecutable()
{
#ifdef Q_OS_SYMBIAN
-# if defined(Q_CC_NOKIAX86)
- QSKIP("Impossible to implement reading/touching of application binaries in Symbian emulator", SkipAll);
-# endif
QString appPath = "c:/sys/bin/tst_qfileinfo.exe";
#else
QString appPath = QCoreApplication::applicationDirPath();
@@ -1601,5 +1651,160 @@ void tst_QFileInfo::detachingOperations()
QVERIFY(!info1.caching());
}
+#if !defined(Q_OS_WINCE) && !defined(Q_OS_SYMBIAN)
+#if defined (Q_OS_WIN)
+BOOL IsUserAdmin()
+{
+ BOOL b;
+ SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
+ PSID AdministratorsGroup;
+ b = AllocateAndInitializeSid(
+ &NtAuthority,
+ 2,
+ SECURITY_BUILTIN_DOMAIN_RID,
+ DOMAIN_ALIAS_RID_ADMINS,
+ 0, 0, 0, 0, 0, 0,
+ &AdministratorsGroup);
+ if (b) {
+ if (!CheckTokenMembership( NULL, AdministratorsGroup, &b))
+ b = FALSE;
+ FreeSid(AdministratorsGroup);
+ }
+
+ return(b);
+}
+#endif
+
+void tst_QFileInfo::owner()
+{
+ QString userName;
+#if defined(Q_OS_UNIX)
+ {
+ passwd *user = getpwuid(geteuid());
+ QVERIFY(user);
+ char *usernameBuf = user->pw_name;
+ userName = QString::fromLocal8Bit(usernameBuf);
+ }
+#endif
+#if defined(Q_OS_WIN)
+ wchar_t usernameBuf[1024];
+ DWORD bufSize = 1024;
+ if (GetUserNameW(usernameBuf, &bufSize)) {
+ userName = QString::fromWCharArray(usernameBuf);
+ if (QSysInfo::WindowsVersion >= QSysInfo::WV_VISTA && IsUserAdmin()) {
+ // Special case : If the user is a member of Administrators group, all files
+ // created by the current user are owned by the Administrators group.
+ LPLOCALGROUP_USERS_INFO_0 pBuf = NULL;
+ DWORD dwLevel = 0;
+ DWORD dwFlags = LG_INCLUDE_INDIRECT ;
+ DWORD dwPrefMaxLen = MAX_PREFERRED_LENGTH;
+ DWORD dwEntriesRead = 0;
+ DWORD dwTotalEntries = 0;
+ NET_API_STATUS nStatus;
+ nStatus = NetUserGetLocalGroups(0, usernameBuf, dwLevel, dwFlags, (LPBYTE *) &pBuf,
+ dwPrefMaxLen, &dwEntriesRead, &dwTotalEntries);
+ // Check if the current user is a member of Administrators group
+ if (nStatus == NERR_Success && pBuf){
+ for (int i = 0; i < dwEntriesRead; i++) {
+ QString groupName = QString::fromWCharArray(pBuf[i].lgrui0_name);
+ if (!groupName.compare(QLatin1String("Administrators")))
+ userName = groupName;
+ }
+ }
+ if (pBuf != NULL)
+ NetApiBufferFree(pBuf);
+ }
+ }
+ extern Q_CORE_EXPORT int qt_ntfs_permission_lookup;
+ qt_ntfs_permission_lookup = 1;
+#endif
+ if (userName.isEmpty())
+ QSKIP("Can't retrieve the user name", SkipAll);
+ QString fileName("ownertest.txt");
+ QVERIFY(!QFile::exists(fileName) || QFile::remove(fileName));
+ {
+ QFile testFile(fileName);
+ QVERIFY(testFile.open(QIODevice::WriteOnly | QIODevice::Text));
+ QByteArray testData("testfile");
+ QVERIFY(testFile.write(testData) != -1);
+ }
+ QFileInfo fi(fileName);
+ QVERIFY(fi.exists());
+ QCOMPARE(fi.owner(), userName);
+
+ QFile::remove(fileName);
+#if defined(Q_OS_WIN)
+ qt_ntfs_permission_lookup = 0;
+#endif
+}
+#endif
+
+void tst_QFileInfo::group()
+{
+ QString expected;
+#if defined(Q_OS_UNIX) && !defined(Q_OS_SYMBIAN)
+ struct group *gr;
+ gid_t gid = getegid();
+ gr = getgrgid(gid);
+ expected = QString::fromLocal8Bit(gr->gr_name);
+#endif
+
+ QString fileName("ownertest.txt");
+ if (QFile::exists(fileName))
+ QFile::remove(fileName);
+ QFile testFile(fileName);
+ QVERIFY(testFile.open(QIODevice::WriteOnly | QIODevice::Text));
+ QByteArray testData("testfile");
+ QVERIFY(testFile.write(testData) != -1);
+ testFile.close();
+ QFileInfo fi(fileName);
+ QVERIFY(fi.exists());
+
+ QCOMPARE(fi.group(), expected);
+}
+
+void tst_QFileInfo::invalidState()
+{
+ // Shouldn't crash;
+
+ {
+ QFileInfo info;
+ QCOMPARE(info.size(), qint64(0));
+ QVERIFY(!info.exists());
+
+ info.setCaching(false);
+
+ info.created();
+ info.lastRead();
+ info.lastModified();
+ }
+
+ {
+ QFileInfo info("");
+ QCOMPARE(info.size(), qint64(0));
+ QVERIFY(!info.exists());
+
+ info.setCaching(false);
+
+ info.created();
+ info.lastRead();
+ info.lastModified();
+ }
+
+ {
+ QFileInfo info("file-doesn't-really-exist.txt");
+ QCOMPARE(info.size(), qint64(0));
+ QVERIFY(!info.exists());
+
+ info.setCaching(false);
+
+ info.created();
+ info.lastRead();
+ info.lastModified();
+ }
+
+ QVERIFY(true);
+}
+
QTEST_MAIN(tst_QFileInfo)
#include "tst_qfileinfo.moc"
diff --git a/tests/auto/qfilesystementry/qfilesystementry.pro b/tests/auto/qfilesystementry/qfilesystementry.pro
new file mode 100644
index 0000000..b9b43e6
--- /dev/null
+++ b/tests/auto/qfilesystementry/qfilesystementry.pro
@@ -0,0 +1,8 @@
+load(qttest_p4)
+
+SOURCES += tst_qfilesystementry.cpp \
+ ../../../src/corelib/io/qfilesystementry.cpp
+HEADERS += ../../../src/corelib/io/qfilesystementry_p.h
+QT = core
+
+CONFIG += parallel_test
diff --git a/tests/auto/qfilesystementry/tst_qfilesystementry.cpp b/tests/auto/qfilesystementry/tst_qfilesystementry.cpp
new file mode 100644
index 0000000..4375f99
--- /dev/null
+++ b/tests/auto/qfilesystementry/tst_qfilesystementry.cpp
@@ -0,0 +1,387 @@
+/****************************************************************************
+**
+** 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 <QtTest/QtTest>
+
+#include <QtCore/private/qfilesystementry_p.h>
+
+#if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
+# define WIN_STUFF
+#endif
+
+//TESTED_CLASS=
+//TESTED_FILES=
+
+class tst_QFileSystemEntry : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void getSetCheck_data();
+ void getSetCheck();
+ void suffix_data();
+ void suffix();
+ void completeSuffix_data();
+ void completeSuffix();
+ void baseName_data();
+ void baseName();
+ void completeBaseName_data();
+ void completeBaseName();
+#if defined(WIN_STUFF)
+ void absoluteOrRelative_data();
+ void absoluteOrRelative();
+#endif
+};
+
+#if defined(WIN_STUFF)
+void tst_QFileSystemEntry::getSetCheck_data()
+{
+ QTest::addColumn<QString>("nativeFilePath");
+ QTest::addColumn<QString>("internalnativeFilePath");
+ QTest::addColumn<QString>("filepath");
+ QTest::addColumn<QString>("filename");
+ QTest::addColumn<QString>("baseName");
+ QTest::addColumn<QString>("completeBasename");
+ QTest::addColumn<QString>("suffix");
+ QTest::addColumn<QString>("completeSuffix");
+ QTest::addColumn<bool>("absolute");
+ QTest::addColumn<bool>("relative");
+
+ QString absPrefix = QLatin1String("\\\\?\\");
+ QString relPrefix = absPrefix
+ + QDir::toNativeSeparators(QDir::currentPath())
+ + QLatin1String("\\");
+
+ QTest::newRow("simple")
+ << QString("A:\\home\\qt\\in\\a\\dir.tar.gz")
+ << absPrefix + QString("A:\\home\\qt\\in\\a\\dir.tar.gz")
+ << "A:/home/qt/in/a/dir.tar.gz"
+ << "dir.tar.gz" << "dir" << "dir.tar" << "gz" << "tar.gz" << true << false;
+
+ QTest::newRow("relative")
+ << QString("in\\a\\dir.tar.gz")
+ << relPrefix + QString("in\\a\\dir.tar.gz")
+ << "in/a/dir.tar.gz"
+ << "dir.tar.gz" << "dir" << "dir.tar" << "gz" << "tar.gz" << false <<true;
+
+ QTest::newRow("noSuffix")
+ << QString("myDir\\myfile")
+ << relPrefix + QString("myDir\\myfile")
+ << "myDir/myfile" << "myfile" << "myfile" << "myfile" << "" << "" << false <<true;
+
+ QTest::newRow("noLongSuffix")
+ << QString("myDir\\myfile.txt")
+ << relPrefix + QString("myDir\\myfile.txt")
+ << "myDir/myfile.txt" << "myfile.txt" << "myfile" << "myfile" << "txt" << "txt" << false << true;
+
+ QTest::newRow("endingSlash")
+ << QString("myDir\\myfile.bla\\")
+ << relPrefix + QString("myDir\\myfile.bla\\")
+ << "myDir/myfile.bla/" << "" << "" << "" << "" << "" << false << true;
+
+ QTest::newRow("absolutePath")
+ << QString("A:dir\\without\\leading\\backslash.bat")
+ << absPrefix + QString("A:\\dir\\without\\leading\\backslash.bat")
+ << "A:dir/without/leading/backslash.bat" << "backslash.bat" << "backslash" << "backslash" << "bat" << "bat" << false << false;
+}
+
+void tst_QFileSystemEntry::getSetCheck()
+{
+ QFETCH(QString, nativeFilePath);
+ QFETCH(QString, internalnativeFilePath);
+ QFETCH(QString, filepath);
+ QFETCH(QString, filename);
+ QFETCH(QString, baseName);
+ QFETCH(QString, completeBasename);
+ QFETCH(QString, suffix);
+ QFETCH(QString, completeSuffix);
+ QFETCH(bool, absolute);
+ QFETCH(bool, relative);
+
+ QFileSystemEntry entry1(filepath);
+ QCOMPARE(entry1.filePath(), filepath);
+ QCOMPARE(entry1.nativeFilePath().toLower(), internalnativeFilePath.toLower());
+ QCOMPARE(entry1.fileName(), filename);
+ QCOMPARE(entry1.suffix(), suffix);
+ QCOMPARE(entry1.completeSuffix(), completeSuffix);
+ QCOMPARE(entry1.isAbsolute(), absolute);
+ QCOMPARE(entry1.isRelative(), relative);
+ QCOMPARE(entry1.baseName(), baseName);
+ QCOMPARE(entry1.completeBaseName(), completeBasename);
+
+ QFileSystemEntry entry2(nativeFilePath, QFileSystemEntry::FromNativePath());
+ QCOMPARE(entry2.suffix(), suffix);
+ QCOMPARE(entry2.completeSuffix(), completeSuffix);
+ QCOMPARE(entry2.isAbsolute(), absolute);
+ QCOMPARE(entry2.isRelative(), relative);
+ QCOMPARE(entry2.filePath(), filepath);
+ // Since this entry was created using the native path,
+ // the object shouldnot change nativeFilePath.
+ QCOMPARE(entry2.nativeFilePath(), nativeFilePath);
+ QCOMPARE(entry2.fileName(), filename);
+ QCOMPARE(entry2.baseName(), baseName);
+ QCOMPARE(entry2.completeBaseName(), completeBasename);
+}
+
+#else
+
+void tst_QFileSystemEntry::getSetCheck_data()
+{
+ QTest::addColumn<QByteArray>("nativeFilePath");
+ QTest::addColumn<QString>("filepath");
+ QTest::addColumn<QString>("filename");
+ QTest::addColumn<QString>("basename");
+ QTest::addColumn<QString>("completeBasename");
+ QTest::addColumn<QString>("suffix");
+ QTest::addColumn<QString>("completeSuffix");
+ QTest::addColumn<bool>("absolute");
+
+ QTest::newRow("simple")
+ << QByteArray("/home/qt/in/a/dir.tar.gz")
+ << "/home/qt/in/a/dir.tar.gz"
+ << "dir.tar.gz" << "dir" << "dir.tar" << "gz" << "tar.gz" << true;
+ QTest::newRow("relative")
+ << QByteArray("in/a/dir.tar.gz")
+ << "in/a/dir.tar.gz"
+ << "dir.tar.gz" << "dir" << "dir.tar" << "gz" << "tar.gz" << false;
+
+ QTest::newRow("noSuffix")
+ << QByteArray("myDir/myfile")
+ << "myDir/myfile" << "myfile" << "myfile" << "myfile" << "" << "" << false;
+
+ QTest::newRow("noLongSuffix")
+ << QByteArray("myDir/myfile.txt")
+ << "myDir/myfile.txt" << "myfile.txt" << "myfile" << "myfile" << "txt" << "txt" << false;
+
+ QTest::newRow("endingSlash")
+ << QByteArray("myDir/myfile.bla/")
+ << "myDir/myfile.bla/" << "" << "" << "" << "" << "" << false;
+
+ QTest::newRow("relativePath")
+ << QByteArray("A:dir/without/leading/backslash.bat")
+ << "A:dir/without/leading/backslash.bat" << "backslash.bat" << "backslash" << "backslash" << "bat" << "bat" << false;
+}
+
+void tst_QFileSystemEntry::getSetCheck()
+{
+ QFETCH(QByteArray, nativeFilePath);
+ QFETCH(QString, filepath);
+ QFETCH(QString, filename);
+ QFETCH(QString, basename);
+ QFETCH(QString, completeBasename);
+ QFETCH(QString, suffix);
+ QFETCH(QString, completeSuffix);
+ QFETCH(bool, absolute);
+
+ QFileSystemEntry entry1(filepath);
+ QCOMPARE(entry1.filePath(), filepath);
+ QCOMPARE(entry1.nativeFilePath(), nativeFilePath);
+ QCOMPARE(entry1.fileName(), filename);
+ QCOMPARE(entry1.suffix(), suffix);
+ QCOMPARE(entry1.completeSuffix(), completeSuffix);
+ QCOMPARE(entry1.isAbsolute(), absolute);
+ QCOMPARE(entry1.isRelative(), !absolute);
+ QCOMPARE(entry1.baseName(), basename);
+ QCOMPARE(entry1.completeBaseName(), completeBasename);
+
+ QFileSystemEntry entry2(nativeFilePath, QFileSystemEntry::FromNativePath());
+ QCOMPARE(entry2.suffix(), suffix);
+ QCOMPARE(entry2.completeSuffix(), completeSuffix);
+ QCOMPARE(entry2.isAbsolute(), absolute);
+ QCOMPARE(entry2.isRelative(), !absolute);
+ QCOMPARE(entry2.filePath(), filepath);
+ QCOMPARE(entry2.nativeFilePath(), nativeFilePath);
+ QCOMPARE(entry2.fileName(), filename);
+ QCOMPARE(entry2.baseName(), basename);
+ QCOMPARE(entry2.completeBaseName(), completeBasename);
+}
+#endif
+
+void tst_QFileSystemEntry::suffix_data()
+{
+ QTest::addColumn<QString>("file");
+ QTest::addColumn<QString>("expected");
+
+ QTest::newRow("noextension0") << "file" << "";
+ QTest::newRow("noextension1") << "/path/to/file" << "";
+ QTest::newRow("data0") << "file.tar" << "tar";
+ QTest::newRow("data1") << "file.tar.gz" << "gz";
+ QTest::newRow("data2") << "/path/file/file.tar.gz" << "gz";
+ QTest::newRow("data3") << "/path/file.tar" << "tar";
+ QTest::newRow("hidden1") << ".ext1" << "ext1";
+ QTest::newRow("hidden1") << ".ext" << "ext";
+ QTest::newRow("hidden1") << ".ex" << "ex";
+ QTest::newRow("hidden1") << ".e" << "e";
+ QTest::newRow("hidden2") << ".ext1.ext2" << "ext2";
+ QTest::newRow("hidden2") << ".ext.ext2" << "ext2";
+ QTest::newRow("hidden2") << ".ex.ext2" << "ext2";
+ QTest::newRow("hidden2") << ".e.ext2" << "ext2";
+ QTest::newRow("hidden2") << "..ext2" << "ext2";
+ QTest::newRow("dots") << "/path/file.with.dots/file..ext2" << "ext2";
+ QTest::newRow("dots2") << "/path/file.with.dots/.file..ext2" << "ext2";
+}
+
+void tst_QFileSystemEntry::suffix()
+{
+ QFETCH(QString, file);
+ QFETCH(QString, expected);
+
+ QFileSystemEntry fe(file);
+ QCOMPARE(fe.suffix(), expected);
+
+ QFileSystemEntry fi2(file);
+ // first resolve the last slash
+ (void) fi2.path();
+ QCOMPARE(fi2.suffix(), expected);
+}
+
+void tst_QFileSystemEntry::completeSuffix_data()
+{
+ QTest::addColumn<QString>("file");
+ QTest::addColumn<QString>("expected");
+
+ QTest::newRow("noextension0") << "file" << "";
+ QTest::newRow("noextension1") << "/path/to/file" << "";
+ QTest::newRow("data0") << "file.tar" << "tar";
+ QTest::newRow("data1") << "file.tar.gz" << "tar.gz";
+ QTest::newRow("data2") << "/path/file/file.tar.gz" << "tar.gz";
+ QTest::newRow("data3") << "/path/file.tar" << "tar";
+ QTest::newRow("dots") << "/path/file.with.dots/file..ext2" << ".ext2";
+ QTest::newRow("dots2") << "/path/file.with.dots/.file..ext2" << "file..ext2";
+}
+
+void tst_QFileSystemEntry::completeSuffix()
+{
+ QFETCH(QString, file);
+ QFETCH(QString, expected);
+
+ QFileSystemEntry fi(file);
+ QCOMPARE(fi.completeSuffix(), expected);
+
+ QFileSystemEntry fi2(file);
+ // first resolve the last slash
+ (void) fi2.path();
+ QCOMPARE(fi2.completeSuffix(), expected);
+}
+
+void tst_QFileSystemEntry::baseName_data()
+{
+ QTest::addColumn<QString>("file");
+ QTest::addColumn<QString>("expected");
+
+ QTest::newRow("data0") << "file.tar" << "file";
+ QTest::newRow("data1") << "file.tar.gz" << "file";
+ QTest::newRow("data2") << "/path/file/file.tar.gz" << "file";
+ QTest::newRow("data3") << "/path/file.tar" << "file";
+ QTest::newRow("data4") << "/path/file" << "file";
+ QTest::newRow("dots") << "/path/file.with.dots/file..ext2" << "file";
+ QTest::newRow("dots2") << "/path/file.with.dots/.file..ext2" << "";
+}
+
+void tst_QFileSystemEntry::baseName()
+{
+ QFETCH(QString, file);
+ QFETCH(QString, expected);
+
+ QFileSystemEntry fi(file);
+ QCOMPARE(fi.baseName(), expected);
+
+ QFileSystemEntry fi2(file);
+ // first resolve the last slash
+ (void) fi2.path();
+ QCOMPARE(fi2.baseName(), expected);
+}
+
+void tst_QFileSystemEntry::completeBaseName_data()
+{
+ QTest::addColumn<QString>("file");
+ QTest::addColumn<QString>("expected");
+
+ QTest::newRow("data0") << "file.tar" << "file";
+ QTest::newRow("data1") << "file.tar.gz" << "file.tar";
+ QTest::newRow("data2") << "/path/file/file.tar.gz" << "file.tar";
+ QTest::newRow("data3") << "/path/file.tar" << "file";
+ QTest::newRow("data4") << "/path/file" << "file";
+ QTest::newRow("dots") << "/path/file.with.dots/file..ext2" << "file.";
+ QTest::newRow("dots2") << "/path/file.with.dots/.file..ext2" << ".file.";
+}
+
+void tst_QFileSystemEntry::completeBaseName()
+{
+ QFETCH(QString, file);
+ QFETCH(QString, expected);
+
+ QFileSystemEntry fi(file);
+ QCOMPARE(fi.completeBaseName(), expected);
+
+ QFileSystemEntry fi2(file);
+ // first resolve the last slash
+ (void) fi2.path();
+ QCOMPARE(fi2.completeBaseName(), expected);
+}
+
+#if defined(WIN_STUFF)
+void tst_QFileSystemEntry::absoluteOrRelative_data()
+{
+ QTest::addColumn<QString>("path");
+ QTest::addColumn<bool>("isAbsolute");
+ QTest::addColumn<bool>("isRelative");
+
+ QTest::newRow("data0") << "file.tar" << false << true;
+ QTest::newRow("data1") << "/path/file/file.tar.gz" << false << false;
+ QTest::newRow("data1") << "C:path/file/file.tar.gz" << false << false;
+ QTest::newRow("data3") << "C:/path/file" << true << false;
+ QTest::newRow("data3") << "//machine/share" << true << false;
+}
+
+void tst_QFileSystemEntry::absoluteOrRelative()
+{
+ QFETCH(QString, path);
+ QFETCH(bool, isAbsolute);
+ QFETCH(bool, isRelative);
+
+ QFileSystemEntry fi(path);
+ QCOMPARE(fi.isAbsolute(), isAbsolute);
+ QCOMPARE(fi.isRelative(), isRelative);
+}
+#endif
+
+QTEST_MAIN(tst_QFileSystemEntry)
+#include <tst_qfilesystementry.moc>
diff --git a/tests/auto/qfilesystemmodel/tst_qfilesystemmodel.cpp b/tests/auto/qfilesystemmodel/tst_qfilesystemmodel.cpp
index c234c96..6b63691 100644
--- a/tests/auto/qfilesystemmodel/tst_qfilesystemmodel.cpp
+++ b/tests/auto/qfilesystemmodel/tst_qfilesystemmodel.cpp
@@ -41,7 +41,10 @@
#include <QtTest/QtTest>
+#ifdef QT_BUILD_INTERNAL
#include "../../../src/gui/dialogs/qfilesystemmodel_p.h"
+#endif
+#include <QFileSystemModel>
#include <QFileIconProvider>
#include <QTreeView>
#include <QHeaderView>
@@ -826,8 +829,10 @@ void tst_QFileSystemModel::sort()
MyFriendFileSystemModel *myModel = new MyFriendFileSystemModel();
QTreeView *tree = new QTreeView();
+#ifdef QT_BUILD_INTERNAL
if (fileDialogMode)
myModel->d_func()->disableRecursiveSort = true;
+#endif
QDir dir(QDir::tempPath());
//initialize the randomness
@@ -992,8 +997,8 @@ void tst_QFileSystemModel::dirsBeforeFiles()
}
dir.rmdir(dirPath);
}
- dir.mkpath(dirPath);
- QVERIFY(dir.exists());
+ QVERIFY(dir.mkpath(dirPath));
+ QVERIFY(QDir(dirPath).exists());
for (int i = 0; i < 3; ++i) {
QLatin1Char c('a' + i);
diff --git a/tests/auto/qfilesystemwatcher/qfilesystemwatcher.pro b/tests/auto/qfilesystemwatcher/qfilesystemwatcher.pro
index 8b8616a..75e85a0 100644
--- a/tests/auto/qfilesystemwatcher/qfilesystemwatcher.pro
+++ b/tests/auto/qfilesystemwatcher/qfilesystemwatcher.pro
@@ -1,3 +1,5 @@
load(qttest_p4)
SOURCES += tst_qfilesystemwatcher.cpp
QT = core
+
+CONFIG += parallel_test
diff --git a/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp b/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp
index 6a2f849..588c476 100644
--- a/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp
+++ b/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp
@@ -288,6 +288,7 @@ private slots:
void taskQT657_paintIntoCacheWithTransparentParts();
void taskQTBUG_7863_paintIntoCacheWithTransparentParts();
void taskQT_3674_doNotCrash();
+ void taskQTBUG_15977_renderWithDeviceCoordinateCache();
};
void tst_QGraphicsScene::initTestCase()
@@ -4629,5 +4630,27 @@ void tst_QGraphicsScene::zeroScale()
QTRY_COMPARE(cl.changes.count(), 2);
}
+void tst_QGraphicsScene::taskQTBUG_15977_renderWithDeviceCoordinateCache()
+{
+ QGraphicsScene scene;
+ scene.setSceneRect(0, 0, 100, 100);
+ QGraphicsRectItem *rect = scene.addRect(0, 0, 100, 100);
+ rect->setPen(Qt::NoPen);
+ rect->setBrush(Qt::red);
+ rect->setCacheMode(QGraphicsItem::DeviceCoordinateCache);
+
+ QImage image(100, 100, QImage::Format_RGB32);
+ QPainter p(&image);
+ scene.render(&p);
+ p.end();
+
+ QImage expected(100, 100, QImage::Format_RGB32);
+ p.begin(&expected);
+ p.fillRect(expected.rect(), Qt::red);
+ p.end();
+
+ QCOMPARE(image, expected);
+}
+
QTEST_MAIN(tst_QGraphicsScene)
#include "tst_qgraphicsscene.moc"
diff --git a/tests/auto/qgraphicsview/tst_qgraphicsview.cpp b/tests/auto/qgraphicsview/tst_qgraphicsview.cpp
index 44f3504..6ea69a7 100644
--- a/tests/auto/qgraphicsview/tst_qgraphicsview.cpp
+++ b/tests/auto/qgraphicsview/tst_qgraphicsview.cpp
@@ -247,6 +247,7 @@ private slots:
void QTBUG_5859_exposedRect();
void QTBUG_7438_cursor();
void hoverLeave();
+ void QTBUG_16063_microFocusRect();
public slots:
void dummySlot() {}
@@ -4505,5 +4506,43 @@ void tst_QGraphicsView::hoverLeave()
QCOMPARE(item->leaveWidget, view.viewport());
}
+class IMItem : public QGraphicsRectItem
+{
+public:
+ IMItem(QGraphicsItem *parent = 0):
+ QGraphicsRectItem(QRectF(0, 0, 20, 20), parent)
+ {
+ setFlag(QGraphicsItem::ItemIsFocusable, true);
+ setFlag(QGraphicsItem::ItemAcceptsInputMethod, true);
+ }
+
+ QVariant inputMethodQuery(Qt::InputMethodQuery query) const
+ {
+ return mf;
+ }
+
+ static QRectF mf;
+};
+
+QRectF IMItem::mf(1.5, 1.6, 10, 10);
+
+void tst_QGraphicsView::QTBUG_16063_microFocusRect()
+{
+ QGraphicsScene scene;
+ IMItem *item = new IMItem();
+ scene.addItem(item);
+
+ QGraphicsView view(&scene);
+
+ view.setFixedSize(40, 40);
+ view.show();
+ QTest::qWaitForWindowShown(&view);
+
+ scene.setFocusItem(item);
+ view.setFocus();
+ QRectF mfv = view.inputMethodQuery(Qt::ImMicroFocus).toRectF();
+ QCOMPARE(mfv, IMItem::mf.translated(-view.mapToScene(view.sceneRect().toRect()).boundingRect().topLeft()));
+}
+
QTEST_MAIN(tst_QGraphicsView)
#include "tst_qgraphicsview.moc"
diff --git a/tests/auto/qhttp/qhttp.pro b/tests/auto/qhttp/qhttp.pro
index 5b102ce..49eebd5 100644
--- a/tests/auto/qhttp/qhttp.pro
+++ b/tests/auto/qhttp/qhttp.pro
@@ -11,7 +11,7 @@ wince*: {
cgi.path = webserver/cgi-bin
addFiles.files = rfc3252.txt trolltech
addFiles.path = .
- DEPLOYMENT = addFiles webFiles cgi
+ DEPLOYMENT += addFiles webFiles cgi
DEFINES += SRCDIR=\\\"\\\"
} else:symbian {
webFiles.files = webserver/*
@@ -20,7 +20,7 @@ wince*: {
cgi.path = webserver/cgi-bin
addFiles.files = rfc3252.txt trolltech
addFiles.path = .
- DEPLOYMENT = addFiles webFiles cgi
+ DEPLOYMENT += addFiles webFiles cgi
TARGET.CAPABILITY = NetworkServices
} else:vxworks*: {
DEFINES += SRCDIR=\\\"\\\"
diff --git a/tests/auto/qimage/tst_qimage.cpp b/tests/auto/qimage/tst_qimage.cpp
index 6cce05cd1..489a81d 100644
--- a/tests/auto/qimage/tst_qimage.cpp
+++ b/tests/auto/qimage/tst_qimage.cpp
@@ -149,6 +149,8 @@ private slots:
void rgbSwapped_data();
void rgbSwapped();
+
+ void deepCopyWhenPaintingActive();
};
tst_QImage::tst_QImage()
@@ -2013,5 +2015,19 @@ void tst_QImage::rgbSwapped()
QCOMPARE(memcmp(image.constBits(), imageSwappedTwice.constBits(), image.numBytes()), 0);
}
+void tst_QImage::deepCopyWhenPaintingActive()
+{
+ QImage image(64, 64, QImage::Format_ARGB32_Premultiplied);
+ image.fill(0);
+
+ QPainter painter(&image);
+ QImage copy = image;
+
+ painter.setBrush(Qt::black);
+ painter.drawEllipse(image.rect());
+
+ QVERIFY(copy != image);
+}
+
QTEST_MAIN(tst_QImage)
#include "tst_qimage.moc"
diff --git a/tests/auto/qimagereader/tst_qimagereader.cpp b/tests/auto/qimagereader/tst_qimagereader.cpp
index 4aff8d5..5742a97 100644
--- a/tests/auto/qimagereader/tst_qimagereader.cpp
+++ b/tests/auto/qimagereader/tst_qimagereader.cpp
@@ -1107,6 +1107,11 @@ void tst_QImageReader::readFromDevice()
QCOMPARE(image1, expectedImage);
}
+#if defined (Q_OS_SYMBIAN) && defined (__WINS__)
+ //the emulator hangs in socket write (this is a test bug, it assumes the TCP stack can accept a whole image to its buffers)
+ if(imageData.size() > 16384)
+ QSKIP("image larger than socket buffer (test needs to be rewritten)", SkipSingle);
+#endif
Server server(imageData);
QEventLoop loop;
connect(&server, SIGNAL(ready()), &loop, SLOT(quit()));
@@ -1258,7 +1263,10 @@ void tst_QImageReader::devicePosition()
buf.seek(preLen);
QImageReader reader(&buf, format);
QCOMPARE(expected, reader.read());
- if (format != "ppm" && format != "gif") // Known not to work
+ if (format != "ppm" &&
+ format != "pgm" &&
+ format != "pbm" &&
+ format != "gif") // Known not to work
QCOMPARE(buf.pos(), qint64(preLen+imageDataSize));
}
diff --git a/tests/auto/qinputcontext/qinputcontext.pro b/tests/auto/qinputcontext/qinputcontext.pro
index ec6831e..4b3ab96 100644
--- a/tests/auto/qinputcontext/qinputcontext.pro
+++ b/tests/auto/qinputcontext/qinputcontext.pro
@@ -1,6 +1,8 @@
load(qttest_p4)
SOURCES += tst_qinputcontext.cpp
+contains(QT_CONFIG, webkit):QT += webkit
+
symbian {
LIBS += -lws32 -lcone
}
diff --git a/tests/auto/qinputcontext/tst_qinputcontext.cpp b/tests/auto/qinputcontext/tst_qinputcontext.cpp
index 5a258a9..020f177 100644
--- a/tests/auto/qinputcontext/tst_qinputcontext.cpp
+++ b/tests/auto/qinputcontext/tst_qinputcontext.cpp
@@ -50,6 +50,13 @@
#include <qwindowsstyle.h>
#include <qdesktopwidget.h>
#include <qpushbutton.h>
+#include <qgraphicsview.h>
+#include <qgraphicsscene.h>
+
+#ifdef QT_WEBKIT_LIB
+#include <qwebview.h>
+#include <qgraphicswebview.h>
+#endif
#ifdef Q_OS_SYMBIAN
#include <private/qt_s60_p.h>
@@ -466,6 +473,115 @@ void tst_QInputContext::focusProxy()
QCOMPARE(gic->focusWidget(), &proxy);
}
+#ifdef QT_WEBKIT_LIB
+class AutoWebView : public QWebView
+{
+ Q_OBJECT
+
+public:
+ AutoWebView()
+ : m_length(0)
+ , m_mode(QLineEdit::Normal)
+ {
+ updatePage();
+ }
+ ~AutoWebView() {}
+
+ void updatePage()
+ {
+ // The update might reset the input method parameters.
+ bool imEnabled = testAttribute(Qt::WA_InputMethodEnabled);
+ Qt::InputMethodHints hints = inputMethodHints();
+
+ QString page = "<html><body onLoad=\"document.forms.testform.testinput.focus()\">"
+ "<form name=\"testform\"><input name=\"testinput\" type=\"%1\" %2></form></body></html>";
+ if (m_mode == QLineEdit::Password)
+ page = page.arg("password");
+ else
+ page = page.arg("text");
+
+ if (m_length == 0)
+ page = page.arg("");
+ else
+ page = page.arg("maxlength=\"" + QString::number(m_length) + "\"");
+
+ setHtml(page);
+
+ setAttribute(Qt::WA_InputMethodEnabled, imEnabled);
+ setInputMethodHints(hints);
+ }
+ void setMaxLength(int length)
+ {
+ m_length = length;
+ updatePage();
+ }
+ void setEchoMode(QLineEdit::EchoMode mode)
+ {
+ m_mode = mode;
+ updatePage();
+ }
+
+ int m_length;
+ QLineEdit::EchoMode m_mode;
+};
+
+class AutoGraphicsWebView : public QGraphicsView
+{
+ Q_OBJECT
+
+public:
+ AutoGraphicsWebView()
+ : m_length(0)
+ , m_mode(QLineEdit::Normal)
+ {
+ m_scene.addItem(&m_view);
+ setScene(&m_scene);
+ m_view.setFocus();
+ updatePage();
+ }
+ ~AutoGraphicsWebView() {}
+
+ void updatePage()
+ {
+ // The update might reset the input method parameters.
+ bool imEnabled = testAttribute(Qt::WA_InputMethodEnabled);
+ Qt::InputMethodHints hints = inputMethodHints();
+
+ QString page = "<html><body onLoad=\"document.forms.testform.testinput.focus()\">"
+ "<form name=\"testform\"><input name=\"testinput\" type=\"%1\" %2></form></body></html>";
+ if (m_mode == QLineEdit::Password)
+ page = page.arg("password");
+ else
+ page = page.arg("text");
+
+ if (m_length == 0)
+ page = page.arg("");
+ else
+ page = page.arg("maxlength=\"" + QString::number(m_length) + "\"");
+
+ m_view.setHtml(page);
+
+ setAttribute(Qt::WA_InputMethodEnabled, imEnabled);
+ setInputMethodHints(hints);
+ }
+ void setMaxLength(int length)
+ {
+ m_length = length;
+ updatePage();
+ }
+ void setEchoMode(QLineEdit::EchoMode mode)
+ {
+ m_mode = mode;
+ updatePage();
+ }
+
+ int m_length;
+ QLineEdit::EchoMode m_mode;
+ QGraphicsScene m_scene;
+ QGraphicsWebView m_view;
+};
+#endif // QT_WEBKIT_LIB
+
void tst_QInputContext::symbianTestCoeFepInputContext_data()
{
#ifdef Q_OS_SYMBIAN
@@ -481,6 +597,10 @@ void tst_QInputContext::symbianTestCoeFepInputContext_data()
symbianTestCoeFepInputContext_addData<QLineEdit>();
symbianTestCoeFepInputContext_addData<QPlainTextEdit>();
symbianTestCoeFepInputContext_addData<QTextEdit>();
+# ifdef QT_WEBKIT_LIB
+ symbianTestCoeFepInputContext_addData<AutoWebView>();
+ symbianTestCoeFepInputContext_addData<AutoGraphicsWebView>();
+# endif
#endif
}
@@ -1087,13 +1207,28 @@ void tst_QInputContext::symbianTestCoeFepInputContext()
editwidget->setAttribute(Qt::WA_InputMethodEnabled, inputMethodEnabled);
editwidget->setInputMethodHints(inputMethodHints);
- QLineEdit *lineedit = qobject_cast<QLineEdit *>(editwidget);
- if (lineedit) {
+ if (QLineEdit *lineedit = qobject_cast<QLineEdit *>(editwidget)) {
if (maxLength > 0)
lineedit->setMaxLength(maxLength);
lineedit->setEchoMode(echoMode);
+#ifdef QT_WEBKIT_LIB
+ } else if (AutoWebView *webView = qobject_cast<AutoWebView *>(editwidget)) {
+ if (maxLength > 0)
+ webView->setMaxLength(maxLength);
+ webView->setEchoMode(echoMode);
+ // WebKit disables T9 everywhere.
+ if (inputMethodEnabled && !(inputMethodHints & Qt::ImhNoPredictiveText))
+ return;
+ } else if (AutoGraphicsWebView *webView = qobject_cast<AutoGraphicsWebView *>(editwidget)) {
+ if (maxLength > 0)
+ webView->setMaxLength(maxLength);
+ webView->setEchoMode(echoMode);
+ // WebKit disables T9 everywhere.
+ if (inputMethodEnabled && !(inputMethodHints & Qt::ImhNoPredictiveText))
+ return;
+#endif
} else if (maxLength > 0 || echoMode != QLineEdit::Normal) {
- // Only QLineEdits support these features so don't attempt any tests using those
+ // Only some widgets support these features so don't attempt any tests using those
// on other widgets.
return;
}
diff --git a/tests/auto/qlocalsocket/test/test.pro b/tests/auto/qlocalsocket/test/test.pro
index f91fe58..b2755b5 100644
--- a/tests/auto/qlocalsocket/test/test.pro
+++ b/tests/auto/qlocalsocket/test/test.pro
@@ -42,7 +42,7 @@ symbian {
wince*|symbian {
scriptFiles.files = ../lackey/scripts/*.js
scriptFiles.path = lackey/scripts
- DEPLOYMENT = additionalFiles scriptFiles
+ DEPLOYMENT += additionalFiles scriptFiles
QT += script # for easy deployment of QtScript
requires(contains(QT_CONFIG,script))
diff --git a/tests/auto/qmessagebox/tst_qmessagebox.cpp b/tests/auto/qmessagebox/tst_qmessagebox.cpp
index d4ca064..4bc1a28 100644
--- a/tests/auto/qmessagebox/tst_qmessagebox.cpp
+++ b/tests/auto/qmessagebox/tst_qmessagebox.cpp
@@ -47,6 +47,7 @@
#include <QTimer>
#include <QApplication>
#include <QPushButton>
+#include <QDialogButtonBox>
#if defined(Q_WS_MAC) && !defined(QT_NO_STYLE_MAC)
#include <QMacStyle>
#endif
@@ -54,6 +55,8 @@
#include <QCleanlooksStyle>
#endif
+#include "../../shared/util.h"
+
//TESTED_CLASS=
//TESTED_FILES=
@@ -106,7 +109,7 @@ class tst_QMessageBox : public QObject
public:
tst_QMessageBox();
int exec(QMessageBox *msgBox, int key = -1);
- int sendReturn();
+ void sendKeySoon();
public slots:
void sendKey();
@@ -119,6 +122,7 @@ private slots:
void statics();
void about();
void detailsText();
+ void detailsButtonText();
void shortcut();
@@ -134,8 +138,12 @@ private slots:
void setInformativeText();
void iconPixmap();
+ void init();
+ void initTestCase();
+
private:
int keyToSend;
+ QTimer keySendTimer;
};
tst_QMessageBox::tst_QMessageBox() : keyToSend(-1)
@@ -150,22 +158,16 @@ int tst_QMessageBox::exec(QMessageBox *msgBox, int key)
QTimer::singleShot(1000, msgBox, SLOT(close()));
} else {
keyToSend = key;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
}
return msgBox->exec();
}
-int tst_QMessageBox::sendReturn()
-{
- keyToSend = Qt::Key_Return;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
- return 0;
-}
-
void tst_QMessageBox::sendKey()
{
if (keyToSend == -2) {
QApplication::activeModalWidget()->close();
+ keyToSend = -1;
return;
}
if (keyToSend == -1)
@@ -175,6 +177,24 @@ void tst_QMessageBox::sendKey()
keyToSend = -1;
}
+void tst_QMessageBox::sendKeySoon()
+{
+ keySendTimer.start();
+}
+
+void tst_QMessageBox::init()
+{
+ // if there is any pending key send from the last test, cancel it.
+ keySendTimer.stop();
+}
+
+void tst_QMessageBox::initTestCase()
+{
+ keySendTimer.setInterval(1000);
+ keySendTimer.setSingleShot(true);
+ QVERIFY(QObject::connect(&keySendTimer, SIGNAL(timeout()), this, SLOT(sendKey())));
+}
+
void tst_QMessageBox::sanityTest()
{
QMessageBox msgBox;
@@ -315,32 +335,36 @@ void tst_QMessageBox::statics()
for (int i = 0; i < 4; i++) {
keyToSend = Qt::Key_Escape;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
QMessageBox::StandardButton sb = (*statics[i])(0, "caption",
"text", QMessageBox::Yes | QMessageBox::No | QMessageBox::Help | QMessageBox::Cancel,
QMessageBox::NoButton);
QCOMPARE(sb, QMessageBox::Cancel);
+ QCOMPARE(keyToSend, -1);
keyToSend = -2; // close()
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
sb = (*statics[i])(0, "caption",
"text", QMessageBox::Yes | QMessageBox::No | QMessageBox::Help | QMessageBox::Cancel,
QMessageBox::NoButton);
QCOMPARE(sb, QMessageBox::Cancel);
+ QCOMPARE(keyToSend, -1);
keyToSend = Qt::Key_Enter;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
sb = (*statics[i])(0, "caption",
"text", QMessageBox::Yes | QMessageBox::No | QMessageBox::Help,
QMessageBox::Yes);
QCOMPARE(sb, QMessageBox::Yes);
+ QCOMPARE(keyToSend, -1);
keyToSend = Qt::Key_Enter;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
sb = (*statics[i])(0, "caption",
"text", QMessageBox::Yes | QMessageBox::No | QMessageBox::Help,
QMessageBox::No);
QCOMPARE(sb, QMessageBox::No);
+ QCOMPARE(keyToSend, -1);
}
}
@@ -359,16 +383,28 @@ void tst_QMessageBox::shortcut()
void tst_QMessageBox::about()
{
keyToSend = Qt::Key_Escape;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
QMessageBox::about(0, "Caption", "This is an auto test");
+ // On Mac, about and aboutQt are not modal, so we need to
+ // explicitly run the event loop
+#ifdef Q_WS_MAC
+ QTRY_COMPARE(keyToSend, -1);
+#else
+ QCOMPARE(keyToSend, -1);
+#endif
#if !defined(Q_OS_WINCE)
keyToSend = Qt::Key_Enter;
#else
keyToSend = Qt::Key_Escape;
#endif
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
QMessageBox::aboutQt(0, "Caption");
+#ifdef Q_WS_MAC
+ QTRY_COMPARE(keyToSend, -1);
+#else
+ QCOMPARE(keyToSend, -1);
+#endif
}
// Old message box enums
@@ -390,7 +426,7 @@ void tst_QMessageBox::staticSourceCompat()
// source compat tests for < 4.2
keyToSend = Qt::Key_Enter;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", QMessageBox::Yes, QMessageBox::No);
int expectedButton = int(QMessageBox::Yes);
#if defined(Q_WS_MAC) && !defined(QT_NO_STYLE_MAC)
@@ -401,43 +437,51 @@ void tst_QMessageBox::staticSourceCompat()
expectedButton = int(QMessageBox::No);
#endif
QCOMPARE(ret, expectedButton);
+ QCOMPARE(keyToSend, -1);
keyToSend = Qt::Key_Enter;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", QMessageBox::Yes | QMessageBox::Default, QMessageBox::No);
QCOMPARE(ret, int(QMessageBox::Yes));
+ QCOMPARE(keyToSend, -1);
keyToSend = Qt::Key_Enter;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", QMessageBox::Yes, QMessageBox::No | QMessageBox::Default);
QCOMPARE(ret, int(QMessageBox::No));
+ QCOMPARE(keyToSend, -1);
keyToSend = Qt::Key_Enter;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", QMessageBox::Yes | QMessageBox::Default, QMessageBox::No | QMessageBox::Escape);
QCOMPARE(ret, int(QMessageBox::Yes));
+ QCOMPARE(keyToSend, -1);
keyToSend = Qt::Key_Enter;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", QMessageBox::Yes | QMessageBox::Escape, QMessageBox::No | QMessageBox::Default);
QCOMPARE(ret, int(QMessageBox::No));
+ QCOMPARE(keyToSend, -1);
// the button text versions
keyToSend = Qt::Key_Enter;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", "Yes", "No", QString(), 1);
QCOMPARE(ret, 1);
+ QCOMPARE(keyToSend, -1);
if (0) { // dont run these tests since the dialog wont close!
keyToSend = Qt::Key_Escape;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", "Yes", "No", QString(), 1);
QCOMPARE(ret, -1);
+ QCOMPARE(keyToSend, -1);
keyToSend = Qt::Key_Escape;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", "Yes", "No", QString(), 0, 1);
QCOMPARE(ret, 1);
+ QCOMPARE(keyToSend, -1);
}
}
@@ -470,7 +514,7 @@ void tst_QMessageBox::staticBinaryCompat()
// binary compat tests for < 4.2
keyToSend = Qt::Key_Enter;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", Old_Yes, Old_No, 0);
int expectedButton = int(Old_Yes);
#if defined(Q_WS_MAC) && !defined(QT_NO_STYLE_MAC)
@@ -481,33 +525,39 @@ void tst_QMessageBox::staticBinaryCompat()
expectedButton = int(Old_No);
#endif
QCOMPARE(ret, expectedButton);
+ QCOMPARE(keyToSend, -1);
keyToSend = Qt::Key_Escape;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", Old_Yes | Old_Escape, Old_No, 0);
QCOMPARE(ret, int(Old_Yes));
+ QCOMPARE(keyToSend, -1);
keyToSend = Qt::Key_Enter;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", Old_Yes | Old_Default, Old_No, 0);
QCOMPARE(ret, int(Old_Yes));
+ QCOMPARE(keyToSend, -1);
#if 0
keyToSend = Qt::Key_Escape;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", Old_Yes, Old_No | Old_Default, 0);
QCOMPARE(ret, -1);
+ QCOMPARE(keyToSend, -1);
#endif
keyToSend = Qt::Key_Escape;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", Old_Yes | Old_Escape, Old_No | Old_Default, 0);
QCOMPARE(ret, Old_Yes);
+ QCOMPARE(keyToSend, -1);
keyToSend = Qt::Key_Escape;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
ret = QMessageBox::information(0, "title", "text", Old_Yes | Old_Default, Old_No | Old_Escape, 0);
QCOMPARE(ret, Old_No);
+ QCOMPARE(keyToSend, -1);
}
@@ -661,25 +711,49 @@ void tst_QMessageBox::detailsText()
QCOMPARE(box.detailedText(), text);
}
+void tst_QMessageBox::detailsButtonText()
+{
+ QMessageBox box;
+ box.setDetailedText("bla");
+ box.open();
+ QApplication::postEvent(&box, new QEvent(QEvent::LanguageChange));
+ QApplication::processEvents();
+ QDialogButtonBox* bb = box.findChild<QDialogButtonBox*>("qt_msgbox_buttonbox");
+ QVERIFY(bb); //get the detail button
+
+ QList<QAbstractButton *> list = bb->buttons();
+ QAbstractButton* btn = NULL;
+ foreach(btn, list) {
+ if (btn && (btn->inherits("QPushButton"))) {
+ if (btn->text() != QMessageBox::tr("OK") && btn->text() != QMessageBox::tr("Show Details...")) {
+ QFAIL(qPrintable(QString("Unexpected messagebox button text: %1").arg(btn->text())));
+ }
+ }
+ }
+}
+
void tst_QMessageBox::incorrectDefaultButton()
{
keyToSend = Qt::Key_Escape;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
//Do not crash here
QTest::ignoreMessage(QtWarningMsg, "QDialogButtonBox::createButton: Invalid ButtonRole, button not added");
QMessageBox::question( 0, "", "I've been hit!",QMessageBox::Ok | QMessageBox::Cancel,QMessageBox::Save );
+ QCOMPARE(keyToSend, -1);
keyToSend = Qt::Key_Escape;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
QTest::ignoreMessage(QtWarningMsg, "QDialogButtonBox::createButton: Invalid ButtonRole, button not added");
QMessageBox::question( 0, "", "I've been hit!",QFlag(QMessageBox::Ok | QMessageBox::Cancel),QMessageBox::Save );
+ QCOMPARE(keyToSend, -1);
keyToSend = Qt::Key_Escape;
- QTimer::singleShot(1000, this, SLOT(sendKey()));
+ sendKeySoon();
QTest::ignoreMessage(QtWarningMsg, "QDialogButtonBox::createButton: Invalid ButtonRole, button not added");
QTest::ignoreMessage(QtWarningMsg, "QDialogButtonBox::createButton: Invalid ButtonRole, button not added");
//do not crash here -> call old function of QMessageBox in this case
QMessageBox::question( 0, "", "I've been hit!",QMessageBox::Ok | QMessageBox::Cancel,QMessageBox::Save | QMessageBox::Cancel,QMessageBox::Ok);
+ QCOMPARE(keyToSend, -1);
}
void tst_QMessageBox::updateSize()
diff --git a/tests/auto/qmovie/animations/corrupt.gif b/tests/auto/qmovie/animations/corrupt.gif
new file mode 100644
index 0000000..c1545eb
--- /dev/null
+++ b/tests/auto/qmovie/animations/corrupt.gif
Binary files differ
diff --git a/tests/auto/qmovie/qmovie.pro b/tests/auto/qmovie/qmovie.pro
index 6973955..855eb9e 100644
--- a/tests/auto/qmovie/qmovie.pro
+++ b/tests/auto/qmovie/qmovie.pro
@@ -12,6 +12,7 @@ wince*: {
DEPLOYMENT += addFiles
}
+RESOURCES += resources.qrc
symbian: {
addFiles.files = animations\\*
diff --git a/tests/auto/qmovie/resources.qrc b/tests/auto/qmovie/resources.qrc
new file mode 100644
index 0000000..ce459a0
--- /dev/null
+++ b/tests/auto/qmovie/resources.qrc
@@ -0,0 +1,5 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file>animations/corrupt.gif</file>
+</qresource>
+</RCC>
diff --git a/tests/auto/qmovie/tst_qmovie.cpp b/tests/auto/qmovie/tst_qmovie.cpp
index 80a551b..d43d4cb 100644
--- a/tests/auto/qmovie/tst_qmovie.cpp
+++ b/tests/auto/qmovie/tst_qmovie.cpp
@@ -72,6 +72,7 @@ private slots:
void jumpToFrame_data();
void jumpToFrame();
void changeMovieFile();
+ void infiniteLoop();
};
// Testing get/set functions
@@ -208,5 +209,17 @@ void tst_QMovie::changeMovieFile()
QVERIFY(movie.currentFrameNumber() == -1);
}
+void tst_QMovie::infiniteLoop()
+{
+ QLabel label;
+ label.show();
+ QMovie *movie = new QMovie(QLatin1String(":animations/corrupt.gif"), QByteArray(), &label);
+ label.setMovie(movie);
+ movie->start();
+
+ QTestEventLoop::instance().enterLoop(1);
+ QTestEventLoop::instance().timeout();
+}
+
QTEST_MAIN(tst_QMovie)
#include "tst_qmovie.moc"
diff --git a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
index fff7f66..c796272 100644
--- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
@@ -84,6 +84,8 @@ Q_DECLARE_METATYPE(QList<QNetworkProxy>)
Q_DECLARE_METATYPE(QNetworkReply::NetworkError)
Q_DECLARE_METATYPE(QBuffer*)
+const int SynchronousRequestAttribute = QNetworkRequest::DownloadBufferAttribute + 1;
+
class QNetworkReplyPtr: public QSharedPointer<QNetworkReply>
{
public:
@@ -108,6 +110,16 @@ class tst_QNetworkReply: public QObject
bool requiresAuthentication;
};
+ static bool seedCreated;
+ static QString createUniqueExtension() {
+ if (!seedCreated) {
+ qsrand(QTime(0,0,0).msecsTo(QTime::currentTime()) + QCoreApplication::applicationPid());
+ seedCreated = true; // not thread-safe, but who cares
+ }
+ QString s = QString("%1-%2-%3").arg(QTime(0,0,0).msecsTo(QTime::currentTime())).arg(QCoreApplication::applicationPid()).arg(qrand());
+ return s;
+ };
+
QEventLoop *loop;
enum RunSimpleRequestReturn { Timeout = 0, Success, Failure };
int returnCode;
@@ -173,8 +185,12 @@ private Q_SLOTS:
void putToFtp();
void putToHttp_data();
void putToHttp();
+ void putToHttpSynchronous_data();
+ void putToHttpSynchronous();
void postToHttp_data();
void postToHttp();
+ void postToHttpSynchronous_data();
+ void postToHttpSynchronous();
void deleteFromHttp_data();
void deleteFromHttp();
void putGetDeleteGetFromHttp_data();
@@ -198,7 +214,9 @@ private Q_SLOTS:
void ioGetFromHttpWithReuseParallel();
void ioGetFromHttpWithReuseSequential();
void ioGetFromHttpWithAuth();
+ void ioGetFromHttpWithAuthSynchronous();
void ioGetFromHttpWithProxyAuth();
+ void ioGetFromHttpWithProxyAuthSynchronous();
void ioGetFromHttpWithSocksProxy();
#ifndef QT_NO_OPENSSL
void ioGetFromHttpsWithSslErrors();
@@ -233,6 +251,8 @@ private Q_SLOTS:
void ioPostToHttpFromFile();
void ioPostToHttpFromSocket_data();
void ioPostToHttpFromSocket();
+ void ioPostToHttpFromSocketSynchronous();
+ void ioPostToHttpFromSocketSynchronous_data();
void ioPostToHttpFromMiddleOfFileToEnd();
void ioPostToHttpFromMiddleOfFileFiveBytes();
void ioPostToHttpFromMiddleOfQBufferFiveBytes();
@@ -258,13 +278,19 @@ private Q_SLOTS:
void receiveCookiesFromHttp_data();
void receiveCookiesFromHttp();
+ void receiveCookiesFromHttpSynchronous_data();
+ void receiveCookiesFromHttpSynchronous();
void sendCookies_data();
void sendCookies();
+ void sendCookiesSynchronous_data();
+ void sendCookiesSynchronous();
void nestedEventLoops();
void httpProxyCommands_data();
void httpProxyCommands();
+ void httpProxyCommandsSynchronous_data();
+ void httpProxyCommandsSynchronous();
void proxyChange();
void authorizationError_data();
void authorizationError();
@@ -311,10 +337,16 @@ private Q_SLOTS:
void qtbug15311doubleContentLength();
+ void synchronousRequest_data();
+ void synchronousRequest();
+ void synchronousRequestSslFailure();
+
// NOTE: This test must be last!
void parentingRepliesToTheApp();
};
+bool tst_QNetworkReply::seedCreated = false;
+
QT_BEGIN_NAMESPACE
namespace QTest {
@@ -923,14 +955,15 @@ protected:
tst_QNetworkReply::tst_QNetworkReply()
{
+ qRegisterMetaType<QNetworkReply *>(); // for QSignalSpy
+ qRegisterMetaType<QAuthenticator *>();
+ qRegisterMetaType<QNetworkProxy>();
+ qRegisterMetaType<QList<QSslError> >();
+
Q_SET_DEFAULT_IAP
testFileName = QDir::currentPath() + "/testfile";
-#ifndef Q_OS_WINCE
- uniqueExtension = QString("%1%2%3").arg((qulonglong)this).arg(rand()).arg((qulonglong)time(0));
-#else
- uniqueExtension = QString("%1%2").arg((qulonglong)this).arg(rand());
-#endif
+ uniqueExtension = createUniqueExtension();
cookieJar = new MyCookieJar;
manager.setCookieJar(cookieJar);
@@ -1017,15 +1050,25 @@ QString tst_QNetworkReply::runSimpleRequest(QNetworkAccessManager::Operation op,
Q_ASSERT_X(false, "tst_QNetworkReply", "Invalid/unknown operation requested");
}
reply->setParent(this);
- connect(reply, SIGNAL(finished()), SLOT(finished()));
- connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(gotError()));
returnCode = Timeout;
- loop = new QEventLoop;
- QTimer::singleShot(20000, loop, SLOT(quit()));
- int code = returnCode == Timeout ? loop->exec() : returnCode;
- delete loop;
- loop = 0;
+ int code = Success;
+
+ if (request.attribute(static_cast<QNetworkRequest::Attribute>(SynchronousRequestAttribute)).toBool()) {
+ if (reply->isFinished())
+ code = reply->error() != QNetworkReply::NoError ? Failure : Success;
+ else
+ code = Failure;
+ } else {
+ connect(reply, SIGNAL(finished()), SLOT(finished()));
+ connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(gotError()));
+
+ loop = new QEventLoop;
+ QTimer::singleShot(20000, loop, SLOT(quit()));
+ code = returnCode == Timeout ? loop->exec() : returnCode;
+ delete loop;
+ loop = 0;
+ }
switch (code) {
case Failure:
@@ -1506,6 +1549,9 @@ void tst_QNetworkReply::putToFile_data()
data = QByteArray(128*1024+1, '\177');
QTest::newRow("128k+1") << data << md5sum(data);
+
+ data = QByteArray(2*1024*1024+1, '\177');
+ QTest::newRow("2MB+1") << data << md5sum(data);
}
void tst_QNetworkReply::putToFile()
@@ -1612,6 +1658,47 @@ void tst_QNetworkReply::putToHttp()
QCOMPARE(uploadedData, data);
}
+void tst_QNetworkReply::putToHttpSynchronous_data()
+{
+ uniqueExtension = createUniqueExtension();
+ putToFile_data();
+}
+
+void tst_QNetworkReply::putToHttpSynchronous()
+{
+ QUrl url("http://" + QtNetworkSettings::serverName());
+ url.setPath(QString("/dav/qnetworkaccess-putToHttp-%1-%2")
+ .arg(QTest::currentDataTag())
+ .arg(uniqueExtension));
+
+ QNetworkRequest request(url);
+ QNetworkReplyPtr reply;
+
+ QFETCH(QByteArray, data);
+
+ request.setAttribute(
+ static_cast<QNetworkRequest::Attribute>(SynchronousRequestAttribute),
+ true);
+
+ RUN_REQUEST(runSimpleRequest(QNetworkAccessManager::PutOperation, request, reply, data));
+
+ QCOMPARE(reply->url(), url);
+ QCOMPARE(reply->error(), QNetworkReply::NoError);
+
+ QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 201); // 201 Created
+
+ // download the file again from HTTP to make sure it was uploaded
+ // correctly. HTTP/0.9 is enough
+ QTcpSocket socket;
+ socket.connectToHost(QtNetworkSettings::serverName(), 80);
+ socket.write("GET " + url.toEncoded(QUrl::RemoveScheme | QUrl::RemoveAuthority) + "\r\n");
+ if (!socket.waitForDisconnected(10000))
+ QFAIL("Network timeout");
+
+ QByteArray uploadedData = socket.readAll();
+ QCOMPARE(uploadedData, data);
+}
+
void tst_QNetworkReply::postToHttp_data()
{
putToFile_data();
@@ -1638,6 +1725,37 @@ void tst_QNetworkReply::postToHttp()
QCOMPARE(uploadedData, md5sum.toHex());
}
+void tst_QNetworkReply::postToHttpSynchronous_data()
+{
+ putToFile_data();
+}
+
+void tst_QNetworkReply::postToHttpSynchronous()
+{
+ QUrl url("http://" + QtNetworkSettings::serverName() + "/qtest/cgi-bin/md5sum.cgi");
+
+ QNetworkRequest request(url);
+
+ request.setAttribute(
+ static_cast<QNetworkRequest::Attribute>(SynchronousRequestAttribute),
+ true);
+
+ QNetworkReplyPtr reply;
+
+ QFETCH(QByteArray, data);
+
+ RUN_REQUEST(runSimpleRequest(QNetworkAccessManager::PostOperation, request, reply, data));
+
+ QCOMPARE(reply->url(), url);
+ QCOMPARE(reply->error(), QNetworkReply::NoError);
+
+ QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200); // 200 Ok
+
+ QFETCH(QByteArray, md5sum);
+ QByteArray uploadedData = reply->readAll().trimmed();
+ QCOMPARE(uploadedData, md5sum.toHex());
+}
+
void tst_QNetworkReply::deleteFromHttp_data()
{
QTest::addColumn<QUrl>("url");
@@ -2062,9 +2180,6 @@ void tst_QNetworkReply::ioGetFromHttpWithReuseSequential()
void tst_QNetworkReply::ioGetFromHttpWithAuth()
{
- qRegisterMetaType<QNetworkReply *>(); // for QSignalSpy
- qRegisterMetaType<QAuthenticator *>();
-
// This test sends three requests
// The first two in parallel
// The third after the first two finished
@@ -2123,6 +2238,44 @@ void tst_QNetworkReply::ioGetFromHttpWithAuth()
QCOMPARE(authspy.count(), 0);
}
+
+ // now check with synchronous calls:
+ reference.seek(0);
+ {
+ request.setAttribute(
+ static_cast<QNetworkRequest::Attribute>(SynchronousRequestAttribute),
+ true);
+
+ QSignalSpy authspy(&manager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)));
+ QNetworkReplyPtr replySync = manager.get(request);
+ QVERIFY(replySync->isFinished()); // synchronous
+ QCOMPARE(authspy.count(), 0);
+
+ // we cannot use a data reader here, since that connects to the readyRead signal,
+ // just use readAll()
+
+ // 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());
+ }
+}
+
+void tst_QNetworkReply::ioGetFromHttpWithAuthSynchronous()
+{
+ // verify that we do not enter an endless loop with synchronous calls and wrong credentials
+ // the case when we succed with the login is tested in ioGetFromHttpWithAuth()
+
+ QNetworkRequest request(QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/rfcs-auth/rfc3252.txt"));
+ request.setAttribute(
+ static_cast<QNetworkRequest::Attribute>(SynchronousRequestAttribute),
+ true);
+
+ QSignalSpy authspy(&manager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)));
+ QNetworkReplyPtr replySync = manager.get(request);
+ QVERIFY(replySync->isFinished()); // synchronous
+ QCOMPARE(replySync->error(), QNetworkReply::AuthenticationRequiredError);
+ QCOMPARE(authspy.count(), 0);
+ QCOMPARE(replySync->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 401);
}
void tst_QNetworkReply::ioGetFromHttpWithProxyAuth()
@@ -2194,6 +2347,47 @@ void tst_QNetworkReply::ioGetFromHttpWithProxyAuth()
QCOMPARE(authspy.count(), 0);
}
+
+ // now check with synchronous calls:
+ reference.seek(0);
+ {
+ request.setAttribute(
+ static_cast<QNetworkRequest::Attribute>(SynchronousRequestAttribute),
+ true);
+
+ QSignalSpy authspy(&manager, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)));
+ QNetworkReplyPtr replySync = manager.get(request);
+ QVERIFY(replySync->isFinished()); // synchronous
+ QCOMPARE(authspy.count(), 0);
+
+ // we cannot use a data reader here, since that connects to the readyRead signal,
+ // just use readAll()
+
+ // the only thing we check here is that the proxy auth cache was used when using synchronous requests
+ QCOMPARE(replySync->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200);
+ QCOMPARE(replySync->readAll(), reference.readAll());
+ }
+}
+
+void tst_QNetworkReply::ioGetFromHttpWithProxyAuthSynchronous()
+{
+ // verify that we do not enter an endless loop with synchronous calls and wrong credentials
+ // the case when we succed with the login is tested in ioGetFromHttpWithAuth()
+
+ QNetworkProxy proxy(QNetworkProxy::HttpCachingProxy, QtNetworkSettings::serverName(), 3129);
+ QNetworkRequest request(QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt"));
+ manager.setProxy(proxy);
+ request.setAttribute(
+ static_cast<QNetworkRequest::Attribute>(SynchronousRequestAttribute),
+ true);
+
+ QSignalSpy authspy(&manager, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)));
+ QNetworkReplyPtr replySync = manager.get(request);
+ manager.setProxy(QNetworkProxy()); // reset
+ QVERIFY(replySync->isFinished()); // synchronous
+ QCOMPARE(replySync->error(), QNetworkReply::ProxyAuthenticationRequiredError);
+ QCOMPARE(authspy.count(), 0);
+ QCOMPARE(replySync->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 407);
}
void tst_QNetworkReply::ioGetFromHttpWithSocksProxy()
@@ -3252,7 +3446,67 @@ void tst_QNetworkReply::ioPostToHttpFromSocket()
QTEST(authenticationRequiredSpy.count(), "authenticationRequiredCount");
QTEST(proxyAuthenticationRequiredSpy.count(), "proxyAuthenticationRequiredCount");
- }
+}
+
+void tst_QNetworkReply::ioPostToHttpFromSocketSynchronous_data()
+{
+ QTest::addColumn<QByteArray>("data");
+ QTest::addColumn<QByteArray>("md5sum");
+
+ QByteArray data;
+ data = "";
+ QTest::newRow("empty") << data << md5sum(data);
+
+ data = "This is a normal message.";
+ QTest::newRow("generic") << data << md5sum(data);
+
+ data = "This is a message to show that Qt rocks!\r\n\n";
+ QTest::newRow("small") << data << md5sum(data);
+
+ data = QByteArray("abcd\0\1\2\abcd",12);
+ QTest::newRow("with-nul") << data << md5sum(data);
+
+ data = QByteArray(4097, '\4');
+ QTest::newRow("4k+1") << data << md5sum(data);
+
+ data = QByteArray(128*1024+1, '\177');
+ QTest::newRow("128k+1") << data << md5sum(data);
+
+ data = QByteArray(2*1024*1024+1, '\177');
+ QTest::newRow("2MB+1") << data << md5sum(data);
+}
+
+void tst_QNetworkReply::ioPostToHttpFromSocketSynchronous()
+{
+ QFETCH(QByteArray, data);
+
+ SocketPair socketpair;
+ QVERIFY(socketpair.create());
+ QVERIFY(socketpair.endPoints[0] && socketpair.endPoints[1]);
+ socketpair.endPoints[0]->write(data);
+ socketpair.endPoints[0]->waitForBytesWritten(5000);
+ // ### for 4.8: make the socket pair unbuffered, to not read everything in one go in QNetworkReplyImplPrivate::setup()
+ QTestEventLoop::instance().enterLoop(3);
+
+ QUrl url("http://" + QtNetworkSettings::serverName() + "/qtest/cgi-bin/md5sum.cgi");
+ QNetworkRequest request(url);
+ request.setAttribute(
+ static_cast<QNetworkRequest::Attribute>(SynchronousRequestAttribute),
+ true);
+
+ QNetworkReplyPtr reply = manager.post(request, socketpair.endPoints[1]);
+ QVERIFY(reply->isFinished());
+ socketpair.endPoints[0]->close();
+
+ QCOMPARE(reply->error(), QNetworkReply::NoError);
+
+ QCOMPARE(reply->url(), url);
+ QCOMPARE(reply->error(), QNetworkReply::NoError);
+ // verify that the HTTP status code is 200 Ok
+ QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200);
+
+ QCOMPARE(reply->readAll().trimmed(), md5sum(data).toHex());
+}
// this tests checks if rewinding the POST-data to some place in the middle
// worked.
@@ -3995,6 +4249,38 @@ void tst_QNetworkReply::receiveCookiesFromHttp()
QTEST(cookieJar->allCookies(), "expectedCookiesInJar");
}
+void tst_QNetworkReply::receiveCookiesFromHttpSynchronous_data()
+{
+ tst_QNetworkReply::receiveCookiesFromHttp_data();
+}
+
+void tst_QNetworkReply::receiveCookiesFromHttpSynchronous()
+{
+ QFETCH(QString, cookieString);
+
+ QByteArray data = cookieString.toLatin1() + '\n';
+ QUrl url("http://" + QtNetworkSettings::serverName() + "/qtest/cgi-bin/set-cookie.cgi");
+
+ QNetworkRequest request(url);
+
+ request.setAttribute(
+ static_cast<QNetworkRequest::Attribute>(SynchronousRequestAttribute),
+ true);
+
+ QNetworkReplyPtr reply;
+ RUN_REQUEST(runSimpleRequest(QNetworkAccessManager::PostOperation, request, reply, data));
+
+ QCOMPARE(reply->url(), url);
+ QCOMPARE(reply->error(), QNetworkReply::NoError);
+
+ QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200); // 200 Ok
+
+ QList<QNetworkCookie> setCookies =
+ qvariant_cast<QList<QNetworkCookie> >(reply->header(QNetworkRequest::SetCookieHeader));
+ QTEST(setCookies, "expectedCookiesFromHttp");
+ QTEST(cookieJar->allCookies(), "expectedCookiesInJar");
+}
+
void tst_QNetworkReply::sendCookies_data()
{
QTest::addColumn<QList<QNetworkCookie> >("cookiesToSet");
@@ -4055,6 +4341,35 @@ void tst_QNetworkReply::sendCookies()
QCOMPARE(QString::fromLatin1(reply->readAll()).trimmed(), expectedCookieString);
}
+void tst_QNetworkReply::sendCookiesSynchronous_data()
+{
+ tst_QNetworkReply::sendCookies_data();
+}
+
+void tst_QNetworkReply::sendCookiesSynchronous()
+{
+ QFETCH(QString, expectedCookieString);
+ QFETCH(QList<QNetworkCookie>, cookiesToSet);
+ cookieJar->setAllCookies(cookiesToSet);
+
+ QUrl url("http://" + QtNetworkSettings::serverName() + "/qtest/cgi-bin/get-cookie.cgi");
+ QNetworkRequest request(url);
+
+ request.setAttribute(
+ static_cast<QNetworkRequest::Attribute>(SynchronousRequestAttribute),
+ true);
+
+ QNetworkReplyPtr reply;
+ RUN_REQUEST(runSimpleRequest(QNetworkAccessManager::GetOperation, request, reply));
+
+ QCOMPARE(reply->url(), url);
+ QCOMPARE(reply->error(), QNetworkReply::NoError);
+
+ QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200); // 200 Ok
+
+ QCOMPARE(QString::fromLatin1(reply->readAll()).trimmed(), expectedCookieString);
+}
+
void tst_QNetworkReply::nestedEventLoops_slot()
{
QEventLoop subloop;
@@ -4158,6 +4473,50 @@ private:
int signalCount;
};
+void tst_QNetworkReply::httpProxyCommandsSynchronous_data()
+{
+ httpProxyCommands_data();
+}
+
+void tst_QNetworkReply::httpProxyCommandsSynchronous()
+{
+ QFETCH(QUrl, url);
+ QFETCH(QByteArray, responseToSend);
+ QFETCH(QString, expectedCommand);
+
+ // when using synchronous commands, we need a different event loop for
+ // the server thread, because the client is never returning to the
+ // event loop
+ MiniHttpServer proxyServer(responseToSend);
+ QThread serverThread;
+ proxyServer.moveToThread(&serverThread);
+ serverThread.start();
+ QNetworkProxy proxy(QNetworkProxy::HttpProxy, "127.0.0.1", proxyServer.serverPort());
+
+ manager.setProxy(proxy);
+ QNetworkRequest request(url);
+
+ // send synchronous request
+ request.setAttribute(
+ static_cast<QNetworkRequest::Attribute>(SynchronousRequestAttribute),
+ true);
+
+ QNetworkReplyPtr reply = manager.get(request);
+ QVERIFY(reply->isFinished()); // synchronous
+ manager.setProxy(QNetworkProxy());
+ serverThread.quit();
+ serverThread.wait(3000);
+
+ //qDebug() << reply->error() << reply->errorString();
+
+ // we don't really care if the request succeeded
+ // especially since it won't succeed in the HTTPS case
+ // so just check that the command was correct
+
+ QString receivedHeader = proxyServer.receivedData.left(expectedCommand.length());
+ QCOMPARE(receivedHeader, expectedCommand);
+}
+
void tst_QNetworkReply::proxyChange()
{
ProxyChangeHelper helper;
@@ -5018,7 +5377,122 @@ void tst_QNetworkReply::qtbug15311doubleContentLength()
QCOMPARE(reply->readAll(), QByteArray("ABC"));
}
+void tst_QNetworkReply::synchronousRequest_data()
+{
+ QTest::addColumn<QUrl>("url");
+ QTest::addColumn<QString>("expected");
+ QTest::addColumn<bool>("checkContentLength");
+ QTest::addColumn<QString>("mimeType");
+
+ // ### cache, auth, proxies
+
+ QTest::newRow("http")
+ << QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt")
+ << QString("file:" SRCDIR "/rfc3252.txt")
+ << true
+ << QString("text/plain");
+
+ QTest::newRow("http-gzip")
+ << QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/deflate/rfc3252.txt")
+ << QString("file:" SRCDIR "/rfc3252.txt")
+ << false // don't check content length, because it's gzip encoded
+ // ### we would need to enflate (un-deflate) the file content and compare the sizes
+ << QString("text/plain");
+
+#ifndef QT_NO_OPENSSL
+ QTest::newRow("https")
+ << QUrl("https://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt")
+ << QString("file:" SRCDIR "/rfc3252.txt")
+ << true
+ << QString("text/plain");
+#endif
+
+ QTest::newRow("data")
+ << QUrl(QString::fromLatin1("data:text/plain,hello world"))
+ << QString("data:hello world")
+ << true // check content length
+ << QString("text/plain");
+
+ QTest::newRow("simple-file")
+ << QUrl(QString::fromLatin1("file:///" SRCDIR "/rfc3252.txt"))
+ << QString("file:" SRCDIR "/rfc3252.txt")
+ << true
+ << QString();
+}
+
+// FIXME add testcase for failing network etc
+void tst_QNetworkReply::synchronousRequest()
+{
+ QFETCH(QUrl, url);
+ QFETCH(QString, expected);
+ QFETCH(bool, checkContentLength);
+ QFETCH(QString, mimeType);
+
+ QNetworkRequest request(url);
+
+#ifndef QT_NO_OPENSSL
+ // workaround for HTTPS requests: add self-signed server cert to list of CA certs,
+ // since we cannot react to the sslErrors() signal
+ // to fix this properly we would need to have an ignoreSslErrors() method in the
+ // QNetworkRequest, see http://bugreports.qt.nokia.com/browse/QTBUG-14774
+ if (url.scheme() == "https") {
+ QSslConfiguration sslConf;
+ QList<QSslCertificate> certs = QSslCertificate::fromPath(SRCDIR "/certs/qt-test-server-cacert.pem");
+ sslConf.setCaCertificates(certs);
+ request.setSslConfiguration(sslConf);
+ }
+#endif
+
+ request.setAttribute(
+ static_cast<QNetworkRequest::Attribute>(SynchronousRequestAttribute),
+ true);
+
+ QNetworkReplyPtr reply;
+ QSignalSpy finishedSpy(&manager, SIGNAL(finished(QNetworkReply*)));
+ QSignalSpy sslErrorsSpy(&manager, SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)));
+ RUN_REQUEST(runSimpleRequest(QNetworkAccessManager::GetOperation, request, reply, 0));
+ QVERIFY(reply->isFinished());
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(sslErrorsSpy.count(), 0);
+
+ QCOMPARE(reply->header(QNetworkRequest::ContentTypeHeader).toString(), mimeType);
+
+ QByteArray expectedContent;
+
+ if (expected.startsWith("file:")) {
+ QString path = expected.mid(5);
+ QFile file(path);
+ file.open(QIODevice::ReadOnly);
+ expectedContent = file.readAll();
+ } else if (expected.startsWith("data:")) {
+ expectedContent = expected.mid(5).toUtf8();
+ }
+
+ if (checkContentLength)
+ QCOMPARE(reply->header(QNetworkRequest::ContentLengthHeader).toLongLong(), qint64(expectedContent.size()));
+ QCOMPARE(reply->readAll(), expectedContent);
+
+ reply->deleteLater();
+}
+
+void tst_QNetworkReply::synchronousRequestSslFailure()
+{
+ // test that SSL won't be accepted with self-signed certificate,
+ // and that we do not emit the sslError signal (in the manager that is,
+ // in the reply we don't care)
+ QUrl url("https://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt");
+ QNetworkRequest request(url);
+ request.setAttribute(
+ static_cast<QNetworkRequest::Attribute>(SynchronousRequestAttribute),
+ true);
+ QNetworkReplyPtr reply;
+ QSignalSpy sslErrorsSpy(&manager, SIGNAL(sslErrors(QNetworkReply *, const QList<QSslError> &)));
+ runSimpleRequest(QNetworkAccessManager::GetOperation, request, reply, 0);
+ QVERIFY(reply->isFinished());
+ QCOMPARE(reply->error(), QNetworkReply::SslHandshakeFailedError);
+ QCOMPARE(sslErrorsSpy.count(), 0);
+}
// NOTE: This test must be last testcase in tst_qnetworkreply!
void tst_QNetworkReply::parentingRepliesToTheApp()
diff --git a/tests/auto/qpixmap/tst_qpixmap.cpp b/tests/auto/qpixmap/tst_qpixmap.cpp
index 2cbd4f1..3ac54b9 100644
--- a/tests/auto/qpixmap/tst_qpixmap.cpp
+++ b/tests/auto/qpixmap/tst_qpixmap.cpp
@@ -131,10 +131,7 @@ private slots:
void isNull();
void task_246446();
-#ifdef Q_WS_QWS
void convertFromImageNoDetach();
-#endif
-
void convertFromImageDetach();
#if defined(Q_WS_WIN)
@@ -187,6 +184,8 @@ private slots:
void preserveDepth();
void splash_crash();
+ void toImageDeepCopy();
+
void loadAsBitmapOrPixmap();
};
@@ -927,11 +926,13 @@ void tst_QPixmap::isNull()
}
}
-#ifdef Q_WS_QWS
void tst_QPixmap::convertFromImageNoDetach()
{
+ QPixmap randomPixmap(10, 10);
+ if (randomPixmap.pixmapData()->classId() != QPixmapData::RasterClass)
+ QSKIP("Test only valid for raster pixmaps", SkipAll);
+
//first get the screen format
- QPixmap randomPixmap(10,10);
QImage::Format screenFormat = randomPixmap.toImage().format();
QVERIFY(screenFormat != QImage::Format_Invalid);
@@ -946,7 +947,6 @@ void tst_QPixmap::convertFromImageNoDetach()
const QImage constCopy = copy;
QVERIFY(constOrig.bits() == constCopy.bits());
}
-#endif //Q_WS_QWS
void tst_QPixmap::convertFromImageDetach()
{
@@ -1767,6 +1767,21 @@ void tst_QPixmap::loadAsBitmapOrPixmap()
QVERIFY(bitmap.isQBitmap());
}
+void tst_QPixmap::toImageDeepCopy()
+{
+ QPixmap pixmap(64, 64);
+ pixmap.fill(Qt::white);
+
+ QPainter painter(&pixmap);
+ QImage first = pixmap.toImage();
+
+ painter.setBrush(Qt::black);
+ painter.drawEllipse(pixmap.rect());
+
+ QImage second = pixmap.toImage();
+
+ QVERIFY(first != second);
+}
QTEST_MAIN(tst_QPixmap)
diff --git a/tests/auto/qpointer/tst_qpointer.cpp b/tests/auto/qpointer/tst_qpointer.cpp
index 5a07e41..ce23764 100644
--- a/tests/auto/qpointer/tst_qpointer.cpp
+++ b/tests/auto/qpointer/tst_qpointer.cpp
@@ -73,6 +73,7 @@ private slots:
void castDuringDestruction();
void data() const;
void dataSignature() const;
+ void threadSafety();
};
tst_QPointer::tst_QPointer()
@@ -345,5 +346,36 @@ void tst_QPointer::dataSignature() const
}
}
+class TestRunnable : public QObject, public QRunnable {
+ void run() {
+ QPointer<QObject> obj1 = new QObject;
+ QPointer<QObject> obj2 = new QObject;
+ obj1->moveToThread(thread()); // this is the owner thread
+ obj1->deleteLater(); // the delete will happen in the owner thread
+ obj2->moveToThread(thread()); // this is the owner thread
+ obj2->deleteLater(); // the delete will happen in the owner thread
+ }
+};
+
+void tst_QPointer::threadSafety()
+{
+
+ QThread owner;
+ owner.start();
+
+ QThreadPool pool;
+ for (int i = 0; i < 300; i++) {
+ QPointer<TestRunnable> task = new TestRunnable;
+ task->setAutoDelete(true);
+ task->moveToThread(&owner);
+ pool.start(task);
+ }
+ pool.waitForDone();
+
+ owner.quit();
+ owner.wait();
+}
+
+
QTEST_MAIN(tst_QPointer)
#include "tst_qpointer.moc"
diff --git a/tests/auto/qprinterinfo/tst_qprinterinfo.cpp b/tests/auto/qprinterinfo/tst_qprinterinfo.cpp
index c3fad6c..4f767a5 100644
--- a/tests/auto/qprinterinfo/tst_qprinterinfo.cpp
+++ b/tests/auto/qprinterinfo/tst_qprinterinfo.cpp
@@ -134,7 +134,7 @@ QStringList tst_QPrinterInfo::getPrintersFromSystem()
QString output = getOutputFromCommand(command);
QStringList list = output.split(QChar::fromLatin1('\n'));
- QRegExp reg("^[Pp]rinter ([.a-zA-Z0-9_-]+)");
+ QRegExp reg("^[Pp]rinter ([.a-zA-Z0-9-_@]+)");
for (int c = 0; c < list.size(); ++c) {
if (reg.indexIn(list[c]) >= 0) {
QString printer = reg.cap(1);
diff --git a/tests/auto/qprocess/tst_qprocess.cpp b/tests/auto/qprocess/tst_qprocess.cpp
index fd310f4..9c4d134 100644
--- a/tests/auto/qprocess/tst_qprocess.cpp
+++ b/tests/auto/qprocess/tst_qprocess.cpp
@@ -1585,6 +1585,7 @@ void tst_QProcess::spaceArgsTest()
#if defined(Q_OS_SYMBIAN)
// Symbian test outputs to a file, so check that
FILE* file = fopen("c:\\logs\\qprocess_args_test.txt","r");
+ QVERIFY(file);
char buf[256];
fgets(buf, 256, file);
fclose(file);
@@ -1614,6 +1615,7 @@ void tst_QProcess::spaceArgsTest()
#if defined(Q_OS_SYMBIAN)
// Symbian test outputs to a file, so check that
file = fopen("c:\\logs\\qprocess_args_test.txt","r");
+ QVERIFY(file);
fgets(buf, 256, file);
fclose(file);
actual = QString::fromLatin1(buf).split("|");
@@ -1661,6 +1663,7 @@ void tst_QProcess::nativeArguments()
# else
FILE* file = fopen("\\temp\\qprocess_args_test.txt","r");
# endif
+ QVERIFY(file);
char buf[256];
fgets(buf, 256, file);
fclose(file);
@@ -1999,11 +2002,15 @@ void tst_QProcess::spaceInName()
void tst_QProcess::lockupsInStartDetached()
{
#if !defined(Q_OS_SYMBIAN)
- // What exactly is this call supposed to achieve anyway?
+ // Check that QProcess doesn't cause a lock up at this program's
+ // exit if a thread was started and we tried to run a program that
+ // doesn't exist. Before Qt 4.2, this used to lock up on Unix due
+ // to calling ::exit instead of ::_exit if execve failed.
+
QHostInfo::lookupHost(QString("something.invalid"), 0, 0);
-#endif
QProcess::execute("yjhbrty");
QProcess::startDetached("yjhbrty");
+#endif
}
//-----------------------------------------------------------------------------
@@ -2285,7 +2292,9 @@ void tst_QProcess::detachedWorkingDirectoryAndPid()
QFileInfo fi(infoFile);
fi.setCaching(false);
- while (fi.size() == 0) {
+ //The guard counter ensures the test does not hang if the sub process fails.
+ //Instead, the test will fail when trying to open & verify the sub process output file.
+ for (int guard = 0; guard < 100 && fi.size() == 0; guard++) {
QTest::qSleep(100);
}
@@ -2397,6 +2406,7 @@ void tst_QProcess::startFinishStartFinish()
#if defined(Q_OS_SYMBIAN)
// Symbian test outputs to a file, so check that
FILE* file = fopen("c:\\logs\\qprocess_output_test.txt","r");
+ QVERIFY(file);
char buf[30];
fgets(buf, 30, file);
QCOMPARE(QString::fromLatin1(buf),
diff --git a/tests/auto/qprogressbar/tst_qprogressbar.cpp b/tests/auto/qprogressbar/tst_qprogressbar.cpp
index 7d94e3c..e042fb8 100644
--- a/tests/auto/qprogressbar/tst_qprogressbar.cpp
+++ b/tests/auto/qprogressbar/tst_qprogressbar.cpp
@@ -179,10 +179,15 @@ void tst_QProgressBar::format()
bar.repainted = false;
bar.setFormat("%v of %m (%p%)");
qApp->processEvents();
+
#ifndef Q_WS_MAC
- // The Mac scroll bar is animated, which means we get paint events all the time.
+ // Animated scroll bars get paint events all the time
+#ifdef Q_OS_WIN
+ if (QSysInfo::WindowsVersion < QSysInfo::WV_VISTA)
+#endif
QVERIFY(!bar.repainted);
#endif
+
QCOMPARE(bar.text(), QString("1 of 10 (10%)"));
bar.setRange(5, 5);
bar.setValue(5);
diff --git a/tests/auto/qresourceengine/qresourceengine.pro b/tests/auto/qresourceengine/qresourceengine.pro
index c0db52f..9ca6994 100644
--- a/tests/auto/qresourceengine/qresourceengine.pro
+++ b/tests/auto/qresourceengine/qresourceengine.pro
@@ -38,7 +38,7 @@ wince*|symbian:{
testsub.path = testqrc/test
testsub2.files = testqrc/test/test/*
testsub2.path = testqrc/test/test
- DEPLOYMENT = deploy test alias other search1 search2 sub testsub testsub2
+ DEPLOYMENT += deploy test alias other search1 search2 sub testsub testsub2
!symbian:DEFINES += SRCDIR=\\\"\\\"
} else {
DEFINES += SRCDIR=\\\"$$PWD/\\\"
diff --git a/tests/auto/qscriptjstestsuite/tst_qscriptjstestsuite.cpp b/tests/auto/qscriptjstestsuite/tst_qscriptjstestsuite.cpp
index a280256..4b14cc9 100644
--- a/tests/auto/qscriptjstestsuite/tst_qscriptjstestsuite.cpp
+++ b/tests/auto/qscriptjstestsuite/tst_qscriptjstestsuite.cpp
@@ -745,6 +745,16 @@ tst_Suite::tst_Suite()
addExpectedFailure("ecma/TypeConversion/9.3.1-3.js", "1/-1e-2000", willFixInNextReleaseMessage);
#endif
+#ifdef Q_OS_SYMBIAN
+ addExpectedFailure("ecma/Math/15.8.2.13.js", "Math.pow(-1, 0.5)", willFixInNextReleaseMessage);
+ addExpectedFailure("ecma/Math/15.8.2.13.js", "Math.pow(-1, -0.5)", willFixInNextReleaseMessage);
+ addExpectedFailure("ecma_3/Operators/order-01.js", "operator evaluation order: 11.5.1 *", willFixInNextReleaseMessage);
+ addExpectedFailure("ecma_3/Operators/order-01.js", "operator evaluation order: 11.5.2 /", willFixInNextReleaseMessage);
+ addExpectedFailure("ecma_3/Operators/order-01.js", "operator evaluation order: 11.6.2 -", willFixInNextReleaseMessage);
+ addExpectedFailure("ecma_3/Operators/order-01.js", "operator evaluation order: 11.13.2 *=", willFixInNextReleaseMessage);
+ addExpectedFailure("ecma_3/Operators/order-01.js", "operator evaluation order: 11.13.2 /=", willFixInNextReleaseMessage);
+#endif
+
static const char klass[] = "tst_QScriptJsTestSuite";
QVector<uint> *data = qt_meta_data_tst_Suite();
diff --git a/tests/auto/qscriptv8testsuite/qscriptv8testsuite.pro b/tests/auto/qscriptv8testsuite/qscriptv8testsuite.pro
index 5d8e5af4..00e2e01 100644
--- a/tests/auto/qscriptv8testsuite/qscriptv8testsuite.pro
+++ b/tests/auto/qscriptv8testsuite/qscriptv8testsuite.pro
@@ -1,10 +1,4 @@
load(qttest_p4)
QT = core script
SOURCES += tst_qscriptv8testsuite.cpp
-!symbian:DEFINES += SRCDIR=\\\"$$PWD\\\"
-
-wince*|symbian: {
-testFiles.files = tests
-testFiles.path = .
-DEPLOYMENT += testFiles
-}
+RESOURCES += qscriptv8testsuite.qrc
diff --git a/tests/auto/qscriptv8testsuite/qscriptv8testsuite.qrc b/tests/auto/qscriptv8testsuite/qscriptv8testsuite.qrc
new file mode 100644
index 0000000..a894ee5
--- /dev/null
+++ b/tests/auto/qscriptv8testsuite/qscriptv8testsuite.qrc
@@ -0,0 +1,5 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file>tests</file>
+</qresource>
+</RCC>
diff --git a/tests/auto/qscriptv8testsuite/tst_qscriptv8testsuite.cpp b/tests/auto/qscriptv8testsuite/tst_qscriptv8testsuite.cpp
index 5f9a578..912027e 100644
--- a/tests/auto/qscriptv8testsuite/tst_qscriptv8testsuite.cpp
+++ b/tests/auto/qscriptv8testsuite/tst_qscriptv8testsuite.cpp
@@ -45,10 +45,6 @@
#include <QtScript>
-#if defined(Q_OS_SYMBIAN)
-# define SRCDIR ""
-#endif
-
//TESTED_CLASS=
//TESTED_FILES=
@@ -217,9 +213,8 @@ int tst_Suite::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
tst_Suite::tst_Suite()
{
- testsDir = QDir(SRCDIR);
- bool testsFound = testsDir.cd("tests");
- if (!testsFound) {
+ testsDir = QDir(":/tests");
+ if (!testsDir.exists()) {
qWarning("*** no tests/ dir!");
} else {
if (!testsDir.exists("mjsunit.js"))
@@ -297,8 +292,7 @@ tst_Suite::tst_Suite()
appendCString(stringdata, "");
QFileInfoList testFileInfos;
- if (testsFound)
- testFileInfos = testsDir.entryInfoList(QStringList() << "*.js", QDir::Files);
+ testFileInfos = testsDir.entryInfoList(QStringList() << "*.js", QDir::Files);
foreach (QFileInfo tfi, testFileInfos) {
QString name = tfi.baseName();
// slot: signature, parameters, type, tag, flags
diff --git a/tests/auto/qscriptvalue/tst_qscriptvalue.cpp b/tests/auto/qscriptvalue/tst_qscriptvalue.cpp
index 5a50e49..ec33e81 100644
--- a/tests/auto/qscriptvalue/tst_qscriptvalue.cpp
+++ b/tests/auto/qscriptvalue/tst_qscriptvalue.cpp
@@ -1970,7 +1970,7 @@ void tst_QScriptValue::getSetProperty_gettersAndSetters()
QCOMPARE(object.property("foo").isUndefined(), true);
}
-void tst_QScriptValue::getSetProperty_gettersAndSettersThrowError()
+void tst_QScriptValue::getSetProperty_gettersAndSettersThrowErrorNative()
{
// getter/setter that throws an error
QScriptEngine eng;
@@ -1984,6 +1984,32 @@ void tst_QScriptValue::getSetProperty_gettersAndSettersThrowError()
QVERIFY(ret.isError());
QVERIFY(eng.hasUncaughtException());
QVERIFY(ret.strictlyEquals(eng.uncaughtException()));
+ QCOMPARE(ret.toString(), QLatin1String("Error: get foo"));
+ eng.evaluate("Object"); // clear exception state...
+ QVERIFY(!eng.hasUncaughtException());
+ object.setProperty("foo", str);
+ QVERIFY(eng.hasUncaughtException());
+ QCOMPARE(eng.uncaughtException().toString(), QLatin1String("Error: set foo"));
+}
+
+void tst_QScriptValue::getSetProperty_gettersAndSettersThrowErrorJS()
+{
+ // getter/setter that throws an error (from js function)
+ QScriptEngine eng;
+ QScriptValue str = QScriptValue(&eng, "bar");
+
+ eng.evaluate("o = new Object; "
+ "o.__defineGetter__('foo', function() { throw new Error('get foo') }); "
+ "o.__defineSetter__('foo', function() { throw new Error('set foo') }); ");
+ 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);
+ QVERIFY(ret.isError());
+ QVERIFY(eng.hasUncaughtException());
+ QEXPECT_FAIL("", "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...
QVERIFY(!eng.hasUncaughtException());
object.setProperty("foo", str);
@@ -2051,6 +2077,12 @@ void tst_QScriptValue::getSetProperty_gettersAndSettersChange()
QVERIFY(!object.property("x").isValid());
object.setProperty("foo", num);
QVERIFY(object.property("x").equals(num));
+
+ eng.globalObject().setProperty("object", object);
+ QScriptValue res = eng.evaluate("object.x = 89; var a = object.foo; object.foo = 65; a");
+ QCOMPARE(res.toInt32(), 89);
+ QCOMPARE(object.property("x").toInt32(), 65);
+ QCOMPARE(object.property("foo").toInt32(), 65);
}
void tst_QScriptValue::getSetProperty_array()
@@ -3931,4 +3963,30 @@ void tst_QScriptValue::nestedObjectToVariant()
QCOMPARE(o.toVariant(), expected);
}
+void tst_QScriptValue::propertyFlags_data()
+{
+ QTest::addColumn<QString>("program");
+ QTest::addColumn<uint>("expected");
+
+ QTest::newRow("nothing") << "" << 0u;
+ QTest::newRow("getter") << "o.__defineGetter__('prop', function() { return 'blah' } );\n" << uint(QScriptValue::PropertyGetter);
+ QTest::newRow("setter") << "o.__defineSetter__('prop', function(a) { this.setted_prop2 = a; } );\n" << uint(QScriptValue::PropertySetter);
+ QTest::newRow("getterSetter") << "o.__defineGetter__('prop', function() { return 'ploup' } );\n"
+ "o.__defineSetter__('prop', function(a) { this.setted_prop3 = a; } );\n" << uint(QScriptValue::PropertySetter|QScriptValue::PropertyGetter);
+ QTest::newRow("nothing2") << "o.prop = 'nothing'" << 0u;
+}
+
+void tst_QScriptValue::propertyFlags()
+{
+ QFETCH(QString, program);
+ QFETCH(uint, expected);
+ QScriptEngine eng;
+ eng.evaluate("o = new Object;");
+ eng.evaluate(program);
+ QScriptValue o = eng.evaluate("o");
+
+ QCOMPARE(uint(o.propertyFlags("prop")), expected);
+}
+
+
QTEST_MAIN(tst_QScriptValue)
diff --git a/tests/auto/qscriptvalue/tst_qscriptvalue.h b/tests/auto/qscriptvalue/tst_qscriptvalue.h
index 46f5526..6f55bc3 100644
--- a/tests/auto/qscriptvalue/tst_qscriptvalue.h
+++ b/tests/auto/qscriptvalue/tst_qscriptvalue.h
@@ -127,7 +127,8 @@ private slots:
void getSetProperty_resolveMode();
void getSetProperty_twoEngines();
void getSetProperty_gettersAndSetters();
- void getSetProperty_gettersAndSettersThrowError();
+ void getSetProperty_gettersAndSettersThrowErrorNative();
+ void getSetProperty_gettersAndSettersThrowErrorJS();
void getSetProperty_gettersAndSettersOnNative();
void getSetProperty_gettersAndSettersOnGlobalObject();
void getSetProperty_gettersAndSettersChange();
@@ -178,6 +179,8 @@ private slots:
void objectId();
void nestedObjectToVariant_data();
void nestedObjectToVariant();
+ void propertyFlags_data();
+ void propertyFlags();
private:
diff --git a/tests/auto/qscroller/qscroller.pro b/tests/auto/qscroller/qscroller.pro
new file mode 100644
index 0000000..845dcb9
--- /dev/null
+++ b/tests/auto/qscroller/qscroller.pro
@@ -0,0 +1,3 @@
+load(qttest_p4)
+
+SOURCES += tst_qscroller.cpp
diff --git a/tests/auto/qscroller/tst_qscroller.cpp b/tests/auto/qscroller/tst_qscroller.cpp
new file mode 100644
index 0000000..b4e4ddf
--- /dev/null
+++ b/tests/auto/qscroller/tst_qscroller.cpp
@@ -0,0 +1,537 @@
+/****************************************************************************
+**
+** 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 $MODULE$ of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui>
+#include <QtTest>
+// #include <QDebug>
+
+class tst_QScrollerWidget : public QWidget
+{
+public:
+ tst_QScrollerWidget()
+ : QWidget()
+ {
+ reset();
+ }
+
+ void reset()
+ {
+ receivedPrepare = false;
+ receivedScroll = false;
+ receivedFirst = false;
+ receivedLast = false;
+ receivedOvershoot = false;
+ }
+
+ bool event(QEvent *e)
+ {
+ switch (e->type()) {
+ case QEvent::Gesture:
+ e->setAccepted(false); // better reject the event or QGestureManager will make trouble
+ return false;
+
+ case QEvent::ScrollPrepare:
+ {
+ receivedPrepare = true;
+ QScrollPrepareEvent *se = static_cast<QScrollPrepareEvent *>(e);
+ se->setViewportSize(QSizeF(100,100));
+ se->setContentPosRange(scrollArea);
+ se->setContentPos(scrollPosition);
+ se->accept();
+ return true;
+ }
+
+ case QEvent::Scroll:
+ {
+ receivedScroll = true;
+ QScrollEvent *se = static_cast<QScrollEvent *>(e);
+ // qDebug() << "Scroll for"<<this<<"pos"<<se->scrollPos()<<"ov"<<se->overshoot()<<"first"<<se->isFirst()<<"last"<<se->isLast();
+
+ if (se->scrollState() == QScrollEvent::ScrollStarted)
+ receivedFirst = true;
+ if (se->scrollState() == QScrollEvent::ScrollFinished)
+ receivedLast = true;
+
+ currentPos = se->contentPos();
+ overshoot = se->overshootDistance();
+ if (!qFuzzyCompare( overshoot.x() + 1.0, 1.0 ) ||
+ !qFuzzyCompare( overshoot.y() + 1.0, 1.0 ))
+ receivedOvershoot = true;
+ return true;
+ }
+
+ default:
+ return QObject::event(e);
+ }
+ }
+
+
+ QRectF scrollArea;
+ QPointF scrollPosition;
+
+ bool receivedPrepare;
+ bool receivedScroll;
+ bool receivedFirst;
+ bool receivedLast;
+ bool receivedOvershoot;
+
+ QPointF currentPos;
+ QPointF overshoot;
+};
+
+
+class tst_QScroller : public QObject
+{
+ Q_OBJECT
+public:
+ tst_QScroller() { }
+ ~tst_QScroller() { }
+
+private:
+ void kineticScroll( tst_QScrollerWidget *sw, QPointF from, QPoint touchStart, QPoint touchUpdate, QPoint touchEnd);
+ void kineticScrollNoTest( tst_QScrollerWidget *sw, QPointF from, QPoint touchStart, QPoint touchUpdate, QPoint touchEnd);
+
+private slots:
+ void staticScrollers();
+ void scrollerProperties();
+ void scrollTo();
+ void scroll();
+ void overshoot();
+};
+
+/*! \internal
+ Generates touchBegin, touchUpdate and touchEnd events to trigger scrolling.
+ Tests some in between states but does not wait until scrolling is finished.
+*/
+void tst_QScroller::kineticScroll( tst_QScrollerWidget *sw, QPointF from, QPoint touchStart, QPoint touchUpdate, QPoint touchEnd)
+{
+ sw->scrollPosition = from;
+ sw->currentPos= from;
+
+ QScroller *s1 = QScroller::scroller(sw);
+ QCOMPARE( s1->state(), QScroller::Inactive );
+
+ QScrollerProperties sp1 = QScroller::scroller(sw)->scrollerProperties();
+ int fps = 60;
+
+ QTouchEvent::TouchPoint rawTouchPoint;
+ rawTouchPoint.setId(0);
+
+ // send the touch begin event
+ QTouchEvent::TouchPoint touchPoint(0);
+ touchPoint.setState(Qt::TouchPointPressed);
+ touchPoint.setPos(touchStart);
+ touchPoint.setScenePos(touchStart);
+ touchPoint.setScreenPos(touchStart);
+ QTouchEvent touchEvent1(QEvent::TouchBegin,
+ QTouchEvent::TouchScreen,
+ Qt::NoModifier,
+ Qt::TouchPointPressed,
+ (QList<QTouchEvent::TouchPoint>() << touchPoint));
+ QApplication::sendEvent(sw, &touchEvent1);
+
+ QCOMPARE( s1->state(), QScroller::Pressed );
+
+ // send the touch update far enough to trigger a scroll
+ QTest::qWait(200); // we need to wait a little or else the speed would be infinite. now we have around 500 pixel per second.
+ touchPoint.setPos(touchUpdate);
+ touchPoint.setScenePos(touchUpdate);
+ touchPoint.setScreenPos(touchUpdate);
+ QTouchEvent touchEvent2(QEvent::TouchUpdate,
+ QTouchEvent::TouchScreen,
+ Qt::NoModifier,
+ Qt::TouchPointMoved,
+ (QList<QTouchEvent::TouchPoint>() << touchPoint));
+ QApplication::sendEvent(sw, &touchEvent2);
+
+ QCOMPARE( s1->state(), QScroller::Dragging );
+ QCOMPARE( sw->receivedPrepare, true );
+
+
+ QTest::qWait(1000 / fps * 2); // wait until the first scroll move
+ QCOMPARE( sw->receivedFirst, true );
+ QCOMPARE( sw->receivedScroll, true );
+ QCOMPARE( sw->receivedOvershoot, false );
+
+ // note that the scrolling goes in a different direction than the mouse move
+ QPoint calculatedPos = from.toPoint() - touchUpdate - touchStart;
+ QVERIFY(qAbs(sw->currentPos.x() - calculatedPos.x()) < 1.0);
+ QVERIFY(qAbs(sw->currentPos.y() - calculatedPos.y()) < 1.0);
+
+ // send the touch end
+ touchPoint.setPos(touchEnd);
+ touchPoint.setScenePos(touchEnd);
+ touchPoint.setScreenPos(touchEnd);
+ QTouchEvent touchEvent5(QEvent::TouchEnd,
+ QTouchEvent::TouchScreen,
+ Qt::NoModifier,
+ Qt::TouchPointReleased,
+ (QList<QTouchEvent::TouchPoint>() << touchPoint));
+ QApplication::sendEvent(sw, &touchEvent5);
+}
+
+/*! \internal
+ Generates touchBegin, touchUpdate and touchEnd events to trigger scrolling.
+ This function does not have any in between tests, it does not expect the scroller to actually scroll.
+*/
+void tst_QScroller::kineticScrollNoTest( tst_QScrollerWidget *sw, QPointF from, QPoint touchStart, QPoint touchUpdate, QPoint touchEnd)
+{
+ sw->scrollPosition = from;
+ sw->currentPos = from;
+
+ QScroller *s1 = QScroller::scroller(sw);
+ QCOMPARE( s1->state(), QScroller::Inactive );
+
+ QScrollerProperties sp1 = s1->scrollerProperties();
+ int fps = 60;
+
+ QTouchEvent::TouchPoint rawTouchPoint;
+ rawTouchPoint.setId(0);
+
+ // send the touch begin event
+ QTouchEvent::TouchPoint touchPoint(0);
+ touchPoint.setState(Qt::TouchPointPressed);
+ touchPoint.setPos(touchStart);
+ touchPoint.setScenePos(touchStart);
+ touchPoint.setScreenPos(touchStart);
+ QTouchEvent touchEvent1(QEvent::TouchBegin,
+ QTouchEvent::TouchScreen,
+ Qt::NoModifier,
+ Qt::TouchPointPressed,
+ (QList<QTouchEvent::TouchPoint>() << touchPoint));
+ QApplication::sendEvent(sw, &touchEvent1);
+
+ // send the touch update far enough to trigger a scroll
+ QTest::qWait(200); // we need to wait a little or else the speed would be infinite. now we have around 500 pixel per second.
+ touchPoint.setPos(touchUpdate);
+ touchPoint.setScenePos(touchUpdate);
+ touchPoint.setScreenPos(touchUpdate);
+ QTouchEvent touchEvent2(QEvent::TouchUpdate,
+ QTouchEvent::TouchScreen,
+ Qt::NoModifier,
+ Qt::TouchPointMoved,
+ (QList<QTouchEvent::TouchPoint>() << touchPoint));
+ QApplication::sendEvent(sw, &touchEvent2);
+
+ QTest::qWait(1000 / fps * 2); // wait until the first scroll move
+
+ // send the touch end
+ touchPoint.setPos(touchEnd);
+ touchPoint.setScenePos(touchEnd);
+ touchPoint.setScreenPos(touchEnd);
+ QTouchEvent touchEvent5(QEvent::TouchEnd,
+ QTouchEvent::TouchScreen,
+ Qt::NoModifier,
+ Qt::TouchPointReleased,
+ (QList<QTouchEvent::TouchPoint>() << touchPoint));
+ QApplication::sendEvent(sw, &touchEvent5);
+}
+
+
+void tst_QScroller::staticScrollers()
+{
+ // scrollers
+ {
+ QObject *o1 = new QObject(this);
+ QObject *o2 = new QObject(this);
+
+ // get scroller for object
+ QScroller *s1 = QScroller::scroller(o1);
+ QScroller *s2 = QScroller::scroller(o2);
+
+ QVERIFY(s1);
+ QVERIFY(s2);
+ QVERIFY(s1 != s2);
+
+ QVERIFY(!QScroller::scroller(static_cast<const QObject*>(0)));
+ QCOMPARE(QScroller::scroller(o1), s1);
+
+ delete o1;
+ delete o2;
+ }
+
+ // the same for properties
+ {
+ QObject *o1 = new QObject(this);
+ QObject *o2 = new QObject(this);
+
+ // get scroller for object
+ QScrollerProperties sp1 = QScroller::scroller(o1)->scrollerProperties();
+ QScrollerProperties sp2 = QScroller::scroller(o2)->scrollerProperties();
+
+ // default properties should be the same
+ QVERIFY(sp1 == sp2);
+
+ QCOMPARE(QScroller::scroller(o1)->scrollerProperties(), sp1);
+
+ delete o1;
+ delete o2;
+ }
+}
+
+void tst_QScroller::scrollerProperties()
+{
+ QObject *o1 = new QObject(this);
+ QScrollerProperties sp1 = QScroller::scroller(o1)->scrollerProperties();
+
+ QScrollerProperties::ScrollMetric metrics[] =
+ {
+ QScrollerProperties::MousePressEventDelay, // qreal [s]
+ QScrollerProperties::DragStartDistance, // qreal [m]
+ QScrollerProperties::DragVelocitySmoothingFactor, // qreal [0..1/s] (complex calculation involving time) v = v_new* DASF + v_old * (1-DASF)
+ QScrollerProperties::AxisLockThreshold, // qreal [0..1] atan(|min(dx,dy)|/|max(dx,dy)|)
+
+ QScrollerProperties::DecelerationFactor, // slope of the curve
+
+ QScrollerProperties::MinimumVelocity, // qreal [m/s]
+ QScrollerProperties::MaximumVelocity, // qreal [m/s]
+ QScrollerProperties::MaximumClickThroughVelocity, // qreal [m/s]
+
+ QScrollerProperties::AcceleratingFlickMaximumTime, // qreal [s]
+ QScrollerProperties::AcceleratingFlickSpeedupFactor, // qreal [1..]
+
+ QScrollerProperties::SnapPositionRatio, // qreal [0..1]
+ QScrollerProperties::SnapTime, // qreal [s]
+
+ QScrollerProperties::OvershootDragResistanceFactor, // qreal [0..1]
+ QScrollerProperties::OvershootDragDistanceFactor, // qreal [0..1]
+ QScrollerProperties::OvershootScrollDistanceFactor, // qreal [0..1]
+ QScrollerProperties::OvershootScrollTime, // qreal [s]
+ };
+
+ for (unsigned int i = 0; i < sizeof(metrics) / sizeof(metrics[0]); i++) {
+ sp1.setScrollMetric(metrics[i], 0.9);
+ QCOMPARE(sp1.scrollMetric(metrics[i]).toDouble(), 0.9);
+ }
+ sp1.setScrollMetric(QScrollerProperties::ScrollingCurve, QEasingCurve(QEasingCurve::OutQuart));
+ QCOMPARE(sp1.scrollMetric(QScrollerProperties::ScrollingCurve).toEasingCurve().type(), QEasingCurve::OutQuart);
+
+ sp1.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, QVariant::fromValue(QScrollerProperties::OvershootAlwaysOff));
+ QCOMPARE(sp1.scrollMetric(QScrollerProperties::HorizontalOvershootPolicy).value<QScrollerProperties::OvershootPolicy>(), QScrollerProperties::OvershootAlwaysOff);
+
+ sp1.setScrollMetric(QScrollerProperties::VerticalOvershootPolicy, QVariant::fromValue(QScrollerProperties::OvershootAlwaysOn));
+ QCOMPARE(sp1.scrollMetric(QScrollerProperties::VerticalOvershootPolicy).value<QScrollerProperties::OvershootPolicy>(), QScrollerProperties::OvershootAlwaysOn);
+
+ sp1.setScrollMetric(QScrollerProperties::FrameRate, QVariant::fromValue(QScrollerProperties::Fps20));
+ QCOMPARE(sp1.scrollMetric(QScrollerProperties::FrameRate).value<QScrollerProperties::FrameRates>(), QScrollerProperties::Fps20);
+}
+
+void tst_QScroller::scrollTo()
+{
+ {
+ tst_QScrollerWidget *sw = new tst_QScrollerWidget();
+ sw->scrollArea = QRectF( 0, 0, 1000, 1000 );
+ sw->scrollPosition = QPointF( 500, 500 );
+
+ QScroller *s1 = QScroller::scroller(sw);
+ QCOMPARE( s1->state(), QScroller::Inactive );
+
+ // a normal scroll
+ s1->scrollTo(QPointF(100,100), 100);
+ QTest::qWait(200);
+
+ QCOMPARE( sw->receivedPrepare, true );
+ QCOMPARE( sw->receivedScroll, true );
+ QCOMPARE( sw->receivedFirst, true );
+ QCOMPARE( sw->receivedLast, true );
+ QCOMPARE( sw->receivedOvershoot, false );
+ QVERIFY(qFuzzyCompare( sw->currentPos.x(), 100 ));
+ QVERIFY(qFuzzyCompare( sw->currentPos.y(), 100 ));
+
+ delete sw;
+ }
+}
+
+void tst_QScroller::scroll()
+{
+#if defined(Q_OS_MACX) && (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6)
+ QSKIP("Mac OS X < 10.6 does not support QTouchEvents", SkipAll);
+ return;
+#endif
+
+#ifndef QT_NO_GESTURES
+ // -- good case. normal scroll
+ tst_QScrollerWidget *sw = new tst_QScrollerWidget();
+ sw->scrollArea = QRectF(0, 0, 1000, 1000);
+ QScroller::grabGesture(sw, QScroller::TouchGesture);
+ sw->setGeometry(100, 100, 400, 300);
+
+ QScroller *s1 = QScroller::scroller(sw);
+ kineticScroll(sw, QPointF(500, 500), QPoint(0, 0), QPoint(100, 100), QPoint(200, 200));
+ // now we should be scrolling
+ QCOMPARE( s1->state(), QScroller::Scrolling );
+
+ // wait until finished, check that no further first scroll is send
+ sw->receivedFirst = false;
+ sw->receivedScroll = false;
+ while (s1->state() == QScroller::Scrolling)
+ QTest::qWait(100);
+
+ QCOMPARE( sw->receivedFirst, false );
+ QCOMPARE( sw->receivedScroll, true );
+ QCOMPARE( sw->receivedLast, true );
+ QVERIFY(sw->currentPos.x() < 400);
+ QVERIFY(sw->currentPos.y() < 400);
+
+ // -- try to scroll when nothing to scroll
+
+ sw->reset();
+ sw->scrollArea = QRectF(0, 0, 0, 1000);
+ kineticScrollNoTest(sw, QPointF(0, 500), QPoint(0, 0), QPoint(100, 0), QPoint(200, 0));
+
+ while (s1->state() != QScroller::Inactive)
+ QTest::qWait(20);
+
+ QCOMPARE(sw->currentPos.x(), 0.0);
+ QCOMPARE(sw->currentPos.y(), 500.0);
+
+ delete sw;
+#endif
+}
+
+void tst_QScroller::overshoot()
+{
+#if defined(Q_OS_MACX) && (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6)
+ QSKIP("Mac OS X < 10.6 does not support QTouchEvents", SkipAll);
+ return;
+#endif
+
+#ifndef QT_NO_GESTURES
+ tst_QScrollerWidget *sw = new tst_QScrollerWidget();
+ sw->scrollArea = QRectF(0, 0, 1000, 1000);
+ QScroller::grabGesture(sw, QScroller::TouchGesture);
+ sw->setGeometry(100, 100, 400, 300);
+
+ QScroller *s1 = QScroller::scroller(sw);
+ QScrollerProperties sp1 = s1->scrollerProperties();
+
+ sp1.setScrollMetric(QScrollerProperties::OvershootDragResistanceFactor, 0.5);
+ sp1.setScrollMetric(QScrollerProperties::OvershootDragDistanceFactor, 0.2);
+ sp1.setScrollMetric(QScrollerProperties::OvershootScrollDistanceFactor, 0.2);
+
+ // -- try to scroll with overshoot (when scrollable good case)
+
+ sp1.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, QVariant::fromValue(QScrollerProperties::OvershootWhenScrollable));
+ s1->setScrollerProperties(sp1);
+ kineticScrollNoTest(sw, QPointF(500, 500), QPoint(0, 0), QPoint(400, 0), QPoint(490, 0));
+
+ while (s1->state() != QScroller::Inactive)
+ QTest::qWait(20);
+
+ //qDebug() << "Overshoot fuzzy: "<<sw->currentPos;
+ QVERIFY(qFuzzyCompare( sw->currentPos.x(), 0 ));
+ QVERIFY(qFuzzyCompare( sw->currentPos.y(), 500 ));
+ QCOMPARE( sw->receivedOvershoot, true );
+
+ // -- try to scroll with overshoot (when scrollable bad case)
+ sw->reset();
+ sw->scrollArea = QRectF(0, 0, 0, 1000);
+
+ sp1.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, QVariant::fromValue(QScrollerProperties::OvershootWhenScrollable));
+ s1->setScrollerProperties(sp1);
+ kineticScrollNoTest(sw, QPointF(0, 500), QPoint(0, 0), QPoint(400, 0), QPoint(490, 0));
+
+ while (s1->state() != QScroller::Inactive)
+ QTest::qWait(20);
+
+ //qDebug() << "Overshoot fuzzy: "<<sw->currentPos;
+ QVERIFY(qFuzzyCompare( sw->currentPos.x(), 0 ));
+ QVERIFY(qFuzzyCompare( sw->currentPos.y(), 500 ));
+ QCOMPARE( sw->receivedOvershoot, false );
+
+ // -- try to scroll with overshoot (always on)
+ sw->reset();
+ sw->scrollArea = QRectF(0, 0, 0, 1000);
+
+ sp1.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, QVariant::fromValue(QScrollerProperties::OvershootAlwaysOn));
+ s1->setScrollerProperties(sp1);
+ kineticScrollNoTest(sw, QPointF(0, 500), QPoint(0, 0), QPoint(400, 0), QPoint(490, 0));
+
+ while (s1->state() != QScroller::Inactive)
+ QTest::qWait(20);
+
+ //qDebug() << "Overshoot fuzzy: "<<sw->currentPos;
+
+ QVERIFY(qFuzzyCompare( sw->currentPos.x(), 0 ));
+ QVERIFY(qFuzzyCompare( sw->currentPos.y(), 500 ));
+ QCOMPARE( sw->receivedOvershoot, true );
+
+ // -- try to scroll with overshoot (always off)
+ sw->reset();
+ sw->scrollArea = QRectF(0, 0, 1000, 1000);
+
+ sp1.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, QVariant::fromValue(QScrollerProperties::OvershootAlwaysOff));
+ s1->setScrollerProperties(sp1);
+ kineticScrollNoTest(sw, QPointF(500, 500), QPoint(0, 0), QPoint(400, 0), QPoint(490, 0));
+
+ while (s1->state() != QScroller::Inactive)
+ QTest::qWait(20);
+
+ QVERIFY(qFuzzyCompare( sw->currentPos.x(), 0 ));
+ QVERIFY(qFuzzyCompare( sw->currentPos.y(), 500 ));
+ QCOMPARE( sw->receivedOvershoot, false );
+
+ // -- try to scroll with overshoot (always on but max overshoot = 0)
+ sp1.setScrollMetric(QScrollerProperties::OvershootDragDistanceFactor, 0.0);
+ sp1.setScrollMetric(QScrollerProperties::OvershootScrollDistanceFactor, 0.0);
+ sw->reset();
+ sw->scrollArea = QRectF(0, 0, 1000, 1000);
+
+ sp1.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, QVariant::fromValue(QScrollerProperties::OvershootAlwaysOn));
+ s1->setScrollerProperties(sp1);
+ kineticScrollNoTest(sw, QPointF(500, 500), QPoint(0, 0), QPoint(400, 0), QPoint(490, 0));
+
+ while (s1->state() != QScroller::Inactive)
+ QTest::qWait(20);
+
+ QVERIFY(qFuzzyCompare( sw->currentPos.x(), 0 ));
+ QVERIFY(qFuzzyCompare( sw->currentPos.y(), 500 ));
+ QCOMPARE( sw->receivedOvershoot, false );
+
+
+ delete sw;
+#endif
+}
+
+
+QTEST_MAIN(tst_QScroller)
+
+#include "tst_qscroller.moc"
diff --git a/tests/auto/qsettings/qsettings.pro b/tests/auto/qsettings/qsettings.pro
index 19513b3..fe104df 100644
--- a/tests/auto/qsettings/qsettings.pro
+++ b/tests/auto/qsettings/qsettings.pro
@@ -6,3 +6,5 @@ contains(QT_CONFIG, qt3support):QT += qt3support
CONFIG -= debug
CONFIG += release
win32-msvc*:LIBS += advapi32.lib
+
+CONFIG += parallel_test
diff --git a/tests/auto/qsharedpointer/tst_qsharedpointer.cpp b/tests/auto/qsharedpointer/tst_qsharedpointer.cpp
index 5e624e4..d285ccd 100644
--- a/tests/auto/qsharedpointer/tst_qsharedpointer.cpp
+++ b/tests/auto/qsharedpointer/tst_qsharedpointer.cpp
@@ -283,8 +283,8 @@ void tst_QSharedPointer::operators()
QSharedPointer<char> p1;
QSharedPointer<char> p2(new char);
qptrdiff diff = p2.data() - p1.data();
- Q_ASSERT(p1.data() < p2.data());
- Q_ASSERT(diff > 0);
+ Q_ASSERT(p1.data() != p2.data());
+ Q_ASSERT(diff != 0);
// operator-
QCOMPARE(p2 - p1.data(), diff);
diff --git a/tests/auto/qsortfilterproxymodel/qsortfilterproxymodel.pro b/tests/auto/qsortfilterproxymodel/qsortfilterproxymodel.pro
index d2c1147..7edd4a5 100644
--- a/tests/auto/qsortfilterproxymodel/qsortfilterproxymodel.pro
+++ b/tests/auto/qsortfilterproxymodel/qsortfilterproxymodel.pro
@@ -1,6 +1,7 @@
load(qttest_p4)
-SOURCES += tst_qsortfilterproxymodel.cpp
-
+INCLUDEPATH += $$PWD/../modeltest
+SOURCES += tst_qsortfilterproxymodel.cpp ../modeltest/dynamictreemodel.cpp ../modeltest/modeltest.cpp
+HEADERS += ../modeltest/dynamictreemodel.h ../modeltest/modeltest.h
diff --git a/tests/auto/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp b/tests/auto/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp
index bc6ba77..9a904db 100644
--- a/tests/auto/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp
+++ b/tests/auto/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp
@@ -43,6 +43,9 @@
#include <QtTest/QtTest>
#include "../../shared/util.h"
+#include "dynamictreemodel.h"
+#include "modeltest.h"
+
#include <QtCore>
#include <QtGui>
@@ -145,6 +148,7 @@ private slots:
void testMultipleProxiesWithSelection();
void mapSelectionFromSource();
void testResetInternalData();
+ void filteredColumns();
protected:
void buildHierarchy(const QStringList &data, QAbstractItemModel *model);
@@ -3311,7 +3315,40 @@ void tst_QSortFilterProxyModel::testResetInternalData()
// Cause the source model to reset.
model.setStringList(QStringList() << "Spam" << "Eggs");
+}
+
+class FilteredColumnProxyModel : public QSortFilterProxyModel
+{
+ Q_OBJECT
+public:
+ FilteredColumnProxyModel(QObject *parent = 0)
+ : QSortFilterProxyModel(parent)
+ {
+
+ }
+
+protected:
+ bool filterAcceptsColumn(int column, const QModelIndex &source_parent) const
+ {
+ return column % 2 != 0;
+ }
+};
+
+void tst_QSortFilterProxyModel::filteredColumns()
+{
+ DynamicTreeModel *model = new DynamicTreeModel(this);
+
+ FilteredColumnProxyModel *proxy = new FilteredColumnProxyModel(this);
+ proxy->setSourceModel(model);
+
+ new ModelTest(proxy, this);
+ ModelInsertCommand *insertCommand = new ModelInsertCommand(model, this);
+ insertCommand->setNumCols(2);
+ insertCommand->setStartRow(0);
+ insertCommand->setEndRow(0);
+ // Parent is QModelIndex()
+ insertCommand->doCommand();
}
QTEST_MAIN(tst_QSortFilterProxyModel)
diff --git a/tests/auto/qsound/qsound.pro b/tests/auto/qsound/qsound.pro
index a1760f8..b69d084 100644
--- a/tests/auto/qsound/qsound.pro
+++ b/tests/auto/qsound/qsound.pro
@@ -3,7 +3,7 @@ SOURCES += tst_qsound.cpp
wince*|symbian: {
deploy.files += 4.wav
- DEPLOYMENT = deploy
+ DEPLOYMENT += deploy
!symbian:DEFINES += SRCDIR=\\\"\\\"
} else {
DEFINES += SRCDIR=\\\"$$PWD/\\\"
diff --git a/tests/auto/qsqldatabase/tst_databases.h b/tests/auto/qsqldatabase/tst_databases.h
index 80535df..82ee41a 100644
--- a/tests/auto/qsqldatabase/tst_databases.h
+++ b/tests/auto/qsqldatabase/tst_databases.h
@@ -235,6 +235,8 @@ public:
// addDb( "QPSQL7", "testdb", "testuser", "Ee4Gabf6_", "postgres74-nokia.trolltech.com.au" ); // Version 7.4.19-1.el4_6.1
// addDb( "QPSQL7", "testdb", "testuser", "Ee4Gabf6_", "bq-pgsql81.apac.nokia.com" ); // Version 8.1.11-1.el5_1.1
// addDb( "QPSQL7", "testdb", "testuser", "Ee4Gabf6_", "bq-pgsql84.apac.nokia.com" ); // Version 8.4.1-2.1.i586
+// addDb( "QPSQL7", "testdb", "testuser", "Ee4Gabf6_", "bq-pgsql90.apac.nokia.com" ); // Version 9.0.0
+
// addDb( "QDB2", "testdb", "troll", "trond", "silence.nokia.troll.no" ); // DB2 v9.1 on silence
diff --git a/tests/auto/qstyle/tst_qstyle.cpp b/tests/auto/qstyle/tst_qstyle.cpp
index ba24225..9c754d2 100644
--- a/tests/auto/qstyle/tst_qstyle.cpp
+++ b/tests/auto/qstyle/tst_qstyle.cpp
@@ -413,6 +413,13 @@ void tst_QStyle::testWindowsStyle()
QWindowsStyle wstyle;
testAllFunctions(&wstyle);
lineUpLayoutTest(&wstyle);
+
+ // Tests drawing indeterminate progress with 0 size: QTBUG-15973
+ QStyleOptionProgressBar pb;
+ pb.rect = QRect(0,0,-9,0);
+ QPixmap surface(QSize(200, 200));
+ QPainter painter(&surface);
+ wstyle.drawControl(QStyle::CE_ProgressBar, &pb, &painter, 0);
}
void tst_QStyle::testWindowsXPStyle()
diff --git a/tests/auto/qtemporaryfile/qtemporaryfile.pro b/tests/auto/qtemporaryfile/qtemporaryfile.pro
index 543c143..64a043b 100644
--- a/tests/auto/qtemporaryfile/qtemporaryfile.pro
+++ b/tests/auto/qtemporaryfile/qtemporaryfile.pro
@@ -10,3 +10,5 @@ symbian {
}else {
DEFINES += SRCDIR=\\\"$$PWD/\\\"
}
+
+CONFIG += parallel_test
diff --git a/tests/auto/qtextlayout/tst_qtextlayout.cpp b/tests/auto/qtextlayout/tst_qtextlayout.cpp
index dcc43d0..4f4413f 100644
--- a/tests/auto/qtextlayout/tst_qtextlayout.cpp
+++ b/tests/auto/qtextlayout/tst_qtextlayout.cpp
@@ -125,6 +125,7 @@ private slots:
void lineWidthFromBOM();
void textWidthVsWIdth();
+ void textWithSurrogates_qtbug15679();
private:
QFont testFont;
@@ -1412,6 +1413,24 @@ void tst_QTextLayout::textWidthVsWIdth()
}
}
+void tst_QTextLayout::textWithSurrogates_qtbug15679()
+{
+ QString str = QString::fromUtf8("🀀a🀀");
+ QTextLayout layout(str);
+ layout.beginLayout();
+ QTextLine line = layout.createLine();
+ layout.endLayout();
+
+ qreal x[6];
+ for (int i = 0; i < 6; i++)
+ x[i] = line.cursorToX(i);
+
+ // If the first and third character are using the same
+ // font, they must have the same advance (since they
+ // are surrogate pairs, we need to add two for each
+ // character)
+ QCOMPARE(x[2] - x[0], x[5] - x[3]);
+}
QTEST_MAIN(tst_QTextLayout)
#include "tst_qtextlayout.moc"
diff --git a/tests/auto/qtextstream/tst_qtextstream.cpp b/tests/auto/qtextstream/tst_qtextstream.cpp
index 4c78ef0..005f686 100644
--- a/tests/auto/qtextstream/tst_qtextstream.cpp
+++ b/tests/auto/qtextstream/tst_qtextstream.cpp
@@ -228,6 +228,7 @@ private slots:
void status_real_read();
void status_integer_read();
void status_word_read();
+ void status_write_error();
// use case tests
void useCase1();
@@ -4176,6 +4177,42 @@ void tst_QTextStream::status_word_read()
QCOMPARE(s.status(), QTextStream::ReadPastEnd);
}
+class FakeBuffer : public QBuffer
+{
+protected:
+ qint64 writeData(const char *c, qint64 i) { return m_lock ? 0 : QBuffer::writeData(c, i); }
+public:
+ FakeBuffer(bool locked = false) : m_lock(locked) {}
+ void setLocked(bool locked) { m_lock = locked; }
+private:
+ bool m_lock;
+};
+
+void tst_QTextStream::status_write_error()
+{
+ FakeBuffer fb(false);
+ QVERIFY(fb.open(QBuffer::ReadWrite));
+ QTextStream fs(&fb);
+ fs.setCodec(QTextCodec::codecForName("latin1"));
+ /* first write some initial content */
+ fs << "hello";
+ fs.flush();
+ QCOMPARE(fs.status(), QTextStream::Ok);
+ QCOMPARE(fb.data(), QByteArray("hello"));
+ /* then test that writing can cause an error */
+ fb.setLocked(true);
+ fs << "error";
+ fs.flush();
+ QCOMPARE(fs.status(), QTextStream::WriteFailed);
+ QCOMPARE(fb.data(), QByteArray("hello"));
+ /* finally test that writing after an error doesn't change the stream any more */
+ fb.setLocked(false);
+ fs << "can't do that";
+ fs.flush();
+ QCOMPARE(fs.status(), QTextStream::WriteFailed);
+ QCOMPARE(fb.data(), QByteArray("hello"));
+}
+
void tst_QTextStream::task180679_alignAccountingStyle()
{
{
diff --git a/tests/auto/qwidget/tst_qwidget.cpp b/tests/auto/qwidget/tst_qwidget.cpp
index ae46fe6..de86bb7 100644
--- a/tests/auto/qwidget/tst_qwidget.cpp
+++ b/tests/auto/qwidget/tst_qwidget.cpp
@@ -10051,7 +10051,7 @@ void tst_QWidget::cbaVisibility()
// Verify window decorations i.e. status pane and CBA are visible.
CEikStatusPane* statusPane = CEikonEnv::Static()->AppUiFactory()->StatusPane();
QVERIFY(statusPane->IsVisible());
- CEikButtonGroupContainer* buttonGroup = CEikonEnv::Static()->AppUiFactory()->Cba();
+ CEikButtonGroupContainer* buttonGroup = CEikButtonGroupContainer::Current();
QVERIFY(buttonGroup->IsVisible());
}
@@ -10068,7 +10068,7 @@ void tst_QWidget::fullScreenWindowModeTransitions()
const QRect fullScreenGeometry = qApp->desktop()->screenGeometry(&widget);
const QRect maximumScreenGeometry = qApp->desktop()->availableGeometry(&widget);
CEikStatusPane *statusPane = CEikonEnv::Static()->AppUiFactory()->StatusPane();
- CEikButtonGroupContainer *buttonGroup = CEikonEnv::Static()->AppUiFactory()->Cba();
+ CEikButtonGroupContainer *buttonGroup = CEikButtonGroupContainer::Current();
//Enter
widget.showNormal();
@@ -10122,7 +10122,7 @@ void tst_QWidget::maximizedWindowModeTransitions()
const QRect fullScreenGeometry = qApp->desktop()->screenGeometry(&widget);
const QRect maximumScreenGeometry = qApp->desktop()->availableGeometry(&widget);
CEikStatusPane *statusPane = CEikonEnv::Static()->AppUiFactory()->StatusPane();
- CEikButtonGroupContainer *buttonGroup = CEikonEnv::Static()->AppUiFactory()->Cba();
+ CEikButtonGroupContainer *buttonGroup = CEikButtonGroupContainer::Current();
//Enter
widget.showNormal();
@@ -10178,7 +10178,7 @@ void tst_QWidget::minimizedWindowModeTransitions()
const QRect fullScreenGeometry = qApp->desktop()->screenGeometry(&widget);
const QRect maximumScreenGeometry = qApp->desktop()->availableGeometry(&widget);
CEikStatusPane *statusPane = CEikonEnv::Static()->AppUiFactory()->StatusPane();
- CEikButtonGroupContainer *buttonGroup = CEikonEnv::Static()->AppUiFactory()->Cba();
+ CEikButtonGroupContainer *buttonGroup = CEikButtonGroupContainer::Current();
//Enter
widget.showNormal();
@@ -10234,7 +10234,7 @@ void tst_QWidget::normalWindowModeTransitions()
const QRect fullScreenGeometry = qApp->desktop()->screenGeometry(&widget);
const QRect maximumScreenGeometry = qApp->desktop()->availableGeometry(&widget);
CEikStatusPane *statusPane = CEikonEnv::Static()->AppUiFactory()->StatusPane();
- CEikButtonGroupContainer *buttonGroup = CEikonEnv::Static()->AppUiFactory()->Cba();
+ CEikButtonGroupContainer *buttonGroup = CEikButtonGroupContainer::Current();
//Enter
widget.showMaximized();
diff --git a/tests/auto/qxmlstream/qxmlstream.pro b/tests/auto/qxmlstream/qxmlstream.pro
index 31d77e7..894801d 100644
--- a/tests/auto/qxmlstream/qxmlstream.pro
+++ b/tests/auto/qxmlstream/qxmlstream.pro
@@ -8,7 +8,7 @@ wince*|symbian: {
addFiles.files = data XML-Test-Suite
addFiles.path = .
DEPLOYMENT += addFiles
- DEFINES += SRCDIR=\\\"\\\"
+ wince*:DEFINES += SRCDIR=\\\"\\\"
} else {
DEFINES += SRCDIR=\\\"$$PWD/\\\"
}
diff --git a/tests/auto/qxmlstream/tst_qxmlstream.cpp b/tests/auto/qxmlstream/tst_qxmlstream.cpp
index 7d5e3b7..9e4f3ec 100644
--- a/tests/auto/qxmlstream/tst_qxmlstream.cpp
+++ b/tests/auto/qxmlstream/tst_qxmlstream.cpp
@@ -55,6 +55,10 @@
//TESTED_CLASS=QXmlStreamReader QXmlStreamWriter
//TESTED_FILES=corelib/xml/stream/qxmlutils.cpp corelib/xml/stream/qxmlstream.cpp corelib/xml/stream/qxmlstream_p.h
+#ifdef Q_OS_SYMBIAN
+#define SRCDIR ""
+#endif
+
Q_DECLARE_METATYPE(QXmlStreamReader::ReadElementTextBehaviour)
static const char *const catalogFile = SRCDIR "XML-Test-Suite/xmlconf/finalCatalog.xml";
@@ -570,6 +574,7 @@ private slots:
void checkCommentIndentation() const;
void checkCommentIndentation_data() const;
void qtbug9196_crash() const;
+ void hasError() const;
private:
static QByteArray readFile(const QString &filename);
@@ -1556,5 +1561,86 @@ void tst_QXmlStream::qtbug9196_crash() const
}
}
+class FakeBuffer : public QBuffer
+{
+protected:
+ qint64 writeData(const char *c, qint64 i)
+ {
+ qint64 ai = qMin(m_capacity, i);
+ m_capacity -= ai;
+ return ai ? QBuffer::writeData(c, ai) : 0;
+ }
+public:
+ void setCapacity(int capacity) { m_capacity = capacity; }
+private:
+ qint64 m_capacity;
+};
+
+void tst_QXmlStream::hasError() const
+{
+ {
+ FakeBuffer fb;
+ QVERIFY(fb.open(QBuffer::ReadWrite));
+ fb.setCapacity(1000);
+ QXmlStreamWriter writer(&fb);
+ writer.writeStartDocument();
+ writer.writeEndDocument();
+ QVERIFY(!writer.hasError());
+ QCOMPARE(fb.data(), QByteArray("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"));
+ }
+
+ {
+ // Failure caused by write(QString)
+ FakeBuffer fb;
+ QVERIFY(fb.open(QBuffer::ReadWrite));
+ fb.setCapacity(strlen("<?xml version=\""));
+ QXmlStreamWriter writer(&fb);
+ writer.writeStartDocument();
+ QVERIFY(writer.hasError());
+ QCOMPARE(fb.data(), QByteArray("<?xml version=\""));
+ }
+
+ {
+ // Failure caused by write(char *)
+ FakeBuffer fb;
+ QVERIFY(fb.open(QBuffer::ReadWrite));
+ fb.setCapacity(strlen("<?xml version=\"1.0"));
+ QXmlStreamWriter writer(&fb);
+ writer.writeStartDocument();
+ QVERIFY(writer.hasError());
+ QCOMPARE(fb.data(), QByteArray("<?xml version=\"1.0"));
+ }
+
+ {
+ // Failure caused by write(QStringRef)
+ FakeBuffer fb;
+ QVERIFY(fb.open(QBuffer::ReadWrite));
+ fb.setCapacity(strlen("<?xml version=\"1.0\" encoding=\"UTF-8\"?><test xmlns:"));
+ QXmlStreamWriter writer(&fb);
+ writer.writeStartDocument();
+ writer.writeStartElement("test");
+ writer.writeNamespace("http://foo.bar", "foo");
+ QVERIFY(writer.hasError());
+ QCOMPARE(fb.data(), QByteArray("<?xml version=\"1.0\" encoding=\"UTF-8\"?><test xmlns:"));
+ }
+
+ {
+ // Refusal to write after 1st failure
+ FakeBuffer fb;
+ QVERIFY(fb.open(QBuffer::ReadWrite));
+ fb.setCapacity(10);
+ QXmlStreamWriter writer(&fb);
+ writer.writeStartDocument();
+ QVERIFY(writer.hasError());
+ QCOMPARE(fb.data(), QByteArray("<?xml vers"));
+ fb.setCapacity(1000);
+ writer.writeStartElement("test"); // literal & qstring
+ writer.writeNamespace("http://foo.bar", "foo"); // literal & qstringref
+ QVERIFY(writer.hasError());
+ QCOMPARE(fb.data(), QByteArray("<?xml vers"));
+ }
+
+}
+
#include "tst_qxmlstream.moc"
// vim: et:ts=4:sw=4:sts=4
diff --git a/tests/auto/symbian/orientationchange/orientationchange.pro b/tests/auto/symbian/orientationchange/orientationchange.pro
index 08b34f9..98aa2ad 100644
--- a/tests/auto/symbian/orientationchange/orientationchange.pro
+++ b/tests/auto/symbian/orientationchange/orientationchange.pro
@@ -4,4 +4,5 @@ SOURCES += tst_orientationchange.cpp
symbian {
INCLUDEPATH += $$MW_LAYER_SYSTEMINCLUDE
+ LIBS += -lcone -leikcore -lavkon # Screen orientation
}
diff --git a/tests/auto/symbian/orientationchange/tst_orientationchange.cpp b/tests/auto/symbian/orientationchange/tst_orientationchange.cpp
index eb3709d..2ac2f7f 100644
--- a/tests/auto/symbian/orientationchange/tst_orientationchange.cpp
+++ b/tests/auto/symbian/orientationchange/tst_orientationchange.cpp
@@ -45,6 +45,8 @@
#include <eikenv.h>
#include <aknappui.h>
+#include <private/qcore_symbian_p.h>
+#include <QDesktopWidget>
class tst_orientationchange : public QObject
{
@@ -151,6 +153,47 @@ void tst_orientationchange::resizeEventOnOrientationChange()
}
QCOMPARE(normalWidget->resizeEventCount, 0);
+ QDesktopWidget desktop;
+ QRect qtAvail = desktop.availableGeometry(normalWidget);
+ TRect clientRect = static_cast<CEikAppUi*>(CCoeEnv::Static()-> AppUi())->ClientRect();
+ QRect symbianAvail = qt_TRect2QRect(clientRect);
+ QCOMPARE(qtAvail, symbianAvail);
+
+ // Switch orientation back to original
+ orientation = orientation == CAknAppUi::EAppUiOrientationPortrait
+ ? CAknAppUi::EAppUiOrientationLandscape
+ : CAknAppUi::EAppUiOrientationPortrait;
+
+
+ fullScreenWidget->reset();
+ maximizedWidget->reset();
+ normalWidget->reset();
+
+ TRAP(err, appUi->SetOrientationL(orientation));
+
+ QCoreApplication::sendPostedEvents();
+ QCoreApplication::sendPostedEvents();
+
+ // setOrientationL is not guaranteed to change orientation
+ // (if emulator configured to support just portrait or landscape, then
+ // setOrientationL call shouldn't do anything).
+ // So let's ensure that we do not get resize event twice.
+
+ QVERIFY(fullScreenWidget->resizeEventCount <= 1);
+ if (fullScreenWidget->resizeEventCount) {
+ QCOMPARE(fullScreenWidget->size(), fullScreenWidget->resizeEventSize);
+ }
+ QVERIFY(maximizedWidget->resizeEventCount <= 1);
+ if (fullScreenWidget->resizeEventCount) {
+ QCOMPARE(maximizedWidget->size(), maximizedWidget->resizeEventSize);
+ }
+ QCOMPARE(normalWidget->resizeEventCount, 0);
+
+ qtAvail = desktop.availableGeometry(normalWidget);
+ clientRect = static_cast<CEikAppUi*>(CCoeEnv::Static()-> AppUi())->ClientRect();
+ symbianAvail = qt_TRect2QRect(clientRect);
+ QCOMPARE(qtAvail, symbianAvail);
+
TRAP(err, appUi->SetOrientationL(CAknAppUi::EAppUiOrientationUnspecified));
delete normalWidget;
diff --git a/tests/benchmarks/corelib/io/qdir/tree/bench_qdir_tree.cpp b/tests/benchmarks/corelib/io/qdir/tree/bench_qdir_tree.cpp
index ad5ae98..84922f6 100644
--- a/tests/benchmarks/corelib/io/qdir/tree/bench_qdir_tree.cpp
+++ b/tests/benchmarks/corelib/io/qdir/tree/bench_qdir_tree.cpp
@@ -55,12 +55,24 @@ class bench_QDir_tree
public:
bench_QDir_tree()
- : prefix("./test-tree/")
+ : prefix("./test-tree/"),
+ musicprefix(QLatin1String("music")),
+ photoprefix(QLatin1String("photos")),
+ sourceprefix(QLatin1String("source")),
+ musicsize(0),
+ photosize(0),
+ sourcesize(0)
{
}
private:
QByteArray prefix;
+ QString musicprefix;
+ QString photoprefix;
+ QString sourceprefix;
+ qint64 musicsize;
+ qint64 photosize;
+ qint64 sourcesize;
private slots:
void initTestCase()
@@ -105,6 +117,34 @@ private slots:
line.clear();
}
+
+ //Use case: music collection - 10 files in 100 directories (albums)
+ QVERIFY(fs.createDirectory(musicprefix));
+ for (int i=0;i<1000;i++) {
+ if ((i % 10) == 0)
+ QVERIFY(fs.createDirectory(QString("%1/directory%2").arg(musicprefix).arg(i/10)));
+ qint64 size = fs.createFileWithContent(QString("%1/directory%2/file%3").arg(musicprefix).arg(i/10).arg(i));
+ QVERIFY(size > 0);
+ musicsize += size;
+ }
+ //Use case: photos - 1000 files in 1 directory
+ QVERIFY(fs.createDirectory(photoprefix));
+ for (int i=0;i<1000;i++) {
+ qint64 size = fs.createFileWithContent(QString("%1/file%2").arg(photoprefix).arg(i));
+ QVERIFY(size > 0);
+ photosize += size;
+ }
+ //Use case: source - 10 files in 10 subdirectories in 10 directories (1000 total)
+ QVERIFY(fs.createDirectory(sourceprefix));
+ for (int i=0;i<1000;i++) {
+ if ((i % 100) == 0)
+ QVERIFY(fs.createDirectory(QString("%1/directory%2").arg(sourceprefix).arg(i/100)));
+ if ((i % 10) == 0)
+ QVERIFY(fs.createDirectory(QString("%1/directory%2/subdirectory%3").arg(sourceprefix).arg(i/100).arg(i/10)));
+ qint64 size = fs.createFileWithContent(QString("%1/directory%2/subdirectory%3/file%4").arg(sourceprefix).arg(i/100).arg(i/10).arg(i));
+ QVERIFY(size > 0);
+ sourcesize += size;
+ }
}
void fileSearch_data() const
@@ -154,6 +194,7 @@ private slots:
QDir::AllEntries | QDir::NoDotAndDotDot | QDir::Hidden | QDir::System,
QDirIterator::Subdirectories | QDirIterator::FollowSymlinks);
+ count = 0;
while (iterator.hasNext()) {
iterator.next();
++count;
@@ -165,6 +206,32 @@ private slots:
QCOMPARE(count, 11963);
}
+ void thousandFiles_data() const
+ {
+ QTest::addColumn<QString>("dirName");
+ QTest::addColumn<qint64>("expectedSize");
+ QTest::newRow("music") << musicprefix << musicsize;
+ QTest::newRow("photos") << photoprefix << photosize;
+ QTest::newRow("src") << sourceprefix << sourcesize;
+ }
+
+ void thousandFiles() const
+ {
+ QFETCH(QString, dirName);
+ QFETCH(qint64, expectedSize);
+ QBENCHMARK {
+ qint64 totalsize = 0;
+ int count = 0;
+ QDirIterator iter(dirName, QDir::Files, QDirIterator::Subdirectories);
+ while(iter.hasNext()) {
+ iter.next();
+ count++;
+ totalsize += iter.fileInfo().size();
+ }
+ QCOMPARE(count, 1000);
+ QCOMPARE(totalsize, expectedSize);
+ }
+ }
private:
FileSystem fs;
};
diff --git a/tests/benchmarks/corelib/thread/qmutex/qmutex.pro b/tests/benchmarks/corelib/thread/qmutex/qmutex.pro
index eda2f11..8fda5fa 100644
--- a/tests/benchmarks/corelib/thread/qmutex/qmutex.pro
+++ b/tests/benchmarks/corelib/thread/qmutex/qmutex.pro
@@ -1,6 +1,6 @@
load(qttest_p4)
TEMPLATE = app
TARGET = tst_bench_qmutex
-
+QT -= gui
SOURCES += tst_qmutex.cpp
diff --git a/tests/benchmarks/corelib/thread/qmutex/tst_qmutex.cpp b/tests/benchmarks/corelib/thread/qmutex/tst_qmutex.cpp
index fded508..b0c5702 100644
--- a/tests/benchmarks/corelib/thread/qmutex/tst_qmutex.cpp
+++ b/tests/benchmarks/corelib/thread/qmutex/tst_qmutex.cpp
@@ -39,34 +39,93 @@
**
****************************************************************************/
-#include <qtest.h>
-#include <QtCore>
+#include <QtCore/QtCore>
+#include <QtTest/QtTest>
#include <math.h>
-//TESTED_FILES=
+#ifdef Q_OS_UNIX
+# include <pthread.h>
+# include <errno.h>
+typedef pthread_mutex_t NativeMutexType;
+void NativeMutexInitialize(NativeMutexType *mutex)
+{
+ pthread_mutex_init(mutex, NULL);
+}
+void NativeMutexDestroy(NativeMutexType *mutex)
+{
+ pthread_mutex_destroy(mutex);
+}
+void NativeMutexLock(NativeMutexType *mutex)
+{
+ pthread_mutex_lock(mutex);
+}
+void NativeMutexUnlock(NativeMutexType *mutex)
+{
+ pthread_mutex_unlock(mutex);
+}
+#elif defined(Q_OS_WIN)
+# define _WIN32_WINNT 0x0400
+# include <windows.h>
+typedef CRITICAL_SECTION NativeMutexType;
+void NativeMutexInitialize(NativeMutexType *mutex)
+{
+ InitializeCriticalSection(mutex);
+}
+void NativeMutexDestroy(NativeMutexType *mutex)
+{
+ DeleteCriticalSection(mutex);
+}
+void NativeMutexLock(NativeMutexType *mutex)
+{
+ EnterCriticalSection(mutex);
+}
+void NativeMutexUnlock(NativeMutexType *mutex)
+{
+ LeaveCriticalSection(mutex);
+}
+#endif
+//TESTED_FILES=
class tst_QMutex : public QObject
{
Q_OBJECT
+ int threadCount;
+
public:
- tst_QMutex();
- virtual ~tst_QMutex();
+ // barriers for the contended tests
+ static QSemaphore semaphore1, semaphore2, semaphore3, semaphore4;
+
+ tst_QMutex()
+ {
+ // at least 2 threads, even on single cpu/core machines
+ threadCount = qMax(2, QThread::idealThreadCount());
+ qDebug("thread count: %d", threadCount);
+ }
private slots:
void noThread_data();
void noThread();
-};
-tst_QMutex::tst_QMutex()
-{
-}
+ void uncontendedNative();
+ void uncontendedQMutex();
+ void uncontendedQMutexLocker();
-tst_QMutex::~tst_QMutex()
-{
-}
+ void contendedNative_data();
+ void contendedQMutex_data() { contendedNative_data(); }
+ void contendedQMutexLocker_data() { contendedNative_data(); }
+
+ void contendedNative();
+ void contendedQMutex();
+ void contendedQMutexLocker();
+};
+
+QSemaphore tst_QMutex::semaphore1;
+QSemaphore tst_QMutex::semaphore2;
+QSemaphore tst_QMutex::semaphore3;
+QSemaphore tst_QMutex::semaphore4;
void tst_QMutex::noThread_data()
{
@@ -127,5 +186,248 @@ void tst_QMutex::noThread()
QCOMPARE(int(count), N);
}
+void tst_QMutex::uncontendedNative()
+{
+ NativeMutexType mutex;
+ NativeMutexInitialize(&mutex);
+ QBENCHMARK {
+ NativeMutexLock(&mutex);
+ NativeMutexUnlock(&mutex);
+ }
+ NativeMutexDestroy(&mutex);
+}
+
+void tst_QMutex::uncontendedQMutex()
+{
+ QMutex mutex;
+ QBENCHMARK {
+ mutex.lock();
+ mutex.unlock();
+ }
+}
+
+void tst_QMutex::uncontendedQMutexLocker()
+{
+ QMutex mutex;
+ QBENCHMARK {
+ QMutexLocker locker(&mutex);
+ }
+}
+
+void tst_QMutex::contendedNative_data()
+{
+ QTest::addColumn<int>("iterations");
+ QTest::addColumn<int>("msleepDuration");
+ QTest::addColumn<bool>("use2mutexes");
+
+ QTest::newRow("baseline") << 0 << -1 << false;
+
+ QTest::newRow("no msleep, 1 mutex") << 1000 << -1 << false;
+ QTest::newRow("no msleep, 2 mutexes") << 1000 << -1 << true;
+ QTest::newRow("msleep(0), 1 mutex") << 1000 << 0 << false;
+ QTest::newRow("msleep(0), 2 mutexes") << 1000 << 0 << true;
+ QTest::newRow("msleep(1), 1 mutex") << 10 << 1 << false;
+ QTest::newRow("msleep(1), 2 mutexes") << 10 << 1 << true;
+ QTest::newRow("msleep(2), 1 mutex") << 10 << 2 << false;
+ QTest::newRow("msleep(2), 2 mutexes") << 10 << 2 << true;
+ QTest::newRow("msleep(10), 1 mutex") << 10 << 10 << false;
+ QTest::newRow("msleep(10), 2 mutexes") << 10 << 10 << true;
+}
+
+class NativeMutexThread : public QThread
+{
+ NativeMutexType *mutex1, *mutex2;
+ int iterations, msleepDuration;
+ bool use2mutexes;
+public:
+ bool done;
+ NativeMutexThread(NativeMutexType *mutex1, NativeMutexType *mutex2, int iterations, int msleepDuration, bool use2mutexes)
+ : mutex1(mutex1), mutex2(mutex2), iterations(iterations), msleepDuration(msleepDuration), use2mutexes(use2mutexes), done(false)
+ { }
+ void run() {
+ forever {
+ tst_QMutex::semaphore1.release();
+ tst_QMutex::semaphore2.acquire();
+ if (done)
+ break;
+ for (int i = 0; i < iterations; ++i) {
+ NativeMutexLock(mutex1);
+ if (use2mutexes)
+ NativeMutexLock(mutex2);
+ if (msleepDuration >= 0)
+ msleep(msleepDuration);
+ if (use2mutexes)
+ NativeMutexUnlock(mutex2);
+ NativeMutexUnlock(mutex1);
+
+ QThread::yieldCurrentThread();
+ }
+ tst_QMutex::semaphore3.release();
+ tst_QMutex::semaphore4.acquire();
+ }
+ }
+};
+
+void tst_QMutex::contendedNative()
+{
+ QFETCH(int, iterations);
+ QFETCH(int, msleepDuration);
+ QFETCH(bool, use2mutexes);
+
+ NativeMutexType mutex1, mutex2;
+ NativeMutexInitialize(&mutex1);
+ NativeMutexInitialize(&mutex2);
+
+ QVector<NativeMutexThread *> threads(threadCount);
+ for (int i = 0; i < threads.count(); ++i) {
+ threads[i] = new NativeMutexThread(&mutex1, &mutex2, iterations, msleepDuration, use2mutexes);
+ threads[i]->start();
+ }
+
+ QBENCHMARK {
+ semaphore1.acquire(threadCount);
+ semaphore2.release(threadCount);
+ semaphore3.acquire(threadCount);
+ semaphore4.release(threadCount);
+ }
+
+ for (int i = 0; i < threads.count(); ++i)
+ threads[i]->done = true;
+ semaphore1.acquire(threadCount);
+ semaphore2.release(threadCount);
+ for (int i = 0; i < threads.count(); ++i)
+ threads[i]->wait();
+ qDeleteAll(threads);
+
+ NativeMutexDestroy(&mutex1);
+ NativeMutexDestroy(&mutex2);
+}
+
+class QMutexThread : public QThread
+{
+ QMutex *mutex1, *mutex2;
+ int iterations, msleepDuration;
+ bool use2mutexes;
+public:
+ bool done;
+ QMutexThread(QMutex *mutex1, QMutex *mutex2, int iterations, int msleepDuration, bool use2mutexes)
+ : mutex1(mutex1), mutex2(mutex2), iterations(iterations), msleepDuration(msleepDuration), use2mutexes(use2mutexes), done(false)
+ { }
+ void run() {
+ forever {
+ tst_QMutex::semaphore1.release();
+ tst_QMutex::semaphore2.acquire();
+ if (done)
+ break;
+ for (int i = 0; i < iterations; ++i) {
+ mutex1->lock();
+ if (use2mutexes)
+ mutex2->lock();
+ if (msleepDuration >= 0)
+ msleep(msleepDuration);
+ if (use2mutexes)
+ mutex2->unlock();
+ mutex1->unlock();
+
+ QThread::yieldCurrentThread();
+ }
+ tst_QMutex::semaphore3.release();
+ tst_QMutex::semaphore4.acquire();
+ }
+ }
+};
+
+void tst_QMutex::contendedQMutex()
+{
+ QFETCH(int, iterations);
+ QFETCH(int, msleepDuration);
+ QFETCH(bool, use2mutexes);
+
+ QMutex mutex1, mutex2;
+
+ QVector<QMutexThread *> threads(threadCount);
+ for (int i = 0; i < threads.count(); ++i) {
+ threads[i] = new QMutexThread(&mutex1, &mutex2, iterations, msleepDuration, use2mutexes);
+ threads[i]->start();
+ }
+
+ QBENCHMARK {
+ semaphore1.acquire(threadCount);
+ semaphore2.release(threadCount);
+ semaphore3.acquire(threadCount);
+ semaphore4.release(threadCount);
+ }
+
+ for (int i = 0; i < threads.count(); ++i)
+ threads[i]->done = true;
+ semaphore1.acquire(threadCount);
+ semaphore2.release(threadCount);
+ for (int i = 0; i < threads.count(); ++i)
+ threads[i]->wait();
+ qDeleteAll(threads);
+}
+
+class QMutexLockerThread : public QThread
+{
+ QMutex *mutex1, *mutex2;
+ int iterations, msleepDuration;
+ bool use2mutexes;
+public:
+ bool done;
+ QMutexLockerThread(QMutex *mutex1, QMutex *mutex2, int iterations, int msleepDuration, bool use2mutexes)
+ : mutex1(mutex1), mutex2(mutex2), iterations(iterations), msleepDuration(msleepDuration), use2mutexes(use2mutexes), done(false)
+ { }
+ void run() {
+ forever {
+ tst_QMutex::semaphore1.release();
+ tst_QMutex::semaphore2.acquire();
+ if (done)
+ break;
+ for (int i = 0; i < iterations; ++i) {
+ {
+ QMutexLocker locker1(mutex1);
+ QMutexLocker locker2(use2mutexes ? mutex2 : 0);
+ if (msleepDuration >= 0)
+ msleep(msleepDuration);
+ }
+
+ QThread::yieldCurrentThread();
+ }
+ tst_QMutex::semaphore3.release();
+ tst_QMutex::semaphore4.acquire();
+ }
+ }
+};
+
+void tst_QMutex::contendedQMutexLocker()
+{
+ QFETCH(int, iterations);
+ QFETCH(int, msleepDuration);
+ QFETCH(bool, use2mutexes);
+
+ QMutex mutex1, mutex2;
+
+ QVector<QMutexLockerThread *> threads(threadCount);
+ for (int i = 0; i < threads.count(); ++i) {
+ threads[i] = new QMutexLockerThread(&mutex1, &mutex2, iterations, msleepDuration, use2mutexes);
+ threads[i]->start();
+ }
+
+ QBENCHMARK {
+ semaphore1.acquire(threadCount);
+ semaphore2.release(threadCount);
+ semaphore3.acquire(threadCount);
+ semaphore4.release(threadCount);
+ }
+
+ for (int i = 0; i < threads.count(); ++i)
+ threads[i]->done = true;
+ semaphore1.acquire(threadCount);
+ semaphore2.release(threadCount);
+ for (int i = 0; i < threads.count(); ++i)
+ threads[i]->wait();
+ qDeleteAll(threads);
+}
+
QTEST_MAIN(tst_QMutex)
#include "tst_qmutex.moc"
diff --git a/tests/benchmarks/declarative/binding/binding.pro b/tests/benchmarks/declarative/binding/binding.pro
index ceaabeb..bbe8701 100644
--- a/tests/benchmarks/declarative/binding/binding.pro
+++ b/tests/benchmarks/declarative/binding/binding.pro
@@ -10,7 +10,7 @@ HEADERS += testtypes.h
symbian {
data.files = data
data.path = .
- DEPLOYMENT = data
+ DEPLOYMENT += data
} else {
# Define SRCDIR equal to test's source directory
DEFINES += SRCDIR=\\\"$$PWD\\\"
diff --git a/tests/benchmarks/declarative/qdeclarativeimage/qdeclarativeimage.pro b/tests/benchmarks/declarative/qdeclarativeimage/qdeclarativeimage.pro
index c4d5609..0d7c184 100644
--- a/tests/benchmarks/declarative/qdeclarativeimage/qdeclarativeimage.pro
+++ b/tests/benchmarks/declarative/qdeclarativeimage/qdeclarativeimage.pro
@@ -10,7 +10,7 @@ SOURCES += tst_qdeclarativeimage.cpp
symbian {
importFiles.files = image.png
importFiles.path =
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/benchmarks/declarative/script/script.pro b/tests/benchmarks/declarative/script/script.pro
index d6cb708..75faa5c 100644
--- a/tests/benchmarks/declarative/script/script.pro
+++ b/tests/benchmarks/declarative/script/script.pro
@@ -10,7 +10,7 @@ SOURCES += tst_script.cpp
symbian {
importFiles.files = data
importFiles.path =
- DEPLOYMENT = importFiles
+ DEPLOYMENT += importFiles
} else {
DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/tests/benchmarks/script/sunspider/sunspider.pro b/tests/benchmarks/script/sunspider/sunspider.pro
index 431505b..dce3855 100644
--- a/tests/benchmarks/script/sunspider/sunspider.pro
+++ b/tests/benchmarks/script/sunspider/sunspider.pro
@@ -1,19 +1,11 @@
load(qttest_p4)
TEMPLATE = app
TARGET = tst_bench_sunspider
-
+RESOURCES += sunspider.qrc
SOURCES += tst_sunspider.cpp
QT = core script
-!symbian:DEFINES += SRCDIR=\\\"$$PWD\\\"
-
-wince*|symbian: {
-testFiles.sources = tests
-testFiles.path = .
-DEPLOYMENT += testFiles
-}
-
symbian* {
TARGET.EPOCHEAPSIZE = 0x20000 0x2000000 // Min 128kB, Max 32MB
TARGET.EPOCSTACKSIZE = 0x14000
diff --git a/tests/benchmarks/script/sunspider/sunspider.qrc b/tests/benchmarks/script/sunspider/sunspider.qrc
new file mode 100644
index 0000000..a894ee5
--- /dev/null
+++ b/tests/benchmarks/script/sunspider/sunspider.qrc
@@ -0,0 +1,5 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file>tests</file>
+</qresource>
+</RCC>
diff --git a/tests/benchmarks/script/sunspider/tst_sunspider.cpp b/tests/benchmarks/script/sunspider/tst_sunspider.cpp
index 7a8617a..0df19b6 100644
--- a/tests/benchmarks/script/sunspider/tst_sunspider.cpp
+++ b/tests/benchmarks/script/sunspider/tst_sunspider.cpp
@@ -46,10 +46,6 @@
#include <QtScript/qscriptengine.h>
#include <QtScript/qscriptvalue.h>
-#if defined(Q_OS_SYMBIAN)
-# define SRCDIR ""
-#endif
-
//TESTED_FILES=
static QString readFile(const QString &filename)
@@ -84,9 +80,8 @@ private:
tst_SunSpider::tst_SunSpider()
{
- testsDir = QDir(SRCDIR);
- bool testsFound = testsDir.cd("tests");
- if (!testsFound)
+ testsDir = QDir(":/tests");
+ if (!testsDir.exists())
qWarning("*** no tests/ dir!");
}
diff --git a/tests/benchmarks/script/v8/tst_v8.cpp b/tests/benchmarks/script/v8/tst_v8.cpp
index f8297e2..841e2f3 100644
--- a/tests/benchmarks/script/v8/tst_v8.cpp
+++ b/tests/benchmarks/script/v8/tst_v8.cpp
@@ -46,10 +46,6 @@
#include <QtScript/qscriptengine.h>
#include <QtScript/qscriptvalue.h>
-#if defined(Q_OS_SYMBIAN)
-# define SRCDIR ""
-#endif
-
//TESTED_FILES=
static QString readFile(const QString &filename)
@@ -84,9 +80,8 @@ private:
tst_V8::tst_V8()
{
- testsDir = QDir(SRCDIR);
- bool testsFound = testsDir.cd("tests");
- if (!testsFound)
+ testsDir = QDir(":/tests");
+ if (!testsDir.exists())
qWarning("*** no tests/ dir!");
}
diff --git a/tests/benchmarks/script/v8/v8.pro b/tests/benchmarks/script/v8/v8.pro
index e55fd7f..547eecc 100644
--- a/tests/benchmarks/script/v8/v8.pro
+++ b/tests/benchmarks/script/v8/v8.pro
@@ -1,19 +1,11 @@
load(qttest_p4)
TEMPLATE = app
TARGET = tst_bench_v8
-
+RESOURCES += v8.qrc
SOURCES += tst_v8.cpp
QT = core script
-!symbian:DEFINES += SRCDIR=\\\"$$PWD\\\"
-
-wince*|symbian: {
-testFiles.sources = tests
-testFiles.path = .
-DEPLOYMENT += testFiles
-}
-
symbian* {
TARGET.EPOCHEAPSIZE = 0x20000 0x2000000 // Min 128kB, Max 32MB
TARGET.EPOCSTACKSIZE = 0x14000
diff --git a/tests/benchmarks/script/v8/v8.qrc b/tests/benchmarks/script/v8/v8.qrc
new file mode 100644
index 0000000..a894ee5
--- /dev/null
+++ b/tests/benchmarks/script/v8/v8.qrc
@@ -0,0 +1,5 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file>tests</file>
+</qresource>
+</RCC>
diff --git a/tests/manual/mkspecs/test.sh b/tests/manual/mkspecs/test.sh
index 4b723c0..7e942a4 100755
--- a/tests/manual/mkspecs/test.sh
+++ b/tests/manual/mkspecs/test.sh
@@ -1,4 +1,45 @@
#!/bin/bash
+#############################################################################
+##
+## 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 manual tests of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:LGPL$
+## No Commercial Usage
+## This file contains pre-release code and may not be distributed.
+## You may use this file in accordance with the terms and conditions
+## contained in the Technology Preview License Agreement accompanying
+## this package.
+##
+## GNU Lesser General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU Lesser
+## General Public License version 2.1 as published by the Free Software
+## Foundation and appearing in the file LICENSE.LGPL included in the
+## packaging of this file. Please review the following information to
+## ensure the GNU Lesser General Public License version 2.1 requirements
+## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+##
+## In addition, as a special exception, Nokia gives you certain additional
+## rights. These rights are described in the Nokia Qt LGPL Exception
+## version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+##
+## If you have questions regarding the use of this file, please contact
+## Nokia at qt-info@nokia.com.
+##
+##
+##
+##
+##
+##
+##
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
if [ "$1" == "--help" ]; then
echo "Init a clean git repository somewhere and run this test script from that directory. The first run will"
diff --git a/tests/shared/filesystem.h b/tests/shared/filesystem.h
index 079a6dc..4775671 100644
--- a/tests/shared/filesystem.h
+++ b/tests/shared/filesystem.h
@@ -55,6 +55,9 @@
#define IO_REPARSE_TAG_MOUNT_POINT (0xA0000003L)
#endif
#define REPARSE_MOUNTPOINT_HEADER_SIZE 8
+#ifndef FSCTL_SET_REPARSE_POINT
+#define FSCTL_SET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 41, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
+#endif
#endif
struct FileSystem
@@ -87,6 +90,16 @@ struct FileSystem
return false;
}
+ qint64 createFileWithContent(const QString &fileName)
+ {
+ QFile file(fileName);
+ if (file.open(QIODevice::WriteOnly)) {
+ createdFiles << fileName;
+ return file.write(fileName.toUtf8());
+ }
+ return -1;
+ }
+
bool createLink(const QString &destination, const QString &linkName)
{
if (QFile::link(destination, linkName)) {
diff --git a/tools/assistant/lib/fulltextsearch/qanalyzer.cpp b/tools/assistant/lib/fulltextsearch/qanalyzer.cpp
index 835b72e..56eae69 100644
--- a/tools/assistant/lib/fulltextsearch/qanalyzer.cpp
+++ b/tools/assistant/lib/fulltextsearch/qanalyzer.cpp
@@ -96,6 +96,11 @@ QCLuceneStandardAnalyzer::QCLuceneStandardAnalyzer(const QStringList &stopWords)
tArray[stopWords.count()] = 0;
d->analyzer = new lucene::analysis::standard::StandardAnalyzer(tArray);
+
+ for (int i = 0; i < stopWords.count(); ++i)
+ delete [] tArray[i];
+
+ delete [] tArray;
}
@@ -147,6 +152,11 @@ QCLuceneStopAnalyzer::QCLuceneStopAnalyzer(const QStringList &stopWords)
tArray[stopWords.count()] = 0;
d->analyzer = new lucene::analysis::StopAnalyzer(tArray);
+
+ for (int i = 0; i < stopWords.count(); ++i)
+ delete [] tArray[i];
+
+ delete [] tArray;
}
QStringList QCLuceneStopAnalyzer::englishStopWords() const
diff --git a/tools/assistant/tools/assistant/main.cpp b/tools/assistant/tools/assistant/main.cpp
index e3eef34..5883f7b 100644
--- a/tools/assistant/tools/assistant/main.cpp
+++ b/tools/assistant/tools/assistant/main.cpp
@@ -292,7 +292,8 @@ void setupTranslation(const QString &fileName, const QString &dir)
QTranslator *translator = new QTranslator(QCoreApplication::instance());
if (translator->load(fileName, dir)) {
QCoreApplication::installTranslator(translator);
- } else if (!fileName.endsWith(QLatin1String("en_US"))) {
+ } else if (!fileName.endsWith(QLatin1String("en_US"))
+ && !fileName.endsWith(QLatin1String("_C"))) {
qWarning("Could not load translation file %s in directory %s.",
qPrintable(fileName), qPrintable(dir));
}
diff --git a/tools/configure/configure.pro b/tools/configure/configure.pro
index 0a49fbe..608d876 100644
--- a/tools/configure/configure.pro
+++ b/tools/configure/configure.pro
@@ -48,6 +48,10 @@ HEADERS = configureapp.h environment.h tools.h\
$$QT_SOURCE_TREE/src/corelib/io/qdiriterator.h \
$$QT_SOURCE_TREE/src/corelib/io/qfile.h \
$$QT_SOURCE_TREE/src/corelib/io/qfileinfo.h \
+ $$QT_SOURCE_TREE/src/corelib/io/qfilesystementry_p.h \
+ $$QT_SOURCE_TREE/src/corelib/io/qfilesystemengine_p.h \
+ $$QT_SOURCE_TREE/src/corelib/io/qfilesystemmetadata_p.h \
+ $$QT_SOURCE_TREE/src/corelib/io/qfilesystemiterator_p.h \
$$QT_SOURCE_TREE/src/corelib/io/qfsfileengine.h \
$$QT_SOURCE_TREE/src/corelib/io/qfsfileengine_iterator_p.h \
$$QT_SOURCE_TREE/src/corelib/io/qiodevice.h \
@@ -86,9 +90,13 @@ SOURCES = main.cpp configureapp.cpp environment.cpp tools.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qfile.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qfileinfo.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qabstractfileengine.cpp \
+ $$QT_SOURCE_TREE/src/corelib/io/qfilesystementry.cpp \
+ $$QT_SOURCE_TREE/src/corelib/io/qfilesystemengine.cpp \
+ $$QT_SOURCE_TREE/src/corelib/io/qfilesystemengine_win.cpp \
+ $$QT_SOURCE_TREE/src/corelib/io/qfilesystemiterator_win.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qfsfileengine.cpp \
+ $$QT_SOURCE_TREE/src/corelib/io/qfsfileengine_win.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qfsfileengine_iterator.cpp \
- $$QT_SOURCE_TREE/src/corelib/io/qfsfileengine_iterator_win.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qiodevice.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qtextstream.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qtemporaryfile.cpp \
@@ -115,8 +123,6 @@ SOURCES = main.cpp configureapp.cpp environment.cpp tools.cpp \
$$QT_SOURCE_TREE/tools/shared/symbian/epocroot.cpp \
$$QT_SOURCE_TREE/tools/shared/windows/registry.cpp
-win32:SOURCES += $$QT_SOURCE_TREE/src/corelib/io/qfsfileengine_win.cpp
-
DEFINES += COMMERCIAL_VERSION
INCLUDEPATH += $$QT_SOURCE_TREE/src/corelib/arch/generic \
diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp
index 479fd4c..cc7ed9c 100644
--- a/tools/configure/configureapp.cpp
+++ b/tools/configure/configureapp.cpp
@@ -739,6 +739,23 @@ void Configure::parseCmdLine()
} else if (configCmdLine.at(i) == "-opengl-es-2") {
dictionary[ "OPENGL" ] = "yes";
dictionary[ "OPENGL_ES_2" ] = "yes";
+ } else if (configCmdLine.at(i) == "-opengl") {
+ dictionary[ "OPENGL" ] = "yes";
+ i++;
+ if (i == argCount)
+ break;
+
+ if (configCmdLine.at(i) == "es1") {
+ dictionary[ "OPENGL_ES_CM" ] = "yes";
+ } else if ( configCmdLine.at(i) == "es2" ) {
+ dictionary[ "OPENGL_ES_2" ] = "yes";
+ } else if ( configCmdLine.at(i) == "desktop" ) {
+ dictionary[ "OPENGL_ES_2" ] = "yes";
+ } else {
+ cout << "Argument passed to -opengl option is not valid." << endl;
+ dictionary[ "DONE" ] = "error";
+ break;
+ }
}
// OpenVG Support -------------------------------------------
@@ -1010,6 +1027,8 @@ void Configure::parseCmdLine()
if (dictionary.contains("XQMAKESPEC") && dictionary["XQMAKESPEC"].startsWith("symbian")) {
dictionary[ "QT_INSTALL_PLUGINS" ] =
QString("\\resource\\qt%1\\plugins").arg(dictionary[ "QT_LIBINFIX" ]);
+ dictionary[ "QT_INSTALL_IMPORTS" ] =
+ QString("\\resource\\qt%1\\imports").arg(dictionary[ "QT_LIBINFIX" ]);
}
} else if (configCmdLine.at(i) == "-D") {
++i;
@@ -1733,6 +1752,11 @@ bool Configure::displayHelp()
desc("QT3SUPPORT", "no","-no-qt3support", "Disables the Qt 3 support functionality.\n");
desc("OPENGL", "no","-no-opengl", "Disables OpenGL functionality\n");
+ desc("OPENGL", "no","-opengl <api>", "Enable OpenGL support with specified API version.\n"
+ "Available values for <api>:");
+ desc("", "", "", " desktop - Enable support for Desktop OpenGL", ' ');
+ desc("OPENGL_ES_CM", "no", "", " es1 - Enable support for OpenGL ES Common Profile", ' ');
+ desc("OPENGL_ES_2", "no", "", " es2 - Enable support for OpenGL ES 2.0", ' ');
desc("OPENVG", "no","-no-openvg", "Disables OpenVG functionality\n");
desc("OPENVG", "yes","-openvg", "Enables OpenVG functionality");
@@ -1892,8 +1916,7 @@ bool Configure::displayHelp()
desc("CETEST", "no", "-no-cetest", "Do not compile Windows CE remote test application");
desc("CETEST", "yes", "-cetest", "Compile Windows CE remote test application");
desc( "-signature <file>", "Use file for signing the target project");
- desc("OPENGL_ES_CM", "no", "-opengl-es-cm", "Enable support for OpenGL ES Common");
- desc("OPENGL_ES_2", "no", "-opengl-es-2", "Enable support for OpenGL ES 2.0");
+
desc("DIRECTSHOW", "no", "-phonon-wince-ds9", "Enable Phonon Direct Show 9 backend for Windows CE");
// Qt\Symbian only options go below here -----------------------------------------------------------------------------
@@ -2483,15 +2506,11 @@ void Configure::generateOutputVars()
qtConfig += "no-gif";
else if (dictionary[ "GIF" ] == "yes")
qtConfig += "gif";
- else if (dictionary[ "GIF" ] == "plugin")
- qmakeFormatPlugins += "gif";
if (dictionary[ "TIFF" ] == "no")
qtConfig += "no-tiff";
else if (dictionary[ "TIFF" ] == "yes")
qtConfig += "tiff";
- else if (dictionary[ "TIFF" ] == "plugin")
- qmakeFormatPlugins += "tiff";
if (dictionary[ "LIBTIFF" ] == "system")
qtConfig += "system-tiff";
@@ -2499,8 +2518,6 @@ void Configure::generateOutputVars()
qtConfig += "no-jpeg";
else if (dictionary[ "JPEG" ] == "yes")
qtConfig += "jpeg";
- else if (dictionary[ "JPEG" ] == "plugin")
- qmakeFormatPlugins += "jpeg";
if (dictionary[ "LIBJPEG" ] == "system")
qtConfig += "system-jpeg";
@@ -2819,8 +2836,6 @@ void Configure::generateOutputVars()
qmakeVars += QString("styles += ") + qmakeStyles.join(" ");
if (!qmakeStylePlugins.isEmpty())
qmakeVars += QString("style-plugins += ") + qmakeStylePlugins.join(" ");
- if (!qmakeFormatPlugins.isEmpty())
- qmakeVars += QString("imageformat-plugins += ") + qmakeFormatPlugins.join(" ");
if (dictionary["QMAKESPEC"].endsWith("-g++")) {
QString includepath = qgetenv("INCLUDE");
@@ -3261,8 +3276,14 @@ void Configure::generateConfigfiles()
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(" << pltSpec << "/qmake.conf)" << endl;
+ qmakeConfStream << "include(" << "../" << spec << "/qmake.conf)" << endl << endl;
qmakeConfStream.flush();
qmakeConfFile.close();
}
@@ -3426,7 +3447,7 @@ void Configure::displayConfig()
QString webkit = dictionary[ "WEBKIT" ];
if (webkit == "debug")
webkit = "yes (debug)";
- cout << "WebKit support.............." << webkit;
+ cout << "WebKit support.............." << webkit << endl;
}
cout << "Declarative support........." << dictionary[ "DECLARATIVE" ] << endl;
cout << "Declarative debugging......." << dictionary[ "DECLARATIVE_DEBUG" ] << endl;
diff --git a/tools/configure/configureapp.h b/tools/configure/configureapp.h
index b3c07f7..32d1860 100644
--- a/tools/configure/configureapp.h
+++ b/tools/configure/configureapp.h
@@ -122,8 +122,6 @@ private:
QStringList qmakeStyles;
QStringList qmakeStylePlugins;
- QStringList qmakeFormatPlugins;
-
QStringList qmakeVars;
QStringList qmakeDefines;
// makeList[0] for qt and qtmain
diff --git a/tools/designer/src/lib/shared/qtresourcemodel.cpp b/tools/designer/src/lib/shared/qtresourcemodel.cpp
index e3fc805..d04a5fc 100644
--- a/tools/designer/src/lib/shared/qtresourcemodel.cpp
+++ b/tools/designer/src/lib/shared/qtresourcemodel.cpp
@@ -184,15 +184,15 @@ const QByteArray *QtResourceModelPrivate::createResource(const QString &path, QS
break;
// return code cannot be fully trusted, might still be empty
const ResourceDataFileMap resMap = library.resourceDataFileMap();
- if (resMap.empty())
- break;
-
if (!library.output(buffer, errorDevice))
break;
*errorCount = library.failedResources().size();
*contents = resMap.keys();
+ if (resMap.empty())
+ break;
+
buffer.close();
rc = new QByteArray(buffer.data());
} while (false);
@@ -225,15 +225,18 @@ void QtResourceModelPrivate::registerResourceSet(QtResourceSet *resourceSet)
qDebug() << "registerResourceSet " << path;
const PathDataMap::const_iterator itRcc = m_pathToData.constFind(path);
if (itRcc != m_pathToData.constEnd()) { // otherwise data was not created yet
- if (!QResource::registerResource(reinterpret_cast<const uchar *>(itRcc.value()->constData()))) {
- qDebug() << "** WARNING: Failed to register " << path << " (QResource failure).";
- } else {
- QStringList contents = m_pathToContents.value(path);
- QStringListIterator itContents(contents);
- while (itContents.hasNext()) {
- const QString filePath = itContents.next();
- if (!m_fileToQrc.contains(filePath)) // the first loaded resource has higher priority in qt resource system
- m_fileToQrc.insert(filePath, path);
+ const QByteArray *data = itRcc.value();
+ if (data) {
+ if (!QResource::registerResource(reinterpret_cast<const uchar *>(data->constData()))) {
+ qWarning() << "** WARNING: Failed to register " << path << " (QResource failure).";
+ } else {
+ QStringList contents = m_pathToContents.value(path);
+ QStringListIterator itContents(contents);
+ while (itContents.hasNext()) {
+ const QString filePath = itContents.next();
+ if (!m_fileToQrc.contains(filePath)) // the first loaded resource has higher priority in qt resource system
+ m_fileToQrc.insert(filePath, path);
+ }
}
}
}
@@ -254,8 +257,11 @@ void QtResourceModelPrivate::unregisterResourceSet(QtResourceSet *resourceSet)
qDebug() << "unregisterResourceSet " << path;
const PathDataMap::const_iterator itRcc = m_pathToData.constFind(path);
if (itRcc != m_pathToData.constEnd()) { // otherwise data was not created yet
- if (!QResource::unregisterResource(reinterpret_cast<const uchar *>(itRcc.value()->constData())))
- qDebug() << "** WARNING: Failed to unregister " << path << " (QResource failure).";
+ const QByteArray *data = itRcc.value();
+ if (data) {
+ if (!QResource::unregisterResource(reinterpret_cast<const uchar *>(itRcc.value()->constData())))
+ qWarning() << "** WARNING: Failed to unregister " << path << " (QResource failure).";
+ }
}
}
m_fileToQrc.clear();
@@ -292,15 +298,13 @@ void QtResourceModelPrivate::activate(QtResourceSet *resourceSet, const QStringL
QStringList contents;
int qrcErrorCount;
generatedCount++;
- if (const QByteArray *data = createResource(path, &contents, &qrcErrorCount, errorStream)) {
- newPathToData.insert(path, data);
- if (qrcErrorCount) // Count single failed files as sort of 1/2 error
- errorCount++;
- addWatcher(path);
- } else {
- newPathToData.remove(path);
+ const QByteArray *data = createResource(path, &contents, &qrcErrorCount, errorStream);
+
+ newPathToData.insert(path, data);
+ if (qrcErrorCount) // Count single failed files as sort of 1/2 error
errorCount++;
- }
+ addWatcher(path);
+
m_pathToModified.insert(path, false);
m_pathToContents.insert(path, contents);
newResourceSetChanged = true;
@@ -326,7 +330,7 @@ void QtResourceModelPrivate::activate(QtResourceSet *resourceSet, const QStringL
QListIterator<const QByteArray *> itOld(oldData);
if (itOld.hasNext()) {
const QByteArray *array = itOld.next();
- if (!newData.contains(array))
+ if (array && !newData.contains(array))
toDelete.append(array);
}
diff --git a/tools/designer/src/lib/shared/widgetdatabase.cpp b/tools/designer/src/lib/shared/widgetdatabase.cpp
index 0c3e949..7ab450d 100644
--- a/tools/designer/src/lib/shared/widgetdatabase.cpp
+++ b/tools/designer/src/lib/shared/widgetdatabase.cpp
@@ -54,7 +54,8 @@
#include <QtDesigner/QDesignerFormEditorInterface>
#include <QtXml/QXmlStreamWriter>
-#include <QtCore/QtAlgorithms>
+
+#include <QtCore/QScopedPointer>
#include <QtCore/qdebug.h>
#include <QtCore/QMetaProperty>
#include <QtCore/QTextStream>
@@ -565,10 +566,10 @@ static QString xmlFromWidgetBox(const QDesignerFormEditorInterface *core, const
const bool found = QDesignerWidgetBox::findWidget(core->widgetBox(), className, QString(), &widget);
if (!found)
return QString();
- DomUI *domUI = QDesignerWidgetBox::xmlToUi(className, widget.domXml(), false);
- domUI->setAttributeVersion(QLatin1String("4.0"));
- if (!domUI)
+ QScopedPointer<DomUI> domUI(QDesignerWidgetBox::xmlToUi(className, widget.domXml(), false));
+ if (domUI.isNull())
return QString();
+ domUI->setAttributeVersion(QLatin1String("4.0"));
DomWidget *domWidget = domUI->elementWidget();
if (!domWidget)
return QString();
@@ -615,7 +616,6 @@ static QString xmlFromWidgetBox(const QDesignerFormEditorInterface *core, const
domUI->write(writer);
writer.writeEndDocument();
}
- delete domUI;
return rc;
}
diff --git a/tools/linguist/linguist/messagemodel.cpp b/tools/linguist/linguist/messagemodel.cpp
index 36202ab..17608d9 100644
--- a/tools/linguist/linguist/messagemodel.cpp
+++ b/tools/linguist/linguist/messagemodel.cpp
@@ -209,6 +209,13 @@ bool DataModel::load(const QString &fileName, bool *langGuessed, QWidget *parent
return false;
}
+ if (!tor.messageCount()) {
+ QMessageBox::warning(parent, QObject::tr("Qt Linguist"),
+ tr("The translation file '%1' will not be loaded because it is empty.")
+ .arg(Qt::escape(fileName)));
+ return false;
+ }
+
Translator::Duplicates dupes = tor.resolveDuplicates();
if (!dupes.byId.isEmpty() || !dupes.byContents.isEmpty()) {
QString err = tr("<qt>Duplicate messages found in '%1':").arg(Qt::escape(fileName));
diff --git a/tools/macdeployqt/shared/shared.cpp b/tools/macdeployqt/shared/shared.cpp
index c7d23c0..d974f5d 100644
--- a/tools/macdeployqt/shared/shared.cpp
+++ b/tools/macdeployqt/shared/shared.cpp
@@ -574,9 +574,13 @@ void createDiskImage(const QString &appBundlePath)
}
// More dmg options can be found in the hdiutil man page.
- QString options = QString("create %1.dmg -srcfolder %1.app -format UDZO -volname %1").arg(appBaseName);
+ QStringList options = QStringList()
+ << "create" << dmgName
+ << "-srcfolder" << appBundlePath
+ << "-format" << "UDZO"
+ << "-volname" << appBaseName;
QProcess hdutil;
- hdutil.start("hdiutil", options.split(' '));
+ hdutil.start("hdiutil", options);
hdutil.waitForFinished(-1);
}
diff --git a/tools/qmeegographicssystemhelper/qmeegographicssystemhelper.h b/tools/qmeegographicssystemhelper/qmeegographicssystemhelper.h
index d47c829..6df3c22 100644
--- a/tools/qmeegographicssystemhelper/qmeegographicssystemhelper.h
+++ b/tools/qmeegographicssystemhelper/qmeegographicssystemhelper.h
@@ -181,6 +181,9 @@ public:
This function needs to be called *before* any widget/content is created.
When called with true, the base window surface will be translucent and initialized
with QGLFormat.alpha == true.
+
+ This function is *deprecated*. Set Qt::WA_TranslucentBackground attribute
+ on the top-level widget *before* you show it instead.
*/
static void setTranslucent(bool translucent);
};
diff --git a/tools/qml/browser/Browser.qml b/tools/qml/browser/Browser.qml
index ebed72f..968d077 100644
--- a/tools/qml/browser/Browser.qml
+++ b/tools/qml/browser/Browser.qml
@@ -173,14 +173,14 @@ Rectangle {
width: parent.width
model: folders1
delegate: folderDelegate
- highlight: Rectangle {
+ highlight: Rectangle {
color: palette.highlight
visible: root.showFocusHighlight && view1.count != 0
gradient: Gradient {
GradientStop { id: t1; position: 0.0; color: palette.highlight }
GradientStop { id: t2; position: 1.0; color: Qt.lighter(palette.highlight) }
}
- width: view1.currentItem.width
+ width: view1.currentItem == null ? 0 : view1.currentItem.width
}
highlightMoveSpeed: 1000
pressDelay: 100
@@ -230,7 +230,7 @@ Rectangle {
GradientStop { id: t1; position: 0.0; color: palette.highlight }
GradientStop { id: t2; position: 1.0; color: Qt.lighter(palette.highlight) }
}
- width: view1.currentItem.width
+ width: view1.currentItem == null ? 0 : view1.currentItem.width
}
highlightMoveSpeed: 1000
pressDelay: 100
diff --git a/tools/qml/deviceorientation.h b/tools/qml/deviceorientation.h
index 487ebd4..88ceb1b 100644
--- a/tools/qml/deviceorientation.h
+++ b/tools/qml/deviceorientation.h
@@ -52,8 +52,8 @@ class DeviceOrientation : public QObject
Q_OBJECT
Q_ENUMS(Orientation)
public:
- enum Orientation {
- UnknownOrientation,
+ enum Orientation {
+ UnknownOrientation,
Portrait,
Landscape,
PortraitInverted,
diff --git a/tools/qml/main.cpp b/tools/qml/main.cpp
index 209c72f..b9513b9 100644
--- a/tools/qml/main.cpp
+++ b/tools/qml/main.cpp
@@ -59,6 +59,19 @@ QtMsgHandler systemMsgOutput = 0;
static QDeclarativeViewer *openFile(const QString &fileName);
static void showViewer(QDeclarativeViewer *viewer);
+QString warnings;
+void exitApp(int i)
+{
+#ifdef Q_OS_WIN
+ // Debugging output is not visible by default on Windows -
+ // therefore show modal dialog with errors instead.
+ if (!warnings.isEmpty()) {
+ QMessageBox::warning(0, QApplication::tr("Qt QML Viewer"), warnings);
+ }
+#endif
+ exit(i);
+}
+
#if defined (Q_OS_SYMBIAN)
#include <unistd.h>
#include <sys/types.h>
@@ -85,31 +98,22 @@ void myMessageOutput(QtMsgType type, const char *msg)
QWeakPointer<LoggerWidget> logger;
-QString warnings;
-void showWarnings()
-{
- if (!warnings.isEmpty()) {
- int argc = 0; char **argv = 0;
- QApplication application(argc, argv); // QApplication() in main has been destroyed already.
- Q_UNUSED(application)
- QMessageBox::warning(0, QApplication::tr("Qt QML Viewer"), warnings);
- }
-}
-
static QAtomicInt recursiveLock(0);
void myMessageOutput(QtMsgType type, const char *msg)
{
QString strMsg = QString::fromLatin1(msg);
- if (!logger.isNull() && !QCoreApplication::closingDown()) {
- if (recursiveLock.testAndSetOrdered(0, 1)) {
- QMetaObject::invokeMethod(logger.data(), "append", Q_ARG(QString, strMsg));
- recursiveLock = 0;
+ if (!QCoreApplication::closingDown()) {
+ if (!logger.isNull()) {
+ if (recursiveLock.testAndSetOrdered(0, 1)) {
+ QMetaObject::invokeMethod(logger.data(), "append", Q_ARG(QString, strMsg));
+ recursiveLock = 0;
+ }
+ } else {
+ warnings += strMsg;
+ warnings += QLatin1Char('\n');
}
- } else {
- warnings += strMsg;
- warnings += QLatin1Char('\n');
}
if (systemMsgOutput) { // Windows
systemMsgOutput(type, msg);
@@ -165,7 +169,8 @@ void usage()
qWarning(" ");
qWarning(" Press F1 for interactive help");
- exit(1);
+
+ exitApp(1);
}
void scriptOptsUsage()
@@ -184,7 +189,8 @@ void scriptOptsUsage()
qWarning(" saveonexit ............................... save recording on viewer exit");
qWarning(" ");
qWarning(" One of record, play or both must be specified.");
- exit(1);
+
+ exitApp(1);
}
enum WarningsConfig { ShowWarnings, HideWarnings, DefaultWarnings };
@@ -370,7 +376,7 @@ static void parseCommandLineOptions(const QStringList &arguments)
qApp->setStartDragDistance(arguments.at(++i).toInt());
} else if (arg == QLatin1String("-v") || arg == QLatin1String("-version")) {
qWarning("Qt QML Viewer version %s", QT_VERSION_STR);
- exit(0);
+ exitApp(0);
} else if (arg == "-translation") {
if (lastArg) usage();
opts.translationFile = arguments.at(++i);
@@ -400,7 +406,7 @@ static void parseCommandLineOptions(const QStringList &arguments)
QDeclarativeEngine tmpEngine;
QString paths = tmpEngine.importPathList().join(QLatin1String(":"));
qWarning("Current search path: %s", paths.toLocal8Bit().constData());
- exit(0);
+ exitApp(0);
}
opts.imports << arguments.at(++i);
} else if (arg == "-P") {
@@ -529,12 +535,6 @@ int main(int argc, char ** argv)
systemMsgOutput = qInstallMsgHandler(myMessageOutput);
#endif
-#if defined (Q_OS_WIN)
- // Debugging output is not visible by default on Windows -
- // therefore show modal dialog with errors instead.
- atexit(showWarnings);
-#endif
-
#if defined (Q_WS_X11) || defined (Q_WS_MAC)
//### default to using raster graphics backend for now
bool gsSpecified = false;
diff --git a/tools/qml/qdeclarativetester.cpp b/tools/qml/qdeclarativetester.cpp
index a516fd7..1bcdb04 100644
--- a/tools/qml/qdeclarativetester.cpp
+++ b/tools/qml/qdeclarativetester.cpp
@@ -54,9 +54,9 @@ QT_BEGIN_NAMESPACE
extern Q_GUI_EXPORT bool qt_applefontsmoothing_enabled;
-QDeclarativeTester::QDeclarativeTester(const QString &script, QDeclarativeViewer::ScriptOptions opts,
+QDeclarativeTester::QDeclarativeTester(const QString &script, QDeclarativeViewer::ScriptOptions opts,
QDeclarativeView *parent)
-: QAbstractAnimation(parent), m_script(script), m_view(parent), filterEvents(true), options(opts),
+: QAbstractAnimation(parent), m_script(script), m_view(parent), filterEvents(true), options(opts),
testscript(0), hasCompleted(false), hasFailed(false)
{
parent->viewport()->installEventFilter(this);
@@ -75,8 +75,8 @@ QDeclarativeTester::QDeclarativeTester(const QString &script, QDeclarativeViewer
QDeclarativeTester::~QDeclarativeTester()
{
- if (!hasFailed &&
- options & QDeclarativeViewer::Record &&
+ if (!hasFailed &&
+ options & QDeclarativeViewer::Record &&
options & QDeclarativeViewer::SaveOnExit)
save();
}
@@ -228,7 +228,7 @@ void QDeclarativeTester::save()
}
ts << " }\n";
- while (!mouseevents.isEmpty() &&
+ while (!mouseevents.isEmpty() &&
mouseevents.first().msec == fe.msec) {
MouseEvent me = mouseevents.takeFirst();
@@ -274,7 +274,16 @@ void QDeclarativeTester::updateCurrentTime(int msec)
if (options & QDeclarativeViewer::TestImages) {
img.fill(qRgb(255,255,255));
+
+#ifdef Q_WS_MAC
+ bool oldSmooth = qt_applefontsmoothing_enabled;
+ qt_applefontsmoothing_enabled = false;
+#endif
QPainter p(&img);
+#ifdef Q_WS_MAC
+ qt_applefontsmoothing_enabled = oldSmooth;
+#endif
+
m_view->render(&p);
}
@@ -336,7 +345,7 @@ void QDeclarativeTester::updateCurrentTime(int msec)
if (QDeclarativeVisualTestFrame *frame = qobject_cast<QDeclarativeVisualTestFrame *>(event)) {
if (frame->msec() < msec) {
if (options & QDeclarativeViewer::TestImages && !(options & QDeclarativeViewer::Record)) {
- qWarning() << "QDeclarativeTester(" << m_script << "): Extra frame. Seen:"
+ qWarning() << "QDeclarativeTester(" << m_script << "): Extra frame. Seen:"
<< msec << "Expected:" << frame->msec();
imagefailure();
}
@@ -362,7 +371,7 @@ void QDeclarativeTester::updateCurrentTime(int msec)
}
if (goodImage != img) {
QString reject(frame->image().toLocalFile() + ".reject.png");
- qWarning() << "QDeclarativeTester(" << m_script << "): Image mismatch. Reject saved to:"
+ qWarning() << "QDeclarativeTester(" << m_script << "): Image mismatch. Reject saved to:"
<< reject;
img.save(reject);
bool doDiff = (goodImage.size() == img.size());
@@ -415,7 +424,7 @@ void QDeclarativeTester::updateCurrentTime(int msec)
ke.destination = ViewPort;
}
m_savedKeyEvents.append(ke);
- }
+ }
testscriptidx++;
}
diff --git a/tools/qml/qdeclarativetester.h b/tools/qml/qdeclarativetester.h
index 0cf508a..6fdf495 100644
--- a/tools/qml/qdeclarativetester.h
+++ b/tools/qml/qdeclarativetester.h
@@ -122,7 +122,7 @@ public:
int type() const { return m_type; }
void setType(int t) { m_type = t; }
-
+
int button() const { return m_button; }
void setButton(int b) { m_button = b; }
@@ -237,7 +237,7 @@ private:
struct MouseEvent {
MouseEvent(QMouseEvent *e)
- : type(e->type()), button(e->button()), buttons(e->buttons()),
+ : type(e->type()), button(e->button()), buttons(e->buttons()),
pos(e->pos()), modifiers(e->modifiers()), destination(View) {}
QEvent::Type type;
diff --git a/tools/qml/qml.pro b/tools/qml/qml.pro
index 3927dd6..bdac6e3 100644
--- a/tools/qml/qml.pro
+++ b/tools/qml/qml.pro
@@ -4,7 +4,7 @@ DESTDIR = ../../bin
include(qml.pri)
-SOURCES += main.cpp
+SOURCES += main.cpp
INCLUDEPATH += ../../include/QtDeclarative
INCLUDEPATH += ../../src/declarative/util
@@ -26,7 +26,7 @@ wince* {
QT += xmlpatterns
}
contains(QT_CONFIG, webkit) {
- QT += webkit
+ QT += webkit
}
}
maemo5 {
diff --git a/tools/qml/qmlruntime.cpp b/tools/qml/qmlruntime.cpp
index 7ea77d1..142e4c5 100644
--- a/tools/qml/qmlruntime.cpp
+++ b/tools/qml/qmlruntime.cpp
@@ -820,7 +820,7 @@ void QDeclarativeViewer::createMenu()
fileMenu->addAction(reloadAction);
fileMenu->addSeparator();
fileMenu->addAction(closeAction);
-#if !defined(Q_OS_SYMBIAN)
+#if !defined(Q_OS_SYMBIAN)
fileMenu->addAction(quitAction);
QMenu *recordMenu = menu->addMenu(tr("&Recording"));
@@ -836,7 +836,7 @@ void QDeclarativeViewer::createMenu()
settingsMenu->addAction(proxyAction);
#if defined(Q_OS_SYMBIAN)
settingsMenu->addAction(fullscreenAction);
-#else
+#else
settingsMenu->addAction(recordOptions);
settingsMenu->addMenu(loggerWindow->preferencesMenu());
#endif // !Q_OS_SYMBIAN
@@ -1520,7 +1520,7 @@ void QDeclarativeViewer::updateSizeHints(bool initial)
//qWarning() << "USH: R2V: setting free size ";
layout()->setSizeConstraint(QLayout::SetNoConstraint);
layout()->activate();
- setMinimumSize(QSize(1,1));
+ setMinimumSize(minimumSizeHint());
setMaximumSize(QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX));
canvas->setMinimumSize(QSize(0,0));
canvas->setMaximumSize(QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX));
diff --git a/tools/qml/startup/startup.qml b/tools/qml/startup/startup.qml
index 9ca50a3..35c44c2 100644
--- a/tools/qml/startup/startup.qml
+++ b/tools/qml/startup/startup.qml
@@ -92,8 +92,8 @@ Rectangle {
to: 360
loops: NumberAnimation.Infinite
running: true
- duration: 2000
- }
+ duration: 2000
+ }
}
}
}
@@ -168,6 +168,6 @@ Rectangle {
}
}
}
- ]
+ ]
} // treatsApp
diff --git a/tools/qml/texteditautoresizer_maemo5.h b/tools/qml/texteditautoresizer_maemo5.h
index bb5567a..fd35ca5 100644
--- a/tools/qml/texteditautoresizer_maemo5.h
+++ b/tools/qml/texteditautoresizer_maemo5.h
@@ -41,7 +41,7 @@
#include <QtGui/qplaintextedit.h>
#include <QtGui/qtextedit.h>
-#include <QtGui/qabstractkineticscroller.h>
+#include <QtGui/qscroller.h>
#include <QtGui/qscrollarea.h>
#include <QtDebug>
@@ -102,11 +102,11 @@ void TextEditAutoResizer::textEditChanged()
QPoint scrollto = area->widget()->mapFrom(edit, cursor.center());
QPoint margin(10 + cursor.width(), 2 * cursor.height());
- if (QAbstractKineticScroller *scroller = area->property("kineticScroller").value<QAbstractKineticScroller *>()) {
- scroller->ensureVisible(scrollto, margin.x(), margin.y());
- } else {
- area->ensureVisible(scrollto.x(), scrollto.y(), margin.x(), margin.y());
- }
+#ifdef Q_WS_MAEMO_5
+ QScroller::scroller(area)->ensureVisible(scrollto, margin.x(), margin.y());
+#else
+ area->ensureVisible(scrollto.x(), scrollto.y(), margin.x(), margin.y());
+#endif
}
}
diff --git a/tools/qtestlib/wince/cetest/bootstrapped.pri b/tools/qtestlib/wince/cetest/bootstrapped.pri
index b9c4b2b..56c8ab7 100644
--- a/tools/qtestlib/wince/cetest/bootstrapped.pri
+++ b/tools/qtestlib/wince/cetest/bootstrapped.pri
@@ -4,11 +4,14 @@ SOURCES += \
$$QT_SOURCE_TREE/src/corelib/tools/qstringlist.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qfile.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qdir.cpp \
+ $$QT_SOURCE_TREE/src/corelib/io/qfilesystementry.cpp \
+ $$QT_SOURCE_TREE/src/corelib/io/qfilesystemengine.cpp \
+ $$QT_SOURCE_TREE/src/corelib/io/qfilesystemengine_win.cpp \
+ $$QT_SOURCE_TREE/src/corelib/io/qfilesystemiterator_win.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qfsfileengine.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qabstractfileengine.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qfsfileengine_win.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qfsfileengine_iterator.cpp \
- $$QT_SOURCE_TREE/src/corelib/io/qfsfileengine_iterator_win.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qfileinfo.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qtemporaryfile.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qdiriterator.cpp \
diff --git a/tools/runonphone/serenum_unix.cpp b/tools/runonphone/serenum_unix.cpp
index f5b2521..f5b616b 100644
--- a/tools/runonphone/serenum_unix.cpp
+++ b/tools/runonphone/serenum_unix.cpp
@@ -82,7 +82,7 @@ QList<SerialPortId> enumerateSerialPorts(int loglevel)
for (struct usb_bus *bus = usb_get_busses(); bus; bus = bus->next) {
for (struct usb_device *device = bus->devices; device; device = device->next) {
- for (int n = 0; n < device->descriptor.bNumConfigurations; ++n) {
+ for (int n = 0; n < device->descriptor.bNumConfigurations && device->config; ++n) {
struct usb_config_descriptor &usbConfig =device->config[n];
QList<int> usableInterfaces;
for (int m = 0; m < usbConfig.bNumInterfaces; ++m) {
@@ -146,6 +146,10 @@ QList<SerialPortId> enumerateSerialPorts(int loglevel)
// second loop to find the actual data interface.
foreach (int i, usableInterfaces) {
+#ifdef Q_OS_MAC
+ eligibleInterfaces << QString("^cu\\.usbmodem.*%1$")
+ .arg(QString("%1").arg(descriptor.bInterfaceNumber, 1, 16).toUpper());
+#else
// ### manufacturer and product strings are only readable as root :(
if (!manufacturerString.isEmpty() && !productString.isEmpty()) {
eligibleInterfaces << QString("usb-%1_%2-if%3")
@@ -155,6 +159,7 @@ QList<SerialPortId> enumerateSerialPorts(int loglevel)
} else {
eligibleInterfaces << QString("if%1").arg(i, 2, 16, QChar('0')); // fix!
}
+#endif
}
eligibleInterfacesInfo << InterfaceInfo(manufacturerString, productString, device->descriptor.idVendor, device->descriptor.idProduct);
}
@@ -164,14 +169,24 @@ QList<SerialPortId> enumerateSerialPorts(int loglevel)
if (loglevel > 1)
qDebug() << " searching for interfaces:" << eligibleInterfaces;
+#ifdef Q_OS_MAC
+ QDir dir("/dev/");
+ bool allowAny = false;
+#else
QDir dir("/dev/serial/by-id/");
- foreach (const QFileInfo &info, dir.entryInfoList()) {
+ bool allowAny = eligibleInterfaces.isEmpty();
+#endif
+ foreach (const QFileInfo &info, dir.entryInfoList(QDir::System)) {
if (!info.isDir()) {
- bool usable = eligibleInterfaces.isEmpty();
+ bool usable = allowAny;
+ QString friendlyName = info.fileName();
foreach (const QString &iface, eligibleInterfaces) {
- if (info.fileName().contains(iface)) {
+ if (info.fileName().contains(QRegExp(iface))) {
if (loglevel > 1)
qDebug() << " found device file:" << info.fileName() << endl;
+#ifdef Q_OS_MAC
+ friendlyName = eligibleInterfacesInfo[eligibleInterfaces.indexOf(iface)].product;
+#endif
usable = true;
break;
}
@@ -180,7 +195,7 @@ QList<SerialPortId> enumerateSerialPorts(int loglevel)
continue;
SerialPortId id;
- id.friendlyName = info.fileName();
+ id.friendlyName = friendlyName;
id.portName = info.canonicalFilePath();
list << id;
}
@@ -193,11 +208,15 @@ QList<SerialPortId> enumerateSerialPorts(int loglevel)
<< iface.manufacturer
<< "Product:"
<< iface.product
+#ifdef Q_OS_LINUX
<< endl
<< " Load generic driver using:"
<< QString("sudo modprobe usbserial vendor=0x%1 product=0x%2")
.arg(iface.manufacturerid, 4, 16, QChar('0'))
.arg(iface.productid, 4, 16, QChar('0'));
+#else
+ ;
+#endif
}
}
return list;
diff --git a/tools/shared/windows/registry.cpp b/tools/shared/windows/registry.cpp
index 48e9ae6..f520910 100644
--- a/tools/shared/windows/registry.cpp
+++ b/tools/shared/windows/registry.cpp
@@ -157,6 +157,9 @@ QString qt_readRegistryKey(HKEY parentHandle, const QString &rSubkey)
}
RegCloseKey(handle);
+#else
+ Q_UNUSED(parentHandle);
+ Q_UNUSED(rSubkey)
#endif
return result;