diff --git a/autotests/mainshelltest.cpp b/autotests/mainshelltest.cpp --- a/autotests/mainshelltest.cpp +++ b/autotests/mainshelltest.cpp @@ -183,10 +183,10 @@ file1AndToc << QStringLiteral(KDESRCDIR "data/tocreload.pdf"); const QString tocReload = QStringLiteral(KDESRCDIR "data/tocreload.pdf"); - const QString optionsPage2 = ShellUtils::serializeOptions(false, false, false, false, false, QStringLiteral("2")); - const QString optionsPage2Presentation = ShellUtils::serializeOptions(true, false, false, false, false, QStringLiteral("2")); - const QString optionsPrint = ShellUtils::serializeOptions(false, true, false, false, false, QString()); - const QString optionsUnique = ShellUtils::serializeOptions(false, false, false, true, false, QString()); + const QString optionsPage2 = ShellUtils::serializeOptions(false, false, false, false, false, QStringLiteral("2"), QString()); + const QString optionsPage2Presentation = ShellUtils::serializeOptions(true, false, false, false, false, QStringLiteral("2"), QStringLiteral("Name")); + const QString optionsPrint = ShellUtils::serializeOptions(false, true, false, false, false, QString(), QStringLiteral("Name")); + const QString optionsUnique = ShellUtils::serializeOptions(false, false, false, true, false, QString(), QString()); QTest::newRow("just show shell") << QStringList() << QString() << false << QString() << 0u << false << false << false << 0u << false << false; QTest::newRow("open file") << file1 << QString() << false << QString() << 0u << false << false << false << 0u << false << false; @@ -405,9 +405,9 @@ const QStringList paths = QStringList(QStringLiteral(KDESRCDIR "data/contents.epub")); QString serializedOptions; if (mode == 1 || mode == 3) - serializedOptions = ShellUtils::serializeOptions(false, false, false, false, false, QString()); + serializedOptions = ShellUtils::serializeOptions(false, false, false, false, false, QString(), QString()); else - serializedOptions = ShellUtils::serializeOptions(false, false, false, true, false, QString()); + serializedOptions = ShellUtils::serializeOptions(false, false, false, true, false, QString(), QString()); Okular::Settings::self()->setShellOpenFileInTabs(mode == 3); @@ -458,10 +458,10 @@ { QTest::addColumn("serializedOptions"); - QTest::newRow("startInPresentation") << ShellUtils::serializeOptions(true, false, false, false, false, QString()); - QTest::newRow("showPrintDialog") << ShellUtils::serializeOptions(false, true, false, false, false, QString()); - QTest::newRow("unique") << ShellUtils::serializeOptions(false, false, false, true, false, QString()); - QTest::newRow("pageNumger") << ShellUtils::serializeOptions(false, false, false, false, false, QStringLiteral("3")); + QTest::newRow("startInPresentation") << ShellUtils::serializeOptions(true, false, false, false, false, QString(), QString()); + QTest::newRow("showPrintDialog") << ShellUtils::serializeOptions(false, true, false, false, false, QString(), QString()); + QTest::newRow("unique") << ShellUtils::serializeOptions(false, false, false, true, false, QString(), QString()); + QTest::newRow("pageNumber") << ShellUtils::serializeOptions(false, false, false, false, false, QStringLiteral("3"), QString()); } void MainShellTest::test2FilesError() @@ -488,7 +488,7 @@ QStringList twoDocPaths( oneDocPaths ); twoDocPaths << QStringLiteral(KDESRCDIR "data/formSamples.pdf"); - const QString options = ShellUtils::serializeOptions(false, false, false, false, false, QString()); + const QString options = ShellUtils::serializeOptions(false, false, false, false, false, QString(), QString()); QTest::newRow("1 doc, 1 window, tabs") << oneDocPaths << options << true << true; QTest::newRow("2 docs, 1 window, tabs") << twoDocPaths << options << true << true; diff --git a/core/document.cpp b/core/document.cpp --- a/core/document.cpp +++ b/core/document.cpp @@ -3773,7 +3773,6 @@ SearchType type, bool moveViewport, const QColor & color ) { d->m_searchCancelled = false; - // safety checks: don't perform searches on empty or unsearchable docs if ( !d->m_generator || !d->m_generator->hasFeature( Generator::TextExtraction ) || d->m_pagesVector.isEmpty() ) { diff --git a/kdocumentviewer.h b/kdocumentviewer.h --- a/kdocumentviewer.h +++ b/kdocumentviewer.h @@ -45,6 +45,7 @@ * Return a list with the supported mimetypes. */ virtual QStringList supportedMimeTypes() const = 0; + }; Q_DECLARE_INTERFACE( KDocumentViewer, "org.kde.kdocumentviewer/0.1" ) diff --git a/part.h b/part.h --- a/part.h +++ b/part.h @@ -168,6 +168,7 @@ Q_SCRIPTABLE Q_NOREPLY void reload(); Q_SCRIPTABLE Q_NOREPLY void enableStartWithPrint(); Q_SCRIPTABLE Q_NOREPLY void enableExitAfterPrint(); + Q_SCRIPTABLE Q_NOREPLY void findText(const QString &textToFind); Q_SIGNALS: void enablePrintAction(bool enable); diff --git a/part.cpp b/part.cpp --- a/part.cpp +++ b/part.cpp @@ -1706,6 +1706,7 @@ url.setFragment( QString() ); } + // this calls in sequence the 'closeUrl' and 'openFile' methods bool openOk = KParts::ReadWritePart::openUrl( url ); @@ -1720,7 +1721,7 @@ resetStartArguments(); KMessageBox::error( widget(), i18n("Could not open %1", url.toDisplayString() ) ); } - + return openOk; } @@ -3612,6 +3613,11 @@ ReadWritePart::setReadWrite( readwrite ); } +void Part::findText(const QString &textToFind) +{ + m_findBar->initializeFindBar(textToFind); +} + } // namespace Okular #include "part.moc" diff --git a/shell/main.cpp b/shell/main.cpp --- a/shell/main.cpp +++ b/shell/main.cpp @@ -53,6 +53,7 @@ parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("print-and-exit"), i18n("Start with print dialog and exit after printing"))); parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("unique"), i18n("\"Unique instance\" control"))); parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("noraise"), i18n("Not raise window"))); + parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("find"), i18n("Find a string on the text"), QStringLiteral("string"))); parser.addPositionalArgument(QStringLiteral("urls"), i18n("Documents to open. Specify '-' to read from stdin.")); parser.process(app); diff --git a/shell/okular_main.cpp b/shell/okular_main.cpp --- a/shell/okular_main.cpp +++ b/shell/okular_main.cpp @@ -149,6 +149,12 @@ return Error; } + if(!ShellUtils::find(serializedOptions).isEmpty() && paths.count() > 1) + { + QTextStream stream(stderr); + stream << i18n( "Error: Can't open more than one document with the --find switch" ) << endl; + return Error; + } // try to attach to existing session, unique or not if (attachUniqueInstance(paths, serializedOptions) || attachExistingInstance(paths, serializedOptions)) { diff --git a/shell/shell.cpp b/shell/shell.cpp --- a/shell/shell.cpp +++ b/shell/shell.cpp @@ -681,12 +681,15 @@ void Shell::applyOptionsToPart( QObject* part, const QString &serializedOptions ) { KDocumentViewer* const doc = qobject_cast(part); + const QString find = ShellUtils::find(serializedOptions); if ( ShellUtils::startInPresentation(serializedOptions) ) doc->startPresentation(); if ( ShellUtils::showPrintDialog(serializedOptions) ) QMetaObject::invokeMethod( part, "enableStartWithPrint" ); if ( ShellUtils::showPrintDialogAndExit(serializedOptions) ) QMetaObject::invokeMethod( part, "enableExitAfterPrint" ); + if(!find.isEmpty()) + QMetaObject::invokeMethod( part, "findText", Q_ARG( const QString &, find ) ); } void Shell::connectPart( QObject* part ) diff --git a/shell/shellutils.h b/shell/shellutils.h --- a/shell/shellutils.h +++ b/shell/shellutils.h @@ -24,14 +24,15 @@ FileExistFunc qfileExistFunc(); QUrl urlFromArg(const QString& _arg, FileExistFunc exist_func, const QString& pageArg = QString() ); QString serializeOptions(const QCommandLineParser &args); -QString serializeOptions(bool startInPresentation, bool showPrintDialog, bool showPrintDialogAndExit, bool unique, bool noRaise, const QString &page); +QString serializeOptions(bool startInPresentation, bool showPrintDialog, bool showPrintDialogAndExit, bool unique, bool noRaise, const QString &page, const QString &find); bool unserializeOptions(const QString &serializedOptions, bool *presentation, bool *print, bool *print_and_exit, bool *unique, bool *noraise, QString *page); bool unique(const QString &serializedOptions); bool noRaise(const QString &serializedOptions); bool startInPresentation(const QString &serializedOptions); bool showPrintDialog(const QString &serializedOptions); bool showPrintDialogAndExit(const QString &serializedOptions); QString page(const QString &serializedOptions); +QString find(const QString &serializedOptions); } diff --git a/shell/shellutils.cpp b/shell/shellutils.cpp --- a/shell/shellutils.cpp +++ b/shell/shellutils.cpp @@ -35,7 +35,7 @@ return detail::qfileExistFunc; } -QUrl urlFromArg( const QString& _arg, FileExistFunc exist_func, const QString& pageArg ) +QUrl urlFromArg( const QString& _arg, FileExistFunc exist_func, const QString& pageArg) { QUrl url = QUrl::fromUserInput(_arg, QDir::currentPath(), QUrl::AssumeLocalFile); if ( url.isLocalFile() ) { @@ -59,6 +59,7 @@ { url.setFragment( pageArg ); } + return url; } @@ -70,26 +71,28 @@ const bool unique = args.isSet(QStringLiteral("unique")) && args.positionalArguments().count() <= 1; const bool noRaise = args.isSet(QStringLiteral("noraise")); const QString page = args.value(QStringLiteral("page")); + const QString find = args.value(QStringLiteral("find")); - return serializeOptions(startInPresentation, showPrintDialog, showPrintDialogAndExit, unique, noRaise, page); + return serializeOptions(startInPresentation, showPrintDialog, showPrintDialogAndExit, unique, noRaise, page, find); } -QString serializeOptions(bool startInPresentation, bool showPrintDialog, bool showPrintDialogAndExit, bool unique, bool noRaise, const QString &page) +QString serializeOptions(bool startInPresentation, bool showPrintDialog, bool showPrintDialogAndExit, bool unique, bool noRaise, const QString &page, const QString &find) { - return QStringLiteral("%1:%2:%3:%4:%5:%6").arg(startInPresentation).arg(showPrintDialog).arg(showPrintDialogAndExit).arg(unique).arg(noRaise).arg(page); + return QStringLiteral("%1:%2:%3:%4:%5:%6:%7").arg(startInPresentation).arg(showPrintDialog).arg(showPrintDialogAndExit).arg(unique).arg(noRaise).arg(page).arg(find); } -bool unserializeOptions(const QString &serializedOptions, bool *presentation, bool *print, bool *print_and_exit, bool *unique, bool *noraise, QString *page) +bool unserializeOptions(const QString &serializedOptions, bool *presentation, bool *print, bool *print_and_exit, bool *unique, bool *noraise, QString *page, QString *find) { const QStringList args = serializedOptions.split(QStringLiteral(":")); - if (args.count() == 6) + if (args.count() == 7) { *presentation = args[0] == QLatin1String("1"); *print = args[1] == QLatin1String("1"); *print_and_exit = args[2] == QLatin1String("1"); *unique = args[3] == QLatin1String("1"); *noraise = args[4] == QLatin1String("1"); *page = args[5]; + *find = args[6]; return true; } return false; @@ -99,42 +102,50 @@ { bool result, dummy; QString dummyString; - return unserializeOptions(serializedOptions, &result, &dummy, &dummy, &dummy, &dummy, &dummyString) && result; + return unserializeOptions(serializedOptions, &result, &dummy, &dummy, &dummy, &dummy, &dummyString, &dummyString) && result; } bool showPrintDialog(const QString &serializedOptions) { bool result, dummy; QString dummyString; - return unserializeOptions(serializedOptions, &dummy, &result, &dummy, &dummy, &dummy, &dummyString) && result; + return unserializeOptions(serializedOptions, &dummy, &result, &dummy, &dummy, &dummy, &dummyString, &dummyString) && result; } bool showPrintDialogAndExit(const QString &serializedOptions) { bool result, dummy; QString dummyString; - return unserializeOptions(serializedOptions, &dummy, &dummy, &result, &dummy, &dummy, &dummyString) && result; + return unserializeOptions(serializedOptions, &dummy, &dummy, &result, &dummy, &dummy, &dummyString, &dummyString) && result; } bool unique(const QString &serializedOptions) { bool result, dummy; QString dummyString; - return unserializeOptions(serializedOptions, &dummy, &dummy, &dummy, &result, &dummy, &dummyString) && result; + return unserializeOptions(serializedOptions, &dummy, &dummy, &dummy, &result, &dummy, &dummyString, &dummyString) && result; } bool noRaise(const QString &serializedOptions) { bool result, dummy; QString dummyString; - return unserializeOptions(serializedOptions, &dummy, &dummy, &dummy, &dummy, &result, &dummyString) && result; + return unserializeOptions(serializedOptions, &dummy, &dummy, &dummy, &dummy, &result, &dummyString, &dummyString) && result; } QString page(const QString &serializedOptions) { - QString result; + QString result, dummyString; bool dummy; - unserializeOptions(serializedOptions, &dummy, &dummy, &dummy, &dummy, &dummy, &result); + unserializeOptions(serializedOptions, &dummy, &dummy, &dummy, &dummy, &dummy, &result, &dummyString); + return result; +} + +QString find(const QString &serializedOptions) +{ + QString result, dummyString; + bool dummy; + unserializeOptions(serializedOptions, &dummy, &dummy, &dummy, &dummy, &dummy, &dummyString, &result); return result; } diff --git a/ui/findbar.h b/ui/findbar.h --- a/ui/findbar.h +++ b/ui/findbar.h @@ -33,6 +33,7 @@ void focusAndSetCursor(); bool maybeHide(); + void initializeFindBar(const QString & findText); Q_SIGNALS: void forwardKeyPressEvent( QKeyEvent* ); diff --git a/ui/findbar.cpp b/ui/findbar.cpp --- a/ui/findbar.cpp +++ b/ui/findbar.cpp @@ -197,4 +197,10 @@ close(); } +void FindBar::initializeFindBar(const QString & findText){ + m_search->lineEdit()->setText( findText ); + findNext(); + show(); +} + #include "moc_findbar.cpp"