testxres.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:19k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #ifndef _UNIX
  36. #include <windows.h>
  37. #endif
  38. #include "hxtypes.h"
  39. #include "hxresult.h"
  40. #include "pnpeff.h"
  41. #include "dllacces.h"
  42. #include "dllpath.h"
  43. #include "hxslist.h"
  44. #include "pnxres.h"
  45. #include "pnxbmp.h"
  46. #include "hlxclib/stdlib.h"
  47. #include "hlxclib/string.h"
  48. #include "hlxclib/stdio.h"
  49. #include "chxdataf.h"
  50. #include "hxassert.h"
  51. #include "pnxdlog.h"
  52. #include "pnxmenu.h"
  53. #include "pnxmbar.h"
  54. #include "pnxcrsr.h"
  55. #include "pnxicon.h"
  56. ENABLE_DLLACCESS_PATHS(Testxres);
  57. #ifdef _MACINTOSH
  58. #include <console.h>
  59. #include "macfd.h"
  60. #include "resource.h"
  61. void    AddSubMenu(MenuHandle   menu, CHXXMenu* pMenu,UINT16*  index);
  62. #endif
  63. #ifdef _UNIX
  64. #include <fcntl.h> // for O_CREAT, O_WRONLY, etc.
  65. #include <Xm/PushB.h>
  66. #include "xpm.h"
  67. //#include <X11/xpm.h>
  68. #endif
  69. ULONG32         gSubMenuID=2;
  70. ULONG32         gSubLevel=1;
  71. typedef HX_RESULT (HXEXPORT_PTR FPCREATEINSTANCE) (IUnknown** /*OUT*/ ppIUnknown);
  72. BOOL OpenLibPNCreateInstance(char* dllName, UINT32 uDLLNameLen, const char* szShortName,const char* szLongName,DLLAccess& lib,IUnknown** pObj)
  73. {
  74.     
  75.     DLLAccess::CreateName(szShortName,szLongName, dllName, uDLLNameLen);
  76.     if (DLLAccess::DLL_OK != lib.open(dllName))
  77. return(FALSE);
  78.     FPCREATEINSTANCE fpCreateInstance = (FPCREATEINSTANCE)lib.getSymbol("HXCreateInstance");
  79.     fpCreateInstance(pObj);
  80.     HX_ASSERT(*pObj);
  81.     if (!*pObj)
  82. return FALSE;
  83.     return TRUE;
  84. }
  85. extern "C" int main (int argc,char** argv)
  86. {
  87.   IHXXResource*  rsrc;
  88. #ifdef _MACINTOSH
  89. InitGraf(&qd.thePort);
  90. InitFonts();
  91. FlushEvents(everyEvent, 0);
  92. InitWindows();
  93. InitMenus();
  94. TEInit();
  95. InitDialogs(nil);
  96. InitCursor();
  97. DrawMenuBar();  
  98. argc = ccommand(&argv);
  99. #endif
  100. DLLAccess           PNXResLib;
  101. //
  102. //      SIMPLE TEST
  103. //
  104. IHXXResFile*           theFile=NULL;
  105. UINT16          ID;
  106.     // used for DLL name creation
  107.     const UINT32 MAX_DLL_NAME_LEN = 256;
  108.     char dllName[MAX_DLL_NAME_LEN]; /* Flawfinder: ignore */
  109.     UINT32 uDLLNameLen = MAX_DLL_NAME_LEN;
  110. if (!OpenLibPNCreateInstance(dllName,uDLLNameLen,"pnxr","pnxres",PNXResLib,(IUnknown**)&theFile))
  111. {
  112. printf("ERROR: Could not find %sn",dllName);
  113. return 0;
  114. }
  115. if (strcmp(argv[1],"CACHETEST")==0)
  116. {
  117. if (HXR_OK != theFile->Open(argv[2]))
  118. {
  119. printf("ERROR: file could not be opened.n");
  120. }
  121. for (int x=101; x<=115; x++)
  122. {
  123. if (HXR_OK==theFile->GetResource(HX_RT_BITMAP,x,&rsrc))
  124. {
  125. rsrc->Release();
  126. }
  127. }
  128. theFile->Close();
  129. return 0;
  130. }
  131. if (strcmp(argv[1],"DIALOG")==0)
  132. {
  133. if (HXR_OK != theFile->Open(argv[2]))
  134. {
  135. printf("ERROR: File could not be openend.n");
  136. }
  137. ULONG32 id=atoi(argv[3]);
  138. IHXXResource*  rsrc;
  139. if (HXR_OK == theFile->GetResource(HX_RT_DIALOG,id,&rsrc))
  140. {
  141. CHXXDialog*     theDialog=CHXXDialog::create(rsrc);
  142. rsrc->Release();
  143. //
  144. //      Draw out the things in the dialog, into a Window so that we can see how
  145. //      it is layed out.
  146. //
  147. #ifdef _MACINTOSH
  148. HX_DialogBoxHeader*       dlgh;
  149. HX_ControlData*           c=NULL;
  150. short                             index=0;
  151. GrafPtr         saveport; GetPort(&saveport);
  152. HX_RESULT       GetDialogHeader(HX_DialogBoxHeader**            h);
  153. theDialog->GetDialogHeader(&dlgh);
  154. Rect            wRect={50,50,dlgh->cy+50,dlgh->cx+50};
  155. WindowPtr       myWind=NewWindow(NULL,&wRect,"pStringParsing",TRUE,2,(WindowPtr)-1L, FALSE,NULL); 
  156. ShowWindow(myWind);
  157. SetPort(myWind);
  158. //
  159. //      Draw my dialog's items
  160. //
  161. while (HXR_OK==theDialog->GetNthControl(&c,index))
  162. {
  163. Rect  iRect={c->y,c->x,c->cy+c->y,c->cx+c->x};
  164. FrameRect(&iRect);
  165. index++;
  166. }
  167. while (!Button())
  168. {
  169. EventRecord     theEvent;
  170. WaitNextEvent(everyEvent,&theEvent,0xFF,NULL);
  171. }
  172. DisposeWindow(myWind);
  173. SetPort(saveport);
  174. #endif  
  175. }
  176. else
  177. {
  178. printf("ERROR: Dialog resource %d not found.",id);
  179. }
  180. return 0;
  181. }
  182. //
  183. //      Test the ability to display a bitmap.
  184. //
  185. if (strcmp(argv[1],"BITMAP")==0)
  186. {
  187. if (HXR_OK != theFile->Open(argv[2]))
  188. {
  189. printf("ERROR: File could not be openend.n");
  190. }
  191. ULONG32 id=atoi(argv[3]);
  192. IHXXResource*  rsrc=NULL;
  193. if (HXR_OK == theFile->GetResource(HX_RT_BITMAP,id,&rsrc))
  194. {
  195. #ifdef _MACINTOSH
  196. short                             index=0;
  197. GrafPtr         saveport; GetPort(&saveport);
  198. Rect            wRect={50,50,600,800};
  199. WindowPtr       myWind=NewWindow(NULL,&wRect,"pStringParsing",TRUE,2,(WindowPtr)-1L, FALSE,NULL); 
  200. ShowWindow(myWind);
  201. SetPort(myWind);
  202. //
  203. //      Okay make a CHXXBmp object, and feed the resource data we got into it.
  204. //              
  205. CHXXBitmap*        bmp;
  206. bmp=CHXXBitmap::create(rsrc);
  207. rsrc->Release();
  208. if (bmp)
  209. {
  210. Rect*   rect=*bmp;
  211. PixMapHandle thePixMap = GetGWorldPixMap( ( GWorldPtr ) *bmp );
  212. CopyBits((const BitMap*)*thePixMap,(const BitMap*)&myWind->portBits,*bmp,*bmp,srcCopy,NULL);
  213. ValidRect((Rect*)bmp);
  214. }
  215. while (!Button())
  216. {
  217. EventRecord     theEvent;
  218. WaitNextEvent(everyEvent,&theEvent,0xFF,NULL);
  219. }
  220. DisposeWindow(myWind);
  221. SetPort(saveport);
  222. bmp->Release();
  223. #endif  
  224. #ifdef _UNIX
  225. //
  226. //      Generate an XPM file.
  227. //                      
  228. CHXXBitmap* bmp;
  229. bmp=CHXXBitmap::create(rsrc);
  230. rsrc->Release();
  231. CHXDataFile*    outputfile;
  232. outputfile=CHXDataFile::Construct();
  233. if (outputfile)
  234. {               
  235. printf ("Width=%d Height=%dnconverteddata=0x%x converteddatasize=%dncommondata=0x%x commondatasize=%dn",
  236. bmp->m_Width,
  237. bmp->m_Height,
  238. bmp->m_ConvertedData,
  239. bmp->m_ConvertedDataSize,
  240. bmp->m_CommonData,
  241. bmp->m_CommonDataSize);
  242. outputfile->Open(argv[4],O_RDWR|O_CREAT);
  243. //outputfile->Write((char*)*bmp,strlen(*bmp));
  244. outputfile->Write((char*)(bmp->m_ConvertedData),bmp->m_ConvertedDataSize);
  245. outputfile->Close();
  246. delete outputfile;
  247. }
  248. else
  249. {
  250. printf("Could not create file object.r");
  251. }
  252. #if 1
  253. XtAppContext app;
  254. Widget top, button;
  255. int status;
  256. Pixmap pixmap;
  257. XpmImage image;
  258. top = XtAppInitialize(&app, "TestButton", NULL, 0, &argc, argv,
  259. NULL, NULL, 0);
  260. button = XmCreatePushButton(top, "button", NULL, 0);
  261. status = XpmCreateXpmImageFromData ((CHAR **)(bmp->m_ConvertedData),
  262. &image, NULL);
  263. status = XpmCreatePixmapFromXpmImage (XtDisplay(top),
  264. XRootWindowOfScreen(XtScreen(top)),
  265. &image, &pixmap, NULL, NULL);
  266. if (status != XpmSuccess)
  267. {
  268. fprintf (stderr, "XpmError:  %sn", XpmGetErrorString(status));
  269. exit(1);
  270. }
  271. XtVaSetValues(button,
  272. XmNlabelType, XmPIXMAP,
  273. XmNlabelPixmap, pixmap,
  274. NULL);
  275. XtManageChild(button);
  276. XtRealizeWidget(top);
  277. XtAppMainLoop(app);
  278. #endif
  279. delete bmp;
  280. #endif
  281. }
  282. else
  283. {
  284. printf("ERROR: Dialog resource %d not found.",id);
  285. }
  286. return 0;
  287. }
  288. if (strcmp(argv[1],"BITMAPFILE")==0)
  289. {
  290. {
  291. ULONG32 id=atoi(argv[3]);
  292. #ifdef _MACINTOSH
  293. c2pstr(argv[2]);
  294. FSSpec  theFileSpec;
  295. short   fileRef=0;
  296. long    eof=0;
  297. FSMakeFSSpec(0,0,(StringPtr)argv[2],&theFileSpec);
  298. FSpOpenDF(&theFileSpec,fsRdPerm,&fileRef);
  299. GetEOF(fileRef,&eof);
  300. BYTE*   buffer=new BYTE[eof];
  301. BYTE*   p=buffer+14;
  302. HX_ASSERT(buffer);
  303. FSRead(fileRef,&eof,buffer);
  304. FSClose(fileRef);
  305. short                             index=0;
  306. GrafPtr         saveport; GetPort(&saveport);
  307. Rect            wRect={50,50,600,800};
  308. WindowPtr       myWind=NewWindow(NULL,&wRect,"pStringParsing",TRUE,2,(WindowPtr)-1L, FALSE,NULL); 
  309. ShowWindow(myWind);
  310. SetPort(myWind);
  311. //
  312. //      Okay make a CHXXBmp object, and feed the resource data we got into it.
  313. //              
  314. CHXXBitmap*        bmp;
  315. bmp=CHXXBitmap::create((HX_BITMAPINFO*)p);
  316. if (bmp)
  317. {
  318. Rect*   rect=*bmp;
  319. PixMapHandle thePixMap = GetGWorldPixMap( ( GWorldPtr ) *bmp );
  320. CopyBits((const BitMap*)*thePixMap,(const BitMap*)&myWind->portBits,*bmp,*bmp,srcCopy,NULL);
  321. ValidRect((Rect*)bmp);
  322. }
  323. while (!Button())
  324. {
  325. EventRecord     theEvent;
  326. WaitNextEvent(everyEvent,&theEvent,0xFF,NULL);
  327. }
  328. DisposeWindow(myWind);
  329. SetPort(saveport);
  330. bmp->Release();
  331. #endif  
  332. #ifdef _UNIX
  333. //
  334. //      Generate an XPM file.
  335. //                      
  336. CHXXBitmap* bmp;
  337. bmp=CHXXBitmap::create(rsrc);
  338. rsrc->Release();
  339. CHXDataFile*    outputfile;
  340. outputfile=CHXDataFile::Construct();
  341. if (outputfile)
  342. {               
  343. outputfile->Create(argv[4],O_CREAT);
  344. outputfile->Open(argv[4],O_WRONLY);
  345. outputfile->Write((char*)*bmp,strlen(*bmp));
  346. outputfile->Close();
  347. delete outputfile;
  348. }
  349. else
  350. {
  351. printf("Could not create file object.r");
  352. }
  353. delete bmp;
  354. #endif
  355. }
  356. return 0;
  357. }
  358. if (strcmp(argv[1],"ICON")==0)
  359. {
  360. if (HXR_OK != theFile->Open(argv[2]))
  361. {
  362. printf("ERROR: file could not be opened.n");
  363. }
  364. else
  365. {
  366. ULONG32 id=atoi(argv[3]);
  367. #ifdef _MACINTOSH
  368. short                             index=0;
  369. GrafPtr         saveport; GetPort(&saveport);
  370. Rect            wRect={50,50,600,800};
  371. WindowPtr       myWind=NewWindow(NULL,&wRect,"pStringParsing",TRUE,2,(WindowPtr)-1L, FALSE,NULL); 
  372. ShowWindow(myWind);
  373. SetPort(myWind);
  374. //
  375. // Load the icon first
  376. //
  377. IHXXResource*    iconresource;
  378. if (HXR_OK==theFile->GetResource(HX_RT_GROUPICON,id,&rsrc))
  379. {
  380. //
  381. // Create an Icon parser object
  382. //
  383. CHXXIcon*    icon;
  384. icon=CHXXIcon::create(rsrc);
  385. #if 0 /* needs to be re-worked with new icon drawing code */
  386. if (icon)
  387. {
  388. CIconHandle        macicon;
  389. macicon=icon->GetIconHandle();
  390. Rect aRect={0,0,31,31};
  391. FillRect(&aRect,&qd.ltGray);
  392. PlotCIcon(&aRect,macicon);
  393. aRect.top+=32;
  394. aRect.bottom+=32;
  395. FillRect(&aRect,&qd.gray);
  396. PlotCIcon(&aRect,macicon);
  397. aRect.top+=32;
  398. aRect.bottom+=32;
  399. FillRect(&aRect,&qd.dkGray);
  400. PlotCIcon(&aRect,macicon);
  401. aRect.top+=32;
  402. aRect.bottom+=32;
  403. FillRect(&aRect,&qd.white);
  404. PlotCIcon(&aRect,macicon);
  405. aRect.top+=32;
  406. aRect.bottom+=32;
  407. FillRect(&aRect,&qd.black);
  408. PlotCIcon(&aRect,macicon);
  409. while (!Button())
  410. {
  411. EventRecord     theEvent;
  412. WaitNextEvent(everyEvent,&theEvent,0xFF,NULL);
  413. }
  414. HX_DELETE(icon);
  415. }
  416. #endif //
  417. HX_RELEASE(rsrc);
  418. }
  419. DisposeWindow(myWind);
  420. SetPort(saveport);
  421. #endif  
  422. }
  423. return 0;
  424. }
  425. //
  426. //      Menu test
  427. //
  428. if (strcmp(argv[1],"MENU")==0)
  429. {
  430. if (HXR_OK != theFile->Open(argv[2]))
  431. {
  432. printf("ERROR: File could not be openend.n");
  433. }
  434. ULONG32 id=atoi(argv[3]);
  435. IHXXResource*  rsrc=NULL;
  436. if (HXR_OK == theFile->GetResource(HX_RT_MENU,id,&rsrc))
  437. {               
  438. #ifdef _MACINTOSH
  439. CHXXMenu*        pMenu=CHXXMenu::create(rsrc);
  440. rsrc->Release();
  441. if (!pMenu)
  442. {
  443. return;
  444. }
  445. UINT16                          menuid=atoi(argv[3]);
  446. UINT16                          index=0;
  447. MenuHandle                      mainmenu;
  448. MenuHandle                      submenus[10];
  449. HX_MenuItem*            mi=NULL;
  450. ConstStr255Param        pstring;
  451. UINT16                          curitem=1;
  452. memset(submenus,0,sizeof(submenus));
  453. if (HXR_OK==pMenu->GetNthMenuItem(&mi,0))
  454. {
  455. CHXString       thestring;
  456. thestring=mi->szItemText;
  457. pstring=thestring;
  458. mainmenu=NewMenu(menuid,pstring);
  459. index=1;
  460. while (HXR_OK==pMenu->GetNthMenuItem(&mi,index))
  461. {
  462. pstring=mi->szItemText;
  463. if (!IS_POPUP_MENUITEM(mi))
  464. {
  465. if (IS_SEPARATOR_MENUITEM(mi))
  466. {
  467. AppendMenu(mainmenu,"p-");
  468. }
  469. AppendMenu(mainmenu,pstring);
  470. if (IS_DISABLED_MENUITEM(mi))
  471. {
  472. DisableItem(mainmenu,curitem);                                                  
  473. }
  474. if (IS_CHECKED_MENUITEM(mi))
  475. {
  476. CheckItem(mainmenu,curitem,TRUE);                                                       
  477. }                                               
  478. if (mi->wKey && (mi->fKeyFlags & HX_FCONTROL))
  479. {
  480. SetItemCmd(mainmenu,curitem,mi->wKey);
  481. }       
  482. }
  483. else
  484. {
  485. AddSubMenu(mainmenu,pMenu,&index);      
  486. }
  487. index++;
  488. curitem++;
  489. }
  490. InsertMenu(mainmenu,0);
  491. EventRecord     theEvent;
  492. DrawMenuBar();                          
  493. while (true)
  494. {
  495. if (WaitNextEvent(everyEvent,&theEvent,0xFF,NULL))
  496. {
  497. if (theEvent.what==autoKey)
  498. {
  499. break;
  500. }
  501. if (theEvent.what==mouseDown)
  502. {
  503. WindowPtr       whichWin;
  504. short part = FindWindow(theEvent.where,&whichWin);
  505. if (part == inMenuBar)
  506. {
  507. MenuSelect(theEvent.where);
  508. }
  509. }       
  510. }
  511. }
  512. }
  513. #endif
  514. #if 0
  515. //#ifdef _UNIX
  516. CHXXMenu*        pMenu=CHXXMenu::create(rsrc);
  517. HX_MenuItem*            mi=NULL;
  518. if (HXR_OK==pMenu->GetNthMenuItem(&mi,0))
  519. printf ("Menu: 0x%xnItem: %s %s %sn", pMenu, mi->szItemText, mi->szAcceleratorText, mi->szStatusText);
  520. #endif
  521. }
  522. }
  523. if (strcmp(argv[1],"MENUBAR")==0)
  524. {
  525. if (HXR_OK != theFile->Open(argv[2]))
  526. {
  527. printf("ERROR: file could not be opened.n");
  528. }
  529. ULONG32 id=atoi(argv[3]);
  530. IHXXResource*  rsrc=NULL;
  531. if (HXR_OK == theFile->GetResource(HX_RT_MENU,id,&rsrc))
  532. {               
  533. #ifdef _MACINTOSH
  534. CHXXMenuBar*    menubar=CHXXMenuBar::create(rsrc);
  535. ULONG32 index=0;
  536. CHXXMenu*               menu=NULL;
  537. gSubLevel=0;
  538. while (HXR_OK==menubar->GetMenuByIndex(&menu,index))
  539. {
  540. gSubLevel=0;
  541. UINT16  itemindex=0;
  542. AddSubMenu(NULL,menu,&itemindex);
  543. index++;
  544. }
  545. EventRecord     theEvent;
  546. DrawMenuBar();                          
  547. while (true)
  548. {
  549. if (WaitNextEvent(everyEvent,&theEvent,0xFF,NULL))
  550. {
  551. if (theEvent.what==autoKey)
  552. {
  553. break;
  554. }
  555. if (theEvent.what==mouseDown)
  556. {
  557. WindowPtr       whichWin;
  558. short part = FindWindow(theEvent.where,&whichWin);
  559. if (part == inMenuBar)
  560. {
  561. MenuSelect(theEvent.where);
  562. }
  563. }       
  564. }
  565. }
  566. #endif                  
  567. #if 0
  568. //#ifdef _UNIX
  569.             CHXXMenuBar*    menubar=CHXXMenuBar::create(rsrc);
  570. #endif                  
  571. }
  572. theFile->Close();
  573. return 0;
  574. }       
  575. if (strcmp(argv[1],"CURSOR")==0)
  576. {
  577. if (HXR_OK != theFile->Open(argv[2]))
  578. {
  579. printf("ERROR: file could not be opened.n");
  580. }
  581. ULONG32 id=atoi(argv[3]);
  582. IHXXResource*  rsrc=NULL;
  583. if (HXR_OK == theFile->GetResource(HX_RT_GROUPCURSOR,id,&rsrc))
  584. {               
  585. CHXXCursor*             theCursor=CHXXCursor::create(rsrc);
  586. #ifdef _MACINTOSH                
  587. HX_ASSERT(theCursor);
  588. if (theCursor)
  589. {
  590. SetCursor(*theCursor);
  591. }
  592. while (!Button())
  593. {
  594. EventRecord     theEvent;
  595. WaitNextEvent(everyEvent,&theEvent,0xFF,NULL);
  596. }
  597. #endif                
  598. }
  599. theFile->Close();
  600. return 0;
  601. }       
  602. if (strcmp(argv[1],"STRING")==0)
  603. {
  604. if (HXR_OK != theFile->Open(argv[2]))
  605. {
  606. printf("ERROR: File could not be opened.n");
  607. }
  608. IHXXResource*   res;
  609. ID= atoi(argv[3]);
  610. res=theFile->GetString(ID);
  611. if (res)
  612. {
  613. printf("%s",(char*)res->ResourceData());
  614. res->Release();
  615. }
  616. theFile->Close();
  617. return 0;
  618. }
  619. return 0;
  620. }
  621. #ifdef _MACINTOSH
  622. void    AddSubMenu(MenuHandle   menu, CHXXMenu* pMenu,UINT16*  index)
  623. {
  624. HX_MenuItem*    mi=NULL;
  625. pMenu->GetNthMenuItem(&mi,*index);
  626. MenuHandle      submenu=NewMenu(gSubMenuID++,mi->szItemText);
  627. ULONG32         curitem=1;
  628. if (menu)
  629. {
  630. InsertMenu  (submenu,-1);
  631. AppendMenu(menu,mi->szItemText);
  632. UINT16  thisitem=CountMenuItems(menu);
  633. SetItemCmd(menu,thisitem,hMenuCmd);
  634. SetItemMark(menu,thisitem,(char)(gSubMenuID-1));
  635. }
  636. else
  637. {
  638. InsertMenu (submenu,0);
  639. }               
  640. gSubLevel++;    
  641. (*index)++;
  642. while (HXR_OK==pMenu->GetNthMenuItem(&mi,*index))
  643. {
  644. if (IS_SEPARATOR_MENUITEM(mi))
  645. {
  646. AppendMenu(submenu,"p-");
  647. }
  648. if (mi->wSubLevel < gSubLevel)
  649. {
  650. (*index)--;
  651. gSubLevel--;
  652. return;
  653. }
  654. if (IS_POPUP_MENUITEM(mi))
  655. {
  656. AddSubMenu(submenu,pMenu,index);        
  657. }
  658. else
  659. {
  660. AppendMenu(submenu,mi->szItemText);     
  661. if (IS_DISABLED_MENUITEM(mi))
  662. {
  663. DisableItem(submenu,curitem);                                                   
  664. }
  665. if (IS_CHECKED_MENUITEM(mi))
  666. {
  667. CheckItem(submenu,curitem,TRUE);                                                        
  668. }
  669. if (mi->wKey && (mi->fKeyFlags & HX_FCONTROL))
  670. {
  671. SetItemCmd(submenu,curitem,mi->wKey);
  672. }               
  673. }
  674. curitem++;
  675. (*index)++;
  676. }
  677. }
  678. #endif