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

Symbian

开发平台:

C/C++

  1. /*****************************************************************************
  2.  * chxavmessagedialog.cpp
  3.  * ----------------------
  4.  *
  5.  * Synopsis:
  6.  * Contains the declaration of the CHXAvMessageDialog.  It's used to encapsulate
  7.  * nicely the diffent dialogs and warning boxes, requiring input or yes/no/cancel.
  8.  *
  9.  * Target:
  10.  * Symbian OS
  11.  *
  12.  *
  13.  * (c) 1995-2003 RealNetworks, Inc. Patents pending. All rights reserved.
  14.  *
  15.  *****************************************************************************/
  16. // Symbian includes...
  17. #include <eikdialg.h>
  18. #include <aknglobalnote.h>
  19. #include <aknnotedialog.h>
  20. #include <aknnotewrappers.h> 
  21. #include <aknquerydialog.h>
  22. #include <errorui.h>
  23. #include <aknprogressdialog.h>
  24. #include <aknmessagequerydialog.h> 
  25. // Helix includes...
  26. #include "hxstring.h"
  27. #include "hlxosstr.h"
  28. // Includes from this project...
  29. #include "chxavmisc.h"
  30. #include "chxavfileutil.h"
  31. #include "chxavcleanstring.h"
  32. #include "chxavmessagedialog.h"
  33. #include "chxavcleanupstack.h"
  34. #include "chxavmessagedialog.h"
  35. #include "realplayer.rsg"
  36. #include "realplayer.hrh"
  37. #include "chxavutil.h"
  38. // Local functions...
  39. namespace
  40. {
  41.     
  42. void SetInfoCbaHelper(CEikDialog* pDlg, CHXAvMessageDialog::InfoPromptType type)
  43. {
  44.      // possibly reset cba
  45.     CEikButtonGroupContainer& cba = pDlg->ButtonGroupContainer();
  46.     switch(type)
  47.     {
  48.     case CHXAvMessageDialog::PromptOk:
  49.         // use our own so ok is on right side like others
  50.         cba.SetCommandSetL(R_AVP_SOFTKEYS_OK);
  51.         break;
  52.     case CHXAvMessageDialog::PromptCancel:
  53.         cba.SetCommandSetL(R_AVKON_SOFTKEYS_CANCEL);
  54.         break;
  55.     case CHXAvMessageDialog::PromptBack:
  56.         cba.SetCommandSetL(R_AVKON_SOFTKEYS_BACK);
  57.         break;
  58.     case CHXAvMessageDialog::PromptClose:
  59.         cba.SetCommandSetL(R_AVKON_SOFTKEYS_CLOSE);
  60.         break;
  61.     }
  62. }
  63. void DoAlertHelperLD(CAknResourceNoteDialog* pDlg,
  64.                         const TDesC& text,
  65.                        CAknNoteDialog::TTimeout timeout,
  66.         CAknNoteDialog::TTone tone)
  67. {
  68.     pDlg->SetTimeout(timeout);
  69.     pDlg->SetTone(tone);
  70.     pDlg->ExecuteLD(text);
  71. }
  72. } // locals
  73. template<typename BaseClass>
  74. void CHXAvNoteWrapper<BaseClass>::PostLayoutDynInitL()
  75. {
  76.     BaseClass::PostLayoutDynInitL();
  77.     if(m_bAddCloseButton)
  78.     {
  79.         // show close button so user knows he can cancel
  80.         SetInfoCbaHelper(this, CHXAvMessageDialog::PromptClose);
  81.     }
  82. }
  83. void CHXAvMessageDialog::DoAlertConfirmL(const TDesC& text, 
  84.                      bool bModal,
  85.                      CAknNoteDialog::TTimeout timeout,
  86.      CAknNoteDialog::TTone tone)
  87. {
  88.     CAknConfirmationNote* pDlg = new (ELeave) CHXAvNoteWrapper<CAknConfirmationNote>(bModal, CAknNoteDialog::ENoTimeout == timeout);
  89.     DoAlertHelperLD(pDlg, text, timeout, tone);
  90. }
  91. HBufC* CHXAvMessageDialog::DoQueryTextL(const TDesC& prompt, const TDesC& defaultText, TUint cchMax)
  92.     HBufC* pBuff = HBufC::NewL(cchMax);
  93.     AUTO_PUSH_POP(pBuff); // out
  94.     //
  95.     // this handles case where defaultText > max (i.e., edit box is 
  96.     // initialized with a string that is longer than what user is supposed
  97.     // to be able to enter)
  98.     //
  99.     TUint cchMaxCopy = min( TUint(defaultText.Length()), cchMax);
  100.     // copy default text to appear in edit box
  101.     TPtr ptr = pBuff->Des();
  102.     ptr.Copy(defaultText.Ptr(), cchMaxCopy);
  103.     // in case filename has weird non-printable characters
  104.     CHXAvMisc::MakeDisplayFriendly(ptr);
  105.     TPtrC ptrPrompt(prompt);
  106.     CAknTextQueryDialog* pDlg = new (ELeave) CAknTextQueryDialog(ptr, ptrPrompt);
  107.     pDlg->PrepareLC(R_AVP_QUERY_TEXT_DIALOG);
  108.     pDlg->SetMaxLength(cchMax);
  109.     // default to lower case text entry mode (see AVKON EDWIN CONSTANTS in uikon.hrh)
  110.     CAknQueryControl* pQuery = static_cast<CAknQueryControl*>(pDlg->ControlOrNull(EGeneralQuery));
  111.     CEikEdwin* pEd = static_cast<CEikEdwin*>(pQuery->ControlByLayoutOrNull(EDataLayout));
  112.     pEd->SetAknEditorCase(EAknEditorLowerCase);
  113.     TInt res = pDlg->RunLD();
  114.     if(0 == res)
  115.     {
  116.         // user canceled
  117.         HX_DELETE(pBuff);
  118.     }
  119.     // user entered something
  120.     return pBuff;
  121. }
  122. ////////////////////////////////////////////
  123. //
  124. // ask for a filename (until user supplies a valid 
  125. // name or cancels)
  126. //
  127. // return 0 if user cancels
  128. //
  129. TFileName* CHXAvMessageDialog::GetFileNameFromUserL(const TDesC& prompt, 
  130.                                        const TDesC& oldName, 
  131.                                        TUint32 cchMaxName)
  132. {
  133.     
  134.     HX_ASSERT(cchMaxName <= KMaxFileName);
  135.     HX_ASSERT(cchMaxName > 0);
  136.     TPtrC ptrPrompt(prompt);
  137.     TFileName* pNameOut = new (ELeave) TFileName;
  138.     AUTO_PUSH_POP(pNameOut); // out
  139.     pNameOut->Copy(oldName);
  140.     bool bNeedToPrompt = true;
  141.     while(bNeedToPrompt)
  142.     {
  143.         HBufC* pbuff = CHXAvMessageDialog::DoQueryTextL(ptrPrompt, *pNameOut, cchMaxName);
  144. if( pbuff )
  145.         {
  146.             AUTO_PUSH_POP_DEL(pbuff);
  147.             pNameOut->Copy(*pbuff);
  148.     // check that name is valid
  149.             CHXAvFile::FileNameValidity validity = CHXAvFile::GetFileNameValidity(*pNameOut);
  150.             switch( validity )
  151.             {
  152.                 case CHXAvFile::nvValid:
  153.                     // good name!
  154.                     bNeedToPrompt = false;
  155.                     break;
  156.                 case CHXAvFile::nvInvalidIllegalChars:
  157.                     // 'name can't contain certain chars'
  158.                     DoAlertInfoL(CHXAvCleanString(R_ERR_INVALID_FILENAME_CHARS)());
  159.                     break;
  160.                 case CHXAvFile::nvTooLong:
  161.                     // user should be prevented from entering this via cchMaxName above
  162.                     HX_ASSERT(false); 
  163.                     // fall through...
  164.                 case CHXAvFile::nvInvalidDots:
  165.                 default:
  166.                     // 'unsuitable filename'
  167.                     DoAlertInfoL(CHXAvCleanString(R_ERR_INVALID_FILENAME_BAD)());
  168.                     break;
  169.             }
  170.    
  171. }
  172. else
  173. {
  174.     // cancel out
  175.     HX_DELETE(pNameOut);
  176.     bNeedToPrompt = false;
  177. }
  178.     }
  179.     return pNameOut;
  180. }
  181. void CHXAvMessageDialog::DoAlertErrorL(const TDesC& text, 
  182.                      bool bModal,
  183.                      CAknNoteDialog::TTimeout timeout,
  184.      CAknNoteDialog::TTone tone)
  185. {
  186.     CAknErrorNote* pDlg = new (ELeave) CHXAvNoteWrapper<CAknErrorNote>(bModal, CAknNoteDialog::ENoTimeout == timeout);
  187.     DoAlertHelperLD(pDlg, text, timeout, tone);
  188. }
  189. ////////////////////////////////////////////////
  190. // use this for info text that needs to be scrollable
  191. //
  192. void CHXAvMessageDialog::DoLongTextInfoPromptL(const TDesC& caption, const TDesC& text, InfoPromptType type)
  193. {
  194.     TPtrC ptr(text);
  195.     CAknMessageQueryDialog* pDlg = CAknMessageQueryDialog::NewL(ptr);
  196.     pDlg->PrepareLC(R_AVKON_MESSAGE_QUERY_DIALOG);
  197.     // save cleanupstack init until LD
  198.     {
  199.         AUTO_PUSH_POP(pDlg);
  200.         pDlg->MakeLeftSoftkeyVisible(EFalse);
  201.         pDlg->QueryHeading()->SetTextL(caption);
  202.         SetInfoCbaHelper(pDlg, type);
  203.     }
  204.     pDlg->RunLD();
  205. }
  206. void CHXAvMessageDialog::DoAlertInfoL(const TDesC& text, 
  207.                      bool bModal,
  208.                      CAknNoteDialog::TTimeout timeout,
  209.      CAknNoteDialog::TTone tone)
  210. {
  211.     CAknInformationNote* pDlg = new (ELeave) CHXAvNoteWrapper<CAknInformationNote>(bModal, CAknNoteDialog::ENoTimeout == timeout);
  212.     DoAlertHelperLD(pDlg, text, timeout, tone);
  213. }
  214. ////////////////////////////////////////////
  215. //
  216. TInt CHXAvMessageDialog::DoGlobalNoteL(TAknGlobalNoteType type, TInt textResID)
  217. {
  218.     CHXAvCleanString text(textResID);
  219.     return DoGlobalNoteL(type, text());
  220. }
  221. ////////////////////////////////////////////
  222. //
  223. TInt CHXAvMessageDialog::DoGlobalNoteL(TAknGlobalNoteType type, const TDesC& text)
  224. {
  225. /*
  226. aknnotifystd.h:
  227. EAknGlobalInformationNote
  228. EAknGlobalWarningNote
  229. EAknGlobalConfirmationNote
  230. EAknGlobalErrorNote
  231. EAknGlobalWaitNote
  232. EAknGlobalPermanentNote
  233. */
  234.     // caller must manage ids and ensure that only one note is be shown at
  235.     // a time; epoc debug build panics otherwise
  236.    
  237.     CAknGlobalNote* pNote = CAknGlobalNote::NewL();
  238.     AUTO_PUSH_POP_DEL(pNote);
  239.     return pNote->ShowNoteL(type, text); 
  240. }
  241. ////////////////////////////////////////////
  242. // cancel global note associated with given id
  243. //
  244. void CHXAvMessageDialog::CancelGlobalNoteL(TInt idNote)
  245. {
  246.     CAknGlobalNote* pNote = CAknGlobalNote::NewL();
  247.     AUTO_PUSH_POP_DEL(pNote);
  248.     pNote->CancelNoteL(idNote); 
  249.         
  250. }
  251. ////////////////////////////////////////////////////////
  252. // show modal; prompt for affirmative or negative
  253. //
  254. bool CHXAvMessageDialog::DoQueryL(TInt textResID, QueryPromptType type, CAknQueryDialog::TTone tone)
  255. {
  256.     CHXAvCleanString queryText(textResID);
  257.     return DoQueryL(queryText(), type, tone);
  258. }
  259. bool CHXAvMessageDialog::DoQueryL(const TDesC& promptText, QueryPromptType type, CAknQueryDialog::TTone tone)
  260. {
  261.     TPtrC ptr(promptText);
  262.     CAknQueryDialog* pDlg = new (ELeave) CAknQueryDialog(ptr, tone);
  263.     pDlg->PrepareLC(R_AVP_YES_NO_DIALOG);
  264.     // save cleanupstack init until LD
  265.     {
  266.         AUTO_PUSH_POP(pDlg);
  267.         // possibly reset cba
  268.         CEikButtonGroupContainer& cba = pDlg->ButtonGroupContainer();
  269.         switch(type)
  270.         {
  271.         case QueryYesNo:
  272.             // this is default
  273.             break;
  274.         case QueryOkCancel:
  275.             cba.SetCommandSetL(R_AVKON_SOFTKEYS_OK_CANCEL);
  276.             break;
  277.         case QueryOkBack:
  278.             cba.SetCommandSetL(R_AVKON_SOFTKEYS_OK_BACK);
  279.             break;
  280.         }
  281.     }
  282.     TInt res = pDlg->RunLD();
  283.     return 0 != res;
  284. }
  285. ////////////////////////////////////////////////
  286. //
  287. void CHXAvMessageDialog::DoSystemErrorNoteL(TInt err)
  288. {
  289.     // use system handler
  290.     CCoeEnv* pEnv = CCoeEnv::Static();
  291.     CErrorUI* pError = CErrorUI::NewL(*pEnv);
  292.     AUTO_PUSH_POP_DEL(pError);
  293.     pError->ShowGlobalErrorNoteL(err);
  294. }