filebrowser/ui/src/searchview.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 14 May 2010 15:53:02 +0300
changeset 17 4f2773374eff
child 19 4b22a598b890
permissions -rw-r--r--
Revision: 201017 Kit: 201019

/*
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/

#include "searchview.h"
#include "enginewrapper.h"

#include <HbView>
#include <HbMainWindow>

#include <HbDataForm>
#include <HbDataFormModel>
#include <HbDataFormModelItem>
#include <HbAction>
#include <HbPushButton>
#include <HbListWidget>
#include <HbListWidgetItem>
#include <HbDialog>
#include <HbMenu>

#include <QtGui>
#include <QDir>
#include <QFileInfo>
#include <QProgressBar>


const QStringList RECURSEMODES = (QStringList() << "Non-recursive" << "Recursive");

SearchView::SearchView(HbView &mainView, HbMainWindow &mainWindow, EngineWrapper &engineWrapper)
: mMainWindow(mainWindow),
  mMainView(mainView),
  mEngineWrapper(engineWrapper),
  mAttributes(),
  mResults(),
  mForm(0),
  mSearchFileNameItem(0),
  mWildCardItem(0),
  mHasString(0),
  mRecurse(0),
  mMinSize(0),
  mMaxSize(0),
  mMinDate(0),
  mMaxDate(0),
  mPath()
{
}

SearchView::~SearchView() 
{
}

void SearchView::open(const QString &path)
{   
    // Remove main view from main window
    mMainWindow.removeView(&mMainView);
    mMainWindow.addView(this);
    // Set title and add this view to main window
    setTitle("Search");
	
    mForm = new HbDataForm(/*HbFormView::ModeEdit,*/ this);
    HbDataFormModel *model = new HbDataFormModel();
    mPath = path;
    mSearchFileNameItem = new HbDataFormModelItem(HbDataFormModelItem::TextItem);
    mSearchFileNameItem->setLabel("Search dir: ");

    mWildCardItem = new HbDataFormModelItem(HbDataFormModelItem::TextItem);
    mWildCardItem->setLabel("Wildcards: ");

    mHasString = new HbDataFormModelItem(HbDataFormModelItem::TextItem);
    mHasString->setLabel("Has string: ");
    
    mRecurse = new HbDataFormModelItem(HbDataFormModelItem::ComboBoxItem);
    mRecurse->setLabel("Recurse: ");
    mRecurse->setContentWidgetData("items", RECURSEMODES);
    
    mMinSize = new HbDataFormModelItem(HbDataFormModelItem::TextItem);
    mMinSize->setLabel("Min size: ");
    
    mMaxSize = new HbDataFormModelItem(HbDataFormModelItem::TextItem);
    mMaxSize->setLabel("Max size: ");
    
    mMinDate = new HbDataFormModelItem(HbDataFormModelItem::TextItem);
    mMinDate->setLabel("Min date: ");
    mMinDate->setContentWidgetData("text", "01/01/1980");
    
    mMaxDate = new HbDataFormModelItem(HbDataFormModelItem::TextItem);
    mMaxDate->setLabel("Max date: ");
    mMaxDate->setContentWidgetData("text", "31/12/2060");
    
    // load file search attribute values from FB engine:
    loadAttributes();
    
    model->appendDataFormItem(mSearchFileNameItem);
    model->appendDataFormItem(mWildCardItem);
    model->appendDataFormItem(mHasString);
    model->appendDataFormItem(mRecurse);
    model->appendDataFormItem(mMinSize);
    model->appendDataFormItem(mMaxSize);
    model->appendDataFormItem(mMinDate);
    model->appendDataFormItem(mMaxDate);
    mForm->setModel(model);

    QGraphicsLinearLayout* layout = new QGraphicsLinearLayout(Qt::Vertical,this);

    HbPushButton* buttonSearch = new HbPushButton("Search");
    buttonSearch->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed);
    connect(buttonSearch, SIGNAL(clicked()), this, SLOT(startFileSearch()));

	HbPushButton* buttonCancel = new HbPushButton("Cancel");
    buttonCancel->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed);
    connect(buttonCancel, SIGNAL(clicked()), this, SLOT(backButtonClicked()));

    // Create widget and layout for buttons
    QGraphicsWidget *buttonsWidget = new QGraphicsWidget(this);
    QGraphicsGridLayout *gridLayout = new QGraphicsGridLayout(buttonsWidget);
    
    // add buttons to layout
    gridLayout->addItem(buttonSearch, 0, 0);
	gridLayout->addItem(buttonCancel, 0, 1);
    buttonsWidget->setLayout(gridLayout);
	// add form and buttons widget to list layout
	layout->addItem(mForm);
	layout->addItem(buttonsWidget);
    setLayout(layout);
    // about to close connect to go back to file browser view
    connect(this, SIGNAL(aboutToClose()), this, SLOT(backButtonClicked())); 
}

void SearchView::backButtonClicked()
{
    mMainWindow.removeView(this);
	mForm->deleteLater();
	mForm = 0;
    mMainWindow.addView(&mMainView);
}

void SearchView::startFileSearch()
{
    // save form data values and set them as search attributes into FB engine. 
    readFormItems();
    mEngineWrapper.setFileSearchAttributes(mAttributes);
    
    // Create busy indicator widget with  label **Searching**. Launch it to screen when
    // FB Utils engine started for file search.  Hide busy indicator when search completed.
    QProgressBar *progressBar = new QProgressBar();
	progressBar->setMaximumHeight(16);
	progressBar->setMaximumWidth(200);    
    progressBar->setTextVisible(false);
    progressBar->setMaximum(0);
    progressBar->setMinimum(0);
    progressBar->setValue(1);

    QWidget *busyIndWidget = new QWidget();
    busyIndWidget->setGeometry(12, 50, 120, 60);
    QVBoxLayout *vbl = new QVBoxLayout(busyIndWidget);
    QLabel *label = new QLabel("**Searching**");
    vbl->addWidget(label);
    vbl->addWidget(progressBar);
    QHBoxLayout *hbl1 = new QHBoxLayout();
    vbl->addLayout(hbl1);   
    busyIndWidget->show();        
    qApp->processEvents();
    bool err = mEngineWrapper.searchFiles();
    busyIndWidget->hide();

    // show results of file search:
    mResults = mEngineWrapper.getSearchResults();
    fileSearchResults();
}


void SearchView::loadAttributes()
{
    // get settings from engine;
    mAttributes = mEngineWrapper.getFileSearchAttributes();
    
    // set data:
    mSearchFileNameItem->setContentWidgetData("text", mPath);
    mSearchFileNameItem->setContentWidgetData("text", mAttributes.mSearchDir);
    mWildCardItem->setContentWidgetData("text",mAttributes.mWildCards);
    mHasString->setContentWidgetData("text", mAttributes.mTextInFile);

    mRecurse->setContentWidgetData("selected",mAttributes.mRecurse);

    mMinSize->setContentWidgetData("text",mAttributes.mMinSize);
    mMaxSize->setContentWidgetData("text", mAttributes.mMaxSize);

    mMinDate->setContentWidgetData("text", mAttributes.mMinDate);
    mMaxDate->setContentWidgetData("text", mAttributes.mMaxDate);
}


void SearchView::fileSearchResults()
{
    HbDialog *dialog = new HbDialog();
    dialog->setDismissPolicy(HbPopup::TapOutside);
    dialog->setTimeout(HbPopup::NoTimeout);

    // Create a list and some simple content for it
    HbListWidget *resultsList = new HbListWidget();
    resultsList->addItem(QString("%1 entries found").arg(mResults.mNumberOfFoundFiles));
    for (int i = 0; i < mResults.mFoundFilesList->size(); i++) {
        resultsList->addItem(QString("%1").arg(mResults.mFoundFilesList->at(i)));
        }
    dialog->setContentWidget(resultsList);    
    dialog->open();
}

/**
 * Reads form items and saves values of them into member variable mAttributes
 */
void SearchView::readFormItems()
{
    mAttributes.mSearchDir  = mSearchFileNameItem->contentWidgetData("text").toString();
    mAttributes.mWildCards  = mWildCardItem->contentWidgetData("text").toString();
    mAttributes.mTextInFile = mHasString->contentWidgetData("text").toString();
    mAttributes.mMinSize    = mMinSize->contentWidgetData("text").toInt();
    mAttributes.mMaxSize    = mMaxSize->contentWidgetData("text").toInt();
    mAttributes.mMinDate    = mMinDate->contentWidgetData("text").toDate();
    mAttributes.mMaxDate    = mMaxDate->contentWidgetData("text").toDate();
    mAttributes.mRecurse    = mRecurse->contentWidgetData("selected").toBool();
}