From eef1daabc41fbba6d2c91a7446c12c01b9c33812 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Sat, 29 May 2010 20:51:28 +0200 Subject: Doc: MonotonicClock is obviously monotonic --- src/corelib/tools/qelapsedtimer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/corelib/tools/qelapsedtimer.cpp b/src/corelib/tools/qelapsedtimer.cpp index 28dfc23..cb5e701 100644 --- a/src/corelib/tools/qelapsedtimer.cpp +++ b/src/corelib/tools/qelapsedtimer.cpp @@ -137,7 +137,7 @@ QT_BEGIN_NAMESPACE used. \value SystemTime The human-readable system time. This clock is not monotonic. - \value MonotonicClock The system's monotonic clock, usually found in Unix systems. This clock is not monotonic and does not overflow. + \value MonotonicClock The system's monotonic clock, usually found in Unix systems. This clock is monotonic and does not overflow. \value TickCounter The system's tick counter, used on Windows and Symbian systems. This clock may overflow. \value MachAbsoluteTime The Mach kernel's absolute time (Mac OS X). This clock is monotonic and does not overflow. -- cgit v0.12 From c6d82d705e3563a4a97c3c12487026c8df6b571e Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Sat, 29 May 2010 20:35:40 +0200 Subject: QtDeclarative: Remove trailing commas in enums --- src/declarative/qml/qdeclarative.h | 2 +- src/declarative/qml/qdeclarativeinstruction_p.h | 2 +- src/declarative/qml/qdeclarativevaluetype_p.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/declarative/qml/qdeclarative.h b/src/declarative/qml/qdeclarative.h index d75f0a8..53ff51c 100644 --- a/src/declarative/qml/qdeclarative.h +++ b/src/declarative/qml/qdeclarative.h @@ -67,7 +67,7 @@ QT_BEGIN_HEADER QML_DECLARE_TYPE_HASMETATYPE(INTERFACE) enum { /* TYPEINFO flags */ - QML_HAS_ATTACHED_PROPERTIES = 0x01, + QML_HAS_ATTACHED_PROPERTIES = 0x01 }; #define QML_DECLARE_TYPEINFO(TYPE, FLAGS) \ diff --git a/src/declarative/qml/qdeclarativeinstruction_p.h b/src/declarative/qml/qdeclarativeinstruction_p.h index dc5f2f8..4627eb3 100644 --- a/src/declarative/qml/qdeclarativeinstruction_p.h +++ b/src/declarative/qml/qdeclarativeinstruction_p.h @@ -158,7 +158,7 @@ public: // // Deferred creation // - Defer, /* defer */ + Defer /* defer */ }; QDeclarativeInstruction() : line(0) {} diff --git a/src/declarative/qml/qdeclarativevaluetype_p.h b/src/declarative/qml/qdeclarativevaluetype_p.h index 476c73d..3eaecc1 100644 --- a/src/declarative/qml/qdeclarativevaluetype_p.h +++ b/src/declarative/qml/qdeclarativevaluetype_p.h @@ -446,7 +446,7 @@ public: InBounce = QEasingCurve::InBounce, OutBounce = QEasingCurve::OutBounce, InOutBounce = QEasingCurve::InOutBounce, OutInBounce = QEasingCurve::OutInBounce, InCurve = QEasingCurve::InCurve, OutCurve = QEasingCurve::OutCurve, - SineCurve = QEasingCurve::SineCurve, CosineCurve = QEasingCurve::CosineCurve, + SineCurve = QEasingCurve::SineCurve, CosineCurve = QEasingCurve::CosineCurve }; QDeclarativeEasingValueType(QObject *parent = 0); -- cgit v0.12 From 50958288e4493920f18ef9f9b062e01bd4782239 Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Mon, 31 May 2010 13:08:33 +0200 Subject: QNetworkCookie: do not accept cookies with non-alNum domain do not accept a cookie whose domain attribute cannot be converted to an ACE domain. Reviewed-by: Thiago Macieira Task-number: QTBUG-11029 --- src/network/access/qnetworkcookie.cpp | 2 ++ tests/auto/qnetworkcookie/tst_qnetworkcookie.cpp | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/src/network/access/qnetworkcookie.cpp b/src/network/access/qnetworkcookie.cpp index 865d338..d1bdd57 100644 --- a/src/network/access/qnetworkcookie.cpp +++ b/src/network/access/qnetworkcookie.cpp @@ -991,6 +991,8 @@ QList QNetworkCookiePrivate::parseSetCookieHeaderLine(const QByt } QString normalizedDomain = QUrl::fromAce(QUrl::toAce(QString::fromUtf8(rawDomain))); + if (normalizedDomain.isEmpty() && !rawDomain.isEmpty()) + return result; cookie.setDomain(maybeLeadingDot + normalizedDomain); } else if (field.first == "max-age") { bool ok = false; diff --git a/tests/auto/qnetworkcookie/tst_qnetworkcookie.cpp b/tests/auto/qnetworkcookie/tst_qnetworkcookie.cpp index 5854ae1..72d8eda 100644 --- a/tests/auto/qnetworkcookie/tst_qnetworkcookie.cpp +++ b/tests/auto/qnetworkcookie/tst_qnetworkcookie.cpp @@ -693,6 +693,12 @@ void tst_QNetworkCookie::parseMultipleCookies_data() cookieA.setPath("/foo"); list = QList() << cookieA << cookieB; QTest::newRow("real-3") << "a=b; expires=Mar 10 07:00:00 2009 GMT, Tue; path=/foo\nc=d; expires=Fri Mar 20 07:00:00 2009 GMT" << list; + + // do not accept cookies with non-alphanumeric characters in domain field (QTBUG-11029) + cookie = QNetworkCookie("NonAlphNumDomName", "NonAlphNumDomValue"); + cookie.setDomain("!@#$%^&*();:."); // the ';' is actually problematic, because it is a separator + list = QList(); + QTest::newRow("domain-non-alpha-numeric") << "NonAlphNumDomName=NonAlphNumDomValue; domain=!@#$%^&*()" << list; } void tst_QNetworkCookie::parseMultipleCookies() -- cgit v0.12 From 39317d9583a4def0b7d1085778e302a8ccb3be86 Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Mon, 31 May 2010 13:50:07 +0200 Subject: doc: Fixed reference to setSize(), which is in QRectF. Task-number: QTBUG-10903 --- src/svg/qgraphicssvgitem.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/svg/qgraphicssvgitem.cpp b/src/svg/qgraphicssvgitem.cpp index 69ff7a3..e035e1d 100644 --- a/src/svg/qgraphicssvgitem.cpp +++ b/src/svg/qgraphicssvgitem.cpp @@ -124,8 +124,10 @@ public: \snippet doc/src/snippets/code/src_svg_qgraphicssvgitem.cpp 0 - Size of the item can be set via the setSize() method or via - direct manipulation of the items transformation matrix. + Size of the item can be set via the \l{QRectF::setSize()} + {setSize()} method of the \l{QGraphicsSvgItem::boundingRect()} + {bounding rectangle} or via direct manipulation of the items + transformation matrix. By default the SVG rendering is cached using QGraphicsItem::DeviceCoordinateCache mode to speedup the display of items. Caching can be disabled by passing -- cgit v0.12 From 2eb9b74f9555d8588ca64886c1f8921659fdc71e Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Mon, 31 May 2010 14:46:56 +0200 Subject: doc: Changed last breadcrumb to not be a link. Task-number: QTBUG-10577 --- tools/qdoc3/htmlgenerator.cpp | 49 ++++++++++++++----------------------------- 1 file changed, 16 insertions(+), 33 deletions(-) diff --git a/tools/qdoc3/htmlgenerator.cpp b/tools/qdoc3/htmlgenerator.cpp index b103981..bf80277 100644 --- a/tools/qdoc3/htmlgenerator.cpp +++ b/tools/qdoc3/htmlgenerator.cpp @@ -1711,62 +1711,49 @@ void HtmlGenerator::generateBreadCrumbs(const QString& title, if (node->type() == Node::Class) { const ClassNode* cn = static_cast(node); QString name = node->moduleName(); - out() << "
  • All Modules
  • "; + out() << "
  • Modules
  • "; if (!name.isEmpty()) { out() << "
  • "; breadcrumb << Atom(Atom::AutoLink,name); generateText(breadcrumb, node, marker); out() << "
  • \n"; } - breadcrumb.clear(); - if (!cn->name().isEmpty()) { - out() << "
  • "; - breadcrumb << Atom(Atom::AutoLink,cn->name()); - generateText(breadcrumb, 0, marker); - out() << "
  • \n"; - } + if (!cn->name().isEmpty()) + out() << "
  • " << cn->name() << "
  • \n"; } else if (node->type() == Node::Fake) { const FakeNode* fn = static_cast(node); if (node->subType() == Node::Module) { - out() << "
  • All Modules
  • "; + out() << "
  • Modules
  • "; QString name = node->name(); - if (!name.isEmpty()) { - out() << "
  • "; - breadcrumb << Atom(Atom::AutoLink,name); - generateText(breadcrumb, 0, marker); - out() << "
  • \n"; - } + if (!name.isEmpty()) + out() << "
  • " << name << "
  • \n"; } else if (node->subType() == Node::Group) { if (fn->name() == QString("modules")) - out() << "
  • All Modules
  • "; + out() << "
  • Modules
  • "; else { - out() << "
  • name() << "\">" << title - << "
  • "; + out() << "
  • " << title << "
  • "; } } else if (node->subType() == Node::Page) { if (fn->name() == QString("examples.html")) { - out() << "
  • Examples
  • "; + out() << "
  • Examples
  • "; } else if (fn->name().startsWith("examples-")) { out() << "
  • Examples
  • "; - out() << "
  • name() << "\">" << title - << "
  • "; + out() << "
  • " << title << "
  • "; } else if (fn->name() == QString("namespaces.html")) { - out() << "
  • All Namespaces
  • "; + out() << "
  • Namespaces
  • "; } else { - out() << "
  • name() << "\">" << title - << "
  • "; + out() << "
  • " << title << "
  • "; } } else if (node->subType() == Node::QmlClass) { out() << "
  • QML Elements
  • "; - out() << "
  • name() << "\">" << title - << "
  • "; + out() << "
  • " << title << "
  • "; } else if (node->subType() == Node::Example) { out() << "
  • Examples
  • "; @@ -1775,16 +1762,12 @@ void HtmlGenerator::generateBreadCrumbs(const QString& title, QString t = CodeParser::titleFromName(name); out() << "
  • " << t << "
  • "; - out() << "
  • " - << title << "
  • "; + out() << "
  • " << title << "
  • "; } } else if (node->type() == Node::Namespace) { - const NamespaceNode* nsn = static_cast(node); - out() << "
  • All Namespaces
  • "; - out() << "
  • " << title - << "
  • "; + out() << "
  • Namespaces
  • "; + out() << "
  • " << title << "
  • "; } } -- cgit v0.12 From 753ad4e8282d0c7c172a33035066792a8e64e6ad Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Mon, 31 May 2010 14:00:32 +0200 Subject: QXmlSchema documentation correction use a QByteArray to load the schema, not a QIODevice. Reviewed-by: David Boddie --- doc/src/snippets/qxmlschema/main.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/doc/src/snippets/qxmlschema/main.cpp b/doc/src/snippets/qxmlschema/main.cpp index 83fb245..26a8741 100644 --- a/doc/src/snippets/qxmlschema/main.cpp +++ b/doc/src/snippets/qxmlschema/main.cpp @@ -91,11 +91,8 @@ void Schema::loadFromData() const " elementFormDefault=\"qualified\">" "" ); - QBuffer buffer(&data); - buffer.open(QIODevice::ReadOnly); - QXmlSchema schema; - schema.load(&buffer); + schema.load(data); if (schema.isValid()) qDebug() << "schema is valid"; -- cgit v0.12 From 7ccd9996c41fcbe481726fadd8cac0dac1c25399 Mon Sep 17 00:00:00 2001 From: Ritt Konstantin Date: Mon, 31 May 2010 15:14:39 +0200 Subject: update Russian translation for Qt libraries this contains some changes from symbian-commissioned "professional" translations Merge-request: 621 Reviewed-by: Oswald Buddenhagen --- tools/linguist/phrasebooks/russian.qph | 2 +- translations/qt_ru.ts | 6204 ++++++++++++++++++++------------ 2 files changed, 3813 insertions(+), 2393 deletions(-) diff --git a/tools/linguist/phrasebooks/russian.qph b/tools/linguist/phrasebooks/russian.qph index ae1a9b9..750fda0 100644 --- a/tools/linguist/phrasebooks/russian.qph +++ b/tools/linguist/phrasebooks/russian.qph @@ -826,7 +826,7 @@ slider - ползунок + регулятор spin box diff --git a/translations/qt_ru.ts b/translations/qt_ru.ts index e9cdfd4..deae134 100644 --- a/translations/qt_ru.ts +++ b/translations/qt_ru.ts @@ -1,10 +1,31 @@ - + + + CloseButton + + + Close Tab + Закрыть вкладку + + + + FakeReply + + + Fake error ! + Фиктивная ошибка ! + + + + Invalid URL + Некорректный адрес URL + + MAC_APPLICATION_MENU - + Services Службы @@ -40,27 +61,6 @@ - CloseButton - - - Close Tab - Закрыть вкладку - - - - FakeReply - - - Fake error ! - - - - - Invalid URL - Некорректный URL - - - Phonon:: @@ -96,25 +96,32 @@ Phonon::AudioOutput - + + <html>The audio playback device <b>%1</b> does not work.<br/>Falling back to <b>%2</b>.</html> <html>Звуковое устройство <b>%1</b> не работает.<br/>Будет использоваться <b>%2</b>.</html> - + <html>Switching to the audio playback device <b>%1</b><br/>which just became available and has higher preference.</html> - <html>Переключение на звуковое устройство <b>%1</b><br/>, которое доступно и имеет высший приоритет.</html> + <html>Переключение на звуковое устройство <b>%1</b><br/>, которое стало доступно и имеет высший приоритет.</html> + Revert back to device '%1' - Возвращение к устройству '%1' + Возвращение к устройству "%1" + + + + <html>Switching to the audio playback device <b>%1</b><br/>which has higher preference or is specifically configured for this stream.</html> + <html>Переключение на устройство вывода звука <b>%1</b><br/>, которое имеет высший приоритет или настроено для обработки данного потока.</html> Phonon::Gstreamer::Backend - + Warning: You do not seem to have the package gstreamer0.10-plugins-good installed. Some video features have been disabled. Внимание: Похоже, пакет gstreamer0.10-plugins-good не установлен. @@ -131,40 +138,50 @@ Phonon::Gstreamer::MediaObject - + Cannot start playback. Check your GStreamer installation and make sure you have libgstreamer-plugins-base installed. Невозможно начать воспроизведение. -Проверьте установку GStreamer и убедитесь, +Проверьте правильность установки GStreamer и убедитесь, что пакет libgstreamer-plugins-base установлен. - + + Missing codec helper script assistant. + Отсутствует сценарий установки кодека. + + + + Plugin codec installation failed for codec: %0 + Не удалось установить модуль кодека: %0 + + + A required codec is missing. You need to install the following codec(s) to play this content: %0 Отсутствует необходимый кодек. Вам нужно установить следующие кодеки для воспроизведения данного содержимого: %0 - - - - + - - + + + + + Could not open media source. Не удалось открыть источник медиа-данных. - + Invalid source type. - Неверный тип источника медиа-данных. + Некорректный тип источника медиа-данных. - + Could not locate media source. Не удалось найти источник медиа-данных. @@ -192,14 +209,14 @@ have libgstreamer-plugins-base installed. Устройство воспроизведения звука - + No error Нет ошибки Not found - Не найден + Не найдено @@ -214,12 +231,12 @@ have libgstreamer-plugins-base installed. Overflow - + Переполнение Underflow - + Переполнение @@ -239,7 +256,7 @@ have libgstreamer-plugins-base installed. Not ready - Не готов + Не готово @@ -264,7 +281,7 @@ have libgstreamer-plugins-base installed. Insufficient bandwidth - Недостаточная ширина канала + Недостаточная скорость передачи данных @@ -274,17 +291,17 @@ have libgstreamer-plugins-base installed. Network communication error - Ошибка сетевого обмена данными + Ошибка сетевого обмена данными Streaming not supported - + Потоковое воспроизведение не поддерживается Server alert - + Сигнал сервера @@ -294,12 +311,12 @@ have libgstreamer-plugins-base installed. Invalid URL - Некорректный URL + Некорректный адрес URL Multicast error - + Ошибка широковещательной передачи @@ -358,7 +375,7 @@ have libgstreamer-plugins-base installed. Error opening URL - Ошибка открытия URL + Ошибка открытия адреса URL @@ -366,12 +383,40 @@ have libgstreamer-plugins-base installed. Не удалось установить уровень громкости - + + Loading clip failed + Не удалось загрузить клип + + + Playback complete Воспроизведение завершено + Phonon::MMF::AbstractVideoPlayer + + + Pause failed + Не удалось приостановить воспроизведение + + + + Seek failed + Не удалось установить позицию + + + + Getting position failed + Не удалось получить позицию + + + + Opening clip failed + Не удалось открыть клип + + + Phonon::MMF::AudioEqualizer @@ -384,12 +429,19 @@ have libgstreamer-plugins-base installed. Getting position failed - + Не удалось получить позицию + + + Phonon::MMF::DsaVideoPlayer - - Opening clip failed - + + + + + + Video display error + Ошибка отображения видео @@ -397,7 +449,7 @@ have libgstreamer-plugins-base installed. Enabled - Активно + Включено @@ -406,74 +458,74 @@ have libgstreamer-plugins-base installed. Decay HF ratio (%) DecayHFRatio: Ratio of high-frequency decay time to the value specified by DecayTime. - + Коэффициент затухания ВЧ (%) Decay time (ms) DecayTime: Time over which reverberation is diminished. - + Время затухания (мс) Density (%) Density Delay between first and subsequent reflections. Note that the S60 platform documentation does not make clear the distinction between this value and the Diffusion value. - + Плотность (%) Diffusion (%) Diffusion: Delay between first and subsequent reflections. Note that the S60 platform documentation does not make clear the distinction between this value and the Density value. - + Рассеивание (%) Reflections delay (ms) ReflectionsDelay: Amount of delay between the arrival the direct path from the source and the arrival of the first reflection. - + Затухание отражений (мс) Reflections level (mB) ReflectionsLevel: Amplitude of reflections. This value is corrected by the RoomLevel to give the final reflection amplitude. - + Уровень отражений (мБар) Reverb delay (ms) ReverbDelay: Amount of time between arrival of the first reflection and start of the late reverberation. - + Задержка эха (мс) Reverb level (mB) ReverbLevel Amplitude of reverberations. This value is corrected by the RoomLevel to give the final reverberation amplitude. - + Уровень эха (мБар) Room HF level RoomHFLevel: Amplitude of low-pass filter used to attenuate the high frequency component of reflected sound. - + Уровень ВЧ отражений Room level (mB) RoomLevel: Master volume control for all reflected sound. - + Уровень отражений (мБар) Phonon::MMF::MediaObject - + Error opening source: type not supported Ошибка открытыия источника: тип не поддерживается Error opening source: media type could not be determined - Ошибка открытыия источника: тип медиа-данных не определён + Ошибка открытыия источника: тип носителя не определён @@ -485,40 +537,12 @@ have libgstreamer-plugins-base installed. - Phonon::MMF::VideoPlayer - - - Pause failed - - + Phonon::MMF::SurfaceVideoPlayer + - Seek failed - - - - - Getting position failed - - - - - Opening clip failed - - - - - Buffering clip failed - - - - - - - - Video display error - + Ошибка отображения видео @@ -536,7 +560,7 @@ have libgstreamer-plugins-base installed. Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1% - Используйте данный ползунок для настройки громкости. Крайнее левое положение соответствует 0%, крайнее правое - %1% + Используйте данный регулятор для настройки громкости. Крайнее левое положение соответствует 0%, крайнее правое - %1% @@ -549,7 +573,7 @@ have libgstreamer-plugins-base installed. %1, %2 not defined - %1, %2 не определён + %1, %2 не определён @@ -1149,43 +1173,43 @@ to The protocol `%1' is not supported - Протокол '%1' не поддерживается + Протокол "%1" не поддерживается The protocol `%1' does not support listing directories - Протокол '%1' не поддерживает просмотр каталогов + Протокол "%1" не поддерживает просмотр каталогов The protocol `%1' does not support creating new directories - Протокол '%1' не поддерживает создание каталогов + Протокол "%1" не поддерживает создание каталогов The protocol `%1' does not support removing files or directories - Протокол '%1' не поддерживает удаление файлов или каталогов + Протокол "%1" не поддерживает удаление файлов или каталогов The protocol `%1' does not support renaming files or directories - Протокол '%1' не поддерживает переименование файлов или каталогов + Протокол "%1" не поддерживает переименование файлов или каталогов The protocol `%1' does not support getting files - Протокол '%1' не поддерживает доставку файлов + Протокол "%1" не поддерживает доставку файлов The protocol `%1' does not support putting files - Протокол '%1' не поддерживает отправку файлов + Протокол "%1" не поддерживает отправку файлов The protocol `%1' does not support copying or moving files or directories - Протокол '%1' не поддерживает копирование или перемещение файлов или каталогов + Протокол "%1" не поддерживает копирование или перемещение файлов или каталогов @@ -1225,7 +1249,7 @@ to QAbstractSocket - + @@ -1247,12 +1271,12 @@ to - + Operation on socket is not supported Операция с сокетом не поддерживается - + Socket operation timed out Время на операцию с сокетом истекло @@ -1271,7 +1295,7 @@ to QAbstractSpinBox - + &Step up Шаг вв&ерх @@ -1297,14 +1321,9 @@ to QApplication - - Activate - Активировать - - Executable '%1' requires Qt %2, found Qt %3. - Программный модуль '%1' требует Qt %2, найдена версия %3. + Программный модуль "%1" требует Qt %2, найдена версия %3. @@ -1312,16 +1331,21 @@ to Ошибка совместимости библиотеки Qt - - QT_LAYOUT_DIRECTION - Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout. - LTR + + Activate + Активировать - + Activates the program's main window Активирует главное окно программы + + + QT_LAYOUT_DIRECTION + Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout. + LTR + QAxSelect @@ -1367,7 +1391,7 @@ to QColorDialog - + Hu&e: &Тон: @@ -1425,7 +1449,7 @@ to QComboBox - + Open Открыть @@ -1572,1542 +1596,2690 @@ to - QDial + QDeclarativeAbstractAnimation - - QDial - QDial + + Cannot animate non-existent property "%1" + Невозможно анимировать несуществуещее свойство "%1" - - SpeedoMeter - SpeedoMeter + + Cannot animate read-only property "%1" + Невозможно анимировать свойство только для чтения "%1" - - SliderHandle - SliderHandle + + Animation is an abstract class + Animation - это абстрактный класс - QDialog - - - What's This? - Что это? - + QDeclarativeAnchorAnimation - - Done - Готово + + Cannot set a duration of < 0 + Невозможно установить длительность < 0 - QDialogButtonBox + QDeclarativeAnchors - - - - OK - ОК + + Possible anchor loop detected on fill. + Обнаружена возможная цикличная привязка на fill. - - &OK - &ОК + + Possible anchor loop detected on centerIn. + Обнаружена возможная цикличная привязка на centerIn. - - &Save - &Сохранить + + + + + Cannot anchor to an item that isn't a parent or sibling. + Невозможно установить привязку к элементу, не являющемуся родителем или соседом. - - Save - Сохранить + + Possible anchor loop detected on vertical anchor. + Обнаружена возможная цикличная привязка к вертикальной привязке. - - Open - Открыть + + Possible anchor loop detected on horizontal anchor. + Обнаружена возможная цикличная привязка к горизонтальной привязке. - - &Cancel - От&мена + + Cannot specify left, right, and hcenter anchors. + Невозможно задать левую, правую и среднюю привязки. - - Cancel - Отмена + + + Cannot anchor to a null item. + Невозможно привязаться к нулевому элементу. - - &Close - &Закрыть + + Cannot anchor a horizontal edge to a vertical edge. + Невозможно привязать горизонтальный край к вертикальному. - - Close - Закрыть + + + Cannot anchor item to self. + Невозможно привязать элемент к самому себе. - - Apply - Применить + + Cannot specify top, bottom, and vcenter anchors. + Невозможно задать верхнюю, нижнюю и среднюю привязки. - - Reset - Сбросить + + Baseline anchor cannot be used in conjunction with top, bottom, or vcenter anchors. + Невозможно использовать базовую привязку вместе с верхней, нижней и центральной по вертикали. - - Help - Справка + + Cannot anchor a vertical edge to a horizontal edge. + Невозможно привязать вертикальный край к горизонтальному. + + + QDeclarativeAnimatedImage - - Don't Save - Не сохранять + + Qt was built without support for QMovie + Qt было собрано без поддержки QMovie + + + QDeclarativeBehavior - - Discard - Отклонить + + Cannot change the animation assigned to a Behavior. + Невозможно изменить анимацию, назначенную поведению. + + + QDeclarativeBinding - - &Yes - &Да + + Binding loop detected for property "%1" + Обнаружена цикличная привязка для свойства "%1" + + + QDeclarativeCompiledBindings - - Yes to &All - Да для &всех + + Binding loop detected for property "%1" + Обнаружена цикличная привязка для свойства "%1" + + + QDeclarativeCompiler - - &No - &Нет + + + + + + + Invalid property assignment: "%1" is a read-only property + Некорректное присваивание свойства: "%1" свойство только для чтения - - N&o to All - Н&ет для всех + + Invalid property assignment: unknown enumeration + Некорректное присваивание свойства: неизвестное перечисление - - Save All - Сохранить все + + Invalid property assignment: string expected + Некорректное присваивание свойства: ожидается значение типа "string" - Abort - Прервать + Invalid property assignment: url expected + Некорректное присваивание свойства: ожидается значение типа "url" - - Retry - Повторить + + Invalid property assignment: unsigned int expected + Некорректное присваивание свойства: ожидается значение типа "unsigned int" - - Ignore - Пропустить + + Invalid property assignment: int expected + Некорректное присваивание свойства: ожидается значение типа "int" - - Restore Defaults - Восстановить значения + + Invalid property assignment: float expected + Некорректное присваивание свойства: ожидается значение типа "float" - - Close without Saving - Закрыть без сохранения + + Invalid property assignment: double expected + Некорректное присваивание свойства: ожидается значение типа "double" - - - QDirModel - - Name - Имя + + Invalid property assignment: color expected + Некорректное присваивание свойства: ожидается значение типа "color" - - Size - Размер + + Invalid property assignment: date expected + Некорректное присваивание свойства: ожидается значение типа "date" - - Kind - Match OS X Finder - Вид + + Invalid property assignment: time expected + Некорректное присваивание свойства: ожидается значение типа "time" - - Type - All other platforms - Тип + + Invalid property assignment: datetime expected + Некорректное присваивание свойства: ожидается значение типа "datetime" - - Date Modified - Дата изменения + + Invalid property assignment: point expected + Некорректное присваивание свойства: ожидается значение типа "point" - - - QDockWidget - - Close - Закрыть + + Invalid property assignment: size expected + Некорректное присваивание свойства: ожидается значение типа "size" - - Dock - Прикрепить + + Invalid property assignment: rect expected + Некорректное присваивание свойства: ожидается значение типа "rect" - - Float - Открепить + + Invalid property assignment: boolean expected + Некорректное присваивание свойства: ожидается значение булевого типа - - - QDoubleSpinBox - - More - Больше + + Invalid property assignment: 3D vector expected + Некорректное присваивание свойства: ожидается значение типа "трёхмерный вектор" - - Less - Меньше + + Invalid property assignment: unsupported type "%1" + Некорректное присваивание свойства: неподдерживаемый тип "%1" - - - QErrorMessage - - Debug Message: - Отладочное сообщение: + + Element is not creatable. + Элемент не является создаваемым. - - Warning: - Предупреждение: + + Component elements may not contain properties other than id + Элементы Component не могут содержать свойств кроме id - - Fatal Error: - Критическая ошибка: + + Invalid component id specification + Некорректная спецификация id компонента - - &Show this message again - &Показывать это сообщение в дальнейшем + + + id is not unique + id не уникален - - &OK - &Закрыть + + Invalid component body specification + Некорректная спецификация тела компонента - - - QFile - - - Destination file exists - Файл существует + + Component objects cannot declare new properties. + Объекты Component не могут объявлять новые свойства. - - Will not rename sequential file using block copy - Последовательный файл не будет переименован с использованием поблочного копирования + + Component objects cannot declare new signals. + Объекты Component не могут объявлять новые сигналы. - - Cannot remove source file - Невозможно удалить исходный файл + + Component objects cannot declare new functions. + Объекты Component не могут объявлять новые функции. - - Cannot open %1 for input - Невозможно открыть %1 для ввода + + Cannot create empty component specification + Невозможно создать пустую спецификацю компонента - - Cannot open for output - Невозможно открыть для вывода + + Incorrectly specified signal assignment + Неверно указано назначение сигнала - - Failure to write block - Сбой записи блока + + Cannot assign a value to a signal (expecting a script to be run) + Невозможно назначить значение сигналу (сценарий должен быть запущен) - - Cannot create %1 for output - Невозможно создать %1 для вывода + + Empty signal assignment + Пустое назначение сигнала - - - QFileDialog - - - All Files (*) - Все файлы (*) + + Empty property assignment + Пустое назначение свойства - - Directories - Каталоги + + Attached properties cannot be used here + здесь - в данном контексте? + Прикреплённые свойства не могут быть использованы здесь - - - - &Open - &Открыть + + + Non-existent attached object + Несуществующий прикреплённый объект - - - &Save - &Сохранить + + + Invalid attached object assignment + Некорректное назначение прикреплённого объекта - - Open - Открыть + + Cannot assign to non-existent default property + Невозможно назначить несуществующему свойству по умолчанию - - %1 already exists. -Do you want to replace it? - %1 уже существует. -Хотите заменить его? + + + Cannot assign to non-existent property "%1" + Невозможно назначить несуществующему свойству "%1" - - %1 -File not found. -Please verify the correct file name was given. - %1 -Файл не найден. -Проверьте правильность указанного имени файла. + + Invalid use of namespace + Некорректное использование пространства имён - - My Computer - Мой компьютер + + Not an attached property name + Не является именем привязанного свойства - - &Rename - &Переименовать + + Invalid use of id property + Некорректное использование свойства id - - &Delete - &Удалить + + + Property has already been assigned a value + Свойству уже назначено значение - - Show &hidden files - Показать ск&рытые файлы + + + Invalid grouped property access + Некорректный доступ к сгруппированному свойству - - - Back - Назад + + Cannot assign a value directly to a grouped property + Невозможно присвоить значение непосредственно сгруппированному свойству - - - Parent Directory - Родительский каталог + + Invalid property use + Некорректное использование свойства - - - List View - Список + + Property assignment expected + Ожидается назначение свойства - - - Detail View - Подробный вид + + Single property assignment expected + Ожидается одиночное назначение свойства - - - Files of type: - Типы файлов: + + Unexpected object assignment + Неожиданное назначение объекта - - - Directory: - Каталог: + + Cannot assign object to list + Невозможно назначить объект списку - - - %1 -Directory not found. -Please verify the correct directory name was given. - %1 -Каталог не найден. -Проверьте правильность указанного имени каталога. + + Can only assign one binding to lists + Можно назначить только одну связь для списка - - '%1' is write protected. -Do you want to delete it anyway? - '%1' защищён от записи. -Всё-равно хотите удалить? + + Cannot assign primitives to lists + Невозможно назначить примитивы списку - - Are sure you want to delete '%1'? - Вы действительно хотите удалить '%1'? + + Cannot assign multiple values to a script property + Невозможно назначить множественное значение свойству сценария - - Could not delete directory. - Не удалось удалить каталог. + + Invalid property assignment: script expected + Некорректное присваивание свойства: ожидается сценарий - - Recent Places - Недавние документы + + Cannot assign object to property + Невозможно назначить объектсвойству - - All Files (*.*) - Все файлы (*.*) + + "%1" cannot operate on "%2" + "%1" не может воздействовать на "%2" - - Save As - Сохранить как + + Duplicate default property + Дублирование свойства по умолчанию - - Drive - Диск + + Duplicate property name + Дублирование названия свойства - - File - Файл + Property names cannot begin with an upper case letter + Названия свойств не могут начинаться с заглавной буквы - - File Folder - Match Windows Explorer - Папка с файлами + + Duplicate signal name + Дублирование названия сигнала - Folder - All other platforms - Папка + Signal names cannot begin with an upper case letter + Названия сигналов не могут начинаться с заглавной буквы - - Alias - Mac OS X Finder - Псевдоним + + Duplicate method name + Дублирование название метода - Shortcut - All other platforms - Ярлык + Method names cannot begin with an upper case letter + Названия методов не могут начинаться с заглавной буквы - - Unknown - Неизвестный + + Property value set multiple times + Значение свойства задано несколько раз - - Find Directory - Найти каталог + + Invalid property nesting + Некорректное вложенность свойств - - Show - Показать + + Cannot override FINAL property + Невозможно переопределить свойство FINAL - - - Forward - Вперёд + + Invalid property type + Некорректный тип свойства - - New Folder - Новая папка + + Invalid empty ID + Некорректный пустой идентификатор - - &New Folder - &Новая папка + + IDs cannot start with an uppercase letter + Идентификаторы не могут начинаться с заглавной буквы - - - &Choose - &Выбрать + + IDs must start with a letter or underscore + Идентификаторы должны начинаться с буквы или подчёркивания - - Remove - Удалить + + IDs must contain only letters, numbers, and underscores + Идентификаторы должны содержать только буквы, цифры и подчёркивания - - - File &name: - &Имя файла: + + ID illegally masks global JavaScript property + Идентификатор неверно маскирует глобальное свойство JavaScript - - - Look in: - Перейти к: + + + No property alias location + Отсутствует размещение псевдонима свойства - - - Create New Folder - Создать папку + + + Invalid alias location + Некорректное размещение псевдонима + + + + Invalid alias reference. An alias reference must be specified as <id> or <id>.<property> + Некорректная ссылка на псевдоним. Ссылка на псевдоним должна быть указана, как <id> или <id>.<property> + + + + Invalid alias reference. Unable to find id "%1" + Некорректная ссылка на псевдоним. Не удалось найти id "%1" - QFileSystemModel + QDeclarativeComponent - - %1 byte(s) - %1 байт + + Invalid empty URL + Пустой адрес URL + + + QDeclarativeCompositeTypeManager - - Invalid filename - Некорректное имя файла + + + Resource %1 unavailable + Ресурс "%1" недоступен - - <b>The name "%1" can not be used.</b><p>Try using another name, with fewer characters or no punctuations marks. - <b>Имя "%1" не может быть использовано.</b><p>Попробуйте использовать имя меньшей длины и/или без символов пунктуации. + + Namespace %1 cannot be used as a type + Пространство имён "%1" не может быть использовано в качестве типа - - Name - Имя + + %1 %2 + %1 %2 - - Size - Размер + + Type %1 unavailable + Тип "%1" недоступен + + + QDeclarativeConnections - - Kind - Match OS X Finder - Вид + + + Cannot assign to non-existent property "%1" + Невозможно назначить несуществующему свойству "%1" - - Type - All other platforms - Тип + + Connections: nested objects not allowed + Подключения: вложенные объекты недопустимы - - Date Modified - Дата изменения + + Connections: syntax error + Подключения: синтаксическая ошибка - - My Computer - Мой компьютер + + Connections: script expected + Подключения: ожидается сценарий + + + QDeclarativeEngine - - Computer - Компьютер + + executeSql called outside transaction() + executeSql() вызван вне transaction() - - - %1 TB - %1 Тб + + Read-only Transaction + Транзакция только для чтения - - - %1 GB - %1 Гб + + Version mismatch: expected %1, found %2 + Несовпадение версий: ожидалась %1, найдена %2 - - - %1 MB - %1 Мб + + SQL transaction failed + Не удалось выполнить транзакцию SQL - - - %1 KB - %1 Кб + + transaction: missing callback + транзакция: отсутствует обратный вызов - - %1 bytes - %1 байт + + + SQL: database version mismatch + Не совпадает версия базы данных SQL - QFontDatabase + QDeclarativeFlipable - - - Normal - Обычный + + front is a write-once property + front - свойство для однократной записи - - - - Bold - Жирный + + back is a write-once property + back - свойство для однократной записи + + + QDeclarativeImportDatabase - - - Demi Bold - Полужирный + + module "%1" definition "%2" not readable + невозможно прочитать определение "%2" модуля "%1" - - - - Black - Чёрный + + plugin cannot be loaded for module "%1": %2 + модуль не может быть загружен для подмодуля "%1": %2 - - Demi - Средний + + module "%1" plugin "%2" not found + подмодуль "%1" модуля "%2" не найден - - - Light - Светлый + + + module "%1" version %2.%3 is not installed + модуль "%1" версии %2.%3 не установлен - - - Italic - Курсив + + module "%1" is not installed + модуль "%1" не установлен - - - Oblique - Наклонный + + + "%1": no such directory + "%1": каталог не существует - - Any - Любая + + import "%1" has no qmldir and no namespace + каталог "%1" не содержит ни qmldir, ни namespace - - Latin - Латиница + + - %1 is not a namespace + - %1 - некорректное пространство имён - - Greek - Греческая + + - nested namespaces not allowed + - вложенные пространства имён недопустимы - - Cyrillic - Кириллица + + + local directory + локальный каталог - - Armenian - Армянская + + is ambiguous. Found in %1 and in %2 + неоднозначно. Найдено в %1 и %2 - - Hebrew - Иврит + + is ambiguous. Found in %1 in version %2.%3 and %4.%5 + неоднозначно. Найдено в %1 версий %2.%3 и %4.%5 - - Arabic - Арабская + + is instantiated recursively + обрабатывается рекурсивно - - Syriac - Сирийская + + is not a type + не является типом + + + QDeclarativeKeyNavigationAttached - - Thaana - Таана + + KeyNavigation is only available via attached properties + KeyNavigation доступна только через прикреплённые свойства + + + QDeclarativeKeysAttached - - Devanagari - Деванагири + + Keys is only available via attached properties + Keys доступны только через прикреплённые свойства + + + QDeclarativeListModel - - Bengali - Бенгальская + + remove: index %1 out of range + remove: индекс %1 вне диапазона - - Gurmukhi - Гурмукхи + + insert: value is not an object + insert: значение не является объектом - - Gujarati - Гуджарати + + insert: index %1 out of range + insert: индекс %1 вне диапазона - - Oriya - Ория + + move: out of range + move: индекс вне диапазона - - Tamil - Тамильская + + append: value is not an object + append: значение не является объектом - - Telugu - Телугу + + set: value is not an object + set: значение не является объектом - - Kannada - Каннада + + + set: index %1 out of range + set: индекс %1 вне диапазона - - Malayalam - Малаяльская + + + ListElement: cannot contain nested elements + ListElement: не может содержать вложенные элементы - - Sinhala - Сингальская + + ListElement: cannot use reserved "id" property + ListElement: невозможно использовать зарезервированное свойство "id" - - Thai - Тайская + + ListElement: cannot use script for property value + ListElement: невозможно использовать сценарий в качестве значения свойства - - Lao - Лаосская + + ListModel: undefined property '%1' + ListModel: неопределённое свойство "%1" + + + QDeclarativeLoader - - Tibetan - Тибетская + + Loader does not support loading non-visual elements. + Загрузчик не поддерживает загрузку невизуальных элементов. + + + QDeclarativeParentAnimation - - Myanmar - Майанмарская + + Unable to preserve appearance under complex transform + Невозможно сохранить внешний вид при сложном преобразовании - - Georgian - Грузинская + + + Unable to preserve appearance under non-uniform scale + Невозможно сохранить внешний вид при неоднородном масштабе - - Khmer - Кхмерская + + Unable to preserve appearance under scale of 0 + Невозможно сохранить внешний вид при масштабе 0 + + + QDeclarativeParentChange - - Simplified Chinese - Китайская упрощённая + + Unable to preserve appearance under complex transform + Невозможно сохранить внешний вид при сложном преобразовании - - Traditional Chinese - Китайская традиционная + + + Unable to preserve appearance under non-uniform scale + Невозможно сохранить внешний вид при неоднородном масштабе - - Japanese - Японская + + Unable to preserve appearance under scale of 0 + Невозможно сохранить внешний вид при масштабе 0 + + + QDeclarativeParser - - Korean - Корейская + + + + Illegal unicode escape sequence + Неверная unicode esc-последовательность - - Vietnamese - Вьетнамская + + Illegal character + Недопустимый символ - - Symbol - Символьная + + Unclosed string at end of line + Незакрытый текст в конце строки - - Ogham - Огамическая + + Illegal escape squence + Неверная esc-последовательность - - Runic - Руническая + + Unclosed comment at end of file + Незакрытый комментарий в конце строки - - N'Ko - Нко + + Illegal syntax for exponential number + Недопустимый синтаксис для экспоненциального числа - - - QFontDialog - - &Font - &Шрифт + + Identifier cannot start with numeric literal + Идентификатор не может начинаться с цифры - - Font st&yle - &Начертание + + Unterminated regular expression literal + Незаконченный литерал регулярного выражения - - &Size - &Размер + + Invalid regular expression flag '%0' + Некорректный флаг "%0" в регулярном выражении - - Effects - Эффекты + + + Unterminated regular expression backslash sequence + Регулярное выражение содержит незавершённую экранированную последовательность - - Stri&keout - Зачёр&кнутый + + Unterminated regular expression class + Регулярное выражение содержит незавершённый класс - - &Underline - П&одчёркнутый + + + Syntax error + Синтаксическая ошибка - - Sample - Пример + + Unexpected token `%1' + Неожиданный символ "%1" - - Wr&iting System - &Система письма + + + Expected token `%1' + Ожидается символ "%1" - - - Select Font - Выбор шрифта + + + + Property value set multiple times + Значение свойства установлено несколько раз - - - QFtp - - - Not connected - Соединение не установлено + + Expected type name + Ожидается название типа - - - Host %1 not found - Узел %1 не найден + + Invalid import qualifier ID + Некорректный ID спецификатора импорта - - - Connection refused to host %1 - В соединении с узлом %1 отказано + + Reserved name "Qt" cannot be used as an qualifier + Зарезервированное имя "Qt" не может быть использовано в качестве спецификатора - - Connection timed out to host %1 - Время на соединение с узлом %1 истекло + + Script import qualifiers must be unique. + Спецификаторы импорта сценария должны быть уникальными. - - - - Connected to host %1 - Установлено соединение с узлом %1 + + Script import requires a qualifier + Для импорта сценария требуется спецификатор - - - Connection refused for data connection - Отказ в соединении для передачи данных + + Library import requires a version + Импорт библиотеки требует версию - - - - - Unknown error - Неизвестная ошибка + + Expected parameter type + Ожидается тип параметра - - - Connecting to host failed: -%1 - Не удалось соединиться с узлом: -%1 + + Invalid property type modifier + Некорректный модификатор типа свойства - - - Login failed: -%1 - Не удалось авторизоваться: -%1 + + Unexpected property type modifier + Неожиданный модификатор типа свойства - - - Listing directory failed: -%1 - Не удалось прочитать каталог: -%1 + + Expected property type + Ожидается тип свойства - - - Changing directory failed: -%1 - Не удалось сменить каталог: -%1 + + Readonly not yet supported + Readonly ещё не поддерживается - - - Downloading file failed: -%1 - Не удалось загрузить файл: -%1 + + JavaScript declaration outside Script element + Определение JavaScript вне элемента Script + + + QDeclarativePauseAnimation - - - Uploading file failed: -%1 - Не удалось отгрузить файл: -%1 + + Cannot set a duration of < 0 + Невозможно установить длительность < 0 + + + QDeclarativePixmapCache - - - Removing file failed: -%1 - Не удалось удалить файл: -%1 + + Error decoding: %1: %2 + Ошибка декодирования: %1: %2 - - - Creating directory failed: -%1 - Не удалось создать каталог: -%1 + + Failed to get image from provider: %1 + Не удалось получить изображение от поставщика: %1 - - - Removing directory failed: -%1 - Не удалось удалить каталог: -%1 + + + Cannot open: %1 + Не удалось открыть: %1 - - - - Connection closed - Соединение закрыто + + Unknown Error loading %1 + Неизвестная ошибка загрузки %1 + + + QDeclarativePropertyAnimation - - Host %1 found - Узел %1 найден + + Cannot set a duration of < 0 + Невозможно установить длительность < 0 + + + QDeclarativePropertyChanges - - Connection to %1 closed - Соединение с %1 закрыто + + PropertyChanges does not support creating state-specific objects. + PropertyChanges не поддерживают создание объектов, зависимых от состояния. - - Host found - Узел найден + + Cannot assign to non-existent property "%1" + Невозможно назначить несуществующему свойству "%1" - - Connected to host - Соединение с узлом установлено + + Cannot assign to read-only property "%1" + Невозможно назначить свойству только для чтения "%1" - QHostInfo + QDeclarativeTextInput - - Unknown error - Неизвестная ошибка + + + Could not load cursor delegate + Не удалось загрузить делегат курсора + + + + Could not instantiate cursor delegate + Не удалось инстанциировать делегат курсора - QHostInfoAgent + QDeclarativeVME - - - - - Host not found - Узел не найден + + Unable to create object of type %1 + Невозможно создать объект типа "%1" - - - - - Unknown address type - Неизвестный тип адреса + + Cannot assign value %1 to property %2 + Невозможно установить значение "%1" свойству "%2" - - - - Unknown error - Неизвестная ошибка + + Cannot assign object type %1 with no default method + Невозможно назначить объект типа %1 без метода по умолчанию - - No host name given - Имя узла не задано + + Cannot connect mismatched signal/slot %1 %vs. %2 + Невозможно подключить отсутствующий сигнал/слот %1 к %2 - - Invalid hostname - Некорректное имя узла + + Cannot assign an object to signal property %1 + Невозможно назначить объект к свойству сигнала %1 - - - QHttp - - - - - Unknown error - Неизвестная ошибка + + Cannot assign object to list + Невозможно назначить объект списку - - - Request aborted - Запрос прерван + + Cannot assign object to interface property + Невозможно назначить объект свойству интерфейса - - - No server set to connect to - Не указан сервер для подключения + + Unable to create attached object + Не удалось создать вложенный объект - - - Wrong content length - Неверная длина содержимого + + Cannot set properties on %1 as it is null + Невозможно установить свойства для %1, так как он нулевой + + + QDeclarativeVisualDataModel - - - Server closed connection unexpectedly - Сервер неожиданно разорвал соединение + + Delegate component must be Item type. + Компинент делегата должен быть типа Item. + + + QDeclarativeXmlListModel - - Unknown authentication method - Неизвестный метод авторизации + + + Qt was built without support for xmlpatterns + Qt было собрано без поддержки xmlpatterns + + + QDeclarativeXmlListModelRole - - Error writing response to device - Ошибка записи ответа на устройство + + An XmlRole query must not start with '/' + Запрос XmlRole не должен начинаться с '/' + + + QDeclarativeXmlRoleList - - - Connection refused - Отказано в соединении + + An XmlListModel query must start with '/' or "//" + Запрос XmlListModel должен начинаться с '/' или "//" - - - - - Host %1 not found - Узел %1 не найден + + + QDial + + + QDial + QDial - - - HTTP request failed - HTTP-запрос не удался + + SpeedoMeter + SpeedoMeter - - - Invalid HTTP response header - Некорректный HTTP-заголовок ответа + + SliderHandle + SliderHandle + + + QDialog - - - - - Invalid HTTP chunked body - Некорректное HTTP-фрагментирование данных + + What's This? + Что это? - - Host %1 found - Узел %1 найден + + Done + Готово + + + + QDialogButtonBox + + + + + OK + ОК + + + + Save + Сохранить + + + + &Save + &Сохранить - Connected to host %1 - Установлено соединение с узлом %1 + Open + Открыть - Connection to %1 closed - Соединение с узлом %1 закрыто + Cancel + Отмена - - Host found - Узел найден + + &Cancel + От&мена - Connected to host - Соединение с узлом установлено + Close + Закрыть - - - Connection closed - Соединение закрыто + + &Close + &Закрыть - - Proxy authentication required - Требуется авторизация на прокси-сервере + + Apply + Применить + + + + Reset + Сбросить + + + + Help + Справка - Authentication required - Требуется авторизация + Don't Save + Не сохранять - - Connection refused (or timed out) - В соединении отказано (или время ожидания истекло) + + Discard + Отклонить - - Proxy requires authentication - Прокси-сервер требует авторизацию + + &Yes + &Да - Host requires authentication - Узел требует авторизацию + Yes to &All + Да для &всех - Data corrupted - Данные повреждены + &No + &Нет - Unknown protocol specified - Указан неизвестный протокол + N&o to All + Н&ет для всех - SSL handshake failed - Квитирование SSL не удалось + Save All + Сохранить все - - HTTPS connection requested but SSL support not compiled in - Запрошено соединение по протоколу HTTPS, но поддержка SSL не скомпилирована + + Abort + Прервать - - - QHttpSocketEngine - - Did not receive HTTP response from proxy - Не получен HTTP-ответ от прокси-сервера + + Retry + Повторить - - Error parsing authentication request from proxy - Ошибка разбора запроса авторизации от прокси-сервера + + Ignore + Пропустить - - Authentication required - Требуется авторизация + + Restore Defaults + Восстановить значения - - Proxy denied connection - Прокси-сервер запретил соединение + + Close without Saving + Закрыть без сохранения - - Error communicating with HTTP proxy - Ошибка обмена данными с прокси-сервером HTTP + + &OK + &ОК + + + QDirModel - - Proxy server not found - Прокси-сервер не найден + + Name + Имя - - Proxy connection refused - В соединении прокси-сервером отказано + + Size + Размер - - Proxy server connection timed out - Время на соединение с прокси-сервером истекло + + Kind + Match OS X Finder + Вид - Proxy connection closed prematurely - Соединение с прокси-сервером неожиданно закрыто + Type + All other platforms + Тип - - - QIBaseDriver - - Error opening database - Ошибка открытия базы данных + + Date Modified + Дата изменения + + + QDockWidget - - Could not start transaction - Не удалось начать транзакцию + + Close + Закрыть - - Unable to commit transaction - Невозможно завершить транзакцию + + Dock + Прикрепить - - Unable to rollback transaction - Невозможно отозвать транзакцию + + Float + Открепить - QIBaseResult + QDoubleSpinBox - - Unable to create BLOB - Невозможно создать BLOB + + More + Больше - - Unable to write BLOB - Невозможно записать BLOB + + Less + Меньше + + + QErrorMessage - - Unable to open BLOB - Невозможно открыть BLOB + + &Show this message again + &Показывать это сообщение в дальнейшем - - Unable to read BLOB - Невозможно прочитать BLOB + + &OK + &Закрыть - - - Could not find array - Не удалось найти массив + + Debug Message: + Отладочное сообщение: - - Could not get array data - Не удалось найти данные массива + + Warning: + Предупреждение: - - Could not get query info - Не удалось найти информацию о запросе + + Fatal Error: + Критическая ошибка: + + + QFile - - Could not start transaction - Не удалось начать транзакцию + + + Destination file exists + Файл существует - - Unable to commit transaction - Невозможно завершить транзакцию + + Will not rename sequential file using block copy + Последовательный файл не будет переименован с использованием поблочного копирования - - Could not allocate statement - Не удалось получить ресурсы для создания выражения + + Cannot remove source file + Невозможно удалить исходный файл - - Could not prepare statement - Не удалось подготовить выражение + + Cannot open %1 for input + Невозможно открыть %1 для ввода - - - Could not describe input statement - Не удалось описать входящее выражение + + Cannot open for output + Невозможно открыть для вывода - - Could not describe statement - Не удалось описать выражение + + Failure to write block + Сбой записи блока - - Unable to close statement - Невозможно закрыть выражение + + Cannot create %1 for output + Невозможно создать %1 для вывода + + + QFileDialog - - Unable to execute query - Невозможно выполнить запрос + + + All Files (*) + Все файлы (*) - - Could not fetch next item - Не удалось получить следующий элемент + + + Back + Назад - - Could not get statement info - Не удалось найти информацию о выражении + + + List View + Список - - - QIODevice - - Permission denied - Доступ запрещён + + + Detail View + Подробный вид - - Too many open files - Слишком много открытых файлов + + + File + Файл - - No such file or directory - Файл или каталог не существует + + File Folder + Match Windows Explorer + Папка с файлами - - No space left on device - Нет свободного места на устройстве + + Folder + All other platforms + Папка - - Unknown error - Неизвестная ошибка + + Alias + Mac OS X Finder + Псевдоним - - - QInputContext - - XIM - Метод ввода X-сервера + + Shortcut + All other platforms + Ярлык - - FEP - Метод ввода S60 FEP + + Open + Открыть - - XIM input method - Метод ввода X-сервера + + Save As + Сохранить как - - Windows input method - Метод ввода Windows + + + + &Open + &Открыть - - Mac OS X input method - Метод ввода Mac OS X + + + &Save + &Сохранить - - S60 FEP input method - Метод ввода S60 FEP + + '%1' is write protected. +Do you want to delete it anyway? + - - - QInputDialog - - Enter a value: - Укажите значение: + + Recent Places + Недавние документы - - - QLibrary - - Could not mmap '%1': %2 - Не удалось выполнить mmap '%1': %2 + + &Rename + &Переименовать - - Plugin verification data mismatch in '%1' - Проверочная информация для модуля '%1' не совпадает + + &Delete + &Удалить - - Could not unmap '%1': %2 - Не удалось выполнить unmap '%1': %2 + + Show &hidden files + Показать ск&рытые файлы - - The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5] - Модуль '%1' использует несоместимую библиотеку Qt. (%2.%3.%4) [%5] + + New Folder + Новая папка - - The plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3" - Модуль '%1' использует несоместимую библиотеку Qt. Ожидается ключ "%2", но получен ключ "%3" + + Find Directory + Найти каталог - - Unknown error - Неизвестная ошибка + + Directories + Каталоги - - - The shared library was not found. - Динамическая библиотека не найдена. + + All Files (*.*) + Все файлы (*.*) - - The file '%1' is not a valid Qt plugin. - Файл '%1' - не является корректным модулем Qt. + + + Directory: + Каталог: - - The plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.) - Модуль '%1' использует несоместимую библиотеку Qt. (Невозможно совместить релизные и отладочные библиотеки.) + + %1 already exists. +Do you want to replace it? + %1 уже существует. +Хотите заменить его? - - - Cannot load library %1: %2 - Невозможно загрузить библиотеку %1: %2 + + %1 +File not found. +Please verify the correct file name was given. + %1 +Файл не найден. +Проверьте правильность указанного имени файла. - - - Cannot unload library %1: %2 - Невозможно выгрузить библиотеку %1: %2 + + My Computer + Мой компьютер - - - Cannot resolve symbol "%1" in %2: %3 - Невозможно разрешить символ "%1" в %2: %3 + + + Parent Directory + Родительский каталог - - - QLineEdit - - &Undo - &Отменить действие + + + Files of type: + Типы файлов: - - &Redo - &Повторить действие + + + %1 +Directory not found. +Please verify the correct directory name was given. + %1 +Каталог не найден. +Проверьте правильность указанного имени каталога. - - Cu&t - &Вырезать + + Are sure you want to delete '%1'? + Вы действительно хотите удалить "%1"? + + + + Could not delete directory. + Не удалось удалить каталог. + + + + Drive + Диск + + + + Unknown + Неизвестный + + + + Show + Показать + + + + + Forward + Вперёд + + + + &New Folder + &Новая папка + + + + + &Choose + &Выбрать + + + + Remove + Удалить + + + + + File &name: + &Имя файла: + + + + + Look in: + Перейти к: + + + + + Create New Folder + Создать папку + + + + Go back + Назад + + + + Go forward + Вперёд + + + + Go to the parent directory + Перейти в родительский каталог + + + + Create a New Folder + Создать новую папку + + + + Change to list view mode + Переключить в режим списка + + + + Change to detail view mode + Переключить в подробный режим + + + + QFileSystemModel + + + + %1 TB + %1 Тб + + + + + %1 GB + %1 Гб + + + + + %1 MB + %1 Мб + + + + + %1 KB + %1 Кб + + + + %1 bytes + %1 байт + + + + Invalid filename + Некорректное имя файла + + + + <b>The name "%1" can not be used.</b><p>Try using another name, with fewer characters or no punctuations marks. + <b>Имя "%1" не может быть использовано.</b><p>Попробуйте использовать имя меньшей длины и/или без символов пунктуации. + + + + Name + Имя + + + + Size + Размер + + + + Kind + Match OS X Finder + Вид + + + + Type + All other platforms + Тип + + + + Date Modified + Дата изменения + + + + My Computer + Мой компьютер + + + + Computer + Компьютер + + + + %1 byte(s) + %1 байт + + + + QFontDatabase + + + + Normal + Обычный + + + + + + Bold + Жирный + + + + + Demi Bold + Полужирный + + + + + + Black + Чёрный + + + + Demi + Средний + + + + + Light + Светлый + + + + + Italic + Курсив + + + + + Oblique + Наклонный + + + + Any + Любая + + + + Latin + Латиница + + + + Greek + Греческая + + + + Cyrillic + Кириллица + + + + Armenian + Армянская + + + + Hebrew + Иврит + + + + Arabic + Арабская + + + + Syriac + Сирийская + + + + Thaana + Таана + + + + Devanagari + Деванагири + + + + Bengali + Бенгальская + + + + Gurmukhi + Гурмукхи + + + + Gujarati + Гуджарати + + + + Oriya + Ория + + + + Tamil + Тамильская + + + + Telugu + Телугу + + + + Kannada + Каннада + + + + Malayalam + Малайялам + + + + Sinhala + Сингальская + + + + Thai + Тайская + + + + Lao + Лаосская + + + + Tibetan + Тибетская + + + + Myanmar + Мьянма + + + + Georgian + Грузинская + + + + Khmer + Кхмерская + + + + Simplified Chinese + Китайская упрощённая + + + + Traditional Chinese + Китайская традиционная + + + + Japanese + Японская + + + + Korean + Корейская + + + + Vietnamese + Вьетнамская + + + + Symbol + Символьная + + + + Ogham + Огамическая + + + + Runic + Руническая + + + + N'Ko + Нко + + + + QFontDialog + + + &Font + &Шрифт + + + + Font st&yle + &Начертание + + + + &Size + &Размер + + + + Effects + Эффекты + + + + Stri&keout + Зачёр&кнутый + + + + &Underline + П&одчёркнутый + + + + Sample + Пример + + + + Select Font + Выбор шрифта + + + + Wr&iting System + &Система письма + + + + QFtp + + + Host %1 found + Узел %1 найден + + + + Host found + Узел найден + + + + + + Connected to host %1 + Установлено соединение с узлом %1 + + + + Connected to host + Соединение с узлом установлено + + + + Connection to %1 closed + Соединение с %1 закрыто + + + + + + Connection closed + Соединение закрыто + + + + + Host %1 not found + Узел %1 не найден + + + + + Connection refused to host %1 + В соединении с узлом %1 отказано + + + + Connection timed out to host %1 + Время на соединение с узлом %1 истекло + + + + + + + Unknown error + Неизвестная ошибка + + + + + Connecting to host failed: +%1 + Не удалось соединиться с узлом: +%1 + + + + + Login failed: +%1 + Не удалось авторизоваться: +%1 + + + + + Listing directory failed: +%1 + Не удалось прочитать каталог: +%1 + + + + + Changing directory failed: +%1 + Не удалось сменить каталог: +%1 + + + + + Downloading file failed: +%1 + Не удалось загрузить файл: +%1 + + + + + Uploading file failed: +%1 + Не удалось отгрузить файл: +%1 + + + + + Removing file failed: +%1 + Не удалось удалить файл: +%1 + + + + + Creating directory failed: +%1 + Не удалось создать каталог: +%1 + + + + + Removing directory failed: +%1 + Не удалось удалить каталог: +%1 + + + + + Not connected + Соединение не установлено + + + + + Connection refused for data connection + Отказ в соединении для передачи данных + + + + QHostInfo + + + Unknown error + Неизвестная ошибка + + + + No host name given + Имя узла не задано + + + + QHostInfoAgent + + + + + + Host not found + Узел не найден + + + + + + + Unknown address type + Неизвестный тип адреса + + + + + + Unknown error + Неизвестная ошибка + + + + + No host name given + Имя узла не задано + + + + + Invalid hostname + Некорректное имя узла + + + + QHttp + + + + Connection refused + Отказано в соединении + + + + + + Host %1 not found + Узел %1 не найден + + + + + Wrong content length + Неверная длина содержимого + + + + + HTTP request failed + HTTP-запрос не удался + + + + Host %1 found + Узел %1 найден + + + + Host found + Узел найден + + + + Connected to host %1 + Установлено соединение с узлом %1 + + + + Connected to host + Соединение с узлом установлено + + + + Connection to %1 closed + Соединение с узлом %1 закрыто + + + + + Connection closed + Соединение закрыто + + + + + + + Unknown error + Неизвестная ошибка + + + + + Request aborted + Запрос прерван + + + + + No server set to connect to + Не указан сервер для подключения + + + + + Server closed connection unexpectedly + Сервер неожиданно разорвал соединение + + + + + Invalid HTTP response header + Некорректный HTTP-заголовок ответа + + + + Unknown authentication method + Неизвестный метод авторизации + + + + + + + Invalid HTTP chunked body + Некорректное HTTP-фрагментирование данных + + + + Error writing response to device + Ошибка записи ответа на устройство + + + + Proxy authentication required + Требуется авторизация на прокси-сервере + + + + Authentication required + Требуется авторизация + + + + Proxy requires authentication + Прокси-сервер требует авторизацию + + + + Host requires authentication + Узел требует авторизацию + + + + Data corrupted + Данные повреждены + + + + SSL handshake failed + Квитирование SSL не удалось + + + + Unknown protocol specified + Указан неизвестный протокол + + + + Connection refused (or timed out) + В соединении отказано (или время ожидания истекло) + + + + HTTPS connection requested but SSL support not compiled in + Запрошено соединение по протоколу HTTPS, но поддержка SSL не скомпилирована + + + + QHttpSocketEngine + + + Did not receive HTTP response from proxy + Не получен HTTP-ответ от прокси-сервера + + + + Error parsing authentication request from proxy + Ошибка разбора запроса авторизации от прокси-сервера + + + + Authentication required + Требуется авторизация + + + + Proxy denied connection + Прокси-сервер запретил соединение + + + + Error communicating with HTTP proxy + Ошибка обмена данными с прокси-сервером HTTP + + + + Proxy server not found + Прокси-сервер не найден + + + + Proxy connection refused + В соединении прокси-сервером отказано + + + + Proxy server connection timed out + Время на соединение с прокси-сервером истекло + + + + Proxy connection closed prematurely + Соединение с прокси-сервером неожиданно закрыто + + + + QIBaseDriver + + + Error opening database + Ошибка открытия базы данных + + + + Could not start transaction + Не удалось начать транзакцию + + + + Unable to commit transaction + Невозможно завершить транзакцию + + + + Unable to rollback transaction + Невозможно отозвать транзакцию + + + + QIBaseResult + + + Unable to create BLOB + Невозможно создать BLOB + + + + Unable to write BLOB + Невозможно записать BLOB + + + + Unable to open BLOB + Невозможно открыть BLOB + + + + Unable to read BLOB + Невозможно прочитать BLOB + + + + + Could not find array + Не удалось найти массив + + + + Could not get array data + Не удалось найти данные массива + + + + Could not get query info + Не удалось найти информацию о запросе + + + + Could not start transaction + Не удалось начать транзакцию + + + + Unable to commit transaction + Невозможно завершить транзакцию + + + + Could not allocate statement + Не удалось получить ресурсы для создания выражения + + + + Could not prepare statement + Не удалось подготовить выражение + + + + + Could not describe input statement + Не удалось описать входящее выражение + + + + Could not describe statement + Не удалось описать выражение + + + + Unable to close statement + Невозможно закрыть выражение + + + + Unable to execute query + Невозможно выполнить запрос + + + + Could not fetch next item + Не удалось получить следующий элемент + + + + Could not get statement info + Не удалось найти информацию о выражении + + + + QIODevice + + + Permission denied + Доступ запрещён + + + + Too many open files + Слишком много открытых файлов + + + + No such file or directory + Файл или каталог не существует + + + + No space left on device + Нет свободного места на устройстве + + + + Unknown error + Неизвестная ошибка + + + + QInputContext + + + XIM + Метод ввода X-сервера + + + + FEP + Метод ввода S60 FEP + + + + XIM input method + Метод ввода X-сервера + + + + Windows input method + Метод ввода Windows + + + + Mac OS X input method + Метод ввода Mac OS X + + + + S60 FEP input method + Метод ввода S60 FEP + + + + QInputDialog + + + Enter a value: + Укажите значение: + + + + QLibrary + + + Could not mmap '%1': %2 + Не удалось выполнить mmap "%1": %2 + + + + Plugin verification data mismatch in '%1' + Проверочная информация для модуля "%1" не совпадает + + + + Could not unmap '%1': %2 + Не удалось выполнить unmap "%1": %2 + + + + The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5] + Модуль "%1" использует несоместимую библиотеку Qt. (%2.%3.%4) [%5] + + + + The plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3" + Модуль "%1" использует несоместимую библиотеку Qt. Ожидается ключ "%2", но получен ключ "%3" + + + + Unknown error + Неизвестная ошибка + + + + + + The shared library was not found. + Динамическая библиотека не найдена. + + + + The file '%1' is not a valid Qt plugin. + Файл "%1" - не является корректным модулем Qt. + + + + The plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.) + Модуль "%1" использует несоместимую библиотеку Qt. (Невозможно совместить релизные и отладочные библиотеки.) + + + + + Cannot load library %1: %2 + Невозможно загрузить библиотеку %1: %2 + + + + + Cannot unload library %1: %2 + Невозможно выгрузить библиотеку %1: %2 + + + + + Cannot resolve symbol "%1" in %2: %3 + Невозможно разрешить символ "%1" в %2: %3 + + + + QLineEdit + + + Select All + Выделить всё + + + + &Undo + &Отменить действие + + + + &Redo + &Повторить действие + + + + Cu&t + &Вырезать @@ -3124,11 +4296,6 @@ Do you want to delete it anyway? Delete Удалить - - - Select All - Выделить всё - QLocalServer @@ -3171,7 +4338,7 @@ Do you want to delete it anyway? - + %1: Invalid name %1: Некорректное имя @@ -3228,7 +4395,7 @@ Do you want to delete it anyway? QMYSQLDriver - + Unable to open database ' Невозможно открыть базу данных ' @@ -3380,12 +4547,7 @@ Do you want to delete it anyway? &Закрыть - - - [%1] - - [%1] - - - + Maximize Распахнуть @@ -3414,6 +4576,11 @@ Do you want to delete it anyway? Menu Меню + + + - [%1] + - [%1] + QMenu @@ -3440,7 +4607,7 @@ Do you want to delete it anyway? QMenuBar - + Actions Действия @@ -3448,12 +4615,7 @@ Do you want to delete it anyway? QMessageBox - - Help - Справка - - - + @@ -3461,30 +4623,35 @@ Do you want to delete it anyway? Закрыть - + + <h3>About Qt</h3><p>This program uses Qt version %1.</p> + <h3>О Qt</h3><p>Данная программа использует Qt версии %1.</p> + + + + <p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&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.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p><p>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.</p><p>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.</p><p>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.</p><p>Please see <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).</p><p>Qt is a Nokia product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p> + <p>Qt - это инструментарий для разработки кроссплатформенных приложений на C++.</p><p>Qt предоставляет совместимость на уровне исходных текстов между MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux и всеми популярными коммерческими вариантами Unix. Также Qt доступна для встраиваемых устройств в виде Qt для Embedded Linux и Qt для Windows CE.</p><p>Qt доступна под тремя различными лицензиями, разработанными для удовлетворения различных требований.</p><p>Qt под нашей коммерческой лицензией предназначена для развития проприетарного/коммерческого программного обеспечения, когда Вы не желаете предоставлять исходные тексты третьим сторонам, или в случае невозможности принятия условий лицензий GNU LGPL версии 2.1 или GNU GPL версии 3.0.</p><p>Qt под лицензией GNU LGPL версии 2.1 предназначена для разработки программного обеспечения с открытыми исходными текстами или коммерческого программного обеспечения при соблюдении условий лицензии GNU LGPL версии 2.1.</p><p>Qt под лицензией GNU General Public License версии 3.0 предназначена для разработки программных приложений в тех случаях, когда Вы хотели бы использовать такие приложения в сочетании с программным обеспечением на условиях лицензии GNU GPL с версии 3.0 или если Вы готовы соблюдать условия лицензии GNU GPL версии 3.0.</p><p>Обратитесь к <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> для обзора лицензий Qt.</p><p>Copyright (C) 2010 Корпорация Nokia и/или её дочерние подразделения.</p><p>Qt - продукт компании Nokia. Обратитесь к <a href="http://qt.nokia.com/">qt.nokia.com</a> для получения дополнительной информации.</p> + + + About Qt О Qt - + + Help + Справка + + + Show Details... Показать подробности... - + Hide Details... Скрыть подробности... - - - <h3>About Qt</h3><p>This program uses Qt version %1.</p> - <h3>О Qt</h3><p>Данная программа использует Qt версии %1.</p> - - - - <p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&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.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p><p>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.</p><p>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.</p><p>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.</p><p>Please see <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).</p><p>Qt is a Nokia product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p> - <p>Qt - это инструментарий для разработки кроссплатформенных приложений на C++.</p><p>Qt предоставляет совместимость на уровне исходных текстов между MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux и всеми популярными коммерческими вариантами Unix. Также Qt доступна для встраиваемых устройств в виде Qt для Embedded Linux и Qt для Windows CE.</p><p>Qt доступна под тремя различными лицензиями, разработанными для удовлетворения различных требований.</p><p>Qt под нашей коммерческой лицензией предназначена для развития проприетарного/коммерческого программного обеспечения, когда Вы не желаете предоставлять исходные тексты третьим сторонам, или в случае невозможности принятия условий лицензий GNU LGPL версии 2.1 или GNU GPL версии 3.0.</p><p>Qt под лицензией GNU LGPL версии 2.1 предназначена для разработки программного обеспечения с открытыми исходными текстами или коммерческого программного обеспечения при соблюдении условий лицензии GNU LGPL версии 2.1.</p><p>Qt под лицензией GNU General Public License версии 3.0 предназначена для разработки программных приложений в тех случаях, когда Вы хотели бы использовать такие приложения в сочетании с программным обеспечением на условиях лицензии GNU GPL с версии 3.0 или если Вы готовы соблюдать условия лицензии GNU GPL версии 3.0.</p><p>Обратитесь к <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> для обзора лицензий Qt.</p><p>Copyright (C) 2010 Корпорация Nokia и/или её дочерние подразделения.</p><p>Qt - продукт компании Nokia. Обратитесь к <a href="http://qt.nokia.com/">qt.nokia.com</a> для получения дополнительной информации.</p> - QMultiInputContext @@ -3499,19 +4666,18 @@ Do you want to delete it anyway? Multiple input method switcher - Переключатель режима множественного ввода + Переключатель режима множественного ввода Multiple input method switcher that uses the context menu of the text widgets - текстовых виджетов <-?-> текстовых редакторов - Переключатель режима множественного ввода, используемый в контекстном меню текстовых виджетов + Переключатель режима множественного ввода, используемый в контекстном меню текстовых редакторов QNativeSocketEngine - + The remote host closed the connection Удалённый узел закрыл соединение @@ -3650,12 +4816,35 @@ Do you want to delete it anyway? + QNetworkAccessDataBackend + + + Operation not supported on %1 + Операция не поддерживается для %1 + + + + Invalid URI: %1 + Некорректный URI: %1 + + + QNetworkAccessDebugPipeBackend Write error writing to %1: %2 Ошибка записи в %1: %2 + + + Socket error on %1: %2 + Ошика сокета для %1: %2 + + + + Remote host closed the connection prematurely on %1 + Удалённый узел неожиданно прервал соединение для %1 + QNetworkAccessFileBackend @@ -3719,48 +4908,123 @@ Do you want to delete it anyway? QNetworkAccessHttpBackend - + No suitable proxy found Подходящий прокси-сервер не найден + QNetworkAccessManager + + + Network access is disabled. + Доступ в сеть отключён. + + + QNetworkReply - + Error downloading %1 - server replied: %2 Ошибка загрузки %1 - ответ сервера: %2 - + Protocol "%1" is unknown Неизвестный протокол "%1" + + + Network session error. + Ошибка сетевой сессии. + + + + Temporary network failure. + Временная ошибка сети. + QNetworkReplyImpl - + Operation canceled Операция отменена - QOCIDriver + QNetworkSession - - Unable to logon - Невозможно авторизоваться + + Invalid configuration. + Некорректная конфигурация. + + + + QNetworkSessionPrivateImpl + + + Roaming error + или перемещения? + Ошибка роуминга + + + + Session aborted by user or system + Сессия прервана пользователем или системой + + + + Unidentified Error + Неопределённая ошибка + + + + + Unknown session error. + Неизвестная ошибка сессии. + + + + + The session was aborted by the user or system. + Сессия была прервана пользователем или системой. + + + + + The requested operation is not supported by the system. + Требуемая операция не поддерживается системой. + + + + + The specified configuration cannot be used. + Невозможно использовать указанную конфигурацию. - + + + Roaming was aborted or is not possible. + Роуминг прерван или невозможен. + + + + QOCIDriver + + Unable to initialize QOCIDriver Невозможно инициализировать - + + Unable to logon + Невозможно авторизоваться + + + Unable to begin transaction Невозможно начать транзакцию @@ -3823,12 +5087,12 @@ Do you want to delete it anyway? QODBCDriver - + Unable to connect Невозможно соединиться - + Unable to disable autocommit Невозможно отключить автозавершение транзакций @@ -3848,7 +5112,7 @@ Do you want to delete it anyway? Невозможно включить автозавершение транзакций - + Unable to connect - Driver doesn't support all functionality required Невозможно соединиться - Драйвер не поддерживает требуемый функционал @@ -3856,19 +5120,19 @@ Do you want to delete it anyway? QODBCResult - + QODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration - QODBCResult::reset: Невозможно установить 'SQL_CURSOR_STATIC' атрибутом выражение. Проверьте настройки драйвера ODBC + QODBCResult::reset: Невозможно установить "SQL_CURSOR_STATIC" атрибутом выражение. Проверьте настройки драйвера ODBC - + Unable to execute statement Невозможно выполнить выражение - + Unable to fetch next Невозможно получить следующую строку @@ -3878,19 +5142,19 @@ Do you want to delete it anyway? Невозможно подготовить выражение - + Unable to bind variable Невозможно привязать значение - - + + Unable to fetch last Невозможно получить последнюю строку - + Unable to fetch Невозможно получить данные @@ -3908,41 +5172,27 @@ Do you want to delete it anyway? QObject - - Invalid hostname - Некорректное имя узла - - - - Operation not supported on %1 - Операция не поддерживается для %1 - - - - Invalid URI: %1 - Некорректный URI: %1 - - - - Socket error on %1: %2 - Ошика сокета для %1: %2 + + "%1" duplicates a previous role name and will be disabled. + "%1" повторяет имя предыдущей роли и не будет использовано. - - Remote host closed the connection prematurely on %1 - Удалённый узел неожиданно прервал соединение для %1 + + + invalid query: "%1" + Некорректный запрос: "%1" - - - No host name given - Имя узла не задано + + + PulseAudio Sound Server + Звуковой сервер PulseAudio QPPDOptionsModel - + Name Имя @@ -4134,7 +5384,22 @@ Do you want to delete it anyway? неизвестно - + + OK + Закрыть + + + + Print all + Все страницы + + + + Print range + Диапазон страниц + + + A0 (841 x 1189 mm) A0 (841 x 1189 мм) @@ -4154,12 +5419,7 @@ Do you want to delete it anyway? A3 (297 x 420 мм) - - A4 (210 x 297 mm, 8.26 x 11.7 inches) - A4 (210 x 297 мм, 8.26 x 11.7 дюймов) - - - + A5 (148 x 210 mm) A5 (148 x 210 мм) @@ -4209,12 +5469,7 @@ Do you want to delete it anyway? B4 (250 x 353 мм) - - B5 (176 x 250 mm, 6.93 x 9.84 inches) - B5 (176 x 250 мм, 6.93 x 9.84 дюймов) - - - + B6 (125 x 176 mm) B6 (125 x 176 мм) @@ -4249,12 +5504,7 @@ Do you want to delete it anyway? DLE (110 x 220 мм) - - Executive (7.5 x 10 inches, 191 x 254 mm) - Executive (191 x 254 мм, 7.5 x 10 дюймов) - - - + Folio (210 x 330 mm) Folio (210 x 330 мм) @@ -4264,54 +5514,64 @@ Do you want to delete it anyway? Ledger (432 x 279 мм) - - Legal (8.5 x 14 inches, 216 x 356 mm) - Legal (216 x 356 мм, 8.5 x 14 дюймов) + + Tabloid (279 x 432 mm) + Tabloid (279 x 432 мм) - Letter (8.5 x 11 inches, 216 x 279 mm) - Letter (216 x 279 мм, 8.5 x 11 дюймов) + US Common #10 Envelope (105 x 241 mm) + Конверт US #10 (105x241 мм) - - Tabloid (279 x 432 mm) - Tabloid (279 x 432 мм) + + Print current page + Текущая страница + + + + A4 (210 x 297 mm, 8.26 x 11.7 inches) + A4 (210 x 297 мм, 8.26 x 11.7 дюймов) + + + + B5 (176 x 250 mm, 6.93 x 9.84 inches) + B5 (176 x 250 мм, 6.93 x 9.84 дюймов) + + + + Executive (7.5 x 10 inches, 191 x 254 mm) + Executive (191 x 254 мм, 7.5 x 10 дюймов) + + + + Legal (8.5 x 14 inches, 216 x 356 mm) + Legal (216 x 356 мм, 8.5 x 14 дюймов) - US Common #10 Envelope (105 x 241 mm) - Конверт US #10 (105x241 мм) + Letter (8.5 x 11 inches, 216 x 279 mm) + Letter (216 x 279 мм, 8.5 x 11 дюймов) - - OK - Закрыть + + Print selection + Выделенный фрагмент - + Print Печать - + Print To File ... Печать в файл ... - - Print range - Печатать диапазон - - - - Print all - Печатать все - - - + File %1 is not writable. Please choose a different file name. %1 недоступен для записи. @@ -4325,7 +5585,7 @@ Do you want to overwrite it? Хотите заменить его? - + File exists Файл существует @@ -4335,11 +5595,6 @@ Do you want to overwrite it? <qt>Хотите заменить?</qt> - - Print selection - Выделенный фрагмент - - %1 is a directory. Please choose a different file name. @@ -4347,6 +5602,11 @@ Please choose a different file name. Выберите другое имя файла. + + The 'From' value cannot be greater than the 'To' value. + Значение "с" не может быть больше значения "по". + + A0 A0 @@ -4502,23 +5762,18 @@ Please choose a different file name. Пользовательский - + &Options >> &Параметры >> - - &Print - &Печать - - - + &Options << &Параметры << - + Print to File (PDF) Печать в файл (PDF) @@ -4538,26 +5793,20 @@ Please choose a different file name. Запись %1 файла - - The 'From' value cannot be greater than the 'To' value. - Значение 'от' не может быть больше значения 'до'. + + &Print + &Печать QPrintPreviewDialog - - - Page Setup - Параметры страницы - - %1% %1% - + Print Preview Просмотр печати @@ -4651,6 +5900,12 @@ Please choose a different file name. Export to PostScript Экспорт в Postscript + + + + Page Setup + Параметры страницы + QPrintPropertiesWidget @@ -4695,12 +5950,12 @@ Please choose a different file name. Pages from - Страницы от + Страницы с to - до + по @@ -4767,6 +6022,11 @@ Please choose a different file name. Short side По короткой стороне + + + Current Page + Текущая страница + QPrintWidget @@ -4849,7 +6109,7 @@ Please choose a different file name. Время на операцию с процессом истекло - + @@ -5000,7 +6260,7 @@ Please choose a different file name. QSQLiteDriver - + Error opening database Ошибка открытия базы данных @@ -5028,8 +6288,8 @@ Please choose a different file name. QSQLiteResult - - + + Unable to fetch row Невозможно получить строку @@ -5055,7 +6315,7 @@ Please choose a different file name. Количество параметров не совпадает - + No query Отсутствует запрос @@ -5070,7 +6330,7 @@ Please choose a different file name. Location - Расположение + Размещение @@ -5286,7 +6546,7 @@ Please choose a different file name. QScriptDebuggerLocalsModel - + Name Название @@ -5486,12 +6746,7 @@ Please choose a different file name. QSharedMemory - - %1: unable to set key on lock - %1: невозможно установить ключ на блокировку - - - + %1: create size is less then 0 %1: размер меньше нуля @@ -5545,30 +6800,30 @@ Please choose a different file name. %1: пустой ключ - - - %1: doesn't exist - %1: не существует - - - - %1: UNIX key file doesn't exist - %1: специфический ключ UNIX не существует - - - + %1: ftok failed %1: ошибка ftok - + %1: unable to make key %1: невозможно создать ключ - + + + %1: doesn't exist + %1: не существует + + + + %1: UNIX key file doesn't exist + %1: специфический ключ UNIX не существует + + + %1: system-imposed size restrictions %1: системой наложены ограничения на размер @@ -5579,7 +6834,7 @@ Please choose a different file name. - + %1: invalid size %1: некорректный размер @@ -5594,12 +6849,18 @@ Please choose a different file name. %1: size query failed %1: не удалось запросить размер + + + %1: unable to set key on lock + %1: невозможно установить ключ блокировки + QShortcut - + Space + This and all following "incomprehensible" strings in QShortcut context are key names. Please use the localized names appearing on actual keyboards or whatever is commonly used. Пробел @@ -5775,12 +7036,12 @@ Please choose a different file name. Treble Up - Высокие частоты выше + ВЧ выше Treble Down - Высокие частоты ниже + ВЧ ниже @@ -5920,32 +7181,32 @@ Please choose a different file name. Monitor Brightness Up - Яркость монитора выше + Увеличить яркость монитора Monitor Brightness Down - Яркость монитора ниже + Уменьшить яркость монитора Keyboard Light On/Off - Вкл/выкл подсветку клавиатуры + Вкл./Откл. подсветку клавиатуры Keyboard Brightness Up - Подсветка клавиатуры ярче + Увеличить яркость подсветки клавиатуры Keyboard Brightness Down - Подсветка клавиатуры бледнее + Уменьшить яркость подсветки клавиатуры Power Off - Выключение питания + Отключение питания @@ -5955,12 +7216,12 @@ Please choose a different file name. Eject - Извлечение + Извлечь Screensaver - Хранитель экрана + Экранная заставка @@ -5970,13 +7231,12 @@ Please choose a different file name. Sleep - Засыпание + Спящий режим LightBulb - лампочка? - + Лампочка @@ -6016,7 +7276,7 @@ Please choose a different file name. Audio Rewind - Перемотка + Перемотка аудио назад @@ -6419,7 +7679,157 @@ Please choose a different file name. Системный запрос - + + Kanji + + + + + Muhenkan + + + + + Henkan + + + + + Romaji + + + + + Hiragana + + + + + Katakana + + + + + Hiragana Katakana + + + + + Zenkaku + + + + + Hankaku + + + + + Zenkaku Hankaku + + + + + Touroku + + + + + Massyo + + + + + Kana Lock + + + + + Kana Shift + + + + + Eisu Shift + + + + + Eisu toggle + + + + + Code input + + + + + Multiple Candidate + + + + + Previous Candidate + + + + + Hangul + + + + + Hangul Start + + + + + Hangul End + + + + + Hangul Hanja + + + + + Hangul Jamo + + + + + Hangul Romaja + + + + + Hangul Jeonja + + + + + Hangul Banja + + + + + Hangul PreHanja + + + + + Hangul PostHanja + + + + + Hangul Special + + + + Select Выбрать @@ -6470,7 +7880,7 @@ Please choose a different file name. - + Ctrl Ctrl @@ -6504,7 +7914,7 @@ Please choose a different file name. F%1 - + Home Page Домашняя страница @@ -6638,7 +8048,7 @@ Please choose a different file name. Отмена - + Exit Выход @@ -6716,7 +8126,7 @@ Please choose a different file name. QSslSocket - + Unable to write data: %1 Невозможно записать данные: %1 @@ -6736,17 +8146,17 @@ Please choose a different file name. Ошибка квитирования SSL: %1 - + Error creating SSL context (%1) Ошибка создания контекста SSL: (%1) Invalid or empty cipher list (%1) - Неправильный или пустой список шифров (%1) + Некорректный или пустой список шифров (%1) - + Private key does not certify public key, %1 Закрытый ключ не соответствует открытому ключу, %1 @@ -6761,7 +8171,7 @@ Please choose a different file name. Ошибка создания сессии SSL: %1 - + Cannot provide a certificate with no key, %1 Невозможно предоставить сертификат без ключа, %1 @@ -6771,7 +8181,7 @@ Please choose a different file name. Ошибка загрузки локального сертификата, %1 - + Error loading private key, %1 Ошибка загрузки закрытого ключа, %1 @@ -6783,8 +8193,7 @@ Please choose a different file name. The issuer certificate could not be found - издателя ? - Не удалось найти сертификат запрашивающей стороны + Не удалось найти сертификат издателя @@ -6814,27 +8223,27 @@ Please choose a different file name. The certificate's notBefore field contains an invalid time - Поле сертификата notBefore содержит некорректное время + Поле notBefore сертификата содержит некорректное время The certificate's notAfter field contains an invalid time - Поле сертификата notAfter содержит некорректное время + Поле notAfter сертификата содержит некорректное время The certificate is self-signed, and untrusted - Самоподписанный сертификат не является заверенным + Сертификат самоподписанный и не является заверенным The root certificate of the certificate chain is self-signed, and untrusted - Корневой сертификат цепочки сертификатов самоподписанный и не является заверенным + Корневой сертификат цепочки сертификатов самоподписанный и не является заверенным The issuer certificate of a locally looked up certificate could not be found - + Не удалось найти сертификат издателя локального сертификата @@ -6844,47 +8253,47 @@ Please choose a different file name. One of the CA certificates is invalid - Один из CA сертификатов некорректный + Один из сертификатов центра сертификации некорректен The basicConstraints path length parameter has been exceeded - Путь параметра basicConstraints слишком длинный + Превышено значение параметра длины пути поля basicConstraints сертификата The supplied certificate is unsuitable for this purpose - Представленный сертификат не предназначен для данного использования + Представленный сертификат непригоден для данной цели The root CA certificate is not trusted for this purpose - Корневой CA сертификат не является заверенным для данного использования + Корневой сертификат центра сертификации не является заверенным для данной цели The root CA certificate is marked to reject the specified purpose - Корневой CA сертификат отмечен как 'отказывать' для данного использования + Корневой сертификат центра сертификации отмечен на отклонение для данной цели The current candidate issuer certificate was rejected because its subject name did not match the issuer name of the current certificate - + Текущий сертификат издателя был отклонён, так как название темы не совпадает с названием издателя сертификата 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 - + Текущий сертификат издателя был отклонён, так как название издателя и серийный номер не совпадают с идентификатором ключа сертификата The peer did not present any certificate - Узел не предоставил сертификат + Сертификат не был предоставлен The host name did not match any of the valid hosts for this certificate - Название узла не совпадает ни с одним из допустимых узлов данного сертификата + Название узла не совпадает с допустимыми названиями узлов сертификата @@ -6897,17 +8306,17 @@ Please choose a different file name. Missing initial state in compound state '%1' - + Отсутствует исходное состояние в составном состоянии "%1" Missing default state in history state '%1' - + Отсутствует состояние по умолчанию в историческом состоянии "%1" No common ancestor for targets and source of transition from state '%1' - + Нет общего предка у источника и цели перехода из состояния "%1" @@ -6918,7 +8327,12 @@ Please choose a different file name. QSystemSemaphore - + + %1: does not exist + %1: не существует + + + %1: out of resources %1: недостаточно ресурсов @@ -6935,12 +8349,7 @@ Please choose a different file name. %1: уже существует - - %1: does not exist - %1: не существует - - - + %1: unknown error %2 %1: неизвестная ошибка %2 @@ -6975,7 +8384,7 @@ Please choose a different file name. QTcpServer - + Operation on socket is not supported Операция с сокетом не поддерживается @@ -6983,7 +8392,7 @@ Please choose a different file name. QTextControl - + &Undo &Отменить действие @@ -7041,7 +8450,7 @@ Please choose a different file name. QUdpSocket - + This platform does not support IPv6 Данная платформа не поддерживает IPv6 @@ -7085,52 +8494,52 @@ Please choose a different file name. LRM Left-to-right mark - LRM Индикатор написания слева направо + LRM Признак написания слева направо RLM Right-to-left mark - RLM Индикатор написания справа налево + RLM Признак написания справа налево ZWJ Zero width joiner - ZWJ Объединяющий символ нулевой ширины + ZWJ Объединяющий символ нулевой ширины ZWNJ Zero width non-joiner - ZWNJ Разделитель нулевой ширины + ZWNJ Необъединяющий символ нулевой ширины ZWSP Zero width space - ZWSP Пробел нулевой ширины + ZWSP Пробел нулевой ширины LRE Start of left-to-right embedding - LRE Индикатор написания слева направо внутри текста, написанного справа налево + LRE Начало встраивания написания слева направо RLE Start of right-to-left embedding - RLE Индикатор написания справа налево внутри текста, написанного слева направо + LRE Начало встраивания написания справа налево LRO Start of left-to-right override - LRO Перекрывающий индикатор написания слева направо + LRO Начало замены написания слева направо RLO Start of right-to-left override - RLO Перекрывающий индикатор написания справа налево + RLO Начало замены написания справа налево PDF Pop directional formatting - PDF Индикатор конца текста с другим направлением + PDF Признак окончания написания с другим направлением @@ -7141,7 +8550,7 @@ Please choose a different file name. QWebFrame - + Request cancelled Запрос отменён @@ -7174,854 +8583,865 @@ Please choose a different file name. QWebPage - + + Web Inspector - %2 + Web-инспектор - %2 + + + + Redirection limit reached + Достигнут предел переадресации + + + Bad HTTP request Некорректный HTTP-запрос - - Submit - default label for Submit buttons in forms on web pages - Отправить + + Scroll here + Прокрутить сюда - - Submit - Submit (input element) alt text for <input> elements with no alt, title, or value - Отправить + + Left edge + К левой границе - - Reset - default label for Reset buttons in forms on web pages - Сбросить + + Top + Вверх - - This is a searchable index. Enter search keywords: - text that appears at the start of nearly-obsolete web pages in the form of a 'searchable index' - Индекс поиска. Введите ключевые слова для поиска: + + Right edge + К правой границе - - Choose File - title for file button used in HTML forms - Обзор... + + Bottom + Вниз - - No file selected - text to display in file button used in HTML forms when no file is selected - Файл не указан + + Page left + На страницу влево - - Open in New Window - Open in New Window context menu item - Открыть в новом окне + + Page up + На страницу вверх + + + + Page right + На страницу вправо - - Save Link... - Download Linked File context menu item - Сохранить по ссылке как... + + Page down + На страницу вниз - - Copy Link - Copy Link context menu item - Копировать адрес ссылки + + Scroll left + Прокрутить влево - - Open Image - Open Image in New Window context menu item - Открыть изображение + + Scroll up + Прокрутить вверх - - Save Image - Download Image context menu item - Сохранить изображение + + Scroll right + Прокрутить вправо - - Copy Image - Copy Link context menu item - Копировать изображение в буффер обмена + + Scroll down + Прокрутить вниз - - Open Frame - Open Frame in New Window context menu item - Открыть фрейм + + JavaScript Alert - %1 + JavaScript: Предупреждение - %1 - - Copy - Copy context menu item - Копировать + + JavaScript Confirm - %1 + JavaScript: Подтверждение - %1 - - Go Back - Back context menu item - Назад + + JavaScript Prompt - %1 + JavaScript: Запрос - %1 - - Go Forward - Forward context menu item - Вперёд + + JavaScript Problem - %1 + JavaScript: Проблема - %1 - - Stop - Stop context menu item - Остановить + + The script on this page appears to have a problem. Do you want to stop the script? + Сбой выполнения сценария на данной странице. Желаете остановить выполение сценария? - - Reload - Reload context menu item - Обновить + + Move the cursor to the next character + Переместить указатель к следующему символу - - Cut - Cut context menu item - Вырезать + + Move the cursor to the previous character + Переместить указатель к предыдущему символу - - Paste - Paste context menu item - Вставить + + Move the cursor to the next word + Переместить указатель к следующему слову - - No Guesses Found - No Guesses Found context menu item - Неверное слово + + Move the cursor to the previous word + Переместить указатель к предыдущему слову - - Ignore - Ignore Spelling context menu item - ?Пропускать - Пропустить + + Move the cursor to the next line + Переместить указатель на следующую строку - - Add To Dictionary - Learn Spelling context menu item - Добавить в словарь + + Move the cursor to the previous line + Переместить указатель на предыдущую строку - - Search The Web - Search The Web context menu item - Искать в Интернет + + Move the cursor to the start of the line + Переместить указатель в начало строки - - Look Up In Dictionary - Look Up in Dictionary context menu item - Искать в словаре + + Move the cursor to the end of the line + Переместить указатель в конец строки - - Open Link - Open Link context menu item - Открыть ссылку + + Move the cursor to the start of the block + Переместить указатель в начало блока - - Ignore - Ignore Grammar context menu item - ?Пропускать - Пропустить + + Move the cursor to the end of the block + Переместить указатель в конец блока - - Spelling - Spelling and Grammar context sub-menu item - Орфография + + Move the cursor to the start of the document + Переместить указатель в начало документа - - Show Spelling and Grammar - menu item title - Показать панель проверки правописания + + Move the cursor to the end of the document + Переместить указатель в конец документа - - Hide Spelling and Grammar - menu item title - Скрыть панель проверки правописания + + Select all + Выделить всё - - Check Spelling - Check spelling context menu item - Проверка орфографии + + Select to the next character + Выделить до следующего символа - - Check Spelling While Typing - Check spelling while typing context menu item - Проверять орфографию при наборе текста + + Select to the previous character + Выделить до предыдущего символа - - Check Grammar With Spelling - Check grammar with spelling context menu item - Проверять грамматику с орфографией + + Select to the next word + Выделить до следующего слова - - Fonts - Font context sub-menu item - Шрифты + + Select to the previous word + Выделить до предыдущего слова - - Bold - Bold context menu item - Жирный + + Select to the next line + Выделить до следующей строки - - Italic - Italic context menu item - Курсив + + Select to the previous line + Выделить до предыдущей строки - - Underline - Underline context menu item - Подчёркнутый + + Select to the start of the line + Выделить до начала строки - - Outline - Outline context menu item - Перечёркнутый + + Select to the end of the line + Выделить до конца строки - - Direction - Writing direction context sub-menu item - Направление письма + + Select to the start of the block + Выделить до начала блока - - Text Direction - Text direction context sub-menu item - Направление текста + + Select to the end of the block + Выделить до конца блока - - Default - Default writing direction context menu item - По умолчанию + + Select to the start of the document + Выделить до начала документа - - Left to Right - Left to Right context menu item - Слева направо + + Select to the end of the document + Выделить до конца документа - - Right to Left - Right to Left context menu item - Справа налево + + Delete to the start of the word + Удалить до начала слова - - Loading... - Media controller status message when the media is loading - Загрузка... + + Delete to the end of the word + Удалить до конца слова - - Live Broadcast - Media controller status message when watching a live broadcast - Потоковое вещание + + Insert a new paragraph + Вставить новый параграф - - Audio Element - Media controller element - Аудио-элемент + + Insert a new line + Вставить новую строку - - Video Element - Media controller element - Видео-элемент + + Paste and Match Style + Вставить, сохранив стиль - - Mute Button - Media controller element - Кнопка "приглушить" + + Remove formatting + Удалить форматирование - - Unmute Button - Media controller element - + + Strikethrough + Зачёркнутый - - Play Button - Media controller element - Кнопка "воспроизведение" + + Subscript + Подстрочный - - Pause Button - Media controller element - Кнопка "пауза" + + Superscript + Надстрочный - - Slider - Media controller element - + + Insert Bulleted List + Вставить маркированный список - - Slider Thumb - Media controller element - + + Insert Numbered List + Вставить нумерованный список - - Rewind Button - Media controller element - Кнопка "перемотать" + + Indent + Увеличить отступ - - Return to Real-time Button - Media controller element - + + Outdent + Уменьшить отступ - - Elapsed Time - Media controller element - Прошло времени + + Center + По центру - - Remaining Time - Media controller element - Осталось времени + + Justify + По ширине - - Status Display - Media controller element - Отображение состояния + + Align Left + По левому краю - - Fullscreen Button - Media controller element - Кнопка "полноэкранный режим" + + Align Right + По правому краю - - Seek Forward Button - Media controller element - Кнопка "перемотка вперёд" + + Submit + default label for Submit buttons in forms on web pages + Отправить - - Seek Back Button - Media controller element - Кнопка "перемотка назад" + + Submit + Submit (input element) alt text for <input> elements with no alt, title, or value + Отправить - - Audio element playback controls and status display - Media controller element - Элементы управления воспроизведением звука и отображения состояния + + Reset + default label for Reset buttons in forms on web pages + Сбросить - - Video element playback controls and status display - Media controller element - Элементы управления воспроизведением видео и отображения состояния + + This is a searchable index. Enter search keywords: + text that appears at the start of nearly-obsolete web pages in the form of a 'searchable index' + Индекс поиска. Введите ключевые слова для поиска: - - Mute audio tracks - Media controller element - Выключить звуковые дорожки + + Choose File + title for file button used in HTML forms + Обзор... - - Unmute audio tracks - Media controller element - Включить звуковые дорожки + + No file selected + text to display in file button used in HTML forms when no file is selected + Файл не указан - - Begin playback - Media controller element - Начать воспроизведение + + Open in New Window + Open in New Window context menu item + Открыть в новом окне - - Pause playback - Media controller element - Приостановить воспроизведение + + Save Link... + Download Linked File context menu item + Сохранить по ссылке как... - - Movie time scrubber - Media controller element - + + Copy Link + Copy Link context menu item + Копировать адрес ссылки - - Movie time scrubber thumb - Media controller element - + + Open Image + Open Image in New Window context menu item + Открыть изображение - - Rewind movie - Media controller element - Начать фильм сначала + + Save Image + Download Image context menu item + Сохранить изображение - - Return streaming movie to real-time - Media controller element - + + Copy Image + Copy Link context menu item + Копировать изображение в буффер обмена - - Current movie time - Media controller element - Текущее время фильма + + Open Frame + Open Frame in New Window context menu item + Открыть фрейм - - Remaining movie time - Media controller element - Осталось времени фильма + + Copy + Copy context menu item + Копировать - - Current movie status - Media controller element - Текущее состояние фильма + + Go Back + Back context menu item + Назад - - Play movie in full-screen mode - Media controller element - Воспроизводить фильм в полноэкранном режиме + + Go Forward + Forward context menu item + Вперёд - - Seek quickly back - Media controller element - Быстрая перемотка назад + + Stop + Stop context menu item + Остановить - - Seek quickly forward - Media controller element - Быстрая перемотка вперёд + + Reload + Reload context menu item + Обновить - - Indefinite time - Media time description - Время не определено + + Cut + Cut context menu item + Вырезать - - %1 days %2 hours %3 minutes %4 seconds - Media time description - %1 дней %2 часов %3 минут %4 секунд + + Paste + Paste context menu item + Вставить - - %1 hours %2 minutes %3 seconds - Media time description - %1 часов %2 минут %3 секунд + + No Guesses Found + No Guesses Found context menu item + Совпадений не найдено - - %1 minutes %2 seconds - Media time description - %1 минут %2 секунд + + Ignore + Ignore Spelling context menu item + ?Пропускать + Пропустить - - %1 seconds - Media time description - %1 секунд + + Add To Dictionary + Learn Spelling context menu item + Добавить в словарь - - Inspect - Inspect Element context menu item - Проверить + + Search The Web + Search The Web context menu item + Искать в Интернет - No recent searches - Label for only item in menu that appears when clicking on the search field image, when no searches have been performed - История поиска пуста + Look Up In Dictionary + Look Up in Dictionary context menu item + Искать в словаре - Recent searches - label for first item in the menu that appears when clicking on the search field image, used as embedded menu title - История поиска + Open Link + Open Link context menu item + Открыть ссылку - Clear recent searches - menu item in Recent Searches menu that empties menu's contents - Очистить историю поиска + Ignore + Ignore Grammar context menu item + ?Пропускать + Пропустить - - Unknown - Unknown filesize FTP directory listing item - Неизвестно + + Spelling + Spelling and Grammar context sub-menu item + Орфография - %1 (%2x%3 pixels) - Title string for images - %1 (%2x%3 px) + Show Spelling and Grammar + menu item title + Показать панель проверки правописания - - Web Inspector - %2 - Web-инспектор - %2 + + Hide Spelling and Grammar + menu item title + Скрыть панель проверки правописания - - Scroll here - Прокрутить сюда + + Check Spelling + Check spelling context menu item + Проверка орфографии - - Left edge - К левой границе + + Check Spelling While Typing + Check spelling while typing context menu item + Проверять орфографию при наборе текста - - Top - Вверх + + Check Grammar With Spelling + Check grammar with spelling context menu item + Проверять грамматику с орфографией - - Right edge - К правой границе + + Fonts + Font context sub-menu item + Шрифты - - Bottom - Вниз + + Bold + Bold context menu item + Жирный - - Page left - На страницу влево + + Italic + Italic context menu item + Курсив - - Page up - На страницу вверх + + Underline + Underline context menu item + Подчёркнутый - - Page right - На страницу вправо + + Outline + Outline context menu item + Перечёркнутый - - Page down - На страницу вниз + + Direction + Writing direction context sub-menu item + Направление письма - - Scroll left - Прокрутить влево + + Text Direction + Text direction context sub-menu item + Направление текста - - Scroll up - Прокрутить вверх + + Default + Default writing direction context menu item + По умолчанию - - Scroll right - Прокрутить вправо + + Left to Right + Left to Right context menu item + Слева направо - - Scroll down - Прокрутить вниз - - - - %n file(s) - number of chosen file - - %n файл(а) - %n файла - %n файлов - + + Right to Left + Right to Left context menu item + Справа налево - - JavaScript Alert - %1 - JavaScript: Предупреждение - %1 + + Inspect + Inspect Element context menu item + Проверить - - JavaScript Confirm - %1 - JavaScript: Подтверждение - %1 + + No recent searches + Label for only item in menu that appears when clicking on the search field image, when no searches have been performed + История поиска пуста - - JavaScript Prompt - %1 - JavaScript: Запрос - %1 + + Recent searches + label for first item in the menu that appears when clicking on the search field image, used as embedded menu title + История поиска - - JavaScript Problem - %1 - JavaScript: Проблема - %1 + + Clear recent searches + menu item in Recent Searches menu that empties menu's contents + Очистить историю поиска - - The script on this page appears to have a problem. Do you want to stop the script? - Сбой выполнения сценария на данной странице. Желаете остановить выполение сценария? + + Missing Plug-in + Label text to be used when a plug-in is missing + Модуль отсутствует - - Move the cursor to the next character - Переместить указатель к следующему символу + + Unknown + Unknown filesize FTP directory listing item + Неизвестно - - Move the cursor to the previous character - Переместить указатель к предыдущему символу + + %1 (%2x%3 pixels) + Title string for images + %1 (%2x%3 px) - - Move the cursor to the next word - Переместить указатель к следующему слову + + Loading... + Media controller status message when the media is loading + Загрузка... - - Move the cursor to the previous word - Переместить указатель к предыдущему слову + + Live Broadcast + Media controller status message when watching a live broadcast + Потоковое вещание - - Move the cursor to the next line - Переместить указатель на следующую строку + + Audio Element + Media controller element + Аудио-элемент - - Move the cursor to the previous line - Переместить указатель на предыдущую строку + + Video Element + Media controller element + Видео-элемент - - Move the cursor to the start of the line - Переместить указатель в начало строки + + Mute Button + Media controller element + Кнопка "Отключить звук" - - Move the cursor to the end of the line - Переместить указатель в конец строки + + Unmute Button + Media controller element + Кнопка "Включить звук" - - Move the cursor to the start of the block - Переместить указатель в начало блока + + Play Button + Media controller element + Кнопка "Воспроизведение" - - Move the cursor to the end of the block - Переместить указатель в конец блока + + Pause Button + Media controller element + Кнопка "Пауза" - - Move the cursor to the start of the document - Переместить указатель в начало документа + + Slider + Media controller element + Регулятор - - Move the cursor to the end of the document - Переместить указатель в конец документа + + Slider Thumb + Media controller element + Указатель регулятора - - Select all - Выделить всё + + Rewind Button + Media controller element + Кнопка "Перемотка назад" - - Select to the next character - Выделить до следующего символа + + Return to Real-time Button + Media controller element + Кнопка "Вернуть в реальное время" - - Select to the previous character - Выделить до предыдущего символа + + Elapsed Time + Media controller element + Прошло времени - - Select to the next word - Выделить до следующего слова + + Remaining Time + Media controller element + Осталось времени - - Select to the previous word - Выделить до предыдущего слова + + Status Display + Media controller element + Отображение состояния - - Select to the next line - Выделить до следующей строки + + Fullscreen Button + Media controller element + Кнопка "На весь экран" - - Select to the previous line - Выделить до предыдущей строки + + Seek Forward Button + Media controller element + Кнопка "Перемотка вперёд" - - Select to the start of the line - Выделить до начала строки + + Seek Back Button + Media controller element + Кнопка "Перемотка назад" - - Select to the end of the line - Выделить до конца строки + + Audio element playback controls and status display + Media controller element + Элементы управления воспроизведением звука и отображением состояния - - Select to the start of the block - Выделить до начала блока + + Video element playback controls and status display + Media controller element + Элементы управления воспроизведением видео и отображением состояния - - Select to the end of the block - Выделить до конца блока + + Mute audio tracks + Media controller element + Отключить звуковые дорожки - - Select to the start of the document - Выделить до начала документа + + Unmute audio tracks + Media controller element + Включить звуковые дорожки - - Select to the end of the document - Выделить до конца документа + + Begin playback + Media controller element + Начать воспроизведение - - Delete to the start of the word - Удалить до начала слова + + Pause playback + Media controller element + Приостановить воспроизведение - - Delete to the end of the word - Удалить до конца слова + + Movie time scrubber + Media controller element + Перемотка - - Insert a new paragraph - Вставить новый параграф + + Movie time scrubber thumb + Media controller element + Позиция перемотки - - Insert a new line - Вставить новую строку + + Rewind movie + Media controller element + Перемотка в начало - - Paste and Match Style - Вставить, сохранив стиль + + Return streaming movie to real-time + Media controller element + Возвращает потоковое видео к воспроизведению в реальном времени - - Remove formatting - Удалить форматирование + + Current movie time + Media controller element + Текущее время фильма - - Strikethrough - Зачёркнутый + + Remaining movie time + Media controller element + Оставшееся время фильма - - Subscript - Подстрочный + + Current movie status + Media controller element + Текущее состояние фильма - - Superscript - Надстрочный + + Play movie in full-screen mode + Media controller element + Воспроизведение фильма в режиме отображения на весь экран - - Insert Bulleted List - Вставить маркированный список + + Seek quickly back + Media controller element + Быстрая перемотка назад - - Insert Numbered List - Вставить нумерованный список + + Seek quickly forward + Media controller element + Быстрая перемотка вперёд - - Indent - Увеличить отступ + + Indefinite time + Media time description + Время не определено - - Outdent - Уменьшить отступ + + %1 days %2 hours %3 minutes %4 seconds + Media time description + %1 дней %2 часов %3 минут %4 секунд - - Center - По центру + + %1 hours %2 minutes %3 seconds + Media time description + %1 часов %2 минут %3 секунд - - Justify - По ширине + + %1 minutes %2 seconds + Media time description + %1 минут %2 секунд - Align Left - По левому краю + %1 seconds + Media time description + %1 секунд - - - Align Right - По правому краю + + + %n file(s) + number of chosen file + + %n файл(а) + %n файла + %n файлов + @@ -8035,7 +9455,7 @@ Please choose a different file name. QWidget - + * * @@ -8043,27 +9463,12 @@ Please choose a different file name. QWizard - - Go Back - Назад - - - - Continue - Продолжить - - - - Commit - Передать + + Cancel + Отмена - Done - Готово - - - Help Справка @@ -8078,17 +9483,32 @@ Please choose a different file name. &Завершить - - Cancel - Отмена + + &Help + &Справка + + + + Go Back + Назад + + + + Continue + Продолжить + + + + Commit + Передать - &Help - &Справка + Done + Готово - + &Next &Далее @@ -8136,19 +9556,7 @@ Please choose a different file name. Оставаться &сверху - - - Sh&ade - Св&ернуть в заголовок - - - - - %1 - [%2] - %1 - [%2] - - - + Minimize Свернуть @@ -8163,7 +9571,19 @@ Please choose a different file name. Закрыть - + + + Sh&ade + Св&ернуть в заголовок + + + + + %1 - [%2] + %1 - [%2] + + + &Unshade В&осстановить из заголовка @@ -8226,17 +9646,7 @@ Please choose a different file name. некорректное значение параметра standalone - - encoding declaration or standalone declaration expected while reading the XML declaration - в объявлении XML ожидаются параметры encoding или standalone - - - - standalone declaration expected while reading the XML declaration - в объявлении XML ожидается параметр standalone - - - + error occurred while parsing document type definition ошибка разбора объявления типа документа @@ -8273,7 +9683,7 @@ Please choose a different file name. unparsed entity reference in wrong context - неразобранная ссылка на объект в неверном контексте + неразобранная ссылка на объект в неправильном контексте @@ -8285,6 +9695,16 @@ Please choose a different file name. error in the text declaration of an external entity ошибка в объявлении внешнего объекта + + + encoding declaration or standalone declaration expected while reading the XML declaration + в объявлении XML ожидаются параметры encoding или standalone + + + + standalone declaration expected while reading the XML declaration + в объявлении XML ожидается параметр standalone + QXmlPatternistCLI @@ -8335,12 +9755,12 @@ Please choose a different file name. Sequence ']]>' not allowed in content. - Последовательность ']]>' недопустима в содержимом. + Последовательность "]]>" недопустима в содержимом. Namespace prefix '%1' not declared - Префикс пространства имён '%1' не объявлен + Префикс пространства имён "%1" не объявлен @@ -8350,12 +9770,12 @@ Please choose a different file name. Unexpected character '%1' in public id literal. - Неожиданный символ '%1' в литерале открытого идентификатора. + Неожиданный символ "%1" в литерале открытого идентификатора. Invalid XML version string. - Неверная строка версии XML. + Некорректная строка версии XML. @@ -8365,7 +9785,7 @@ Please choose a different file name. %1 is an invalid encoding name. - %1 - неверное название кодировки. + %1 - не является корректным названием кодировки. @@ -8375,7 +9795,7 @@ Please choose a different file name. Standalone accepts only yes or no. - Псевдоатрибут 'standalone' может принимать только значения 'yes' или 'no'. + Псевдоатрибут "standalone" может принимать только значения "yes" или "no". @@ -8435,12 +9855,12 @@ Please choose a different file name. %1 is an invalid processing instruction name. - %1 неверное название обрабатываемой инструкции. + %1 не является корректным названием обрабатываемой инструкции. Invalid processing instruction name. - Неверное название обрабатываемой инструкции. + Некорректное название обрабатываемой инструкции. @@ -8448,7 +9868,7 @@ Please choose a different file name. Illegal namespace declaration. - Неверное объявление пространства имён. + Некорректное объявление пространства имён. @@ -8463,44 +9883,283 @@ Please choose a different file name. Reference to unparsed entity '%1'. - Ссылка на необработанный объект '%1'. + Ссылка на необработанный объект "%1". Entity '%1' not declared. - Объект '%1' не объявлен. + Объект "%1" не объявлен. + + + + Reference to external entity '%1' in attribute value. + Ссылка на внешний объект "%1" в значении атрибута. + + + + Invalid character reference. + Некорректная символьная ссылка. + + + + + Encountered incorrectly encoded content. + Обнаружено некорректно закодированное содержимое. + + + + The standalone pseudo attribute must appear after the encoding. + Псевдоатрибут "standalone" должен находиться после указания кодировки. + + + + %1 is an invalid PUBLIC identifier. + %1 - некорректный идентификатор PUBLIC. + + + + QtXmlPatterns + + + + At least one component must be present. + Должна присутствовать как минимум одна компонента. + + + + %1 is not a valid value of type %2. + %1 не является правильным значением типа %2. + + + + When casting to %1 from %2, the source value cannot be %3. + При преобразовании %2 в %1 исходное значение не может быть %3. + + + + Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values. + Булево значение не может быть вычислено для последовательностей, которые содержат два и более атомарных значения. + + + + The data of a processing instruction cannot contain the string %1 + Данные обрабатываемой инструкции не могут содержать строку "%1" + + + + + %1 is an invalid %2 + %1 некоррекно для %2 + + + + %1 is not a valid XML 1.0 character. + Символ %1 недопустим для XML 1.0. + + + + %1 was called. + %1 было вызвано. + + + + In the replacement string, %1 must be followed by at least one digit when not escaped. + В замещаемой строке "%1" должно сопровождаться как минимум одной цифрой, если неэкранировано. + + + + In the replacement string, %1 can only be used to escape itself or %2, not %3 + В замещаемой строке символ "%1" может использоваться только для экранирования самого себя или "%2", но не "%3" + + + + %1 matches newline characters + %1 соответствует символам конца строки + + + + Matches are case insensitive + Соответствия регистронезависимы + + + + %1 is an invalid regular expression pattern: %2 + %1 - некорректный шаблон регулярного выражения: %2 + + + + It will not be possible to retrieve %1. + Будет невозможно восстановить %1. + + + + The default collection is undefined + Набор по умолчанию не определён + + + + %1 cannot be retrieved + %1 не может быть восстановлен + + + + The item %1 did not match the required type %2. + Элемент %1 не соответствует необходимому типу %2. + + + + + %1 is an unknown schema type. + %1 является схемой неизвестного типа. + + + + A template with name %1 has already been declared. + Шаблон с именем %1 уже был объявлен. + + + + Only one %1 declaration can occur in the query prolog. + Только одно объявление %1 может присутствовать в прологе запроса. + + + + The initialization of variable %1 depends on itself + Инициализация переменной %1 зависит от себя самой + + + + The variable %1 is unused + Переменная %1 не используется + + + + Version %1 is not supported. The supported XQuery version is 1.0. + Версия %1 не поддерживается. Поддерживается XQuery версии 1.0. + + + + No function with signature %1 is available + Функция с сигнатурой %1 отсутствует + + + + It is not possible to redeclare prefix %1. + Невозможно переопределить префикс %1. + + + + Prefix %1 is already declared in the prolog. + Префикс %1 уже объявлен в прологе. + + + + The name of an option must have a prefix. There is no default namespace for options. + Название опции должно содержать префикс. Нет пространства имён по умолчанию для опций. + + + + The Schema Import feature is not supported, and therefore %1 declarations cannot occur. + Возможность импорта схем не поддерживается, следовательно, объявлений %1 быть не должно. + + + + The target namespace of a %1 cannot be empty. + Целевое пространство имён %1 не может быть пустым. + + + + The module import feature is not supported + Возможность импорта модулей не поддерживается + + + + 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 + Пространство имён пользовательской функции в модуле библиотеки должен соответствовать пространству имён модуля. Другими словами, он должен быть %1 вместо %2 + + + + A function already exists with the signature %1. + Функция с сигнатурой %1 уже существует. + + + + No external functions are supported. All supported functions can be used directly, without first declaring them as external + Внешние функции не поддерживаются. Все поддерживаемые функции могут использоваться напрямую без первоначального объявления их в качестве внешних + + + + The %1-axis is unsupported in XQuery + Ось %1 не поддерживается в XQuery + + + + The namespace URI cannot be the empty string when binding to a prefix, %1. + URI пространства имён не может быть пустой строкой при связывании с префиксом %1. + + + + %1 is an invalid namespace URI. + %1 - некорректный URI пространства имён. + + + + It is not possible to bind to the prefix %1 + Невозможно связать с префиксом %1 + + + + Two namespace declaration attributes have the same name: %1. + Два атрибута объявления пространств имён имеют одинаковое имя: %1. + + + + The namespace URI must be a constant and cannot use enclosed expressions. + URI пространства имён должен быть константой и не может содержать выражений. + + + + + %1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported. + %1 является объявлением атрибута вне области объявлений. Имейте в виду, возможность импорта схем не поддерживается. + + + + empty + пусто + + + + zero or one + нуль или один - - Reference to external entity '%1' in attribute value. - Ссылка на внешний объект '%1' в значении атрибута. + + exactly one + ровно один - - Invalid character reference. - Неверная символьная ссылка. + + one or more + один или более - - - Encountered incorrectly encoded content. - Обнаружено неверно закодированное содержимое. + + zero or more + нуль или более - - The standalone pseudo attribute must appear after the encoding. - Псевдоатрибут 'standalone' должен находиться после указания кодировки. + + The focus is undefined. + Фокус не определён. - - %1 is an invalid PUBLIC identifier. - %1 - неверный идентификатор PUBLIC. + + An attribute by name %1 has already been created. + Атрибут с именем %1 уже существует. - - - QtXmlPatterns Network timeout. @@ -8509,7 +10168,7 @@ Please choose a different file name. Element %1 can't be serialized because it appears outside the document element. - Элемент %1 не может быть сериализован, так как присутствует вне документа. + Элемент %1 не может быть сериализован, так как расположен вне документа. @@ -8539,12 +10198,12 @@ Please choose a different file name. Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; - Время 24:%1:%2.%3 неверно. 24 часа, но минуты, секунды и/или миллисекунды отличны от 0; + Время 24:%1:%2.%3 некорректно. 24 часа, но минуты, секунды и/или миллисекунды отличны от 0; Time %1:%2:%3.%4 is invalid. - Время %1:%2:%3.%4 неверно. + Время %1:%2:%3.%4 некорректно. @@ -8552,43 +10211,12 @@ Please choose a different file name. Переполнение: невозможно представить дату. - - - At least one component must be present. - Должна присутствовать как минимум одна компонента. - - - + At least one time component must appear after the %1-delimiter. Как минимум одна компонента времени должна следовать за разделителем '%1'. - - %1 is not a valid value of type %2. - %1 не является правильным значением типа %2. - - - - When casting to %1 from %2, the source value cannot be %3. - При преобразовании %2 в %1 исходное значение не может быть %3. - - - - Integer division (%1) by zero (%2) is undefined. - Целочисленное деление (%1) на нуль (%2) не определено. - - - - Division (%1) by zero (%2) is undefined. - Деление (%1) на нуль (%2) не определено. - - - - Modulus division (%1) by zero (%2) is undefined. - Деление по модулю (%1) на нуль (%2) не определено. - - - + Dividing a value of type %1 by %2 (not-a-number) is not allowed. Деление числа типа %1 на %2 (не числовое выражение) недопустимо. @@ -8609,11 +10237,6 @@ Please choose a different file name. Значение типа %1 не может быть булевым значением. - - Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values. - Булево значение не может быть вычислено для последовательностей, которые содержат два и более атомарных значения. - - Value %1 of type %2 exceeds maximum (%3). Значение %1 типа %2 больше максимума (%3). @@ -8703,304 +10326,98 @@ Please choose a different file name. The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, %2 is invalid. Целевое имя в обрабатываемой инструкции не может быть %1 в любой комбинации нижнего и верхнего регистров. Имя %2 некорректно. - - - %1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3. - %1 некорректное целевое имя в обрабатываемой инструкции. Имя должно быть значением типа %2, например: %3. - - - - The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two. - Последняя часть пути должна содержать узлы или атомарные значения, но не может содержать и то, и другое одновременно. - - - - The data of a processing instruction cannot contain the string %1 - Данные обрабатываемой инструкции не могут содержать строку '%1' - - - - No namespace binding exists for the prefix %1 - Отсутствует привязка к пространству имён для префикса %1 - - - - No namespace binding exists for the prefix %1 in %2 - Отсутствует привязка к пространству имён для префикса %1 в %2 - - - - - %1 is an invalid %2 - %1 некоррекно для %2 - - - - %1 takes at most %n argument(s). %2 is therefore invalid. - - %1 принимает не более %n аргумента. Следовательно, %2 неверно. - %1 принимает не более %n аргументов. Следовательно, %2 неверно. - %1 принимает не более %n аргументов. Следовательно, %2 неверно. - - - - - %1 requires at least %n argument(s). %2 is therefore invalid. - - %1 принимает не менее %n аргумента. Следовательно, %2 неверно. - %1 принимает не менее %n аргументов. Следовательно, %2 неверно. - %1 принимает не менее %n аргументов. Следовательно, %2 неверно. - - - - - The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration. - Первый аргумент %1 не может быть типа %2. Он должен быть числового типа, типа xs:yearMonthDuration или типа xs:dayTimeDuration. - - - - The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5. - Первый аргумент %1 не может быть типа %2. Он должен быть типа %3, %4 или %5. - - - - The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5. - Второй аргумент %1 не может быть типа %2. Он должен быть типа %3, %4 или %5. - - - - %1 is not a valid XML 1.0 character. - Символ %1 недопустим для XML 1.0. - - - - If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same. - Если оба значения имеют региональные смещения, смещения должны быть одинаковы. %1 и %2 не одинаковы. - - - - %1 was called. - %1 было вызвано. - - - - %1 must be followed by %2 or %3, not at the end of the replacement string. - '%1' должно сопровождаться '%2' или '%3', но не в конце замещаемой строки. - - - - In the replacement string, %1 must be followed by at least one digit when not escaped. - В замещаемой строке '%1' должно сопровождаться как минимум одной цифрой, если неэкранировано. - - - - In the replacement string, %1 can only be used to escape itself or %2, not %3 - В замещаемой строке символ '%1' может использоваться только для экранирования самого себя или '%2', но не '%3' - - - - %1 matches newline characters - %1 соответствует символам конца строки - - - - %1 and %2 match the start and end of a line. - %1 и %2 соответствуют началу и концу строки. - - - - Matches are case insensitive - Соответствия регистронезависимы - - - - Whitespace characters are removed, except when they appear in character classes - Символы пробелов удалены, за исключением тех, что были в классах символов - - - - %1 is an invalid regular expression pattern: %2 - %1 - неверный шаблон регулярного выражения: %2 - - - - %1 is an invalid flag for regular expressions. Valid flags are: - %1 - неверный флаг для регулярного выражения. Допустимые флаги: - - - - If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified. - Префикс не должен быть указан, если первый параметр - пустая последовательность или пустая строка (вне пространства имён). Был указан префикс %1. - - - - It will not be possible to retrieve %1. - Будет невозможно восстановить %1. - - - - The root node of the second argument to function %1 must be a document node. %2 is not a document node. - Корневой узел второго аргумента функции %1 должен быть документом. %2 не является документом. - - - - The default collection is undefined - Набор по умолчанию не определён - - - - %1 cannot be retrieved - %1 не может быть восстановлен - - - - The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization). - Форма нормализации %1 не поддерживается. Поддерживаются только %2, %3, %4, %5 и пустая, т.е. пустая строка (без нормализации). - - - - A zone offset must be in the range %1..%2 inclusive. %3 is out of range. - Региональное смещение должно быть в переделах от %1 до %2 включительно. %3 выходит за допустимые пределы. - - - - %1 is not a whole number of minutes. - %1 не является полным количеством минут. - - - - Required cardinality is %1; got cardinality %2. - Необходимо %1 элементов, получено %2. - - - - The item %1 did not match the required type %2. - Элемент %1 не соответствует необходимому типу %2. - - - - - %1 is an unknown schema type. - %1 является схемой неизвестного типа. - - - - A template with name %1 has already been declared. - Шаблон с именем %1 уже был объявлен. - - - - Only one %1 declaration can occur in the query prolog. - Только одно объявление %1 может присутствовать в прологе запроса. - - - - The initialization of variable %1 depends on itself - Инициализация переменной %1 зависит от себя самой - - - - The variable %1 is unused - Переменная %1 не используется - - - - Version %1 is not supported. The supported XQuery version is 1.0. - Версия %1 не поддерживается. Поддерживается XQuery версии 1.0. - - - - The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2. - Кодировка %1 неверна. Имя кодировки должно содержать только символы латиницы без пробелов и должно удовлетворять регулярному выражению %2. + + + %1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3. + %1 некорректное целевое имя в обрабатываемой инструкции. Имя должно быть значением типа %2, например: %3. - - No function with signature %1 is available - Функция с сигнатурой %1 отсутствует + + The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two. + Последняя часть пути должна содержать узлы или атомарные значения, но не может содержать и то, и другое одновременно. - - - A default namespace declaration must occur before function, variable, and option declarations. - Объявление пространство имён по умолчанию должно быть до объявления функций, переменных и опций. + + No namespace binding exists for the prefix %1 + Отсутствует привязка к пространству имён для префикса %1 - - Namespace declarations must occur before function, variable, and option declarations. - Объявление пространства имён должно быть до объявления функций, переменных и опций. + + No namespace binding exists for the prefix %1 in %2 + Отсутствует привязка к пространству имён для префикса %1 в %2 - - Module imports must occur before function, variable, and option declarations. - Импортируемые модули должны быть указаны до объявления функций, переменных и опций. + + The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration. + Первый аргумент %1 не может быть типа %2. Он должен быть числового типа, типа xs:yearMonthDuration или типа xs:dayTimeDuration. - - It is not possible to redeclare prefix %1. - Невозможно переопределить префикс %1. + + The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5. + Первый аргумент %1 не может быть типа %2. Он должен быть типа %3, %4 или %5. - - Prefix %1 is already declared in the prolog. - Префикс %1 уже объявлен в прологе. + + The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5. + Второй аргумент %1 не может быть типа %2. Он должен быть типа %3, %4 или %5. - - The name of an option must have a prefix. There is no default namespace for options. - Название опции должно содержать префикс. Нет пространства имён по умолчанию для опций. + + If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same. + Если оба значения имеют региональные смещения, смещения должны быть одинаковы. %1 и %2 не одинаковы. - - The Schema Import feature is not supported, and therefore %1 declarations cannot occur. - Возможность импорта схем не поддерживается, следовательно, объявлений %1 быть не должно. + + %1 must be followed by %2 or %3, not at the end of the replacement string. + "%1" должно сопровождаться "%2" или "%3", но не в конце замещаемой строки. - - The target namespace of a %1 cannot be empty. - Целевое пространство имён %1 не может быть пустым. + + %1 and %2 match the start and end of a line. + %1 и %2 соответствуют началу и концу строки. - - The module import feature is not supported - Возможность импорта модулей не поддерживается + + Whitespace characters are removed, except when they appear in character classes + Символы пробелов удалены (за исключением тех, что были в символах классов) - - The keyword %1 cannot occur with any other mode name. - Ключевое слово %1 не может встречаться с любым другим названием режима. + + %1 is an invalid flag for regular expressions. Valid flags are: + %1 - некорректный флаг регулярного выражения. Допустимые флаги: - - A stylesheet function must have a prefixed name. - Функция стилей должна иметь имя с префиксом. + + If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified. + Префикс не должен быть указан, если первый параметр - пустая последовательность или пустая строка (вне пространства имён). Был указан префикс %1. - - The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this) - Пространство имён для пользовательских функций не может быть пустым (попробуйте предопределённый префикс %1, который существует для подобных ситуаций) + + The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization). + Форма нормализации %1 не поддерживается. Поддерживаются только %2, %3, %4, %5 и пустая, т.е. пустая строка (без нормализации). - - The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases. - Пространтсво имён %1 зарезервировано, поэтому пользовательские функции не могут его использовать. Попробуйте предопределённый префикс %2, который существует для подобных ситуаций. + + A zone offset must be in the range %1..%2 inclusive. %3 is out of range. + Региональное смещение должно быть в переделах от %1 до %2 включительно. %3 выходит за допустимые пределы. - - 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 - Пространство имён пользовательской функции в модуле библиотеки должен соответствовать пространству имён модуля. Другими словами, он должен быть %1 вместо %2 + + Required cardinality is %1; got cardinality %2. + Необходимо %1 элементов, получено %2. - - A function already exists with the signature %1. - Функция с сигнатурой %1 уже существует. + + The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2. + Имя кодировки %1 некорректно. Имя кодировки должно содержать только символы латиницы без пробелов и должно удовлетворять регулярному выражению %2. - - No external functions are supported. All supported functions can be used directly, without first declaring them as external - Внешние функции не поддерживаются. Все поддерживаемые функции могут использоваться напрямую без первоначального объявления их в качестве внешних + + The keyword %1 cannot occur with any other mode name. + Ключевое слово %1 не может встречаться с любым другим названием режима. - + No variable with name %1 exists Переменная с именем %1 отсутствует @@ -9025,7 +10442,17 @@ Please choose a different file name. Отсутствует значение для внешней переменной с именем %1. - + + A stylesheet function must have a prefixed name. + Функция стилей должна иметь имя с префиксом. + + + + The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases. + Пространтсво имён %1 зарезервировано, поэтому пользовательские функции не могут его использовать. Попробуйте предопределённый префикс %2, который существует для подобных ситуаций. + + + An argument with name %1 has already been declared. Every argument name must be unique. Аргумент с именем %1 уже объявлен. Имя каждого аргумента должно быть уникальным. @@ -9062,12 +10489,12 @@ Please choose a different file name. %1 is an invalid template mode name. - %1 является неверным шаблоном имени режима. + %1 не является корректным шаблоном имени режима. The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide. - Имя переменной, связанной с выражением for, должно отличаться от позиционной переменной. Две переменные с именем %1 конфликтуют. + Имя переменной, связанной с выражением for, должно отличаться от позиционной переменной. Две переменные с именем %1 конфликтуют. @@ -9085,29 +10512,14 @@ Please choose a different file name. Имя каждого параметра шаблона должно быть уникальным, но %1 повторяется. - - The %1-axis is unsupported in XQuery - Ось %1 не поддерживается в XQuery - - - + No function with name %1 is available. Функция с именем %1 отсутствует. - - An attribute with name %1 has already appeared on this element. - Атрибут с именем %1 уже существует для данного элемента. - - - - %1 is not a valid name for a processing-instruction. - %1 является неверным названием для инструкции обработки. - - - + %1 is not a valid numeric literal. - %1 является неверным числовым литералом. + %1 не является корректным числовым литералом. @@ -9125,22 +10537,7 @@ Please choose a different file name. Встречена конструкция, запрещённая для текущего языка (%1). - - The namespace URI cannot be the empty string when binding to a prefix, %1. - URI пространства имён не может быть пустой строкой при связывании с префиксом %1. - - - - %1 is an invalid namespace URI. - %1 - неверный URI пространства имён. - - - - It is not possible to bind to the prefix %1 - Невозможно связать с префиксом %1 - - - + Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared). Пространство имён %1 может быть связано только с %2 (в данном случае уже предопределено). @@ -9150,17 +10547,12 @@ Please choose a different file name. Префикс %1 может быть связан только с %2 (в данном случае уже предопределено). - - Two namespace declaration attributes have the same name: %1. - Два атрибута объявления пространств имён имеют одинаковое имя: %1. - - - - The namespace URI must be a constant and cannot use enclosed expressions. - URI пространства имён должно быть константой и не может содержать выражений. + + An attribute with name %1 has already appeared on this element. + Атрибут с именем %1 уже существует для данного элемента. - + A direct element constructor is not well-formed. %1 is ended with %2. Прямой конструктор элемента составлен некорректно. %1 заканчивается на %2. @@ -9180,70 +10572,98 @@ Please choose a different file name. %1 - не атомарный тип. Преобразование возможно только к атомарным типам. - - - %1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported. - %1 является объявлением атрибута вне области объявлений. Имейте в виду, возможность импорта схем не поддерживается. + + %1 is not a valid name for a processing-instruction. + %1 не является корректным названием инструкции обработки. - + The name of an extension expression must be in a namespace. Название выражения расширения должно быть в пространстве имён. - - empty - пусто + + Required type is %1, but %2 was found. + Требуется тип %1, но обнаружен %2. - - zero or one - нуль или один + + Promoting %1 to %2 may cause loss of precision. + Преобразование %1 к %2 может снизить точность. - - exactly one - ровно один + + It's not possible to add attributes after any other kind of node. + Невозможно добавлять атрибуты после любого другого вида узла. - - one or more - один или более + + Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported. + Поддерживается только Unicode Codepoint Collation (%1). %2 не поддерживается. - - zero or more - нуль или более + + Integer division (%1) by zero (%2) is undefined. + Целочисленное деление (%1) на нуль (%2) не определено. - - Required type is %1, but %2 was found. - Требуется тип %1, но обнаружен %2. + + Division (%1) by zero (%2) is undefined. + Деление (%1) на нуль (%2) не определено. - - Promoting %1 to %2 may cause loss of precision. - Преобразование %1 к %2 может снизить точность. + + Modulus division (%1) by zero (%2) is undefined. + Деление по модулю (%1) на нуль (%2) не определено. + + + + %1 takes at most %n argument(s). %2 is therefore invalid. + + %1 принимает не более %n аргумента. Следовательно, %2 некорректно. + %1 принимает не более %n аргументов. Следовательно, %2 некорректно. + %1 принимает не более %n аргументов. Следовательно, %2 некорректно. + + + + + %1 requires at least %n argument(s). %2 is therefore invalid. + + %1 принимает не менее %n аргумента. Следовательно, %2 некорректно. + %1 принимает не менее %n аргументов. Следовательно, %2 некорректно. + %1 принимает не менее %n аргументов. Следовательно, %2 некорректно. + - - The focus is undefined. - Фокус не определён. + + The root node of the second argument to function %1 must be a document node. %2 is not a document node. + Корневой узел второго аргумента функции %1 должен быть документом. %2 не является документом. - - It's not possible to add attributes after any other kind of node. - Невозможно добавлять атрибуты после любого другого вида узла. + + The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this) + Пространство имён для пользовательских функций не может быть пустым (попробуйте предопределённый префикс %1, который существует для подобных ситуаций) - - An attribute by name %1 has already been created. - Атрибут с именем %1 уже существует. + + + A default namespace declaration must occur before function, variable, and option declarations. + Объявление пространство имён по умолчанию должно быть до объявления функций, переменных и опций. - - Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported. - Поддерживается только Unicode Codepoint Collation (%1). %2 не поддерживается. + + Namespace declarations must occur before function, variable, and option declarations. + Объявление пространства имён должно быть до объявления функций, переменных и опций. + + + + Module imports must occur before function, variable, and option declarations. + Импортируемые модули должны быть указаны до объявления функций, переменных и опций. + + + + %1 is not a whole number of minutes. + %1 не является полным количеством минут. @@ -9398,12 +10818,12 @@ Please choose a different file name. Element %1 cannot have children. - У элемента %1 не может быть потомков. + Элемент %1 не может иметь потомков. Element %1 cannot have a sequence constructor. - У элемента %1 не может быть конструктора последовательности. + Элемент %1 не может иметь конструктор последовательности. @@ -9414,7 +10834,7 @@ Please choose a different file name. A parameter in a function cannot be declared to be a tunnel. - Параметр в функции не может быть объявлен туннелем. + Параметр функции не может быть объявлен туннелем. @@ -9942,13 +11362,13 @@ Please choose a different file name. - + Type %1 of %2 element cannot be resolved. - + Base type %1 of complex type cannot be resolved. @@ -9958,7 +11378,7 @@ Please choose a different file name. - + Content model of complex type %1 contains %2 element so it cannot be derived by extension from a non-empty type. @@ -10148,7 +11568,7 @@ Please choose a different file name. - + Document is not a XML schema. @@ -10174,7 +11594,7 @@ Please choose a different file name. - + %1 element is not allowed to have the same %2 attribute value as the target namespace %3. @@ -10184,7 +11604,7 @@ Please choose a different file name. - + %1 element is not allowed inside %2 element if %3 attribute is present. @@ -10288,7 +11708,7 @@ Please choose a different file name. Text or entity references not allowed inside %1 element - + Текст или ссылка на объект недопустимы в качестве содержимого элемента %1 @@ -10325,17 +11745,17 @@ Please choose a different file name. Element %1 already defined. - + Элемент %1 уже определён. Attribute %1 already defined. - + Атрибут %1 уже определён. Type %1 already defined. - + Тип %1 уже определён. @@ -10345,7 +11765,7 @@ Please choose a different file name. Element group %1 already defined. - + Группа элементов %1 уже определёна. @@ -10367,7 +11787,7 @@ Please choose a different file name. %1 is not valid according to %2. - + %1 некорректно в соответствии с %2. @@ -10592,7 +12012,7 @@ Please choose a different file name. Invalid QName content: %1. - + Некорректное содержимое QName: %1. @@ -10662,32 +12082,32 @@ Please choose a different file name. Loaded schema file is invalid. - + Загруженный файл схемы некорректен. %1 contains invalid data. - + %1 содержит некорректные данные. xsi:schemaLocation namespace %1 has already appeared earlier in the instance document. - + Пространство имён xsi:schemaLocation %1 уже встречалось ранее в данном документе. xsi:noNamespaceSchemaLocation cannot appear after the first no-namespace element or attribute. - + xsi:noNamespaceSchemaLocation не может встречаться после первого не-`namespace` элемента или атрибута. No schema defined for validation. - + Схема для проверки не определена. No definition for element %1 available. - + Отсутствует определение элемента %1. @@ -10699,7 +12119,7 @@ Please choose a different file name. Element %1 is not defined in this scope. - + Элемент %1 не определён в данном контексте. @@ -10719,7 +12139,7 @@ Please choose a different file name. Element %1 is not nillable. - + Элемент %1 необнуляемый. @@ -10729,7 +12149,7 @@ Please choose a different file name. Element contains content although it is nillable. - + Элемент необнуляемый, т.к. имеет содержимое. @@ -10739,7 +12159,7 @@ Please choose a different file name. Element %1 cannot contain other elements, as it has a fixed content. - + Элемент %1 не может содержать другие элементы, т.к. имеет статическое содержимое. @@ -10850,7 +12270,7 @@ Please choose a different file name. More than one value found for field %1. - + Для поля %1 найдено более одного значения. @@ -10860,12 +12280,12 @@ Please choose a different file name. ID value '%1' is not unique. - + Значение ID "%1" неуникально. '%1' attribute contains invalid QName content: %2. - + Атрибут `%1` имеет некорректное содержимое QName: %2. -- cgit v0.12 From 33a2c9bacd9a2f566ea50e085c7ce669f854b427 Mon Sep 17 00:00:00 2001 From: Ritt Konstantin Date: Mon, 31 May 2010 15:14:41 +0200 Subject: update Russian translations for Qt tools Merge-request: 621 Reviewed-by: Oswald Buddenhagen --- translations/assistant_ru.ts | 526 +++++++++++++++++++------------------------ translations/designer_ru.ts | 206 +++++++++-------- translations/linguist_ru.ts | 95 ++++---- translations/qt_help_ru.ts | 180 ++++++++------- translations/qtconfig_ru.ts | 26 +-- 5 files changed, 508 insertions(+), 525 deletions(-) diff --git a/translations/assistant_ru.ts b/translations/assistant_ru.ts index ade4c85..5244483 100644 --- a/translations/assistant_ru.ts +++ b/translations/assistant_ru.ts @@ -4,7 +4,7 @@ AboutDialog - + &Close &Закрыть @@ -12,7 +12,7 @@ AboutLabel - + Warning Предупреждение @@ -24,12 +24,81 @@ - + OK Закрыть + Assistant + + + Error registering documentation file '%1': %2 + Ошибка регистрации файла документации '%1': %2 + + + + Error: %1 + Ошибка: %1 + + + + Could not register documentation file +%1 + +Reason: +%2 + Не удалось зарегистрировать файл документации +%1 + +Причина: +%2 + + + + Documentation successfully registered. + Документация успешно зарегистрирована. + + + + Could not unregister documentation file +%1 + +Reason: +%2 + Не удалось дерегистрировать файл документации +%1 + +Причина: +%2 + + + + Documentation successfully unregistered. + Документация успешно дерегистрирована. + + + + Error reading collection file '%1': %2. + Ошибка чтения файла коллекции справки '%1': %2. + + + + Error creating collection file '%1': %2. + Ошибка создания файла коллекции справки '%1': %2. + + + + Error reading collection file '%1': %2 + Ошибка чтения файла коллекции справки '%1': %2 + + + + Cannot load sqlite database driver! + Не удалось загрузить драйвер баз данных sqlite! + + + BookmarkDialog @@ -56,35 +125,11 @@ New Folder Новая папка - - - - - - - Bookmarks - Закладки - - - - Delete Folder - Удалить папку - - - - Rename Folder - Переименовать папку - BookmarkManager - - Bookmarks - Закладки - - - + Remove Удалить @@ -94,16 +139,27 @@ Удаление папки приведёт к удалению её содержимого.<br>Желаете продолжить? - - - New Folder - Новая папка + + Add Bookmark... + Добавить закладку... + + + + Ctrl+D + + + + + Untitled + Неозаглавлено - - - BookmarkWidget - + + Manage Bookmarks... + Управление закладками... + + + Delete Folder Удалить папку @@ -123,7 +179,7 @@ Открыть закладку в новой вкладке - + Delete Bookmark Удалить закладку @@ -132,26 +188,11 @@ Rename Bookmark Переименовать закладку - - - Filter: - Фильтр: - - - - Add - Добавить - - - - Remove - Удалить - CentralWidget - + Add new page Открыть новую страницу @@ -161,18 +202,18 @@ Закрыть текущую страницу - + Print Document Печать документа - + unknown безымянная вкладка - + Add New Page Открыть новую страницу @@ -192,15 +233,78 @@ Добавить закладку для этой страницы... - + Search Поиск + CmdLineParser + + + Unknown option: %1 + Неизвестный параметр: %1 + + + + Unknown widget: %1 + Неизвестный виджет: %1 + + + + The collection file '%1' does not exist. + Файл коллекции справки '%1' не существует. + + + + Missing collection file. + Отсутствует файл коллекции справки. + + + + Invalid URL '%1'. + Некорректный URL '%1'. + + + + Missing URL. + Отсутствует URL. + + + + Missing widget. + Отсутствует виджет. + + + + The Qt help file '%1' does not exist. + Файл справки Qt '%1' не существует. + + + + Missing help file. + Отсутствует файл справки. + + + + Missing filter argument. + Отсутствует параметр фильтра. + + + + Error + Ошибка + + + + Notice + Замечание + + + ContentWindow - + Open Link Открыть ссылку @@ -224,34 +328,6 @@ - FindWidget - - - Previous - Предыдущее - - - - Next - Следующее - - - - Case Sensitive - Учитывать регистр - - - - Whole words - Слова целиком - - - - <img src=":/trolltech/assistant/images/wrap.png">&nbsp;Search wrapped - <img src=":/trolltech/assistant/images/wrap.png">&nbsp;Поиск с начала - - - FontPanel @@ -282,52 +358,25 @@ HelpViewer - - Open Link in New Tab - Открыть ссылку в новой вкладке + + <title>about:blank</title> + - + <title>Error 404...</title><div align="center"><br><br><h1>The page could not be found</h1><br><h3>'%1'</h3></div> <title>Ошибка 404...</title><div align="center"><br><br><h1>Страница не найдена</h1><br><h3>'%1'</h3></div> - - - Help - Справка - - - - Unable to launch external application. - - Невозможно запустить внешнее приложение. - - - - - OK - Закрыть - - - - Copy &Link Location - Копировать &адрес ссылки - - - - Open Link in New Tab Ctrl+LMB - Открыть ссылку в новой вкладке Ctrl+LMB - IndexWindow - + &Look for: &Искать: - + Open Link Открыть ссылку @@ -341,29 +390,29 @@ InstallDialog - + Install Documentation Установка документации - + Downloading documentation info... Загрузка информации о документации... - + Download canceled. Загрузка отменена. - - + + Done. Готово. - + The file %1 already exists. Do you want to overwrite it? Файл %1 уже существует. Желаете перезаписать его? @@ -378,14 +427,14 @@ Загрузка %1... - + - + Download failed: %1. Загрузка не удалась: %1. - + Documentation info file is corrupt! Файл информации о документации повреждён! @@ -400,7 +449,7 @@ Установка документации %1... - + Error while installing documentation: %1 При установке документации возникла ошибка: @@ -440,48 +489,42 @@ MainWindow - - + + Index Указатель - - + + Contents Содержание - - + + Bookmarks Закладки - - - + + + Qt Assistant Qt Assistant - - - Unfiltered - Без фильтрации - - - + Looking for Qt Documentation... Поиск документации Qt... - + &File &Файл - + Page Set&up... Параметры &страницы... @@ -496,22 +539,27 @@ &Печать... - + New &Tab Новая &вкладка - + &Close Tab &Закрыть вкладку - + &Quit В&ыход - + + CTRL+Q + + + + &Edit &Правка @@ -568,22 +616,22 @@ Ctrl+0 - + ALT+C - + ALT+I - + ALT+O - + @@ -593,7 +641,7 @@ ALT+S - + @@ -608,7 +656,7 @@ ALT+Home - + @@ -638,7 +686,7 @@ Ctrl+Alt+Right - + @@ -648,25 +696,20 @@ Ctrl+Alt+Left - + - + &Bookmarks &Закладки - - Add Bookmark... - Добавить закладку... - - - - CTRL+D - + + Could not register file '%1': %2 + Не удалось зарегистрировать файл '%1': %2 - + &Help &Справка @@ -676,7 +719,7 @@ О программе... - + Navigation Toolbar Панель навигации @@ -698,15 +741,15 @@ Ctrl+M - + - + Toolbars Панели инструментов - + Filter Toolbar Панель фильтров @@ -716,7 +759,7 @@ Отфильтровано по: - + Address Toolbar Панель адреса @@ -726,17 +769,17 @@ Адрес: - + Could not find the associated content item. Не удалось найти элемент, связанный с содержанием. - + About %1 О %1 - + Updating search index Обновление поискового индекса @@ -744,18 +787,18 @@ PreferencesDialog - - + + Add Documentation Добавить документацию - + Qt Compressed Help Files (*.qch) Сжатые файлы справки Qt (*.qch) - + The namespace %1 is already registered! Пространство имён %1 уже зарегистрировано! @@ -765,7 +808,7 @@ Указанный файл не является корректным файлом справки Qt! - + Remove Documentation Удалить документацию @@ -785,7 +828,7 @@ Удалить - + Use custom settings Использовать индивидуальные настройки @@ -909,120 +952,9 @@ - QObject - - - The specified collection file does not exist! - Указанный файл набора отсутствует! - - - - Missing collection file! - Отсутствует файл набора! - - - - Invalid URL! - Некорректный URL! - - - - Missing URL! - Отсутствует URL! - - - - - - Unknown widget: %1 - Неизвестный виджет: %1 - - - - - - Missing widget! - Отсутствует виджет! - - - - - The specified Qt help file does not exist! - Указанный файл справки Qt отсутствует! - - - - - Missing help file! - Отсутствует файл справки! - - - - Missing filter argument! - Отсутствует параметр фильтра! - - - - Unknown option: %1 - Неизвестный параметр: %1 - - - - - Qt Assistant - Qt Assistant - - - - Could not register documentation file -%1 - -Reason: -%2 - Не удалось зарегистрировать файл документации -%1 - -Причина: -%2 - - - - Documentation successfully registered. - Документация успешно зарегистрирована. - - - - Documentation successfully unregistered. - Документация успешно дерегистрирована. - - - - Could not unregister documentation file -%1 - -Reason: -%2 - Не удалось дерегистрировать файл документации -%1 - -Причина: -%2 - - - - Cannot load sqlite database driver! - Не удалось загрузить драйвер базы данных sqlite! - - - - The specified collection file could not be read! - Не удалось прочитать указанный файл набора! - - - RemoteControl - + Debugging Remote Control Отладочное удалённое управление @@ -1035,7 +967,7 @@ Reason: SearchWidget - + &Copy &Копировать @@ -1058,7 +990,7 @@ Reason: TopicChooser - + Choose a topic for <b>%1</b>: Выберите раздел для <b>%1</b>: diff --git a/translations/designer_ru.ts b/translations/designer_ru.ts index 412be47..72f3532 100644 --- a/translations/designer_ru.ts +++ b/translations/designer_ru.ts @@ -255,7 +255,7 @@ Пересекающиеся диагонали - + Style Стиль @@ -611,28 +611,28 @@ Вставить меню - + Changed '%1' of '%2' - Изменено '%1' у '%2' + Изменено '%1' у '%2' Changed '%1' of %n objects - + Изменено '%1' у %n объекта Изменено '%1' у %n объектов Изменено '%1' у %n объектов - + Reset '%1' of '%2' - Восстановлено '%1' у '%2' + Восстановлено '%1' у '%2' Reset '%1' of %n objects - + Восстановлено '%1' у %n объекта Восстановлено '%1' у %n объектов Восстановлено '%1' у %n объектов @@ -641,12 +641,12 @@ Add dynamic property '%1' to '%2' - Добавлено динамическое свойство '%1' '%2' + Добавлено динамическое свойство '%1' '%2' Add dynamic property '%1' to %n objects - + Добавлено динамическое свойство '%1' %n объекту Добавлено динамическое свойство '%1' %n объектам Добавлено динамическое свойство '%1' %n объектам @@ -655,12 +655,12 @@ Remove dynamic property '%1' from '%2' - Удалено динамическое свойство '%1' у '%2' + Удалено динамическое свойство '%1' у '%2' Remove dynamic property '%1' from %n objects - + Удалено динамическое свойство '%1' у %n объекта Удалено динамическое свойство '%1' у %n объектов Удалено динамическое свойство '%1' у %n объектов @@ -742,7 +742,7 @@ Designer - + Qt Designer Qt Designer @@ -1074,8 +1074,7 @@ Add Form Layout Row - нелепица какая-то - Добавление строки компоновки компоновщика формы + Добавление строки компоновщика формы @@ -1111,7 +1110,7 @@ FormWindow - + Unexpected element <%1> Неожиданный элемент <%1> @@ -1204,7 +1203,7 @@ MainWindowBase - + Main Not currently used (main tool bar) Главное @@ -1584,7 +1583,7 @@ Script: %3 QDesignerActions - + Saved %1. Сохранено %1. @@ -1614,24 +1613,24 @@ Script: %3 Настройки... - + Clear &Menu Очистить &меню - + CTRL+SHIFT+S - + - + CTRL+R - + CTRL+M - + @@ -1678,7 +1677,7 @@ Script: %3 UI файлы Qt Designer (*.%1);;Все файлы (*) - + %1 already exists. Do you want to replace it? %1 уже существует. @@ -1690,7 +1689,7 @@ Do you want to replace it? Дополнительные шрифты... - + &Recent Forms &Последние формы @@ -1753,7 +1752,7 @@ Do you want to update the file location or generate a new form? &Закрыть предпросмотр - + &New... &Новый... @@ -1784,12 +1783,12 @@ Do you want to update the file location or generate a new form? - + &Close &Закрыть - + Save &Image... Сохранить &Изображение... @@ -1804,12 +1803,12 @@ Do you want to update the file location or generate a new form? Показать &код... - + ALT+CTRL+S - + - + Save Form As Сохранить форму как @@ -2059,17 +2058,17 @@ Would you like to retry? A required attribute ('%1') is missing. - Отсутствует необходимый атрибут ('%1'). + Отсутствует необходимый атрибут ('%1'). An invalid property specification ('%1') was encountered. Supported types: %2 - Обнаружена неверная спецификация ('%1') свойства. Поддерживаются типы: %2 + Обнаружена неверная спецификация ('%1') свойства. Поддерживаются типы: %2 '%1' is not a valid string property specification. - '%1' не является корректной спецификацией строкового свойства. + '%1' не является корректной спецификацией строкового свойства. @@ -2090,7 +2089,7 @@ Would you like to retry? QDesignerPropertySheet - + Dynamic Properties Динамические свойства @@ -2103,14 +2102,14 @@ Would you like to retry? Компоновка типа '%1' не поддерживается, заменена на компоновку сеткой. - + The container extension of the widget '%1' (%2) returned a widget not managed by Designer '%3' (%4) when queried for page #%5. Container pages should only be added by specifying them in XML returned by the domXml() method of the custom widget. Контейнерное расширение виджета '%1' (%2) возвратило виджет, который не управляется Qt Designer '%3' (%4), при запросе страницы №%5. Страницы контейнера должны быть добавлены указанием их в XML, который возвращается методом domXml() пользовательского виджета. - + Unexpected element <%1> Parsing clipboard contents Неожиданный элемент <%1> @@ -2212,21 +2211,21 @@ Container pages should only be added by specifying them in XML returned by the d Панель инструментов - + Save Forms? Сохранить форму? There are %n forms with unsaved changes. Do you want to review these changes before quitting? - - Есть %n форма с несохранёнными изменениями. Показать изменения перед выходом? - Есть %n формы с несохранёнными изменениями. Показать изменения перед выходом? - Есть %n форм с несохранёнными изменениями. Показать изменения перед выходом? + + Имеется %n форма с несохранёнными изменениями. Желаете просмотреть изменения перед выходом? + Имеется %n формы с несохранёнными изменениями. Желаете просмотреть изменения перед выходом? + Имеется %n форм с несохранёнными изменениями. Желаете просмотреть изменения перед выходом? - + &View &Вид @@ -2241,9 +2240,9 @@ Container pages should only be added by specifying them in XML returned by the d Панель виджетов - + If you do not review your documents, all your changes will be lost. - Если вы не пересмотрите документы, то все ваши изменения будут потеряны. + Если не просматривать изменения, все изменения будут потеряны. @@ -2258,7 +2257,7 @@ Container pages should only be added by specifying them in XML returned by the d Backup Information - Информация о резервировании + Информация о резервированых копиях @@ -2273,7 +2272,7 @@ Container pages should only be added by specifying them in XML returned by the d The file <b>%1</b> is not a valid Designer UI file. - Файл <b>%1</b> не является корректным UI файлом Qt Designer. + Файл <b>%1</b> не является корректным UI файлом Qt Designer. @@ -2322,7 +2321,7 @@ Container pages should only be added by specifying them in XML returned by the d The enumeration-value '%1' is invalid. The default value '%2' will be used instead. - Значение '%1' перечисляемого типа некорректно. Будет использовано значение '%2'. + Значение '%1' перечисляемого типа некорректно. Будет использовано значение по умолчанию '%2'. @@ -2466,13 +2465,13 @@ Container pages should only be added by specifying them in XML returned by the d True - Вкл. + Вкл. False - Выкл. + Выкл. @@ -2480,12 +2479,12 @@ Container pages should only be added by specifying them in XML returned by the d True - Вкл. + Вкл. False - Выкл. + Выкл. @@ -3503,7 +3502,7 @@ to QtResourceView - + Size: %1 x %2 %3 Размер: %1 x %2 @@ -3528,7 +3527,7 @@ to QtResourceViewDialog - + Select Resource Выбрать ресурс @@ -3915,6 +3914,26 @@ Do you want overwrite the template? + File + Файл + + + + Edit + Правка + + + + Tools + Инструменты + + + + Form + Форма + + + Toolbars Панели инструментов @@ -3939,7 +3958,7 @@ Do you want overwrite the template? %1<br/>Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). - %1<br/>Copyright (C) 2010 Корпорация Nokia и/или её дочерние подразделения. + %1<br/>Copyright (C) 2010 Корпорация Nokia и/или её дочерние подразделения. @@ -4424,38 +4443,38 @@ Do you want overwrite the template? AlignLeft - + AlignHCenter - + AlignRight - + AlignJustify - + AlignTop - + AlignVCenter - + AlignBottom - + @@ -4708,9 +4727,14 @@ Do you want overwrite the template? qdesigner_internal::FilterWidget - - <Filter> - <Фильтр> + + Filter + Фильтр + + + + Clear text + Очистить текст @@ -4737,33 +4761,37 @@ Do you want overwrite the template? qdesigner_internal::FormWindow - + Edit contents Изменить содержимое F2 - + - + Insert widget '%1' Вставить виджет '%1' - + Resize Изменение размера - - + Key Move Перемещение клавишей + + + Key Resize + Изменение размера клавишей + - + Paste %n action(s) Вставлено %n действие @@ -4801,7 +4829,7 @@ Do you want overwrite the template? Ошибка вставки - + Raise widgets Поднятие виджетов @@ -4821,7 +4849,7 @@ Do you want overwrite the template? Компоновка - + Drop widget Вставка виджета @@ -4835,7 +4863,7 @@ Do you want overwrite the template? qdesigner_internal::FormWindowBase - + Delete '%1' Удалить '%1' @@ -4932,7 +4960,7 @@ Do you want overwrite the template? Lay Out &Horizontally - Скомпоновать по &горизонтальная + Скомпоновать по &горизонтали @@ -5025,7 +5053,7 @@ Do you want overwrite the template? &Настройки формы... - + Break Layout Удалить компоновщик @@ -5441,7 +5469,7 @@ Please select another name. horizontalSpacer - + @@ -5500,7 +5528,7 @@ Please select another name. Unable to open the form template file '%1': %2 - Невозможно открыть файл шаблона формы '%1': %2 + Невозможно открыть файл шаблона формы '%1': %2 @@ -5869,7 +5897,7 @@ Please select another name. The moose in the noose ate the goose who was loose. Palette editor background - + @@ -5945,12 +5973,12 @@ ate the goose who was loose. Global include - Глобальное включение + Глобальное включение Usage - Использование + Использование @@ -5984,7 +6012,7 @@ ate the goose who was loose. qdesigner_internal::PropertyEditor - + Add Dynamic Property... Добавить динамическое свойство... @@ -6014,7 +6042,7 @@ ate the goose who was loose. Вид выпадающего списка - + String... Строка... @@ -6034,7 +6062,7 @@ ate the goose who was loose. Настроить радактор свойств - + Object: %1 Class: %2 Объект: %1 @@ -6372,7 +6400,7 @@ Class: %2 CTRL+B - + @@ -6382,7 +6410,7 @@ Class: %2 CTRL+I - + @@ -6392,7 +6420,7 @@ Class: %2 CTRL+U - + @@ -6495,7 +6523,7 @@ Class: %2 F4 - + diff --git a/translations/linguist_ru.ts b/translations/linguist_ru.ts index 3f26c49..625a0f1 100644 --- a/translations/linguist_ru.ts +++ b/translations/linguist_ru.ts @@ -290,19 +290,19 @@ Will assume a single universal form. Alt+Delete translate, but don't change - + Shift+Alt+Insert translate, but don't change - + Alt+Insert translate, but don't change - + @@ -312,7 +312,7 @@ Will assume a single universal form. Delete non-empty length variant? - Удалить непустой вариант длины? + Удалить вариант перевода? @@ -320,7 +320,7 @@ Will assume a single universal form. Dropped %n message(s) which had no ID. - + Удалено %n сообщение, у которого не было ID. Удалено %n сообщения, у которых не было ID. Удалено %n сообщений, у которых не было ID. @@ -329,7 +329,7 @@ Will assume a single universal form. Excess context/disambiguation dropped from %n message(s). - + Удалён лишний контекст из %n сообщения. Удалён лишний контекст из %n сообщений. Удалён лишний контекст из %n сообщений. @@ -481,12 +481,12 @@ Skip loading the first named file? - + Release Скомпилировать - + Qt message files for released applications (*.qm) All files (*) Скомпилированные файлы перевода для приложений Qt (*.qm) @@ -553,7 +553,7 @@ All files (*) - + @@ -562,7 +562,7 @@ All files (*) Qt Linguist - + Cannot find the string '%1'. Не удалось найти строку '%1'. @@ -693,7 +693,7 @@ All files (*) Непереведённых записей не осталось. - + &Window &Окно @@ -705,7 +705,7 @@ All files (*) Ctrl+M - + @@ -969,7 +969,7 @@ All files (*) Ctrl+O - + @@ -984,7 +984,7 @@ All files (*) Ctrl+Q - + @@ -1024,7 +1024,7 @@ All files (*) Ctrl+P - + @@ -1039,7 +1039,7 @@ All files (*) Ctrl+Z - + @@ -1054,7 +1054,7 @@ All files (*) Ctrl+Y - + @@ -1069,7 +1069,7 @@ All files (*) Ctrl+X - + @@ -1084,7 +1084,7 @@ All files (*) Ctrl+C - + @@ -1099,7 +1099,7 @@ All files (*) Ctrl+V - + @@ -1114,7 +1114,7 @@ All files (*) Ctrl+A - + @@ -1129,7 +1129,7 @@ All files (*) Ctrl+F - + @@ -1144,7 +1144,7 @@ All files (*) F3 - + @@ -1159,7 +1159,7 @@ All files (*) Length Variants - Варианты длины + Варианты перевода @@ -1169,7 +1169,7 @@ All files (*) Ctrl+K - + @@ -1184,7 +1184,7 @@ All files (*) Ctrl+J - + @@ -1199,7 +1199,7 @@ All files (*) Ctrl+Shift+K - + @@ -1214,7 +1214,7 @@ All files (*) Ctrl+Shift+J - + @@ -1239,7 +1239,7 @@ All files (*) Ctrl+B - + @@ -1294,7 +1294,7 @@ All files (*) Ctrl+N - + @@ -1309,7 +1309,7 @@ All files (*) Ctrl+H - + @@ -1349,7 +1349,7 @@ All files (*) F1 - + @@ -1363,11 +1363,6 @@ All files (*) - Display information about the Qt toolkit by Trolltech. - Показать информацию об инструментарии Qt от Nokia. - - - &What's This? &Что это? @@ -1384,7 +1379,7 @@ All files (*) Shift+F1 - + @@ -1414,7 +1409,7 @@ All files (*) F5 - + @@ -1424,7 +1419,7 @@ All files (*) Ctrl+T - + @@ -1439,7 +1434,7 @@ All files (*) Ctrl+S - + @@ -1454,7 +1449,7 @@ All files (*) Ctrl+W - + @@ -1506,6 +1501,11 @@ All files (*) Toggle the validity check of place markers Переключение проверки маркеров форматирования + + + Display information about the Qt toolkit by Nokia. + Показать информацию об инструментарии Qt от Nokia. + MessageEditor @@ -1795,7 +1795,7 @@ Line: %2 QObject - + Translation files (%1);; Файлы перевода (%1);; @@ -1816,11 +1816,16 @@ Line: %2 Qt Linguist - + GNU Gettext localization files Файлы локализации GNU Gettext + + GNU Gettext localization template files + Файлы шаблонов локализации GNU Gettext + + Compiled Qt translations Скомпилированные переводы Qt @@ -1846,7 +1851,7 @@ Line: %2 Исходные файлы перевода Qt (последний формат) - + XLIFF localization files Файлы локализации XLIFF diff --git a/translations/qt_help_ru.ts b/translations/qt_help_ru.ts index 341cf19..f1aa0fa 100644 --- a/translations/qt_help_ru.ts +++ b/translations/qt_help_ru.ts @@ -34,7 +34,7 @@ The collection file '%1' is not set up yet! - Файл набора '%1' ещё не установлен! + Файл коллекции справки '%1' ещё не установлен! @@ -43,9 +43,9 @@ - + Cannot open collection file: %1 - Не удалось открыть файл набора: %1 + Не удалось открыть файл коллекции справки: %1 @@ -55,15 +55,15 @@ The collection file '%1' already exists! - Файл набора '%1' уже существует! + Файл коллекции справки '%1' уже существует! - + Unknown filter '%1'! Неизвестный фильтр '%1'! - + Invalid documentation file '%1'! Некорректный файл документации '%1'! @@ -78,17 +78,17 @@ Не удалось открыть базу данных '%1' для оптимизации! - + Cannot create directory: %1 Не удалось создать каталог: %1 - + Cannot copy collection file: %1 - Не удалось скопировать файл набора: %1 + Не удалось скопировать файл коллекции справки: %1 - + Cannot register filter %1! Не удалось зарегистрировать фильтр %1! @@ -120,23 +120,20 @@ QHelpEngineCore - - The specified namespace does not exist! - Указанное пространство имён не существует! - - - - QHelpEngineCorePrivate - - + Cannot open documentation file %1: %2! Не удалось открыть файл документации %1: %2! + + + The specified namespace does not exist! + Указанное пространство имён не существует! + QHelpGenerator - + Invalid help data! Некорректные данные справки! @@ -161,7 +158,7 @@ Не удалось открыть файл базы данных %1! - + Cannot register namespace %1! Не удалось зарегистрировать пространство имён %1! @@ -216,7 +213,7 @@ Не удалось открыть файл %1! Пропускаем. - + The filter %1 is already registered! Фильтр %1 уже зарегистрирован! @@ -231,7 +228,7 @@ Добавление указателей... - + Insert contents... Добавление оглавления... @@ -245,11 +242,79 @@ Cannot register contents! Не удалось зарегистрировать оглавление! + + + File '%1' does not exist. + Файл '%1' не существует. + + + + File '%1' cannot be opened. + Невозможно открыть файл '%1'. + + + + File '%1' contains an invalid link to file '%2' + Файл '%1' содержит некорректную ссылку на файл '%2' + + + + Invalid links in HTML files. + В файлах HTML обнаружены некорректные ссылки. + + + + QHelpProject + + + Unknown token. + Неизвестный идентификатор. + + + + Unknown token. Expected "QtHelpProject"! + Неизвестный идентификатор. Ожидается "QtHelpProject"! + + + + Error in line %1: %2 + Ошибка в строке %1: %2 + + + + Virtual folder has invalid syntax. + Виртуальный каталог имеет некорректный синтаксис. + + + + Namespace has invalid syntax. + Пространство имён имеет некорректный синтаксис. + + + + Missing namespace in QtHelpProject. + В QtHelpProject отсутствует пространство имён. + + + + Missing virtual folder in QtHelpProject + В QtHelpProject отсутствует виртуальный каталог + + + + Missing attribute in keyword at line %1. + Отсутствует атрибут у ключевого слова в строке %1. + + + + The input file %1 could not be opened! + Невозможно открыть исходный файл %1! + QHelpSearchQueryWidget - + Search for: Искать: @@ -301,66 +366,19 @@ QHelpSearchResultWidget + + + %1 - %2 of %n Hits + + %1 - %2 из %n совпадения + %1 - %2 из %n совпадений + %1 - %2 из %n совпадений + + - + 0 - 0 of 0 Hits 0 - 0 из 0 совпадений - - QHelpSearchResultWidgetPrivate - - - %1 - %2 of %3 Hits - %1 - %2 из %3 совпадений - - - - QObject - - - Unknown token. - Неизвестный идентификатор. - - - - Unknown token. Expected "QtHelpProject"! - Неизвестный идентификатор. Ожидается "QtHelpProject"! - - - - Error in line %1: %2 - Ошибка в строке %1: %2 - - - - A virtual folder must not contain a '/' character! - Виртуальный каталог не должен содержать символ '/'! - - - - A namespace must not contain a '/' character! - Пространство имён не должно содержать символ '/'! - - - - Missing namespace in QtHelpProject. - Отсутствует пространство имён в QtHelpProject. - - - - Missing virtual folder in QtHelpProject - Отсутствует виртуальный каталог в QtHelpProject - - - - Missing attribute in keyword at line %1. - Отсутствует атрибут у ключевого слова в строке %1. - - - - The input file %1 could not be opened! - Невозможно открыть исходный файл %1! - - diff --git a/translations/qtconfig_ru.ts b/translations/qtconfig_ru.ts index 7be0f04..2d435e6 100644 --- a/translations/qtconfig_ru.ts +++ b/translations/qtconfig_ru.ts @@ -4,7 +4,7 @@ MainWindow - + Desktop Settings (Default) Настройки рабочего стола (по умолчанию) @@ -21,13 +21,13 @@ - + Auto (default) Автоматически (по умолчанию) - + Choose audio output automatically. Автоматический выбор звукового выхода. @@ -43,7 +43,7 @@ Экспериментальная поддержка aRts в GStreamer. - + Phonon GStreamer backend not available. Модуль поддержки GStreamer недоступен. @@ -71,8 +71,8 @@ - Use OpenGL if avaiable - Использовать OpenGL, если доступен + Use OpenGL if available + Использовать OpenGL, если возможно @@ -173,12 +173,12 @@ Select GUI &Style: - &Стиль интерфейса: + &Стиль интерфейса: Build Palette - Палитра + Палитра @@ -363,17 +363,17 @@ C&omboBox Effect: - Эффект C&omboBox: + Эффект &выпадающего списка: &ToolTip Effect: - Эффект &ToolTip: + Эффект &подсказки: Tool&Box Effect: - Эффект Tool&Box: + Эффект панели &инструментов: @@ -393,7 +393,7 @@ Global Strut - Специальные возможности + Минимальные размеры @@ -577,7 +577,7 @@ p, li { white-space: pre-wrap; } Ctrl+S - + Ctrl+S -- cgit v0.12 From 3f6d48ad326fd261153cec1b9eab1da00a144066 Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Mon, 31 May 2010 15:46:21 +0200 Subject: doc: Fixed confusing ownership issue. Task-number: QTBUG-10934 --- src/gui/widgets/qstackedwidget.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/gui/widgets/qstackedwidget.cpp b/src/gui/widgets/qstackedwidget.cpp index 2509a21..de8d3e6 100644 --- a/src/gui/widgets/qstackedwidget.cpp +++ b/src/gui/widgets/qstackedwidget.cpp @@ -186,11 +186,11 @@ int QStackedWidget::insertWidget(int index, QWidget *widget) } /*! - Removes the given \a widget from the QStackedWidget. + Removes \a widget from the QStackedWidget. i.e., \a widget is \e + not deleted but simply removed from the stacked layout, causing it + to be hidden. - \bold{Note:} The ownership of \a widget remains the same. - The widget is \e not deleted, but simply removed from the widget's - stacked layout, causing it to be hidden. + \bold{Note:} Ownership of \a widget reverts to the application. \sa addWidget(), insertWidget(), currentWidget() */ -- cgit v0.12 From e79086f1a90a733cb06fd50773dbcabde0481988 Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Mon, 31 May 2010 15:53:44 +0200 Subject: qdoc: Added DITA XML generator At the moment, it is just like the HTML generator, but with a different class name. --- tools/qdoc3/pagegenerator.cpp | 106 +++++++++++++++++++++++++++++++++++++++++- tools/qdoc3/pagegenerator.h | 11 ++++- tools/qdoc3/qdoc3.pro | 2 + 3 files changed, 116 insertions(+), 3 deletions(-) diff --git a/tools/qdoc3/pagegenerator.cpp b/tools/qdoc3/pagegenerator.cpp index f0f14fe..13c83a8 100644 --- a/tools/qdoc3/pagegenerator.cpp +++ b/tools/qdoc3/pagegenerator.cpp @@ -45,7 +45,7 @@ #include #include - +#include #include "pagegenerator.h" #include "tree.h" @@ -68,6 +68,110 @@ PageGenerator::~PageGenerator() endSubPage(); } +static QRegExp linkTag("(<@link node=\"([^\"]+)\">).*()"); +static QRegExp funcTag("(<@func target=\"([^\"]*)\">)(.*)()"); +static QRegExp typeTag("(<@(type|headerfile|func)(?: +[^>]*)?>)(.*)()"); +static QRegExp spanTag(""); +static QRegExp unknownTag("]*>"); + +bool PageGenerator::parseArg(const QString& src, + const QString& tag, + int* pos, + int n, + QStringRef* contents, + QStringRef* par1, + bool debug) +{ +#define SKIP_CHAR(c) \ + if (debug) \ + qDebug() << "looking for " << c << " at " << QString(src.data() + i, n - i); \ + if (i >= n || src[i] != c) { \ + if (debug) \ + qDebug() << " char '" << c << "' not found"; \ + return false; \ + } \ + ++i; + + +#define SKIP_SPACE \ + while (i < n && src[i] == ' ') \ + ++i; + + int i = *pos; + int j = i; + + // assume "<@" has been parsed outside + //SKIP_CHAR('<'); + //SKIP_CHAR('@'); + + if (tag != QStringRef(&src, i, tag.length())) { + if (0 && debug) + qDebug() << "tag " << tag << " not found at " << i; + return false; + } + + if (debug) + qDebug() << "haystack:" << src << "needle:" << tag << "i:" <).*()"); + if (par1) { + SKIP_SPACE; + // read parameter name + j = i; + while (i < n && src[i].isLetter()) + ++i; + if (src[i] == '=') { + if (debug) + qDebug() << "read parameter" << QString(src.data() + j, i - j); + SKIP_CHAR('='); + SKIP_CHAR('"'); + // skip parameter name + j = i; + while (i < n && src[i] != '"') + ++i; + *par1 = QStringRef(&src, j, i - j); + SKIP_CHAR('"'); + SKIP_SPACE; + } else { + if (debug) + qDebug() << "no optional parameter found"; + } + } + SKIP_SPACE; + SKIP_CHAR('>'); + + // find contents up to closing " + j = i; + for (; true; ++i) { + if (i + 4 + tag.length() > n) + return false; + if (src[i] != '<') + continue; + if (src[i + 1] != '/') + continue; + if (src[i + 2] != '@') + continue; + if (tag != QStringRef(&src, i + 3, tag.length())) + continue; + if (src[i + 3 + tag.length()] != '>') + continue; + break; + } + + *contents = QStringRef(&src, j, i - j); + + i += tag.length() + 4; + + *pos = i; + if (debug) + qDebug() << " tag " << tag << " found: pos now: " << i; + return true; +#undef SKIP_CHAR +} + /*! This function is recursive. */ diff --git a/tools/qdoc3/pagegenerator.h b/tools/qdoc3/pagegenerator.h index 7ab7e5e..1aa24a1 100644 --- a/tools/qdoc3/pagegenerator.h +++ b/tools/qdoc3/pagegenerator.h @@ -80,10 +80,17 @@ class PageGenerator : public Generator QString naturalLanguage; QString outputEncoding; - QTextCodec *outputCodec; + QTextCodec* outputCodec; + bool parseArg(const QString& src, + const QString& tag, + int* pos, + int n, + QStringRef* contents, + QStringRef* par1 = 0, + bool debug = false); private: - QStack outStreamStack; + QStack outStreamStack; }; QT_END_NAMESPACE diff --git a/tools/qdoc3/qdoc3.pro b/tools/qdoc3/qdoc3.pro index 81ff93a..5bedc29 100644 --- a/tools/qdoc3/qdoc3.pro +++ b/tools/qdoc3/qdoc3.pro @@ -37,6 +37,7 @@ HEADERS += apigenerator.h \ cppcodeparser.h \ cpptoqsconverter.h \ dcfsection.h \ + ditaxmlgenerator.h \ doc.h \ editdistance.h \ generator.h \ @@ -81,6 +82,7 @@ SOURCES += apigenerator.cpp \ cppcodeparser.cpp \ cpptoqsconverter.cpp \ dcfsection.cpp \ + ditaxmlgenerator.cpp \ doc.cpp \ editdistance.cpp \ generator.cpp \ -- cgit v0.12 From 3cc9fc5f0c5e846dcc1ce2e7c6e58c06e1186363 Mon Sep 17 00:00:00 2001 From: Leonardo Sobral Cunha Date: Mon, 31 May 2010 17:57:52 +0200 Subject: Add my 4.7.0 changes --- dist/changes-4.7.0 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/dist/changes-4.7.0 b/dist/changes-4.7.0 index e7b1e84..dbb3add 100644 --- a/dist/changes-4.7.0 +++ b/dist/changes-4.7.0 @@ -52,12 +52,16 @@ QtCore - QMetaType * Significantly improved performance of the type() function + * [QTBUG-8235] Support QEasingCurve as a built in metatype. - QState * [QTBUG-7741] Added a function to get the out-going transitions - QXmlStreamReader * [QTBUG-9196] fixed crash when parsing - QTimer * singleShot with 0 timeout will now avoid allocating objects + - QAbstractAnimation + * [QTBUG-10654] Avoids animation with loopCount == 0 to change state + to running and stopped. QtGui ----- @@ -95,6 +99,8 @@ QtGui - QGraphicsTextItem * [QTBUG-7333] Fixed keyboard shortcuts not being triggered when the the item has focus and something else has the same shortcut sequence. + * [QTBUG-10574] Fixed crash when flag "QGraphicsItem::ItemIgnoresTransformations" + is set. - QGraphicsView * [QTBUG-7438] Fixed viewport cursor getting reset when releasing -- cgit v0.12 From 33fddc2adf95b56d8309ef9bc11408252140a085 Mon Sep 17 00:00:00 2001 From: Jocelyn Turcotte Date: Thu, 27 May 2010 21:16:10 +0200 Subject: QTextEngine: skip an unnecessary call to GetDeviceCaps on Windows. Reviewed-by: Simon Hausmann --- src/gui/text/qtextengine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp index d34553f..6359672 100644 --- a/src/gui/text/qtextengine.cpp +++ b/src/gui/text/qtextengine.cpp @@ -885,7 +885,7 @@ void QTextEngine::shapeText(int item) const QFixed letterSpacing = font.d->letterSpacing; QFixed wordSpacing = font.d->wordSpacing; - if (letterSpacingIsAbsolute) + if (letterSpacingIsAbsolute && letterSpacing.value()) letterSpacing *= font.d->dpi / qt_defaultDpiY(); if (letterSpacing != 0) { -- cgit v0.12 From 032fb3d54eaaa1fa36ec45b37f5f7356b1137830 Mon Sep 17 00:00:00 2001 From: Jocelyn Turcotte Date: Tue, 25 May 2010 20:19:14 +0200 Subject: Add the Qt::TextBypassShaping flag. This allows quick layouting especially with Windows fonts which contain heavy OpenType logic. On regular latin text the visual compromize is the loss of kerning, justification, capitalization, word spacing and letter spacing support. Reviewed-by: Simon Hausmann Reviewed-by: Eskil --- src/corelib/global/qnamespace.h | 3 ++- src/gui/painting/qpainter.cpp | 17 +++++++++++++++++ src/gui/text/qfontmetrics.cpp | 25 +++++++++++++++++++++++++ src/gui/text/qfontmetrics.h | 1 + src/gui/text/qtextengine.cpp | 6 ++++++ src/gui/text/qtextengine_p.h | 1 + tests/auto/qfontmetrics/tst_qfontmetrics.cpp | 15 +++++++++++++++ 7 files changed, 67 insertions(+), 1 deletion(-) diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h index 08674d2..52a24de 100644 --- a/src/corelib/global/qnamespace.h +++ b/src/corelib/global/qnamespace.h @@ -236,7 +236,8 @@ public: TextJustificationForced = 0x10000, TextForceLeftToRight = 0x20000, TextForceRightToLeft = 0x40000, - TextLongestVariant = 0x80000 + TextLongestVariant = 0x80000, + TextBypassShaping = 0x100000 #if defined(QT3_SUPPORT) && !defined(Q_MOC_RUN) ,SingleLine = TextSingleLine, diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp index 657229a..54e0aa3 100644 --- a/src/gui/painting/qpainter.cpp +++ b/src/gui/painting/qpainter.cpp @@ -5937,6 +5937,23 @@ void QPainter::drawText(const QPointF &p, const QString &str, int tf, int justif if (!d->engine || str.isEmpty() || pen().style() == Qt::NoPen) return; + if (tf & Qt::TextBypassShaping) { + // Skip harfbuzz complex shaping, shape using glyph advances only + int len = str.length(); + int numGlyphs = len; + QVarLengthGlyphLayoutArray glyphs(len); + QFontEngine *fontEngine = d->state->font.d->engineForScript(QUnicodeTables::Common); + if (!fontEngine->stringToCMap(str.data(), len, &glyphs, &numGlyphs, 0)) { + glyphs.resize(numGlyphs); + if (!fontEngine->stringToCMap(str.data(), len, &glyphs, &numGlyphs, 0)) + Q_ASSERT_X(false, Q_FUNC_INFO, "stringToCMap shouldn't fail twice"); + } + + QTextItemInt gf(glyphs, &d->state->font, fontEngine); + drawTextItem(p, gf); + return; + } + QStackTextEngine engine(str, d->state->font); engine.option.setTextDirection(d->state->layoutDirection); if (tf & (Qt::TextForceLeftToRight|Qt::TextForceRightToLeft)) { diff --git a/src/gui/text/qfontmetrics.cpp b/src/gui/text/qfontmetrics.cpp index 5163c94..d02e841 100644 --- a/src/gui/text/qfontmetrics.cpp +++ b/src/gui/text/qfontmetrics.cpp @@ -526,6 +526,14 @@ int QFontMetrics::rightBearing(QChar ch) const */ int QFontMetrics::width(const QString &text, int len) const { + return width(text, len, 0); +} + +/*! + \internal +*/ +int QFontMetrics::width(const QString &text, int len, int flags) const +{ int pos = text.indexOf(QLatin1Char('\x9c')); if (pos != -1) { len = (len < 0) ? pos : qMin(pos, len); @@ -535,6 +543,23 @@ int QFontMetrics::width(const QString &text, int len) const if (len == 0) return 0; + if (flags & Qt::TextBypassShaping) { + // Skip harfbuzz complex shaping, only use advances + int numGlyphs = len; + QVarLengthGlyphLayoutArray glyphs(numGlyphs); + QFontEngine *engine = d->engineForScript(QUnicodeTables::Common); + if (!engine->stringToCMap(text.data(), len, &glyphs, &numGlyphs, 0)) { + glyphs.resize(numGlyphs); + if (!engine->stringToCMap(text.data(), len, &glyphs, &numGlyphs, 0)) + Q_ASSERT_X(false, Q_FUNC_INFO, "stringToCMap shouldn't fail twice"); + } + + QFixed width; + for (int i = 0; i < numGlyphs; ++i) + width += glyphs.advances_x[i]; + return qRound(width); + } + QStackTextEngine layout(text, d.data()); layout.ignoreBidi = true; return qRound(layout.width(0, len)); diff --git a/src/gui/text/qfontmetrics.h b/src/gui/text/qfontmetrics.h index dca4b93..2518b54 100644 --- a/src/gui/text/qfontmetrics.h +++ b/src/gui/text/qfontmetrics.h @@ -89,6 +89,7 @@ public: int leftBearing(QChar) const; int rightBearing(QChar) const; int width(const QString &, int len = -1) const; + int width(const QString &, int len, int flags) const; int width(QChar) const; int charWidth(const QString &str, int pos) const; diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp index 6359672..3486264 100644 --- a/src/gui/text/qtextengine.cpp +++ b/src/gui/text/qtextengine.cpp @@ -2648,6 +2648,12 @@ QTextItemInt::QTextItemInt(const QScriptItem &si, QFont *font, const QTextCharFo flags |= QTextItem::StrikeOut; } +QTextItemInt::QTextItemInt(const QGlyphLayout &g, QFont *font, QFontEngine *fe) + : flags(0), justified(false), underlineStyle(QTextCharFormat::NoUnderline), + num_chars(0), chars(0), logClusters(0), f(font), fontEngine(fe), glyphs(g) +{ +} + QTextItemInt QTextItemInt::midItem(QFontEngine *fontEngine, int firstGlyphIndex, int numGlyphs) const { QTextItemInt ti = *this; diff --git a/src/gui/text/qtextengine_p.h b/src/gui/text/qtextengine_p.h index d92148f..00b1392 100644 --- a/src/gui/text/qtextengine_p.h +++ b/src/gui/text/qtextengine_p.h @@ -311,6 +311,7 @@ public: logClusters(0), f(0), fontEngine(0) {} QTextItemInt(const QScriptItem &si, QFont *font, const QTextCharFormat &format = QTextCharFormat()); + QTextItemInt(const QGlyphLayout &g, QFont *font, QFontEngine *fe); /// copy the structure items, adjusting the glyphs arrays to the right subarrays. /// the width of the returned QTextItemInt is not adjusted, for speed reasons diff --git a/tests/auto/qfontmetrics/tst_qfontmetrics.cpp b/tests/auto/qfontmetrics/tst_qfontmetrics.cpp index 5d73764..81e064e 100644 --- a/tests/auto/qfontmetrics/tst_qfontmetrics.cpp +++ b/tests/auto/qfontmetrics/tst_qfontmetrics.cpp @@ -71,6 +71,7 @@ private slots: void elidedText(); void veryNarrowElidedText(); void averageCharWidth(); + void bypassShaping(); void elidedMultiLength(); void elidedMultiLengthF(); void bearingIncludedInBoundingRect(); @@ -219,6 +220,20 @@ void tst_QFontMetrics::averageCharWidth() QVERIFY(fmf.averageCharWidth() != 0); } +void tst_QFontMetrics::bypassShaping() +{ + QFont f; + QFontMetrics fm(f); + QString text = " A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z"; + int textWidth = fm.width(text, -1, Qt::TextBypassShaping); + QVERIFY(textWidth != 0); + int charsWidth = 0; + for (int i = 0; i < text.size(); ++i) + charsWidth += fm.width(text[i]); + // This assertion is needed in QtWebKit's WebCore::Font::offsetForPositionForSimpleText + QCOMPARE(textWidth, charsWidth); +} + template void elidedMultiLength_helper() { QString text1 = "Long Text 1\x9cShorter\x9csmall"; -- cgit v0.12 From 450508cf9a19473644de20e64bb1098050806182 Mon Sep 17 00:00:00 2001 From: Aaron McCarthy Date: Tue, 1 Jun 2010 15:03:15 +1000 Subject: Fix build failure on Symbian 3.1. --- src/plugins/bearer/symbian/symbianengine.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/bearer/symbian/symbianengine.cpp b/src/plugins/bearer/symbian/symbianengine.cpp index 8c26cf0..ab1ba28 100644 --- a/src/plugins/bearer/symbian/symbianengine.cpp +++ b/src/plugins/bearer/symbian/symbianengine.cpp @@ -389,9 +389,9 @@ void SymbianEngine::updateConfigurationsL() QNetworkConfigurationPrivatePointer ptr(cpPriv); accessPointConfigurations.insert(ident, ptr); - locker.unlock(); + mutex.unlock(); emit configurationAdded(ptr); - locker.relock(); + mutex.lock(); } else { delete cpPriv; } -- cgit v0.12 From 15f331834833e34c1faf437b6fe3d3ef58691651 Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Tue, 1 Jun 2010 08:48:06 +0200 Subject: doc: Added DITA XML generator --- tools/qdoc3/ditaxmlgenerator.cpp | 4773 ++++++++++++++++++++++++++++++++++++++ tools/qdoc3/ditaxmlgenerator.h | 358 +++ 2 files changed, 5131 insertions(+) create mode 100644 tools/qdoc3/ditaxmlgenerator.cpp create mode 100644 tools/qdoc3/ditaxmlgenerator.h diff --git a/tools/qdoc3/ditaxmlgenerator.cpp b/tools/qdoc3/ditaxmlgenerator.cpp new file mode 100644 index 0000000..a64e8e7 --- /dev/null +++ b/tools/qdoc3/ditaxmlgenerator.cpp @@ -0,0 +1,4773 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/* + ditaxmlgenerator.cpp +*/ + +#include "codemarker.h" +#include "codeparser.h" +#include "helpprojectwriter.h" +#include "ditaxmlgenerator.h" +#include "node.h" +#include "separator.h" +#include "tree.h" +#include + +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +#define COMMAND_VERSION Doc::alias("version") +int DitaXmlGenerator::id = 0; + +QString DitaXmlGenerator::sinceTitles[] = + { + " New Namespaces", + " New Classes", + " New Member Functions", + " New Functions in Namespaces", + " New Global Functions", + " New Macros", + " New Enum Types", + " New Typedefs", + " New Properties", + " New Variables", + " New QML Elements", + " New Qml Properties", + " New Qml Signals", + " New Qml Methods", + "" + }; + +static bool showBrokenLinks = false; + +static void addLink(const QString &linkTarget, + const QStringRef &nestedStuff, + QString *res) +{ + if (!linkTarget.isEmpty()) { + *res += ""; + *res += nestedStuff; + *res += ""; + } + else { + *res += nestedStuff; + } +} + + +DitaXmlGenerator::DitaXmlGenerator() + : helpProjectWriter(0), + inLink(false), + inContents(false), + inSectionHeading(false), + inTableHeader(false), + numTableRows(0), + threeColumnEnumValueTable(true), + offlineDocs(true), + funcLeftParen("\\S(\\()"), + myTree(0), + slow(false), + obsoleteLinks(false) +{ +} + +DitaXmlGenerator::~DitaXmlGenerator() +{ + if (helpProjectWriter) + delete helpProjectWriter; +} + +void DitaXmlGenerator::initializeGenerator(const Config &config) +{ + static const struct { + const char *key; + const char *left; + const char *right; + } defaults[] = { + { ATOM_FORMATTING_BOLD, "", "" }, + { ATOM_FORMATTING_INDEX, "" }, + { ATOM_FORMATTING_ITALIC, "", "" }, + { ATOM_FORMATTING_PARAMETER, "", "" }, + { ATOM_FORMATTING_SUBSCRIPT, "", "" }, + { ATOM_FORMATTING_SUPERSCRIPT, "", "" }, + { ATOM_FORMATTING_TELETYPE, "", "" }, + { ATOM_FORMATTING_UNDERLINE, "", "" }, + { 0, 0, 0 } + }; + + Generator::initializeGenerator(config); + obsoleteLinks = config.getBool(QLatin1String(CONFIG_OBSOLETELINKS)); + setImageFileExtensions(QStringList() << "png" << "jpg" << "jpeg" << "gif"); + int i = 0; + while (defaults[i].key) { + formattingLeftMap().insert(defaults[i].key, defaults[i].left); + formattingRightMap().insert(defaults[i].key, defaults[i].right); + i++; + } + + style = config.getString(DitaXmlGenerator::format() + + Config::dot + + DITAXMLGENERATOR_STYLE); + postHeader = config.getString(DitaXmlGenerator::format() + + Config::dot + + DITAXMLGENERATOR_POSTHEADER); + postPostHeader = config.getString(DitaXmlGenerator::format() + + Config::dot + + DITAXMLGENERATOR_POSTPOSTHEADER); + footer = config.getString(DitaXmlGenerator::format() + + Config::dot + + DITAXMLGENERATOR_FOOTER); + address = config.getString(DitaXmlGenerator::format() + + Config::dot + + DITAXMLGENERATOR_ADDRESS); + pleaseGenerateMacRef = config.getBool(DitaXmlGenerator::format() + + Config::dot + + DITAXMLGENERATOR_GENERATEMACREFS); + + project = config.getString(CONFIG_PROJECT); + offlineDocs = !config.getBool(CONFIG_ONLINE); + projectDescription = config.getString(CONFIG_DESCRIPTION); + if (projectDescription.isEmpty() && !project.isEmpty()) + projectDescription = project + " Reference Documentation"; + + projectUrl = config.getString(CONFIG_URL); + + outputEncoding = config.getString(CONFIG_OUTPUTENCODING); + if (outputEncoding.isEmpty()) + outputEncoding = QLatin1String("ISO-8859-1"); + outputCodec = QTextCodec::codecForName(outputEncoding.toLocal8Bit()); + + naturalLanguage = config.getString(CONFIG_NATURALLANGUAGE); + if (naturalLanguage.isEmpty()) + naturalLanguage = QLatin1String("en"); + + QSet editionNames = config.subVars(CONFIG_EDITION); + QSet::ConstIterator edition = editionNames.begin(); + while (edition != editionNames.end()) { + QString editionName = *edition; + QStringList editionModules = config.getStringList(CONFIG_EDITION + + Config::dot + + editionName + + Config::dot + + "modules"); + QStringList editionGroups = config.getStringList(CONFIG_EDITION + + Config::dot + + editionName + + Config::dot + + "groups"); + + if (!editionModules.isEmpty()) + editionModuleMap[editionName] = editionModules; + if (!editionGroups.isEmpty()) + editionGroupMap[editionName] = editionGroups; + + ++edition; + } + + slow = config.getBool(CONFIG_SLOW); + + stylesheets = config.getStringList(DitaXmlGenerator::format() + + Config::dot + + DITAXMLGENERATOR_STYLESHEETS); + customHeadElements = config.getStringList(DitaXmlGenerator::format() + + Config::dot + + DITAXMLGENERATOR_CUSTOMHEADELEMENTS); + codeIndent = config.getInt(CONFIG_CODEINDENT); + + helpProjectWriter = new HelpProjectWriter(config, + project.toLower() + + ".qhp"); +} + +void DitaXmlGenerator::terminateGenerator() +{ + Generator::terminateGenerator(); +} + +QString DitaXmlGenerator::format() +{ + return "DITAXML"; +} + +/*! + This is where the html files and dcf files are written. + \note The html file generation is done in the base class, + PageGenerator::generateTree(). + */ +void DitaXmlGenerator::generateTree(const Tree *tree, CodeMarker *marker) +{ +#if 0 + // Copy the stylesheets from the directory containing the qdocconf file. + // ### This should be changed to use a special directory in doc/src. + QStringList::ConstIterator styleIter = stylesheets.begin(); + QDir configPath = QDir::current(); + while (styleIter != stylesheets.end()) { + QString filePath = configPath.absoluteFilePath(*styleIter); + Config::copyFile(Location(), filePath, filePath, outputDir()); + ++styleIter; + } +#endif + myTree = tree; + nonCompatClasses.clear(); + mainClasses.clear(); + compatClasses.clear(); + obsoleteClasses.clear(); + moduleClassMap.clear(); + moduleNamespaceMap.clear(); + funcIndex.clear(); + legaleseTexts.clear(); + serviceClasses.clear(); + findAllClasses(tree->root()); + findAllFunctions(tree->root()); + findAllLegaleseTexts(tree->root()); + findAllNamespaces(tree->root()); +#ifdef ZZZ_QDOC_QML + findAllQmlClasses(tree->root()); +#endif + findAllSince(tree->root()); + + PageGenerator::generateTree(tree, marker); + + dcfClassesRoot.ref = "classes.html"; + dcfClassesRoot.title = "Classes"; + qSort(dcfClassesRoot.subsections); + + dcfOverviewsRoot.ref = "overviews.html"; + dcfOverviewsRoot.title = "Overviews"; + qSort(dcfOverviewsRoot.subsections); + + dcfExamplesRoot.ref = "examples.html"; + dcfExamplesRoot.title = "Tutorial & Examples"; + qSort(dcfExamplesRoot.subsections); + + DcfSection qtRoot; + appendDcfSubSection(&qtRoot, dcfClassesRoot); + appendDcfSubSection(&qtRoot, dcfOverviewsRoot); + appendDcfSubSection(&qtRoot, dcfExamplesRoot); + + generateDcf(project.toLower().simplified().replace(" ", "-"), + "index.html", + projectDescription, qtRoot); + generateDcf("designer", + "designer-manual.html", + "Qt Designer Manual", + dcfDesignerRoot); + generateDcf("linguist", + "linguist-manual.html", + "Qt Linguist Manual", + dcfLinguistRoot); + generateDcf("assistant", + "assistant-manual.html", + "Qt Assistant Manual", + dcfAssistantRoot); + generateDcf("qmake", + "qmake-manual.html", + "qmake Manual", + dcfQmakeRoot); + + QString fileBase = project.toLower().simplified().replace(" ", "-"); + generateIndex(fileBase, projectUrl, projectDescription); + generatePageIndex(outputDir() + "/" + fileBase + ".pageindex", marker); + + helpProjectWriter->generate(myTree); +} + +void DitaXmlGenerator::startText(const Node * /* relative */, + CodeMarker * /* marker */) +{ + inLink = false; + inContents = false; + inSectionHeading = false; + inTableHeader = false; + numTableRows = 0; + threeColumnEnumValueTable = true; + link.clear(); + sectionNumber.clear(); +} + +/*! + Generate html from an instance of Atom. + */ +int DitaXmlGenerator::generateAtom(const Atom *atom, + const Node *relative, + CodeMarker *marker) +{ + int skipAhead = 0; + static bool in_para = false; + + switch (atom->type()) { + case Atom::AbstractLeft: + break; + case Atom::AbstractRight: + break; + case Atom::AutoLink: + if (!inLink && !inContents && !inSectionHeading) { + const Node *node = 0; + QString link = getLink(atom, relative, marker, &node); + if (!link.isEmpty()) { + beginLink(link, node, relative, marker); + generateLink(atom, relative, marker); + endLink(); + } + else { + out() << protectEnc(atom->string()); + } + } + else { + out() << protectEnc(atom->string()); + } + break; + case Atom::BaseName: + break; + case Atom::BriefLeft: + if (relative->type() == Node::Fake) { + skipAhead = skipAtoms(atom, Atom::BriefRight); + break; + } + + out() << "

    "; + if (relative->type() == Node::Property || + relative->type() == Node::Variable) { + QString str; + atom = atom->next(); + while (atom != 0 && atom->type() != Atom::BriefRight) { + if (atom->type() == Atom::String || + atom->type() == Atom::AutoLink) + str += atom->string(); + skipAhead++; + atom = atom->next(); + } + str[0] = str[0].toLower(); + if (str.right(1) == ".") + str.truncate(str.length() - 1); + out() << "This "; + if (relative->type() == Node::Property) + out() << "property"; + else + out() << "variable"; + QStringList words = str.split(" "); + if (!(words.first() == "contains" || words.first() == "specifies" + || words.first() == "describes" || words.first() == "defines" + || words.first() == "holds" || words.first() == "determines")) + out() << " holds "; + else + out() << " "; + out() << str << "."; + } + break; + case Atom::BriefRight: + if (relative->type() != Node::Fake) + out() << "

    \n"; + break; + case Atom::C: + out() << formattingLeftMap()[ATOM_FORMATTING_TELETYPE]; + if (inLink) { + out() << protectEnc(plainCode(atom->string())); + } + else { + out() << highlightedCode(atom->string(), marker, relative); + } + out() << formattingRightMap()[ATOM_FORMATTING_TELETYPE]; + break; + case Atom::Code: + out() << "
    "
    +              << trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()),
    +                                                 marker,relative))
    +              << "
    \n"; + break; +#ifdef QDOC_QML + case Atom::Qml: + out() << "
    "
    +              << trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()),
    +                                                 marker,relative))
    +              << "
    \n"; + break; +#endif + case Atom::CodeNew: + out() << "

    you can rewrite it as

    \n" + << "
    "
    +              << trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()),
    +                                                 marker,relative))
    +              << "
    \n"; + break; + case Atom::CodeOld: + out() << "

    For example, if you have code like

    \n"; + // fallthrough + case Atom::CodeBad: + out() << "
    "
    +              << trimmedTrailing(protectEnc(plainCode(indent(codeIndent,atom->string()))))
    +              << "
    \n"; + break; + case Atom::FootnoteLeft: + // ### For now + if (in_para) { + out() << "

    \n"; + in_para = false; + } + out() << ""; + break; + case Atom::FormatElse: + case Atom::FormatEndif: + case Atom::FormatIf: + break; + case Atom::FormattingLeft: + out() << formattingLeftMap()[atom->string()]; + if (atom->string() == ATOM_FORMATTING_PARAMETER) { + if (atom->next() != 0 && atom->next()->type() == Atom::String) { + QRegExp subscriptRegExp("([a-z]+)_([0-9n])"); + if (subscriptRegExp.exactMatch(atom->next()->string())) { + out() << subscriptRegExp.cap(1) << "" + << subscriptRegExp.cap(2) << ""; + skipAhead = 1; + } + } + } + break; + case Atom::FormattingRight: + if (atom->string() == ATOM_FORMATTING_LINK) { + endLink(); + } + else { + out() << formattingRightMap()[atom->string()]; + } + break; + case Atom::AnnotatedList: + { + QList values = myTree->groups().values(atom->string()); + NodeMap nodeMap; + for (int i = 0; i < values.size(); ++i) { + const Node* n = values.at(i); + if ((n->status() != Node::Internal) && (n->access() != Node::Private)) { + nodeMap.insert(n->nameForLists(),n); + } + } + generateAnnotatedList(relative, marker, nodeMap); + } + break; + case Atom::GeneratedList: + if (atom->string() == "annotatedclasses") { + generateAnnotatedList(relative, marker, nonCompatClasses); + } + else if (atom->string() == "classes") { + generateCompactList(relative, marker, nonCompatClasses, true); + } + else if (atom->string().contains("classesbymodule")) { + QString arg = atom->string().trimmed(); + QString moduleName = atom->string().mid(atom->string().indexOf( + "classesbymodule") + 15).trimmed(); + if (moduleClassMap.contains(moduleName)) + generateAnnotatedList(relative, marker, moduleClassMap[moduleName]); + } + else if (atom->string().contains("classesbyedition")) { + + QString arg = atom->string().trimmed(); + QString editionName = atom->string().mid(atom->string().indexOf( + "classesbyedition") + 16).trimmed(); + + if (editionModuleMap.contains(editionName)) { + + // Add all classes in the modules listed for that edition. + NodeMap editionClasses; + foreach (const QString &moduleName, editionModuleMap[editionName]) { + if (moduleClassMap.contains(moduleName)) + editionClasses.unite(moduleClassMap[moduleName]); + } + + // Add additional groups and remove groups of classes that + // should be excluded from the edition. + + QMultiMap groups = myTree->groups(); + foreach (const QString &groupName, editionGroupMap[editionName]) { + QList groupClasses; + if (groupName.startsWith("-")) { + groupClasses = groups.values(groupName.mid(1)); + foreach (const Node *node, groupClasses) + editionClasses.remove(node->name()); + } + else { + groupClasses = groups.values(groupName); + foreach (const Node *node, groupClasses) + editionClasses.insert(node->name(), node); + } + } + generateAnnotatedList(relative, marker, editionClasses); + } + } + else if (atom->string() == "classhierarchy") { + generateClassHierarchy(relative, marker, nonCompatClasses); + } + else if (atom->string() == "compatclasses") { + generateCompactList(relative, marker, compatClasses, false); + } + else if (atom->string() == "obsoleteclasses") { + generateCompactList(relative, marker, obsoleteClasses, false); + } + else if (atom->string() == "functionindex") { + generateFunctionIndex(relative, marker); + } + else if (atom->string() == "legalese") { + generateLegaleseList(relative, marker); + } + else if (atom->string() == "mainclasses") { + generateCompactList(relative, marker, mainClasses, true); + } + else if (atom->string() == "services") { + generateCompactList(relative, marker, serviceClasses, false); + } + else if (atom->string() == "overviews") { + generateOverviewList(relative, marker); + } + else if (atom->string() == "namespaces") { + generateAnnotatedList(relative, marker, namespaceIndex); + } + else if (atom->string() == "related") { + const FakeNode *fake = static_cast(relative); + if (fake && !fake->groupMembers().isEmpty()) { + NodeMap groupMembersMap; + foreach (const Node *node, fake->groupMembers()) { + if (node->type() == Node::Fake) + groupMembersMap[fullName(node, relative, marker)] = node; + } + generateAnnotatedList(fake, marker, groupMembersMap); + } + } + else if (atom->string() == "relatedinline") { + const FakeNode *fake = static_cast(relative); + if (fake && !fake->groupMembers().isEmpty()) { + // Reverse the list into the original scan order. + // Should be sorted. But on what? It may not be a + // regular class or page definition. + QList list; + foreach (const Node *node, fake->groupMembers()) + list.prepend(node); + foreach (const Node *node, list) + generateBody(node, marker); + } + } + break; + case Atom::SinceList: + { + NewSinceMaps::const_iterator nsmap; + nsmap = newSinceMaps.find(atom->string()); + NewClassMaps::const_iterator ncmap; + ncmap = newClassMaps.find(atom->string()); + NewClassMaps::const_iterator nqcmap; + nqcmap = newQmlClassMaps.find(atom->string()); + if ((nsmap != newSinceMaps.constEnd()) && !nsmap.value().isEmpty()) { + QList
    sections; + QList
    ::ConstIterator s; + for (int i=0; itype()) { + case Node::Fake: + if (node->subType() == Node::QmlClass) { + sections[QmlClass].appendMember((Node*)node); + } + break; + case Node::Namespace: + sections[Namespace].appendMember((Node*)node); + break; + case Node::Class: + sections[Class].appendMember((Node*)node); + break; + case Node::Enum: + sections[Enum].appendMember((Node*)node); + break; + case Node::Typedef: + sections[Typedef].appendMember((Node*)node); + break; + case Node::Function: { + const FunctionNode* fn = static_cast(node); + if (fn->isMacro()) + sections[Macro].appendMember((Node*)node); + else { + Node* p = fn->parent(); + if (p) { + if (p->type() == Node::Class) + sections[MemberFunction].appendMember((Node*)node); + else if (p->type() == Node::Namespace) { + if (p->name().isEmpty()) + sections[GlobalFunction].appendMember((Node*)node); + else + sections[NamespaceFunction].appendMember((Node*)node); + } + else + sections[GlobalFunction].appendMember((Node*)node); + } + else + sections[GlobalFunction].appendMember((Node*)node); + } + break; + } + case Node::Property: + sections[Property].appendMember((Node*)node); + break; + case Node::Variable: + sections[Variable].appendMember((Node*)node); + break; + case Node::QmlProperty: + sections[QmlProperty].appendMember((Node*)node); + break; + case Node::QmlSignal: + sections[QmlSignal].appendMember((Node*)node); + break; + case Node::QmlMethod: + sections[QmlMethod].appendMember((Node*)node); + break; + default: + break; + } + ++n; + } + + /* + First generate the table of contents. + */ + out() << "
      \n"; + s = sections.constBegin(); + while (s != sections.constEnd()) { + if (!(*s).members.isEmpty()) { + + out() << "
    • " + << "" + << (*s).name + << "
    • \n"; + } + ++s; + } + out() << "
    \n"; + + int idx = 0; + s = sections.constBegin(); + while (s != sections.constEnd()) { + if (!(*s).members.isEmpty()) { + out() << "\n"; + out() << "

    " << protectEnc((*s).name) << "

    \n"; + if (idx == Class) + generateCompactList(0, marker, ncmap.value(), false, QString("Q")); + else if (idx == QmlClass) + generateCompactList(0, marker, nqcmap.value(), false, QString("Q")); + else if (idx == MemberFunction) { + ParentMaps parentmaps; + ParentMaps::iterator pmap; + NodeList::const_iterator i = s->members.constBegin(); + while (i != s->members.constEnd()) { + Node* p = (*i)->parent(); + pmap = parentmaps.find(p); + if (pmap == parentmaps.end()) + pmap = parentmaps.insert(p,NodeMultiMap()); + pmap->insert((*i)->name(),(*i)); + ++i; + } + pmap = parentmaps.begin(); + while (pmap != parentmaps.end()) { + NodeList nlist = pmap->values(); + out() << "

    Class "; + + out() << ""; + QStringList pieces = fullName(pmap.key(), 0, marker).split("::"); + out() << protectEnc(pieces.last()); + out() << "" << ":

    \n"; + + generateSection(nlist, 0, marker, CodeMarker::Summary); + out() << "
    "; + ++pmap; + } + } + else + generateSection(s->members, 0, marker, CodeMarker::Summary); + } + ++idx; + ++s; + } + } + } + break; + case Atom::Image: + case Atom::InlineImage: + { + QString fileName = imageFileName(relative, atom->string()); + QString text; + if (atom->next() != 0) + text = atom->next()->string(); + if (atom->type() == Atom::Image) + out() << "

    "; + if (fileName.isEmpty()) { + out() << "[Missing image " + << protectEnc(atom->string()) << "]"; + } + else { + out() << "\"""; + helpProjectWriter->addExtraFile(fileName); + } + if (atom->type() == Atom::Image) + out() << "

    "; + } + break; + case Atom::ImageText: + break; + case Atom::LegaleseLeft: + out() << "
    "; + break; + case Atom::LegaleseRight: + out() << "
    "; + break; + case Atom::LineBreak: + out() << "
    "; + break; + case Atom::Link: + { + const Node *node = 0; + QString myLink = getLink(atom, relative, marker, &node); + if (myLink.isEmpty()) { + relative->doc().location().warning(tr("Cannot link to '%1' in %2") + .arg(atom->string()) + .arg(marker->plainFullName(relative))); + } + beginLink(myLink, node, relative, marker); + skipAhead = 1; + } + break; + case Atom::LinkNode: + { + const Node *node = CodeMarker::nodeForString(atom->string()); + beginLink(linkForNode(node, relative), node, relative, marker); + skipAhead = 1; + } + break; + case Atom::ListLeft: + if (in_para) { + out() << "

    \n"; + in_para = false; + } + if (atom->string() == ATOM_LIST_BULLET) { + out() << "
      \n"; + } + else if (atom->string() == ATOM_LIST_TAG) { + out() << "
      \n"; + } + else if (atom->string() == ATOM_LIST_VALUE) { + threeColumnEnumValueTable = isThreeColumnEnumValueTable(atom); + if (threeColumnEnumValueTable) { + out() << ""; + // << "" + if (++numTableRows % 2 == 1) + out() << ""; + else + out() << ""; + + out() << "" + << "" + << "\n"; + } + else { + out() << "
      ConstantValueDescription
      " + << "\n"; + } + } + else { + out() << "
        string() == ATOM_LIST_LOWERALPHA) { + out() << "\"a\""; + } + else if (atom->string() == ATOM_LIST_UPPERROMAN) { + out() << "\"I\""; + } + else if (atom->string() == ATOM_LIST_LOWERROMAN) { + out() << "\"i\""; + } + else { // (atom->string() == ATOM_LIST_NUMERIC) + out() << "\"1\""; + } + if (atom->next() != 0 && atom->next()->string().toInt() != 1) + out() << " start=\"" << atom->next()->string() << "\""; + out() << ">\n"; + } + break; + case Atom::ListItemNumber: + break; + case Atom::ListTagLeft: + if (atom->string() == ATOM_LIST_TAG) { + out() << "
        "; + } + else { // (atom->string() == ATOM_LIST_VALUE) + // ### Trenton + + out() << "
      \n"; + } + else { + out() << "\n"; + } + break; + case Atom::ListRight: + if (atom->string() == ATOM_LIST_BULLET) { + out() << "\n"; + } + else if (atom->string() == ATOM_LIST_TAG) { + out() << "\n"; + } + else if (atom->string() == ATOM_LIST_VALUE) { + out() << "
      ConstantValue
      " + << protectEnc(plainCode(marker->markedUpEnumValue(atom->next()->string(), + relative))) + << ""; + + QString itemValue; + if (relative->type() == Node::Enum) { + const EnumNode *enume = static_cast(relative); + itemValue = enume->itemValue(atom->next()->string()); + } + + if (itemValue.isEmpty()) + out() << "?"; + else + out() << "" << protectEnc(itemValue) << ""; + + skipAhead = 1; + } + break; + case Atom::ListTagRight: + if (atom->string() == ATOM_LIST_TAG) + out() << "\n"; + break; + case Atom::ListItemLeft: + if (atom->string() == ATOM_LIST_TAG) { + out() << "
      "; + } + else if (atom->string() == ATOM_LIST_VALUE) { + if (threeColumnEnumValueTable) { + out() << "
      "; + if (matchAhead(atom, Atom::ListItemRight)) + out() << " "; + } + } + else { + out() << "
    • "; + } + if (matchAhead(atom, Atom::ParaLeft)) + skipAhead = 1; + break; + case Atom::ListItemRight: + if (atom->string() == ATOM_LIST_TAG) { + out() << "\n"; + } + else if (atom->string() == ATOM_LIST_VALUE) { + out() << "
    • \n"; + } + else { + out() << "\n"; + } + break; + case Atom::Nop: + break; + case Atom::ParaLeft: + out() << "

      "; + in_para = true; + break; + case Atom::ParaRight: + endLink(); + if (in_para) { + out() << "

      \n"; + in_para = false; + } + //if (!matchAhead(atom, Atom::ListItemRight) && !matchAhead(atom, Atom::TableItemRight)) + // out() << "

      \n"; + break; + case Atom::QuotationLeft: + out() << "
      "; + break; + case Atom::QuotationRight: + out() << "
      \n"; + break; + case Atom::RawString: + out() << atom->string(); + break; + case Atom::SectionLeft: +#if 0 + { + int nextLevel = atom->string().toInt(); + if (sectionNumber.size() < nextLevel) { + do { + sectionNumber.append("1"); + } while (sectionNumber.size() < nextLevel); + } + else { + while (sectionNumber.size() > nextLevel) { + sectionNumber.removeLast(); + } + sectionNumber.last() = QString::number(sectionNumber.last().toInt() + 1); + } + out() << "\n"; + } +#else + out() << "\n"; +#endif + break; + case Atom::SectionRight: + break; + case Atom::SectionHeadingLeft: + out() << "string().toInt() + hOffset(relative)) + ">"; + inSectionHeading = true; + break; + case Atom::SectionHeadingRight: + out() << "string().toInt() + hOffset(relative)) + ">\n"; + inSectionHeading = false; + break; + case Atom::SidebarLeft: + break; + case Atom::SidebarRight: + break; + case Atom::String: + if (inLink && !inContents && !inSectionHeading) { + generateLink(atom, relative, marker); + } + else { + out() << protectEnc(atom->string()); + } + break; + case Atom::TableLeft: + if (in_para) { + out() << "

      \n"; + in_para = false; + } + if (!atom->string().isEmpty()) { + if (atom->string().contains("%")) + out() << "\n "; // width=\"" << atom->string() << "\">\n "; + else { + out() << "
      \n"; + } + } + else { + out() << "
      \n"; + } + numTableRows = 0; + break; + case Atom::TableRight: + out() << "
      \n"; + break; + case Atom::TableHeaderLeft: + out() << ""; + inTableHeader = true; + break; + case Atom::TableHeaderRight: + out() << ""; + if (matchAhead(atom, Atom::TableHeaderLeft)) { + skipAhead = 1; + out() << "\n"; + } + else { + out() << "\n"; + inTableHeader = false; + } + break; + case Atom::TableRowLeft: + if (++numTableRows % 2 == 1) + out() << ""; + else + out() << ""; + break; + case Atom::TableRowRight: + out() << "\n"; + break; + case Atom::TableItemLeft: + { + if (inTableHeader) + out() << "string().split(","); + if (spans.size() == 2) { + if (spans.at(0) != "1") + out() << " colspan=\"" << spans.at(0) << "\""; + if (spans.at(1) != "1") + out() << " rowspan=\"" << spans.at(1) << "\""; + if (inTableHeader) + out() << ">"; + else + out() << ">

      "; + } + if (matchAhead(atom, Atom::ParaLeft)) + skipAhead = 1; + } + break; + case Atom::TableItemRight: + if (inTableHeader) + out() << ""; + else + out() << "

      "; + if (matchAhead(atom, Atom::ParaLeft)) + skipAhead = 1; + break; + case Atom::TableOfContents: + { + int numColumns = 1; + const Node *node = relative; + + Doc::SectioningUnit sectioningUnit = Doc::Section4; + QStringList params = atom->string().split(","); + QString columnText = params.at(0); + QStringList pieces = columnText.split(" ", QString::SkipEmptyParts); + if (pieces.size() >= 2) { + columnText = pieces.at(0); + pieces.pop_front(); + QString path = pieces.join(" ").trimmed(); + node = findNodeForTarget(path, relative, marker, atom); + } + + if (params.size() == 2) { + numColumns = qMax(columnText.toInt(), numColumns); + sectioningUnit = (Doc::SectioningUnit)params.at(1).toInt(); + } + + if (node) + generateTableOfContents(node, + marker, + sectioningUnit, + numColumns, + relative); + } + break; + case Atom::Target: + out() << "string()) << "\">"; + break; + case Atom::UnhandledFormat: + out() << "<Missing DITAXML>"; + break; + case Atom::UnknownCommand: + out() << "\\" << protectEnc(atom->string()) + << ""; + break; +#ifdef QDOC_QML + case Atom::QmlText: + case Atom::EndQmlText: + // don't do anything with these. They are just tags. + break; +#endif + default: + unknownAtom(atom); + } + return skipAhead; +} + +/*! + Generate a reference page for a C++ class. + */ +void DitaXmlGenerator::generateClassLikeNode(const InnerNode *inner, + CodeMarker *marker) +{ + QList
      sections; + QList
      ::ConstIterator s; + + const ClassNode *classe = 0; + const NamespaceNode *namespasse = 0; + + QString title; + QString rawTitle; + QString fullTitle; + if (inner->type() == Node::Namespace) { + namespasse = static_cast(inner); + rawTitle = marker->plainName(inner); + fullTitle = marker->plainFullName(inner); + title = rawTitle + " Namespace"; + } + else if (inner->type() == Node::Class) { + classe = static_cast(inner); + rawTitle = marker->plainName(inner); + fullTitle = marker->plainFullName(inner); + title = rawTitle + " Class Reference"; + } + + DcfSection classSection; + classSection.title = title; + classSection.ref = linkForNode(inner, 0); + classSection.keywords += qMakePair(inner->name(), classSection.ref); + + Text subtitleText; + if (rawTitle != fullTitle) + subtitleText << "(" << Atom(Atom::AutoLink, fullTitle) << ")" + << Atom(Atom::LineBreak); + +#if 0 + // No longer used because the modeule name is a breadcrumb. + QString fixedModule = inner->moduleName(); + if (fixedModule == "Qt3SupportLight") + fixedModule = "Qt3Support"; + if (!fixedModule.isEmpty()) + subtitleText << "[" << Atom(Atom::AutoLink, fixedModule) << " module]"; + + if (fixedModule.isEmpty()) { + QMultiMap publicGroups = myTree->publicGroups(); + QList groupNames = publicGroups.values(inner->name()); + if (!groupNames.isEmpty()) { + qSort(groupNames.begin(), groupNames.end()); + subtitleText << "["; + for (int j=0; jsections(inner, CodeMarker::Summary, CodeMarker::Okay); + generateTableOfContents(inner,marker,§ions); + generateTitle(title, subtitleText, SmallSubTitle, inner, marker); + +#ifdef QDOC_QML + if (classe && !classe->qmlElement().isEmpty()) { + generateInstantiatedBy(classe,marker); + } +#endif + + generateBrief(inner, marker); + generateIncludes(inner, marker); + generateStatus(inner, marker); + if (classe) { + generateInherits(classe, marker); + generateInheritedBy(classe, marker); + } + generateThreadSafeness(inner, marker); + generateSince(inner, marker); + + out() << "\n"; + + bool needOtherSection = false; + + /* + sections is built above for the call to generateTableOfContents(). + */ + s = sections.begin(); + while (s != sections.end()) { + if (s->members.isEmpty() && s->reimpMembers.isEmpty()) { + if (!s->inherited.isEmpty()) + needOtherSection = true; + } + else { + if (!s->members.isEmpty()) { + out() << "
      \n"; + out() << "\n"; + out() << "

      " << protectEnc((*s).name) << "

      \n"; + generateSection(s->members, inner, marker, CodeMarker::Summary); + } + if (!s->reimpMembers.isEmpty()) { + QString name = QString("Reimplemented ") + (*s).name; + out() << "
      \n"; + out() << "\n"; + out() << "

      " << protectEnc(name) << "

      \n"; + generateSection(s->reimpMembers, inner, marker, CodeMarker::Summary); + } + + if (!s->inherited.isEmpty()) { + out() << "
        \n"; + generateSectionInheritedList(*s, inner, marker, true); + out() << "
      \n"; + } + } + ++s; + } + + if (needOtherSection) { + out() << "

      Additional Inherited Members

      \n" + "
        \n"; + + s = sections.begin(); + while (s != sections.end()) { + if (s->members.isEmpty() && !s->inherited.isEmpty()) + generateSectionInheritedList(*s, inner, marker); + ++s; + } + out() << "
      \n"; + } + + out() << "\n"; + + if (!inner->doc().isEmpty()) { + out() << "
      \n" + << "
      \n" // QTBUG-9504 + << "

      " << "Detailed Description" << "

      \n"; + generateBody(inner, marker); + out() << "
      \n"; // QTBUG-9504 + generateAlsoList(inner, marker); + } + + sections = marker->sections(inner, CodeMarker::Detailed, CodeMarker::Okay); + s = sections.begin(); + while (s != sections.end()) { + out() << "
      \n"; + if (!(*s).divClass.isEmpty()) + out() << "
      \n"; // QTBUG-9504 + out() << "

      " << protectEnc((*s).name) << "

      \n"; + + NodeList::ConstIterator m = (*s).members.begin(); + while (m != (*s).members.end()) { + if ((*m)->access() != Node::Private) { // ### check necessary? + if ((*m)->type() != Node::Class) + generateDetailedMember(*m, inner, marker); + else { + out() << "

      class "; + generateFullName(*m, inner, marker); + out() << "

      "; + generateBrief(*m, marker, inner); + } + + QStringList names; + names << (*m)->name(); + if ((*m)->type() == Node::Function) { + const FunctionNode *func = reinterpret_cast(*m); + if (func->metaness() == FunctionNode::Ctor || + func->metaness() == FunctionNode::Dtor || + func->overloadNumber() != 1) + names.clear(); + } + else if ((*m)->type() == Node::Property) { + const PropertyNode *prop = reinterpret_cast(*m); + if (!prop->getters().isEmpty() && + !names.contains(prop->getters().first()->name())) + names << prop->getters().first()->name(); + if (!prop->setters().isEmpty()) + names << prop->setters().first()->name(); + if (!prop->resetters().isEmpty()) + names << prop->resetters().first()->name(); + } + else if ((*m)->type() == Node::Enum) { + const EnumNode *enume = reinterpret_cast(*m); + if (enume->flagsType()) + names << enume->flagsType()->name(); + + foreach (const QString &enumName, + enume->doc().enumItemNames().toSet() - + enume->doc().omitEnumItemNames().toSet()) + names << plainCode(marker->markedUpEnumValue(enumName, + enume)); + } + foreach (const QString &name, names) + classSection.keywords += qMakePair(name,linkForNode(*m,0)); + } + ++m; + } + if (!(*s).divClass.isEmpty()) + out() << "
      \n"; // QTBUG-9504 + ++s; + } + generateFooter(inner); + + if (!membersLink.isEmpty()) { + DcfSection membersSection; + membersSection.title = "List of all members"; + membersSection.ref = membersLink; + appendDcfSubSection(&classSection, membersSection); + } + if (!obsoleteLink.isEmpty()) { + DcfSection obsoleteSection; + obsoleteSection.title = "Obsolete members"; + obsoleteSection.ref = obsoleteLink; + appendDcfSubSection(&classSection, obsoleteSection); + } + if (!compatLink.isEmpty()) { + DcfSection compatSection; + compatSection.title = "Qt 3 support members"; + compatSection.ref = compatLink; + appendDcfSubSection(&classSection, compatSection); + } + + appendDcfSubSection(&dcfClassesRoot, classSection); +} + +/*! + Generate the html page for a qdoc file that doesn't map + to an underlying c++ file. + */ +void DitaXmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker) +{ + SubTitleSize subTitleSize = LargeSubTitle; + DcfSection fakeSection; + fakeSection.title = fake->fullTitle(); + fakeSection.ref = linkForNode(fake, 0); + + QList
      sections; + QList
      ::const_iterator s; + + QString fullTitle = fake->fullTitle(); + QString htmlTitle = fullTitle; + if (fake->subType() == Node::File && !fake->subTitle().isEmpty()) { + subTitleSize = SmallSubTitle; + htmlTitle += " (" + fake->subTitle() + ")"; + } + else if (fake->subType() == Node::QmlBasicType) { + fullTitle = "QML Basic Type: " + fullTitle; + htmlTitle = fullTitle; + } + + generateHeader(htmlTitle, fake, marker); + + /* + Generate the TOC for the new doc format. + Don't generate a TOC for the home page. + */ + if (fake->name() != QString("index.html")) + generateTableOfContents(fake,marker,0); + + generateTitle(fullTitle, + Text() << fake->subTitle(), + subTitleSize, + fake, + marker); + + if (fake->subType() == Node::Module) { + // Generate brief text and status for modules. + generateBrief(fake, marker); + generateStatus(fake, marker); + + if (moduleNamespaceMap.contains(fake->name())) { + out() << "\n"; + out() << "

      Namespaces

      \n"; + generateAnnotatedList(fake, marker, moduleNamespaceMap[fake->name()]); + } + if (moduleClassMap.contains(fake->name())) { + out() << "\n"; + out() << "

      Classes

      \n"; + generateAnnotatedList(fake, marker, moduleClassMap[fake->name()]); + } + } + else if (fake->subType() == Node::HeaderFile) { + // Generate brief text and status for modules. + generateBrief(fake, marker); + generateStatus(fake, marker); + + out() << "\n"; + + if (!membersLink.isEmpty()) { + DcfSection membersSection; + membersSection.title = "List of all members"; + membersSection.ref = membersLink; + appendDcfSubSection(&fakeSection, membersSection); + } + if (!obsoleteLink.isEmpty()) { + DcfSection obsoleteSection; + obsoleteSection.title = "Obsolete members"; + obsoleteSection.ref = obsoleteLink; + appendDcfSubSection(&fakeSection, obsoleteSection); + } + if (!compatLink.isEmpty()) { + DcfSection compatSection; + compatSection.title = "Qt 3 support members"; + compatSection.ref = compatLink; + appendDcfSubSection(&fakeSection, compatSection); + } + } +#ifdef QDOC_QML + else if (fake->subType() == Node::QmlClass) { + const QmlClassNode* qml_cn = static_cast(fake); + const ClassNode* cn = qml_cn->classNode(); + generateQmlInherits(qml_cn, marker); + generateQmlInstantiates(qml_cn, marker); + generateBrief(qml_cn, marker); + generateQmlInheritedBy(qml_cn, marker); + sections = marker->qmlSections(qml_cn,CodeMarker::Summary); + s = sections.begin(); + while (s != sections.end()) { + out() << "\n"; + out() << "

      " << protectEnc((*s).name) << "

      \n"; + generateQmlSummary(*s,fake,marker); + ++s; + } + + out() << "\n"; + out() << "

      " << "Detailed Description" << "

      \n"; + generateBody(fake, marker); + if (cn) + generateQmlText(cn->doc().body(), cn, marker, fake->name()); + generateAlsoList(fake, marker); + out() << "
      \n"; + + sections = marker->qmlSections(qml_cn,CodeMarker::Detailed); + s = sections.begin(); + while (s != sections.end()) { + out() << "

      " << protectEnc((*s).name) << "

      \n"; + NodeList::ConstIterator m = (*s).members.begin(); + while (m != (*s).members.end()) { + generateDetailedQmlMember(*m, fake, marker); + out() << "
      \n"; + fakeSection.keywords += qMakePair((*m)->name(), + linkForNode(*m,0)); + ++m; + } + ++s; + } + generateFooter(fake); + return; + } +#endif + + sections = marker->sections(fake, CodeMarker::Summary, CodeMarker::Okay); + s = sections.begin(); + while (s != sections.end()) { + out() << "\n"; + out() << "

      " << protectEnc((*s).name) << "

      \n"; + generateSectionList(*s, fake, marker, CodeMarker::Summary); + ++s; + } + + Text brief = fake->doc().briefText(); + if (fake->subType() == Node::Module && !brief.isEmpty()) { + out() << "\n"; + out() << "
      \n"; // QTBUG-9504 + out() << "

      " << "Detailed Description" << "

      \n"; + } + else + out() << "
      \n"; // QTBUG-9504 + + generateBody(fake, marker); + out() << "
      \n"; // QTBUG-9504 + generateAlsoList(fake, marker); + + if (!fake->groupMembers().isEmpty()) { + NodeMap groupMembersMap; + foreach (const Node *node, fake->groupMembers()) { + if (node->type() == Node::Class || node->type() == Node::Namespace) + groupMembersMap[node->name()] = node; + } + generateAnnotatedList(fake, marker, groupMembersMap); + } + + fakeSection.keywords += qMakePair(fakeSection.title, fakeSection.ref); + + sections = marker->sections(fake, CodeMarker::Detailed, CodeMarker::Okay); + s = sections.begin(); + while (s != sections.end()) { + out() << "
      \n"; + out() << "

      " << protectEnc((*s).name) << "

      \n"; + + NodeList::ConstIterator m = (*s).members.begin(); + while (m != (*s).members.end()) { + generateDetailedMember(*m, fake, marker); + fakeSection.keywords += qMakePair((*m)->name(), linkForNode(*m, 0)); + ++m; + } + ++s; + } + generateFooter(fake); + + if (fake->subType() == Node::Example) { + appendDcfSubSection(&dcfExamplesRoot, fakeSection); + } + else if (fake->subType() != Node::File) { + QString contentsPage = fake->links().value(Node::ContentsLink).first; + + if (contentsPage == "Qt Designer Manual") { + appendDcfSubSection(&dcfDesignerRoot, fakeSection); + } + else if (contentsPage == "Qt Linguist Manual") { + appendDcfSubSection(&dcfLinguistRoot, fakeSection); + } + else if (contentsPage == "Qt Assistant Manual") { + appendDcfSubSection(&dcfAssistantRoot, fakeSection); + } + else if (contentsPage == "qmake Manual") { + appendDcfSubSection(&dcfQmakeRoot, fakeSection); + } + else { + appendDcfSubSection(&dcfOverviewsRoot, fakeSection); + } + } +} + +/*! + Returns "html" for this subclass of Generator. + */ +QString DitaXmlGenerator::fileExtension(const Node * /* node */) const +{ + return "html"; +} + +/*! + Output breadcrumb list in the html file. + */ +void DitaXmlGenerator::generateBreadCrumbs(const QString& title, + const Node *node, + CodeMarker *marker) +{ + Text breadcrumb; + if (node->type() == Node::Class) { + const ClassNode* cn = static_cast(node); + QString name = node->moduleName(); + out() << "
    • All Modules
    • "; + if (!name.isEmpty()) { + out() << "
    • "; + breadcrumb << Atom(Atom::AutoLink,name); + generateText(breadcrumb, node, marker); + out() << "
    • \n"; + } + breadcrumb.clear(); + if (!cn->name().isEmpty()) { + out() << "
    • "; + breadcrumb << Atom(Atom::AutoLink,cn->name()); + generateText(breadcrumb, 0, marker); + out() << "
    • \n"; + } + } + else if (node->type() == Node::Fake) { + const FakeNode* fn = static_cast(node); + if (node->subType() == Node::Module) { + out() << "
    • All Modules
    • "; + QString name = node->name(); + if (!name.isEmpty()) { + out() << "
    • "; + breadcrumb << Atom(Atom::AutoLink,name); + generateText(breadcrumb, 0, marker); + out() << "
    • \n"; + } + } + else if (node->subType() == Node::Group) { + if (fn->name() == QString("modules")) + out() << "
    • All Modules
    • "; + else { + out() << "
    • name() << "\">" << title + << "
    • "; + } + } + else if (node->subType() == Node::Page) { + if (fn->name() == QString("examples.html")) { + out() << "
    • Examples
    • "; + } + else if (fn->name().startsWith("examples-")) { + out() << "
    • Examples
    • "; + out() << "
    • name() << "\">" << title + << "
    • "; + } + else if (fn->name() == QString("namespaces.html")) { + out() << "
    • All Namespaces
    • "; + } + else { + out() << "
    • name() << "\">" << title + << "
    • "; + } + } + else if (node->subType() == Node::QmlClass) { + out() << "
    • QML Elements
    • "; + out() << "
    • name() << "\">" << title + << "
    • "; + } + else if (node->subType() == Node::Example) { + out() << "
    • Examples
    • "; + QStringList sl = fn->name().split('/'); + QString name = "examples-" + sl.at(0) + ".html"; + QString t = CodeParser::titleFromName(name); + out() << "
    • " + << t << "
    • "; + out() << "
    • " + << title << "
    • "; + } + } + else if (node->type() == Node::Namespace) { + const NamespaceNode* nsn = static_cast(node); + out() << "
    • All Namespaces
    • "; + out() << "
    • " << title + << "
    • "; + } +} + +void DitaXmlGenerator::generateHeader(const QString& title, + const Node *node, + CodeMarker *marker) +{ + out() << QString("\n").arg(outputEncoding); + out() << "\n"; + out() << QString("\n").arg(naturalLanguage); + out() << "\n"; + out() << " \n"; + QString shortVersion; + shortVersion = project + " " + shortVersion + ": "; + if (node && !node->doc().location().isEmpty()) + out() << "\n"; + + shortVersion = myTree->version(); + if (shortVersion.count(QChar('.')) == 2) + shortVersion.truncate(shortVersion.lastIndexOf(QChar('.'))); + if (!shortVersion.isEmpty()) { + if (project == "QSA") + shortVersion = "QSA " + shortVersion + ": "; + else + shortVersion = "Qt " + shortVersion + ": "; + } + + out() << " " << shortVersion << protectEnc(title) << "\n"; + + out() << " "; + out() << ""; + out() << ""; + out() << ""; + + + //out() << " Qt Reference Documentation"; + out() << " \n"; + out() << " \n"; + out() << " \n"; + out() << "\n"; + + if (offlineDocs) + out() << "\n"; + else + out() << "\n"; + +#ifdef GENERATE_MAC_REFS + if (mainPage) + generateMacRef(node, marker); +#endif + out() << QString(postHeader).replace("\\" + COMMAND_VERSION, myTree->version()); + generateBreadCrumbs(title,node,marker); + out() << QString(postPostHeader).replace("\\" + COMMAND_VERSION, myTree->version()); + +#if 0 // Removed for new docf format. MWS + if (node && !node->links().empty()) + out() << "

      \n" << navigationLinks << "

      \n"; +#endif +} + +void DitaXmlGenerator::generateTitle(const QString& title, + const Text &subTitle, + SubTitleSize subTitleSize, + const Node *relative, + CodeMarker *marker) +{ + if (!title.isEmpty()) + out() << "

      " << protectEnc(title) << "

      \n"; + if (!subTitle.isEmpty()) { + out() << ""; + else + out() << " class=\"subtitle\">"; + generateText(subTitle, relative, marker); + out() << "\n"; + } +} + +void DitaXmlGenerator::generateFooter(const Node *node) +{ + if (node && !node->links().empty()) + out() << "

      \n" << navigationLinks << "

      \n"; + + out() << QString(footer).replace("\\" + COMMAND_VERSION, myTree->version()) + << QString(address).replace("\\" + COMMAND_VERSION, myTree->version()); + out() << " \n"; + out() << "\n"; + out() << "\n"; +} + +void DitaXmlGenerator::generateBrief(const Node *node, CodeMarker *marker, + const Node *relative) +{ + Text brief = node->doc().briefText(); + if (!brief.isEmpty()) { + out() << "

      "; + generateText(brief, node, marker); + if (!relative || node == relative) + out() << " More...

      \n"; + } +} + +void DitaXmlGenerator::generateIncludes(const InnerNode *inner, CodeMarker *marker) +{ + if (!inner->includes().isEmpty()) { + out() << "
      "
      +              << trimmedTrailing(highlightedCode(indent(codeIndent,
      +                                                        marker->markedUpIncludes(inner->includes())),
      +                                                 marker,inner))
      +              << "
      "; + } +} + +/*! + Generates a table of contents begining at \a node. + */ +void DitaXmlGenerator::generateTableOfContents(const Node *node, + CodeMarker *marker, + Doc::SectioningUnit sectioningUnit, + int numColumns, + const Node *relative) + +{ + return; + if (!node->doc().hasTableOfContents()) + return; + QList toc = node->doc().tableOfContents(); + if (toc.isEmpty()) + return; + + QString nodeName = ""; + if (node != relative) + nodeName = node->name(); + + QStringList sectionNumber; + int columnSize = 0; + + QString tdTag; + if (numColumns > 1) { + tdTag = ""; /* width=\"" + QString::number((100 + numColumns - 1) / numColumns) + "%\">";*/ + out() << "\n" + << tdTag << "\n"; + } + + // disable nested links in table of contents + inContents = true; + inLink = true; + + for (int i = 0; i < toc.size(); ++i) { + Atom *atom = toc.at(i); + + int nextLevel = atom->string().toInt(); + if (nextLevel > (int)sectioningUnit) + continue; + + if (sectionNumber.size() < nextLevel) { + do { + out() << "
        "; + sectionNumber.append("1"); + } while (sectionNumber.size() < nextLevel); + } + else { + while (sectionNumber.size() > nextLevel) { + out() << "
      \n"; + sectionNumber.removeLast(); + } + sectionNumber.last() = QString::number(sectionNumber.last().toInt() + 1); + } + int numAtoms; + Text headingText = Text::sectionHeading(atom); + + if (sectionNumber.size() == 1 && columnSize > toc.size() / numColumns) { + out() << "" << tdTag << "\n"; + sectionNumber.removeLast(); + } + + if (numColumns > 1) + out() << "
      \n"; + + inContents = false; + inLink = false; +} + +/*! + Revised for the new doc format. + Generates a table of contents begining at \a node. + */ +void DitaXmlGenerator::generateTableOfContents(const Node *node, + CodeMarker *marker, + QList
      * sections) +{ + QList toc; + if (node->doc().hasTableOfContents()) + toc = node->doc().tableOfContents(); + if (toc.isEmpty() && !sections && (node->subType() != Node::Module)) + return; + + QStringList sectionNumber; + int detailsBase = 0; + + // disable nested links in table of contents + inContents = true; + inLink = true; + + out() << "
      \n"; + out() << "

      Contents

      \n"; + sectionNumber.append("1"); + out() << "
        \n"; + + if (node->subType() == Node::Module) { + if (moduleNamespaceMap.contains(node->name())) { + out() << "
      • Namespaces
      • \n"; + } + if (moduleClassMap.contains(node->name())) { + out() << "
      • Classes
      • \n"; + } + out() << "
      • Detailed Description
      • \n"; + for (int i = 0; i < toc.size(); ++i) { + if (toc.at(i)->string().toInt() == 1) { + detailsBase = 1; + break; + } + } + } + else if (sections && (node->type() == Node::Class)) { + QList
        ::ConstIterator s = sections->begin(); + while (s != sections->end()) { + if (!s->members.isEmpty() || !s->reimpMembers.isEmpty()) { + out() << "
      • " << (*s).name + << "
      • \n"; + } + ++s; + } + out() << "
      • Detailed Description
      • \n"; + for (int i = 0; i < toc.size(); ++i) { + if (toc.at(i)->string().toInt() == 1) { + detailsBase = 1; + break; + } + } + } + + for (int i = 0; i < toc.size(); ++i) { + Atom *atom = toc.at(i); + int nextLevel = atom->string().toInt() + detailsBase; + if (sectionNumber.size() < nextLevel) { + do { + sectionNumber.append("1"); + } while (sectionNumber.size() < nextLevel); + } + else { + while (sectionNumber.size() > nextLevel) { + sectionNumber.removeLast(); + } + sectionNumber.last() = QString::number(sectionNumber.last().toInt() + 1); + } + int numAtoms; + Text headingText = Text::sectionHeading(atom); + QString s = headingText.toString(); + out() << "
      • "; + out() << ""; + generateAtomList(headingText.firstAtom(), node, marker, true, numAtoms); + out() << "
      • \n"; + } + while (!sectionNumber.isEmpty()) { + sectionNumber.removeLast(); + } + out() << "
      \n"; + out() << "
      \n"; + inContents = false; + inLink = false; +} + +#if 0 +void DitaXmlGenerator::generateNavigationBar(const NavigationBar& bar, + const Node *node, + CodeMarker *marker) +{ + if (bar.prev.begin() != 0 || bar.current.begin() != 0 || + bar.next.begin() != 0) { + out() << "

      "; + if (bar.prev.begin() != 0) { +#if 0 + out() << "[Prev: "; + generateText(section.previousHeading(), node, marker); + out() << "]\n"; +#endif + } + if (bar.current.begin() != 0) { + out() << "[Home]\n"; + } + if (bar.next.begin() != 0) { + out() << "[Next: "; + generateText(Text::sectionHeading(bar.next.begin()), node, marker); + out() << "]\n"; + } + out() << "

      \n"; + } +} +#endif + +QString DitaXmlGenerator::generateListOfAllMemberFile(const InnerNode *inner, + CodeMarker *marker) +{ + QList
      sections; + QList
      ::ConstIterator s; + + sections = marker->sections(inner, + CodeMarker::SeparateList, + CodeMarker::Okay); + if (sections.isEmpty()) + return QString(); + + QString fileName = fileBase(inner) + "-members." + fileExtension(inner); + beginSubPage(inner->location(), fileName); + QString title = "List of All Members for " + inner->name(); + generateHeader(title, inner, marker); + generateTitle(title, Text(), SmallSubTitle, inner, marker); + out() << "

      This is the complete list of members for "; + generateFullName(inner, 0, marker); + out() << ", including inherited members.

      \n"; + + Section section = sections.first(); + generateSectionList(section, 0, marker, CodeMarker::SeparateList); + + generateFooter(); + endSubPage(); + return fileName; +} + +QString DitaXmlGenerator::generateLowStatusMemberFile(const InnerNode *inner, + CodeMarker *marker, + CodeMarker::Status status) +{ + QList
      sections = marker->sections(inner, + CodeMarker::Summary, + status); + QMutableListIterator
      j(sections); + while (j.hasNext()) { + if (j.next().members.size() == 0) + j.remove(); + } + if (sections.isEmpty()) + return QString(); + + int i; + + QString title; + QString fileName; + + if (status == CodeMarker::Compat) { + title = "Qt 3 Support Members for " + inner->name(); + fileName = fileBase(inner) + "-qt3." + fileExtension(inner); + } + else { + title = "Obsolete Members for " + inner->name(); + fileName = fileBase(inner) + "-obsolete." + fileExtension(inner); + } + + beginSubPage(inner->location(), fileName); + generateHeader(title, inner, marker); + generateTitle(title, Text(), SmallSubTitle, inner, marker); + + if (status == CodeMarker::Compat) { + out() << "

      The following class members are part of the " + "Qt 3 support layer. " + "They are provided to help you port old code to Qt 4. We advise against " + "using them in new code.

      \n"; + } + else { + out() << "

      The following class members are obsolete. " + << "They are provided to keep old source code working. " + << "We strongly advise against using them in new code.

      \n"; + } + + out() << "

      \n"; + + for (i = 0; i < sections.size(); ++i) { + out() << "

      " << protectEnc(sections.at(i).name) << "

      \n"; + generateSectionList(sections.at(i), inner, marker, CodeMarker::Summary); + } + + sections = marker->sections(inner, CodeMarker::Detailed, status); + for (i = 0; i < sections.size(); ++i) { + out() << "
      \n"; + out() << "

      " << protectEnc(sections.at(i).name) << "

      \n"; + + NodeList::ConstIterator m = sections.at(i).members.begin(); + while (m != sections.at(i).members.end()) { + if ((*m)->access() != Node::Private) + generateDetailedMember(*m, inner, marker); + ++m; + } + } + + generateFooter(); + endSubPage(); + return fileName; +} + +void DitaXmlGenerator::generateClassHierarchy(const Node *relative, + CodeMarker *marker, + const QMap &classMap) +{ + if (classMap.isEmpty()) + return; + + NodeMap topLevel; + NodeMap::ConstIterator c = classMap.begin(); + while (c != classMap.end()) { + const ClassNode *classe = static_cast(*c); + if (classe->baseClasses().isEmpty()) + topLevel.insert(classe->name(), classe); + ++c; + } + + QStack stack; + stack.push(topLevel); + + out() << "
        \n"; + while (!stack.isEmpty()) { + if (stack.top().isEmpty()) { + stack.pop(); + out() << "
      \n"; + } + else { + const ClassNode *child = + static_cast(*stack.top().begin()); + out() << "
    • "; + generateFullName(child, relative, marker); + out() << "
    • \n"; + stack.top().erase(stack.top().begin()); + + NodeMap newTop; + foreach (const RelatedClass &d, child->derivedClasses()) { + if (d.access != Node::Private) + newTop.insert(d.node->name(), d.node); + } + if (!newTop.isEmpty()) { + stack.push(newTop); + out() << "
        \n"; + } + } + } +} + +void DitaXmlGenerator::generateAnnotatedList(const Node *relative, + CodeMarker *marker, + const NodeMap &nodeMap) +{ + out() << "\n"; + + int row = 0; + foreach (const QString &name, nodeMap.keys()) { + const Node *node = nodeMap[name]; + + if (node->status() == Node::Obsolete) + continue; + + if (++row % 2 == 1) + out() << ""; + else + out() << ""; + out() << ""; + + if (!(node->type() == Node::Fake)) { + Text brief = node->doc().trimmedBriefText(name); + if (!brief.isEmpty()) { + out() << ""; + } + } + else { + out() << ""; + } + out() << "\n"; + } + out() << "

        "; + generateFullName(node, relative, marker); + out() << "

        "; + generateText(brief, node, marker); + out() << "

        "; + out() << protectEnc(node->doc().briefText().toString()); + out() << "

        \n"; +} + +/*! + This function finds the common prefix of the names of all + the classes in \a classMap and then generates a compact + list of the class names alphabetized on the part of the + name not including the common prefix. You can tell the + function to use \a comonPrefix as the common prefix, but + normally you let it figure it out itself by looking at + the name of the first and last classes in \a classMap. + */ +void DitaXmlGenerator::generateCompactList(const Node *relative, + CodeMarker *marker, + const NodeMap &classMap, + bool includeAlphabet, + QString commonPrefix) +{ + const int NumParagraphs = 37; // '0' to '9', 'A' to 'Z', '_' + + if (classMap.isEmpty()) + return; + + /* + If commonPrefix is not empty, then the caller knows what + the common prefix is and has passed it in, so just use that + one. + */ + int commonPrefixLen = commonPrefix.length(); + if (commonPrefixLen == 0) { + QString first; + QString last; + + /* + The caller didn't pass in a common prefix, so get the common + prefix by looking at the class names of the first and last + classes in the class map. Discard any namespace names and + just use the bare class names. For Qt, the prefix is "Q". + + Note that the algorithm used here to derive the common prefix + from the first and last classes in alphabetical order (QAccel + and QXtWidget in Qt 2.1), fails if either class name does not + begin with Q. + */ + + NodeMap::const_iterator iter = classMap.begin(); + while (iter != classMap.end()) { + if (!iter.key().contains("::")) { + first = iter.key(); + break; + } + ++iter; + } + + if (first.isEmpty()) + first = classMap.begin().key(); + + iter = classMap.end(); + while (iter != classMap.begin()) { + --iter; + if (!iter.key().contains("::")) { + last = iter.key(); + break; + } + } + + if (last.isEmpty()) + last = classMap.begin().key(); + + if (classMap.size() > 1) { + while (commonPrefixLen < first.length() + 1 && + commonPrefixLen < last.length() + 1 && + first[commonPrefixLen] == last[commonPrefixLen]) + ++commonPrefixLen; + } + + commonPrefix = first.left(commonPrefixLen); + } + + /* + Divide the data into 37 paragraphs: 0, ..., 9, A, ..., Z, + underscore (_). QAccel will fall in paragraph 10 (A) and + QXtWidget in paragraph 33 (X). This is the only place where we + assume that NumParagraphs is 37. Each paragraph is a NodeMap. + */ + NodeMap paragraph[NumParagraphs+1]; + QString paragraphName[NumParagraphs+1]; + QSet usedParagraphNames; + + NodeMap::ConstIterator c = classMap.begin(); + while (c != classMap.end()) { + QStringList pieces = c.key().split("::"); + QString key; + int idx = commonPrefixLen; + if (!pieces.last().startsWith(commonPrefix)) + idx = 0; + if (pieces.size() == 1) + key = pieces.last().mid(idx).toLower(); + else + key = pieces.last().toLower(); + + int paragraphNr = NumParagraphs - 1; + + if (key[0].digitValue() != -1) { + paragraphNr = key[0].digitValue(); + } + else if (key[0] >= QLatin1Char('a') && key[0] <= QLatin1Char('z')) { + paragraphNr = 10 + key[0].unicode() - 'a'; + } + + paragraphName[paragraphNr] = key[0].toUpper(); + usedParagraphNames.insert(key[0].toLower().cell()); + paragraph[paragraphNr].insert(key, c.value()); + ++c; + } + + /* + Each paragraph j has a size: paragraph[j].count(). In the + discussion, we will assume paragraphs 0 to 5 will have sizes + 3, 1, 4, 1, 5, 9. + + We now want to compute the paragraph offset. Paragraphs 0 to 6 + start at offsets 0, 3, 4, 8, 9, 14, 23. + */ + int paragraphOffset[NumParagraphs + 1]; // 37 + 1 + paragraphOffset[0] = 0; + for (int i=0; i"; + for (int i = 0; i < 26; i++) { + QChar ch('a' + i); + if (usedParagraphNames.contains(char('a' + i))) + out() << QString("%2 ").arg(ch).arg(ch.toUpper()); + } + out() << "

        \n"; + } + + /* + Output a
        element to contain all the
        elements. + */ + out() << "
        \n"; + + for (int i=0; i. + */ + if (curParOffset == 0) { + if (i > 0) + out() << "
        \n"; + if (++numTableRows % 2 == 1) + out() << "
        "; + else + out() << "
        "; + out() << "
        "; + if (includeAlphabet) { + QChar c = paragraphName[curParNr][0].toLower(); + out() << QString("").arg(c); + } + out() << "" + << paragraphName[curParNr] + << ""; + out() << "
        \n"; + } + + /* + Output a
        for the current offset in the current paragraph. + */ + out() << "
        "; + if ((curParNr < NumParagraphs) && + !paragraphName[curParNr].isEmpty()) { + NodeMap::Iterator it; + it = paragraph[curParNr].begin(); + for (int i=0; i"; + + QStringList pieces; + if (it.value()->subType() == Node::QmlClass) + pieces << it.value()->name(); + else + pieces = fullName(it.value(), relative, marker).split("::"); + out() << protectEnc(pieces.last()); + out() << ""; + if (pieces.size() > 1) { + out() << " ("; + generateFullName(it.value()->parent(), relative, marker); + out() << ")"; + } + } + out() << "
        \n"; + curParOffset++; + } + out() << "
        \n"; + out() << "
        \n"; +} + +void DitaXmlGenerator::generateFunctionIndex(const Node *relative, + CodeMarker *marker) +{ + out() << "

        "; + for (int i = 0; i < 26; i++) { + QChar ch('a' + i); + out() << QString("%2 ").arg(ch).arg(ch.toUpper()); + } + out() << "

        \n"; + + char nextLetter = 'a'; + char currentLetter; + +#if 1 + out() << "
          \n"; +#endif + QMap::ConstIterator f = funcIndex.begin(); + while (f != funcIndex.end()) { +#if 1 + out() << "
        • "; +#else + out() << "

          "; +#endif + out() << protectEnc(f.key()) << ":"; + + currentLetter = f.key()[0].unicode(); + while (islower(currentLetter) && currentLetter >= nextLetter) { + out() << QString("").arg(nextLetter); + nextLetter++; + } + + NodeMap::ConstIterator s = (*f).begin(); + while (s != (*f).end()) { + out() << " "; + generateFullName((*s)->parent(), relative, marker, *s); + ++s; + } +#if 1 + out() << "

        • "; +#else + out() << "

          "; +#endif + out() << "\n"; + ++f; + } +#if 1 + out() << "
        \n"; +#endif +} + +void DitaXmlGenerator::generateLegaleseList(const Node *relative, + CodeMarker *marker) +{ + QMap::ConstIterator it = legaleseTexts.begin(); + while (it != legaleseTexts.end()) { + Text text = it.key(); + out() << "
        \n"; + generateText(text, relative, marker); + out() << "
          \n"; + do { + out() << "
        • "; + generateFullName(it.value(), relative, marker); + out() << "
        • \n"; + ++it; + } while (it != legaleseTexts.end() && it.key() == text); + out() << "
        \n"; + } +} + +/*void DitaXmlGenerator::generateSynopsis(const Node *node, + const Node *relative, + CodeMarker *marker, + CodeMarker::SynopsisStyle style) +{ + QString marked = marker->markedUpSynopsis(node, relative, style); + QRegExp templateTag("(<[^@>]*>)"); + if (marked.indexOf(templateTag) != -1) { + QString contents = protectEnc(marked.mid(templateTag.pos(1), + templateTag.cap(1).length())); + marked.replace(templateTag.pos(1), templateTag.cap(1).length(), + contents); + } + marked.replace(QRegExp("<@param>([a-z]+)_([1-9n])"), + "\\1\\2"); + marked.replace("<@param>", ""); + marked.replace("", ""); + + if (style == CodeMarker::Summary) + marked.replace("@name>", "b>"); + + if (style == CodeMarker::SeparateList) { + QRegExp extraRegExp("<@extra>.*"); + extraRegExp.setMinimal(true); + marked.replace(extraRegExp, ""); + } + else { + marked.replace("<@extra>", "  "); + marked.replace("", ""); + } + + if (style != CodeMarker::Detailed) { + marked.replace("<@type>", ""); + marked.replace("", ""); + } + out() << highlightedCode(marked, marker, relative); +}*/ + +#ifdef QDOC_QML +void DitaXmlGenerator::generateQmlItem(const Node *node, + const Node *relative, + CodeMarker *marker, + bool summary) +{ + QString marked = marker->markedUpQmlItem(node,summary); + QRegExp templateTag("(<[^@>]*>)"); + if (marked.indexOf(templateTag) != -1) { + QString contents = protectEnc(marked.mid(templateTag.pos(1), + templateTag.cap(1).length())); + marked.replace(templateTag.pos(1), templateTag.cap(1).length(), + contents); + } + marked.replace(QRegExp("<@param>([a-z]+)_([1-9n])"), + "\\1\\2"); + marked.replace("<@param>", ""); + marked.replace("", ""); + + if (summary) + marked.replace("@name>", "b>"); + + marked.replace("<@extra>", ""); + marked.replace("", ""); + + if (summary) { + marked.replace("<@type>", ""); + marked.replace("", ""); + } + out() << highlightedCode(marked, marker, relative); +} +#endif + +void DitaXmlGenerator::generateOverviewList(const Node *relative, CodeMarker * /* marker */) +{ + QMap > fakeNodeMap; + QMap groupTitlesMap; + QMap uncategorizedNodeMap; + QRegExp singleDigit("\\b([0-9])\\b"); + + const NodeList children = myTree->root()->childNodes(); + foreach (Node *child, children) { + if (child->type() == Node::Fake && child != relative) { + FakeNode *fakeNode = static_cast(child); + + // Check whether the page is part of a group or is the group + // definition page. + QString group; + bool isGroupPage = false; + if (fakeNode->doc().metaCommandsUsed().contains("group")) { + group = fakeNode->doc().metaCommandArgs("group")[0]; + isGroupPage = true; + } + + // there are too many examples; they would clutter the list + if (fakeNode->subType() == Node::Example) + continue; + + // not interested either in individual (Qt Designer etc.) manual chapters + if (fakeNode->links().contains(Node::ContentsLink)) + continue; + + // Discard external nodes. + if (fakeNode->subType() == Node::ExternalPage) + continue; + + QString sortKey = fakeNode->fullTitle().toLower(); + if (sortKey.startsWith("the ")) + sortKey.remove(0, 4); + sortKey.replace(singleDigit, "0\\1"); + + if (!group.isEmpty()) { + if (isGroupPage) { + // If we encounter a group definition page, we add all + // the pages in that group to the list for that group. + foreach (Node *member, fakeNode->groupMembers()) { + if (member->type() != Node::Fake) + continue; + FakeNode *page = static_cast(member); + if (page) { + QString sortKey = page->fullTitle().toLower(); + if (sortKey.startsWith("the ")) + sortKey.remove(0, 4); + sortKey.replace(singleDigit, "0\\1"); + fakeNodeMap[const_cast(fakeNode)].insert(sortKey, page); + groupTitlesMap[fakeNode->fullTitle()] = const_cast(fakeNode); + } + } + } + else if (!isGroupPage) { + // If we encounter a page that belongs to a group then + // we add that page to the list for that group. + const FakeNode *groupNode = static_cast(myTree->root()->findNode(group, Node::Fake)); + if (groupNode) + fakeNodeMap[groupNode].insert(sortKey, fakeNode); + //else + // uncategorizedNodeMap.insert(sortKey, fakeNode); + }// else + // uncategorizedNodeMap.insert(sortKey, fakeNode); + }// else + // uncategorizedNodeMap.insert(sortKey, fakeNode); + } + } + + // We now list all the pages found that belong to groups. + // If only certain pages were found for a group, but the definition page + // for that group wasn't listed, the list of pages will be intentionally + // incomplete. However, if the group definition page was listed, all the + // pages in that group are listed for completeness. + + if (!fakeNodeMap.isEmpty()) { + foreach (const QString &groupTitle, groupTitlesMap.keys()) { + const FakeNode *groupNode = groupTitlesMap[groupTitle]; + out() << QString("

        %2

        \n").arg( + linkForNode(groupNode, relative)).arg( + protectEnc(groupNode->fullTitle())); + + if (fakeNodeMap[groupNode].count() == 0) + continue; + + out() << "
          \n"; + + foreach (const FakeNode *fakeNode, fakeNodeMap[groupNode]) { + QString title = fakeNode->fullTitle(); + if (title.startsWith("The ")) + title.remove(0, 4); + out() << "
        • " + << protectEnc(title) << "
        • \n"; + } + out() << "
        \n"; + } + } + + if (!uncategorizedNodeMap.isEmpty()) { + out() << QString("

        Miscellaneous

        \n"); + out() << "
          \n"; + foreach (const FakeNode *fakeNode, uncategorizedNodeMap) { + QString title = fakeNode->fullTitle(); + if (title.startsWith("The ")) + title.remove(0, 4); + out() << "
        • " + << protectEnc(title) << "
        • \n"; + } + out() << "
        \n"; + } +} + +#ifdef QDOC_NAME_ALIGNMENT +void DitaXmlGenerator::generateSection(const NodeList& nl, + const Node *relative, + CodeMarker *marker, + CodeMarker::SynopsisStyle style) +{ + bool name_alignment = true; + if (!nl.isEmpty()) { + bool twoColumn = false; + if (style == CodeMarker::SeparateList) { + name_alignment = false; + twoColumn = (nl.count() >= 16); + } + else if (nl.first()->type() == Node::Property) { + twoColumn = (nl.count() >= 5); + name_alignment = false; + } + if (name_alignment) { + out() << "\n"; + } + else { + if (twoColumn) + out() << "
        \n" + << "\n"; + else + out() << "\n"; + i++; + ++m; + } + if (name_alignment) + out() << "
        "; + out() << "
          \n"; + } + + int i = 0; + NodeList::ConstIterator m = nl.begin(); + while (m != nl.end()) { + if ((*m)->access() == Node::Private) { + ++m; + continue; + } + + if (name_alignment) { + out() << "
        "; + } + else { + if (twoColumn && i == (int) (nl.count() + 1) / 2) + out() << "
          \n"; + out() << "
        • "; + } + + generateSynopsis(*m, relative, marker, style, name_alignment); + if (name_alignment) + out() << "
        \n"; + else { + out() << "
      \n"; + if (twoColumn) + out() << "\n\n"; + } + } +} + +void DitaXmlGenerator::generateSectionList(const Section& section, + const Node *relative, + CodeMarker *marker, + CodeMarker::SynopsisStyle style) +{ + bool name_alignment = true; + if (!section.members.isEmpty()) { + bool twoColumn = false; + if (style == CodeMarker::SeparateList) { + name_alignment = false; + twoColumn = (section.members.count() >= 16); + } + else if (section.members.first()->type() == Node::Property) { + twoColumn = (section.members.count() >= 5); + name_alignment = false; + } + if (name_alignment) { + out() << "\n"; + } + else { + if (twoColumn) + out() << "
      \n" + << "\n"; + else + out() << "\n"; + i++; + ++m; + } + if (name_alignment) + out() << "
      "; + out() << "
        \n"; + } + + int i = 0; + NodeList::ConstIterator m = section.members.begin(); + while (m != section.members.end()) { + if ((*m)->access() == Node::Private) { + ++m; + continue; + } + + if (name_alignment) { + out() << "
      "; + } + else { + if (twoColumn && i == (int) (section.members.count() + 1) / 2) + out() << "
        \n"; + out() << "
      • "; + } + + generateSynopsis(*m, relative, marker, style, name_alignment); + if (name_alignment) + out() << "
      \n"; + else { + out() << "
    \n"; + if (twoColumn) + out() << "\n\n"; + } + } + + if (style == CodeMarker::Summary && !section.inherited.isEmpty()) { + out() << "
      \n"; + generateSectionInheritedList(section, relative, marker, name_alignment); + out() << "
    \n"; + } +} + +void DitaXmlGenerator::generateSectionInheritedList(const Section& section, + const Node *relative, + CodeMarker *marker, + bool nameAlignment) +{ + QList >::ConstIterator p = section.inherited.begin(); + while (p != section.inherited.end()) { + if (nameAlignment) + out() << "
  • "; + else + out() << "
  • "; + out() << (*p).second << " "; + if ((*p).second == 1) { + out() << section.singularMember; + } + else { + out() << section.pluralMember; + } + out() << " inherited from " + << protectEnc(marker->plainFullName((*p).first, relative)) + << "
  • \n"; + ++p; + } +} + +void DitaXmlGenerator::generateSynopsis(const Node *node, + const Node *relative, + CodeMarker *marker, + CodeMarker::SynopsisStyle style, + bool nameAlignment) +{ + QString marked = marker->markedUpSynopsis(node, relative, style); + QRegExp templateTag("(<[^@>]*>)"); + if (marked.indexOf(templateTag) != -1) { + QString contents = protectEnc(marked.mid(templateTag.pos(1), + templateTag.cap(1).length())); + marked.replace(templateTag.pos(1), templateTag.cap(1).length(), + contents); + } + marked.replace(QRegExp("<@param>([a-z]+)_([1-9n])"), + "\\1\\2"); + marked.replace("<@param>", ""); + marked.replace("", ""); + + if (style == CodeMarker::Summary) { + marked.replace("<@name>", ""); // was "" + marked.replace("", ""); // was "" + } + + if (style == CodeMarker::SeparateList) { + QRegExp extraRegExp("<@extra>.*"); + extraRegExp.setMinimal(true); + marked.replace(extraRegExp, ""); + } else { + marked.replace("<@extra>", ""); + marked.replace("", ""); + } + + if (style != CodeMarker::Detailed) { + marked.replace("<@type>", ""); + marked.replace("", ""); + } + out() << highlightedCode(marked, marker, relative, style, nameAlignment); +} + +QString DitaXmlGenerator::highlightedCode(const QString& markedCode, + CodeMarker *marker, + const Node *relative, + CodeMarker::SynopsisStyle , + bool nameAlignment) +{ + QString src = markedCode; + QString html; + QStringRef arg; + QStringRef par1; + + const QChar charLangle = '<'; + const QChar charAt = '@'; + + // replace all <@link> tags: "(<@link node=\"([^\"]+)\">).*()" + static const QString linkTag("link"); + bool done = false; + for (int i = 0, n = src.size(); i < n;) { + if (src.at(i) == charLangle && src.at(i + 1).unicode() == '@') { + if (nameAlignment && !done) {// && (i != 0)) Why was this here? + html += ""; + done = true; + } + i += 2; + if (parseArg(src, linkTag, &i, n, &arg, &par1)) { + html += ""; + QString link = linkForNode( + CodeMarker::nodeForString(par1.toString()), relative); + addLink(link, arg, &html); + html += ""; + } + else { + html += charLangle; + html += charAt; + } + } + else { + html += src.at(i++); + } + } + + + if (slow) { + // is this block ever used at all? + // replace all <@func> tags: "(<@func target=\"([^\"]*)\">)(.*)()" + src = html; + html = QString(); + static const QString funcTag("func"); + for (int i = 0, n = src.size(); i < n;) { + if (src.at(i) == charLangle && src.at(i + 1) == charAt) { + i += 2; + if (parseArg(src, funcTag, &i, n, &arg, &par1)) { + QString link = linkForNode( + marker->resolveTarget(par1.toString(), + myTree, + relative), + relative); + addLink(link, arg, &html); + par1 = QStringRef(); + } + else { + html += charLangle; + html += charAt; + } + } + else { + html += src.at(i++); + } + } + } + + // replace all "(<@(type|headerfile|func)(?: +[^>]*)?>)(.*)()" tags + src = html; + html = QString(); + static const QString typeTags[] = { "type", "headerfile", "func" }; + for (int i = 0, n = src.size(); i < n;) { + if (src.at(i) == charLangle && src.at(i + 1) == charAt) { + i += 2; + bool handled = false; + for (int k = 0; k != 3; ++k) { + if (parseArg(src, typeTags[k], &i, n, &arg, &par1)) { + par1 = QStringRef(); + QString link = linkForNode( + marker->resolveTarget(arg.toString(), myTree, relative), + relative); + addLink(link, arg, &html); + handled = true; + break; + } + } + if (!handled) { + html += charLangle; + html += charAt; + } + } + else { + html += src.at(i++); + } + } + + // replace all + // "<@comment>" -> ""; + // "<@preprocessor>" -> ""; + // "<@string>" -> ""; + // "<@char>" -> ""; + // "" -> "" + src = html; + html = QString(); + static const QString spanTags[] = { + "<@comment>", "", + "<@preprocessor>", "", + "<@string>", "", + "<@char>", "", + "", "", + "","", + "", "", + "", "" + // "<@char>", "", + // "", "", + // "<@func>", "", + // "", "", + // "<@id>", "", + // "", "", + // "<@keyword>", "", + // "", "", + // "<@number>", "", + // "", "", + // "<@op>", "", + // "", "", + // "<@param>", "", + // "", "", + // "<@string>", "", + // "", "", + }; + for (int i = 0, n = src.size(); i < n;) { + if (src.at(i) == charLangle) { + bool handled = false; + for (int k = 0; k != 8; ++k) { + const QString & tag = spanTags[2 * k]; + if (tag == QStringRef(&src, i, tag.length())) { + html += spanTags[2 * k + 1]; + i += tag.length(); + handled = true; + break; + } + } + if (!handled) { + ++i; + if (src.at(i) == charAt || + (src.at(i) == QLatin1Char('/') && src.at(i + 1) == charAt)) { + // drop 'our' unknown tags (the ones still containing '@') + while (i < n && src.at(i) != QLatin1Char('>')) + ++i; + ++i; + } + else { + // retain all others + html += charLangle; + } + } + } + else { + html += src.at(i); + ++i; + } + } + + return html; +} + +#else +void DitaXmlGenerator::generateSectionList(const Section& section, + const Node *relative, + CodeMarker *marker, + CodeMarker::SynopsisStyle style) +{ + if (!section.members.isEmpty()) { + bool twoColumn = false; + if (style == CodeMarker::SeparateList) { + twoColumn = (section.members.count() >= 16); + } + else if (section.members.first()->type() == Node::Property) { + twoColumn = (section.members.count() >= 5); + } + if (twoColumn) + out() << "\n"; + if (++numTableRows % 2 == 1) + out() << ""; + else + out() << ""; + +// << "\n
    "; + out() << "
      \n"; + + int i = 0; + NodeList::ConstIterator m = section.members.begin(); + while (m != section.members.end()) { + if ((*m)->access() == Node::Private) { + ++m; + continue; + } + + if (twoColumn && i == (int) (section.members.count() + 1) / 2) + out() << "
      \n"; + + out() << "
    • "; + if (style == CodeMarker::Accessors) + out() << ""; + generateSynopsis(*m, relative, marker, style); + if (style == CodeMarker::Accessors) + out() << ""; + out() << "
    • \n"; + i++; + ++m; + } + out() << "
    \n"; + if (twoColumn) + out() << "
    \n"; + } + + if (style == CodeMarker::Summary && !section.inherited.isEmpty()) { + out() << "
      \n"; + generateSectionInheritedList(section, relative, marker); + out() << "
    \n"; + } +} + +void DitaXmlGenerator::generateSectionInheritedList(const Section& section, + const Node *relative, + CodeMarker *marker) +{ + QList >::ConstIterator p = section.inherited.begin(); + while (p != section.inherited.end()) { + out() << "
  • "; + out() << (*p).second << " "; + if ((*p).second == 1) { + out() << section.singularMember; + } else { + out() << section.pluralMember; + } + out() << " inherited from " + << protectEnc(marker->plainFullName((*p).first, relative)) + << "
  • \n"; + ++p; + } +} + +void DitaXmlGenerator::generateSynopsis(const Node *node, + const Node *relative, + CodeMarker *marker, + CodeMarker::SynopsisStyle style) +{ + QString marked = marker->markedUpSynopsis(node, relative, style); + QRegExp templateTag("(<[^@>]*>)"); + if (marked.indexOf(templateTag) != -1) { + QString contents = protectEnc(marked.mid(templateTag.pos(1), + templateTag.cap(1).length())); + marked.replace(templateTag.pos(1), templateTag.cap(1).length(), + contents); + } + marked.replace(QRegExp("<@param>([a-z]+)_([1-9n])"), "\\1\\2"); + marked.replace("<@param>", ""); + marked.replace("", ""); + + if (style == CodeMarker::Summary) + marked.replace("@name>", "b>"); + + if (style == CodeMarker::SeparateList) { + QRegExp extraRegExp("<@extra>.*"); + extraRegExp.setMinimal(true); + marked.replace(extraRegExp, ""); + } else { + marked.replace("<@extra>", ""); + marked.replace("", ""); + } + + if (style != CodeMarker::Detailed) { + marked.replace("<@type>", ""); + marked.replace("", ""); + } + out() << highlightedCode(marked, marker, relative); +} + +QString DitaXmlGenerator::highlightedCode(const QString& markedCode, + CodeMarker *marker, + const Node *relative) +{ + QString src = markedCode; + QString html; + QStringRef arg; + QStringRef par1; + + const QChar charLangle = '<'; + const QChar charAt = '@'; + + // replace all <@link> tags: "(<@link node=\"([^\"]+)\">).*()" + static const QString linkTag("link"); + for (int i = 0, n = src.size(); i < n;) { + if (src.at(i) == charLangle && src.at(i + 1) == charAt) { + i += 2; + if (parseArg(src, linkTag, &i, n, &arg, &par1)) { + const Node* node = CodeMarker::nodeForString(par1.toString()); + QString link = linkForNode(node, relative); + addLink(link, arg, &html); + } + else { + html += charLangle; + html += charAt; + } + } + else { + html += src.at(i++); + } + } + + if (slow) { + // is this block ever used at all? + // replace all <@func> tags: "(<@func target=\"([^\"]*)\">)(.*)()" + src = html; + html = QString(); + static const QString funcTag("func"); + for (int i = 0, n = src.size(); i < n;) { + if (src.at(i) == charLangle && src.at(i + 1) == charAt) { + i += 2; + if (parseArg(src, funcTag, &i, n, &arg, &par1)) { + QString link = linkForNode( + marker->resolveTarget(par1.toString(), + myTree, + relative), + relative); + addLink(link, arg, &html); + par1 = QStringRef(); + } + else { + html += charLangle; + html += charAt; + } + } + else { + html += src.at(i++); + } + } + } + + // replace all "(<@(type|headerfile|func)(?: +[^>]*)?>)(.*)()" tags + src = html; + html = QString(); + static const QString typeTags[] = { "type", "headerfile", "func" }; + for (int i = 0, n = src.size(); i < n;) { + if (src.at(i) == charLangle && src.at(i + 1) == charAt) { + i += 2; + bool handled = false; + for (int k = 0; k != 3; ++k) { + if (parseArg(src, typeTags[k], &i, n, &arg, &par1)) { + par1 = QStringRef(); + QString link = linkForNode( + marker->resolveTarget(arg.toString(), myTree, relative), + relative); + addLink(link, arg, &html); + handled = true; + break; + } + } + if (!handled) { + html += charLangle; + html += charAt; + } + } + else { + html += src.at(i++); + } + } + + // replace all + // "<@comment>" -> ""; + // "<@preprocessor>" -> ""; + // "<@string>" -> ""; + // "<@char>" -> ""; + // "" -> "" + src = html; + html = QString(); + static const QString spanTags[] = { + "<@comment>", "", + "<@preprocessor>", "", + "<@string>", "", + "<@char>", "", + "", "", + "","", + "", "", + "", "" + // "<@char>", "", + // "", "", + // "<@func>", "", + // "", "", + // "<@id>", "", + // "", "", + // "<@keyword>", "", + // "", "", + // "<@number>", "", + // "", "", + // "<@op>", "", + // "", "", + // "<@param>", "", + // "", "", + // "<@string>", "", + // "", "", + }; + for (int i = 0, n = src.size(); i < n;) { + if (src.at(i) == charLangle) { + bool handled = false; + for (int k = 0; k != 8; ++k) { + const QString & tag = spanTags[2 * k]; + if (tag == QStringRef(&src, i, tag.length())) { + html += spanTags[2 * k + 1]; + i += tag.length(); + handled = true; + break; + } + } + if (!handled) { + ++i; + if (src.at(i) == charAt || + (src.at(i) == QLatin1Char('/') && src.at(i + 1) == charAt)) { + // drop 'our' unknown tags (the ones still containing '@') + while (i < n && src.at(i) != QLatin1Char('>')) + ++i; + ++i; + } + else { + // retain all others + html += charLangle; + } + } + } + else { + html += src.at(i); + ++i; + } + } + + return html; +} +#endif + +void DitaXmlGenerator::generateLink(const Atom* atom, + const Node* /* relative */, + CodeMarker* marker) +{ + static QRegExp camelCase("[A-Z][A-Z][a-z]|[a-z][A-Z0-9]|_"); + + if (funcLeftParen.indexIn(atom->string()) != -1 && marker->recognizeLanguage("Cpp")) { + // hack for C++: move () outside of link + int k = funcLeftParen.pos(1); + out() << protectEnc(atom->string().left(k)); + if (link.isEmpty()) { + if (showBrokenLinks) + out() << ""; + } else { + out() << ""; + } + inLink = false; + out() << protectEnc(atom->string().mid(k)); + } else if (marker->recognizeLanguage("Java")) { + // hack for Java: remove () and use when appropriate + bool func = atom->string().endsWith("()"); + bool tt = (func || atom->string().contains(camelCase)); + if (tt) + out() << ""; + if (func) { + out() << protectEnc(atom->string().left(atom->string().length() - 2)); + } else { + out() << protectEnc(atom->string()); + } + out() << ""; + } else { + out() << protectEnc(atom->string()); + } +} + +QString DitaXmlGenerator::cleanRef(const QString& ref) +{ + QString clean; + + if (ref.isEmpty()) + return clean; + + clean.reserve(ref.size() + 20); + const QChar c = ref[0]; + const uint u = c.unicode(); + + if ((u >= 'a' && u <= 'z') || + (u >= 'A' && u <= 'Z') || + (u >= '0' && u <= '9')) { + clean += c; + } else if (u == '~') { + clean += "dtor."; + } else if (u == '_') { + clean += "underscore."; + } else { + clean += "A"; + } + + for (int i = 1; i < (int) ref.length(); i++) { + const QChar c = ref[i]; + const uint u = c.unicode(); + if ((u >= 'a' && u <= 'z') || + (u >= 'A' && u <= 'Z') || + (u >= '0' && u <= '9') || u == '-' || + u == '_' || u == ':' || u == '.') { + clean += c; + } else if (c.isSpace()) { + clean += "-"; + } else if (u == '!') { + clean += "-not"; + } else if (u == '&') { + clean += "-and"; + } else if (u == '<') { + clean += "-lt"; + } else if (u == '=') { + clean += "-eq"; + } else if (u == '>') { + clean += "-gt"; + } else if (u == '#') { + clean += "#"; + } else { + clean += "-"; + clean += QString::number((int)u, 16); + } + } + return clean; +} + +QString DitaXmlGenerator::registerRef(const QString& ref) +{ + QString clean = DitaXmlGenerator::cleanRef(ref); + + for (;;) { + QString& prevRef = refMap[clean.toLower()]; + if (prevRef.isEmpty()) { + prevRef = ref; + break; + } else if (prevRef == ref) { + break; + } + clean += "x"; + } + return clean; +} + +QString DitaXmlGenerator::protectEnc(const QString &string) +{ + return protect(string, outputEncoding); +} + +QString DitaXmlGenerator::protect(const QString &string, const QString &outputEncoding) +{ +#define APPEND(x) \ + if (html.isEmpty()) { \ + html = string; \ + html.truncate(i); \ + } \ + html += (x); + + QString html; + int n = string.length(); + + for (int i = 0; i < n; ++i) { + QChar ch = string.at(i); + + if (ch == QLatin1Char('&')) { + APPEND("&"); + } else if (ch == QLatin1Char('<')) { + APPEND("<"); + } else if (ch == QLatin1Char('>')) { + APPEND(">"); + } else if (ch == QLatin1Char('"')) { + APPEND("""); + } else if ((outputEncoding == "ISO-8859-1" && ch.unicode() > 0x007F) + || (ch == QLatin1Char('*') && i + 1 < n && string.at(i) == QLatin1Char('/')) + || (ch == QLatin1Char('.') && i > 2 && string.at(i - 2) == QLatin1Char('.'))) { + // we escape '*/' and the last dot in 'e.g.' and 'i.e.' for the Javadoc generator + APPEND("&#x"); + html += QString::number(ch.unicode(), 16); + html += QLatin1Char(';'); + } else { + if (!html.isEmpty()) + html += ch; + } + } + + if (!html.isEmpty()) + return html; + return string; + +#undef APPEND +} + +QString DitaXmlGenerator::fileBase(const Node *node) +{ + QString result; + + result = PageGenerator::fileBase(node); + + if (!node->isInnerNode()) { + switch (node->status()) { + case Node::Compat: + result += "-qt3"; + break; + case Node::Obsolete: + result += "-obsolete"; + break; + default: + ; + } + } + return result; +} + +#if 0 +QString DitaXmlGenerator::fileBase(const Node *node, + const SectionIterator& section) +{ + QStringList::ConstIterator s = section.sectionNumber().end(); + QStringList::ConstIterator b = section.baseNameStack().end(); + + QString suffix; + QString base = fileBase(node); + + while (s != section.sectionNumber().begin()) { + --s; + --b; + if (!(*b).isEmpty()) { + base = *b; + break; + } + suffix.prepend("-" + *s); + } + return base + suffix; +} +#endif + +QString DitaXmlGenerator::fileName(const Node *node) +{ + if (node->type() == Node::Fake) { + if (static_cast(node)->subType() == Node::ExternalPage) + return node->name(); + if (static_cast(node)->subType() == Node::Image) + return node->name(); + } + return PageGenerator::fileName(node); +} + +QString DitaXmlGenerator::refForNode(const Node *node) +{ + const FunctionNode *func; + const TypedefNode *typedeffe; + QString ref; + + switch (node->type()) { + case Node::Namespace: + case Node::Class: + default: + break; + case Node::Enum: + ref = node->name() + "-enum"; + break; + case Node::Typedef: + typedeffe = static_cast(node); + if (typedeffe->associatedEnum()) { + return refForNode(typedeffe->associatedEnum()); + } + else { + ref = node->name() + "-typedef"; + } + break; + case Node::Function: + func = static_cast(node); + if (func->associatedProperty()) { + return refForNode(func->associatedProperty()); + } + else { + ref = func->name(); + if (func->overloadNumber() != 1) + ref += "-" + QString::number(func->overloadNumber()); + } + break; +#ifdef QDOC_QML + case Node::Fake: + if (node->subType() != Node::QmlPropertyGroup) + break; + case Node::QmlProperty: +#endif + case Node::Property: + ref = node->name() + "-prop"; + break; +#ifdef QDOC_QML + case Node::QmlSignal: + ref = node->name() + "-signal"; + break; + case Node::QmlMethod: + ref = node->name() + "-method"; + break; +#endif + case Node::Variable: + ref = node->name() + "-var"; + break; + case Node::Target: + return protectEnc(node->name()); + } + return registerRef(ref); +} + +QString DitaXmlGenerator::linkForNode(const Node *node, const Node *relative) +{ + QString link; + QString fn; + QString ref; + + if (node == 0 || node == relative) + return QString(); + if (!node->url().isEmpty()) + return node->url(); + if (fileBase(node).isEmpty()) + return QString(); + if (node->access() == Node::Private) + return QString(); + + fn = fileName(node); +/* if (!node->url().isEmpty()) + return fn;*/ +#if 0 + // ### reintroduce this test, without breaking .dcf files + if (fn != outFileName()) +#endif + link += fn; + + if (!node->isInnerNode() || node->subType() == Node::QmlPropertyGroup) { + ref = refForNode(node); + if (relative && fn == fileName(relative) && ref == refForNode(relative)) + return QString(); + + link += "#"; + link += ref; + } + return link; +} + +QString DitaXmlGenerator::refForAtom(Atom *atom, const Node * /* node */) +{ + if (atom->type() == Atom::SectionLeft) { + return Doc::canonicalTitle(Text::sectionHeading(atom).toString()); + } + else if (atom->type() == Atom::Target) { + return Doc::canonicalTitle(atom->string()); + } + else { + return QString(); + } +} + +void DitaXmlGenerator::generateFullName(const Node *apparentNode, + const Node *relative, + CodeMarker *marker, + const Node *actualNode) +{ + if (actualNode == 0) + actualNode = apparentNode; + out() << "status() != actualNode->status()) { + switch (actualNode->status()) { + case Node::Obsolete: + out() << "\" class=\"obsolete"; + break; + case Node::Compat: + out() << "\" class=\"compat"; + break; + default: + ; + } + } + out() << "\">"; + out() << protectEnc(fullName(apparentNode, relative, marker)); + out() << ""; +} + +void DitaXmlGenerator::generateDetailedMember(const Node *node, + const InnerNode *relative, + CodeMarker *marker) +{ + const EnumNode *enume; + +#ifdef GENERATE_MAC_REFS + generateMacRef(node, marker); +#endif + if (node->type() == Node::Enum + && (enume = static_cast(node))->flagsType()) { +#ifdef GENERATE_MAC_REFS + generateMacRef(enume->flagsType(), marker); +#endif + out() << "

    "; + out() << ""; + generateSynopsis(enume, relative, marker, CodeMarker::Detailed); + out() << "
    "; + generateSynopsis(enume->flagsType(), + relative, + marker, + CodeMarker::Detailed); + out() << "

    \n"; + } + else { + out() << "

    "; + out() << ""; + generateSynopsis(node, relative, marker, CodeMarker::Detailed); + out() << "

    \n"; + } + + generateStatus(node, marker); + generateBody(node, marker); + generateThreadSafeness(node, marker); + generateSince(node, marker); + + if (node->type() == Node::Property) { + const PropertyNode *property = static_cast(node); + Section section; + + section.members += property->getters(); + section.members += property->setters(); + section.members += property->resetters(); + + if (!section.members.isEmpty()) { + out() << "

    Access functions:

    \n"; + generateSectionList(section, node, marker, CodeMarker::Accessors); + } + + Section notifiers; + notifiers.members += property->notifiers(); + + if (!notifiers.members.isEmpty()) { + out() << "

    Notifier signal:

    \n"; + //out() << "

    This signal is emitted when the property value is changed.

    \n"; + generateSectionList(notifiers, node, marker, CodeMarker::Accessors); + } + } + else if (node->type() == Node::Enum) { + const EnumNode *enume = static_cast(node); + if (enume->flagsType()) { + out() << "

    The " << protectEnc(enume->flagsType()->name()) + << " type is a typedef for " + << "QFlags<" + << protectEnc(enume->name()) + << ">. It stores an OR combination of " + << protectEnc(enume->name()) + << " values.

    \n"; + } + } + generateAlsoList(node, marker); +} + +void DitaXmlGenerator::findAllClasses(const InnerNode *node) +{ + NodeList::const_iterator c = node->childNodes().constBegin(); + while (c != node->childNodes().constEnd()) { + if ((*c)->access() != Node::Private && (*c)->url().isEmpty()) { + if ((*c)->type() == Node::Class && !(*c)->doc().isEmpty()) { + QString className = (*c)->name(); + if ((*c)->parent() && + (*c)->parent()->type() == Node::Namespace && + !(*c)->parent()->name().isEmpty()) + className = (*c)->parent()->name()+"::"+className; + + if (!(static_cast(*c))->hideFromMainList()) { + if ((*c)->status() == Node::Compat) { + compatClasses.insert(className, *c); + } + else if ((*c)->status() == Node::Obsolete) { + obsoleteClasses.insert(className, *c); + } + else { + nonCompatClasses.insert(className, *c); + if ((*c)->status() == Node::Main) + mainClasses.insert(className, *c); + } + } + + QString moduleName = (*c)->moduleName(); + if (moduleName == "Qt3SupportLight") { + moduleClassMap[moduleName].insert((*c)->name(), *c); + moduleName = "Qt3Support"; + } + if (!moduleName.isEmpty()) + moduleClassMap[moduleName].insert((*c)->name(), *c); + + QString serviceName = + (static_cast(*c))->serviceName(); + if (!serviceName.isEmpty()) + serviceClasses.insert(serviceName, *c); + } + else if ((*c)->isInnerNode()) { + findAllClasses(static_cast(*c)); + } + } + ++c; + } +} + +/*! + For generating the "New Classes... in 4.6" section on the + What's New in 4.6" page. + */ +void DitaXmlGenerator::findAllSince(const InnerNode *node) +{ + NodeList::const_iterator child = node->childNodes().constBegin(); + while (child != node->childNodes().constEnd()) { + QString sinceVersion = (*child)->since(); + if (((*child)->access() != Node::Private) && !sinceVersion.isEmpty()) { + NewSinceMaps::iterator nsmap = newSinceMaps.find(sinceVersion); + if (nsmap == newSinceMaps.end()) + nsmap = newSinceMaps.insert(sinceVersion,NodeMultiMap()); + NewClassMaps::iterator ncmap = newClassMaps.find(sinceVersion); + if (ncmap == newClassMaps.end()) + ncmap = newClassMaps.insert(sinceVersion,NodeMap()); + NewClassMaps::iterator nqcmap = newQmlClassMaps.find(sinceVersion); + if (nqcmap == newQmlClassMaps.end()) + nqcmap = newQmlClassMaps.insert(sinceVersion,NodeMap()); + + if ((*child)->type() == Node::Function) { + FunctionNode *func = static_cast(*child); + if ((func->status() > Node::Obsolete) && + (func->metaness() != FunctionNode::Ctor) && + (func->metaness() != FunctionNode::Dtor)) { + nsmap.value().insert(func->name(),(*child)); + } + } + else if ((*child)->url().isEmpty()) { + if ((*child)->type() == Node::Class && !(*child)->doc().isEmpty()) { + QString className = (*child)->name(); + if ((*child)->parent() && + (*child)->parent()->type() == Node::Namespace && + !(*child)->parent()->name().isEmpty()) + className = (*child)->parent()->name()+"::"+className; + nsmap.value().insert(className,(*child)); + ncmap.value().insert(className,(*child)); + } + else if ((*child)->subType() == Node::QmlClass) { + QString className = (*child)->name(); + if ((*child)->parent() && + (*child)->parent()->type() == Node::Namespace && + !(*child)->parent()->name().isEmpty()) + className = (*child)->parent()->name()+"::"+className; + nsmap.value().insert(className,(*child)); + nqcmap.value().insert(className,(*child)); + } + } + else { + QString name = (*child)->name(); + if ((*child)->parent() && + (*child)->parent()->type() == Node::Namespace && + !(*child)->parent()->name().isEmpty()) + name = (*child)->parent()->name()+"::"+name; + nsmap.value().insert(name,(*child)); + } + if ((*child)->isInnerNode()) { + findAllSince(static_cast(*child)); + } + } + ++child; + } +} + +#if 0 + const QRegExp versionSeparator("[\\-\\.]"); + const int minorIndex = version.indexOf(versionSeparator); + const int patchIndex = version.indexOf(versionSeparator, minorIndex+1); + version = version.left(patchIndex); +#endif + +void DitaXmlGenerator::findAllFunctions(const InnerNode *node) +{ + NodeList::ConstIterator c = node->childNodes().begin(); + while (c != node->childNodes().end()) { + if ((*c)->access() != Node::Private) { + if ((*c)->isInnerNode() && (*c)->url().isEmpty()) { + findAllFunctions(static_cast(*c)); + } + else if ((*c)->type() == Node::Function) { + const FunctionNode *func = static_cast(*c); + if ((func->status() > Node::Obsolete) && + (func->metaness() != FunctionNode::Ctor) && + (func->metaness() != FunctionNode::Dtor)) { + funcIndex[(*c)->name()].insert(myTree->fullDocumentName((*c)->parent()), *c); + } + } + } + ++c; + } +} + +void DitaXmlGenerator::findAllLegaleseTexts(const InnerNode *node) +{ + NodeList::ConstIterator c = node->childNodes().begin(); + while (c != node->childNodes().end()) { + if ((*c)->access() != Node::Private) { + if (!(*c)->doc().legaleseText().isEmpty()) + legaleseTexts.insertMulti((*c)->doc().legaleseText(), *c); + if ((*c)->isInnerNode()) + findAllLegaleseTexts(static_cast(*c)); + } + ++c; + } +} + +void DitaXmlGenerator::findAllNamespaces(const InnerNode *node) +{ + NodeList::ConstIterator c = node->childNodes().begin(); + while (c != node->childNodes().end()) { + if ((*c)->access() != Node::Private) { + if ((*c)->isInnerNode() && (*c)->url().isEmpty()) { + findAllNamespaces(static_cast(*c)); + if ((*c)->type() == Node::Namespace) { + const NamespaceNode *nspace = static_cast(*c); + // Ensure that the namespace's name is not empty (the root + // namespace has no name). + if (!nspace->name().isEmpty()) { + namespaceIndex.insert(nspace->name(), *c); + QString moduleName = (*c)->moduleName(); + if (moduleName == "Qt3SupportLight") { + moduleNamespaceMap[moduleName].insert((*c)->name(), *c); + moduleName = "Qt3Support"; + } + if (!moduleName.isEmpty()) + moduleNamespaceMap[moduleName].insert((*c)->name(), *c); + } + } + } + } + ++c; + } +} + +#ifdef ZZZ_QDOC_QML +/*! + This function finds all the qml element nodes and + stores them in a map for later use. + */ +void DitaXmlGenerator::findAllQmlClasses(const InnerNode *node) +{ + NodeList::const_iterator c = node->childNodes().constBegin(); + while (c != node->childNodes().constEnd()) { + if ((*c)->type() == Node::Fake) { + const FakeNode* fakeNode = static_cast(*c); + if (fakeNode->subType() == Node::QmlClass) { + const QmlClassNode* qmlNode = + static_cast(fakeNode); + const Node* n = qmlNode->classNode(); + } + qmlClasses.insert(fakeNode->name(),*c); + } + ++c; + } +} +#endif + +int DitaXmlGenerator::hOffset(const Node *node) +{ + switch (node->type()) { + case Node::Namespace: + case Node::Class: + return 2; + case Node::Fake: + return 1; +#if 0 + if (node->doc().briefText().isEmpty()) + return 1; + else + return 2; +#endif + case Node::Enum: + case Node::Typedef: + case Node::Function: + case Node::Property: + default: + return 3; + } +} + +bool DitaXmlGenerator::isThreeColumnEnumValueTable(const Atom *atom) +{ + while (atom != 0 && !(atom->type() == Atom::ListRight && atom->string() == ATOM_LIST_VALUE)) { + if (atom->type() == Atom::ListItemLeft && !matchAhead(atom, Atom::ListItemRight)) + return true; + atom = atom->next(); + } + return false; +} + +const Node *DitaXmlGenerator::findNodeForTarget(const QString &target, + const Node *relative, + CodeMarker *marker, + const Atom *atom) +{ + const Node *node = 0; + + if (target.isEmpty()) { + node = relative; + } + else if (target.endsWith(".html")) { + node = myTree->root()->findNode(target, Node::Fake); + } + else if (marker) { + node = marker->resolveTarget(target, myTree, relative); + if (!node) + node = myTree->findFakeNodeByTitle(target); + if (!node && atom) { + node = myTree->findUnambiguousTarget(target, + *const_cast(&atom)); + } + } + + if (!node) + relative->doc().location().warning(tr("Cannot link to '%1'").arg(target)); + + return node; +} + +const QPair DitaXmlGenerator::anchorForNode(const Node *node) +{ + QPair anchorPair; + + anchorPair.first = PageGenerator::fileName(node); + if (node->type() == Node::Fake) { + const FakeNode *fakeNode = static_cast(node); + anchorPair.second = fakeNode->title(); + } + + return anchorPair; +} + +QString DitaXmlGenerator::getLink(const Atom *atom, + const Node *relative, + CodeMarker *marker, + const Node** node) +{ + QString link; + *node = 0; + inObsoleteLink = false; + + if (atom->string().contains(":") && + (atom->string().startsWith("file:") + || atom->string().startsWith("http:") + || atom->string().startsWith("https:") + || atom->string().startsWith("ftp:") + || atom->string().startsWith("mailto:"))) { + + link = atom->string(); + } + else { + QStringList path; + if (atom->string().contains('#')) { + path = atom->string().split('#'); + } + else { + path.append(atom->string()); + } + + Atom *targetAtom = 0; + + QString first = path.first().trimmed(); + if (first.isEmpty()) { + *node = relative; + } + else if (first.endsWith(".html")) { + *node = myTree->root()->findNode(first, Node::Fake); + } + else { + *node = marker->resolveTarget(first, myTree, relative); + if (!*node) { + *node = myTree->findFakeNodeByTitle(first); + } + if (!*node) { + *node = myTree->findUnambiguousTarget(first, targetAtom); + } + } + + if (*node) { + if (!(*node)->url().isEmpty()) + return (*node)->url(); + else + path.removeFirst(); + } + else { + *node = relative; + } + + if (*node) { + if ((*node)->status() == Node::Obsolete) { + if (relative) { + if (relative->parent() != *node) { + if (relative->status() != Node::Obsolete) { + bool porting = false; + if (relative->type() == Node::Fake) { + const FakeNode* fake = static_cast(relative); + if (fake->title().startsWith("Porting")) + porting = true; + } + QString name = marker->plainFullName(relative); + if (!porting && !name.startsWith("Q3")) { + if (obsoleteLinks) { + relative->doc().location().warning(tr("Link to obsolete item '%1' in %2") + .arg(atom->string()) + .arg(name)); + } + inObsoleteLink = true; + } + } + } + } + else { + qDebug() << "Link to Obsolete entity" + << (*node)->name() << "no relative"; + } + } +#if 0 + else if ((*node)->status() == Node::Deprecated) { + qDebug() << "Link to Deprecated entity"; + } + else if ((*node)->status() == Node::Internal) { + qDebug() << "Link to Internal entity"; + } +#endif + } + + while (!path.isEmpty()) { + targetAtom = myTree->findTarget(path.first(), *node); + if (targetAtom == 0) + break; + path.removeFirst(); + } + + if (path.isEmpty()) { + link = linkForNode(*node, relative); + if (*node && (*node)->subType() == Node::Image) + link = "images/used-in-examples/" + link; + if (targetAtom) + link += "#" + refForAtom(targetAtom, *node); + } + } + return link; +} + +void DitaXmlGenerator::generateDcf(const QString &fileBase, + const QString &startPage, + const QString &title, + DcfSection &dcfRoot) +{ + dcfRoot.ref = startPage; + dcfRoot.title = title; + generateDcfSections(dcfRoot, outputDir() + "/" + fileBase + ".dcf", fileBase + "/reference"); +} + +void DitaXmlGenerator::generateIndex(const QString &fileBase, + const QString &url, + const QString &title) +{ + myTree->generateIndex(outputDir() + "/" + fileBase + ".index", url, title); +} + +void DitaXmlGenerator::generateStatus(const Node *node, CodeMarker *marker) +{ + Text text; + + switch (node->status()) { + case Node::Obsolete: + if (node->isInnerNode()) + Generator::generateStatus(node, marker); + break; + case Node::Compat: + if (node->isInnerNode()) { + text << Atom::ParaLeft + << Atom(Atom::FormattingLeft,ATOM_FORMATTING_BOLD) + << "This " + << typeString(node) + << " is part of the Qt 3 support library." + << Atom(Atom::FormattingRight, ATOM_FORMATTING_BOLD) + << " It is provided to keep old source code working. " + << "We strongly advise against " + << "using it in new code. See "; + + const FakeNode *fakeNode = myTree->findFakeNodeByTitle("Porting To Qt 4"); + Atom *targetAtom = 0; + if (fakeNode && node->type() == Node::Class) { + QString oldName(node->name()); + targetAtom = myTree->findTarget(oldName.replace("3", ""), + fakeNode); + } + + if (targetAtom) { + text << Atom(Atom::Link, linkForNode(fakeNode, node) + "#" + + refForAtom(targetAtom, fakeNode)); + } + else + text << Atom(Atom::Link, "Porting to Qt 4"); + + text << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK) + << Atom(Atom::String, "Porting to Qt 4") + << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK) + << " for more information." + << Atom::ParaRight; + } + generateText(text, node, marker); + break; + default: + Generator::generateStatus(node, marker); + } +} + +#ifdef GENERATE_MAC_REFS +/* + No longer valid. + */ +void DitaXmlGenerator::generateMacRef(const Node *node, CodeMarker *marker) +{ + if (!pleaseGenerateMacRef || marker == 0) + return; + + QStringList macRefs = marker->macRefsForNode(node); + foreach (const QString &macRef, macRefs) + out() << "\n"; +} +#endif + +void DitaXmlGenerator::beginLink(const QString &link, + const Node *node, + const Node *relative, + CodeMarker *marker) +{ + Q_UNUSED(marker) + Q_UNUSED(relative) + + this->link = link; + if (link.isEmpty()) { + if (showBrokenLinks) + out() << ""; + } + else if (node == 0 || (relative != 0 && + node->status() == relative->status())) { + out() << ""; + } + else { + switch (node->status()) { + case Node::Obsolete: + out() << ""; + break; + case Node::Compat: + out() << ""; + break; + default: + out() << ""; + } + } + inLink = true; +} + +void DitaXmlGenerator::endLink() +{ + if (inLink) { + if (link.isEmpty()) { + if (showBrokenLinks) + out() << ""; + } + else { + if (inObsoleteLink) { + out() << "(obsolete)"; + } + out() << ""; + } + } + inLink = false; + inObsoleteLink = false; +} + +#ifdef QDOC_QML + +/*! + Generates the summary for the \a section. Only used for + sections of QML element documentation. + + Currently handles only the QML property group. + */ +void DitaXmlGenerator::generateQmlSummary(const Section& section, + const Node *relative, + CodeMarker *marker) +{ + if (!section.members.isEmpty()) { + NodeList::ConstIterator m; + int count = section.members.size(); + bool twoColumn = false; + if (section.members.first()->type() == Node::QmlProperty) { + twoColumn = (count >= 5); + } + if (twoColumn) + out() << "\n"; + if (++numTableRows % 2 == 1) + out() << ""; + else + out() << ""; + // << "\n
    "; + out() << "
      \n"; + + int row = 0; + m = section.members.begin(); + while (m != section.members.end()) { + if (twoColumn && row == (int) (count + 1) / 2) + out() << "
      \n"; + out() << "
    • "; + generateQmlItem(*m,relative,marker,true); + out() << "
    • \n"; + row++; + ++m; + } + out() << "
    \n"; + if (twoColumn) + out() << "
    \n"; + } +} + +/*! + Outputs the html detailed documentation for a section + on a QML element reference page. + */ +void DitaXmlGenerator::generateDetailedQmlMember(const Node *node, + const InnerNode *relative, + CodeMarker *marker) +{ + const QmlPropertyNode* qpn = 0; +#ifdef GENERATE_MAC_REFS + generateMacRef(node, marker); +#endif + out() << "
    "; + if (node->subType() == Node::QmlPropertyGroup) { + const QmlPropGroupNode* qpgn = static_cast(node); + NodeList::ConstIterator p = qpgn->childNodes().begin(); + out() << "
    "; + out() << ""; + + while (p != qpgn->childNodes().end()) { + if ((*p)->type() == Node::QmlProperty) { + qpn = static_cast(*p); + + if (++numTableRows % 2 == 1) + out() << ""; + else + out() << ""; + + out() << ""; + } + ++p; + } + out() << "

    "; + //out() << "

    "; // old + out() << ""; + if (!qpn->isWritable()) + out() << "read-only"; + if (qpgn->isDefault()) + out() << "default"; + generateQmlItem(qpn, relative, marker, false); + out() << "
    "; + out() << "
    "; + } + else if (node->type() == Node::QmlSignal) { + const FunctionNode* qsn = static_cast(node); + out() << "
    "; + out() << ""; + //out() << ""; + if (++numTableRows % 2 == 1) + out() << ""; + else + out() << ""; + out() << ""; + out() << "

    "; + out() << ""; + generateSynopsis(qsn,relative,marker,CodeMarker::Detailed,false); + //generateQmlItem(qsn,relative,marker,false); + out() << "

    "; + out() << "
    "; + } + else if (node->type() == Node::QmlMethod) { + const FunctionNode* qmn = static_cast(node); + out() << "
    "; + out() << ""; + //out() << ""; + if (++numTableRows % 2 == 1) + out() << ""; + else + out() << ""; + out() << ""; + out() << "

    "; + out() << ""; + generateSynopsis(qmn,relative,marker,CodeMarker::Detailed,false); + out() << "

    "; + out() << "
    "; + } + out() << "
    "; + generateStatus(node, marker); + generateBody(node, marker); + generateThreadSafeness(node, marker); + generateSince(node, marker); + generateAlsoList(node, marker); + out() << "
    "; + out() << "
    "; +} + +/*! + Output the "Inherits" line for the QML element, + if there should be one. + */ +void DitaXmlGenerator::generateQmlInherits(const QmlClassNode* cn, + CodeMarker* marker) +{ + if (cn && !cn->links().empty()) { + if (cn->links().contains(Node::InheritsLink)) { + QPair linkPair; + linkPair = cn->links()[Node::InheritsLink]; + QStringList strList(linkPair.first); + const Node* n = myTree->findNode(strList,Node::Fake); + if (n && n->subType() == Node::QmlClass) { + const QmlClassNode* qcn = static_cast(n); + out() << "

    "; + Text text; + text << "[Inherits "; + text << Atom(Atom::LinkNode,CodeMarker::stringForNode(qcn)); + text << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK); + text << Atom(Atom::String, linkPair.second); + text << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK); + text << "]"; + generateText(text, cn, marker); + out() << "

    "; + } + } + } +} + +/*! + Output the "Inherit by" list for the QML element, + if it is inherited by any other elements. + */ +void DitaXmlGenerator::generateQmlInheritedBy(const QmlClassNode* cn, + CodeMarker* marker) +{ + if (cn) { + NodeList subs; + QmlClassNode::subclasses(cn->name(),subs); + if (!subs.isEmpty()) { + Text text; + text << Atom::ParaLeft << "Inherited by "; + appendSortedQmlNames(text,cn,subs,marker); + text << Atom::ParaRight; + generateText(text, cn, marker); + } + } +} + +/*! + Output the "[Xxx instantiates the C++ class QmlGraphicsXxx]" + line for the QML element, if there should be one. + + If there is no class node, or if the class node status + is set to Node::Internal, do nothing. + */ +void DitaXmlGenerator::generateQmlInstantiates(const QmlClassNode* qcn, + CodeMarker* marker) +{ + const ClassNode* cn = qcn->classNode(); + if (cn && (cn->status() != Node::Internal)) { + out() << "

    "; + Text text; + text << "["; + text << Atom(Atom::LinkNode,CodeMarker::stringForNode(qcn)); + text << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK); + text << Atom(Atom::String, qcn->name()); + text << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK); + text << " instantiates the C++ class "; + text << Atom(Atom::LinkNode,CodeMarker::stringForNode(cn)); + text << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK); + text << Atom(Atom::String, cn->name()); + text << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK); + text << "]"; + generateText(text, qcn, marker); + out() << "

    "; + } +} + +/*! + Output the "[QmlGraphicsXxx is instantiated by QML element Xxx]" + line for the class, if there should be one. + + If there is no QML element, or if the class node status + is set to Node::Internal, do nothing. + */ +void DitaXmlGenerator::generateInstantiatedBy(const ClassNode* cn, + CodeMarker* marker) +{ + if (cn && cn->status() != Node::Internal && !cn->qmlElement().isEmpty()) { + const Node* n = myTree->root()->findNode(cn->qmlElement(),Node::Fake); + if (n && n->subType() == Node::QmlClass) { + out() << "

    "; + Text text; + text << "["; + text << Atom(Atom::LinkNode,CodeMarker::stringForNode(cn)); + text << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK); + text << Atom(Atom::String, cn->name()); + text << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK); + text << " is instantiated by QML element "; + text << Atom(Atom::LinkNode,CodeMarker::stringForNode(n)); + text << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK); + text << Atom(Atom::String, n->name()); + text << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK); + text << "]"; + generateText(text, cn, marker); + out() << "

    "; + } + } +} + +/*! + Generate the element for the given \a node using the \a writer. + Return true if a element was written; otherwise return false. + */ +bool DitaXmlGenerator::generatePageElement(QXmlStreamWriter& writer, + const Node* node, + CodeMarker* marker) const +{ + if (node->pageType() == Node::NoPageType) + return false; + if (node->name().isEmpty()) + return true; + if (node->access() == Node::Private) + return false; + if (!node->isInnerNode()) + return false; + + QString title; + QString rawTitle; + QString fullTitle; + const InnerNode* inner = static_cast(node); + + writer.writeStartElement("page"); + QXmlStreamAttributes attributes; + QString t; + t.setNum(id++); + switch (node->type()) { + case Node::Fake: + { + const FakeNode* fake = static_cast(node); + title = fake->fullTitle(); + break; + } + case Node::Class: + { + title = node->name() + " Class Reference"; + break; + } + case Node::Namespace: + { + rawTitle = marker->plainName(inner); + fullTitle = marker->plainFullName(inner); + title = rawTitle + " Namespace Reference"; + break; + } + default: + title = node->name(); + break; + } + writer.writeAttribute("id",t); + writer.writeStartElement("pageWords"); + writer.writeCharacters(title); + if (!inner->pageKeywords().isEmpty()) { + const QStringList& w = inner->pageKeywords(); + for (int i = 0; i < w.size(); ++i) { + writer.writeCharacters(" "); + writer.writeCharacters(w.at(i).toLocal8Bit().constData()); + } + } + writer.writeEndElement(); + writer.writeStartElement("pageTitle"); + writer.writeCharacters(title); + writer.writeEndElement(); + writer.writeStartElement("pageUrl"); + writer.writeCharacters(PageGenerator::fileName(node)); + writer.writeEndElement(); + writer.writeStartElement("pageType"); + switch (node->pageType()) { + case Node::ApiPage: + writer.writeCharacters("APIPage"); + break; + case Node::ArticlePage: + writer.writeCharacters("Article"); + break; + case Node::ExamplePage: + writer.writeCharacters("Example"); + break; + default: + break; + } + writer.writeEndElement(); + writer.writeEndElement(); + return true; +} + +/*! + Traverse the tree recursively and generate the + elements. + */ +void DitaXmlGenerator::generatePageElements(QXmlStreamWriter& writer, const Node* node, CodeMarker* marker) const +{ + if (generatePageElement(writer, node, marker)) { + + if (node->isInnerNode()) { + const InnerNode *inner = static_cast(node); + + // Recurse to write an element for this child node and all its children. + foreach (const Node *child, inner->childNodes()) + generatePageElements(writer, child, marker); + } + } +} + +/*! + Outputs the file containing the index used for searching the html docs. + */ +void DitaXmlGenerator::generatePageIndex(const QString& fileName, CodeMarker* marker) const +{ + QFile file(fileName); + if (!file.open(QFile::WriteOnly | QFile::Text)) + return ; + + QXmlStreamWriter writer(&file); + writer.setAutoFormatting(true); + writer.writeStartDocument(); + writer.writeStartElement("qtPageIndex"); + + generatePageElements(writer, myTree->root(), marker); + + writer.writeEndElement(); // qtPageIndex + writer.writeEndDocument(); + file.close(); +} + +#endif + +#if 0 // fossil removed for new doc format MWS 19/04/2010 + out() << "\n"; + out() << QString("\n").arg(naturalLanguage); + + QString shortVersion; + if ((project != "Qtopia") && (project != "Qt Extended")) { + shortVersion = project + " " + shortVersion + ": "; + if (node && !node->doc().location().isEmpty()) + out() << "\n"; + + shortVersion = myTree->version(); + if (shortVersion.count(QChar('.')) == 2) + shortVersion.truncate(shortVersion.lastIndexOf(QChar('.'))); + if (!shortVersion.isEmpty()) { + if (project == "QSA") + shortVersion = "QSA " + shortVersion + ": "; + else + shortVersion = "Qt " + shortVersion + ": "; + } + } + + out() << "\n" + " " << shortVersion << protectEnc(title) << "\n"; + out() << QString("").arg(outputEncoding); + + if (!style.isEmpty()) + out() << " \n"; + + const QMap &metaMap = node->doc().metaTagMap(); + if (!metaMap.isEmpty()) { + QMapIterator i(metaMap); + while (i.hasNext()) { + i.next(); + out() << " \n"; + } + } + + navigationLinks.clear(); + + if (node && !node->links().empty()) { + QPair linkPair; + QPair anchorPair; + const Node *linkNode; + + if (node->links().contains(Node::PreviousLink)) { + linkPair = node->links()[Node::PreviousLink]; + linkNode = findNodeForTarget(linkPair.first, node, marker); + if (!linkNode || linkNode == node) + anchorPair = linkPair; + else + anchorPair = anchorForNode(linkNode); + + out() << " \n"; + + navigationLinks += "[Previous: "; + if (linkPair.first == linkPair.second && !anchorPair.second.isEmpty()) + navigationLinks += protectEnc(anchorPair.second); + else + navigationLinks += protectEnc(linkPair.second); + navigationLinks += "]\n"; + } + if (node->links().contains(Node::ContentsLink)) { + linkPair = node->links()[Node::ContentsLink]; + linkNode = findNodeForTarget(linkPair.first, node, marker); + if (!linkNode || linkNode == node) + anchorPair = linkPair; + else + anchorPair = anchorForNode(linkNode); + + out() << " \n"; + + navigationLinks += "["; + if (linkPair.first == linkPair.second && !anchorPair.second.isEmpty()) + navigationLinks += protectEnc(anchorPair.second); + else + navigationLinks += protectEnc(linkPair.second); + navigationLinks += "]\n"; + } + if (node->links().contains(Node::NextLink)) { + linkPair = node->links()[Node::NextLink]; + linkNode = findNodeForTarget(linkPair.first, node, marker); + if (!linkNode || linkNode == node) + anchorPair = linkPair; + else + anchorPair = anchorForNode(linkNode); + + out() << " \n"; + + navigationLinks += "[Next: "; + if (linkPair.first == linkPair.second && !anchorPair.second.isEmpty()) + navigationLinks += protectEnc(anchorPair.second); + else + navigationLinks += protectEnc(linkPair.second); + navigationLinks += "]\n"; + } + if (node->links().contains(Node::IndexLink)) { + linkPair = node->links()[Node::IndexLink]; + linkNode = findNodeForTarget(linkPair.first, node, marker); + if (!linkNode || linkNode == node) + anchorPair = linkPair; + else + anchorPair = anchorForNode(linkNode); + out() << " \n"; + } + if (node->links().contains(Node::StartLink)) { + linkPair = node->links()[Node::StartLink]; + linkNode = findNodeForTarget(linkPair.first, node, marker); + if (!linkNode || linkNode == node) + anchorPair = linkPair; + else + anchorPair = anchorForNode(linkNode); + out() << " \n"; + } + } + + foreach (const QString &stylesheet, stylesheets) { + out() << " \n"; + } + + foreach (const QString &customHeadElement, customHeadElements) { + out() << " " << customHeadElement << "\n"; + } + + out() << "\n" + #endif + + QT_END_NAMESPACE diff --git a/tools/qdoc3/ditaxmlgenerator.h b/tools/qdoc3/ditaxmlgenerator.h new file mode 100644 index 0000000..4de578d --- /dev/null +++ b/tools/qdoc3/ditaxmlgenerator.h @@ -0,0 +1,358 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/* + ditaxmlgenerator.h +*/ + +#ifndef DITAXMLGENERATOR_H +#define DITAXMLGENERATOR_H + +#define QDOC_NAME_ALIGNMENT + +#include +#include +#include + +#include "codemarker.h" +#include "config.h" +#include "dcfsection.h" +#include "pagegenerator.h" + +QT_BEGIN_NAMESPACE + +#if 0 +struct NavigationBar +{ + SectionIterator prev; + SectionIterator current; + SectionIterator next; +}; +#endif + +typedef QMultiMap NodeMultiMap; +typedef QMap NewSinceMaps; +typedef QMap ParentMaps; +typedef QMap NodeMap; +typedef QMap NewClassMaps; + +class HelpProjectWriter; + +class DitaXmlGenerator : public PageGenerator +{ + public: + enum SinceType { + Namespace, + Class, + MemberFunction, + NamespaceFunction, + GlobalFunction, + Macro, + Enum, + Typedef, + Property, + Variable, + QmlClass, + QmlProperty, + QmlSignal, + QmlMethod, + LastSinceType + }; + + public: + DitaXmlGenerator(); + ~DitaXmlGenerator(); + + virtual void initializeGenerator(const Config& config); + virtual void terminateGenerator(); + virtual QString format(); + virtual void generateTree(const Tree *tree, CodeMarker *marker); + + QString protectEnc(const QString &string); + static QString protect(const QString &string, const QString &encoding = "ISO-8859-1"); + static QString cleanRef(const QString& ref); + static QString sinceTitle(int i) { return sinceTitles[i]; } + + protected: + virtual void startText(const Node *relative, CodeMarker *marker); + virtual int generateAtom(const Atom *atom, + const Node *relative, + CodeMarker *marker); + virtual void generateClassLikeNode(const InnerNode *inner, CodeMarker *marker); + virtual void generateFakeNode(const FakeNode *fake, CodeMarker *marker); + virtual QString fileExtension(const Node *node) const; + virtual QString refForNode(const Node *node); + virtual QString linkForNode(const Node *node, const Node *relative); + virtual QString refForAtom(Atom *atom, const Node *node); + + private: + enum SubTitleSize { SmallSubTitle, LargeSubTitle }; + + const QPair anchorForNode(const Node *node); + const Node *findNodeForTarget(const QString &target, + const Node *relative, + CodeMarker *marker, + const Atom *atom = 0); + void generateBreadCrumbs(const QString& title, + const Node *node, + CodeMarker *marker); + void generateHeader(const QString& title, + const Node *node = 0, + CodeMarker *marker = 0); + void generateTitle(const QString& title, + const Text &subTitle, + SubTitleSize subTitleSize, + const Node *relative, + CodeMarker *marker); + void generateFooter(const Node *node = 0); + void generateBrief(const Node *node, + CodeMarker *marker, + const Node *relative = 0); + void generateIncludes(const InnerNode *inner, CodeMarker *marker); +#if 0 + void generateNavigationBar(const NavigationBar& bar, + const Node *node, + CodeMarker *marker); +#endif + void generateTableOfContents(const Node *node, + CodeMarker *marker, + Doc::SectioningUnit sectioningUnit, + int numColumns, + const Node *relative = 0); + void generateTableOfContents(const Node *node, + CodeMarker *marker, + QList
    * sections = 0); + QString generateListOfAllMemberFile(const InnerNode *inner, CodeMarker *marker); + QString generateLowStatusMemberFile(const InnerNode *inner, + CodeMarker *marker, + CodeMarker::Status status); + void generateClassHierarchy(const Node *relative, + CodeMarker *marker, + const NodeMap &classMap); + void generateAnnotatedList(const Node *relative, + CodeMarker *marker, + const NodeMap &nodeMap); + void generateCompactList(const Node *relative, + CodeMarker *marker, + const NodeMap &classMap, + bool includeAlphabet, + QString commonPrefix = QString()); + void generateFunctionIndex(const Node *relative, CodeMarker *marker); + void generateLegaleseList(const Node *relative, CodeMarker *marker); + void generateOverviewList(const Node *relative, CodeMarker *marker); + void generateSectionList(const Section& section, + const Node *relative, + CodeMarker *marker, + CodeMarker::SynopsisStyle style); +#ifdef QDOC_QML + void generateQmlSummary(const Section& section, + const Node *relative, + CodeMarker *marker); + void generateQmlItem(const Node *node, + const Node *relative, + CodeMarker *marker, + bool summary); + void generateDetailedQmlMember(const Node *node, + const InnerNode *relative, + CodeMarker *marker); + void generateQmlInherits(const QmlClassNode* cn, CodeMarker* marker); + void generateQmlInheritedBy(const QmlClassNode* cn, CodeMarker* marker); + void generateQmlInstantiates(const QmlClassNode* qcn, CodeMarker* marker); + void generateInstantiatedBy(const ClassNode* cn, CodeMarker* marker); +#endif +#ifdef QDOC_NAME_ALIGNMENT + void generateSection(const NodeList& nl, + const Node *relative, + CodeMarker *marker, + CodeMarker::SynopsisStyle style); + void generateSynopsis(const Node *node, + const Node *relative, + CodeMarker *marker, + CodeMarker::SynopsisStyle style, + bool nameAlignment = false); + void generateSectionInheritedList(const Section& section, + const Node *relative, + CodeMarker *marker, + bool nameAlignment = false); + QString highlightedCode(const QString& markedCode, + CodeMarker *marker, + const Node *relative, + CodeMarker::SynopsisStyle style = CodeMarker::Accessors, + bool nameAlignment = false); +#else + void generateSynopsis(const Node *node, + const Node *relative, + CodeMarker *marker, + CodeMarker::SynopsisStyle style); + void generateSectionInheritedList(const Section& section, + const Node *relative, + CodeMarker *marker); + QString highlightedCode(const QString& markedCode, + CodeMarker *marker, + const Node *relative); +#endif + void generateFullName(const Node *apparentNode, + const Node *relative, + CodeMarker *marker, + const Node *actualNode = 0); + void generateDetailedMember(const Node *node, + const InnerNode *relative, + CodeMarker *marker); + void generateLink(const Atom *atom, + const Node *relative, + CodeMarker *marker); + void generateStatus(const Node *node, CodeMarker *marker); + + QString registerRef(const QString& ref); + QString fileBase(const Node *node); +#if 0 + QString fileBase(const Node *node, const SectionIterator& section); +#endif + QString fileName(const Node *node); + void findAllClasses(const InnerNode *node); + void findAllFunctions(const InnerNode *node); + void findAllLegaleseTexts(const InnerNode *node); + void findAllNamespaces(const InnerNode *node); +#ifdef ZZZ_QDOC_QML + void findAllQmlClasses(const InnerNode *node); +#endif + void findAllSince(const InnerNode *node); + static int hOffset(const Node *node); + static bool isThreeColumnEnumValueTable(const Atom *atom); + virtual QString getLink(const Atom *atom, + const Node *relative, + CodeMarker *marker, + const Node** node); + virtual void generateDcf(const QString &fileBase, + const QString &startPage, + const QString &title, DcfSection &dcfRoot); + virtual void generateIndex(const QString &fileBase, + const QString &url, + const QString &title); +#ifdef GENERATE_MAC_REFS + void generateMacRef(const Node *node, CodeMarker *marker); +#endif + void beginLink(const QString &link, + const Node *node, + const Node *relative, + CodeMarker *marker); + void endLink(); + bool generatePageElement(QXmlStreamWriter& writer, + const Node* node, + CodeMarker* marker) const; + void generatePageElements(QXmlStreamWriter& writer, + const Node* node, + CodeMarker* marker) const; + void generatePageIndex(const QString& fileName, + CodeMarker* marker) const; + +#if 0 + NavigationBar currentNavigationBar; +#endif + QMap refMap; + int codeIndent; + DcfSection dcfClassesRoot; + DcfSection dcfOverviewsRoot; + DcfSection dcfExamplesRoot; + DcfSection dcfDesignerRoot; + DcfSection dcfLinguistRoot; + DcfSection dcfAssistantRoot; + DcfSection dcfQmakeRoot; + HelpProjectWriter *helpProjectWriter; + bool inLink; + bool inObsoleteLink; + bool inContents; + bool inSectionHeading; + bool inTableHeader; + int numTableRows; + bool threeColumnEnumValueTable; + bool offlineDocs; + QString link; + QStringList sectionNumber; + QRegExp funcLeftParen; + QString style; + QString postHeader; + QString postPostHeader; + QString footer; + QString address; + bool pleaseGenerateMacRef; + QString project; + QString projectDescription; + QString projectUrl; + QString navigationLinks; + QStringList stylesheets; + QStringList customHeadElements; + const Tree *myTree; + bool slow; + bool obsoleteLinks; + QMap moduleClassMap; + QMap moduleNamespaceMap; + NodeMap nonCompatClasses; + NodeMap mainClasses; + NodeMap compatClasses; + NodeMap obsoleteClasses; + NodeMap namespaceIndex; + NodeMap serviceClasses; +#ifdef QDOC_QML + NodeMap qmlClasses; +#endif + QMap funcIndex; + QMap legaleseTexts; + NewSinceMaps newSinceMaps; + static QString sinceTitles[]; + NewClassMaps newClassMaps; + NewClassMaps newQmlClassMaps; + static int id; +}; + +#define DITAXMLGENERATOR_ADDRESS "address" +#define DITAXMLGENERATOR_FOOTER "footer" +#define DITAXMLGENERATOR_GENERATEMACREFS "generatemacrefs" // ### document me +#define DITAXMLGENERATOR_POSTHEADER "postheader" +#define DITAXMLGENERATOR_POSTPOSTHEADER "postpostheader" +#define DITAXMLGENERATOR_STYLE "style" +#define DITAXMLGENERATOR_STYLESHEETS "stylesheets" +#define DITAXMLGENERATOR_CUSTOMHEADELEMENTS "customheadelements" + +QT_END_NAMESPACE + +#endif + -- cgit v0.12 From 0081d328394dea7ddcf7411ece678973a86781c9 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Tue, 1 Jun 2010 12:45:09 +0200 Subject: Fix QML crashes on the N900 JavaScriptCore and QtWebKit JIT symbols were clashing. Hide the new thunk functions that DEFINE_STUB_FUNCTION declares. Reviewed-by: Tapani Mikola --- src/3rdparty/javascriptcore/JavaScriptCore/jit/JITStubs.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/jit/JITStubs.cpp b/src/3rdparty/javascriptcore/JavaScriptCore/jit/JITStubs.cpp index 022689b..b3c229e 100644 --- a/src/3rdparty/javascriptcore/JavaScriptCore/jit/JITStubs.cpp +++ b/src/3rdparty/javascriptcore/JavaScriptCore/jit/JITStubs.cpp @@ -1094,6 +1094,10 @@ RVCT() #define DEFINE_STUB_FUNCTION(rtype, op) rtype JIT_STUB cti_##op(STUB_ARGS_DECLARATION) #endif +#if COMPILER(GCC) +#pragma GCC visibility push(hidden) +#endif + DEFINE_STUB_FUNCTION(EncodedJSValue, op_convert_this) { STUB_INIT_STACK_FRAME(stackFrame); @@ -3205,6 +3209,10 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, to_object) return JSValue::encode(stackFrame.args[0].jsValue().toObject(callFrame)); } +#if COMPILER(GCC) +#pragma GCC visibility pop +#endif + } // namespace JSC #endif // ENABLE(JIT) -- cgit v0.12 From dab3121d59b202eac72a0b7d0fa101532ac080cd Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Mon, 31 May 2010 19:47:52 +0200 Subject: fix setRawData() setRawData() itself (consistently with fromRawData()) sets alloc to the passed raw size, so the check at the start would always find that we cannot re-use the qstring object, thus completely defeating the purpose of the function. so also check that the string data pointer actually points into the internal array before giving up. Reviewed-by: olivier --- src/corelib/tools/qstring.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index 6acbcec..a0dbb8e 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -7093,7 +7093,7 @@ QString QString::fromRawData(const QChar *unicode, int size) */ QString &QString::setRawData(const QChar *unicode, int size) { - if (d->ref != 1 || d->alloc) { + if (d->ref != 1 || (d->data == d->array && d->alloc)) { *this = fromRawData(unicode, size); } else { #ifdef QT3_SUPPORT -- cgit v0.12 From 2c8f9dee611ed403ef129d5e3a3f9f5883bfd08b Mon Sep 17 00:00:00 2001 From: Jens Bache-Wiig Date: Tue, 1 Jun 2010 15:32:03 +0200 Subject: Some optimizations for QImage::load() We didnt check if the file existed before trying to load it. This means that we had a lot of redundant dlopen calls for that case. In addition pixmap cache should be significantly faster now. Task-number: QTBUG-11137 Reviewed-by: joao --- src/gui/image/qpixmap.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/gui/image/qpixmap.cpp b/src/gui/image/qpixmap.cpp index 3013726..20e4b50 100644 --- a/src/gui/image/qpixmap.cpp +++ b/src/gui/image/qpixmap.cpp @@ -82,6 +82,7 @@ #endif #include "qpixmap_raster_p.h" +#include "private/qstylehelper_p.h" QT_BEGIN_NAMESPACE @@ -829,8 +830,14 @@ bool QPixmap::load(const QString &fileName, const char *format, Qt::ImageConvers return false; QFileInfo info(fileName); - QString key = QLatin1String("qt_pixmap_") + info.absoluteFilePath() + QLatin1Char('_') + QString::number(info.lastModified().toTime_t()) + QLatin1Char('_') + - QString::number(info.size()) + QLatin1Char('_') + QString::number(data ? data->pixelType() : QPixmapData::PixmapType); + if (!info.exists()) + return false; + + QString key = QLatin1Literal("qt_pixmap") + % info.absoluteFilePath() + % HexString(info.lastModified().toTime_t()) + % HexString(info.size()) + % HexString(data ? data->pixelType() : QPixmapData::PixmapType); if (QPixmapCache::find(key, *this)) return true; -- cgit v0.12 From 65f4148dc8c2ecd6538c1e2313c633d65e2b7fcc Mon Sep 17 00:00:00 2001 From: Morten Engvoldsen Date: Wed, 2 Jun 2010 10:17:09 +0200 Subject: Doc: adding offline docs to assistant and Qt Creator. Improving small docs and adding highlighting --- doc/src/template/images/arrow_down.png | Bin 0 -> 177 bytes doc/src/template/scripts/narrow.js | 78 +++ doc/src/template/scripts/superfish.js | 121 ++++ doc/src/template/style/OfflineStyle.css | 819 ++++++++++++++++++++++++++ doc/src/template/style/narrow.css | 250 ++++++++ doc/src/template/style/superfish.css | 51 ++ doc/src/template/style/superfish_skin.css | 83 +++ tools/qdoc3/htmlgenerator.cpp | 85 ++- tools/qdoc3/test/assistant.qdocconf | 2 + tools/qdoc3/test/designer.qdocconf | 2 + tools/qdoc3/test/linguist.qdocconf | 4 +- tools/qdoc3/test/qdeclarative.qdocconf | 2 + tools/qdoc3/test/qmake.qdocconf | 2 + tools/qdoc3/test/qt-build-docs.qdocconf | 2 + tools/qdoc3/test/qt-build-docs_zh_CN.qdocconf | 1 + tools/qdoc3/test/qt-defines.qdocconf | 53 +- tools/qdoc3/test/qt-html-templates.qdocconf | 55 +- tools/qdoc3/test/qt.qdocconf | 17 +- 18 files changed, 1570 insertions(+), 57 deletions(-) create mode 100644 doc/src/template/images/arrow_down.png create mode 100644 doc/src/template/scripts/narrow.js create mode 100644 doc/src/template/scripts/superfish.js create mode 100644 doc/src/template/style/OfflineStyle.css create mode 100644 doc/src/template/style/narrow.css create mode 100644 doc/src/template/style/superfish.css create mode 100644 doc/src/template/style/superfish_skin.css diff --git a/doc/src/template/images/arrow_down.png b/doc/src/template/images/arrow_down.png new file mode 100644 index 0000000..9d01e97 Binary files /dev/null and b/doc/src/template/images/arrow_down.png differ diff --git a/doc/src/template/scripts/narrow.js b/doc/src/template/scripts/narrow.js new file mode 100644 index 0000000..12d0ce8 --- /dev/null +++ b/doc/src/template/scripts/narrow.js @@ -0,0 +1,78 @@ +var narrowInit = function() { + /* TODO: + Could probably be more efficient, not hardcoding each element to be created + */ + // 1: Create search form + var narrowSearch = $('
    '); + var searchform = $("#qtdocsearch"); + narrowSearch.append(searchform); + $("#qtdocheader .content .qtref").after(narrowSearch); + + // 2: Create dropdowns + var narrowmenu = $('
      '); + + // Lookup + var lookuptext = $("#lookup h2").attr("title"); + $("#lookup ul").removeAttr("id"); + $("#lookup ul li").removeAttr("class"); + $("#lookup ul li").removeAttr("style"); + var lookupul = $("#lookup ul"); + var lookuplist = $('
    • '); + var lookuplink = $(''); + lookuplink.append(lookuptext); + lookuplist.append(lookuplink); + lookuplist.append(lookupul); + narrowmenu.append(lookuplist); + + // Topics + var topicstext = $("#topics h2").attr("title"); + $("#topics ul").removeAttr("id"); + $("#topics ul li").removeAttr("class"); + $("#topics ul li").removeAttr("style"); + var topicsul = $("#topics ul"); + var topicslist = $('
    • '); + var topicslink = $(''); + topicslink.append(topicstext); + topicslist.append(topicslink); + topicslist.append(topicsul); + narrowmenu.append(topicslist); + + // Examples + var examplestext = $("#examples h2").attr("title"); + $("#examples ul").removeAttr("id"); + $("#examples ul li").removeAttr("class"); + $("#examples ul li").removeAttr("style"); + var examplesul = $("#examples ul"); + var exampleslist = $('
    • '); + var exampleslink = $(''); + exampleslink.append(examplestext); + exampleslist.append(exampleslink); + exampleslist.append(examplesul); + narrowmenu.append(exampleslist); + + $("#shortCut").after(narrowmenu); + $('ul#narrowmenu').superfish({ + delay: 100, + autoArrows: false, + disableHI: true + }); +} + +$(document).ready(function(){ + if ($('body').hasClass('narrow')) { + narrowInit(); + } +}); + +$(window).bind('resize', function () { + if($(window).width()<600) { + $('body').addClass('narrow'); + + if ($("#narrowsearch").length == 0) { + narrowInit(); + } + } + else { + $('body').removeClass('narrow'); + } +}); \ No newline at end of file diff --git a/doc/src/template/scripts/superfish.js b/doc/src/template/scripts/superfish.js new file mode 100644 index 0000000..c6a9c7d --- /dev/null +++ b/doc/src/template/scripts/superfish.js @@ -0,0 +1,121 @@ + +/* + * Superfish v1.4.8 - jQuery menu widget + * Copyright (c) 2008 Joel Birch + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * CHANGELOG: http://users.tpg.com.au/j_birch/plugins/superfish/changelog.txt + */ + +;(function($){ + $.fn.superfish = function(op){ + + var sf = $.fn.superfish, + c = sf.c, + $arrow = $([' »'].join('')), + over = function(){ + var $$ = $(this), menu = getMenu($$); + clearTimeout(menu.sfTimer); + $$.showSuperfishUl().siblings().hideSuperfishUl(); + }, + out = function(){ + var $$ = $(this), menu = getMenu($$), o = sf.op; + clearTimeout(menu.sfTimer); + menu.sfTimer=setTimeout(function(){ + o.retainPath=($.inArray($$[0],o.$path)>-1); + $$.hideSuperfishUl(); + if (o.$path.length && $$.parents(['li.',o.hoverClass].join('')).length<1){over.call(o.$path);} + },o.delay); + }, + getMenu = function($menu){ + var menu = $menu.parents(['ul.',c.menuClass,':first'].join(''))[0]; + sf.op = sf.o[menu.serial]; + return menu; + }, + addArrow = function($a){ $a.addClass(c.anchorClass).append($arrow.clone()); }; + + return this.each(function() { + var s = this.serial = sf.o.length; + var o = $.extend({},sf.defaults,op); + o.$path = $('li.'+o.pathClass,this).slice(0,o.pathLevels).each(function(){ + $(this).addClass([o.hoverClass,c.bcClass].join(' ')) + .filter('li:has(ul)').removeClass(o.pathClass); + }); + sf.o[s] = sf.op = o; + + $('li:has(ul)',this)[($.fn.hoverIntent && !o.disableHI) ? 'hoverIntent' : 'hover'](over,out).each(function() { + if (o.autoArrows) addArrow( $('>a:first-child',this) ); + }) + .not('.'+c.bcClass) + .hideSuperfishUl(); + + var $a = $('a',this); + $a.each(function(i){ + var $li = $a.eq(i).parents('li'); + $a.eq(i).focus(function(){over.call($li);}).blur(function(){out.call($li);}); + }); + o.onInit.call(this); + + }).each(function() { + var menuClasses = [c.menuClass]; + if (sf.op.dropShadows && !($.browser.msie && $.browser.version < 7)) menuClasses.push(c.shadowClass); + $(this).addClass(menuClasses.join(' ')); + }); + }; + + var sf = $.fn.superfish; + sf.o = []; + sf.op = {}; + sf.IE7fix = function(){ + var o = sf.op; + if ($.browser.msie && $.browser.version > 6 && o.dropShadows && o.animation.opacity!=undefined) + this.toggleClass(sf.c.shadowClass+'-off'); + }; + sf.c = { + bcClass : 'sf-breadcrumb', + menuClass : 'sf-js-enabled', + anchorClass : 'sf-with-ul', + arrowClass : 'sf-sub-indicator', + shadowClass : 'sf-shadow' + }; + sf.defaults = { + hoverClass : 'sfHover', + pathClass : 'overideThisToUse', + pathLevels : 1, + delay : 800, + animation : {opacity:'show'}, + speed : 'normal', + autoArrows : true, + dropShadows : true, + disableHI : false, // true disables hoverIntent detection + onInit : function(){}, // callback functions + onBeforeShow: function(){}, + onShow : function(){}, + onHide : function(){} + }; + $.fn.extend({ + hideSuperfishUl : function(){ + var o = sf.op, + not = (o.retainPath===true) ? o.$path : ''; + o.retainPath = false; + var $ul = $(['li.',o.hoverClass].join(''),this).add(this).not(not).removeClass(o.hoverClass) + .find('>ul').hide().css('visibility','hidden'); + o.onHide.call($ul); + return this; + }, + showSuperfishUl : function(){ + var o = sf.op, + sh = sf.c.shadowClass+'-off', + $ul = this.addClass(o.hoverClass) + .find('>ul:hidden').css('visibility','visible'); + sf.IE7fix.call($ul); + o.onBeforeShow.call($ul); + $ul.animate(o.animation,o.speed,function(){ sf.IE7fix.call($ul); o.onShow.call($ul); }); + return this; + } + }); + +})(jQuery); diff --git a/doc/src/template/style/OfflineStyle.css b/doc/src/template/style/OfflineStyle.css new file mode 100644 index 0000000..ddd580a --- /dev/null +++ b/doc/src/template/style/OfflineStyle.css @@ -0,0 +1,819 @@ +@media screen +{ + html + { + color: #000000; + background: #FFFFFF; + } + body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, button, textarea, p, blockquote, th, td + { + margin: 0; + padding: 0; + } + table + { + border-collapse: collapse; + border-spacing: 0; + } + fieldset, img + { + border: 0; + } + address, caption, cite, code, dfn, em, strong, th, var, optgroup + { + font-style: inherit; + font-weight: inherit; + } + del, ins + { + text-decoration: none; + } + li + { + list-style: none; + } + caption, th + { + text-align: left; + } + h1, h2, h3, h4, h5, h6 + { + font-size: 100%; + } + q:before, q:after + { + content: ''; + } + abbr, acronym + { + border: 0; + font-variant: normal; + } + sup + { + vertical-align: baseline; + } + sub + { + vertical-align: baseline; + } + tt, .qmlreadonly span, .qmldefault span + { + word-spacing:5px; + } + .heading + { + font: normal 600 16px/1.0 Arial; + } + .subtitle + { + font-size: 13px; + } + .small-subtitle + { + font-size: 13px; + } + legend + { + color: #000000; + } + input, button, textarea, select, optgroup, option + { + font-family: inherit; + font-size: inherit; + font-style: inherit; + font-weight: inherit; + } + input, button, textarea, select + { + font-size: 100%; + } + body + { + font: normal 13px/1.2 Verdana; + color: #363534; + } + strong + { + font-weight: bold; + } + em + { + font-style: italic; + } + a + { + color: #00732f; + text-decoration: none; + } + .header, .footer, .wrapper + { + /*min-width: 600px;*/ + max-width: 1500px; + margin: 0 5px; + } + .wrapper + { + position:relative; + top:50px; + } + .wrapper .bd + { + position: relative; + } + + .header, .footer + { + display: block; + clear: both; + overflow: hidden; + } + .header + { + height: 115px; + position: relative; + } + + + .header .qtref + { + position: absolute; + top: 28px; + left: 88px; + width: 302px; + height: 22px; + } + .header .qtref span + { + display: block; + height: 22px; + } + .wrap .content h1 + { + font: 600 18px/1.2 Arial; + } + .wrap .content h2 + { + font: 600 16px/1.2 Arial; + } + .wrap .content h3 + { + font: 600 14px/1.2 Arial; + } + .wrap .content h4 + { + font: 600 12px/1.2 Arial; + } + + .wrap .content p + { + line-height: 20px; + padding: 5px; + } + .wrap .content table p + { + line-height: 20px; + padding: 0px; + } + .wrap .content ul + { + padding-left: 25px; + padding-top: 10px; + } + a:hover + { + color: #4c0033; + text-decoration: underline; + } + .content a:visited + { + color: #4c0033; + text-decoration: none; + } + .content a:visited:hover + { + color: #4c0033; + text-decoration: underline; + } + + pre + { + border: 1px solid #DDDDDD; + margin: 0 20px 10px 10px; + padding: 20px 15px 20px 20px; + overflow-x: auto; + } + table, pre + { + -moz-border-radius: 7px 7px 7px 7px; + background-color: #F6F6F6; + border: 1px solid #E6E6E6; + border-collapse: separate; + font-size: 11px; + /*min-width: 395px;*/ + margin-bottom: 25px; + display: inline-block; + } + thead + { + margin-top: 5px; + font:600 12px/1.2 Arial; + } + th + { + padding: 5px 15px 5px 15px; + background-color: #E1E1E1; + /* border-bottom: 1px solid #E6E6E6;*/ + border-left: 1px solid #E6E6E6; + /* border-right: 1px solid #E6E6E6;*/ + } + td + { + padding: 3px 15px 3px 20px; + /* border-left: 1px solid #E6E6E6; + border-right: 1px solid #E6E6E6;*/ + } + tr.odd td:hover, tr.even td:hover + { + /* border-right: 1px solid #C3C3C3; + border-left: 1px solid #C3C3C3;*/ + } + + td.rightAlign + { + padding: 3px 15px 3px 10px; + } + table tr.odd + { + border-left: 1px solid #E6E6E6; + background-color: #F6F6F6; + color: #66666E; + } + table tr.even + { + border-left: 1px solid #E6E6E6; + background-color: #ffffff; + color: #66666E; + } + table tr.odd td:hover, table tr.even td:hover + { + background-color: #E6E6E6; + } + + span.comment + { + color: #8B0000; + font-style: italic; + } + span.string, span.char + { + color: #254117; + } + + .qmltype + { + text-align: center; + font-size: 160%; + } + .qmlreadonly + { + float: right; + color: #254117; + } + + .qmldefault + { + float: right; + color: red; + } + + .footer + { + border-top:1px solid #E5E5E5; + min-height: 100px; + color: #797775; + font: normal 9px/1 Verdana; + text-align: center; + padding-top: 40px; + margin: 0; + } + + + .wrap + { + margin: 0 5px 0 5px; + } + .wrap .toolbar + { + display:block; + } + + .wrap .breadcrumb ul li + { + float: left; + background: url(../images/breadcrumb.png) no-repeat 0 5px; + padding-left: 15px; + margin-left: 15px; + font-weight: bold; + } + .wrap .breadcrumb ul li.last + { + font-weight: normal; + } + .wrap .breadcrumb ul li a + { + /* color: #363534;*/ + color: #00732F; + } + .wrap .breadcrumb ul li.first + { + background-image: none; + padding-left: 0; + margin-left: 0; + } + .wrap .content + { + word-wrap:break-word; + } + .wrap .content li + { + padding-left: 12px; + background: url(../images/bullet_sq.png) no-repeat 0 5px; + font: normal 400 10pt/1 Verdana; + margin-bottom: 10px; + } + + .offline .wrap .content + { + padding-top: 15px; + } + + .header:after, .footer:after, .breadcrumb:after, .wrap .content:after, .group:after + { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; + } + + hr + { + background-color: #E6E6E6; + border: 1px solid #E6E6E6; + height: 1px; + width: 100%; + text-align: left; + margin: 5px 0px 5px 0px; + } + + .content .alignedsummary + { + margin: 5px; + width:100%; + } + + + .toc + { + float: right; + -moz-border-radius: 7px 7px 7px 7px; + background-color: #F6F6F6; + border: 1px solid #DDDDDD; + margin: 0 20px 10px 10px; + padding: 20px 15px 20px 20px; + height: auto; + width: 200px; + } + + .toc h3, .generic a + { + font: 600 12px/1.2 Arial; + } + + .wrap .content .toc ul + { + padding-left: 0px; + } + + + .wrap .content .toc .level2 + { + margin-left: 15px; + } + + .wrap .content .toc .level3 + { + margin-left: 30px; + } + + .content .toc li + { + font: normal 10px/1.2 Verdana; + background: url(../images/bullet_dn.png) no-repeat 0 5px; + } + + + .generic{ + max-width:75%; + } + .generic td{ + padding:0; + } + + .generic .odd .alphaChar{ + background-color: #F6F6F6; + } + + .generic .even .alphaChar{ + background-color: #FFFFFF; + } + + .highlightedCode + { + margin:10px; + } + + .flowList{ + vertical-align:top; + } + .alphaChar{ + width:100%; + background-color:#F6F6F6; + border:1px solid #E6E6E6; + font-size:12pt; + padding-left:10px; + margin-top:10px; + margin-bottom:10px; + } + + .flowList dl{ + } + .flowList dd{ + display:inline-block; + margin-left:10px; + width:250px; + } + .wrap .content .flowList p{ + padding:0px; + } + + .relpage + { + -moz-border-radius: 7px 7px 7px 7px; + border: 1px solid #DDDDDD; + padding: 25px 25px; + clear: both; + } + .relpage ul + { + float: none; + padding: 15px; + } + .content .relpage li + { + font: normal 11px/1.2 Verdana; + } + h3.fn, span.fn + { + background-color: #F6F6F6; + border-width: 1px; + border-style: solid; + border-color: #E6E6E6; + font-weight: bold; + word-spacing:3px; + } + + .functionIndex { + font-size:12pt; + word-spacing:10px; + margin-bottom:10px; + background-color: #F6F6F6; + border-width: 1px; + border-style: solid; + border-color: #E6E6E6; + width:100%; + } + + .centerAlign { text-align:center;} + .rightAlign {text-align:right;} + .leftAlign {text-align:left;} + .topAlign{vertical-align:top } + .functionIndex a{display:inline-block;} + + /* start index box */ + .indexbox + { + width: 100%; + display:inline-block; + } + + .indexboxcont { display: block; } + + .indexboxbar + { + border-bottom:1px solid #E5E5E5; + margin-bottom: 25px; + } + + .indexboxcont .section + { + display: inline-block; + padding:0 2% 0 1%; + vertical-align:top; + } + + .indexboxcont .section { + float: left; + } + + .indexboxcont .section p + { + padding-top: 20px; + padding-bottom: 20px; + } + .indexboxcont .sectionlist + { + display: inline-block; + vertical-align:top; + padding: 0; + } + .indexboxcont .sectionlist ul + { + margin-bottom: 20px; + } + + .indexboxcont .sectionlist ul li + { + line-height: 12px; + } + + .content .indexboxcont li + { + font: normal 600 13px/1 Verdana; + } + + .indexbox a:hover, .indexbox a:visited:hover + { + color: #4c0033; + text-decoration: underline; + } + + .indexbox a:visited + { + color: #00732f; + text-decoration: none; + } + + .indexbox .indexIcon { + width: 11%; + } + + + .indexboxcont:after + { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; + } + + body.offline + { + background-image: none; + } + + .offline .footer { + margin: 0; + } + .offline .header + { + width: 100%; + margin: 0; + height: auto; + background-color: #ffffff; + padding: 10px 0 5px 0; + overflow: visible; + border-bottom: solid #E5E5E5 1px; + z-index:1; + position:fixed; + } + + .offline .header .content + { + } + .offline .header .qtref + { + color: #00732F; + position: static; + float: left; + margin-left: 5px; + font: bold 18px/1 Arial; + } + + .offline .header .qtref:visited + { + color: #00732F; + } + .offline .header .qtref:hover + { + color: #00732F; + text-decoration:none; + } + .offline .header .qtref span + { + background-image: none; + text-indent: 0; + text-decoration:none; + } + + .offline .wrap + { + margin: 0 5px 0 5px; + } + + .offline .wrap .toolbar + { + display:block; + padding-top:5px; + } + + .offline .wrap .breadcrumb ul li { + font-weight: normal; + } + + .offline .wrap .breadcrumb ul li a { + /*color: #44a51c;*/ + } + + .offline .wrap .breadcrumb ul li.last a { + /*color: #363534;*/ + } + + + + .narrow .indexboxcont .section { + width: 64%; + padding-left: 0; + } + + .narrow .indexboxcont .sectionlist { + width: 32.5%; + } + + .header .icon, + .sidebar, + .feedback, + .t_button, + .feedback, + #feedbackBox, + #feedback, + #blurpage, + .indexbox .indexIcon span, + .wrapper .hd, + .offline .indexbox .indexIcon, + .offline .header #nav-logo, + #offlinemenu, + #offlinesearch, + .offline .header #nav-topright, + .offline .header #shortCut , + .offline .wrapper .hd, + .offline .wrapper .ft, + .offline .sidebar, + .offline .wrap .feedback + { + display:none; + } + + /* end offline mode */ +#narrowmenu { + display: none; + float: right; + margin: 15px 40px 0 0; + font-size: 11px; + } + + .narrow #narrowmenu { + display: block; + } + + #narrowsearch{ + display:none; + } + + #narrowmenu ul + { + border-bottom:solid 1px #E5E5E5; + border-left:solid 1px #E5E5E5; + border-right:solid 1px #E5E5E5; + } + + #narrowmenu a { + line-height: 1.1; + background: url(../images/arrow_down.png) no-repeat 100% 50%; + white-space: nowrap; + padding: 0 16px 0 5px; + } + + #narrowmenu li { + margin-left: 20px; + } + + #narrowmenu li li { + margin: 0 0 5px 0; + } + + #narrowmenu li li a { + padding: 0; + background-image: none; + } + + #narrowmenu li, + #narrowmenu li ul { + background-color: #fff; + } + + #narrowmenu li ul { + width: auto; + padding: 5px; + margin-top:-15px; + } + + .sf-menu li:hover ul, .sf-menu li.sfHover ul { + top: 1.2em; + } +.sf-menu, .sf-menu * { + margin: 0; + padding: 0; + list-style: none; +} +.sf-menu { + line-height: 1.0; +} +.sf-menu ul { + position: absolute; + top: -999em; + width: 10em; /* left offset of submenus need to match (see below) */ +} +.sf-menu ul li { + width: 100%; +} +.sf-menu li:hover { + visibility: inherit; /* fixes IE7 'sticky bug' */ +} +.sf-menu li { + float: left; + position: relative; +} +.sf-menu a { + display: block; + position: relative; +} +.sf-menu li:hover ul, +.sf-menu li.sfHover ul { + left: 0; + top: 2.5em; /* match top ul list item height */ + z-index: 99; +} +ul.sf-menu li:hover li ul, +ul.sf-menu li.sfHover li ul { + top: -999em; +} +ul.sf-menu li li:hover ul, +ul.sf-menu li li.sfHover ul { + left: 10em; /* match ul width */ + top: 0; +} +ul.sf-menu li li:hover li ul, +ul.sf-menu li li.sfHover li ul { + top: -999em; +} +ul.sf-menu li li li:hover ul, +ul.sf-menu li li li.sfHover ul { + left: 10em; /* match ul width */ + top: 0; +} + +} +/* end of screen media */ + +/* start of print media */ + +@media print +{ + input, textarea, .header, .footer, .toolbar, .feedback, .wrapper .hd, .wrapper .bd .sidebar, .wrapper .ft + { + display: none; + background: none; + } + .content + { + position: absolute; + top: 0px; + left: 0px; + background: none; + display: block; + } +} +/* end of print media */ diff --git a/doc/src/template/style/narrow.css b/doc/src/template/style/narrow.css new file mode 100644 index 0000000..05159aa --- /dev/null +++ b/doc/src/template/style/narrow.css @@ -0,0 +1,250 @@ + /* start narrow mode */ + + body.narrow + { + background-image: none; + } + + .narrow a { + color: #44a51c; + } + + .narrow .header, .narrow .header .content, .narrow .footer, .narrow .wrapper { + margin: 0 7px; + min-width: 300px; + } + + .narrow .footer { + margin: 0; + } + .narrow .header + { + width: 100%; + margin: 0; + height: auto; + background: #fff url(../images/header_bg.png) repeat-x 0 100%; + padding: 10px 0 5px 0; + overflow: visible; + } + + .narrow .header .content + { + } + + .narrow .header #nav-logo + { + display: none; + } + + .narrow .header .qtref + { + width: auto; + height: auto; + color: #363534; + position: static; + float: left; + margin-left: 25px; + font: bold 18px/1 Arial; + } + + .narrow .header .qtref a + { + color: #363534; + } + + .narrow .header .qtref span + { + background-image: none; + text-indent: 0; + } + + .narrow .header #nav-topright + { + display: none; + } + + .narrow .header #shortCut + { + clear: both; + font-weight: normal; + position: static; + float: left; + margin: 15px 0 0 25px; + overflow: hidden; + padding: 0; + height: auto; + } + + .narrow .header #shortCut ul + { + float: none; + margin: 0; + width: auto; + font-size: 11px; + } + + .narrow .header #shortCut ul li + { + background-image: none; + } + + .narrow .header #shortCut ul .shortCut-topleft-active, + .narrow .header #shortCut ul .shortCut-topleft-inactive + { + background-image: none; + height: auto; + padding: 0; + width: auto; + } + .narrow .header #shortCut ul li a + { + color: #44a51c; + } + + .narrow .wrapper .hd + { + background: url(../images/bg_ul_blank.png) no-repeat 0 0; + } + + .narrow .wrapper .bd + { + background: url(../images/bg_l_blank.png) repeat-y 0 0; + } + + .narrow .wrapper .ft + { + background: url(../images/bg_ll_blank.png) no-repeat 0 0; + } + + .narrow .sidebar + { + display: none; + } + + .narrow .wrap + { + margin: 0 5px 0 5px; + } + + .narrow .wrap .toolbar + { + border-bottom: none; + } + + .narrow .wrap .content + { + padding-top: 15px; + } + + .narrow .wrap .feedback + { + display: none; + } + + .narrow .wrap .breadcrumb ul li { + font-weight: normal; + } + + .narrow .wrap .breadcrumb ul li a { + color: #44a51c; + } + + .narrow .wrap .breadcrumb ul li.last a { + color: #363534; + } + + #narrowsearch { + display: none; + } + + .narrow #narrowsearch { + display: block; + float: right; + margin-right: 25px; + _position: relative; + } + + .narrow #narrowsearch fieldset { + _position: absolute; + _margin-top: -1px; + } + + .narrow #narrowsearch { + background: url("http://doc.qt.nokia.com/prototype/html/images/sprites-combined.png") no-repeat scroll -6px -348px transparent; + height: 21px; + padding: 2px 0 0 5px; + width: 167px; + } + + .narrow #narrowsearch input { + border: none; + font: 13px/1.2 Verdana; + height: 19px; + outline: none; + padding: 0; + width: 158px; + *border: 1px solid #fff; + *height: 17px; + _height: 18px; + } + + .narrow .indexbox .indexIcon { + display: none; + } + + .narrow .indexboxcont .section { + width: 64%; + padding-left: 0; + } + + .narrow .indexboxcont .sectionlist { + width: 32.5%; + } + + #narrowmenu { + display: none; + float: right; + margin: 15px 40px 0 0; + font-size: 11px; + } + + .narrow #narrowmenu { + display: block; + } + + #narrowmenu a { + line-height: 1.1; + background: url(../images/arrow_down.png) no-repeat 100% 50%; + white-space: nowrap; + padding: 0 16px 0 5px; + } + + #narrowmenu li { + margin-left: 20px; + } + + #narrowmenu li li { + margin: 0 0 5px 0; + } + + #narrowmenu li li a { + padding: 0; + background-image: none; + } + + #narrowmenu li, + #narrowmenu li ul { + background-color: #fff; + margin-top:-1px; + } + + #narrowmenu li ul { + width: auto; + padding: 5px; + } + + .sf-menu li:hover ul, .sf-menu li.sfHover ul { + top: 1.2em; + } + + /* end narrow mode */ diff --git a/doc/src/template/style/superfish.css b/doc/src/template/style/superfish.css new file mode 100644 index 0000000..0cf0f7d --- /dev/null +++ b/doc/src/template/style/superfish.css @@ -0,0 +1,51 @@ +.sf-menu, .sf-menu * { + margin: 0; + padding: 0; + list-style: none; +} +.sf-menu { + line-height: 1.0; +} +.sf-menu ul { + position: absolute; + top: -999em; + width: 10em; /* left offset of submenus need to match (see below) */ +} +.sf-menu ul li { + width: 100%; +} +.sf-menu li:hover { + visibility: inherit; /* fixes IE7 'sticky bug' */ +} +.sf-menu li { + float: left; + position: relative; +} +.sf-menu a { + display: block; + position: relative; +} +.sf-menu li:hover ul, +.sf-menu li.sfHover ul { + left: 0; + top: 2.5em; /* match top ul list item height */ + z-index: 99; +} +ul.sf-menu li:hover li ul, +ul.sf-menu li.sfHover li ul { + top: -999em; +} +ul.sf-menu li li:hover ul, +ul.sf-menu li li.sfHover ul { + left: 10em; /* match ul width */ + top: 0; +} +ul.sf-menu li li:hover li ul, +ul.sf-menu li li.sfHover li ul { + top: -999em; +} +ul.sf-menu li li li:hover ul, +ul.sf-menu li li li.sfHover ul { + left: 10em; /* match ul width */ + top: 0; +} diff --git a/doc/src/template/style/superfish_skin.css b/doc/src/template/style/superfish_skin.css new file mode 100644 index 0000000..8d84827 --- /dev/null +++ b/doc/src/template/style/superfish_skin.css @@ -0,0 +1,83 @@ + +/*** DEMO SKIN ***/ +.sf-menu { + float: left; + margin-bottom: 1em; +} +.sf-menu a { + border-left: 1px solid #fff; + border-top: 1px solid #CFDEFF; + padding: .75em 1em; + text-decoration:none; +} +.sf-menu a, .sf-menu a:visited { /* visited pseudo selector so IE6 applies text colour*/ + color: #13a; +} +.sf-menu li { + background: #BDD2FF; +} +.sf-menu li li { + background: #AABDE6; +} +.sf-menu li li li { + background: #9AAEDB; +} +.sf-menu li:hover, .sf-menu li.sfHover, +.sf-menu a:focus, .sf-menu a:hover, .sf-menu a:active { + background: #CFDEFF; + outline: 0; +} + +/*** arrows **/ +.sf-menu a.sf-with-ul { + padding-right: 2.25em; + min-width: 1px; /* trigger IE7 hasLayout so spans position accurately */ +} +.sf-sub-indicator { + position: absolute; + display: block; + right: .75em; + top: 1.05em; /* IE6 only */ + width: 10px; + height: 10px; + text-indent: -999em; + overflow: hidden; + background: url('../images/arrows-ffffff.png') no-repeat -10px -100px; /* 8-bit indexed alpha png. IE6 gets solid image only */ +} +a > .sf-sub-indicator { /* give all except IE6 the correct values */ + top: .8em; + background-position: 0 -100px; /* use translucent arrow for modern browsers*/ +} +/* apply hovers to modern browsers */ +a:focus > .sf-sub-indicator, +a:hover > .sf-sub-indicator, +a:active > .sf-sub-indicator, +li:hover > a > .sf-sub-indicator, +li.sfHover > a > .sf-sub-indicator { + background-position: -10px -100px; /* arrow hovers for modern browsers*/ +} + +/* point right for anchors in subs */ +.sf-menu ul .sf-sub-indicator { background-position: -10px 0; } +.sf-menu ul a > .sf-sub-indicator { background-position: 0 0; } +/* apply hovers to modern browsers */ +.sf-menu ul a:focus > .sf-sub-indicator, +.sf-menu ul a:hover > .sf-sub-indicator, +.sf-menu ul a:active > .sf-sub-indicator, +.sf-menu ul li:hover > a > .sf-sub-indicator, +.sf-menu ul li.sfHover > a > .sf-sub-indicator { + background-position: -10px 0; /* arrow hovers for modern browsers*/ +} + +/*** shadows for all but IE6 ***/ +.sf-shadow ul { + background: url('../images/shadow.png') no-repeat bottom right; + padding: 0 8px 9px 0; + -moz-border-radius-bottomleft: 17px; + -moz-border-radius-topright: 17px; + -webkit-border-top-right-radius: 17px; + -webkit-border-bottom-left-radius: 17px; +} +.sf-shadow ul.sf-shadow-off { + background: transparent; +} diff --git a/tools/qdoc3/htmlgenerator.cpp b/tools/qdoc3/htmlgenerator.cpp index bf80277..f6b8c06 100644 --- a/tools/qdoc3/htmlgenerator.cpp +++ b/tools/qdoc3/htmlgenerator.cpp @@ -519,14 +519,14 @@ int HtmlGenerator::generateAtom(const Atom *atom, out() << formattingRightMap()[ATOM_FORMATTING_TELETYPE]; break; case Atom::Code: - out() << "
      "
      +	out() << "
      "
                     << trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()),
                                                        marker,relative))
                     << "
      \n"; break; #ifdef QDOC_QML case Atom::Qml: - out() << "
      "
      +	out() << "
      "
                     << trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()),
                                                        marker,relative))
                     << "
      \n"; @@ -534,7 +534,7 @@ int HtmlGenerator::generateAtom(const Atom *atom, #endif case Atom::CodeNew: out() << "

      you can rewrite it as

      \n" - << "
      "
      +              << "
      "
                     << trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()),
                                                        marker,relative))
                     << "
      \n"; @@ -543,7 +543,7 @@ int HtmlGenerator::generateAtom(const Atom *atom, out() << "

      For example, if you have code like

      \n"; // fallthrough case Atom::CodeBad: - out() << "
      "
      +        out() << "
      "
                     << trimmedTrailing(protectEnc(plainCode(indent(codeIndent,atom->string()))))
                     << "
      \n"; break; @@ -1797,31 +1797,51 @@ void HtmlGenerator::generateHeader(const QString& title, out() << " " << shortVersion << protectEnc(title) << "\n"; - out() << " "; - out() << ""; - out() << ""; - out() << ""; - - //out() << " Qt Reference Documentation"; - out() << " \n"; - out() << " \n"; - out() << " \n"; - out() << "\n"; if (offlineDocs) - out() << "\n"; + { + out() << " "; + out() << "\n"; + out() << "\n"; // narrow mainly for Creator + } else - out() << "\n"; + { + out() << " "; + out() << " \n"; + out() << "\n"; + out() << "\n"; + out() << "\n"; + // jquery functions + out() << " \n"; + out() << " \n"; + // menus and small docs js and css + out() << " \n"; + out() << " \n"; + out() << " "; + out() << " "; + + // syntax highlighter js and css + // out() << " \n"; + // out() << " \n"; + // out() << " \n"; + // out() << " \n"; + // out() << " \n"; + + out() << "\n"; + out() << "\n"; + } #ifdef GENERATE_MAC_REFS if (mainPage) @@ -1863,8 +1883,16 @@ void HtmlGenerator::generateFooter(const Node *node) out() << QString(footer).replace("\\" + COMMAND_VERSION, myTree->version()) << QString(address).replace("\\" + COMMAND_VERSION, myTree->version()); - out() << " \n"; + + if (offlineDocs) + { out() << "\n"; + } + else + { + out() << " \n"; + out() << "\n"; + } out() << "\n"; } @@ -1886,7 +1914,7 @@ void HtmlGenerator::generateBrief(const Node *node, CodeMarker *marker, void HtmlGenerator::generateIncludes(const InnerNode *inner, CodeMarker *marker) { if (!inner->includes().isEmpty()) { - out() << "
      "
      +        out() << "
      "
                     << trimmedTrailing(highlightedCode(indent(codeIndent,
                                                               marker->markedUpIncludes(inner->includes())),
                                                        marker,inner))
      @@ -2110,6 +2138,8 @@ void HtmlGenerator::generateNavigationBar(const NavigationBar& bar,
                   out() << "]\n";
       #endif
               }
      +		if (fake->name() != QString("index.html"))
      +			{
               if (bar.current.begin() != 0) {
                   out() << "[Home]\n";
      @@ -2121,6 +2151,7 @@ void HtmlGenerator::generateNavigationBar(const NavigationBar& bar,
                   out() << "]\n";
               }
               out() << "

      \n"; + } } } #endif diff --git a/tools/qdoc3/test/assistant.qdocconf b/tools/qdoc3/test/assistant.qdocconf index 167bb19..4b52992 100644 --- a/tools/qdoc3/test/assistant.qdocconf +++ b/tools/qdoc3/test/assistant.qdocconf @@ -30,6 +30,7 @@ qhp.Assistant.extraFiles = images/bg_l.png \ images/page.png \ images/page_bg.png \ images/sprites-combined.png \ + images/arrow-down.png \ images/spinner.gif \ images/stylesheet-coffee-plastique.png \ images/taskmenuextension-example.png \ @@ -37,6 +38,7 @@ qhp.Assistant.extraFiles = images/bg_l.png \ images/dynamiclayouts-example.png \ scripts/functions.js \ scripts/jquery.js \ + style/OfflineStyle.css \ style/style_ie6.css \ style/style_ie7.css \ style/style_ie8.css \ diff --git a/tools/qdoc3/test/designer.qdocconf b/tools/qdoc3/test/designer.qdocconf index 48e3ea1..b1f37dc 100644 --- a/tools/qdoc3/test/designer.qdocconf +++ b/tools/qdoc3/test/designer.qdocconf @@ -30,6 +30,7 @@ qhp.Designer.extraFiles = images/bg_l.png \ images/page.png \ images/page_bg.png \ images/sprites-combined.png \ + images/arrow-down.png \ images/spinner.gif \ images/stylesheet-coffee-plastique.png \ images/taskmenuextension-example.png \ @@ -37,6 +38,7 @@ qhp.Designer.extraFiles = images/bg_l.png \ images/dynamiclayouts-example.png \ scripts/functions.js \ scripts/jquery.js \ + style/OfflineStyle.css \ style/style_ie6.css \ style/style_ie7.css \ style/style_ie8.css \ diff --git a/tools/qdoc3/test/linguist.qdocconf b/tools/qdoc3/test/linguist.qdocconf index 8974bd7..26fb55c 100644 --- a/tools/qdoc3/test/linguist.qdocconf +++ b/tools/qdoc3/test/linguist.qdocconf @@ -30,13 +30,15 @@ qhp.Linguist.extraFiles = images/bg_l.png \ images/page.png \ images/page_bg.png \ images/sprites-combined.png \ - images/spinner.gif \ + images/arrow-down.png \ +s images/spinner.gif \ images/stylesheet-coffee-plastique.png \ images/taskmenuextension-example.png \ images/coloreditorfactoryimage.png \ images/dynamiclayouts-example.png \ scripts/functions.js \ scripts/jquery.js \ + style/OfflineStyle.css \ style/style_ie6.css \ style/style_ie7.css \ style/style_ie8.css \ diff --git a/tools/qdoc3/test/qdeclarative.qdocconf b/tools/qdoc3/test/qdeclarative.qdocconf index 0f2e381..74fd802 100644 --- a/tools/qdoc3/test/qdeclarative.qdocconf +++ b/tools/qdoc3/test/qdeclarative.qdocconf @@ -41,6 +41,7 @@ qhp.Qml.extraFiles = images/bg_l.png \ images/page.png \ images/page_bg.png \ images/sprites-combined.png \ + images/arrow-down.png \ images/spinner.png \ images/stylesheet-coffee-plastique.png \ images/taskmenuextension-example.png \ @@ -48,6 +49,7 @@ qhp.Qml.extraFiles = images/bg_l.png \ images/dynamiclayouts-example.png \ scripts/functions.js \ scripts/jquery.js \ + style/OfflineStyle.css \ style/style_ie6.css \ style/style_ie7.css \ style/style_ie8.css \ diff --git a/tools/qdoc3/test/qmake.qdocconf b/tools/qdoc3/test/qmake.qdocconf index ea58059..f069129 100644 --- a/tools/qdoc3/test/qmake.qdocconf +++ b/tools/qdoc3/test/qmake.qdocconf @@ -30,6 +30,7 @@ qhp.qmake.extraFiles = images/bg_l.png \ images/page.png \ images/page_bg.png \ images/sprites-combined.png \ + images/arrow-down.png \ images/spinner.gif \ images/stylesheet-coffee-plastique.png \ images/taskmenuextension-example.png \ @@ -37,6 +38,7 @@ qhp.qmake.extraFiles = images/bg_l.png \ images/dynamiclayouts-example.png \ scripts/functions.js \ scripts/jquery.js \ + style/OfflineStyle.css \ style/style_ie6.css \ style/style_ie7.css \ style/style_ie8.css \ diff --git a/tools/qdoc3/test/qt-build-docs.qdocconf b/tools/qdoc3/test/qt-build-docs.qdocconf index bd363a6..00704ea 100644 --- a/tools/qdoc3/test/qt-build-docs.qdocconf +++ b/tools/qdoc3/test/qt-build-docs.qdocconf @@ -36,6 +36,7 @@ qhp.Qt.extraFiles = index.html \ images/page.png \ images/page_bg.png \ images/sprites-combined.png \ + images/arrow-down.png \ images/spinner.gif \ images/stylesheet-coffee-plastique.png \ images/taskmenuextension-example.png \ @@ -43,6 +44,7 @@ qhp.Qt.extraFiles = index.html \ images/dynamiclayouts-example.png \ scripts/functions.js \ scripts/jquery.js \ + style/OfflineStyle.css \ style/style_ie6.css \ style/style_ie7.css \ style/style_ie8.css \ diff --git a/tools/qdoc3/test/qt-build-docs_zh_CN.qdocconf b/tools/qdoc3/test/qt-build-docs_zh_CN.qdocconf index caf5f73..712e23f 100644 --- a/tools/qdoc3/test/qt-build-docs_zh_CN.qdocconf +++ b/tools/qdoc3/test/qt-build-docs_zh_CN.qdocconf @@ -44,6 +44,7 @@ qhp.Qt.extraFiles = index.html \ images/page.png \ images/page_bg.png \ images/sprites-combined.png \ + images/arrow-down.png \ images/spinner.gif \ images/stylesheet-coffee-plastique.png \ images/taskmenuextension-example.png \ diff --git a/tools/qdoc3/test/qt-defines.qdocconf b/tools/qdoc3/test/qt-defines.qdocconf index 3e71d07..9e41d93 100644 --- a/tools/qdoc3/test/qt-defines.qdocconf +++ b/tools/qdoc3/test/qt-defines.qdocconf @@ -20,34 +20,49 @@ codeindent = 1 # See also qhp.Qt.extraFiles extraimages.HTML = qt-logo \ trolltech-logo \ - bg_l.png \ - bg_l_blank.png \ - bg_r.png \ - box_bg.png \ - breadcrumb.png \ - bullet_gt.png \ - bullet_dn.png \ - bullet_sq.png \ - bullet_up.png \ - feedbackground.png \ - horBar.png \ - page.png \ - page_bg.png \ - sprites-combined.png \ - spinner.gif \ - taskmenuextension-example.png \ - coloreditorfactoryimage.png \ - dynamiclayouts-example.png \ - stylesheet-coffee-plastique.png + bg_l.png \ + bg_l_blank.png \ + bg_ll_blank.png \ + bg_ul_blank.png \ + header_bg.png \ + bg_r.png \ + box_bg.png \ + breadcrumb.png \ + bullet_gt.png \ + bullet_dn.png \ + bullet_sq.png \ + bullet_up.png \ + arrow_down.png \ + feedbackground.png \ + horBar.png \ + page.png \ + page_bg.png \ + sprites-combined.png \ + spinner.gif \ + stylesheet-coffee-plastique.png \ + taskmenuextension-example.png \ + coloreditorfactoryimage.png \ + dynamiclayouts-example.png \ # This stuff is used by the new doc format. scriptdirs = $QT_SOURCE_TREE/doc/src/template/scripts styledirs = $QT_SOURCE_TREE/doc/src/template/style scripts.HTML = functions.js \ + shBrushCpp.js \ + shCore.js \ + shLegacy.js \ + narrow.js \ + superfish.js \ jquery.js styles.HTML = style.css \ + shCore.css \ + shThemeDefault.css \ + narrow.css \ + superfish.css \ + superfish_skin.css \ + OfflineStyle.css \ style_ie6.css \ style_ie7.css \ style_ie8.css diff --git a/tools/qdoc3/test/qt-html-templates.qdocconf b/tools/qdoc3/test/qt-html-templates.qdocconf index b72a1eb..60f5fb1 100644 --- a/tools/qdoc3/test/qt-html-templates.qdocconf +++ b/tools/qdoc3/test/qt-html-templates.qdocconf @@ -1,12 +1,19 @@ -HTML.stylesheets = style/style_ie6.css \ +HTML.stylesheets = style/style.css \ + style/OfflineStyle.css \ style/style_ie7.css \ style/style_ie8.css \ - style/style.css + style/style_ie6.css HTML.postheader = "
      \n" \ + "
      \n" \ "
      \n" \ " Home
      \n" \ " Qt Reference Documentation\n" \ + "
      \n" \ + "
      \n" \ + " \n" \ + "
      \n" \ + "
      \n" \ "
      \n" \ "
      \n" \ "
      \n" \ @@ -35,14 +72,14 @@ HTML.postheader = "
      \n" \ "
      \n" \ " Search index:
      \n" \ "
      \n" \ - "
      \n" \ + " \n" \ "
      \n" \ " \n" \ "
      \n" \ "
      \n" \ "
      \n" \ "
      \n" \ - "

      \n" \ + "

      \n" \ " API Lookup

      \n" \ "
      \n" \ "
        \n" \ @@ -56,7 +93,7 @@ HTML.postheader = "
        \n" \ "
        \n" \ "
      \n" \ "
      \n" \ - "

      \n" \ + "

      \n" \ " Qt Topics

      \n" \ "
      \n" \ "
        \n" \ @@ -68,7 +105,7 @@ HTML.postheader = "
        \n" \ "
        \n" \ "
      \n" \ "
      \n" \ - "

      \n" \ + "

      \n" \ " Examples

      \n" \ "
      \n" \ "
        \n" \ @@ -129,7 +166,7 @@ HTML.footer = " \n" \ "
      \n" \ "
      \n" \ "
      \n" \ - "\n" \ " ga.src = (\'https:\' == document.location.protocol ? \'https://ssl\' : \'http://www\') + \'.google-analytics.com/ga.js\';\n" \ " var s = document.getElementsByTagName(\'script\')[0]; s.parentNode.insertBefore(ga, s);\n" \ " })();\n" \ - " -->\n" + "\n" diff --git a/tools/qdoc3/test/qt.qdocconf b/tools/qdoc3/test/qt.qdocconf index 267d536..edf6d92 100644 --- a/tools/qdoc3/test/qt.qdocconf +++ b/tools/qdoc3/test/qt.qdocconf @@ -28,13 +28,17 @@ qhp.Qt.indexRoot = qhp.Qt.extraFiles = index.html \ images/bg_l.png \ images/bg_l_blank.png \ - images/bg_r.png \ + images/bg_ll_blank.png \ + images/bg_ul_blank.png \ + images/header_bg.png \ + images/bg_r.png \ images/box_bg.png \ images/breadcrumb.png \ images/bullet_gt.png \ images/bullet_dn.png \ images/bullet_sq.png \ images/bullet_up.png \ + images/arrow_down.png \ images/feedbackground.png \ images/horBar.png \ images/page.png \ @@ -47,6 +51,17 @@ qhp.Qt.extraFiles = index.html \ images/dynamiclayouts-example.png \ scripts/functions.js \ scripts/jquery.js \ + scripts/shBrushCpp.js \ + scripts/shCore.js \ + scripts/shLegacy.js \ + scripts/narrow.js \ + scripts/superfish.js \ + style/shCore.css \ + style/shThemeDefault.css \ + style/narrow.css \ + style/superfish.css \ + style/superfish_skin.css \ + style/OfflineStyle.css \ style/style_ie6.css \ style/style_ie7.css \ style/style_ie8.css \ -- cgit v0.12 From cd50f97a9f09eece645c9d7d01cb14c04521a915 Mon Sep 17 00:00:00 2001 From: Aaron McCarthy Date: Wed, 2 Jun 2010 15:41:22 +1000 Subject: Split Symbian bearer plugin into three platform specfic plugins Symbian bearer plugin has more functionality when built for newer platforms, so split the plugin into three platform specific plugins, and deploy the correct one depending on what the device supports. Written by: Miikka Heikkinen --- src/plugins/bearer/symbian/3_1/3_1.pro | 4 +++ src/plugins/bearer/symbian/3_2/3_2.pro | 12 +++++++ src/plugins/bearer/symbian/symbian.pri | 30 ++++++++++++++++ src/plugins/bearer/symbian/symbian.pro | 42 ++-------------------- src/plugins/bearer/symbian/symbian_3/symbian_3.pro | 14 ++++++++ src/s60installs/qsymbianbearer.qtplugin | 1 + src/s60installs/s60installs.pro | 25 +++++++++---- 7 files changed, 81 insertions(+), 47 deletions(-) create mode 100644 src/plugins/bearer/symbian/3_1/3_1.pro create mode 100644 src/plugins/bearer/symbian/3_2/3_2.pro create mode 100644 src/plugins/bearer/symbian/symbian.pri create mode 100644 src/plugins/bearer/symbian/symbian_3/symbian_3.pro create mode 100644 src/s60installs/qsymbianbearer.qtplugin diff --git a/src/plugins/bearer/symbian/3_1/3_1.pro b/src/plugins/bearer/symbian/3_1/3_1.pro new file mode 100644 index 0000000..a60d18b --- /dev/null +++ b/src/plugins/bearer/symbian/3_1/3_1.pro @@ -0,0 +1,4 @@ +include(../symbian.pri) + +LIBS += -lapengine +TARGET = $${TARGET}_3_1 diff --git a/src/plugins/bearer/symbian/3_2/3_2.pro b/src/plugins/bearer/symbian/3_2/3_2.pro new file mode 100644 index 0000000..4e5b416 --- /dev/null +++ b/src/plugins/bearer/symbian/3_2/3_2.pro @@ -0,0 +1,12 @@ +include(../symbian.pri) + +exists($${EPOCROOT}epoc32/release/winscw/udeb/cmmanager.lib)| \ +exists($${EPOCROOT}epoc32/release/armv5/lib/cmmanager.lib) { + DEFINES += SNAP_FUNCTIONALITY_AVAILABLE + LIBS += -lcmmanager +} else { + # Fall back to 3_1 implementation on platforms that do not have cmmanager + LIBS += -lapengine +} + +TARGET = $${TARGET}_3_2 diff --git a/src/plugins/bearer/symbian/symbian.pri b/src/plugins/bearer/symbian/symbian.pri new file mode 100644 index 0000000..bfcd9ed --- /dev/null +++ b/src/plugins/bearer/symbian/symbian.pri @@ -0,0 +1,30 @@ +TARGET = qsymbianbearer +include(../../qpluginbase.pri) + +QT += network + +HEADERS += ../symbianengine.h \ + ../qnetworksession_impl.h + +SOURCES += ../symbianengine.cpp \ + ../qnetworksession_impl.cpp \ + ../main.cpp + +TARGET.UID3=0x20021319 + +INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE +symbian-abld:INCLUDEPATH += $$QT_BUILD_TREE/include/QtNetwork/private + +LIBS += -lcommdb \ + -lapsettingshandlerui \ + -lconnmon \ + -lcentralrepository \ + -lesock \ + -linsock \ + -lecom \ + -lefsrv \ + -lnetmeta + +QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/bearer +target.path += $$[QT_INSTALL_PLUGINS]/bearer +INSTALLS += target diff --git a/src/plugins/bearer/symbian/symbian.pro b/src/plugins/bearer/symbian/symbian.pro index 4f1e51c..f320eb6 100644 --- a/src/plugins/bearer/symbian/symbian.pro +++ b/src/plugins/bearer/symbian/symbian.pro @@ -1,41 +1,3 @@ -TARGET = qsymbianbearer -include(../../qpluginbase.pri) +TEMPLATE = subdirs -QT += network - -HEADERS += symbianengine.h \ - qnetworksession_impl.h - -SOURCES += symbianengine.cpp \ - qnetworksession_impl.cpp \ - main.cpp - -symbian { - TARGET.UID3=0x20021319 - exists($${EPOCROOT}epoc32/release/winscw/udeb/cmmanager.lib)| \ - exists($${EPOCROOT}epoc32/release/armv5/lib/cmmanager.lib) { - message("Building with SNAP support") - DEFINES += SNAP_FUNCTIONALITY_AVAILABLE - LIBS += -lcmmanager - } else { - message("Building without SNAP support") - LIBS += -lapengine - } -} - -INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE -symbian-abld:INCLUDEPATH += $$QT_BUILD_TREE/include/QtNetwork/private - -LIBS += -lcommdb \ - -lapsettingshandlerui \ - -lconnmon \ - -lcentralrepository \ - -lesock \ - -linsock \ - -lecom \ - -lefsrv \ - -lnetmeta - -QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/bearer -target.path += $$[QT_INSTALL_PLUGINS]/bearer -INSTALLS += target +SUBDIRS += 3_1 3_2 symbian_3 \ No newline at end of file diff --git a/src/plugins/bearer/symbian/symbian_3/symbian_3.pro b/src/plugins/bearer/symbian/symbian_3/symbian_3.pro new file mode 100644 index 0000000..455aa67 --- /dev/null +++ b/src/plugins/bearer/symbian/symbian_3/symbian_3.pro @@ -0,0 +1,14 @@ +include(../symbian.pri) + +exists($${EPOCROOT}epoc32/release/winscw/udeb/cmmanager.lib)| \ +exists($${EPOCROOT}epoc32/release/armv5/lib/cmmanager.lib) { + DEFINES += SNAP_FUNCTIONALITY_AVAILABLE + LIBS += -lcmmanager + + exists($$MW_LAYER_PUBLIC_EXPORT_PATH(extendedconnpref.h)) { + DEFINES += OCC_FUNCTIONALITY_AVAILABLE + } +} else { + # Fall back to 3_1 implementation on platforms that do not have cmmanager + LIBS += -lapengine +} diff --git a/src/s60installs/qsymbianbearer.qtplugin b/src/s60installs/qsymbianbearer.qtplugin new file mode 100644 index 0000000..5c45bdd --- /dev/null +++ b/src/s60installs/qsymbianbearer.qtplugin @@ -0,0 +1 @@ +This file is a Qt plugin stub file. The real Qt plugin is located in /sys/bin. Created:2010-06-02T14:02:21 diff --git a/src/s60installs/s60installs.pro b/src/s60installs/s60installs.pro index 90c362b..15d7830 100644 --- a/src/s60installs/s60installs.pro +++ b/src/s60installs/s60installs.pro @@ -51,20 +51,35 @@ symbian: { symbian-abld|symbian-sbsv2 { pluginLocations = $${EPOCROOT}epoc32/release/$(PLATFORM)/$(TARGET) + bearerPluginLocation = $${EPOCROOT}epoc32/release/$(PLATFORM)/$(TARGET) + bearerStubZ = $${EPOCROOT}$${HW_ZDIR}$${QT_PLUGINS_BASE_DIR}/bearer/qsymbianbearer$${QT_LIBINFIX}.qtplugin + BLD_INF_RULES.prj_exports += \ + "qsymbianbearer.qtplugin $$bearerStubZ" \ + "qsymbianbearer.qtplugin /epoc32/winscw/c$${QT_PLUGINS_BASE_DIR}/bearer/qsymbianbearer$${QT_LIBINFIX}.qtplugin" } else { pluginLocations = $$QT_BUILD_TREE/plugins/s60 + bearerPluginLocation = $$QT_BUILD_TREE/plugins/bearer + bearerStubZ = $${PWD}/qsymbianbearer.qtplugin } qts60plugindeployment = \ - "IF package(0x1028315F)" \ + "IF package(0x20022E6D)" \ + " \"$$pluginLocations/qts60plugin_5_0$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qts60plugin_5_0$${QT_LIBINFIX}.dll\"" \ + " \"$$bearerPluginLocation/qsymbianbearer$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qsymbianbearer$${QT_LIBINFIX}.dll\"" \ + "ELSEIF package(0x1028315F)" \ " \"$$pluginLocations/qts60plugin_5_0$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qts60plugin_5_0$${QT_LIBINFIX}.dll\"" \ + " \"$$bearerPluginLocation/qsymbianbearer_3_2$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qsymbianbearer$${QT_LIBINFIX}.dll\"" \ "ELSEIF package(0x102752AE)" \ " \"$$pluginLocations/qts60plugin_3_2$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qts60plugin_3_2$${QT_LIBINFIX}.dll\"" \ + " \"$$bearerPluginLocation/qsymbianbearer_3_2$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qsymbianbearer$${QT_LIBINFIX}.dll\"" \ "ELSEIF package(0x102032BE)" \ " \"$$pluginLocations/qts60plugin_3_1$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qts60plugin_3_1$${QT_LIBINFIX}.dll\"" \ + " \"$$bearerPluginLocation/qsymbianbearer_3_1$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qsymbianbearer$${QT_LIBINFIX}.dll\"" \ "ELSE" \ " \"$$pluginLocations/qts60plugin_5_0$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qts60plugin_5_0$${QT_LIBINFIX}.dll\"" \ - "ENDIF" + " \"$$bearerPluginLocation/qsymbianbearer$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qsymbianbearer$${QT_LIBINFIX}.dll\"" \ + "ENDIF" \ + " \"$$bearerStubZ\" - \"c:$$replace(QT_PLUGINS_BASE_DIR,/,\\)\\bearer\\qsymbianbearer$${QT_LIBINFIX}.qtplugin\" qtlibraries.pkg_postrules += qts60plugindeployment @@ -111,15 +126,11 @@ symbian: { qtbackup.sources = backup_registration.xml qtbackup.path = c:/private/10202D56/import/packages/$$replace(TARGET.UID3, 0x,) - bearer_plugins.path = c:$$QT_PLUGINS_BASE_DIR/bearer - bearer_plugins.sources += $$QT_BUILD_TREE/plugins/bearer/qsymbianbearer$${QT_LIBINFIX}.dll - DEPLOYMENT += qtlibraries \ qtbackup \ imageformats_plugins \ codecs_plugins \ - graphicssystems_plugins \ - bearer_plugins + graphicssystems_plugins contains(QT_CONFIG, svg): { qtlibraries.sources += $$QMAKE_LIBDIR_QT/QtSvg$${QT_LIBINFIX}.dll -- cgit v0.12 From 0f16c7ce8dcd6f4905d14875088c55148e41366a Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Tue, 1 Jun 2010 16:50:55 +0200 Subject: QSslCertificate: support large serial numbers We were calling an OpenSSL function that returned a long for the serial number; sometimes serial numbers are too big to fit into a long (up to 20 octets). In that case, do not convert the serial number to decimal, but just output the hexadecimal value. Reviewed-by: Zeno Albisser Task-number: QTBUG-9973 --- src/network/ssl/qsslcertificate.cpp | 23 ++++++++++++++++++---- .../more-certificates/cert-large-serial-number.pem | 14 +++++++++++++ tests/auto/qsslcertificate/tst_qsslcertificate.cpp | 13 ++++++++++++ 3 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 tests/auto/qsslcertificate/more-certificates/cert-large-serial-number.pem diff --git a/src/network/ssl/qsslcertificate.cpp b/src/network/ssl/qsslcertificate.cpp index fd647e2..31c5ed1 100644 --- a/src/network/ssl/qsslcertificate.cpp +++ b/src/network/ssl/qsslcertificate.cpp @@ -259,13 +259,28 @@ QByteArray QSslCertificate::version() const /*! Returns the certificate's serial number string in decimal format. + In case the serial number cannot be converted to decimal format + (i.e. if it is bigger than 4294967295, which means it does not fit into 4 bytes), + its hexadecimal version is returned. */ QByteArray QSslCertificate::serialNumber() const { - if (d->serialNumberString.isEmpty() && d->x509) - d->serialNumberString = - QByteArray::number(qlonglong(q_ASN1_INTEGER_get(d->x509->cert_info->serialNumber))); - + if (d->serialNumberString.isEmpty() && d->x509) { + ASN1_INTEGER *serialNumber = d->x509->cert_info->serialNumber; + // if we cannot convert to a long, just output the hexadecimal number + if (serialNumber->length > 4) { + QByteArray hexString; + hexString.reserve(serialNumber->length * 3); + for (int a = 0; a < serialNumber->length; ++a) { + hexString += QByteArray::number(serialNumber->data[a], 16).rightJustified(2, '0'); + hexString += ':'; + } + hexString.chop(1); + d->serialNumberString = hexString; + } else { + d->serialNumberString = QByteArray::number(qlonglong(q_ASN1_INTEGER_get(serialNumber))); + } + } return d->serialNumberString; } diff --git a/tests/auto/qsslcertificate/more-certificates/cert-large-serial-number.pem b/tests/auto/qsslcertificate/more-certificates/cert-large-serial-number.pem new file mode 100644 index 0000000..ecb6c35 --- /dev/null +++ b/tests/auto/qsslcertificate/more-certificates/cert-large-serial-number.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICGjCCAYMCFAECAwQFBgcICRCqu8zd7v8XGBkgMA0GCSqGSIb3DQEBBQUAMEwx +CzAJBgNVBAYTAkdCMRIwEAYDVQQIEwlCZXJrc2hpcmUxEDAOBgNVBAcTB05ld2J1 +cnkxFzAVBgNVBAoTDk15IENvbXBhbnkgTHRkMB4XDTEwMDYwMTE1MDI0MVoXDTEx +MDYwMTE1MDI0MVowTDELMAkGA1UEBhMCR0IxEjAQBgNVBAgTCUJlcmtzaGlyZTEQ +MA4GA1UEBxMHTmV3YnVyeTEXMBUGA1UEChMOTXkgQ29tcGFueSBMdGQwgZ8wDQYJ +KoZIhvcNAQEBBQADgY0AMIGJAoGBAM2q22/WNMmn8cC+5EEYGeICySLmp9W6Ay6e +KHr0Xxp3X3epETuPfvAuxp7rOtkS18EMUegkUj8jw0IMEcbyHKFC/rTCaYOt93Cx +GBXMIChiMPAsFeYzGa/D6xzAkfcRaJRQ+Ek3CDLXPnXfo7xpABXezYcPXAJrgsgB +fWrwHdxzAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtlScqSn4IHFLRiQYQdfOgsPi +wdqD1MPZEniQE0Xp8McZ7kuYbGgdEqzeVgMHqitlzkNNtTz+2u37CbFNXDGCTy5D +2JCgZxaAWNkh1w+4VB91HfMwEU0MqvAO7SB31FwbKNaB3gVnua++NL1cAkujyRny +yR3PatYZCfESQ7oZgds= +-----END CERTIFICATE----- diff --git a/tests/auto/qsslcertificate/tst_qsslcertificate.cpp b/tests/auto/qsslcertificate/tst_qsslcertificate.cpp index c76c11f..505b867 100644 --- a/tests/auto/qsslcertificate/tst_qsslcertificate.cpp +++ b/tests/auto/qsslcertificate/tst_qsslcertificate.cpp @@ -109,6 +109,7 @@ private slots: void task256066toPem(); void nulInCN(); void nulInSan(); + void largeSerialNumber(); // ### add tests for certificate bundles (multiple certificates concatenated into a single // structure); both PEM and DER formatted #endif @@ -786,6 +787,18 @@ void tst_QSslCertificate::nulInSan() QCOMPARE(dnssan, QString::fromLatin1(realSAN, sizeof realSAN - 1)); } +void tst_QSslCertificate::largeSerialNumber() +{ + QList certList = + QSslCertificate::fromPath(SRCDIR "more-certificates/cert-large-serial-number.pem"); + + QCOMPARE(certList.size(), 1); + + const QSslCertificate &cert = certList.at(0); + QVERIFY(!cert.isNull()); + QCOMPARE(cert.serialNumber(), QByteArray("01:02:03:04:05:06:07:08:09:10:aa:bb:cc:dd:ee:ff:17:18:19:20")); +} + #endif // QT_NO_OPENSSL QTEST_MAIN(tst_QSslCertificate) -- cgit v0.12 From 417f3a4ece9403d1eb37ce0ecdf74cf670bdd0ff Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Wed, 2 Jun 2010 11:56:19 +0200 Subject: QNAM: Improve child deletion order Delete the QNetworkReply children first because they could access the QAbstractNetworkCache that is also a child of the QNetworkAccessManager. Reviewed-by: brad --- src/network/access/qnetworkaccessmanager.cpp | 9 +++ .../qnetworkdiskcache/tst_qnetworkdiskcache.cpp | 77 ++++++++++++++++++++++ 2 files changed, 86 insertions(+) diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp index 42c64fb..837cf66 100644 --- a/src/network/access/qnetworkaccessmanager.cpp +++ b/src/network/access/qnetworkaccessmanager.cpp @@ -464,6 +464,15 @@ QNetworkAccessManager::~QNetworkAccessManager() #ifndef QT_NO_NETWORKPROXY delete d_func()->proxyFactory; #endif + + // Delete the QNetworkReply children first. + // Else a QAbstractNetworkCache might get deleted in ~QObject + // before a QNetworkReply that accesses the QAbstractNetworkCache + // object in its destructor. + qDeleteAll(findChildren()); + // The other children will be deleted in this ~QObject + // FIXME instead of this "hack" make the QNetworkReplyImpl + // properly watch the cache deletion, e.g. via a QWeakPointer. } #ifndef QT_NO_NETWORKPROXY diff --git a/tests/auto/qnetworkdiskcache/tst_qnetworkdiskcache.cpp b/tests/auto/qnetworkdiskcache/tst_qnetworkdiskcache.cpp index 8ce10fb..5bbe8f6 100644 --- a/tests/auto/qnetworkdiskcache/tst_qnetworkdiskcache.cpp +++ b/tests/auto/qnetworkdiskcache/tst_qnetworkdiskcache.cpp @@ -78,6 +78,56 @@ private slots: void oldCacheVersionFile(); void sync(); + + void crashWhenParentingCache(); +}; + +// FIXME same as in tst_qnetworkreply.cpp .. could be unified +// Does not work for POST/PUT! +class MiniHttpServer: public QTcpServer +{ + Q_OBJECT +public: + QTcpSocket *client; // always the last one that was received + QByteArray dataToTransmit; + QByteArray receivedData; + bool doClose; + bool multiple; + int totalConnections; + + MiniHttpServer(const QByteArray &data) : client(0), dataToTransmit(data), doClose(true), multiple(false), totalConnections(0) + { + listen(); + connect(this, SIGNAL(newConnection()), this, SLOT(doAccept())); + } + +public slots: + void doAccept() + { + client = nextPendingConnection(); + client->setParent(this); + ++totalConnections; + connect(client, SIGNAL(readyRead()), this, SLOT(readyReadSlot())); + } + + void readyReadSlot() + { + receivedData += client->readAll(); + int doubleEndlPos = receivedData.indexOf("\r\n\r\n"); + + if (doubleEndlPos != -1) { + // multiple requests incoming. remove the bytes of the current one + if (multiple) + receivedData.remove(0, doubleEndlPos+4); + + client->write(dataToTransmit); + if (doClose) { + client->disconnectFromHost(); + disconnect(client, 0, this, 0); + client = 0; + } + } + } }; // Subclass that exposes the protected functions. @@ -581,6 +631,33 @@ public: Runner *other; }; +void tst_QNetworkDiskCache::crashWhenParentingCache() +{ + // the trick here is to not send the complete response + // but some data. So we get a readyRead() and it gets tried + // to be saved to the cache + QByteArray data("HTTP/1.0 200 OK\r\nCache-Control: max-age=300\r\nAge: 1\r\nContent-Length: 5\r\n\r\n123"); + MiniHttpServer server(data); + + QNetworkAccessManager *manager = new QNetworkAccessManager(); + QNetworkDiskCache *diskCache = new QNetworkDiskCache(manager); // parent to qnam! + // we expect the temp dir to be cleaned at some point anyway + diskCache->setCacheDirectory(QDir::tempPath() + "/cacheDir_" + QCoreApplication::applicationPid()); + manager->setCache(diskCache); + + QUrl url("http://127.0.0.1:" + QString::number(server.serverPort())); + QNetworkRequest request(url); + // request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork); + QNetworkReply *reply = manager->get(request); // new reply is parented to qnam + + // wait for readyRead of reply! + connect(reply, SIGNAL(readyRead()), &QTestEventLoop::instance(), SLOT(exitLoop())); + QTestEventLoop::instance().enterLoop(5); + QVERIFY(!QTestEventLoop::instance().timeout()); + + delete manager; // crashed before.. +} + void tst_QNetworkDiskCache::sync() { // This tests would be a nice to have, but is currently not supported. -- cgit v0.12 From 7644a925dab5400280228cd2f7381030368c6913 Mon Sep 17 00:00:00 2001 From: Jens Bache-Wiig Date: Wed, 2 Jun 2010 12:58:17 +0200 Subject: More Pixmap cache key optimizations Reviewed-by: ogoffart --- src/gui/image/qiconloader.cpp | 16 +++++------ src/gui/painting/qbrush.cpp | 7 +++-- src/gui/painting/qdrawutil.cpp | 5 +++- src/gui/painting/qpaintengine_x11.cpp | 7 ++++- src/gui/painting/qpainter.cpp | 8 +++--- src/gui/styles/qgtkpainter.cpp | 51 +++++++++++++++++++++-------------- src/gui/styles/qgtkstyle.cpp | 2 +- src/gui/styles/qplastiquestyle.cpp | 37 ++++++++++++------------- src/gui/styles/qwindowsstyle.cpp | 5 ++-- 9 files changed, 79 insertions(+), 59 deletions(-) diff --git a/src/gui/image/qiconloader.cpp b/src/gui/image/qiconloader.cpp index a515ef8..34f40a9 100644 --- a/src/gui/image/qiconloader.cpp +++ b/src/gui/image/qiconloader.cpp @@ -63,6 +63,8 @@ #include #endif +#include + QT_BEGIN_NAMESPACE Q_GLOBAL_STATIC(QIconLoader, iconLoaderInstance) @@ -488,14 +490,12 @@ QPixmap PixmapEntry::pixmap(const QSize &size, QIcon::Mode mode, QIcon::State st basePixmap.load(filename); int actualSize = qMin(size.width(), size.height()); - QString key = QLatin1String("$qt_theme_") - + QString::number(basePixmap.cacheKey(), 16) - + QLatin1Char('_') - + QString::number(mode) - + QLatin1Char('_') - + QString::number(qApp->palette().cacheKey(), 16) - + QLatin1Char('_') - + QString::number(actualSize); + + QString key = QLatin1Literal("$qt_theme_") + % HexString(basePixmap.cacheKey()) + % HexString(mode) + % HexString(qApp->palette().cacheKey()) + % HexString(actualSize); QPixmap cachedPixmap; if (QPixmapCache::find(key, &cachedPixmap)) { diff --git a/src/gui/painting/qbrush.cpp b/src/gui/painting/qbrush.cpp index b468b11..d3061d8 100644 --- a/src/gui/painting/qbrush.cpp +++ b/src/gui/painting/qbrush.cpp @@ -48,6 +48,7 @@ #include "qline.h" #include "qdebug.h" #include +#include "private/qstylehelper_p.h" QT_BEGIN_NAMESPACE @@ -96,9 +97,11 @@ const uchar *qt_patternForBrush(int brushStyle, bool invert) QPixmap qt_pixmapForBrush(int brushStyle, bool invert) { + QPixmap pm; - QString key = QLatin1String("$qt-brush$") + QString::number(brushStyle) - + QString::number((int)invert); + QString key = QLatin1Literal("$qt-brush$") + % HexString(brushStyle) + % QLatin1Char(invert ? '1' : '0'); if (!QPixmapCache::find(key, pm)) { pm = QBitmap::fromData(QSize(8, 8), qt_patternForBrush(brushStyle, invert), QImage::Format_MonoLSB); diff --git a/src/gui/painting/qdrawutil.cpp b/src/gui/painting/qdrawutil.cpp index 3ce95ef..11ea6d5 100644 --- a/src/gui/painting/qdrawutil.cpp +++ b/src/gui/painting/qdrawutil.cpp @@ -48,6 +48,7 @@ #include #include #include +#include QT_BEGIN_NAMESPACE @@ -1018,7 +1019,9 @@ void qDrawItem(QPainter *p, Qt::GUIStyle gs, ; #ifndef QT_NO_IMAGE_HEURISTIC_MASK } else { // color pixmap, no mask - QString k = QString::fromLatin1("$qt-drawitem-%1").arg(pm.cacheKey()); + QString k = QLatin1Literal("$qt-drawitem") + % HexString(pm.cacheKey()); + if (!QPixmapCache::find(k, pm)) { pm = pm.createHeuristicMask(); pm.setMask((QBitmap&)pm); diff --git a/src/gui/painting/qpaintengine_x11.cpp b/src/gui/painting/qpaintengine_x11.cpp index aef8b80..b8ad9b3 100644 --- a/src/gui/painting/qpaintengine_x11.cpp +++ b/src/gui/painting/qpaintengine_x11.cpp @@ -79,6 +79,8 @@ #include #endif +#include + QT_BEGIN_NAMESPACE extern Drawable qt_x11Handle(const QPaintDevice *pd); @@ -224,7 +226,10 @@ static const uchar base_dither_matrix[DITHER_SIZE][DITHER_SIZE] = { static QPixmap qt_patternForAlpha(uchar alpha, int screen) { QPixmap pm; - QString key = QLatin1String("$qt-alpha-brush$") + QString::number(alpha) + QString::number(screen); + QString key = QLatin1Literal("$qt-alpha-brush$") + % HexString(alpha) + % HexString(screen); + if (!QPixmapCache::find(key, pm)) { // #### why not use a mono image here???? QImage pattern(DITHER_SIZE, DITHER_SIZE, QImage::Format_ARGB32); diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp index e460b7b..97f754d 100644 --- a/src/gui/painting/qpainter.cpp +++ b/src/gui/painting/qpainter.cpp @@ -72,6 +72,7 @@ #include #include #include +#include QT_BEGIN_NAMESPACE @@ -6245,10 +6246,9 @@ static QPixmap generateWavyPixmap(qreal maxRadius, const QPen &pen) { const qreal radiusBase = qMax(qreal(1), maxRadius); - QString key = QLatin1String("WaveUnderline-"); - key += pen.color().name(); - key += QLatin1Char('-'); - key += QString::number(radiusBase); + QString key = QLatin1Literal("WaveUnderline-") + % pen.color().name() + % HexString(radiusBase); QPixmap pixmap; if (QPixmapCache::find(key, pixmap)) diff --git a/src/gui/styles/qgtkpainter.cpp b/src/gui/styles/qgtkpainter.cpp index 79c53e9..0217a39 100644 --- a/src/gui/styles/qgtkpainter.cpp +++ b/src/gui/styles/qgtkpainter.cpp @@ -241,8 +241,10 @@ void QGtkPainter::paintBoxGap(GtkWidget *gtkWidget, const gchar* part, if (rect.height() > maxHeight && (gap_side == GTK_POS_TOP || gap_side == GTK_POS_BOTTOM)) rect.setHeight(2 * border + 1); - QString gapExtras = QString(QLS("s %0 w %1 g %2")).arg(gap_side).arg(width).arg(x); - QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size(), gtkWidget) + gapExtras; + QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size(), gtkWidget) + % HexString(gap_side) + % HexString(width) + % HexString(x); if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) { DRAW_TO_CACHE(QGtkStylePrivate::gtk_paint_box_gap (style, @@ -307,7 +309,7 @@ void QGtkPainter::paintBox(GtkWidget *gtkWidget, const gchar* part, rect.setHeight(2 * border + 1); QString pixmapName = uniqueName(QLS(part), state, shadow, - rect.size(), gtkWidget) + pmKey; + rect.size(), gtkWidget) % pmKey; if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) { DRAW_TO_CACHE(QGtkStylePrivate::gtk_paint_box (style, @@ -357,9 +359,11 @@ void QGtkPainter::paintHline(GtkWidget *gtkWidget, const gchar* part, return; QPixmap cache; - QString hLineExtras = QString(QLS("%0 %1 %2")).arg(x1).arg(x2).arg(y); QString pixmapName = uniqueName(QLS(part), state, GTK_SHADOW_NONE, rect.size(), gtkWidget) - + hLineExtras + pmKey; + % HexString(x1) + % HexString(x2) + % HexString(y) + % pmKey; if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) { DRAW_TO_CACHE(QGtkStylePrivate::gtk_paint_hline (style, pixmap, @@ -384,9 +388,12 @@ void QGtkPainter::paintVline(GtkWidget *gtkWidget, const gchar* part, return; QPixmap cache; - QString vLineExtras = QString(QLS("%0 %1 %2")).arg(y1).arg(y2).arg(x); - QString pixmapName = uniqueName(QLS(part), state, GTK_SHADOW_NONE, rect.size(), - gtkWidget) + vLineExtras +pmKey; + QString pixmapName = uniqueName(QLS(part), state, GTK_SHADOW_NONE, rect.size(), gtkWidget) + % HexString(y1) + % HexString(y2) + % HexString(x) + % pmKey; + if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) { DRAW_TO_CACHE(QGtkStylePrivate::gtk_paint_vline (style, pixmap, @@ -412,8 +419,10 @@ void QGtkPainter::paintExpander(GtkWidget *gtkWidget, return; QPixmap cache; - QString pixmapName = uniqueName(QLS(part), state, GTK_SHADOW_NONE, rect.size(), - gtkWidget) + QString::number(expander_state) + pmKey; + QString pixmapName = uniqueName(QLS(part), state, GTK_SHADOW_NONE, rect.size(), gtkWidget) + % HexString(expander_state) + % pmKey; + if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) { DRAW_TO_CACHE(QGtkStylePrivate::gtk_paint_expander (style, pixmap, state, NULL, @@ -436,7 +445,7 @@ void QGtkPainter::paintFocus(GtkWidget *gtkWidget, const gchar* part, return; QPixmap cache; - QString pixmapName = uniqueName(QLS(part), state, GTK_SHADOW_NONE, rect.size(), gtkWidget) + pmKey; + QString pixmapName = uniqueName(QLS(part), state, GTK_SHADOW_NONE, rect.size(), gtkWidget) % pmKey; if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) { DRAW_TO_CACHE(QGtkStylePrivate::gtk_paint_focus (style, pixmap, state, NULL, gtkWidget, @@ -461,7 +470,7 @@ void QGtkPainter::paintResizeGrip(GtkWidget *gtkWidget, const gchar* part, return; QPixmap cache; - QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size(), gtkWidget) + pmKey; + QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size(), gtkWidget) % pmKey; if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) { DRAW_TO_CACHE(QGtkStylePrivate::gtk_paint_resize_grip (style, pixmap, state, NULL, gtkWidget, @@ -486,8 +495,9 @@ void QGtkPainter::paintArrow(GtkWidget *gtkWidget, const gchar* part, return; QPixmap cache; - QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size()) + - QString::number((int)arrow_type) + pmKey; + QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size()) + % HexString(arrow_type) + % pmKey; GdkRectangle gtkCliprect = {0, 0, rect.width(), rect.height()}; int xOffset = m_cliprect.isValid() ? arrowrect.x() - m_cliprect.x() : 0; @@ -518,7 +528,8 @@ void QGtkPainter::paintHandle(GtkWidget *gtkWidget, const gchar* part, const QRe QPixmap cache; QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size()) - + QString::number(orientation); + % HexString(orientation); + if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) { DRAW_TO_CACHE(QGtkStylePrivate::gtk_paint_handle (style, pixmap, @@ -546,7 +557,7 @@ void QGtkPainter::paintSlider(GtkWidget *gtkWidget, const gchar* part, const QRe return; QPixmap cache; - QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size(), gtkWidget) + pmKey; + QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size(), gtkWidget) % pmKey; if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) { DRAW_TO_CACHE(QGtkStylePrivate::gtk_paint_slider (style, pixmap, @@ -577,7 +588,7 @@ void QGtkPainter::paintShadow(GtkWidget *gtkWidget, const gchar* part, QRect r = rect; QPixmap cache; - QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size()) + pmKey; + QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size()) % pmKey; if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) { DRAW_TO_CACHE(QGtkStylePrivate::gtk_paint_shadow(style, pixmap, state, shadow, NULL, gtkWidget, part, 0, 0, rect.width(), rect.height())); @@ -596,7 +607,7 @@ void QGtkPainter::paintFlatBox(GtkWidget *gtkWidget, const gchar* part, return; QRect r = rect; QPixmap cache; - QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size()) + pmKey; + QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size()) % pmKey; if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) { DRAW_TO_CACHE(QGtkStylePrivate::gtk_paint_flat_box (style, pixmap, @@ -623,8 +634,8 @@ void QGtkPainter::paintExtention(GtkWidget *gtkWidget, QRect r = rect; QPixmap cache; - QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size(), gtkWidget); - pixmapName += QString::number(gap_pos); + QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size(), gtkWidget) + % HexString(gap_pos); if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) { DRAW_TO_CACHE(QGtkStylePrivate::gtk_paint_extension (style, pixmap, state, shadow, diff --git a/src/gui/styles/qgtkstyle.cpp b/src/gui/styles/qgtkstyle.cpp index 9d6dc9a..5465c7b 100644 --- a/src/gui/styles/qgtkstyle.cpp +++ b/src/gui/styles/qgtkstyle.cpp @@ -692,7 +692,7 @@ void QGtkStyle::drawPrimitive(PrimitiveElement element, // thin rectangular images const int pmSize = 64; const int border = proxy()->pixelMetric(PM_DefaultFrameWidth, option, widget); - const QString pmKey = QString(QLS("windowframe %0")).arg(option->state); + const QString pmKey = QLatin1Literal("windowframe") % HexString(option->state); QPixmap pixmap; QRect pmRect(QPoint(0,0), QSize(pmSize, pmSize)); diff --git a/src/gui/styles/qplastiquestyle.cpp b/src/gui/styles/qplastiquestyle.cpp index c8711f6..20d9bd9 100644 --- a/src/gui/styles/qplastiquestyle.cpp +++ b/src/gui/styles/qplastiquestyle.cpp @@ -488,7 +488,9 @@ static void qBrushSetAlphaF(QBrush *brush, qreal alpha) // Modify the texture - ridiculously expensive. QPixmap texture = brush->texture(); QPixmap pixmap; - QString name = QString::fromLatin1("qbrushtexture-alpha-%1-%2").arg(alpha).arg(texture.cacheKey()); + QString name = QLatin1Literal("qbrushtexture-alpha") + % HexString(alpha) + % HexString(texture.cacheKey()); if (!QPixmapCache::find(name, pixmap)) { QImage image = texture.toImage(); QRgb *rgb = reinterpret_cast(image.bits()); @@ -549,7 +551,10 @@ static QBrush qBrushLight(QBrush brush, int light) // Modify the texture - ridiculously expensive. QPixmap texture = brush.texture(); QPixmap pixmap; - QString name = QString::fromLatin1("qbrushtexture-light-%1-%2").arg(light).arg(texture.cacheKey()); + QString name = QLatin1Literal("qbrushtexture-light") + % HexString(light) + % HexString(texture.cacheKey()); + if (!QPixmapCache::find(name, pixmap)) { QImage image = texture.toImage(); QRgb *rgb = reinterpret_cast(image.bits()); @@ -608,7 +613,10 @@ static QBrush qBrushDark(QBrush brush, int dark) // Modify the texture - ridiculously expensive. QPixmap texture = brush.texture(); QPixmap pixmap; - QString name = QString::fromLatin1("qbrushtexture-dark-%1-%2").arg(dark).arg(brush.texture().cacheKey()); + QString name = QLatin1Literal("qbrushtexture-dark") + % HexString(dark) + % HexString(texture.cacheKey()); + if (!QPixmapCache::find(name, pixmap)) { QImage image = texture.toImage(); QRgb *rgb = reinterpret_cast(image.bits()); @@ -732,8 +740,12 @@ static QColor mergedColors(const QColor &colorA, const QColor &colorB, int facto static void qt_plastique_draw_gradient(QPainter *painter, const QRect &rect, const QColor &gradientStart, const QColor &gradientStop) { - QString gradientName; - gradientName.sprintf("%dx%d-%x-%x", rect.width(), rect.height(), gradientStart.rgba(), gradientStop.rgba()); + QString gradientName = QLatin1Literal("qplastique-g") + % HexString(rect.width()) + % HexString(rect.height()) + % HexString(gradientStart.rgba()) + % HexString(gradientStop.rgba()); + QPixmap cache; QPainter *p = painter; QRect r = rect; @@ -1092,14 +1104,6 @@ void QPlastiqueStyle::drawPrimitive(PrimitiveElement element, const QStyleOption Q_ASSERT(option); QColor borderColor = option->palette.background().color().darker(178); - QColor gradientStartColor = option->palette.button().color().lighter(104); - QColor gradientStopColor = option->palette.button().color().darker(105); - QColor highlightedGradientStartColor = option->palette.button().color().lighter(101); - QColor highlightedGradientStopColor = mergedColors(option->palette.button().color(), option->palette.highlight().color(), 85); - QColor highlightedBaseGradientStartColor = option->palette.base().color(); - QColor highlightedBaseGradientStopColor = mergedColors(option->palette.base().color().darker(105), option->palette.highlight().color(), 70); - QColor highlightedDarkInnerBorderColor = mergedColors(option->palette.button().color(), option->palette.highlight().color(), 35); - QColor highlightedLightInnerBorderColor = mergedColors(option->palette.button().color(), option->palette.highlight().color(), 58); QColor alphaCornerColor; if (widget) { // ### backgroundrole/foregroundrole should be part of the style option @@ -1107,13 +1111,7 @@ void QPlastiqueStyle::drawPrimitive(PrimitiveElement element, const QStyleOption } else { alphaCornerColor = mergedColors(option->palette.background().color(), borderColor); } - QColor alphaInnerColor = mergedColors(highlightedLightInnerBorderColor, gradientStartColor); - QColor alphaInnerColorNoHover = mergedColors(borderColor, gradientStartColor); QColor alphaTextColor = mergedColors(option->palette.background().color(), option->palette.text().color()); - QColor alphaLightTextColor = mergedColors(option->palette.background().color().lighter(250), option->palette.text().color().lighter(250)); - QColor lightShadow = option->palette.button().color().lighter(105); - QColor shadowGradientStartColor = option->palette.button().color().darker(115); - QColor shadow = shadowGradientStartColor; switch (element) { case PE_IndicatorButtonDropDown: @@ -2057,7 +2055,6 @@ void QPlastiqueStyle::drawControl(ControlElement element, const QStyleOption *op bool reverse = (tab->direction == Qt::RightToLeft); int lowerTop = selected ? 0 : 3; // to make the selected tab bigger than the rest - QRect adjustedRect; bool atEnd = (tab->position == QStyleOptionTab::End) || onlyTab; bool atBeginning = ((tab->position == QStyleOptionTab::Beginning) || onlyTab) && !leftCornerWidget; diff --git a/src/gui/styles/qwindowsstyle.cpp b/src/gui/styles/qwindowsstyle.cpp index 0314c6f..579dd0b 100644 --- a/src/gui/styles/qwindowsstyle.cpp +++ b/src/gui/styles/qwindowsstyle.cpp @@ -1388,8 +1388,9 @@ void QWindowsStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, QRect r = opt->rect; int size = qMin(r.height(), r.width()); QPixmap pixmap; - QString pixmapName = QStyleHelper::uniqueName(QLatin1String("$qt_ia-") + QLatin1String(metaObject()->className()), opt, QSize(size, size)) - + QLatin1Char('-') + QString::number(pe); + QString pixmapName = QStyleHelper::uniqueName(QLatin1String("$qt_ia-") + % QLatin1String(metaObject()->className()), opt, QSize(size, size)) + % HexString(pe); if (!QPixmapCache::find(pixmapName, pixmap)) { int border = size/5; int sqsize = 2*(size/2); -- cgit v0.12 From 0fc84aa48ef03c1910dc344e204e7267470305c4 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Wed, 2 Jun 2010 13:23:35 +0200 Subject: Fix failing bypassShaping autotest on the Mac OS X This test relies on integer metrics, so we need to force them for Mac OS X. Reviewed-by: Jocelyn Turcotte --- tests/auto/qfontmetrics/tst_qfontmetrics.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/auto/qfontmetrics/tst_qfontmetrics.cpp b/tests/auto/qfontmetrics/tst_qfontmetrics.cpp index 81e064e..2567a41 100644 --- a/tests/auto/qfontmetrics/tst_qfontmetrics.cpp +++ b/tests/auto/qfontmetrics/tst_qfontmetrics.cpp @@ -223,6 +223,7 @@ void tst_QFontMetrics::averageCharWidth() void tst_QFontMetrics::bypassShaping() { QFont f; + f.setStyleStrategy(QFont::ForceIntegerMetrics); QFontMetrics fm(f); QString text = " A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z"; int textWidth = fm.width(text, -1, Qt::TextBypassShaping); -- cgit v0.12 From fbce5c6d20571717d67c2b8934f047af035e5b06 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 2 Jun 2010 14:35:03 +0200 Subject: my changes --- dist/changes-4.7.0 | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/dist/changes-4.7.0 b/dist/changes-4.7.0 index dbb3add..95cff56 100644 --- a/dist/changes-4.7.0 +++ b/dist/changes-4.7.0 @@ -50,6 +50,15 @@ Third party components QtCore ------ + - QString + * Added QString(const QChar *) constructor. + NOTE: This is source-incompatible for the bogus QString(0) case. + * Removed internal but exported qt_winQString2MB() and qt_winMB2QString() + * Added setRawData() function (also revived the one in QByteArray) + * Various performance improvements + - QList + * Added reserve() function + * Various performance improvements - QMetaType * Significantly improved performance of the type() function * [QTBUG-8235] Support QEasingCurve as a built in metatype. @@ -295,12 +304,7 @@ Qt for Windows CE - [QTBUG-5492] Made widgetbox-filter match on class names, too. - Linguist - - Linguist GUI - - - lupdate - - - lrelease - + * The GNU gettext PO format support has been improved - rcc @@ -316,6 +320,29 @@ Qt for Windows CE compatibility option -limit-xpm-linelength. - qmake + * Removed remainder of tmake compatibility + * Removed remainder of mac9 mode + * Removed MSVC6 generator + * Removed makespecs for MSVC.NET and MSVC2002 + * Deprecated -win32/-unix/-macx options, following various cleanups + relating to platform support. Cross-building makespecs should now + specify a TARGET_PLATFORM. + * Started to warn about use of various constructs: + - non-lowercased replace $$function() calls + - deprecated variables + - unescaped backslashes. + NOTE: You should use UNIX path separators where possible. qmake + will warn about unnecessary Windows path separators in the future. + * Removed expansion of qmake- & environment variables in some unexpected + cases (double expansions, command line options, etc.) + * Removed splitting at semicolons of literal values which were assigned + directly to INCLUDEPATH and DEPENDPATH + * Removed UNIX-specific exporting of all qmake variables to the environment + of subprocesses invoked via system(). You should put specific assignments + into the invoked shell command instead. + * Started to short-cut evaluation inside if() tests, consistently with + evaluation outside if(). + * Added possibility to request project recursion from within a PRO file - configure -- cgit v0.12 From a1c8fc04c17cfbf0060c81d442ffa2440a796112 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 2 Jun 2010 15:39:40 +0200 Subject: write PO files without duplicated message ids encoding the qt context as a magic comment was no particularly good idea, as it provided no disambiguation as far as gettext is concerned. so instead encode the context into msgctxt. Task-number: QTBUG-10307 --- tests/auto/linguist/lconvert/data/test20.ts | 12 ++++++ tools/linguist/shared/po.cpp | 67 ++++++++++++++++++++++++++--- 2 files changed, 72 insertions(+), 7 deletions(-) diff --git a/tests/auto/linguist/lconvert/data/test20.ts b/tests/auto/linguist/lconvert/data/test20.ts index 542cdee..f042edf 100644 --- a/tests/auto/linguist/lconvert/data/test20.ts +++ b/tests/auto/linguist/lconvert/data/test20.ts @@ -147,4 +147,16 @@ + + Bizarre ~ and | context~ + + just something + + + + something else + comment with | and ~ and so~ + + + diff --git a/tools/linguist/shared/po.cpp b/tools/linguist/shared/po.cpp index 99a8751..6a1d426 100644 --- a/tools/linguist/shared/po.cpp +++ b/tools/linguist/shared/po.cpp @@ -353,6 +353,29 @@ static void slurpComment(QByteArray &msg, const QList &lines, int & --l; } +static void splitContext(QByteArray *comment, QByteArray *context) +{ + char *data = comment->data(); + int len = comment->size(); + int sep = -1, j = 0; + + for (int i = 0; i < len; i++, j++) { + if (data[i] == '~' && i + 1 < len) + i++; + else if (data[i] == '|') + sep = j; + data[j] = data[i]; + } + if (sep >= 0) { + QByteArray tmp = comment->mid(sep + 1, j - sep - 1); + comment->truncate(sep); + *context = *comment; + *comment = tmp; + } else { + comment->truncate(j); + } +} + static QString makePoHeader(const QString &str) { return QLatin1String("po-header-") + str.toLower().replace(QLatin1Char('-'), QLatin1Char('_')); @@ -411,6 +434,7 @@ bool loadPO(Translator &translator, QIODevice &dev, ConversionData &cd) lines.append(QByteArray()); int l = 0, lastCmtLine = -1; + bool qtContexts = false; PoItem item; for (; l != lines.size(); ++l) { QByteArray line = lines.at(l); @@ -449,6 +473,8 @@ bool loadPO(Translator &translator, QIODevice &dev, ConversionData &cd) translator.setLanguageCode(QString::fromLatin1(hdrValue)); } else if (hdrName == "X-Source-Language") { translator.setSourceLanguageCode(QString::fromLatin1(hdrValue)); + } else if (hdrName == "X-Qt-Contexts") { + qtContexts = (hdrValue == "true"); } else if (hdrName == "Plural-Forms") { pluralForms = hdrValue; } else if (hdrName == "MIME-Version") { @@ -498,7 +524,7 @@ bool loadPO(Translator &translator, QIODevice &dev, ConversionData &cd) // Keep in sync with savePO static const char * const dfltHdrs[] = { "MIME-Version", "Content-Type", "Content-Transfer-Encoding", - "Plural-Forms", "X-Language", "X-Source-Language" + "Plural-Forms", "X-Language", "X-Source-Language", "X-Qt-Contexts" }; uint cdh = 0; for (int cho = 0; cho < hdrOrder.length(); cho++) { @@ -596,7 +622,7 @@ bool loadPO(Translator &translator, QIODevice &dev, ConversionData &cd) slurpComment(item.translatorComments, lines, l); break; case '.': - if (line.startsWith("#. ts-context ")) { + if (line.startsWith("#. ts-context ")) { // legacy item.context = line.mid(14); } else if (line.startsWith("#. ts-id ")) { item.id = line.mid(9); @@ -615,6 +641,8 @@ bool loadPO(Translator &translator, QIODevice &dev, ConversionData &cd) codec->toUnicode(extra); } else if (line.startsWith("#| msgctxt ")) { item.oldTscomment = slurpEscapedString(lines, l, 11, "#| ", cd); + if (qtContexts) + splitContext(&item.oldTscomment, &item.context); } else { cd.appendError(QString(QLatin1String("PO-format parse error in line %1: '%2'\n")) .arg(l + 1).arg(codec->toUnicode(lines[l]))); @@ -647,6 +675,8 @@ bool loadPO(Translator &translator, QIODevice &dev, ConversionData &cd) lastCmtLine = l; } else if (line.startsWith("msgctxt ")) { item.tscomment = slurpEscapedString(lines, l, 8, QByteArray(), cd); + if (qtContexts) + splitContext(&item.tscomment, &item.context); } else if (line.startsWith("msgid ")) { item.msgId = slurpEscapedString(lines, l, 6, QByteArray(), cd); } else if (line.startsWith("msgid_plural ")) { @@ -672,6 +702,16 @@ static void addPoHeader(Translator::ExtraData &headers, QStringList &hdrOrder, headers[makePoHeader(qName)] = value; } +static QString escapeComment(const QString &in, bool escape) +{ + QString out = in; + if (escape) { + out.replace(QLatin1Char('~'), QLatin1String("~~")); + out.replace(QLatin1Char('|'), QLatin1String("~|")); + } + return out; +} + bool savePO(const Translator &translator, QIODevice &dev, ConversionData &cd) { QString str_format = QLatin1String("-format"); @@ -680,6 +720,13 @@ bool savePO(const Translator &translator, QIODevice &dev, ConversionData &cd) QTextStream out(&dev); out.setCodec(cd.m_outputCodec.isEmpty() ? QByteArray("UTF-8") : cd.m_outputCodec); + bool qtContexts = false; + foreach (const TranslatorMessage &msg, translator.messages()) + if (!msg.context().isEmpty()) { + qtContexts = true; + break; + } + QString cmt = translator.extra(QLatin1String("po-header_comment")); if (!cmt.isEmpty()) out << cmt << '\n'; @@ -703,6 +750,8 @@ bool savePO(const Translator &translator, QIODevice &dev, ConversionData &cd) } if (!translator.sourceLanguageCode().isEmpty()) addPoHeader(headers, hdrOrder, "X-Source-Language", translator.sourceLanguageCode()); + if (qtContexts) + addPoHeader(headers, hdrOrder, "X-Qt-Contexts", QLatin1String("true")); QString hdrStr; foreach (const QString &hdr, hdrOrder) { hdrStr += hdr; @@ -721,8 +770,6 @@ bool savePO(const Translator &translator, QIODevice &dev, ConversionData &cd) if (!msg.extraComment().isEmpty()) out << poEscapedLines(QLatin1String("#."), true, msg.extraComment()); - if (!msg.context().isEmpty()) - out << QLatin1String("#. ts-context ") << msg.context() << '\n'; if (!msg.id().isEmpty()) out << QLatin1String("#. ts-id ") << msg.id() << '\n'; @@ -770,15 +817,21 @@ bool savePO(const Translator &translator, QIODevice &dev, ConversionData &cd) QString prefix = QLatin1String("#| "); if (!msg.oldComment().isEmpty()) - out << poEscapedString(prefix, QLatin1String("msgctxt"), noWrap, msg.oldComment()); + out << poEscapedString(prefix, QLatin1String("msgctxt"), noWrap, + escapeComment(msg.oldComment(), qtContexts)); if (!msg.oldSourceText().isEmpty()) out << poEscapedString(prefix, QLatin1String("msgid"), noWrap, msg.oldSourceText()); QString plural = msg.extra(QLatin1String("po-old_msgid_plural")); if (!plural.isEmpty()) out << poEscapedString(prefix, QLatin1String("msgid_plural"), noWrap, plural); prefix = QLatin1String((msg.type() == TranslatorMessage::Obsolete) ? "#~ " : ""); - if (!msg.comment().isEmpty()) - out << poEscapedString(prefix, QLatin1String("msgctxt"), noWrap, msg.comment()); + if (!msg.context().isEmpty()) + out << poEscapedString(prefix, QLatin1String("msgctxt"), noWrap, + escapeComment(msg.context(), true) + QLatin1Char('|') + + escapeComment(msg.comment(), true)); + else if (!msg.comment().isEmpty()) + out << poEscapedString(prefix, QLatin1String("msgctxt"), noWrap, + escapeComment(msg.comment(), qtContexts)); out << poEscapedString(prefix, QLatin1String("msgid"), noWrap, msg.sourceText()); if (!msg.isPlural()) { QString transl = msg.translation(); -- cgit v0.12 From 25763b746eca93d53b209ab232d323b9ed3ee465 Mon Sep 17 00:00:00 2001 From: Thomas Zander Date: Wed, 2 Jun 2010 16:20:00 +0200 Subject: Fix a corner case where a gesture sometimes doesn't start. gestures are re-used per widget / recognizer and in the case of a gesture getting cancelled we sometimes didn't properly 'start' the gesture on new incoming events since the manager forgot to mark it as not running. Add a test case and a one line fix. Reviewed-by: Denis Task-number: QTBUG-11076 --- src/gui/kernel/qgesturemanager.cpp | 1 + tests/auto/gestures/tst_gestures.cpp | 166 +++++++++++++++++++++++++++++++++++ 2 files changed, 167 insertions(+) diff --git a/src/gui/kernel/qgesturemanager.cpp b/src/gui/kernel/qgesturemanager.cpp index 43facef..a81d4e4 100644 --- a/src/gui/kernel/qgesturemanager.cpp +++ b/src/gui/kernel/qgesturemanager.cpp @@ -684,6 +684,7 @@ void QGestureManager::recycle(QGesture *gesture) if (recognizer) { gesture->setGestureCancelPolicy(QGesture::CancelNone); recognizer->reset(gesture); + m_activeGestures.remove(gesture); } else { cleanupGesturesForRemovedRecognizer(gesture); } diff --git a/tests/auto/gestures/tst_gestures.cpp b/tests/auto/gestures/tst_gestures.cpp index 4a9f1d1..7c1170c 100644 --- a/tests/auto/gestures/tst_gestures.cpp +++ b/tests/auto/gestures/tst_gestures.cpp @@ -49,6 +49,7 @@ #include #include #include +#include #include #include @@ -358,6 +359,7 @@ private slots: void viewportCoordinates(); void partialGesturePropagation(); void testQGestureRecognizerCleanup(); + void testReuseCanceledGestures(); }; tst_Gestures::tst_Gestures() @@ -2069,5 +2071,169 @@ void tst_Gestures::testQGestureRecognizerCleanup() delete w; } +class ReuseCanceledGesturesRecognizer : public QGestureRecognizer +{ +public: + enum Type { + RmbAndCancelAllType, + LmbType + }; + + ReuseCanceledGesturesRecognizer(Type type) : m_type(type) {} + + QGesture *create(QObject *) { + QGesture *g = new QGesture; + return g; + } + + Result recognize(QGesture *gesture, QObject *, QEvent *event) { + QMouseEvent *me = static_cast(event); + Qt::MouseButton mouseButton(m_type == LmbType ? Qt::LeftButton : Qt::RightButton); + + switch(event->type()) { + case QEvent::MouseButtonPress: + if (me->button() == mouseButton && gesture->state() == Qt::NoGesture) { + gesture->setHotSpot(QPointF(me->globalPos())); + if (m_type == RmbAndCancelAllType) + gesture->setGestureCancelPolicy(QGesture::CancelAllInContext); + return QGestureRecognizer::TriggerGesture; + } + break; + case QEvent::MouseButtonRelease: + if (me->button() == mouseButton && gesture->state() > Qt::NoGesture) + return QGestureRecognizer::FinishGesture; + default: + break; + } + return QGestureRecognizer::Ignore; + } +private: + Type m_type; +}; + +class ReuseCanceledGesturesWidget : public QGraphicsWidget +{ + public: + ReuseCanceledGesturesWidget(Qt::GestureType gestureType = Qt::TapGesture, QGraphicsItem *parent = 0) + : QGraphicsWidget(parent), + m_gestureType(gestureType), + m_started(0), m_updated(0), m_canceled(0), m_finished(0) + { + } + + bool event(QEvent *event) { + if (event->type() == QEvent::Gesture) { + QGesture *gesture = static_cast(event)->gesture(m_gestureType); + if (gesture) { + switch(gesture->state()) { + case Qt::GestureStarted: m_started++; break; + case Qt::GestureUpdated: m_updated++; break; + case Qt::GestureFinished: m_finished++; break; + case Qt::GestureCanceled: m_canceled++; break; + default: break; + } + } + return true; + } + if (event->type() == QEvent::GraphicsSceneMousePress) { + return true; + } + return QGraphicsWidget::event(event); + } + + int started() { return m_started; } + int updated() { return m_updated; } + int finished() { return m_finished; } + int canceled() { return m_canceled; } + + private: + Qt::GestureType m_gestureType; + int m_started; + int m_updated; + int m_canceled; + int m_finished; +}; + +void tst_Gestures::testReuseCanceledGestures() +{ + Qt::GestureType cancellingGestureTypeId = QGestureRecognizer::registerRecognizer( + new ReuseCanceledGesturesRecognizer(ReuseCanceledGesturesRecognizer::RmbAndCancelAllType)); + Qt::GestureType tapGestureTypeId = QGestureRecognizer::registerRecognizer( + new ReuseCanceledGesturesRecognizer(ReuseCanceledGesturesRecognizer::LmbType)); + + QMainWindow mw; + mw.setWindowFlags(Qt::X11BypassWindowManagerHint); + QGraphicsView *gv = new QGraphicsView(&mw); + QGraphicsScene *scene = new QGraphicsScene; + + gv->setScene(scene); + scene->setSceneRect(0,0,100,100); + + // Create container and add to the scene + ReuseCanceledGesturesWidget *container = new ReuseCanceledGesturesWidget; + container->grabGesture(cancellingGestureTypeId); // << container grabs canceling gesture + + // Create widget and add to the scene + ReuseCanceledGesturesWidget *target = new ReuseCanceledGesturesWidget(tapGestureTypeId, container); + target->grabGesture(tapGestureTypeId); + + container->setGeometry(scene->sceneRect()); + + scene->addItem(container); + + mw.setCentralWidget(gv); + + // Viewport needs to grab all gestures that widgets in scene grab + gv->viewport()->grabGesture(cancellingGestureTypeId); + gv->viewport()->grabGesture(tapGestureTypeId); + + mw.show(); + QTest::qWaitForWindowShown(&mw); + + QPoint targetPos(gv->mapFromScene(target->mapToScene(target->rect().center()))); + targetPos = gv->viewport()->mapFromParent(targetPos); + + // "Tap" starts on child widget + QTest::mousePress(gv->viewport(), Qt::LeftButton, 0, targetPos); + QCOMPARE(target->started(), 1); + QCOMPARE(target->updated(), 0); + QCOMPARE(target->finished(), 0); + QCOMPARE(target->canceled(), 0); + + // Canceling gesture starts on parent + QTest::mousePress(gv->viewport(), Qt::RightButton, 0, targetPos); + QCOMPARE(target->started(), 1); + QCOMPARE(target->updated(), 0); + QCOMPARE(target->finished(), 0); + QCOMPARE(target->canceled(), 1); // <- child canceled + + // Canceling gesture ends + QTest::mouseRelease(gv->viewport(), Qt::RightButton, 0, targetPos); + QCOMPARE(target->started(), 1); + QCOMPARE(target->updated(), 0); + QCOMPARE(target->finished(), 0); + QCOMPARE(target->canceled(), 1); + + // Tap would end if not canceled + QTest::mouseRelease(gv->viewport(), Qt::LeftButton, 0, targetPos); + QCOMPARE(target->started(), 1); + QCOMPARE(target->updated(), 0); + QCOMPARE(target->finished(), 0); + QCOMPARE(target->canceled(), 1); + + // New "Tap" starts + QTest::mousePress(gv->viewport(), Qt::LeftButton, 0, targetPos); + QCOMPARE(target->started(), 2); + QCOMPARE(target->updated(), 0); + QCOMPARE(target->finished(), 0); + QCOMPARE(target->canceled(), 1); + + QTest::mouseRelease(gv->viewport(), Qt::LeftButton, 0, targetPos); + QCOMPARE(target->started(), 2); + QCOMPARE(target->updated(), 0); + QCOMPARE(target->finished(), 1); + QCOMPARE(target->canceled(), 1); +} + QTEST_MAIN(tst_Gestures) #include "tst_gestures.moc" -- cgit v0.12 From 8287298f62cafbaa4a43d1a71c84d17b0685f603 Mon Sep 17 00:00:00 2001 From: Morten Engvoldsen Date: Wed, 2 Jun 2010 18:35:22 +0200 Subject: Doc: updating images --- doc/src/template/images/bg_ll_blank.png | Bin 0 -> 320 bytes doc/src/template/images/bg_ul_blank.png | Bin 0 -> 304 bytes doc/src/template/images/header_bg.png | Bin 0 -> 114 bytes tools/qdoc3/test/images/bg_l.png | Bin 0 -> 100 bytes tools/qdoc3/test/images/bg_l_blank.png | Bin 0 -> 84 bytes tools/qdoc3/test/images/bg_r.png | Bin 0 -> 96 bytes tools/qdoc3/test/images/box_bg.png | Bin 0 -> 89 bytes tools/qdoc3/test/images/breadcrumb.png | Bin 0 -> 134 bytes tools/qdoc3/test/images/bullet_dn.png | Bin 0 -> 230 bytes tools/qdoc3/test/images/bullet_gt.png | Bin 0 -> 124 bytes tools/qdoc3/test/images/bullet_sq.png | Bin 0 -> 74 bytes tools/qdoc3/test/images/bullet_up.png | Bin 0 -> 253 bytes tools/qdoc3/test/images/feedbackground.png | Bin 0 -> 263 bytes tools/qdoc3/test/images/horBar.png | Bin 0 -> 2807 bytes tools/qdoc3/test/images/page.png | Bin 0 -> 3102 bytes tools/qdoc3/test/images/page_bg.png | Bin 0 -> 84 bytes tools/qdoc3/test/images/sprites-combined.png | Bin 0 -> 62534 bytes 17 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/src/template/images/bg_ll_blank.png create mode 100644 doc/src/template/images/bg_ul_blank.png create mode 100644 doc/src/template/images/header_bg.png create mode 100644 tools/qdoc3/test/images/bg_l.png create mode 100644 tools/qdoc3/test/images/bg_l_blank.png create mode 100644 tools/qdoc3/test/images/bg_r.png create mode 100644 tools/qdoc3/test/images/box_bg.png create mode 100644 tools/qdoc3/test/images/breadcrumb.png create mode 100644 tools/qdoc3/test/images/bullet_dn.png create mode 100644 tools/qdoc3/test/images/bullet_gt.png create mode 100644 tools/qdoc3/test/images/bullet_sq.png create mode 100644 tools/qdoc3/test/images/bullet_up.png create mode 100644 tools/qdoc3/test/images/feedbackground.png create mode 100644 tools/qdoc3/test/images/horBar.png create mode 100644 tools/qdoc3/test/images/page.png create mode 100644 tools/qdoc3/test/images/page_bg.png create mode 100644 tools/qdoc3/test/images/sprites-combined.png diff --git a/doc/src/template/images/bg_ll_blank.png b/doc/src/template/images/bg_ll_blank.png new file mode 100644 index 0000000..95a1c45 Binary files /dev/null and b/doc/src/template/images/bg_ll_blank.png differ diff --git a/doc/src/template/images/bg_ul_blank.png b/doc/src/template/images/bg_ul_blank.png new file mode 100644 index 0000000..7051261 Binary files /dev/null and b/doc/src/template/images/bg_ul_blank.png differ diff --git a/doc/src/template/images/header_bg.png b/doc/src/template/images/header_bg.png new file mode 100644 index 0000000..a436aa6 Binary files /dev/null and b/doc/src/template/images/header_bg.png differ diff --git a/tools/qdoc3/test/images/bg_l.png b/tools/qdoc3/test/images/bg_l.png new file mode 100644 index 0000000..90b1da1 Binary files /dev/null and b/tools/qdoc3/test/images/bg_l.png differ diff --git a/tools/qdoc3/test/images/bg_l_blank.png b/tools/qdoc3/test/images/bg_l_blank.png new file mode 100644 index 0000000..5a9673d Binary files /dev/null and b/tools/qdoc3/test/images/bg_l_blank.png differ diff --git a/tools/qdoc3/test/images/bg_r.png b/tools/qdoc3/test/images/bg_r.png new file mode 100644 index 0000000..f0fb121 Binary files /dev/null and b/tools/qdoc3/test/images/bg_r.png differ diff --git a/tools/qdoc3/test/images/box_bg.png b/tools/qdoc3/test/images/box_bg.png new file mode 100644 index 0000000..3322f92 Binary files /dev/null and b/tools/qdoc3/test/images/box_bg.png differ diff --git a/tools/qdoc3/test/images/breadcrumb.png b/tools/qdoc3/test/images/breadcrumb.png new file mode 100644 index 0000000..0ded551 Binary files /dev/null and b/tools/qdoc3/test/images/breadcrumb.png differ diff --git a/tools/qdoc3/test/images/bullet_dn.png b/tools/qdoc3/test/images/bullet_dn.png new file mode 100644 index 0000000..f776247 Binary files /dev/null and b/tools/qdoc3/test/images/bullet_dn.png differ diff --git a/tools/qdoc3/test/images/bullet_gt.png b/tools/qdoc3/test/images/bullet_gt.png new file mode 100644 index 0000000..7561b4e Binary files /dev/null and b/tools/qdoc3/test/images/bullet_gt.png differ diff --git a/tools/qdoc3/test/images/bullet_sq.png b/tools/qdoc3/test/images/bullet_sq.png new file mode 100644 index 0000000..a84845e Binary files /dev/null and b/tools/qdoc3/test/images/bullet_sq.png differ diff --git a/tools/qdoc3/test/images/bullet_up.png b/tools/qdoc3/test/images/bullet_up.png new file mode 100644 index 0000000..285e741 Binary files /dev/null and b/tools/qdoc3/test/images/bullet_up.png differ diff --git a/tools/qdoc3/test/images/feedbackground.png b/tools/qdoc3/test/images/feedbackground.png new file mode 100644 index 0000000..3a38d99 Binary files /dev/null and b/tools/qdoc3/test/images/feedbackground.png differ diff --git a/tools/qdoc3/test/images/horBar.png b/tools/qdoc3/test/images/horBar.png new file mode 100644 index 0000000..100fe91 Binary files /dev/null and b/tools/qdoc3/test/images/horBar.png differ diff --git a/tools/qdoc3/test/images/page.png b/tools/qdoc3/test/images/page.png new file mode 100644 index 0000000..1db151b Binary files /dev/null and b/tools/qdoc3/test/images/page.png differ diff --git a/tools/qdoc3/test/images/page_bg.png b/tools/qdoc3/test/images/page_bg.png new file mode 100644 index 0000000..9b3bd99 Binary files /dev/null and b/tools/qdoc3/test/images/page_bg.png differ diff --git a/tools/qdoc3/test/images/sprites-combined.png b/tools/qdoc3/test/images/sprites-combined.png new file mode 100644 index 0000000..3a48b21 Binary files /dev/null and b/tools/qdoc3/test/images/sprites-combined.png differ -- cgit v0.12 From 5f09880833fe39b49881469d19f09daaf5ef27e6 Mon Sep 17 00:00:00 2001 From: Aaron McCarthy Date: Thu, 3 Jun 2010 11:35:38 +1000 Subject: Don't poll non-polling engines when configurations are in use. --- src/network/bearer/qnetworkconfigmanager_p.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/network/bearer/qnetworkconfigmanager_p.cpp b/src/network/bearer/qnetworkconfigmanager_p.cpp index 471927a..5d4274f 100644 --- a/src/network/bearer/qnetworkconfigmanager_p.cpp +++ b/src/network/bearer/qnetworkconfigmanager_p.cpp @@ -483,8 +483,10 @@ void QNetworkConfigurationManagerPrivate::pollEngines() QMutexLocker locker(&mutex); for (int i = 0; i < sessionEngines.count(); ++i) { - if ((forcedPolling && sessionEngines.at(i)->requiresPolling()) || - sessionEngines.at(i)->configurationsInUse()) { + if (!sessionEngines.at(i)->requiresPolling()) + continue; + + if (forcedPolling || sessionEngines.at(i)->configurationsInUse()) { pollingEngines.insert(i); QMetaObject::invokeMethod(sessionEngines.at(i), "requestUpdate"); } -- cgit v0.12 From ab9cb342554e89e0ff51afe3e8063d2719af16b1 Mon Sep 17 00:00:00 2001 From: Aaron McCarthy Date: Thu, 3 Jun 2010 14:56:33 +1000 Subject: Revert "Split Symbian bearer plugin into three platform specfic plugins" This reverts commit cd50f97a9f09eece645c9d7d01cb14c04521a915. Fails on tb9.2, reverting while working on a fix. --- src/plugins/bearer/symbian/3_1/3_1.pro | 4 --- src/plugins/bearer/symbian/3_2/3_2.pro | 12 ------- src/plugins/bearer/symbian/symbian.pri | 30 ---------------- src/plugins/bearer/symbian/symbian.pro | 42 ++++++++++++++++++++-- src/plugins/bearer/symbian/symbian_3/symbian_3.pro | 14 -------- src/s60installs/qsymbianbearer.qtplugin | 1 - src/s60installs/s60installs.pro | 25 ++++--------- 7 files changed, 47 insertions(+), 81 deletions(-) delete mode 100644 src/plugins/bearer/symbian/3_1/3_1.pro delete mode 100644 src/plugins/bearer/symbian/3_2/3_2.pro delete mode 100644 src/plugins/bearer/symbian/symbian.pri delete mode 100644 src/plugins/bearer/symbian/symbian_3/symbian_3.pro delete mode 100644 src/s60installs/qsymbianbearer.qtplugin diff --git a/src/plugins/bearer/symbian/3_1/3_1.pro b/src/plugins/bearer/symbian/3_1/3_1.pro deleted file mode 100644 index a60d18b..0000000 --- a/src/plugins/bearer/symbian/3_1/3_1.pro +++ /dev/null @@ -1,4 +0,0 @@ -include(../symbian.pri) - -LIBS += -lapengine -TARGET = $${TARGET}_3_1 diff --git a/src/plugins/bearer/symbian/3_2/3_2.pro b/src/plugins/bearer/symbian/3_2/3_2.pro deleted file mode 100644 index 4e5b416..0000000 --- a/src/plugins/bearer/symbian/3_2/3_2.pro +++ /dev/null @@ -1,12 +0,0 @@ -include(../symbian.pri) - -exists($${EPOCROOT}epoc32/release/winscw/udeb/cmmanager.lib)| \ -exists($${EPOCROOT}epoc32/release/armv5/lib/cmmanager.lib) { - DEFINES += SNAP_FUNCTIONALITY_AVAILABLE - LIBS += -lcmmanager -} else { - # Fall back to 3_1 implementation on platforms that do not have cmmanager - LIBS += -lapengine -} - -TARGET = $${TARGET}_3_2 diff --git a/src/plugins/bearer/symbian/symbian.pri b/src/plugins/bearer/symbian/symbian.pri deleted file mode 100644 index bfcd9ed..0000000 --- a/src/plugins/bearer/symbian/symbian.pri +++ /dev/null @@ -1,30 +0,0 @@ -TARGET = qsymbianbearer -include(../../qpluginbase.pri) - -QT += network - -HEADERS += ../symbianengine.h \ - ../qnetworksession_impl.h - -SOURCES += ../symbianengine.cpp \ - ../qnetworksession_impl.cpp \ - ../main.cpp - -TARGET.UID3=0x20021319 - -INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE -symbian-abld:INCLUDEPATH += $$QT_BUILD_TREE/include/QtNetwork/private - -LIBS += -lcommdb \ - -lapsettingshandlerui \ - -lconnmon \ - -lcentralrepository \ - -lesock \ - -linsock \ - -lecom \ - -lefsrv \ - -lnetmeta - -QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/bearer -target.path += $$[QT_INSTALL_PLUGINS]/bearer -INSTALLS += target diff --git a/src/plugins/bearer/symbian/symbian.pro b/src/plugins/bearer/symbian/symbian.pro index f320eb6..4f1e51c 100644 --- a/src/plugins/bearer/symbian/symbian.pro +++ b/src/plugins/bearer/symbian/symbian.pro @@ -1,3 +1,41 @@ -TEMPLATE = subdirs +TARGET = qsymbianbearer +include(../../qpluginbase.pri) -SUBDIRS += 3_1 3_2 symbian_3 \ No newline at end of file +QT += network + +HEADERS += symbianengine.h \ + qnetworksession_impl.h + +SOURCES += symbianengine.cpp \ + qnetworksession_impl.cpp \ + main.cpp + +symbian { + TARGET.UID3=0x20021319 + exists($${EPOCROOT}epoc32/release/winscw/udeb/cmmanager.lib)| \ + exists($${EPOCROOT}epoc32/release/armv5/lib/cmmanager.lib) { + message("Building with SNAP support") + DEFINES += SNAP_FUNCTIONALITY_AVAILABLE + LIBS += -lcmmanager + } else { + message("Building without SNAP support") + LIBS += -lapengine + } +} + +INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE +symbian-abld:INCLUDEPATH += $$QT_BUILD_TREE/include/QtNetwork/private + +LIBS += -lcommdb \ + -lapsettingshandlerui \ + -lconnmon \ + -lcentralrepository \ + -lesock \ + -linsock \ + -lecom \ + -lefsrv \ + -lnetmeta + +QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/bearer +target.path += $$[QT_INSTALL_PLUGINS]/bearer +INSTALLS += target diff --git a/src/plugins/bearer/symbian/symbian_3/symbian_3.pro b/src/plugins/bearer/symbian/symbian_3/symbian_3.pro deleted file mode 100644 index 455aa67..0000000 --- a/src/plugins/bearer/symbian/symbian_3/symbian_3.pro +++ /dev/null @@ -1,14 +0,0 @@ -include(../symbian.pri) - -exists($${EPOCROOT}epoc32/release/winscw/udeb/cmmanager.lib)| \ -exists($${EPOCROOT}epoc32/release/armv5/lib/cmmanager.lib) { - DEFINES += SNAP_FUNCTIONALITY_AVAILABLE - LIBS += -lcmmanager - - exists($$MW_LAYER_PUBLIC_EXPORT_PATH(extendedconnpref.h)) { - DEFINES += OCC_FUNCTIONALITY_AVAILABLE - } -} else { - # Fall back to 3_1 implementation on platforms that do not have cmmanager - LIBS += -lapengine -} diff --git a/src/s60installs/qsymbianbearer.qtplugin b/src/s60installs/qsymbianbearer.qtplugin deleted file mode 100644 index 5c45bdd..0000000 --- a/src/s60installs/qsymbianbearer.qtplugin +++ /dev/null @@ -1 +0,0 @@ -This file is a Qt plugin stub file. The real Qt plugin is located in /sys/bin. Created:2010-06-02T14:02:21 diff --git a/src/s60installs/s60installs.pro b/src/s60installs/s60installs.pro index 15d7830..90c362b 100644 --- a/src/s60installs/s60installs.pro +++ b/src/s60installs/s60installs.pro @@ -51,35 +51,20 @@ symbian: { symbian-abld|symbian-sbsv2 { pluginLocations = $${EPOCROOT}epoc32/release/$(PLATFORM)/$(TARGET) - bearerPluginLocation = $${EPOCROOT}epoc32/release/$(PLATFORM)/$(TARGET) - bearerStubZ = $${EPOCROOT}$${HW_ZDIR}$${QT_PLUGINS_BASE_DIR}/bearer/qsymbianbearer$${QT_LIBINFIX}.qtplugin - BLD_INF_RULES.prj_exports += \ - "qsymbianbearer.qtplugin $$bearerStubZ" \ - "qsymbianbearer.qtplugin /epoc32/winscw/c$${QT_PLUGINS_BASE_DIR}/bearer/qsymbianbearer$${QT_LIBINFIX}.qtplugin" } else { pluginLocations = $$QT_BUILD_TREE/plugins/s60 - bearerPluginLocation = $$QT_BUILD_TREE/plugins/bearer - bearerStubZ = $${PWD}/qsymbianbearer.qtplugin } qts60plugindeployment = \ - "IF package(0x20022E6D)" \ - " \"$$pluginLocations/qts60plugin_5_0$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qts60plugin_5_0$${QT_LIBINFIX}.dll\"" \ - " \"$$bearerPluginLocation/qsymbianbearer$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qsymbianbearer$${QT_LIBINFIX}.dll\"" \ - "ELSEIF package(0x1028315F)" \ + "IF package(0x1028315F)" \ " \"$$pluginLocations/qts60plugin_5_0$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qts60plugin_5_0$${QT_LIBINFIX}.dll\"" \ - " \"$$bearerPluginLocation/qsymbianbearer_3_2$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qsymbianbearer$${QT_LIBINFIX}.dll\"" \ "ELSEIF package(0x102752AE)" \ " \"$$pluginLocations/qts60plugin_3_2$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qts60plugin_3_2$${QT_LIBINFIX}.dll\"" \ - " \"$$bearerPluginLocation/qsymbianbearer_3_2$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qsymbianbearer$${QT_LIBINFIX}.dll\"" \ "ELSEIF package(0x102032BE)" \ " \"$$pluginLocations/qts60plugin_3_1$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qts60plugin_3_1$${QT_LIBINFIX}.dll\"" \ - " \"$$bearerPluginLocation/qsymbianbearer_3_1$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qsymbianbearer$${QT_LIBINFIX}.dll\"" \ "ELSE" \ " \"$$pluginLocations/qts60plugin_5_0$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qts60plugin_5_0$${QT_LIBINFIX}.dll\"" \ - " \"$$bearerPluginLocation/qsymbianbearer$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qsymbianbearer$${QT_LIBINFIX}.dll\"" \ - "ENDIF" \ - " \"$$bearerStubZ\" - \"c:$$replace(QT_PLUGINS_BASE_DIR,/,\\)\\bearer\\qsymbianbearer$${QT_LIBINFIX}.qtplugin\" + "ENDIF" qtlibraries.pkg_postrules += qts60plugindeployment @@ -126,11 +111,15 @@ symbian: { qtbackup.sources = backup_registration.xml qtbackup.path = c:/private/10202D56/import/packages/$$replace(TARGET.UID3, 0x,) + bearer_plugins.path = c:$$QT_PLUGINS_BASE_DIR/bearer + bearer_plugins.sources += $$QT_BUILD_TREE/plugins/bearer/qsymbianbearer$${QT_LIBINFIX}.dll + DEPLOYMENT += qtlibraries \ qtbackup \ imageformats_plugins \ codecs_plugins \ - graphicssystems_plugins + graphicssystems_plugins \ + bearer_plugins contains(QT_CONFIG, svg): { qtlibraries.sources += $$QMAKE_LIBDIR_QT/QtSvg$${QT_LIBINFIX}.dll -- cgit v0.12