author | Fionntina Carville <fionntinac@symbian.org> |
Mon, 15 Nov 2010 11:44:32 +0000 | |
branch | RCL_3 |
changeset 84 | 1dabaed15bcd |
parent 81 | c26cc2a7c548 |
permissions | -rw-r--r-- |
62 | 1 |
/* |
2 |
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). |
|
3 |
* All rights reserved. |
|
4 |
* This component and the accompanying materials are made available |
|
5 |
* under the terms of "Eclipse Public License v1.0" |
|
6 |
* which accompanies this distribution, and is available |
|
7 |
* at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
8 |
* |
|
9 |
* Initial Contributors: |
|
10 |
* Nokia Corporation - initial contribution. |
|
11 |
* |
|
12 |
* Contributors: |
|
13 |
* |
|
14 |
* Description: Easy dialing list box. |
|
15 |
* |
|
16 |
*/ |
|
17 |
||
18 |
||
19 |
// INCLUDE FILES |
|
20 |
||
21 |
#include "easydialinglistbox.h" |
|
22 |
#include "easydialinglistboxview.h" |
|
23 |
#include "easydialinglistboxitemdrawer.h" |
|
24 |
#include "easydialinglistboxdata.h" |
|
25 |
#include "easydialingpanics.h" |
|
26 |
#include "easydialingcontactdatamanager.h" |
|
27 |
#include "easydialingcrkeys.h" |
|
28 |
||
29 |
#include <easydialingpluginresources.rsg> |
|
30 |
||
31 |
#include <phoneappcommands.hrh> |
|
32 |
#include <phonebook2.mbg> |
|
33 |
#include <phonebook2ece.mbg> |
|
34 |
||
35 |
#include <ccappcommlauncherpluginrsc.rsg> |
|
36 |
||
37 |
#include <aknlongtapdetector.h> // Required for touch |
|
38 |
#include <AknsFrameBackgroundControlContext.h> |
|
39 |
||
40 |
#include <aknlayoutscalable_apps.cdl.h> |
|
41 |
#include <layoutmetadata.cdl.h> |
|
42 |
#include <gulicon.h> |
|
43 |
#include <centralrepository.h> |
|
44 |
#include <bautils.h> // for BaflUtils |
|
45 |
||
46 |
#include <aknlistloadertfx.h> |
|
47 |
#include <aknlistboxtfxinternal.h> |
|
48 |
#include <aknlistboxtfx.h> |
|
49 |
||
50 |
// EXTERNAL DATA STRUCTURES |
|
51 |
||
52 |
// EXTERNAL FUNCTION PROTOTYPES |
|
53 |
||
54 |
extern TRect ContactImageBoundingBox( const TRect& aItemRect ); |
|
55 |
extern TRect ActionMenuIconBoundingBox(const TRect& aItemRect); |
|
56 |
||
57 |
// CONSTANTS |
|
58 |
static const TInt KListBoxMarginWidth = 2; |
|
81
c26cc2a7c548
Revision: 201039
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
62
diff
changeset
|
59 |
static const TInt KMaxVisibleItemsPortrait = 3; |
c26cc2a7c548
Revision: 201039
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
62
diff
changeset
|
60 |
static const TInt KMaxVisibleItemsLandscape = 2; |
62 | 61 |
|
62 |
// MACROS |
|
63 |
||
64 |
// LOCAL CONSTANTS AND MACROS |
|
65 |
||
66 |
// MODULE DATA STRUCTURES |
|
67 |
||
68 |
// LOCAL FUNCTION PROTOTYPES |
|
69 |
||
70 |
// FORWARD DECLARATIONS |
|
71 |
||
72 |
||
73 |
/* |
|
74 |
* ============================================================================== |
|
75 |
* |
|
76 |
* |
|
77 |
* class CEasyDialingListBox |
|
78 |
* |
|
79 |
* |
|
80 |
* ============================================================================== |
|
81 |
*/ |
|
82 |
||
83 |
||
84 |
// ----------------------------------------------------------------------------- |
|
85 |
// CEasyDialingListBox |
|
86 |
// |
|
87 |
// ----------------------------------------------------------------------------- |
|
88 |
// |
|
89 |
CEasyDialingListBox::CEasyDialingListBox() : |
|
90 |
CEikFormattedCellListBox() |
|
91 |
{ |
|
92 |
} |
|
93 |
||
94 |
// ----------------------------------------------------------------------------- |
|
95 |
// ~CEasyDialingListBox |
|
96 |
// |
|
97 |
// ----------------------------------------------------------------------------- |
|
98 |
// |
|
99 |
CEasyDialingListBox::~CEasyDialingListBox() |
|
100 |
{ |
|
101 |
delete iBGContext; |
|
102 |
delete iLongTapDetector; |
|
103 |
} |
|
104 |
||
105 |
// ----------------------------------------------------------------------------- |
|
106 |
// ConstructL |
|
107 |
// |
|
108 |
// ----------------------------------------------------------------------------- |
|
109 |
// |
|
110 |
void CEasyDialingListBox::ConstructL( TInt aFlags, |
|
111 |
CEasyDialingContactDataManager* aContactDataManager ) |
|
112 |
{ |
|
113 |
CEikFormattedCellListBox::ConstructL( NULL, aFlags ); |
|
114 |
||
115 |
iLongTapDetector = CAknLongTapDetector::NewL( this ); |
|
116 |
||
117 |
CEasyDialingListBoxItemDrawer* drawer = static_cast<CEasyDialingListBoxItemDrawer*> (iItemDrawer); |
|
118 |
CEasyDialingListBoxData* data = drawer->EasyDialingCellData(); |
|
119 |
data->SetContactDataManager(aContactDataManager); |
|
120 |
data->SetEDLBXControl(this); |
|
121 |
||
122 |
iBGContext = CAknsFrameBackgroundControlContext::NewL( KAknsIIDQsnFrPopupSub, |
|
123 |
Rect(), Rect(), EFalse ); |
|
124 |
||
125 |
// ContactDataManager is accessed from SizeChanged. If list item size |
|
126 |
// changes -> thumbnail size changes |
|
127 |
iContactDataManager = aContactDataManager; |
|
128 |
||
129 |
drawer->SetColors(); |
|
130 |
||
131 |
CreateScrollBarFrameL( ETrue ); |
|
132 |
ScrollBarFrame()->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto ); |
|
133 |
} |
|
134 |
||
135 |
||
136 |
// ----------------------------------------------------------------------------- |
|
137 |
// MakeViewClassInstanceL |
|
138 |
// |
|
139 |
// ----------------------------------------------------------------------------- |
|
140 |
// |
|
141 |
CListBoxView* CEasyDialingListBox::MakeViewClassInstanceL() |
|
142 |
{ |
|
143 |
return (new ( ELeave ) CEasyDialingListBoxView); |
|
144 |
} |
|
145 |
||
146 |
||
147 |
// ----------------------------------------------------------------------------- |
|
148 |
// ItemDrawer |
|
149 |
// |
|
150 |
// ----------------------------------------------------------------------------- |
|
151 |
// |
|
152 |
CEasyDialingListBoxItemDrawer* CEasyDialingListBox::ItemDrawer() const |
|
153 |
{ |
|
154 |
return (CEasyDialingListBoxItemDrawer*) iItemDrawer; |
|
155 |
} |
|
156 |
||
157 |
||
158 |
// ----------------------------------------------------------------------------- |
|
159 |
// FocusChanged |
|
160 |
// |
|
161 |
// ----------------------------------------------------------------------------- |
|
162 |
// |
|
163 |
void CEasyDialingListBox::FocusChanged( TDrawNow aDrawNow ) |
|
164 |
{ |
|
165 |
if ( !IsFocused() ) |
|
166 |
{ |
|
167 |
CEasyDialingListBoxView* view = static_cast<CEasyDialingListBoxView*>( iView ); |
|
168 |
view->SetCurrentItemIndexToNone(); |
|
169 |
} |
|
170 |
CEikFormattedCellListBox::FocusChanged( aDrawNow ); |
|
171 |
} |
|
172 |
||
173 |
||
174 |
// ----------------------------------------------------------------------------- |
|
175 |
// CreateItemDrawerL |
|
176 |
// |
|
177 |
// ----------------------------------------------------------------------------- |
|
178 |
// |
|
179 |
void CEasyDialingListBox::CreateItemDrawerL() |
|
180 |
{ |
|
181 |
CEasyDialingListBoxData* celldata = CEasyDialingListBoxData::NewL( *iEikonEnv ); |
|
182 |
CleanupStack::PushL( celldata ); |
|
183 |
iItemDrawer = new(ELeave) CEasyDialingListBoxItemDrawer(Model(), iEikonEnv->NormalFont(), celldata); |
|
184 |
CleanupStack::Pop( celldata ); |
|
185 |
} |
|
186 |
||
187 |
||
188 |
// ----------------------------------------------------------------------------- |
|
189 |
// Draw |
|
190 |
// |
|
191 |
// ----------------------------------------------------------------------------- |
|
192 |
// |
|
193 |
void CEasyDialingListBox::Draw(const TRect& aRect) const |
|
194 |
{ |
|
195 |
MAknListBoxTfxInternal *transApi = CAknListLoader::TfxApiInternal( iItemDrawer->Gc() ); |
|
196 |
if ( transApi ) |
|
197 |
{ |
|
198 |
transApi->SetListType( MAknListBoxTfxInternal::EListBoxTypeMainPane ); |
|
199 |
transApi->BeginRedraw( MAknListBoxTfxInternal::EListView, this->Rect() ); |
|
200 |
} |
|
201 |
||
202 |
if (!iView->RedrawDisabled() ) |
|
203 |
{ |
|
204 |
TRect clientRect( Rect() ); |
|
205 |
TRect viewRect = iView->ViewRect(); |
|
206 |
||
207 |
if ( transApi ) |
|
208 |
{ |
|
209 |
transApi->StartDrawing( MAknListBoxTfxInternal::EListView ); |
|
210 |
} |
|
211 |
||
212 |
AknsDrawUtils::BackgroundBetweenRects( |
|
213 |
AknsUtils::SkinInstance(), |
|
214 |
iBGContext, |
|
215 |
this, |
|
216 |
*iItemDrawer->Gc(), |
|
217 |
clientRect, |
|
218 |
viewRect ); |
|
219 |
||
220 |
if ( transApi ) |
|
221 |
{ |
|
222 |
transApi->StopDrawing(); |
|
223 |
} |
|
224 |
} |
|
225 |
||
226 |
if ( iModel->NumberOfItems() ) |
|
227 |
{ |
|
228 |
// Draw the actual list |
|
229 |
iView->Draw(&aRect); |
|
230 |
} |
|
231 |
if ( transApi ) |
|
232 |
{ |
|
233 |
transApi->EndViewRedraw( aRect ); |
|
234 |
} |
|
235 |
} |
|
236 |
||
237 |
||
238 |
// ----------------------------------------------------------------------------- |
|
239 |
// HandleResourceChange |
|
240 |
// |
|
241 |
// ----------------------------------------------------------------------------- |
|
242 |
// |
|
243 |
void CEasyDialingListBox::HandleResourceChange(TInt aType) |
|
244 |
{ |
|
245 |
CEikFormattedCellListBox::HandleResourceChange( aType ); |
|
246 |
iSBFrame->VerticalScrollBar()->HandleResourceChange( aType ); |
|
247 |
iSBFrame->DrawScrollBarsNow(); |
|
248 |
ItemDrawer()->SetColors(); |
|
249 |
||
250 |
// Base call to HandleResourceChange justifies the list to even items |
|
251 |
// on the top. This causes problems when listbox height is not a multiple of |
|
252 |
// listitem heights. Fix scrolling manually for these cases. |
|
253 |
TRAP_IGNORE( HandleItemAdditionL() ); // needed to prevent drawing problems |
|
254 |
TInt scrollIndex = ( IsFocused() ? CurrentItemIndex() : iNumberOfNames - 1 ); |
|
255 |
ScrollToMakeItemVisible( scrollIndex ); |
|
256 |
||
257 |
DrawDeferred(); |
|
258 |
} |
|
259 |
||
260 |
||
261 |
// ----------------------------------------------------------------------------- |
|
262 |
// SizeChanged |
|
263 |
// |
|
264 |
// ----------------------------------------------------------------------------- |
|
265 |
// |
|
266 |
void CEasyDialingListBox::SizeChanged() |
|
267 |
{ |
|
268 |
// Note that within this call view rect is adjusted to fit into TGulBorder |
|
269 |
// that could have been given in construction. It's not used by ED listbox. |
|
270 |
// The view rect is not correct for ED after this call but it's |
|
271 |
// calculated and set below. |
|
272 |
CEikFormattedCellListBox::SizeChanged(); |
|
273 |
||
274 |
TRect parentRect = Rect(); |
|
275 |
||
276 |
// Set the listbox colors. |
|
277 |
// For some reason, calling this in HandleResourceChange is not enough, it does |
|
278 |
// not get called in situation it should. |
|
279 |
ItemDrawer()->SetColors(); |
|
280 |
||
281 |
// Get all the layout rects |
|
282 |
TAknLayoutRect rect; |
|
283 |
TInt variety = ( Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0 ); |
|
284 |
||
285 |
TAknWindowComponentLayout viewLayout( AknLayoutScalable_Apps::dia3_list_pane( variety ) ); |
|
286 |
rect.LayoutRect(parentRect, viewLayout ); |
|
287 |
TRect viewRect( rect.Rect() ); |
|
288 |
// Add a bit of margin around the view as layout doesn't define any |
|
289 |
viewRect.Shrink( KListBoxMarginWidth, KListBoxMarginWidth ); |
|
290 |
||
291 |
TAknWindowComponentLayout scrollBarLayout( AknLayoutScalable_Apps::scroll_pane_cp12() ); |
|
292 |
rect.LayoutRect( parentRect, scrollBarLayout ); |
|
293 |
TRect scrollBarRect( rect.Rect() ); |
|
294 |
||
295 |
TRect viewAndScrollBarRect( viewRect ); |
|
296 |
if ( AknLayoutUtils::LayoutMirrored() ) |
|
297 |
{ |
|
298 |
viewAndScrollBarRect.iTl.iX = scrollBarRect.iTl.iX + KListBoxMarginWidth; |
|
299 |
} |
|
300 |
else |
|
301 |
{ |
|
302 |
viewAndScrollBarRect.iBr.iX = scrollBarRect.iBr.iX - KListBoxMarginWidth; |
|
303 |
} |
|
304 |
||
305 |
// If scrollbar is not needed, then we can use all the space for the list view |
|
306 |
if ( GetHeightBasedOnNumberOfItems( iNumberOfNames ) <= parentRect.Height() ) |
|
307 |
{ |
|
308 |
viewRect = viewAndScrollBarRect; |
|
309 |
scrollBarRect.SetWidth( 0 ); |
|
310 |
} |
|
311 |
||
312 |
// Must use this method so that all eiklistbox's internal variables are |
|
313 |
// set and updated according to this viewRect. This call would |
|
314 |
// add list margins but no such are defined in layouts so view's rect is |
|
315 |
// set to viewRect calculated here. |
|
316 |
SetViewRectFromClientRect( viewRect ); |
|
317 |
||
318 |
// Set scroll bar rect |
|
319 |
if ( iSBFrame ) |
|
320 |
{ |
|
321 |
CAknDoubleSpanScrollBar* scrollbar = static_cast <CAknDoubleSpanScrollBar*>( iSBFrame->VerticalScrollBar() ); |
|
322 |
scrollbar->SetFixedLayoutRect( scrollBarRect ); |
|
323 |
scrollbar->SetRect( scrollBarRect ); |
|
324 |
scrollbar->MakeVisible( scrollBarRect.Width() != 0 ); |
|
325 |
} |
|
326 |
||
327 |
iBGContext->SetFrameRects( parentRect, viewAndScrollBarRect ); |
|
328 |
||
329 |
TRAP_IGNORE( CEikFormattedCellListBox::HandleViewRectSizeChangeL() ); |
|
330 |
} |
|
331 |
||
332 |
||
333 |
// ----------------------------------------------------------------------------- |
|
334 |
// MopSupplyObject |
|
335 |
// |
|
336 |
// ----------------------------------------------------------------------------- |
|
337 |
// |
|
338 |
TTypeUid::Ptr CEasyDialingListBox::MopSupplyObject( TTypeUid aId ) |
|
339 |
{ |
|
340 |
if ( aId.iUid == MAknsControlContext::ETypeId && iBGContext ) |
|
341 |
{ |
|
342 |
return MAknsControlContext::SupplyMopObject( aId, iBGContext ); |
|
343 |
} |
|
344 |
return CEikFormattedCellListBox::MopSupplyObject( aId ); |
|
345 |
} |
|
346 |
||
347 |
// ----------------------------------------------------------------------------- |
|
348 |
// MakeVisible |
|
349 |
// |
|
350 |
// ----------------------------------------------------------------------------- |
|
351 |
// |
|
352 |
void CEasyDialingListBox::MakeVisible( TBool aVisible ) |
|
353 |
{ |
|
354 |
if ( aVisible != IsVisible() ) |
|
355 |
{ |
|
356 |
CEikFormattedCellListBox::MakeVisible( aVisible ); |
|
357 |
if ( iSBFrame ) |
|
358 |
{ |
|
359 |
CEikScrollBar* sb = iSBFrame->GetScrollBarHandle( CEikScrollBar::EVertical ); |
|
360 |
if ( sb ) |
|
361 |
{ |
|
362 |
sb->MakeVisible( aVisible ); |
|
363 |
if ( aVisible ) |
|
364 |
{ |
|
365 |
UpdateScrollBarThumbs(); |
|
366 |
} |
|
367 |
} |
|
368 |
} |
|
369 |
} |
|
370 |
} |
|
371 |
||
372 |
// ----------------------------------------------------------------------------- |
|
373 |
// SetMaxRect |
|
374 |
// |
|
375 |
// ----------------------------------------------------------------------------- |
|
376 |
// |
|
377 |
void CEasyDialingListBox::SetMaxRect( TRect aMaxRect ) |
|
378 |
{ |
|
379 |
iMaxRect = aMaxRect; |
|
380 |
||
381 |
// Update the list item size according the maximum view rect size |
|
382 |
TInt variety = ( Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0 ); |
|
383 |
TAknLayoutRect maxViewLayout; |
|
384 |
maxViewLayout.LayoutRect( aMaxRect, AknLayoutScalable_Apps::dia3_list_pane( variety ) ); |
|
385 |
TRect maxViewRect( maxViewLayout.Rect() ); |
|
386 |
maxViewRect.Shrink( KListBoxMarginWidth, KListBoxMarginWidth ); // layout data doens't include any margins but we have added some |
|
387 |
||
81
c26cc2a7c548
Revision: 201039
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
62
diff
changeset
|
388 |
TInt maxItemsShown = ( variety ? KMaxVisibleItemsLandscape : KMaxVisibleItemsPortrait ); |
62 | 389 |
TInt itemHeight = maxViewRect.Height() / maxItemsShown; |
390 |
TRAP_IGNORE( SetItemHeightL( itemHeight ) ); |
|
391 |
||
392 |
// Calculate new thumbnail rect from item size |
|
393 |
TSize itemSize( maxViewRect.Width(), itemHeight ); |
|
394 |
TRect thumbnailRect = ContactImageBoundingBox( itemSize ); |
|
395 |
iContactDataManager->SetThumbnailSize( thumbnailRect.Size() ); // reloads thumbnails if the new size is different from old one |
|
396 |
||
397 |
// Inform listbox data class about changed list item size |
|
398 |
ItemDrawer()->EasyDialingCellData()->HandleItemSizeChange(); |
|
399 |
} |
|
400 |
||
401 |
// ----------------------------------------------------------------------------- |
|
402 |
// SetRectToNumberOfItems |
|
403 |
// ----------------------------------------------------------------------------- |
|
404 |
// |
|
405 |
void CEasyDialingListBox::SetRectToNumberOfItems( TInt aNumberOfNames ) |
|
406 |
{ |
|
407 |
iNumberOfNames = aNumberOfNames; |
|
408 |
||
409 |
TRect listboxRect( iMaxRect ); |
|
410 |
||
411 |
// Make listbox smaller if maximum size is not needed to show |
|
412 |
// all list items. |
|
413 |
TInt requiredHeight = GetHeightBasedOnNumberOfItems( iNumberOfNames ); |
|
414 |
if ( requiredHeight < listboxRect.Height() ) |
|
415 |
{ |
|
416 |
// Shrink rect height so that bottom of the rect doesn't move |
|
417 |
listboxRect.iTl.iY += ( listboxRect.Height() - requiredHeight ); |
|
418 |
} |
|
419 |
||
420 |
SetRect( listboxRect ); |
|
421 |
} |
|
422 |
||
423 |
||
424 |
// ----------------------------------------------------------------------------- |
|
425 |
// SetFocusedWithKeyEventL |
|
426 |
// ----------------------------------------------------------------------------- |
|
427 |
// |
|
428 |
TKeyResponse CEasyDialingListBox::SetFocusedWithKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType ) |
|
429 |
{ |
|
430 |
TKeyResponse keyResponse = EKeyWasNotConsumed; |
|
431 |
TInt keyCode = aKeyEvent.iCode; |
|
432 |
||
433 |
// Disable redrawing temporarily. |
|
434 |
// This is because OfferKeyEventL puts the focus to the wrong item, |
|
435 |
// and we don't want to show it flashing there. |
|
436 |
// Make sure that no leave happens before redraw is enabled again. |
|
437 |
iView->SetDisableRedraw( ETrue ); |
|
438 |
||
439 |
TRAP_IGNORE( keyResponse = OfferKeyEventL( aKeyEvent, aType ) ); |
|
440 |
||
441 |
TInt itemToFocus = ( keyCode == EKeyUpArrow ? iNumberOfNames - 1 : 0 ); |
|
442 |
ScrollToMakeItemVisible( itemToFocus ); |
|
443 |
SetCurrentItemIndex( itemToFocus ); |
|
444 |
||
445 |
iView->SetDisableRedraw( EFalse ); |
|
446 |
||
447 |
DrawDeferred(); |
|
448 |
||
449 |
return keyResponse; |
|
450 |
} |
|
451 |
||
452 |
||
453 |
// ----------------------------------------------------------------------------- |
|
454 |
// GetHeightBasedOnNumberOfItems |
|
455 |
// |
|
456 |
// ----------------------------------------------------------------------------- |
|
457 |
// |
|
458 |
TInt CEasyDialingListBox::GetHeightBasedOnNumberOfItems( TInt aNum ) const |
|
459 |
{ |
|
460 |
return ( ItemHeight()*aNum + KListBoxMarginWidth*2 ); |
|
461 |
} |
|
462 |
||
463 |
||
464 |
// ----------------------------------------------------------------------------- |
|
465 |
// CurrentContactDataIndex |
|
466 |
// |
|
467 |
// ----------------------------------------------------------------------------- |
|
468 |
// |
|
469 |
TInt CEasyDialingListBox::CurrentContactDataIndex() |
|
470 |
{ |
|
471 |
if ( CurrentItemIndex() >= 0 ) |
|
472 |
{ |
|
473 |
TPtrC itemText = Model()->ItemText( CurrentItemIndex() ); |
|
474 |
TPtrC indexText; |
|
475 |
||
476 |
TInt error = TextUtils::ColumnText( indexText , 0, &itemText ); |
|
477 |
__ASSERT_DEBUG( error == KErrNone, EasyDialingPanic( EEasyDialingPanicInvalidListBoxModelString ) ); |
|
478 |
||
479 |
TUint id( 0 ); |
|
480 |
TLex lex( indexText ); |
|
481 |
error = lex.Val( id, EHex ); |
|
482 |
__ASSERT_DEBUG( error == KErrNone, EasyDialingPanic( EEasyDialingPanicInvalidListBoxModelString ) ); |
|
483 |
||
484 |
return id; |
|
485 |
} |
|
486 |
else |
|
487 |
{ |
|
488 |
return KErrNotFound; |
|
489 |
} |
|
490 |
} |
|
491 |
||
492 |
||
493 |
// ----------------------------------------------------------------------------- |
|
494 |
// CurrentContactLinkL |
|
495 |
// |
|
496 |
// ----------------------------------------------------------------------------- |
|
497 |
// |
|
498 |
HBufC8* CEasyDialingListBox::CurrentContactLinkL() |
|
499 |
{ |
|
500 |
TInt index = CurrentContactDataIndex(); |
|
501 |
if ( index >= 0 ) |
|
502 |
{ |
|
503 |
HBufC8* packedContact = iContactDataManager->ContactLinkLC( index ); |
|
504 |
CleanupStack::Pop( packedContact ); |
|
505 |
return packedContact; |
|
506 |
} |
|
507 |
else |
|
508 |
{ |
|
509 |
return NULL; |
|
510 |
} |
|
511 |
} |
|
512 |
||
513 |
||
514 |
// ----------------------------------------------------------------------------- |
|
515 |
// HandleLongTapEventL |
|
516 |
// Callback from CAknLongTapDetector. |
|
517 |
// ----------------------------------------------------------------------------- |
|
518 |
// |
|
519 |
void CEasyDialingListBox::HandleLongTapEventL( const TPoint& /*aPenEventLocation*/, |
|
520 |
const TPoint& /*aPenEventScreenLocation*/ ) |
|
521 |
{ |
|
522 |
ReportListBoxEventL( static_cast<MEikListBoxObserver::TListBoxEvent> |
|
523 |
( KEasyDialingContactLongTapped ) ); |
|
524 |
iPointerLongPressHandled = ETrue; |
|
525 |
||
526 |
TPointerEvent simulatedButtonUpEvent( TPointerEvent::EButton1Up, 0, |
|
527 |
TPoint(), TPoint() ); |
|
528 |
TRAP_IGNORE( CEikFormattedCellListBox::HandlePointerEventL( simulatedButtonUpEvent ) ); |
|
529 |
} |
|
530 |
||
531 |
||
532 |
// ----------------------------------------------------------------------------- |
|
533 |
// HandlePointerEventL |
|
534 |
// Pointer event handling within the EasyDialingListBox. |
|
535 |
// ----------------------------------------------------------------------------- |
|
536 |
// |
|
537 |
void CEasyDialingListBox::HandlePointerEventL(const TPointerEvent& aPointerEvent) |
|
538 |
{ |
|
539 |
// Button down event starts new pointer press. Reset flags at this point. |
|
540 |
if ( aPointerEvent.iType == TPointerEvent::EButton1Down ) |
|
541 |
{ |
|
542 |
iPointerLongPressHandled = EFalse; |
|
543 |
} |
|
544 |
||
545 |
// check if pointer event is over item |
|
546 |
TInt itemIndex( KErrNotFound ); |
|
547 |
TPoint pointerPos( aPointerEvent.iPosition ); |
|
548 |
TBool pointerIsOverAnItem = iView->XYPosToItemIndex( pointerPos, itemIndex ); |
|
549 |
||
550 |
// long tap is started only if pointer is over an actual item |
|
551 |
// (not over margin or other empty listbox area) |
|
552 |
if ( pointerIsOverAnItem || aPointerEvent.iType != TPointerEvent::EButton1Down ) |
|
553 |
{ |
|
554 |
iLongTapDetector->PointerEventL(aPointerEvent); |
|
555 |
} |
|
556 |
||
557 |
if ( iPointerLongPressHandled ) |
|
558 |
{ |
|
559 |
// No further handling is made after long tap on list item |
|
560 |
// has been detected. |
|
561 |
return; |
|
562 |
} |
|
563 |
||
564 |
CEikFormattedCellListBox::HandlePointerEventL( aPointerEvent ); |
|
565 |
} |
|
566 |
||
567 |
||
568 |
// ----------------------------------------------------------------------------- |
|
569 |
// HandleScrollEventL |
|
570 |
// If the EasyDialingListBox is scrolled by dragging the Scroll bar, this |
|
571 |
// observer function is called |
|
572 |
// ----------------------------------------------------------------------------- |
|
573 |
// |
|
574 |
void CEasyDialingListBox::HandleScrollEventL( CEikScrollBar* aScrollBar, TEikScrollEvent aEventType ) |
|
575 |
{ |
|
576 |
// Report scrolling to the listbox observer |
|
577 |
TInt scrollEvent( KErrNotFound ); |
|
578 |
switch ( aEventType ) |
|
579 |
{ |
|
580 |
case EEikScrollThumbDragVert: |
|
581 |
scrollEvent = KEasyDialingScrollingStarted; |
|
582 |
break; |
|
583 |
||
584 |
case EEikScrollThumbReleaseVert: |
|
585 |
case EEikScrollUp: |
|
586 |
case EEikScrollDown: |
|
587 |
case EEikScrollPageUp: |
|
588 |
case EEikScrollPageDown: |
|
589 |
scrollEvent = KEasyDialingScrollingStopped; |
|
590 |
break; |
|
591 |
||
592 |
default: |
|
593 |
break; |
|
594 |
} |
|
595 |
||
596 |
if ( scrollEvent != KErrNotFound ) |
|
597 |
{ |
|
598 |
ReportListBoxEventL( static_cast<MEikListBoxObserver::TListBoxEvent>( scrollEvent ) ); |
|
599 |
} |
|
600 |
||
601 |
// Base class(es) might be also interested about the scrollbar events |
|
602 |
CEikFormattedCellListBox::HandleScrollEventL( aScrollBar, aEventType ); |
|
603 |
} |
|
604 |
||
605 |
// end of file |
|
606 |