diff options
| author | Andrea Diamantini <adjam7@gmail.com> | 2010-08-20 19:30:26 +0200 | 
|---|---|---|
| committer | Andrea Diamantini <adjam7@gmail.com> | 2010-08-20 19:30:26 +0200 | 
| commit | aa05bd3973a2f39f50c14314840f0fe078f16444 (patch) | |
| tree | dd21ae094321ca9f0b803379ad7e93a6b065ec10 /src/urlbar | |
| parent | bk toolbar by default for the next rekonq. (diff) | |
| parent | Change from QByteArray to QString in the right way (diff) | |
| download | rekonq-aa05bd3973a2f39f50c14314840f0fe078f16444.tar.xz | |
Merge branch 'opensearch'
Conflicts:
	src/CMakeLists.txt
	src/urlbar/urlresolver.cpp
Diffstat (limited to 'src/urlbar')
| -rw-r--r-- | src/urlbar/completionwidget.cpp | 9 | ||||
| -rw-r--r-- | src/urlbar/listitem.cpp | 59 | ||||
| -rw-r--r-- | src/urlbar/listitem.h | 20 | ||||
| -rw-r--r-- | src/urlbar/urlresolver.cpp | 248 | ||||
| -rw-r--r-- | src/urlbar/urlresolver.h | 31 | 
5 files changed, 261 insertions, 106 deletions
| diff --git a/src/urlbar/completionwidget.cpp b/src/urlbar/completionwidget.cpp index b77e2d7c..a9203bf7 100644 --- a/src/urlbar/completionwidget.cpp +++ b/src/urlbar/completionwidget.cpp @@ -153,13 +153,10 @@ void CompletionWidget::activateCurrentListItem()      //update text of the url bar      bar->blockSignals(true); //without compute suggestions -    if (!widget->inherits("SearchListItem")) -        bar->setQUrl( widget->url() ); -    else -        bar->setQUrl( _typedString ); +    bar->setQUrl(widget->text());      bar->blockSignals(false);      bar->setFocus(); -    bar->setCursorPosition( bar->text().length() ); +    bar->setCursorPosition(bar->text().length());  } @@ -240,7 +237,7 @@ bool CompletionWidget::eventFilter(QObject *obj, QEvent *ev)                  if( _currentIndex == -1)                      _currentIndex = 0;                  child = findChild<ListItem *>(QString::number(_currentIndex)); -                if(child && _typedString == w->text()) +                if(child)                  {                      emit chosenUrl(child->url(), Rekonq::CurrentTab);                  } diff --git a/src/urlbar/listitem.cpp b/src/urlbar/listitem.cpp index f10cefd7..e9bb6fbb 100644 --- a/src/urlbar/listitem.cpp +++ b/src/urlbar/listitem.cpp @@ -139,6 +139,12 @@ KUrl ListItem::url()  } +QString ListItem::text() +{ +    return m_url.url(); +} + +  void ListItem::nextItemSubChoice()  {      //will be override @@ -161,6 +167,7 @@ TypeIconLabel::TypeIconLabel(int type, QWidget *parent)      if (type & UrlSearchItem::Browse) hLayout->addWidget(getIcon("applications-internet"));      if (type & UrlSearchItem::Bookmark) hLayout->addWidget(getIcon("rating"));      if (type & UrlSearchItem::History) hLayout->addWidget(getIcon("view-history")); +    if (type & UrlSearchItem::Suggestion) hLayout->addWidget(getIcon("help-hint"));  } @@ -297,6 +304,12 @@ SearchListItem::SearchListItem(const UrlSearchItem &item, const QString &text, Q  } +QString SearchListItem::text() +{ +    return m_text; +} + +  QString SearchListItem::searchItemTitle(QString engine, QString text)  {      return QString(i18nc("%1=search engine, e.g. Google, Wikipedia %2=text to search for", "Search %1 for <b>%2</b>", engine, Qt::escape(text))); @@ -390,6 +403,42 @@ void EngineBar::selectNextEngine()  // --------------------------------------------------------------- +SuggestionListItem::SuggestionListItem(const UrlSearchItem &item, const QString &text, QWidget *parent) +        : ListItem(item, parent) +        , m_text(item.title) +{ +    QHBoxLayout *hLayout = new QHBoxLayout; +    hLayout->setSpacing(4); + +    QString query = item.title; +    KService::Ptr engine = SearchEngine::fromString(query); +    if (engine) +    { +        query = query.remove(0, text.indexOf(SearchEngine::delimiter()) + 1); +    } +    else +    { +        engine = qobject_cast<CompletionWidget *>(parent)->searchEngine(); +    } + +    m_url = SearchEngine::buildQuery(engine, query); + +    hLayout->addWidget(new IconLabel(SearchEngine::buildQuery(engine, ""), this)); +    hLayout->addWidget(new TextLabel(item.title, text, this)); +    hLayout->addWidget(new TypeIconLabel(item.type, this)); + +    setLayout(hLayout); +} + + +QString SuggestionListItem::text() +{ +    return m_text; +} + +// --------------------------------------------------------------- + +  BrowseListItem::BrowseListItem(const UrlSearchItem &item, const QString &text, QWidget *parent)          : ListItem(item, parent)  { @@ -427,7 +476,15 @@ ListItem *ListItemFactory::create(const UrlSearchItem &item, const QString &text          }          else          { -            newItem = new PreviewListItem(item, text, parent); + +            if (item.type & UrlSearchItem::Suggestion) +            { +                newItem = new SuggestionListItem(item, text, parent); +            } +            else +            { +                newItem = new PreviewListItem(item, text, parent); +            }          }      } diff --git a/src/urlbar/listitem.h b/src/urlbar/listitem.h index dcb4f76d..06a02b80 100644 --- a/src/urlbar/listitem.h +++ b/src/urlbar/listitem.h @@ -61,7 +61,8 @@ public:      void deactivate();      KUrl url(); - +    virtual QString text(); +      public slots:      virtual void nextItemSubChoice(); @@ -153,6 +154,7 @@ class SearchListItem : public ListItem  public:      explicit SearchListItem(const UrlSearchItem &item, const QString &text, QWidget *parent = 0); +    QString text();  public slots:      virtual void nextItemSubChoice(); @@ -174,6 +176,22 @@ private:  // ------------------------------------------------------------------------- +class SuggestionListItem : public ListItem +{ +    Q_OBJECT + +public: +    SuggestionListItem(const UrlSearchItem &item, const QString &text, QWidget *parent = 0); +    QString text(); + +private: +    QString m_text; +}; + + +// ------------------------------------------------------------------------- + +  class PreviewListItem : public ListItem  {      Q_OBJECT diff --git a/src/urlbar/urlresolver.cpp b/src/urlbar/urlresolver.cpp index ed4dcb4e..0505dad1 100644 --- a/src/urlbar/urlresolver.cpp +++ b/src/urlbar/urlresolver.cpp @@ -45,7 +45,7 @@  // defines  #define MAX_ELEMENTS 10 - +#define MIN_SUGGESTIONS 3  // NOTE   // default kurifilter plugin list (at least in my box): @@ -63,7 +63,8 @@ QRegExp UrlResolver::_browseRegexp;  QRegExp UrlResolver::_searchEnginesRegexp;  UrlResolver::UrlResolver(const QString &typedUrl) -        : _typedString(typedUrl.trimmed()) +        : QObject() +        , _typedString(typedUrl.trimmed())  {      if ( _browseRegexp.isEmpty() )      { @@ -110,20 +111,9 @@ UrlResolver::UrlResolver(const QString &typedUrl)  UrlSearchList UrlResolver::orderedSearchItems()  { -    // NOTE  -    // the logic here is : "we wanna suggest (at least) 10 elements" -    // so we have (more or less) 2 from first results (1 from QUrl Resolutions, 1 from -    // search engines). -    // There are 8 remaining: if bookmarkResults + historyResults <= 8, catch all, else -    // catch first 4 results from the two resulting lists :) - -    QTime myTime; -    myTime.start(); -     -    UrlSearchList list; -      if( _typedString == QL1S("about:") )      { +        UrlSearchList list;          UrlSearchItem home(UrlSearchItem::Browse, QString("about:home"),       QL1S("home") );          list << home;          UrlSearchItem favs(UrlSearchItem::Browse, QString("about:favorites"),  QL1S("favorites") ); @@ -136,148 +126,189 @@ UrlSearchList UrlResolver::orderedSearchItems()          list << hist;          UrlSearchItem down(UrlSearchItem::Browse, QString("about:downloads"),  QL1S("downloads") );          list << down; - +                  return list;      } +    _computedListsCount = 0; + +    //compute lists +    computeSuggestions(); +    computeQurlFromUserInput(); +    computeWebSearches(); +    computeBookmarks(); +    computeHistory(); + +    QTime time; +    time.start(); + +    while (_computedListsCount < 5 && time.msec() < 1000) +    { +        Application::instance()->processEvents(QEventLoop::WaitForMoreEvents | QEventLoop::ExcludeUserInputEvents);  +    } + +    return orderLists(); +} + + +UrlSearchList UrlResolver::orderLists() +{ +    // NOTE  +    // the logic here is : "we wanna suggest (at least) 10 elements" +    // so we have (more or less) 2 from first results (1 from QUrl Resolutions, 1 from +    // search engines). +    // There are 8 remaining: if bookmarkResults + historyResults <= 8, catch all, else +    // catch first 4 results from the two resulting lists :) + +    QTime myTime; +    myTime.start(); +     +    UrlSearchList list; +          if(_browseRegexp.indexIn(_typedString) != -1)      { -        list << qurlFromUserInputResolution(); -        list << webSearchesResolution(); +        list << _qurlFromUserInput; +        list << _webSearches;      }      else      { -        list << webSearchesResolution(); -        list << qurlFromUserInputResolution(); +        list << _webSearches; +        list << _qurlFromUserInput;      }      //find the history items that match the typed string -    UrlSearchList historyList = historyResolution(); -    UrlSearchItem privileged = privilegedItem(&historyList); -    int historyResults = historyList.count(); +    UrlSearchItem privileged = privilegedItem(&_history); +    int historyCount = _history.count();      //find the bookmarks items that match the typed string -    UrlSearchList bookmarksList = bookmarksResolution();      if (privileged.type == UrlSearchItem::Undefined)      { -        privileged = privilegedItem(&bookmarksList); +        privileged = privilegedItem(&_bookmarks);      } -    else if(privileged.type == UrlSearchItem::History && bookmarksList.removeOne(privileged)) +    else if(privileged.type == UrlSearchItem::History && _bookmarks.removeOne(privileged))      {          privileged.type |= UrlSearchItem::Bookmark;      } -    int bookmarksResults = bookmarksList.count(); +    int bookmarksCount = _bookmarks.count();      if (privileged.type != UrlSearchItem::Undefined)      {          list.prepend(privileged);      } + +    int availableEntries = MAX_ELEMENTS - list.count() - MIN_SUGGESTIONS; -    int availableEntries = MAX_ELEMENTS - list.count(); -     -    UrlSearchList commonList; -    int commonResutls = 0; +    UrlSearchList common; +    int commonCount = 0;      //prefer items which are history items als well bookmarks item      //if there are more than 1000 bookmark results, the performance impact is noticeable -    if(bookmarksResults < 1000) +    if(bookmarksCount < 1000)      {          //add as many items to the common list as there are available entries in the dropdown list          UrlSearchItem urlSearchItem; -        for(int i = 0; i < historyList.count(); i++) +        for(int i = 0; i < _history.count(); i++)          { -            if (bookmarksList.removeOne(historyList.at(i))) +            if (_bookmarks.removeOne(_history.at(i)))              { -                urlSearchItem = historyList.takeAt(i); +                urlSearchItem = _history.takeAt(i);                  urlSearchItem.type |= UrlSearchItem::Bookmark; -                commonList << urlSearchItem; -                commonResutls++; -                if(commonResutls >= availableEntries) +                common << urlSearchItem; +                commonCount++; +                if(commonCount >= availableEntries)                  {                      break;                  }              }          } -        commonResutls = commonList.count(); -        if(commonResutls >= availableEntries) +        commonCount = common.count(); +        if(commonCount >= availableEntries)          { -            commonList = commonList.mid(0, availableEntries); -            historyList = UrlSearchList(); -            bookmarksList = UrlSearchList(); +            common = common.mid(0, availableEntries); +            _history = UrlSearchList(); +            _bookmarks = UrlSearchList();              availableEntries = 0;          }          else        //remove all items from the history and bookmarks list up to the remaining entries in the dropdown list          { -            availableEntries -= commonResutls; -            if(historyResults >= availableEntries) +            availableEntries -= commonCount; +            if(historyCount >= availableEntries)              { -                historyList = historyList.mid(0, availableEntries); +                _history = _history.mid(0, availableEntries);              } -            if(bookmarksResults >= availableEntries) +            if(bookmarksCount >= availableEntries)              { -                bookmarksList = bookmarksList.mid(0, availableEntries); +                _bookmarks = _bookmarks.mid(0, availableEntries);              }          }      }      else        //if there are too many bookmarks items, remove all items up to the remaining entries in the dropdown list      { -         -        if(historyResults >= availableEntries) + +        if(historyCount >= availableEntries)          { -            historyList = historyList.mid(0, availableEntries); +            _history = _history.mid(0, availableEntries);          } -        if(bookmarksResults >= availableEntries) +        if(bookmarksCount >= availableEntries)          { -            bookmarksList = bookmarksList.mid(0, availableEntries); +            _bookmarks = _bookmarks.mid(0, availableEntries);          }          UrlSearchItem urlSearchItem; -        for(int i = 0; i < historyList.count(); i++) +        for(int i = 0; i < _history.count(); i++)          { -            if (bookmarksList.removeOne(historyList.at(i))) +            if (_bookmarks.removeOne(_history.at(i)))              { -                urlSearchItem = historyList.takeAt(i); +                urlSearchItem = _history.takeAt(i);                  urlSearchItem.type |= UrlSearchItem::Bookmark; -                commonList << urlSearchItem; +                common << urlSearchItem;              }          } -        availableEntries -= commonList.count(); +        availableEntries -= common.count();      } -    historyResults = historyList.count(); -    bookmarksResults = bookmarksList.count(); -    commonResutls = commonList.count(); -     +    historyCount = _history.count(); +    bookmarksCount = _bookmarks.count(); +    commonCount = common.count(); +      //now fill the list to MAX_ELEMENTS      if(availableEntries > 0)      {          int historyEntries = ((int) (availableEntries / 2)) + availableEntries % 2;          int bookmarksEntries = availableEntries - historyEntries; -        if (historyResults >= historyEntries && bookmarksResults >= bookmarksEntries) +        if (historyCount >= historyEntries && bookmarksCount >= bookmarksEntries)          { -            historyList = historyList.mid(0, historyEntries); -            bookmarksList = bookmarksList.mid(0, bookmarksEntries); +            _history = _history.mid(0, historyEntries); +            _bookmarks = _bookmarks.mid(0, bookmarksEntries);          } -        else if (historyResults < historyEntries && bookmarksResults >= bookmarksEntries) +        else if (historyCount < historyEntries && bookmarksCount >= bookmarksEntries)          { -            if(historyResults + bookmarksResults > availableEntries) +            if(historyCount + bookmarksCount > availableEntries)              { -                bookmarksList = bookmarksList.mid(0, availableEntries - historyResults); +                _bookmarks = _bookmarks.mid(0, availableEntries - historyCount);              }          } -        else if (historyResults >= historyEntries && bookmarksResults < bookmarksEntries) +        else if (historyCount >= historyEntries && bookmarksCount < bookmarksEntries)          { -            if(historyResults + bookmarksResults > availableEntries) +            if(historyCount + bookmarksCount > availableEntries)              { -                historyList = historyList.mid(0, availableEntries - bookmarksResults); +                _history = _history.mid(0, availableEntries - bookmarksCount);              }          }      } -     -    list = list + historyList + commonList + bookmarksList; + +    availableEntries -=  _history.count(); +    availableEntries -=  _bookmarks.count(); + +    if (_suggestions.count() > availableEntries + MIN_SUGGESTIONS) +    { +        _suggestions = _suggestions.mid(0, availableEntries + MIN_SUGGESTIONS); +    } + +    list = list + _history + common + _bookmarks + _suggestions;      qWarning() << "orderedSearchItems leave: " << " elapsed: " << myTime.elapsed();      return list; @@ -288,60 +319,93 @@ UrlSearchList UrlResolver::orderedSearchItems()  // PRIVATE ENGINES -// STEP 1 = QUrl from User Input (easily the best solution... ) -UrlSearchList UrlResolver::qurlFromUserInputResolution() +//QUrl from User Input (easily the best solution... ) +void UrlResolver::computeQurlFromUserInput()  { -    UrlSearchList list; -    QString url2 = _typedString; -    QUrl urlFromUserInput = QUrl::fromUserInput(url2); +    QString url = _typedString; +    QUrl urlFromUserInput = QUrl::fromUserInput(url);      if (urlFromUserInput.isValid())      {          QString gTitle = i18nc("Browse a website", "Browse");          UrlSearchItem gItem(UrlSearchItem::Browse, urlFromUserInput.toString(), gTitle); -        list << gItem; +        _qurlFromUserInput << gItem;      } -    return list; +    _computedListsCount++;  } -// STEP 2 = Web Searches -UrlSearchList UrlResolver::webSearchesResolution() +//webSearches +void UrlResolver::computeWebSearches()  { -    return UrlSearchList() << UrlSearchItem(UrlSearchItem::Search, QString(), QString()); +    _webSearches = (UrlSearchList() << UrlSearchItem(UrlSearchItem::Search, QString(), QString())); +    _computedListsCount++;  } -// STEP 3 = history completion -UrlSearchList UrlResolver::historyResolution() +//history +void UrlResolver::computeHistory()  {      QList<HistoryItem> found = Application::historyManager()->find(_typedString);      qSort(found); -    UrlSearchList list;      Q_FOREACH(const HistoryItem &i, found)      {          if (_searchEnginesRegexp.indexIn(i.url) == -1) //filter all urls that are search engine results          {              UrlSearchItem gItem(UrlSearchItem::History, i.url, i.title); -            list << gItem; +            _history << gItem;          }      } -    return list; + +    _computedListsCount++;  } -// STEP 4 = bookmarks completion -UrlSearchList UrlResolver::bookmarksResolution() +// bookmarks +void UrlResolver::computeBookmarks()  { -    UrlSearchList list;      QList<KBookmark> found = Application::bookmarkProvider()->find(_typedString); +      Q_FOREACH(const KBookmark &b, found)      {          UrlSearchItem gItem(UrlSearchItem::Bookmark, b.url().url(), b.fullText()); -        list << gItem; +        _bookmarks << gItem;      } -    return list; + +    _computedListsCount++; +} + + +//opensearch suggestion +void UrlResolver::computeSuggestions() +{ +    if (Application::opensearchManager()->isSuggestionAvailable()) +    { +        connect(Application::opensearchManager(),  +                SIGNAL(suggestionReceived(const QStringList &)),  +                this,  +                SLOT(suggestionsReceived(const QStringList &))); + +        Application::opensearchManager()->requestSuggestion(_typedString); +    } +    else +    { +        _computedListsCount++; +    } +} + + +void UrlResolver::suggestionsReceived(const QStringList &suggestion) +{ +    +    foreach (QString s, suggestion) +    { +        UrlSearchItem gItem(UrlSearchItem::Suggestion, s, s); +        _suggestions << gItem; +    } + +    _computedListsCount++;  } diff --git a/src/urlbar/urlresolver.h b/src/urlbar/urlresolver.h index c79ce184..f72d6731 100644 --- a/src/urlbar/urlresolver.h +++ b/src/urlbar/urlresolver.h @@ -38,6 +38,7 @@  // Qt Includes  #include <QString>  #include <QList> +#include <QStringList>  class UrlSearchItem  { @@ -50,6 +51,7 @@ public:          Browse          = 0x00000010,          History         = 0x00000100,          Bookmark        = 0x00001000, +        Suggestion      = 0x00010000,      };      int type; @@ -93,8 +95,10 @@ typedef QList <UrlSearchItem> UrlSearchList;  // ---------------------------------------------------------------------- -class UrlResolver +class UrlResolver : public QObject  { +    Q_OBJECT +  public:      UrlResolver(const QString &typedUrl); @@ -103,14 +107,29 @@ public:  private:      QString _typedString; -    UrlSearchList webSearchesResolution(); -    UrlSearchList historyResolution(); -    UrlSearchList qurlFromUserInputResolution(); -    UrlSearchList bookmarksResolution(); +    UrlSearchList _webSearches; +    UrlSearchList _qurlFromUserInput; +    UrlSearchList _history; +    UrlSearchList _bookmarks; +    UrlSearchList _suggestions; +     +    void computeWebSearches(); +    void computeHistory(); +    void computeQurlFromUserInput(); +    void computeBookmarks(); +    void computeSuggestions(); + +    int _computedListsCount; +      UrlSearchItem privilegedItem(UrlSearchList* list); -      +    UrlSearchList orderLists(); +      static QRegExp _browseRegexp;      static QRegExp _searchEnginesRegexp; +     +private slots: +    void suggestionsReceived(const QStringList &suggestion);     +      };  // ------------------------------------------------------------------------------ | 
