text: /*
   * Copyright (C) 2010-2013 Groupement d'Intérêt Public pour l'Education Numérique en Afrique (GIP ENA)
   *
   * This file is part of Open-Sankoré.
   *
   * Open-Sankoré is free software: you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation, version 3 of the License,
   * with a specific linking exception for the OpenSSL project's
   * "OpenSSL" library (or with modified versions of it that use the
   * same license as the "OpenSSL" library).
   *
   * Open-Sankoré is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with Open-Sankoré.  If not, see <http://www.gnu.org/licenses/>.
   */
  
  
  
  /****************************************************************************
  **
  ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
  ** Contact: Qt Software Information (qt-info@nokia.com)
  **
  ** This file is part of the demonstration applications of the Qt Toolkit.
  **
  ** $QT_BEGIN_LICENSE:LGPL$
  ** Commercial Usage
  ** Licensees holding valid Qt Commercial licenses may use this file in
  ** accordance with the Qt Commercial License Agreement provided with the
  ** Software or, alternatively, in accordance with the terms contained in
  ** a written agreement between you and Nokia.
  **
  ** 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.0, included in the file LGPL_EXCEPTION.txt in this
  ** package.
  **
  ** GNU General Public License Usage
  ** Alternatively, this file may be used under the terms of the GNU
  ** General Public License version 3.0 as published by the Free Software
  ** Foundation and appearing in the file LICENSE.GPL included in the
  ** packaging of this file.  Please review the following information to
  ** ensure the GNU General Public License version 3.0 requirements will be
  ** met: http://www.gnu.org/copyleft/gpl.html.
  **
  ** If you are unsure which license is appropriate for your use, please
  ** contact the sales department at qt-sales@nokia.com.
  ** $QT_END_LICENSE$
  **
  ****************************************************************************/
  
  #include "WBToolBarSearch.h"
  
  #include <QtGui>
  #include <QtWebKit>
  
  #include "network/UBAutoSaver.h"
  
  #include "core/memcheck.h"
  
  /*
      ToolbarSearch is a very basic search widget that also contains a small history.
      Searches are turned into urls that use Google to perform search
   */
  WBToolbarSearch::WBToolbarSearch(QWidget *parent)
      : WBSearchLineEdit(parent)
      , mAutosaver(new UBAutoSaver(this))
      , mMaxSavedSearches(10)
      , mStringListModel(new QStringListModel(this))
  {
      QMenu *m = menu();
      connect(m, SIGNAL(aboutToShow()), this, SLOT(aboutToShowMenu()));
      connect(m, SIGNAL(triggered(QAction*)), this, SLOT(triggeredMenuAction(QAction*)));
  
      QCompleter *completer = new QCompleter(mStringListModel, this);
      completer->setCompletionMode(QCompleter::InlineCompletion);
      lineEdit()->setCompleter(completer);
  
      connect(lineEdit(), SIGNAL(returnPressed()), SLOT(searchNow()));
      setInactiveText(tr("Search"));
      load();
  }
  
  WBToolbarSearch::~WBToolbarSearch()
  {
      mAutosaver->saveIfNeccessary();
  }
  
  void WBToolbarSearch::save()
  {
      QSettings settings;
      settings.beginGroup(QLatin1String("toolbarsearch"));
      settings.setValue(QLatin1String("recentSearches"), mStringListModel->stringList());
      settings.setValue(QLatin1String("maximumSaved"), mMaxSavedSearches);
      settings.endGroup();
  }
  
  void WBToolbarSearch::load()
  {
      QSettings settings;
      settings.beginGroup(QLatin1String("toolbarsearch"));
      QStringList list = settings.value(QLatin1String("recentSearches")).toStringList();
      mMaxSavedSearches = settings.value(QLatin1String("maximumSaved"), mMaxSavedSearches).toInt();
      mStringListModel->setStringList(list);
      settings.endGroup();
  }
  
  void WBToolbarSearch::searchNow()
  {
      QString searchText = lineEdit()->text();
      QStringList newList = mStringListModel->stringList();
  
      if (newList.contains(searchText))
          newList.removeAt(newList.indexOf(searchText));
      newList.prepend(searchText);
  
      if (newList.size() >= mMaxSavedSearches)
          newList.removeLast();
  
      QWebSettings *globalSettings = QWebSettings::globalSettings();
      if (!globalSettings->testAttribute(QWebSettings::PrivateBrowsingEnabled))
      {
          mStringListModel->setStringList(newList);
          mAutosaver->changeOccurred();
      }
  
      QUrl url(QLatin1String("http://www.google.com/search"));
      url.addQueryItem(QLatin1String("q"), searchText);
      url.addQueryItem(QLatin1String("ie"), QLatin1String("UTF-8"));
      url.addQueryItem(QLatin1String("oe"), QLatin1String("UTF-8"));
      url.addQueryItem(QLatin1String("client"), QLatin1String("uniboard-browser"));
      emit search(url);
  }
  
  void WBToolbarSearch::aboutToShowMenu()
  {
      lineEdit()->selectAll();
      QMenu *m = menu();
      m->clear();
      QStringList list = mStringListModel->stringList();
      if (list.isEmpty())
      {
          m->addAction(tr("No Recent Searches"));
          return;
      }
  
      QAction *recent = m->addAction(tr("Recent Searches"));
      recent->setEnabled(false);
      for (int i = 0; i < list.count(); ++i)
      {
          QString text = list.at(i);
          m->addAction(text)->setData(text);
      }
      m->addSeparator();
      m->addAction(tr("Clear Recent Searches"), this, SLOT(clear()));
  }
  
  void WBToolbarSearch::triggeredMenuAction(QAction *action)
  {
      QVariant v = action->data();
      if (v.canConvert<QString>())
      {
          QString text = v.toString();
          lineEdit()->setText(text);
          searchNow();
      }
  }
  
  void WBToolbarSearch::clear()
  {
      mStringListModel->setStringList(QStringList());
      mAutosaver->changeOccurred();;
  }
  
  