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

Symbian

开发平台:

C/C++

  1. /*****************************************************************************
  2.  * chxavinfolist.cpp
  3.  * -----------------
  4.  *
  5.  * Synopsis:
  6.  * Info list manager for stuff.
  7.  *
  8.  *
  9.  *
  10.  * Target:
  11.  * Symbian OS
  12.  *
  13.  *
  14.  * (c) 1995-2003 RealNetworks, Inc. Patents pending. All rights reserved.
  15.  *
  16.  *****************************************************************************/
  17. // Symbian includes...
  18. #include <e32base.h>
  19. #include <badesca.h>
  20. #include <bamdesca.h>
  21. #include <coeutils.h>
  22. #include <aknenv.h>
  23. // Includes from this project...
  24. #include "chxavmisc.h"
  25. #include "chxavinfolist.h"
  26. #include "chxavcleanupstack.h"
  27. #include "chxavcleanstring.h" 
  28. #include "chxavmiscconstants.h"
  29. ///////////////////////////////////
  30. // ctor
  31. CHXAvInfoList::CHXAvInfoList()
  32. {
  33. }
  34. ///////////////////////////////////
  35. // dtor
  36. CHXAvInfoList::~CHXAvInfoList()
  37. {
  38. }
  39. void CHXAvInfoList::ConstructL()
  40. {
  41.     m_pFont = CEikonEnv::Static()->NormalFont();
  42.     m_pLabels = new (ELeave) CDesCArrayFlat( CHXAvMisc::k_defaultArrayGranularity ); 
  43.     m_pFields = new (ELeave) CDesCArrayFlat( CHXAvMisc::k_defaultArrayGranularity ); 
  44.     const TInt k_cchMaxDisplayLine = 50;
  45.     m_pbuff = HBufC::NewL(k_cchMaxDisplayLine);
  46. }
  47. ///////////////////////////////////
  48. //
  49. void CHXAvInfoList::AddLineL(const TDesC& caption, const TDesC& fieldText, AddLineFlag flag)
  50. {
  51.     // make sure field is stripped of bad (unprintable) characters (caption is assumed good)
  52.     HBufC* pFixedText = CHXAvMisc::AllocDisplayFriendlyStringL(fieldText);
  53.     AUTO_PUSH_POP_DEL(pFixedText);
  54.     if( 0 == pFixedText->Length() &&  skipEmptyLine == flag )
  55.     {
  56.         // skip this; we don't display lines with empty fields
  57.         return;
  58.     }
  59.     HBufC* pField = 0;
  60.     if (pFixedText->Length())
  61.     {
  62.         pField = pFixedText->AllocL();
  63.     }
  64.     else
  65.     {
  66.         pField = CHXAvMisc::KOneSpace().AllocL();
  67.     }
  68.     AUTO_PUSH_POP_DEL(pField);
  69.     CArrayFix<TInt>* pWidths = new ( ELeave ) CArrayFixFlat<TInt>(CHXAvMisc::k_defaultArrayGranularity);
  70.     AUTO_PUSH_POP_DEL(pWidths);
  71.     TInt cxFieldText = m_pFont->TextWidthInPixels(fieldText);
  72.     if( cxFieldText > CHXAvMisc::k_cxMaxPopupListBoxLine )
  73.     {
  74.         TInt lineCount = cxFieldText / CHXAvMisc::k_cxMaxPopupListBoxLine + 2;
  75.         pWidths->AppendL( CHXAvMisc::k_cxMaxPopupListBoxLine, lineCount );
  76.     }
  77.     else
  78.     {
  79.         pWidths->AppendL( CHXAvMisc::k_cxMaxPopupListBoxLine, 4);
  80.     }
  81.     //
  82.     // split up field into lines: pField -> array of broken up lines (pLines)
  83.     //
  84.     CArrayFix<TPtrC>* pLines = new ( ELeave ) CArrayFixFlat<TPtrC>(CHXAvMisc::k_defaultArrayGranularity);
  85.     AUTO_PUSH_POP_DEL(pLines);
  86.     AknTextUtils::WrapToArrayL( 
  87.         *pField,
  88.         *pWidths, 
  89.         *m_pFont,
  90.         *pLines );
  91.     // add as many lines as necessary to fully display field of text
  92.     const TInt count = pLines->Count();
  93.     for ( TInt idx = 0; idx < count; ++idx )
  94.     {
  95.         // caption field
  96.         if (0 == idx)
  97.         {
  98.             // first line gets actual caption
  99.             m_pLabels->AppendL(caption);
  100.         }
  101.         else
  102.         {
  103.             m_pLabels->AppendL(CHXAvMisc::KOneSpace);
  104.         }
  105.         // value field
  106.         m_pFields->AppendL((*pLines)[idx]);
  107.     }
  108. }
  109. ///////////////////////////////////
  110. // add one or more lines (as many as necessary) to display 
  111. // given field of text
  112. //
  113. void CHXAvInfoList::AddLineL(TInt idCaptionText, const TDesC& fieldText, AddLineFlag flag)
  114. {
  115.     CHXAvCleanString caption(idCaptionText);
  116.     AddLineL(caption(), fieldText, flag);
  117. }
  118. ///////////////////////////////////
  119. //
  120. void CHXAvInfoList::AddLinesL(const MDesCArray* pCaptions, const MDesCArray* pFields, AddLineFlag flag)
  121. {
  122.     HX_ASSERT(pCaptions->MdcaCount() == pFields->MdcaCount());
  123.     TInt count = pCaptions->MdcaCount();
  124.     for(TInt idx = 0; idx < count; ++idx)
  125.     {
  126.         AddLineL(pCaptions->MdcaPoint(idx), pFields->MdcaPoint(idx), flag);
  127.     }
  128. }
  129. ///////////////////////////////////
  130. //
  131. TInt CHXAvInfoList::MdcaCount() const
  132. {
  133.     return m_pLabels->Count();
  134. }
  135. ///////////////////////////////////
  136. //
  137. TPtrC CHXAvInfoList::MdcaPoint(TInt aIndex) const
  138. {
  139.     TPtr ptr = m_pbuff->Des();
  140.     ptr.Zero();
  141.     ptr.Append((*m_pLabels)[aIndex]);
  142.     ptr.Append(CHXAvMisc::KListColumnDelimiter);
  143.     ptr.Append((*m_pFields)[aIndex]);
  144.     return ptr;
  145. }