--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/qcpix/tsrc/samplesearch/samplesearch.cpp Mon Apr 19 14:40:16 2010 +0300
@@ -0,0 +1,365 @@
+/*
+* 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 "SampleSearch.h"
+#include "searchhandler.h"
+#include <QCPixDocument.h>
+#include <xqservicerequest.h>
+
+SampleSearch::SampleSearch(QWidget */*parent*/)
+{
+ iSearchHandler = new CSearchHandler();
+ noOfItemsPerPage = 15;
+ iCurrentPageNum =0;
+ noOfPages =0;
+ asyncSearch = false;
+ //QDesktopWidget* desktopWidget = QApplication::desktop();
+ QRect clientRect(0,0,360,640);// = desktopWidget->availableGeometry();
+ setGeometry(clientRect);
+ rootLayout = new QVBoxLayout();
+
+ rowLayout = new QHBoxLayout();
+ lbCaption = new QLabel("Search");
+ //lbCaption->setText(tr("Search"));
+ rowLayout->addWidget(lbCaption);
+
+ txtSearch = new QLineEdit();
+ rowLayout->addWidget(txtSearch);
+ rootLayout->addLayout(rowLayout);
+
+ rowButtonLayout = new QHBoxLayout();
+
+ btnSearch = new QPushButton();
+ btnSearch->setText(tr("Search"));
+ rowButtonLayout->addWidget(btnSearch);
+
+ btnSearchAsync = new QPushButton();
+ btnSearchAsync->setText(tr("Search ASync"));
+ rowButtonLayout->addWidget(btnSearchAsync);
+
+ rootLayout->addLayout(rowButtonLayout);
+
+ searchResultLayout = new QHBoxLayout();
+ iSearchResultLabel = new QLabel("Search Result Count:");
+ searchResultLayout->addWidget(iSearchResultLabel);
+
+ txtSearchResultCount = new QLineEdit();
+ txtSearchResultCount->setText("0");
+ searchResultLayout->addWidget(txtSearchResultCount);
+
+ rootLayout->addLayout(searchResultLayout);
+
+ iPageInfoLabel = new QLabel();
+ iPageInfoLabel->setText("No results to display");
+ rootLayout->addWidget(iPageInfoLabel);
+
+
+ layoutForNavButton = new QHBoxLayout();
+
+ btnPrev = new QPushButton();
+ btnPrev->setText(tr("Prev"));
+ layoutForNavButton->addWidget(btnPrev);
+ connect(btnPrev, SIGNAL(clicked()),this, SLOT(displayPrevPage()));
+ rootLayout->addLayout(layoutForNavButton);
+ btnPrev->setEnabled(true);
+
+ btnNext = new QPushButton();
+ btnNext->setText(tr("Next"));
+ layoutForNavButton->addWidget(btnNext);
+ connect(btnNext, SIGNAL(clicked()),this, SLOT(displayNextPage()));
+ btnNext->setEnabled(true);
+
+ dataTable = new QTableWidget();
+ dataTable->setColumnCount(3);
+ QStringList headings;
+ headings << tr("Class")
+ << tr("Doc Id")
+ << tr("Excerpt");
+ dataTable->setHorizontalHeaderLabels(headings);
+ rootLayout->addWidget(dataTable);
+
+ setLayout(rootLayout);
+ setWindowTitle(tr("Search"));
+ connect(btnSearch, SIGNAL(clicked()),this, SLOT(doSearch()));
+ connect(btnSearchAsync, SIGNAL(clicked()),this, SLOT(doSearchAsync()));
+ connect(iSearchHandler, SIGNAL(handleSearchResult(int,int)),this, SLOT(onSearchComplete(int,int)));
+ connect(iSearchHandler, SIGNAL(handleAsyncSearchResult(int,int)),this, SLOT(onAsyncSearchComplete(int,int)));
+ connect(iSearchHandler, SIGNAL(handleDocument(int,QCPixDocument*)),this, SLOT(onGetDocumentComplete(int,QCPixDocument*)));
+}
+
+SampleSearch::~SampleSearch()
+{
+ delete dataTable;
+ delete btnSearch;
+ delete txtSearch;
+ delete btnPrev;
+ delete btnNext;
+ delete rowLayout;
+ delete lbCaption;
+ delete iPageInfoLabel;
+ delete iSearchResultLabel;
+ delete txtSearchResultCount;
+ delete layoutForNavButton;
+ delete searchResultLayout;
+ delete rowButtonLayout;
+ delete rootLayout;
+
+ delete iSearchHandler;
+}
+
+void SampleSearch::searchCompleteHelper(int aError, int aResultCount)
+ {
+ txtSearchResultCount->setText(QString::number(aResultCount));
+ iSearchResultsCount = aResultCount;
+ noOfPages = (int)iSearchResultsCount/noOfItemsPerPage;
+ if((iSearchResultsCount%noOfItemsPerPage) >0)
+ {
+ noOfPages++;
+ }
+ }
+
+void SampleSearch::onAsyncSearchComplete(int aError, int aResultCount)
+ {
+ clearSearchResults();
+ searchCompleteHelper( aError, aResultCount );
+ setSearchResultsHeader();
+ currentRow = 0;
+ nextDocumentIndex = 0;
+ iSearchHandler->getDocumentAsyncAtIndex( nextDocumentIndex++ );
+ }
+
+void SampleSearch::onGetDocumentComplete(int aError, QCPixDocument* aDoc)
+ {
+ if( aDoc == NULL ) return;
+ addDocumentToResultsPage( aDoc, currentRow++ );
+ if( currentRow < noOfItemsPerPage )
+ iSearchHandler->getDocumentAsyncAtIndex( nextDocumentIndex++ );
+ }
+
+void SampleSearch::onSearchComplete(int aError, int aResultCount)
+ {
+ searchCompleteHelper( aError, aResultCount );
+ createSearchResultTableAndAddContents();
+ }
+
+void SampleSearch::doSearch()
+ {
+ clearSearchResults();
+ asyncSearch = false;
+ iSearchResultsCount=0;
+ iCurrentPageNum =0;
+ btnPrev->setEnabled(false);
+ if(iSearchHandler)
+ {
+ iSearchHandler->cancelLastSearch();
+ iSearchHandler->search(txtSearch->text());
+ }
+ }
+
+void SampleSearch::doSearchAsync()
+ {
+ clearSearchResults();
+ asyncSearch = true;
+ iSearchResultsCount=0;
+ iCurrentPageNum =0;
+ btnPrev->setEnabled(false);
+ if(iSearchHandler)
+ {
+ iSearchHandler->cancelLastSearch();
+ iSearchHandler->searchAsync( txtSearch->text() );
+ }
+ }
+
+void SampleSearch::clearSearchResults()
+ {
+ //Very Very Dirty hack!!!
+ rootLayout->removeWidget(dataTable);
+ int noOfRows = dataTable->rowCount();
+ for(int i=0; i<noOfRows;i++)
+ {
+ dataTable->removeRow(i);
+ }
+
+ delete dataTable;
+
+ dataTable = new QTableWidget();
+ dataTable->setColumnCount(3);
+ QStringList headings;
+ headings << tr("Class")
+ << tr("Doc Id")
+ << tr("Excerpt");
+ dataTable->setHorizontalHeaderLabels(headings);
+ rootLayout->addWidget(dataTable);
+ docInfo.clear(); //does this leak objects?
+ }
+
+void SampleSearch::displayNextPage()
+ {
+ if(iCurrentPageNum <noOfPages)
+ {
+ iCurrentPageNum++;
+ }
+ if(iCurrentPageNum==noOfPages-1)
+ {
+ btnNext->setEnabled(false);
+ btnPrev->setEnabled(true);
+ }
+ else
+ {
+ btnNext->setEnabled(true);
+ btnPrev->setEnabled(true);
+ }
+ if( !asyncSearch )
+ createSearchResultTableAndAddContents();
+ else
+ {
+ currentRow = 0;
+ clearSearchResults();
+ setSearchResultsHeader();
+ iSearchHandler->getDocumentAsyncAtIndex( nextDocumentIndex++ );
+ }
+ }
+
+void SampleSearch::displayPrevPage()
+ {
+ if(iCurrentPageNum >0)
+ {
+ iCurrentPageNum--;
+ }
+ if(iCurrentPageNum==0)
+ {
+ btnPrev->setEnabled(false);
+ btnNext->setEnabled(true);
+ }
+ else
+ {
+ btnPrev->setEnabled(true);
+ btnNext->setEnabled(true);
+ }
+ if( !asyncSearch )
+ createSearchResultTableAndAddContents();
+ else
+ {
+ currentRow = 0;
+ nextDocumentIndex = iCurrentPageNum*noOfItemsPerPage;
+ clearSearchResults();
+ setSearchResultsHeader();
+ iSearchHandler->getDocumentAsyncAtIndex( nextDocumentIndex++ );
+ }
+ }
+
+int SampleSearch::getStartIndexForPage()
+ {
+ return iCurrentPageNum*noOfItemsPerPage;
+ }
+
+void SampleSearch::setSearchResultsHeader()
+ {
+ QString strText;
+ strText.append("Displaying results for Page (");
+ strText.append(QString::number(iCurrentPageNum+1));
+ strText.append(" of ");
+ strText.append(QString::number(noOfPages));
+ strText.append(")");
+ iPageInfoLabel->setText(strText);
+ }
+
+void SampleSearch::createSearchResultTableAndAddContents()
+ {
+ clearSearchResults();
+ setSearchResultsHeader();
+ int startIndex = getStartIndexForPage();
+ int endIndex = startIndex + noOfItemsPerPage;
+ if(endIndex >iSearchResultsCount )
+ {
+ endIndex = iSearchResultsCount;
+ }
+ int rowCount=0;
+ for(int i =startIndex;i<endIndex;i++)
+ {
+ if(rowCount<noOfItemsPerPage)
+ {
+ QCPixDocument* aSearchDoc = iSearchHandler->getDocumentAtIndex(i);
+ addDocumentToResultsPage( aSearchDoc, rowCount );
+ rowCount++;
+ }
+ }
+ }
+
+//This class is first needed in the function below
+class DocLaunchInfo{
+public:
+ DocLaunchInfo(QString aType, QString aDocId)
+ :type(aType), docId(aDocId)
+ {}
+
+public:
+ QString type;
+ QString docId;
+};
+
+void SampleSearch::addDocumentToResultsPage( QCPixDocument* aSearchDoc, int rowCount )
+ {
+ QTableWidgetItem *appClassCol = new QTableWidgetItem("Col1");
+ appClassCol->setFlags(Qt::ItemIsEnabled);
+
+ QTableWidgetItem *docuidCol = new QTableWidgetItem("Col2");
+ docuidCol->setFlags(Qt::ItemIsEnabled);
+
+ QTableWidgetItem *excerptCol = new QTableWidgetItem("Col3");
+ excerptCol->setFlags(Qt::ItemIsEnabled);
+
+ dataTable->insertRow(rowCount);
+ connect( dataTable, SIGNAL( cellClicked(int,int) ), this, SLOT( launchDoc(int,int) ) );
+ dataTable->setItem(rowCount,0,appClassCol);
+ dataTable->setItem(rowCount,1,docuidCol);
+ dataTable->setItem(rowCount,2,excerptCol);
+
+ if(appClassCol)
+ {
+ appClassCol->setText( aSearchDoc->baseAppClass() );
+ }
+
+ if(docuidCol)
+ {
+ docuidCol->setText( aSearchDoc->docId() );
+ }
+
+ if(excerptCol)
+ {
+ excerptCol->setText( aSearchDoc->excerpt() );
+ }
+
+ docInfo.push_back( new DocLaunchInfo( aSearchDoc->baseAppClass(), aSearchDoc->docId() ) );
+ }
+
+void SampleSearch::doLaunchDoc(DocLaunchInfo& info)
+ {
+ //Instead of having these traps all over the place, we'll have it just here.
+ QT_TRAP_THROWING(/* Call all the symbian APIs here */);
+ if( info.type == "root calendar" ){
+ XQServiceRequest *snd = new XQServiceRequest("com.nokia.services.phonebookservices.Fetch", "open(int)",false);
+ *snd << info.docId.toInt();
+ snd->send();
+ }
+ else mBox.show();
+ }
+
+void SampleSearch::launchDoc(int row,int /*col*/)
+ {
+ doLaunchDoc( *docInfo[row] );
+ }