comparison g23m/condat/ms/src/mfw/mfw_mnu.c @ 0:509db1a7b7b8

initial import: leo2moko-r1
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 01 Jun 2015 03:24:05 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:509db1a7b7b8
1 /*
2 +--------------------------------------------------------------------+
3 | PROJECT: MMI-Framework (8417) $Workfile:: mfw_mnu.c $|
4 | $Author:: Kk $ CONDAT GmbH $Revision:: 18 $|
5 | CREATED: 24.11.98 $Modtime:: 24.02.00 8:07 $|
6 | STATE : code |
7 +--------------------------------------------------------------------+
8
9 MODULE : MFW_MNU
10
11 PURPOSE : menu handling functions
12
13 EXPORT :
14
15 TO DO :
16
17 $History:: mfw_mnu.c $
18
19 Shashi Shekar B.S., a0876501, 16 Mar, 2006, OMAPS00061462
20 Icon support for SetupMenu & Select item.
21
22 *
23 * ************************************************
24 * User: xreddymn Date: Sep-30-2005
25 * Updated in $/GSM/Condat/MS/SRC/MFW
26 * Added header display for menus on monochrome
27 * screens for MMI-SPR-33781
28 *
29 * ************************************************
30 * User: xreddymn Date: Dec-16-2004
31 * Updated in $/GSM/Condat/MS/SRC/MFW
32 * Added double line display for MFW list menu items
33 *
34 * ***************** Version 18 *****************
35 * User: Kk Date: 28.02.00 Time: 10:33
36 * Updated in $/GSM/Condat/MS/SRC/MFW
37 * font usage corrected for page and list menus. free menus still
38 * need rework.
39 *
40 * ***************** Version 17 *****************
41 * User: Es Date: 17.01.00 Time: 17:37
42 * Updated in $/GSM/Condat/MS/SRC/MFW
43 * menu mode handling bug (uses only first level settings)
44 |
45 | ***************** Version 16 *****************
46 | User: Le Date: 6.01.00 Time: 9:23
47 | Updated in $/GSM/Condat/MS/SRC/MFW
48 | Alignment of MFW versions
49 *
50 * ***************** Version 2 *****************
51 * User: Es Date: 22.11.99 Time: 10:29
52 * Updated in $/GSM/Condat/SND-MMI/MFW
53 *
54 * ***************** Version 1 *****************
55 * User: Es Date: 18.11.99 Time: 16:35
56 * Created in $/GSM/Condat/SND-MMI/MFW
57 * Initial
58 */
59
60 #include <stdio.h>
61 #include <string.h>
62
63 #define ENTITY_MFW
64
65 #if defined (NEW_FRAME)
66
67 #include "typedefs.h"
68 #include "vsi.h"
69 #include "custom.h"
70 #include "gsm.h"
71
72 #else
73
74 #include "STDDEFS.H"
75 #include "custom.h"
76 #include "gsm.h"
77 #include "vsi.h"
78
79 #endif
80
81 #include "mfw_sys.h"
82 #include "mfw_mfw.h"
83 #include "mfw_kbd.h"
84 #include "gdi.h"
85 #include "dspl.h"
86 #include "mfw_lng.h"
87 /* SPR#1428 - SH - New Editor changes */
88 #ifndef NEW_EDITOR
89 #include "mfw_edt.h"
90 #endif
91 #include "mfw_icn.h"
92 #include "mfw_mnu.h"
93
94
95 #include "message.h"
96 #include "prim.h"
97 #include "aci_cmh.h"
98
99 #include "mfw_mmi.h"
100 static int menuIsEmpty (MfwMnu *m, MfwMnuAttr *ma);
101 static int countVisible (MfwMnu *m, MfwMnuAttr *ma, int start);
102 static void drawPageMenu (MfwMnu *mnu);
103 static void drawListMenu (MfwMnu *m);
104 static void drawFreeMenu (MfwMnu *m);
105 static int mnuCommand (U32 cmd, void *h);
106
107 #define TIME_TRACE_EVENT
108
109 /*
110 +--------------------------------------------------------------------+
111 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
112 | STATE : code ROUTINE : mnuInit |
113 +--------------------------------------------------------------------+
114
115 PURPOSE : initialize menu handler
116
117 */
118
119 MfwRes mnuInit (void)
120 {
121 mfwCommand[MfwTypMnu] = (MfwCb) mnuCommand;
122
123 return MfwResOk;
124 }
125
126
127 /*
128 +--------------------------------------------------------------------+
129 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
130 | STATE : code ROUTINE : mnuExit |
131 +--------------------------------------------------------------------+
132
133 PURPOSE : finalize menu handler
134
135 */
136
137 MfwRes mnuExit (void)
138 {
139 mfwCommand[MfwTypMnu] = 0;
140
141 return MfwResOk;
142 }
143
144
145 /*
146 +--------------------------------------------------------------------+
147 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
148 | STATE : code ROUTINE : mnuCreate |
149 +--------------------------------------------------------------------+
150
151 PURPOSE : create menu control
152 GW 05/10/01 - Changed single value 'lng' to 2 values indicating if ID's should be
153 used (useStrID) and if the strings are ascii or unicode (uesDefLang).
154
155 */
156
157 MfwHnd mnuCreate (MfwHnd w, MfwMnuAttr *a, MfwEvt e, MfwCb f)
158 {
159 MfwHdr *hdr = (MfwHdr *) mfwAlloc(sizeof(MfwHdr));
160 MfwMnu *mnu = (MfwMnu *) mfwAlloc(sizeof(MfwMnu));
161 MfwHdr *insert_status =0;
162
163 if (!hdr || !mnu)
164 {
165 TRACE_ERROR("ERROR: mnuCreate() Mem Alloc Failed.");
166
167 if(hdr)
168 mfwFree((U8*)hdr,sizeof(MfwHdr));
169 if(mnu)
170 mfwFree((U8*)mnu,sizeof(MfwMnu));
171
172 return 0;
173 }
174
175 mnu->mask = e;
176 mnu->flags = 0;
177 mnu->handler = f;
178 mnu->attr = a;
179 mnu->curAttr = a;
180
181 mnu->useStrID = 0;
182 mnu->useDefLang = 0;
183 /* SPR#1983 - SH - Stores character type, ASCII/UNICODE */
184 mnu->textDCS = MNU_LIST_LANGUAGE_DEFAULT;
185 mnu->level = 0;
186 memset(mnu->lCursor,UNUSED,sizeof(mnu->lCursor));
187 memset(mnu->lShift,1,sizeof(mnu->lShift));
188 mnu->lCursor[0] = 0;
189 mnu->scrollMode = 1;
190 hdr->data = mnu;
191 hdr->type = MfwTypMnu;
192
193 insert_status = mfwInsert(w,hdr);
194 if(!insert_status)
195 {
196 TRACE_ERROR("ERROR: mnuCreate() Failed to Install Handler. ");
197 mfwFree((U8*)hdr,sizeof(MfwHdr));
198 mfwFree((U8*)mnu ,sizeof(MfwMnu));
199 return 0;
200 }
201 return insert_status;
202 }
203
204
205 /*
206 +--------------------------------------------------------------------+
207 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
208 | STATE : code ROUTINE : mnuDelete |
209 +--------------------------------------------------------------------+
210
211 PURPOSE : delete menu control
212
213 */
214
215 MfwRes mnuDelete (MfwHnd m)
216 {
217 MfwRes res;
218
219 if (!m)
220 return MfwResIllHnd;
221
222 mnuHide(m);
223 res = (mfwRemove(m)) ? MfwResOk : MfwResIllHnd;
224
225 mfwFree(((MfwHdr *) m)->data,sizeof(MfwMnu));
226 mfwFree(m,sizeof(MfwHdr));
227
228 return res;
229 }
230
231
232 /*
233 +--------------------------------------------------------------------+
234 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
235 | STATE : code ROUTINE : mnuLang |
236 +--------------------------------------------------------------------+
237
238 PURPOSE : set / get whether the string is associated with an ID or if it is null-terminated
239
240 GW 05/10/01 - Changed single value 'lng' to 2 values indicating if ID's should be
241 used (useStrID) and if the strings are ascii or unicode (uesDefLang).
242 */
243
244 MfwHnd mnuLang (MfwHnd m, MfwHnd l)
245 {
246 MfwHnd ol;
247 MfwMnu *mnu;
248
249 if( (mnu = mfwControl(m)) == 0)
250 return (MfwHnd) MfwResIllHnd;
251
252 ol = mnu->useStrID;
253 mnu->useStrID = l;
254 mnu->useDefLang = l;
255
256 /* SPR#1983 - SH - Set character type appropriately */
257 if (l)
258 {
259 mnu->textDCS = MNU_LIST_LANGUAGE_DEFAULT;
260 }
261 else
262 {
263 mnu->textDCS = MNU_LIST_LANGUAGE_ASCII;
264 }
265
266 return ol;
267 }
268
269 /*
270 +--------------------------------------------------------------------+
271 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
272 | STATE : code ROUTINE : mnuStrType |
273 +--------------------------------------------------------------------+
274
275 PURPOSE : set / get language in use (1=use default ascii/unicode, 0=assume ascii)
276
277 GW 05/10/01 - Changed single value 'lng' to 2 values indicating if ID's should be
278 used (useStrID) and if the strings are ascii or unicode (uesDefLang).
279 */
280 MfwHnd mnuStrType (MfwHnd m, MfwHnd l)
281 {
282 MfwHnd ol;
283 MfwMnu *mnu;
284
285 if( (mnu = mfwControl(m)) == 0)
286 return (MfwHnd) MfwResIllHnd;
287
288 ol = mnu->useDefLang;
289 mnu->useDefLang = l;
290
291 /* SPR#1983 - SH - Set character type appropriately*/
292 if (l)
293 {
294 mnu->textDCS = MNU_LIST_LANGUAGE_UNICODE;
295 }
296 else
297 {
298 mnu->textDCS = MNU_LIST_LANGUAGE_DEFAULT;
299 }
300
301 return ol;
302 }
303
304
305 /*
306 +--------------------------------------------------------------------+
307 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
308 | STATE : code ROUTINE : mnuDCSType |
309 +--------------------------------------------------------------------+
310
311 PURPOSE : SPR#1983 - SH - Added.
312 Set the character type of the menu text
313 */
314
315 UBYTE mnuDCSType (MfwHnd m, UBYTE listLanguageType)
316 {
317 UBYTE ol;
318 MfwMnu *mnu;
319
320 if( (mnu = mfwControl(m)) == 0)
321 return NULL;
322
323 ol = mnu->textDCS;
324 mnu->textDCS = listLanguageType;
325
326 return ol;
327 }
328
329
330
331 /*
332 +--------------------------------------------------------------------+
333 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
334 | STATE : code ROUTINE : mnuShow |
335 +--------------------------------------------------------------------+
336
337 PURPOSE : show menu
338
339 */
340
341 MfwRes mnuShow (MfwHnd m)
342 {
343 MfwMnu *mnu;
344
345 if( (mnu = mfwControl(m)) == 0)
346 return MfwResIllHnd;
347
348 mnu->flags |= E_MNU_VISIBLE;
349 mnuUpdate(mnu);
350
351 return MfwResOk;
352 }
353
354
355 /*
356 +--------------------------------------------------------------------+
357 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
358 | STATE : code ROUTINE : mnuHide |
359 +--------------------------------------------------------------------+
360
361 PURPOSE : hide menu
362
363 */
364
365 MfwRes mnuHide (MfwHnd m)
366 {
367 MfwMnu *mnu;
368 // U8 dsplOld; // RAVI
369
370 if ((mnu = mfwControl(m)) == 0)
371 return MfwResIllHnd;
372
373 mnu->flags &= ~E_MNU_VISIBLE;
374 if (mnu->handler)
375 if (mnu->mask & E_MNU_VISIBLE)
376 mnu->handler(E_MNU_VISIBLE,mnu);
377
378 return MfwResOk;
379 }
380
381
382 /*
383 +--------------------------------------------------------------------+
384 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
385 | STATE : code ROUTINE : mnuUnhide |
386 +--------------------------------------------------------------------+
387
388 PURPOSE : unhide menu (without drawing)
389
390 */
391
392 MfwRes mnuUnhide (MfwHnd m)
393 {
394 MfwMnu *mnu;
395 // U8 dsplOld; // RAVI
396
397 if ((mnu = mfwControl(m)) == 0)
398 return MfwResIllHnd;
399
400 mnu->flags |= E_MNU_VISIBLE;
401 if (mnu->handler)
402 if (mnu->mask & E_MNU_VISIBLE)
403 mnu->handler(E_MNU_VISIBLE,mnu);
404 return MfwResOk;
405 }
406
407
408 /*
409 +--------------------------------------------------------------------+
410 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
411 | STATE : code ROUTINE : mnuUpdate |
412 +--------------------------------------------------------------------+
413
414 PURPOSE : draw menu
415
416 */
417
418 MfwRes mnuUpdate (MfwMnu *m)
419 {
420
421 // U8 dsplOld; // RAVI
422
423
424 if (!m)
425 return MfwResIllHnd;
426 if (!(m->flags & E_MNU_VISIBLE))
427 return MfwResOk;
428
429 if (m->handler)
430 if (m->mask & E_MNU_VISIBLE)
431 m->handler(E_MNU_VISIBLE,m);
432
433 /*JVJE Update to fit the menu to a visible item */
434 {
435 MfwMnuAttr *ma = m->curAttr;
436 int index= m->lCursor[m->level];
437 // int iloop; // RAVI
438 U16 retVal;
439
440 if (ma->items[index].flagFunc)
441 retVal = ma->items[index].flagFunc(m,ma,&(ma->items[index]));
442 else
443 retVal = 0;
444
445 while (retVal & MNU_ITEM_HIDE)
446 {
447 index++;
448 if (index>=ma->nItems)
449 index =0;
450
451 if (ma->items[index].flagFunc)
452 retVal = ma->items[index].flagFunc(m,ma,&(ma->items[index]));
453 else
454 retVal = 0;
455
456 }
457 m->lCursor[m->level]=index;
458 }
459
460 if ((m->curAttr->mode & MNU_DISPLAY) == MNU_OVERLAPPED)
461 drawFreeMenu(m);
462 else if ((m->curAttr->mode & MNU_DISPLAY) == MNU_PAGED)
463 drawPageMenu(m);
464 else if ((m->curAttr->mode & MNU_DISPLAY) == MNU_LIST)
465 drawListMenu(m);
466 /* xreddymn Dec-16-2004 MMI-SPR-27384: Two line height list display */
467 else if ((m->curAttr->mode & MNU_DISPLAY) == MNU_LIST_2_LINE)
468 drawListMenu(m);
469 else if ((m->curAttr->mode & MNU_DISPLAY) == MNU_LIST_COLOUR)
470 drawListMenu(m);
471
472 return MfwResOk;
473 }
474
475
476 /*
477 +--------------------------------------------------------------------+
478 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
479 | STATE : code ROUTINE : mnuUp |
480 +--------------------------------------------------------------------+
481
482 PURPOSE : one step up
483
484 */
485
486 MfwRes mnuUp (MfwHnd m)
487 {
488 MfwMnu *mnu;
489 MfwMnuAttr *ca;
490 MfwMnuItem *ci;
491 // U8 uMode; // RAVI
492
493 if ((mnu = mfwControl(m)) == 0)
494 return MfwResIllHnd;
495
496
497 ca = mnu->curAttr;
498 do
499 {
500 if (mnu->lCursor[mnu->level] == 0)
501 {
502 mnu->lCursor[mnu->level] = ca->nItems - 1;
503 mnu->flags |= E_MNU_TOPPED;
504 if (mnu->handler)
505 if (mnu->mask & E_MNU_TOPPED)
506 mnu->handler(E_MNU_TOPPED,mnu);
507 }
508 else
509 {
510 mnu->lCursor[mnu->level] -= (U8) 1;
511 mnu->flags &= ~E_MNU_TOPPED;
512 }
513 ci = ca->items + mnu->lCursor[mnu->level];
514 } while (ci->flagFunc(mnu,ca,ci) & MNU_ITEM_HIDE);
515
516 if (mnu->scrollMode) /* Simple scrolling */
517 {
518 U8 shift = mnu->lShift[mnu->level];
519 U8 index = countVisible(mnu,ca,mnu->lCursor[mnu->level]);
520 U8 visibleItems = countVisible(mnu,ca,ca->nItems);
521 int nLines = mnu->nLines;
522
523 if (visibleItems<nLines)
524 nLines = visibleItems;
525 if (shift>1)
526 shift--;
527 mnu->lShift[mnu->level] = shift;
528
529 }
530 mnuUpdate(mnu);
531 return MfwResOk;
532 }
533
534
535 /*
536 +--------------------------------------------------------------------+
537 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
538 | STATE : code ROUTINE : mnuDown |
539 +--------------------------------------------------------------------+
540
541 PURPOSE : one step down
542
543 */
544
545 MfwRes mnuDown (MfwHnd m)
546 {
547 MfwMnu *mnu;
548 MfwMnuAttr *ca;
549 MfwMnuItem *ci;
550
551
552 if ((mnu = mfwControl(m)) == 0)
553 return MfwResIllHnd;
554 ca = mnu->curAttr;
555 do
556 {
557 if (mnu->lCursor[mnu->level] >= mnu->curAttr->nItems - 1)
558 {
559 mnu->lCursor[mnu->level] = 0;
560 mnu->flags |= E_MNU_BOTTOMED;
561 if (mnu->handler)
562 if (mnu->mask & E_MNU_BOTTOMED)
563 mnu->handler(E_MNU_BOTTOMED,mnu);
564 }
565 else
566 {
567 mnu->lCursor[mnu->level] += (U8) 1;
568 mnu->flags &= ~E_MNU_BOTTOMED;
569 }
570 ci = ca->items + mnu->lCursor[mnu->level];
571 } while (ci->flagFunc(mnu,ca,ci) & MNU_ITEM_HIDE);
572
573 if (mnu->scrollMode) /* Simple scrolling */
574 {
575 U8 shift = mnu->lShift[mnu->level];
576 U8 index = countVisible(mnu,ca,mnu->lCursor[mnu->level]);
577 U8 visibleItems = countVisible(mnu,ca,ca->nItems);
578 int nLines = mnu->nLines;
579
580 if (visibleItems<nLines)
581 nLines = visibleItems;
582 if (shift<nLines)
583 shift++;
584 mnu->lShift[mnu->level] = shift;
585
586 }
587 mnuUpdate(mnu);
588 return MfwResOk;
589 }
590
591
592 /*
593 +--------------------------------------------------------------------+
594 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
595 | STATE : code ROUTINE : mnuSelect |
596 +--------------------------------------------------------------------+
597
598 PURPOSE : select a menu item; if there is a submenu, go one level
599 down
600
601 */
602
603 MfwRes mnuSelect (MfwHnd m)
604 {
605 MfwMnu *mnu;
606 MfwMnuAttr *submenu, *ca;
607 MenuFunc func;
608 // U8 dsplOld; // RAVI
609
610 if ((mnu = mfwControl(m)) == 0)
611 return MfwResIllHnd;
612
613 ca = mnu->curAttr;
614 submenu = ca->items[mnu->lCursor[mnu->level]].menu;
615 func = ca->items[mnu->lCursor[mnu->level]].func;
616
617 if (func) /* perform submenu */
618 {
619 func(mnu,&ca->items[mnu->lCursor[mnu->level]]);
620 }
621
622 if (submenu) /* call menu function */
623 {
624 if (menuIsEmpty(mnu,submenu))
625 {
626 mnu->flags |= E_MNU_EMPTY;
627 if (mnu->handler && mnu->mask & E_MNU_EMPTY)
628 mnu->handler(E_MNU_EMPTY,mnu);
629 mnu->flags &= ~E_MNU_EMPTY;
630 }
631 else
632 {
633 dspl_Clear(ca->area->px, ca->area->py,
634 (U16) (ca->area->sx+ca->area->px-1),
635 (U16) (ca->area->sy+ca->area->py-1));
636 mnu->level++;
637 mnu->lCursor[mnu->level] = 0;
638 ca = mnu->curAttr = submenu;
639 if (ca->items->flagFunc(mnu,ca,ca->items) & MNU_ITEM_HIDE)
640 mnuDown(m);
641 else
642 mnuUpdate(mnu);
643 }
644 return MfwResOk; /* we do not have to check for !submenu */
645 }
646
647 if (!func && !submenu) /* inform mmi */
648 {
649 mnu->flags |= E_MNU_SELECT;
650 if (mnu->handler && mnu->mask & E_MNU_SELECT)
651 mnu->handler(E_MNU_SELECT,mnu);
652 }
653 return MfwResOk;
654 }
655
656
657 /*
658 +--------------------------------------------------------------------+
659 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
660 | STATE : code ROUTINE : mnuEscape |
661 +--------------------------------------------------------------------+
662
663 PURPOSE : go back one level or leave the menu
664
665 */
666
667 MfwRes mnuEscape (MfwHnd m)
668 {
669 MfwMnu *mnu;
670 MfwMnuAttr *attr;
671 U8 lvl;
672 // U8 dsplOld; // RAVI
673
674 if ((mnu = mfwControl(m)) == 0)
675 return MfwResIllHnd;
676
677 if (mnu->level != 0)
678 {
679 mnu->lCursor[mnu->level] = UNUSED;
680 mnu->lShift[mnu->level] = 1;
681 mnu->level--;
682 lvl = 0; /* set level 0 */
683 attr = mnu->attr; /* set start point */
684 while (lvl != mnu->level)
685 {
686 attr = attr->items[mnu->lCursor[lvl]].menu;
687 lvl++;
688 }
689 mnu->curAttr = attr;
690 mnuUpdate(mnu);
691 }
692 else
693 {
694 mnu->flags |= E_MNU_ESCAPE;
695 if (mnu->handler)
696 if (mnu->mask & E_MNU_ESCAPE)
697 mnu->handler(E_MNU_ESCAPE,mnu);
698 }
699 return MfwResOk;
700 }
701
702
703 /*
704 +--------------------------------------------------------------------+
705 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
706 | STATE : code ROUTINE : mnuDone |
707 +--------------------------------------------------------------------+
708
709 PURPOSE : reset menu
710
711 */
712
713 MfwRes mnuDone (MfwHnd m)
714 {
715 MfwMnu *mnu;
716
717 if ((mnu = mfwControl(m)) == 0)
718 return MfwResIllHnd;
719
720 mnu->curAttr = mnu->attr;
721 mnu->level = 0;
722 memset(mnu->lCursor,UNUSED,sizeof(mnu->lCursor));
723 memset(mnu->lShift,1,sizeof(mnu->lShift));
724 mnu->lCursor[0] = 0;
725
726 return MfwResOk;
727 }
728
729
730 /*
731 +--------------------------------------------------------------------+
732 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
733 | STATE : code ROUTINE : mnuKeyAction |
734 +--------------------------------------------------------------------+
735
736 PURPOSE : perform direct jumping if there was pressed KCD_1
737 through KCD_9; in this case function returns 1;
738 otherwise function returns 0
739
740 */
741
742 MfwRes mnuKeyAction (MfwHnd m, U8 keycode)
743 {
744 MfwMnu *mnu;
745 U8 directAccess;
746
747 if ((mnu = mfwControl(m)) == 0)
748 return MfwResIllHnd;
749
750 switch (keycode)
751 {
752 case KCD_1: directAccess = 0; break;
753 case KCD_2: directAccess = 1; break;
754 case KCD_3: directAccess = 2; break;
755 case KCD_4: directAccess = 3; break;
756 case KCD_5: directAccess = 4; break;
757 case KCD_6: directAccess = 5; break;
758 case KCD_7: directAccess = 6; break;
759 case KCD_8: directAccess = 7; break;
760 case KCD_9: directAccess = 8; break;
761 default: return 0;
762 }
763
764 if (directAccess >= mnu->curAttr->nItems)
765 return 0;
766
767 mnu->lCursor[mnu->level] = directAccess;
768 mnuShow(m);
769 mnuSelect(m);
770
771 return 1;
772 }
773
774
775 /*
776 +--------------------------------------------------------------------+
777 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
778 | STATE : code ROUTINE : mnuChooseItem |
779 +--------------------------------------------------------------------+
780
781 PURPOSE : Chooses the nItemst Item.
782
783 */
784
785 MfwRes mnuChooseVisibleItem(MfwHnd m,U8 nItem)
786 {
787
788 MfwMnu *mnu;
789 int i;
790
791 if ((mnu = mfwControl(m)) == 0)
792 return MfwResIllHnd;
793
794 if (nItem<0)
795 return MfwResIllHnd;
796
797 for (i = 0; i < mnu->curAttr->nItems; i++)
798 {
799 if (!(mnu->curAttr->items[i].flagFunc(mnu,
800 mnu->curAttr,
801 &(mnu->curAttr->items[i]))
802 & MNU_ITEM_HIDE))
803 {
804 if (!nItem)
805 {
806 mnu->lCursor[mnu->level] = i;
807 mnuUpdate(mnu);
808 return MfwResOk;
809 }
810 else
811 nItem--;
812 }
813 }
814 return MfwResIllHnd;
815
816 }
817
818
819
820 /*
821 +--------------------------------------------------------------------+
822 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
823 | STATE : code ROUTINE : menuIsEmpty |
824 +--------------------------------------------------------------------+
825
826 PURPOSE : check for empty submenu
827
828 */
829
830 static int menuIsEmpty (MfwMnu *m, MfwMnuAttr *ma)
831 {
832 int i;
833
834 for (i = 0; i < ma->nItems; i++)
835 if (!(ma->items[i].flagFunc(m,ma,&(ma->items[i]))
836 & MNU_ITEM_HIDE))
837 return 0;
838
839 return 1;
840 }
841
842
843
844
845
846 /*
847 +--------------------------------------------------------------------+
848 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
849 | STATE : code ROUTINE : countVisible |
850 +--------------------------------------------------------------------+
851
852 PURPOSE : count visible items up to current item
853
854 */
855
856 static int countVisible (MfwMnu *m, MfwMnuAttr *ma, int start)
857 {
858 int i, count;
859
860 for (i = 0, count = 0; i < start; i++)
861 if (!(ma->items[i].flagFunc(m,ma,&(ma->items[i]))
862 & MNU_ITEM_HIDE))
863 count++;
864
865 return count;
866 }
867
868 /*
869 +--------------------------------------------------------------------+
870 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
871 | STATE : code ROUTINE : countVisibleItems |
872 +--------------------------------------------------------------------+
873
874 PURPOSE : count visible items in the current branch
875
876 */
877
878 U8 mnuCountVisibleItems (MfwHnd m)
879 {
880 MfwMnu *mnu;
881
882 if ((mnu = mfwControl(m)) == 0)
883 return 0;
884
885 return (U8)countVisible(mnu, mnu->curAttr,mnu->curAttr->nItems);
886 }
887
888
889 /*
890 +--------------------------------------------------------------------------+
891 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
892 | STATE : code ROUTINE : countCurrentVisibleItem |
893 +--------------------------------------------------------------------------+
894
895 PURPOSE : returns the position of the current Item
896 */
897
898 U8 mnuCountCurrentVisibleItem(MfwHnd m)
899 {
900 MfwMnu *mnu;
901 U8 i;
902 U8 pos=0;
903
904 if ((mnu = mfwControl(m)) == 0)
905 return 0;
906
907 for (i = 0; i < mnu->curAttr->nItems; i++)
908 {
909 if ((mnu->lCursor[mnu->level]) == i)
910 return pos;
911 if (!(mnu->curAttr->items[i].flagFunc(mnu,
912 mnu->curAttr,
913 &(mnu->curAttr->items[i]))
914 & MNU_ITEM_HIDE))
915 pos++;
916 }
917 return pos;
918
919 }
920
921
922
923
924 /*
925 +--------------------------------------------------------------------+
926 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
927 | STATE : code ROUTINE : checkPredraw |
928 +--------------------------------------------------------------------+
929
930 PURPOSE : check / generate predraw event
931
932 */
933
934 static int checkPredraw (MfwMnu *mnu, MfwMnuItem *mi,
935 char **t, MfwIcnAttr **icn)
936 {
937 int res = 0;
938
939 if (mi->flagFunc(mnu,mnu->curAttr,mi) & MNU_ITEM_NOTIFY)
940 {
941 mnu->flags |= E_MNU_PREDRAW;
942 if (mnu->handler)
943 if (mnu->mask & E_MNU_PREDRAW)
944 {
945 if (mi->exta)
946 {
947 ((MfwItmExtPredraw*)(mi->exta))->str = *t;
948 ((MfwItmExtPredraw*)(mi->exta))->icon = *icn;
949 }
950 res = mnu->handler(E_MNU_PREDRAW,mi);
951 if (mi->exta)
952 {
953 *t = ((MfwItmExtPredraw*)(mi->exta))->str;
954 *icn = ((MfwItmExtPredraw*)(mi->exta))->icon;
955 }
956 }
957 mnu->flags &= ~E_MNU_PREDRAW;
958 }
959
960 return res;
961 }
962
963
964 /*
965 +--------------------------------------------------------------------+
966 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
967 | STATE : code ROUTINE : checkPostdraw |
968 +--------------------------------------------------------------------+
969
970 PURPOSE : check / generate postdraw event
971
972 */
973
974 static int checkPostdraw (MfwMnu *mnu, MfwMnuItem *mi)
975 {
976 int res = 0;
977
978 if (mi->flagFunc(mnu,mnu->curAttr,mi) & MNU_ITEM_NOTIFY)
979 {
980 mnu->flags |= E_MNU_POSTDRAW;
981 if (mnu->handler)
982 if (mnu->mask & E_MNU_POSTDRAW)
983 res = mnu->handler(E_MNU_POSTDRAW,mi);
984 mnu->flags &= ~E_MNU_POSTDRAW;
985 }
986
987 return res;
988 }
989
990
991 /*
992 +--------------------------------------------------------------------+
993 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
994 | STATE : code ROUTINE : checkStatus |
995 +--------------------------------------------------------------------+
996
997 PURPOSE : check / insert item status (string MUST be in RAM)
998
999 SPR998 - SH - Changed to allow checkbox menu items.
1000 */
1001
1002 static int checkStatus (MfwMnu *m, MfwMnuAttr *ma, MfwMnuItem *mi,
1003 char *menuString)
1004 {
1005 char *e; /* ES!! UNICODE */
1006 int index = 0; // RAVI
1007 #if (BOARD != 61)
1008 BOOL unicode;
1009 #endif
1010 U16 flagResult;
1011
1012 #if(BOARD != 61)
1013 if (menuString[0] == 0x80)
1014 unicode = TRUE;
1015 else
1016 unicode = FALSE;
1017 #endif
1018
1019 flagResult = mi->flagFunc(m,ma,mi);
1020 switch (flagResult)
1021 {
1022 case MNU_ITEM_STATED:
1023 e = mi->exta;
1024 if (!e)
1025 return 0;
1026 while (menuString[index])
1027 {
1028 if (menuString[index] == '%') /* ES!! : UNICODE */
1029 {
1030 switch (menuString[index+1])
1031 {
1032 case 'c': /* single char */
1033 strcpy(&menuString[index+1],&menuString[index+2]);
1034 menuString[index] = *e;
1035 e++;
1036 break;
1037 }
1038 }
1039 index++;
1040 }
1041 break;
1042
1043 /* SPR998 - SH - Checked or unchecked option.
1044 * Don't need to do anything here. */
1045
1046 case MNU_ITEM_UNCHECKED:
1047 case MNU_ITEM_CHECKED:
1048 break;
1049
1050 default:
1051 break;
1052 }
1053
1054 return flagResult; /* SPR#998 - SH - Now returns item type */
1055 }
1056
1057
1058 static void mnuDrawHeader(MfwMnuAttr *mnuAttr, MfwRect* areaLeft, char *hdrString)
1059 {
1060 int mode = mnuAttr->mode;
1061 MfwRect* mnuArea = mnuAttr->area;
1062 int mnuColour = mnuAttr->mnuColour;
1063 char* txt=hdrString;
1064 int nPixels;
1065 int xPos,yPos,sy,txtXpos; // RAVI - Removed txtLen, sx
1066
1067 // Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462
1068 #ifdef FF_MMI_SAT_ICON
1069 USHORT titleIconWidth = 0;
1070 USHORT iconX, iconY;
1071 #endif
1072
1073 xPos = mnuArea->px;
1074 yPos = mnuArea->py;
1075 sy = res_getTitleHeight();
1076 resources_setTitleColour(mnuColour);
1077 dspl_Clear(xPos,yPos,(U16)(mnuArea->sx+xPos-1),(U16)(mnuArea->sy+yPos-1));
1078 if ((mode & MNU_HDR_ALIGN) == MNU_HDR_LEFT)
1079 {
1080 //Position is correct
1081 txtXpos = xPos;
1082 }
1083 else
1084 {
1085 nPixels = dspl_GetTextExtent( txt, 0);
1086 if ((mode & MNU_HDR_ALIGN) == MNU_HDR_RIGHT)
1087 {
1088 txtXpos = xPos + mnuArea->sx - nPixels;
1089 }
1090 else
1091 { //Display in middle
1092 txtXpos = xPos + (mnuArea->sx - nPixels)/2;
1093 }
1094 }
1095
1096 // Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462
1097 #ifdef FF_MMI_SAT_ICON
1098 if (mnuAttr->icon != NULL)
1099 {
1100 if (mnuAttr->icon->area.sx > TITLE_ICON_WIDTH)
1101 {
1102 titleIconWidth = TITLE_ICON_WIDTH;
1103 }
1104 else
1105 {
1106 titleIconWidth = mnuAttr->icon->area.sx;
1107 }
1108 }
1109 else
1110 {
1111 titleIconWidth = 0;
1112 }
1113
1114 if(titleIconWidth)
1115 txtXpos = txtXpos + titleIconWidth + 1;
1116
1117 if (mnuAttr->icon != NULL)
1118 {
1119 if(mnuAttr->icon->selfExplanatory == FALSE)
1120 {
1121 if (txt[0] != 0x80)
1122 dspl_ScrText (txtXpos, yPos, txt, 0);
1123 else
1124 dspl_TextOut(txtXpos, yPos, DSPL_TXTATTR_CURRENT_MODE, txt );
1125 }
1126 }
1127 else
1128 {
1129 if (txt[0] != 0x80)
1130 dspl_ScrText (txtXpos, yPos, txt, 0);
1131 else
1132 dspl_TextOut(txtXpos, yPos, DSPL_TXTATTR_CURRENT_MODE, txt );
1133 }
1134 #else
1135 if (txt[0] != 0x80)
1136 dspl_ScrText (txtXpos, yPos, txt, 0);
1137 else
1138 dspl_TextOut(txtXpos, yPos, DSPL_TXTATTR_CURRENT_MODE, txt );
1139 #endif
1140
1141 // Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462
1142 #ifdef FF_MMI_SAT_ICON
1143 if (mnuAttr->icon != NULL)
1144 {
1145 if (mnuAttr->icon->icons != NULL)
1146 {
1147 if ((mnuAttr->icon->area.sx > TITLE_ICON_WIDTH) || (mnuAttr->icon->area.sy > TITLE_ICON_HEIGHT))
1148 {
1149 /* iconY calculates place holder to place the icon
1150 at the center of the screen. */
1151 iconX = 1;
1152 iconY = 1+ ((sy-2) / 2) - (10 / 2);
1153 dspl_BitBlt2(iconX, iconY, 8,
1154 10, (void*)SATIconQuestionMark, 0, BMP_FORMAT_256_COLOUR);
1155 }
1156 else
1157 {
1158 dspl_BitBlt2(mnuAttr->icon->area.px, mnuAttr->icon->area.py,
1159 mnuAttr->icon->area.sx, mnuAttr->icon->area.sy,
1160 mnuAttr->icon->icons, 0, mnuAttr->icon->icnType);
1161 }
1162 }
1163 }
1164 #endif
1165
1166 areaLeft->px = xPos;
1167 areaLeft->sx = mnuArea->sx;
1168 areaLeft->py = yPos+sy;
1169 areaLeft->sy = mnuArea->sy-sy;
1170 #ifdef MFW_DEBUG_DISPLAY_SIZE
1171 dspl_DrawRect(xPos,yPos,(xPos+mnuArea->sx-1),(yPos+sy-1));
1172 #endif
1173 resources_restoreMnuColour();
1174 }
1175
1176 // Sep 30, 2005 REF: CRR MMI-SPR-33781 xreddymn
1177 // Description: Menu header not displayed for Golite
1178 // Solution: Added functionality to display menu header
1179 /*
1180 +--------------------------------------------------------------------+
1181 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
1182 | STATE : code ROUTINE : mnuDrawHeaderBW |
1183 +--------------------------------------------------------------------+
1184
1185 PURPOSE : Displays menu header (title) on monochrome displays.
1186 Code is based on mnuDrawHeader. See also mnuDrawHeader.
1187 */
1188 static void mnuDrawHeaderBW(MfwMnuAttr *mnuAttr, MfwRect* areaLeft, char *hdrString)
1189 {
1190 int mode = mnuAttr->mode;
1191 MfwRect *mnuArea = mnuAttr->area;
1192 int mnuColour = mnuAttr->mnuColour;
1193 char *txt = hdrString;
1194 int nPixels;
1195 int xPos, yPos, sx, sy, txtLen, txtXpos;
1196
1197 xPos = mnuArea->px;
1198 yPos = mnuArea->py;
1199 sy = res_getTitleHeight();
1200 resources_setTitleColour(mnuColour);
1201 dspl_Clear(xPos, yPos, (U16)(mnuArea->sx + xPos - 1), (U16)(mnuArea->sy + yPos - 1));
1202 dspl_DrawLine(xPos, (U16)(sy + yPos - 2), (U16)(mnuArea->sx + xPos - 1), (U16)(sy + yPos - 2));
1203 if ((mode & MNU_HDR_ALIGN) == MNU_HDR_LEFT)
1204 { //Position is correct
1205 txtXpos = xPos;
1206 }
1207 else
1208 {
1209 nPixels = dspl_GetTextExtent( txt, 0);
1210 if ((mode & MNU_HDR_ALIGN) == MNU_HDR_RIGHT)
1211 {
1212 txtXpos = xPos + mnuArea->sx - nPixels;
1213 }
1214 else
1215 { //Display in middle
1216 txtXpos = xPos + (mnuArea->sx - nPixels)/2;
1217 }
1218 }
1219 if (txt[0] != 0x80)
1220 dspl_ScrText (txtXpos, yPos, txt, 0);
1221 else
1222 dspl_TextOut(txtXpos, yPos, DSPL_TXTATTR_CURRENT_MODE, txt);
1223 // Remaining area is calculated so that it does not touch
1224 // or overlap with the menu header
1225 areaLeft->px = xPos;
1226 areaLeft->sx = mnuArea->sx;
1227 areaLeft->py = yPos+sy + 1;
1228 areaLeft->sy = mnuArea->sy - sy - 1;
1229 resources_restoreMnuColour();
1230 }
1231
1232 /*
1233 +--------------------------------------------------------------------+
1234 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
1235 | STATE : code ROUTINE : drawPageMenu |
1236 +--------------------------------------------------------------------+
1237
1238 PURPOSE : draws menu in page mode
1239
1240 GW 05/10/01 - Changed single value 'lng' to 2 values indicating if ID's should be
1241 used (useStrID) and if the strings are ascii or unicode (uesDefLang).
1242
1243 */
1244 void fastCopyBitmap(int startX, int startY, // start position of bitmap
1245 int bmpSx, int bmpSy, //size of bitmap
1246 char* srcBitmap,
1247 int posX, int posY, // start of area to be copied into
1248 int sx, int sy, // size of area to be copied into
1249 U32 bgd_col, int bmptype);
1250
1251 static void drawPageMenu (MfwMnu *mnu)
1252 {
1253 MfwMnuAttr *ma; /* menu attributes */
1254 //U16 th, tw, tl; /* text height, width, len */ // RAVI - Removed
1255 U16 ax, ay, aw, ah; // RAVI - , x; /* menu area dimensions */
1256 // int tLines; /* lines in item text */ // RAVI
1257 // int nLines; /* lines in menu area */ // RAVI
1258 char *txt; // RAVI - Removed *t2, save; /* item text & clip saver */
1259 MfwIcnAttr * icn; /* item icon */
1260 U8 oldFont = -1; /* save previous font */
1261 MfwMnuItem *mi; /* current item */
1262 // char *t; // RAVI - Removed tt [64] /* temp item string */
1263
1264
1265 ma = mnu->curAttr;
1266 if (ma->font != (U8) -1)
1267 oldFont = dspl_SelectFontbyID(ma->font); /* setup font */
1268
1269 ax = ma->area->px; ay = ma->area->py;
1270 aw = ma->area->sx; ah = ma->area->sy;
1271
1272 mi = ma->items + mnu->lCursor[mnu->level];
1273 icn = mi->icon;
1274 txt = mi->str;
1275 resources_setColour(ma->mnuColour);
1276
1277 if ((ma->mode & MNU_HDRFORMAT_STR)==0) /* header is a text ID */
1278 txt = (char*)MmiRsrcGetText((int)txt);
1279 checkPredraw(mnu,mi,&txt,&icn); /* ES!! */
1280 {
1281 MfwRect areaLeft;
1282 mnuDrawHeader(ma,&areaLeft,txt);
1283 ax = areaLeft.px; ay = areaLeft.py;
1284 aw = areaLeft.sx; ah = areaLeft.sy;
1285 }
1286 if ((dspl_getDisplayType()==DSPL_COLOUR) && (ma->bgdBitmap != NULL))
1287 {
1288 MfwRect *bmpArea = &ma->bgdBitmap->area;
1289 if ((ma->bgdBitmap->icons != NULL) && (bmpArea->sx >0) && (bmpArea->sy >0))
1290 {
1291 fastCopyBitmap( (int)bmpArea->px, (int)bmpArea->py, (int)bmpArea->sx, (int)bmpArea->sy,
1292 ma->bgdBitmap->icons,
1293 (int)ax,(int)ay, (int)aw, (int)ah,
1294 dspl_GetBgdColour(),
1295 ma->bgdBitmap->icnType);
1296 }
1297 else
1298 {
1299 dspl_Clear(ax,ay,(U16)(ax+aw-1),(U16)(ay+ah-1));
1300 }
1301 }
1302 else
1303 {
1304 dspl_Clear(ax,ay,(U16)(ax+aw-1),(U16)(ay+ah-1));
1305 }
1306
1307
1308
1309 if (icn != NULL)
1310 { /* show associated icon */
1311 dspl_BitBlt2(icn->area.px,icn->area.py,
1312 icn->area.sx,icn->area.sy,
1313 icn->icons,0,icn->icnType);
1314
1315 }
1316 if (oldFont != (U8) -1)
1317 dspl_SelectFontbyID(oldFont); /* restore previous font */
1318
1319 checkPostdraw(mnu,mi); /* ES!! */
1320
1321 #ifdef MFW_DEBUG_DISPLAY_SIZE
1322 dspl_DrawRect(ax,ay,(ax+aw-1),(ay+ah-1));
1323 #endif
1324 resources_restoreColour();
1325 }
1326
1327
1328 /*
1329 +--------------------------------------------------------------------+
1330 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
1331 | STATE : code ROUTINE : drawListMenu |
1332 +--------------------------------------------------------------------+
1333
1334 PURPOSE : draws menu in list mode
1335
1336 GW 05/10/01 - Changed single value 'lng' to 2 values indicating if ID's should be
1337 used (useStrID) and if the strings are ascii or unicode (uesDefLang).
1338 */
1339 #define MAX_STR_CHAR 64
1340 static void drawListMenu (MfwMnu *mnu)
1341 {
1342 MfwMnuAttr *ma; /* menu attributes */
1343 U16 fh, fw; /* font height & width */
1344 U16 ax, ay, aw, ah; /* menu area dimensions */
1345 U16 x, x2=0, EOL_position=0, hfh=0;
1346 int nLines;
1347 int i;
1348 int nIdx;
1349 int nTextLen;
1350 MfwIcnAttr * icn;
1351 // int fit; // RAVI
1352 char *txtStr; /* item text */
1353 char txt[MAX_STR_CHAR];
1354 U8 oldFont = -1; /* save previous font */
1355 // UBYTE temp; // RAVI
1356 // int UniHeight = 12; // RAVI
1357 int simpleScrolling;
1358 int status; /* SPR#998 - SH - Status for each menu item */
1359 const USHORT checkbox_width = 7; /* SPR#998 - SH - Checkbox width in pixels */
1360 const USHORT checkbox_height = 7; /* SPR#998 - SH - Checkbox height in pixels */
1361 const USHORT checkbox_spacing_left = 1; /* SPR#998 - SH - Gap between left edge of menu and checkbox */
1362 const USHORT checkbox_spacing_right = 2; /* SPR#998 - SH - Gap between right edge of checkbox and menu text */
1363 USHORT checkbox_x; /* SPR#998 - SH - X position of checkbox */
1364 USHORT checkbox_y; /* SPR#998 - SH - Y position of checkbox */
1365
1366 // Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462
1367 #ifdef FF_MMI_SAT_ICON
1368 USHORT titleIconWidth = 0;
1369 USHORT iconX, iconY;
1370 #endif
1371
1372 TIME_TRACE_EVENT("drawListMenu() start");
1373 ma = mnu->curAttr;
1374
1375 /* SPR#1983 - SH - Ignore language type now */
1376
1377 if (ma->font != (U8) -1)
1378 oldFont = dspl_SelectFontbyID(ma->font); /* setup font */
1379
1380 /* xreddymn Dec-16-2004 MMI-SPR-27384: Two line height list display */
1381 if((ma->mode & MNU_DISPLAY)== MNU_LIST_2_LINE)
1382 {
1383 hfh = dspl_GetFontHeight(); /* height of one line */
1384 fh = hfh<<1; /* height of two lines */
1385 }
1386 else
1387 fh = dspl_GetFontHeight();
1388 fw = dspl_GetTextExtent("X",1); // ES!! only for normal fonts !
1389
1390 //Display header info (if required)
1391 if ((ma->hdrId != 0) && (dspl_getDisplayType()==DSPL_COLOUR))
1392 {
1393 MfwRect areaLeft;
1394 char *hdrStr;
1395 if ((ma->mode & MNU_HDRFORMAT_STR)==0) /* header is a text ID */
1396 hdrStr = MmiRsrcGetText(ma->hdrId);
1397 else
1398 hdrStr = (char*)(ma->hdrId);
1399 mnuDrawHeader(ma,&areaLeft,hdrStr);
1400 ax = areaLeft.px; ay = areaLeft.py;
1401 aw = areaLeft.sx; ah = areaLeft.sy;
1402 }
1403 // Sep 30, 2005 REF: CRR MMI-SPR-33781 xreddymn
1404 // Description: Menu header not displayed for Golite
1405 // Solution: Added functionality to display menu header
1406 // Display a different header in case of monochrome screens
1407 else if((ma->hdrId != 0) && (DSPL_BW == dspl_getDisplayType()))
1408 {
1409 MfwRect areaLeft;
1410 char *hdrStr;
1411 if ((ma->mode & MNU_HDRFORMAT_STR) == 0) /* header is a text ID */
1412 hdrStr = MmiRsrcGetText(ma->hdrId);
1413 else
1414 hdrStr = (char*)(ma->hdrId);
1415 mnuDrawHeaderBW(ma, &areaLeft, hdrStr);
1416 ax = areaLeft.px; ay = areaLeft.py;
1417 aw = areaLeft.sx; ah = areaLeft.sy;
1418 }
1419 else
1420 {
1421 ax = ma->area->px; ay = ma->area->py;
1422 aw = ma->area->sx; ah = ma->area->sy;
1423 }
1424 resources_setColour(ma->mnuColour);
1425 dspl_Clear(ax,ay,(U16)(aw+ax-1),(U16)(ah+ay-1));
1426 nLines = ah / fh;
1427 mnu->nLines = nLines; //Store the number of lines we are drawing for scrolling up/down
1428 {
1429 // TRACE_EVENT_P5(" ax:%d ay:%d aw:%d ah:%d lines:%d",ax,ay,aw,ah, nLines);
1430 }
1431 if ((!mnu->scrollMode)||(countVisible(mnu,ma,ma->nItems)<=nLines)) /* Simple scrolling */
1432 simpleScrolling = TRUE;
1433 else
1434 simpleScrolling = FALSE;
1435
1436 if (simpleScrolling)
1437 {
1438 nIdx = (countVisible(mnu,ma,mnu->lCursor[mnu->level])/nLines)*nLines;
1439 }
1440 else
1441 {
1442 int count=mnu->lShift[mnu->level];
1443 int index= mnu->lCursor[mnu->level]+1;
1444 int nVisibles = countVisible(mnu,ma,ma->nItems);
1445
1446 while (ma->items[index-1].flagFunc(mnu,ma,&(ma->items[index-1])) & MNU_ITEM_HIDE)
1447 {
1448 index++;
1449 }
1450
1451 while (count>0){
1452 if (index<=0)
1453 index = ma->nItems-1;
1454 else
1455 index--;
1456 if (!(ma->items[index].flagFunc(mnu,ma,&(ma->items[index]))& MNU_ITEM_HIDE))
1457 count--;
1458 }
1459 if (nVisibles<nLines)
1460 nLines = nVisibles;
1461 nIdx = index;
1462 }
1463
1464 for (i = 0; i < nLines; nIdx++) /* ES!! not so nice... */
1465 {
1466 if (nIdx >= ma->nItems)
1467 {
1468 if (simpleScrolling)
1469 break;
1470 else
1471 nIdx=0;
1472 }
1473
1474 if (ma->items[nIdx].flagFunc(mnu,ma,&(ma->items[nIdx]))
1475 & MNU_ITEM_HIDE)
1476 continue;
1477 if (mnu->useStrID) /* use language handler */
1478 txtStr = (char*)MmiRsrcGetText((int)ma->items[nIdx].str); //JVJE
1479 else
1480 txtStr = ma->items[nIdx].str;
1481 icn = ma->items[nIdx].icon;
1482
1483 // Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462
1484 #ifdef FF_MMI_SAT_ICON
1485 if (icn != NULL)
1486 {
1487 if (icn->area.sx > TITLE_ICON_WIDTH)
1488 {
1489 titleIconWidth = TITLE_ICON_WIDTH;
1490 }
1491 else
1492 {
1493 titleIconWidth = icn->area.sx;
1494 }
1495 }
1496 else
1497 {
1498 titleIconWidth = 0;
1499 }
1500 #endif
1501
1502 checkPredraw(mnu,ma->items+nIdx,&txtStr,&icn); /* ES!! */
1503 memcpy(txt,txtStr,MAX_STR_CHAR);
1504 status = checkStatus(mnu,ma,ma->items+nIdx,txt); /* SPR#998 - SH - Store the resulting status */
1505
1506 if ((mnu->useStrID) &&
1507 ((ma->mode & MNU_DISPLAY) == MNU_LIST_COLOUR))
1508 {
1509 resources_setColourMnuItem( (int)ma->items[nIdx].str );
1510 }
1511
1512 /* xreddymn Dec-16-2004 MMI-SPR-27384: For two line menu item display */
1513 if((ma->mode & MNU_DISPLAY)== MNU_LIST_2_LINE)
1514 {
1515 EOL_position=0;
1516 #ifdef NO_ASCIIZ
1517 if(txt[0] == 0x80 || mnu->textDCS==MNU_LIST_LANGUAGE_UNICODE)
1518 {
1519 while((((U16*)txt)[EOL_position]!='\n') && (((U16*)txt)[EOL_position]!='\0')) EOL_position++;
1520 if(((U16*)txt)[EOL_position]=='\0') /* Less than two lines to display */
1521 EOL_position=0;
1522 else /* Two lines to display, break each line with a '\0' */
1523 {
1524 ((U16*)txt)[EOL_position]='\0';
1525 EOL_position++;
1526 }
1527 }
1528 else
1529 #endif
1530 {
1531 while((txt[EOL_position]!='\n') && (txt[EOL_position]!='\0')) EOL_position++;
1532 if(txt[EOL_position]=='\0') /* Less than two lines to display */
1533 EOL_position=0;
1534 else /* Two lines to display, break each line with a '\0' */
1535 {
1536 txt[EOL_position]='\0';
1537 EOL_position++;
1538 }
1539 }
1540 if(EOL_position>0)
1541 {
1542 #ifdef NO_ASCIIZ
1543 if(txt[0] == 0x80 || mnu->textDCS==MNU_LIST_LANGUAGE_UNICODE)
1544 nTextLen = dspl_GetTextExtent((char*)(txt+(EOL_position<<1)),(U16)dspl_str_length(txt));
1545 else
1546 #endif
1547 nTextLen = dspl_GetTextExtent((char*)(txt+EOL_position),(U16)dspl_str_length(txt));
1548
1549 /* SPR#998 - SH - If list is a checkbox list, include space for checkbox in width */
1550 if (status==MNU_ITEM_CHECKED || status==MNU_ITEM_UNCHECKED)
1551 {
1552 nTextLen+=(checkbox_spacing_left+checkbox_width+checkbox_spacing_right);
1553 }
1554 /* end of SPR#998 */
1555
1556 if ((ma->mode & MNU_ALIGN) == MNU_CENTER)
1557 x2 = (U16) (ax + (aw - nTextLen) / 2);
1558 else if ((ma->mode & MNU_ALIGN) == MNU_RIGHT)
1559 x2 = (U16) (ax + aw - nTextLen);
1560 else
1561 x2 = (U16) (ax + fw); /* MNU_LEFT (default) */
1562 if ((ma->mode & MNU_ITEMSEL) == MNU_CUR_LINE)
1563 x2 =ax;
1564 }
1565 }
1566
1567 nTextLen = dspl_GetTextExtent(txt,(U16)dspl_str_length(txt));
1568
1569 /* SPR#998 - SH - If list is a checkbox list, include space for checkbox in width */
1570
1571 if (status==MNU_ITEM_CHECKED || status==MNU_ITEM_UNCHECKED)
1572 {
1573 nTextLen+=(checkbox_spacing_left+checkbox_width+checkbox_spacing_right);
1574 }
1575
1576 /* end of SPR#998 */
1577
1578 if ((ma->mode & MNU_ALIGN) == MNU_CENTER)
1579 x = (U16) (ax + (aw - nTextLen) / 2);
1580 else if ((ma->mode & MNU_ALIGN) == MNU_RIGHT)
1581 x = (U16) (ax + aw - nTextLen);
1582 else
1583 x = (U16) (ax + fw); /* MNU_LEFT (default) */
1584 if ((ma->mode & MNU_ITEMSEL) == MNU_CUR_LINE)
1585 x =ax;
1586
1587 /* SPR#998 - SH - Draw checkboxes if required */
1588
1589 if (status==MNU_ITEM_CHECKED || status==MNU_ITEM_UNCHECKED)
1590 {
1591 checkbox_x = x+checkbox_spacing_left;
1592 checkbox_y = ay+i*fh+(fh-checkbox_height)/2;
1593
1594 if (status==MNU_ITEM_CHECKED)
1595 {
1596 /* NOTE: for some reason, a filled rect must have x2, y2 +1 of the same size
1597 * of unfilled rect...compare parameters here and below */
1598 dspl_DrawFilledRect(checkbox_x, checkbox_y, checkbox_x+checkbox_width+1,
1599 checkbox_y+checkbox_height+1);
1600 }
1601 else
1602 {
1603 dspl_DrawRect(checkbox_x, checkbox_y, checkbox_x+checkbox_width,
1604 checkbox_y+checkbox_height);
1605 }
1606 x+=(checkbox_spacing_left+checkbox_width+checkbox_spacing_right); /* Text box now starts just to the right of checkbox */
1607
1608 /* xreddymn Dec-16-2004 MMI-SPR-27384: For two line menu item display */
1609 x2+=(checkbox_spacing_left+checkbox_width+checkbox_spacing_right);
1610 }
1611
1612 /* end of SPR#998 */
1613
1614 {
1615 #ifdef NO_ASCIIZ
1616 /*MC, use universal height rather than smaller chinese font height*/
1617 /*MC, SPR1526, send whole string to dspl_TextOut, rather than missing out unicode tag*/
1618 /* SPR#1983 - SH - If unicode is set, send text as unicode */
1619
1620 if (txt[0] == 0x80 || mnu->textDCS==MNU_LIST_LANGUAGE_UNICODE)
1621 {
1622 // Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462
1623 #ifdef FF_MMI_SAT_ICON
1624 if (icn != NULL)
1625 {
1626 if(icn->selfExplanatory == FALSE)
1627 dspl_TextOut(titleIconWidth + 1 + x,(U16)ay+i*fh/*MC, 1319*/,DSPL_TXTATTR_UNICODE,txt);
1628 }
1629 else
1630 dspl_TextOut(x,(U16)ay+i*fh/*MC, 1319*/,DSPL_TXTATTR_UNICODE,txt);
1631 #else
1632 dspl_TextOut(x,(U16)ay+i*fh/*MC, 1319*/,DSPL_TXTATTR_UNICODE,txt);
1633 #endif
1634 if(EOL_position>0) /* xreddymn Dec-16-2004 MMI-SPR-27384: two line display */
1635 {
1636 dspl_TextOut(x2,(U16)ay+i*fh+hfh/*MC, 1319*/,DSPL_TXTATTR_UNICODE,(char*)(txt+(EOL_position<<1)));
1637
1638 }
1639 }
1640 else
1641 #endif
1642 {
1643 // Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462
1644 #ifdef FF_MMI_SAT_ICON
1645 if (icn != NULL)
1646 {
1647 if(icn->selfExplanatory == FALSE)
1648 dspl_TextOut(titleIconWidth + 1 + x,(U16)(ay+i*fh),DSPL_TXTATTR_CURRENT_MODE,txt);
1649 }
1650 else
1651 dspl_TextOut(x,(U16)(ay+i*fh),DSPL_TXTATTR_CURRENT_MODE,txt);
1652 #else
1653 dspl_TextOut(x,(U16)(ay+i*fh),DSPL_TXTATTR_CURRENT_MODE,txt);
1654 #endif
1655 if(EOL_position>0) /* xreddymn Dec-16-2004 MMI-SPR-27384: two line display */
1656 {
1657 dspl_TextOut(x2,(U16)(ay+i*fh+hfh),DSPL_TXTATTR_CURRENT_MODE,(char*)(txt+EOL_position));
1658 }
1659 }
1660 }
1661
1662 if (nIdx == mnu->lCursor[mnu->level])
1663 {
1664 if ((ma->mode & MNU_ITEMSEL) == MNU_FRAMED)
1665 dspl_DrawRect(ax,(U16)(ay+i*fh),(U16)(aw-2+ax),
1666 (U16)(fh-1+ay+i*fh));
1667 else if ((ma->mode & MNU_ITEMSEL) == MNU_CUR_ARROW)
1668 dspl_TextOut(ax,(U16)(ay+i*fh),DSPL_TXTATTR_CURRENT_MODE,">");
1669 else if ((ma->mode & MNU_ITEMSEL) == MNU_CUR_STAR)
1670 dspl_TextOut(ax,(U16)(ay+i*fh),DSPL_TXTATTR_CURRENT_MODE,"*");
1671 else if ((ma->mode & MNU_ITEMSEL) == MNU_CUR_BLOCK)
1672 dspl_TextOut(ax,(U16)(ay+i*fh),
1673 DSPL_TXTATTR_CURRENT_MODE|DSPL_TXTATTR_INVERS," ");
1674 else if ((ma->mode & MNU_ITEMSEL) == MNU_CUR_LINE)
1675 {
1676 if (dspl_getDisplayType()==DSPL_BW)
1677 {
1678 dspl_DrawFilledColRect(x,ay+i*fh,aw,ay+(i+1)*fh,0x00FFFFFF);
1679 #ifdef NO_ASCIIZ
1680 /* SPR#1983 - SH - If unicode is set, send text as unicode */
1681 if (txt[0] == 0x80 || mnu->textDCS==MNU_LIST_LANGUAGE_UNICODE)
1682 {
1683 dspl_TextOut(x,(U16)ay+i*fh/*MC, 1319*/,DSPL_TXTATTR_UNICODE|DSPL_TXTATTR_INVERS,txt);
1684 if(EOL_position>0) /* xreddymn Dec-16-2004 MMI-SPR-27384: two line display */
1685 {
1686 dspl_TextOut(x2,(U16)ay+i*fh+hfh/*MC, 1319*/,DSPL_TXTATTR_UNICODE|DSPL_TXTATTR_INVERS,(char*)(txt+(EOL_position<<1)));
1687 }
1688 }
1689 else
1690 #endif
1691 {
1692 dspl_TextOut(x,(U16)(ay+i*fh),DSPL_TXTATTR_CURRENT_MODE|DSPL_TXTATTR_INVERS,txt);
1693 if(EOL_position>0) /* xreddymn Dec-16-2004 MMI-SPR-27384: two line display */
1694 {
1695 dspl_TextOut(x2,(U16)(ay+i*fh+hfh),DSPL_TXTATTR_CURRENT_MODE|DSPL_TXTATTR_INVERS,(char*)(txt+EOL_position));
1696 }
1697 }
1698 }
1699 else
1700 {
1701 resources_setHLColour(ma->mnuColour);
1702 dspl_DrawFilledBgdRect(x,ay+i*fh,aw,ay+(i+1)*fh);
1703 #ifdef NO_ASCIIZ
1704 /* SPR#1983 - SH - If unicode is set, send text as unicode */
1705 if (txt[0] == 0x80 || mnu->textDCS==MNU_LIST_LANGUAGE_UNICODE)
1706 {
1707 // Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462
1708 #ifdef FF_MMI_SAT_ICON
1709 if (icn != NULL)
1710 {
1711 if(icn->selfExplanatory == FALSE)
1712 dspl_TextOut(titleIconWidth + x,(U16)ay+i*fh/*MC, 1319*/,DSPL_TXTATTR_UNICODE,txt);
1713 }
1714 else
1715 dspl_TextOut(x,(U16)ay+i*fh/*MC, 1319*/,DSPL_TXTATTR_UNICODE,txt);
1716 #else
1717 dspl_TextOut(x,(U16)ay+i*fh/*MC, 1319*/,DSPL_TXTATTR_UNICODE,txt);
1718 #endif
1719 if(EOL_position>0) /* xreddymn Dec-16-2004 MMI-SPR-27384: two line display */
1720 {
1721 dspl_TextOut(x2,(U16)ay+i*fh+hfh/*MC, 1319*/,DSPL_TXTATTR_UNICODE,(char*)(txt+(EOL_position<<1)));
1722 }
1723 }
1724 else
1725 #endif
1726 {
1727 // Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462
1728 #ifdef FF_MMI_SAT_ICON
1729 if (icn != NULL)
1730 {
1731 if(icn->selfExplanatory == FALSE)
1732 dspl_TextOut(titleIconWidth + x,(U16)(ay+i*fh),DSPL_TXTATTR_CURRENT_MODE,txt);
1733 }
1734 else
1735 dspl_TextOut(x,(U16)(ay+i*fh),DSPL_TXTATTR_CURRENT_MODE,txt);
1736 #else
1737 dspl_TextOut(x,(U16)(ay+i*fh),DSPL_TXTATTR_CURRENT_MODE,txt);
1738 #endif
1739 if(EOL_position>0) /* xreddymn Dec-16-2004 MMI-SPR-27384: two line display */
1740 {
1741 dspl_TextOut(x2,(U16)(ay+i*fh+hfh),DSPL_TXTATTR_CURRENT_MODE,(char*)(txt+EOL_position));
1742 }
1743 }
1744 resources_restoreMnuColour();
1745
1746 }
1747 }
1748 if (icn != NULL)// && icn->nIcons > nIdx)
1749 {
1750 // Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462
1751 #ifdef FF_MMI_SAT_ICON
1752 /* There is a problem when this icon is displayed.
1753 The last parameter was not taken into consideration & a default '0' was been set. This is corrected now.*/
1754 /* dspl_BitBlt2(icn->area.px, icn->area.py,
1755 icn->area.sx, icn->area.sy,
1756 icn->icons, 0, icn->icnType);*/
1757
1758 if ((icn->area.sx > LINE_ICON_WIDTH) || (icn->area.sy > fh))
1759 {
1760 dspl_BitBlt2(icn->area.px, icn->area.py,
1761 icn->area.sx, icn->area.sy, (void*)SATIconQuestionMark, 0, BMP_FORMAT_256_COLOUR);
1762 }
1763 else
1764 {
1765 dspl_BitBlt2(icn->area.px, icn->area.py,
1766 icn->area.sx, icn->area.sy,
1767 icn->icons, 0, icn->icnType);
1768 }
1769 #else
1770 dspl_BitBlt2(icn->area.px,icn->area.py,
1771 icn->area.sx,icn->area.sy,
1772 icn->icons,(U16)nIdx,0);
1773 #endif
1774 }
1775 }
1776 i++;
1777 checkPostdraw(mnu,ma->items+nIdx); /* ES!! */
1778 }
1779
1780 if (oldFont != (U8) -1)
1781 dspl_SelectFontbyID(oldFont); /* restore previous font */
1782
1783 /* SPR#1983 - SH - No longer have to change text type back */
1784
1785 resources_restoreColour();
1786 #ifdef MFW_DEBUG_DISPLAY_SIZE
1787 dspl_DrawRect(ax,ay,(ax+aw-1),(ay+ah-1));
1788 #endif
1789 TIME_TRACE_EVENT("drawListMenu() end");
1790
1791 }
1792
1793
1794 /*
1795 +--------------------------------------------------------------------+
1796 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
1797 | STATE : code ROUTINE : drawFreeMenu |
1798 +--------------------------------------------------------------------+
1799
1800 PURPOSE : draws menu in overlapped mode
1801
1802 */
1803 static void drawFreeMenu (MfwMnu *mnu)
1804 {
1805 // ES!! to be revised
1806 //kk needs font entry
1807 int nFontHeight;
1808 int i, x;
1809 int nIdx;
1810 int nTextLen;
1811 MfwIcnAttr * icn;
1812
1813 MfwMnuAttr *wa; /* working attribute */
1814
1815
1816 wa = mnu->curAttr;
1817 dspl_Clear(wa->area->px,wa->area->py,
1818 (U16)(wa->area->sx+wa->area->px-1),
1819 (U16)(wa->area->sy+wa->area->py-1));
1820 nFontHeight = dspl_GetFontHeight();
1821 nTextLen = dspl_GetTextExtent(wa->items[mnu->lCursor[mnu->level]].str,
1822 (U16)dspl_str_length(wa->items[mnu->lCursor[mnu->level]].str));
1823
1824 if ((wa->mode & MNU_ALIGN) == MNU_CENTER)
1825 x = wa->area->px + (wa->area->sx - nTextLen) / 2;
1826 else if ((wa->mode & MNU_ALIGN) == MNU_RIGHT)
1827 x = wa->area->px + wa->area->sx - nTextLen;
1828 else
1829 x = wa->area->px;
1830
1831 dspl_TextOut((U16)x,(U16)(wa->area->py+wa->area->sy-nFontHeight),DSPL_TXTATTR_CURRENT_MODE,
1832 wa->items[mnu->lCursor[mnu->level]].str);
1833
1834 for (i = 0; i < wa->nItems; i++)
1835 {
1836 nIdx = (mnu->lCursor[mnu->level] + i + 1) % wa->nItems;
1837 icn = wa->items[nIdx].icon;
1838 if (icn != NULL)
1839 dspl_BitBlt(icn->area.px,icn->area.py,
1840 icn->area.sx,icn->area.sy,
1841 0/*icn->usIndex*/,icn->icons,0);
1842 }
1843 }
1844
1845
1846 /*
1847 +--------------------------------------------------------------------+
1848 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
1849 | STATE : code ROUTINE : mnuCommand |
1850 +--------------------------------------------------------------------+
1851
1852 PURPOSE : handle mfw windows command
1853
1854 */
1855
1856 static int mnuCommand (U32 cmd, void *h)
1857 {
1858 switch (cmd)
1859 {
1860 case MfwCmdDelete: /* delete me */
1861 if (!h)
1862 return 0;
1863 mnuDelete(h);
1864 return 1;
1865 case MfwCmdUpdate: /* repaint */
1866 if (!h || ((MfwHdr *) h)->type != MfwTypMnu)
1867 return 0;
1868 mnuUpdate(((MfwHdr *) h)->data);
1869 return 1;
1870 default:
1871 break;
1872 }
1873
1874 return 0;
1875 }
1876
1877
1878 /*
1879 +--------------------------------------------------------------------+
1880 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
1881 | STATE : code ROUTINE : mnuScrollMode |
1882 +--------------------------------------------------------------------+
1883
1884 PURPOSE : handle mfw windows command
1885
1886 */
1887
1888 void mnuScrollMode (MfwHnd menu,U8 mode)
1889 {
1890 MfwMnu *mnu;
1891
1892 if ((mnu = mfwControl(menu)) == 0)
1893 return;
1894 mnu->scrollMode = mode;
1895 }
1896
1897
1898 void mnuInitDataItem(MfwMnuItem* mnuItem)
1899 {
1900 mnuItem->icon = 0;
1901 mnuItem->exta = 0;
1902 mnuItem->menu = 0;
1903 mnuItem->func = 0;
1904 mnuItem->str = NULL;
1905 mnuItem->flagFunc = 0;
1906
1907 }
1908
1909 /*
1910 +--------------------------------------------------------------------+
1911 | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
1912 | STATE : code ROUTINE : mnuIdentify |
1913 +--------------------------------------------------------------------+
1914
1915 PURPOSE : SPR998 - SH - Identify menu option. Returns the index of the option, or -1
1916 if option is not found.
1917
1918 */
1919
1920 int mnuIdentify(struct MfwMnuAttrTag *attr, struct MfwMnuItemTag *item)
1921 {
1922 int index;
1923 int currentOption;
1924
1925 /* Identify current menu option */
1926
1927 currentOption = -1;
1928
1929 for (index=0; index < attr->nItems; index++)
1930 {
1931 if (&attr->items[index]==item)
1932 currentOption = index;
1933 }
1934
1935 return currentOption;
1936 }
1937
1938
1939 MMI_TRACE_P1(char* str, int err)
1940 {
1941 TRACE_EVENT_P2("%s:%d",str,err);
1942 }
1943
1944