Статья базируется на материалах англоязычной части Wiki, все они перечислены в разделе ссылки.
Contents |
Адаптивный поиск - это совмещение возможностей сенсорного управления с существовавшим в предыдущих изданиях S60 интерфейсом CAknSearchField API. В данной статье мы рассмотрим пример работы с этим API.
RESOURCE LISTBOX r_list_box
{
flags = EAknListBoxSelectionList;
array_id= r_list_box_item_array;
}
RESOURCE ARRAY r_list_box_item_array
{
items =
{
LBUF { txt = "\tAlbert Eienstein\t";},
LBUF { txt = "\tAlbert Makinstosh\t";},
LBUF { txt = "\tVikram Sarabhai\t";},
LBUF { txt = "\tSarabhai Anand\t";}
};
}
...
...
#include <aknlists.h> // For List Box
#include <barsread.h> //For Resource Reader
#include <aknsfld.h> // For SearchField
...
// CLASS DECLARATION
class CAdaptiveSearchAppView : public CCoeControl, public MAdaptiveSearchTextObserver
{
....
....
//For listbox
void CreateListBoxL();
TInt CountComponentControls() const;
CCoeControl* ComponentControl(TInt aIndex) const;
TKeyResponse OfferKeyEventL(const TKeyEvent &aKeyEvent, TEventCode aType);
//From MAdaptiveSearchTextObserver
virtual void AdaptiveSearchTextChanged (CAknSearchField *aSearchField);
private:
CAknSingleStyleListBox* iListBox;
CAknSearchField* iSearchField;
.....
};
// -----------------------------------------------------------------------------
// CAdaptiveSearchAppView::ConstructL()
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CAdaptiveSearchAppView::ConstructL(const TRect& aRect)
{
// Создаем окно
CreateWindowL();
// Создаем списк (listbox) и заполняем его строками из ресурсов
CreateListBoxL();
// Устанавливаем размеры окна
SetRect(aRect);
// Активизируем окно
ActivateL();
}
void CAdaptiveSearchAppView::CreateListBoxL()
{
iListBox= new (ELeave) CAknSingleStyleListBox();
iListBox->SetContainerWindowL(*this);
TResourceReader rr;
iCoeEnv->CreateResourceReaderLC(rr, R_LIST_BOX);
iListBox->ConstructFromResourceL(rr);
iListBox->CreateScrollBarFrameL(ETrue);
iListBox->ScrollBarFrame()->SetScrollBarVisibilityL( CEikScrollBarFrame::EOn, CEikScrollBarFrame::EAuto );
CleanupStack::PopAndDestroy();//rr
// Создаем поле для поиска (SearchField) и включаем поддержку адаптивного поиска
iSearchField = CAknSearchField::NewL(*this, CAknSearchField::EAdaptive, NULL, 20);
STATIC_CAST(CAknFilteredTextListBoxModel*, iListBox->Model())->CreateFilterL(iListBox,iSearchField);
STATIC_CAST(CAknFilteredTextListBoxModel*, iListBox->Model())->Filter()->HandleOfferkeyEventL();
// Добавляем данный класс ("this") в качестве наблюдателя за событиями адаптивного поиска
iSearchField->AddAdaptiveSearchTextObserverL(this);
}
void CAdaptiveSearchAppView::AdaptiveSearchTextChanged(CAknSearchField* aSearchFiled)
{
TBuf<50> buffer;
aSearchFiled->GetSearchText(buffer);
// добавлено для предотвращения исчезновения поля поиска после закрытия сетки адаптивного поиска
SizeChanged();
DrawNow();
}
// -----------------------------------------------------------------------------
// CAdaptiveSearchAppView::SizeChanged()
// Вызывается системой в случае изменения размеров отображения.
// -----------------------------------------------------------------------------
//
void CAdaptiveSearchAppView::SizeChanged()
{
if (iListBox)
{
if (iSearchField)
{
CAknColumnListBox* aknListBox = STATIC_CAST(CAknColumnListBox*, iListBox);
AknFind::HandleFixedFindSizeChanged(this, aknListBox, iSearchField);
}
else
{
iListBox->SetRect(Rect()); // Устанавливаем прямоугольную область, занимаемую объектом iListBox.
}
}
}
TInt CAdaptiveSearchAppView::CountComponentControls() const
{
return 2; // возвращаем число компонентов в контейнере
}
CCoeControl* CAdaptiveSearchAppView::ComponentControl(TInt aIndex) const
{
switch ( aIndex )
{
case 0:
return iListBox;
break;
case 1:
return iSearchField;
break;
default:
return NULL;
}
}
// -----------------------------------------------------------------------------
// CAdaptiveSearchAppView::HandlePointerEventL()
// Вызывается фреймворком при получении событий от указателя (стилуса)
// -----------------------------------------------------------------------------
//
void CAdaptiveSearchAppView::HandlePointerEventL(
const TPointerEvent& aPointerEvent)
{
// Передаем событие от указателя в обработчик объекта iSearchField
iSearchField->HandlePointerEventL(aPointerEvent);
// Передаем событие базовому классу
CCoeControl::HandlePointerEventL(aPointerEvent);
}
TKeyResponse CAdaptiveSearchAppView::OfferKeyEventL(const TKeyEvent &aKeyEvent, TEventCode aType)
{
TKeyResponse ret = EKeyWasNotConsumed;
switch (aKeyEvent.iCode)
{
case EKeyDevice3:
break;
default:
if(iListBox)
{
if ( iSearchField )
{
TBool needRefresh( EFalse );
// Обрабатываем нажатие, фильтруем список
if ( AknFind::HandleFindOfferKeyEventL( aKeyEvent, aType, this,
iListBox, iSearchField,
EFalse,
needRefresh ) ==EKeyWasConsumed )
{
if ( needRefresh )
{
SizeChanged();
DrawNow();
}
return EKeyWasConsumed;
}
}
ret = iListBox->OfferKeyEventL(aKeyEvent, aType);
}
return ret;
}
}
// -----------------------------------------------------------------------------
// CAdaptiveSearchAppView::~CAdaptiveSearchAppView()
// Деструктор.
// -----------------------------------------------------------------------------
//
CAdaptiveSearchAppView::~CAdaptiveSearchAppView()
{
.....
.....
if(iSearchField)
{
iSearchField->RemoveAdaptiveSearchTextObserver(this);
delete iSearchField;
iSearchField = NULL;
}
if(iListBox)
{
delete iListBox;
iListBox = NULL;
}
}
// -----------------------------------------------------------------------------
// CAdaptiveSearchAppUi::ConstructL()
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CAdaptiveSearchAppUi::ConstructL()
{
// Initialise app UI with standard value.
BaseConstructL(CAknAppUi::EAknEnableSkin);
// Create view object
iAppView = CAdaptiveSearchAppView::NewL(ClientRect());
AddToStackL( iAppView ); // Добавляем отображение в стэк
....
....
....
}
// -----------------------------------------------------------------------------
// CAdaptiveSearchAppUi::~CAdaptiveSearchAppUi()
// Деструктор.
// -----------------------------------------------------------------------------
//
CAdaptiveSearchAppUi::~CAdaptiveSearchAppUi()
{
if (iAppView)
{
RemoveFromStack(iAppView); // Удаляем отображение из стэка
delete iAppView;
iAppView = NULL;
}
}
При подготовке статьи использованы следующие материалы: