📄 booklistview.cpp
字号:
/*
* ============================================================================
* Name : CBookListView from CAknView
* Part of : BookList
* Copyright (c) 2003 Nokia. All rights reserved.
* ============================================================================
*/
// INCLUDE FILES
#include <aknviewappui.h>
#include <akntitle.h>
#include <akncontext.h>
#include <eikaufty.h>
#include <eikmenup.h>
#include <aknwaitdialog.h> // CAknWaitDialog
#include <aknnotewrappers.h> // CAknInformationNote
#include <avkon.hrh> // EAknSoftkeyOk
#include <FairyLand.rsg>
#include "FairyLand.hrh"
#include <FairyLand.mbg> //for mbm
#include "FairyLandAppUi.h"
#include "BookListView.h"
#include "BookListContainer.h"
#include "BookOperationView.h"
#include "GridView.h"
#include "SMSOperationView.h"
#include "BookEngine.h"
#define MEM_FREE(p) if (NULL != p){delete p; p = NULL;}
_LIT(KStatusFormat, "%d: %S"); // Format string for status returned from web server, e.g. "200: OK" or "404: Not Found"
const TInt KStatusCodeLength = 10; // Enough room in a descriptor for code + ": "
// ================= MEMBER FUNCTIONS =======================
// C++ default constructor can NOT contain any code, that
// might leave.
//
CBookListView* CBookListView::NewL()
{
CBookListView* self = NewLC();
CleanupStack::Pop(self);
return self;
}
CBookListView* CBookListView::NewLC()
{
CBookListView* self = new (ELeave) CBookListView;
CleanupStack::PushL(self);
self->ConstructL();
return self;
}
void CBookListView::SendData(const TDesC& aFamily , const TDesC& aGiven , const TDesC& aMobile)
{
if(m_ArrayNo>=-1)
{
m_Family.Copy(aFamily);
m_Given.Copy(aGiven);
m_Mobile.Copy(aMobile);
}
}
TBool CBookListView::GetStutus()
{
return stutusFlag;
}
TBuf<32> CBookListView::GetDataFamily()
{
return m_Family;
}
TBuf<32> CBookListView::GetDataGiven()
{
return m_Given;
}
TBuf<32> CBookListView::GetDataMobile()
{
return m_Mobile;
}
CBookListView::CBookListView()
{
m_pBookEngine = NULL;
m_ArrayNo = -2;
m_Family.Zero();
m_Given.Zero();
m_Mobile.Zero();
}
// EPOC default constructor can leave.
void CBookListView::ConstructL()
{
BaseConstructL(R_BOOKLIST_VIEW);
}
// Destructor
CBookListView::~CBookListView()
{
}
// ---------------------------------------------------------
// TUid CBookListView::Id()
// Returns Id of the view.
// ---------------------------------------------------------
TUid CBookListView::Id() const
{
return KViewId10;
}
// ---------------------------------------------------------
// CBookListView::HandleCommandL(TInt aCommand)
// Handles commands
// ---------------------------------------------------------
void CBookListView::HandleCommandL(TInt aCommand)
{
switch(aCommand)
{
case EFairyLandNewBook:
{
m_ArrayNo = -1;
AppUi()->ActivateLocalViewL(KViewId11);
}
break;
case EFairyLandDeleteBook:
{
/* TInt nLstIndex = iContainer->GetSelectedIndexL();
if (nLstIndex >=0)
{
DeleteContact();
}
*/
DeleteContact();
if(m_pBookInfoArray.Count()>0)
m_nMenuFlag=1;
else
m_nMenuFlag=0;
}
break;
case EFairyLandModifyBook:
{
m_ArrayNo = iContainer->GetSelectedIndexL();
m_Given.Copy(m_pBookInfoArray[m_ArrayNo]->GetFirstName()->Des());
m_Family.Copy(m_pBookInfoArray[m_ArrayNo]->GetLastName()->Des());
m_Mobile.Copy(m_pBookInfoArray[m_ArrayNo]->GetTelephone()->Des());
// TPckgBuf< TViewPara > package(info);
// TBuf8<256> para; //要根据TViewPara所占的内存空间准备足够的buffer
// para.Copy( package );
AppUi()->ActivateLocalViewL( KViewId11 );
}
break;
case EFairyLandLookBook:
{
m_ArrayNo = -2;
stutusFlag = true;
// TViewPara info;
TInt nIndex = iContainer->GetSelectedIndexL();
m_Given.Copy(m_pBookInfoArray[nIndex]->GetFirstName()->Des());
m_Family.Copy(m_pBookInfoArray[nIndex]->GetLastName()->Des());
m_Mobile.Copy(m_pBookInfoArray[nIndex]->GetTelephone()->Des());
// TPckgBuf< TViewPara > package(info);
// TBuf8<256> para; //要根据TViewPara所占的内存空间准备足够的buffer
// para.Copy( package );
AppUi()->ActivateLocalViewL( /*TUid::Uid(1), TUid::Uid(2), para*/KViewId11);
}
break;
case EFairyLandUpBookData:
{
m_ArrayNo = -2;
iEngine->PostRequestL(m_pBookInfoArray);
StartWaitDialogL();
}
break;
case EFairyLandDownBookData:
{
m_ArrayNo = -3;
iEngine->GetRequestL();
StartWaitDialogL();
}
break;
case EFairyLandHelp:
{
}
break;
case EFairyLandWriteSMS:
{
AppUi()->ActivateLocalViewL(KViewId14);
}
break;
case EFairyLandCmdBack:
{
AppUi()->ActivateLocalViewL(KViewId3);
}
break;
default:
{
AppUi()->HandleCommandL(aCommand);
}
break;
}
}
// ---------------------------------------------------------
// CBookListView::HandleClientRectChange()
// Handles client rect change.
// ---------------------------------------------------------
void CBookListView::HandleClientRectChange()
{
if (iContainer)
{
iContainer->SetRect(ClientRect());
}
}
// ---------------------------------------------------------
// CBookListView::DoActivateL(...)
// Creates the Container class object.
// ---------------------------------------------------------
void CBookListView::ResponseStatusL(TInt aStatusCode, const TDesC& aStatusText)
{
HBufC* buf = HBufC::NewLC(aStatusText.Length() + KStatusCodeLength);
buf->Des().Format(KStatusFormat, aStatusCode, &aStatusText);
CAknInformationNote* note = new (ELeave) CAknInformationNote;
note->ExecuteLD(*buf);
CleanupStack::PopAndDestroy(buf);
}
void CBookListView::ResponseReceivedL(/*const TDesC& aResponse*/)
{
if (iWaitDialog)
{
iWaitDialog->ProcessFinishedL(); // Deletes the dialog
iWaitDialog = NULL;
}
if(m_ArrayNo == -3)
{
m_pBodyBuffer = iEngine->GetResponse()->Des().Alloc();
m_ArrayNo = -1;
while(1)
{
_LIT(buf1,"<lname>");
_LIT(buf2,"</lname>");
TInt ni = m_pBodyBuffer->Find(buf1);
TInt nj = m_pBodyBuffer->Find(buf2);
if(ni<0||nj<0)
break;
m_Family.Copy(m_pBodyBuffer->Des().Mid( ni + 7, (nj - ni - 7)));
_LIT(buf3,"<fname>");
_LIT(buf4,"</fname>");
ni = m_pBodyBuffer->Find(buf3);
nj = m_pBodyBuffer->Find(buf4);
m_Given.Copy(m_pBodyBuffer->Des().Mid( ni + 7, (nj - ni - 7)));
_LIT(buf5,"<mob>");
_LIT(buf6,"</mob>");
ni = m_pBodyBuffer->Find(buf5);
nj = m_pBodyBuffer->Find(buf6);
m_Mobile.Copy(m_pBodyBuffer->Des().Mid( ni + 5, (nj - ni - 5)));
TInt k = m_pBodyBuffer->Des().Length()-nj-7 ;
m_pBodyBuffer->Des().Copy(m_pBodyBuffer->Des().Mid(nj+6,k));
// CAknInformationNote* note = new (ELeave) CAknInformationNote;
// note->ExecuteLD(temp);
GetContactFromPB();
if(m_Given.Length()>0&&m_Family.Length()>0&&m_Mobile.Length()>0&&m_ArrayNo>=-1)
{
CreateNewContact();
}
iContainer->SetItemToListBox(m_pBookInfoArray);
if(m_pBookInfoArray.Count()>0) //菜单转换
m_nMenuFlag=1;
else
m_nMenuFlag=0;
m_Given.Zero();
m_Given.Zero();
m_Mobile.Zero();
}
MEM_FREE(m_pBodyBuffer);
m_ArrayNo = -2;
}
iEngine->MEMFREE();
}
void CBookListView::DoActivateL(const TVwsViewId& /*aPrevViewId*/,
TUid /*aCustomMessageId*/,
const TDesC8& /*aCustomMessage*/)
{
iContainer = new (ELeave) CBookListContainer;
iContainer->SetMopParent(this);
TRect rc;
rc.SetRect(ClientRect().iTl, TSize(176, 144));
// initialize container instance by the second phase construction
iContainer->ConstructL(rc);
stutusFlag = false;
m_pBookEngine = CBookEngine::NewL();
//更新动态数组中的名片
GetContactFromPB();
if(m_Given.Length()>0&&m_Family.Length()>0&&m_Mobile.Length()>0&&m_ArrayNo>=-1)
{
CreateNewContact();
}
iContainer->SetItemToListBox(m_pBookInfoArray);
//Adds a control to the control stack
AppUi()->AddToStackL(*this, iContainer);
iEngine = CHTTPExampleEngine::NewL(*this);
m_Family.Zero();
m_Given.Zero();
m_Mobile.Zero();
m_ArrayNo = -2;
TBuf<KMaxPath> pathMbm;
#ifdef __WINS__
pathMbm.Copy(_L("z:\\system\\apps\\FairyLand\\FairyLand.mbm"));
#else
CFairyLandAppUi* pApp = (CFairyLandAppUi*)CEikonEnv::Static()->AppUi();
pApp->GetAppPath(pathMbm);
pathMbm.Append(_L("FairyLand.mbm"));
#endif
CEikStatusPane* statusPane = StatusPane();
//set icon
CAknContextPane* contextPane = (CAknContextPane*) statusPane->ControlL(TUid::Uid(EEikStatusPaneUidContext));
CFbsBitmap* bitmap = iEikonEnv->CreateBitmapL(pathMbm, EMbmFairylandBooklist);
CFbsBitmap* bitmapMask = iEikonEnv->CreateBitmapL(pathMbm, EMbmFairylandBooklist_mask);
//contextPane->SetPicture(bitmap);
contextPane->SetPicture(bitmap, bitmapMask);
//load chinese words
TBuf<32> BooklistTitle;
CEikonEnv::Static()->ReadResource(BooklistTitle, R_QTN_MH_BOOKLIST);
CAknTitlePane* titlePane = (CAknTitlePane*) statusPane->ControlL(TUid::Uid(EEikStatusPaneUidTitle));
titlePane->SetTextL(BooklistTitle);
if(m_pBookInfoArray.Count()>0)
m_nMenuFlag=1;
else
m_nMenuFlag=0;
}
// ---------------------------------------------------------
// CBookListView::DoDeactivate()
// Deletes the Container class object.
// ---------------------------------------------------------
void CBookListView::DoDeactivate()
{
if (iContainer)
{
AppUi()->RemoveFromStack(iContainer);
MEM_FREE(iContainer);
}
MEM_FREE(m_pBookEngine);
MEM_FREE(iEngine);
//动态数组重置并销毁
m_pBookInfoArray.ResetAndDestroy();
}
// End of File
//更新动态数组中的名片
void CBookListView::GetContactFromPB()
{
m_pBookInfoArray.ResetAndDestroy(); //删除后重置
m_pBookEngine->UpdatePhoneBook(0,m_pBookInfoArray);
}
//创建新名片
void CBookListView::CreateNewContact()
{
//若firstname、lastname、phonenumber同时都为空,则不添加新名片.
if ((m_Given.Length()==0) && (m_Family.Length()==0) && (m_Mobile.Length())==0)
{
//AppUi()->ActivateLocalViewL(TUid::Uid(8));
return;
}
//若firstname、lastname、phonenumber不同时为空,则添加新名片.
//CBookEngine* pEngine;
//pEngine = CBookEngine::NewL(); //名片夹引擎
RPointerArray<CBookInfo> szBookInfoArray; //动态数组
//创建一个名片对象,即一个条目/项.
CBookInfo* pBookInfo = CBookInfo::NewL();
//赋值
TInt mIndex = m_ArrayNo;
if(-1 != mIndex)
{
mIndex = m_pBookInfoArray[m_ArrayNo]->GetItemID();
}
pBookInfo->SetFirstName(m_Given);
pBookInfo->SetLastName(m_Family);
pBookInfo->SetTelephone(m_Mobile);
pBookInfo->SetItemID(mIndex);
//向动态数组添加新的名片
szBookInfoArray.Append(pBookInfo);
m_pBookEngine->UpdatePhoneBook(1, szBookInfoArray);
//MEM_FREE(pEngine);
for (TInt i=0; i<szBookInfoArray.Count(); i++)
{
delete szBookInfoArray[i];
}
szBookInfoArray.Close();
//更新动态数组中的名片
GetContactFromPB();
//刷新显示内容
RefreshListBox(0);
}
//删除名片
void CBookListView::DeleteContact()
{
if (m_pBookInfoArray.Count() <= 0)
{
return;
}
TInt nResult;
iContainer->GetDeleteResult(nResult);
if (nResult)
{
// TInt nIndex = iContainer->m_pListBox->CurrentItemIndex();
const CListBoxView::CSelectionIndexArray* selection = iContainer->m_pListBox->SelectionIndexes();
TInt i;
RArray<TInt> copyIndices;
CleanupClosePushL(copyIndices);
for (i=0;i<selection->Count();i++)
{
copyIndices.InsertInOrder ((*selection)[i]);
}
TInt currentItem;
//
for (TInt j=selection->Count()-1; j>=0; j--)
{
currentItem = copyIndices[j];
m_pBookEngine->DeleteUserFromBook(m_pBookInfoArray[currentItem]->GetItemID());
//刷新显示内容
}
// if (nIndex >= 0)
// {
//从数据库中删除一个名片
// m_pBookEngine->DeleteUserFromBook(m_pBookInfoArray[nIndex]->GetItemID());
//更新动态数组中的名片
// GetContactFromPB();
//刷新显示内容
// RefreshListBox(nIndex);
// }
CleanupStack::PopAndDestroy();
GetContactFromPB();
RefreshListBox(currentItem);
}
}
//刷新显示内容
void CBookListView::RefreshListBox(TInt aIndex)
{
if (m_pBookInfoArray.Count() != 0)
{
iContainer->SetItemToListBox(m_pBookInfoArray);
if (aIndex != 0)
{
iContainer->m_pListBox->SetCurrentItemIndexAndDraw(aIndex-1);
}
else
{
iContainer->m_pListBox->SetCurrentItemIndexAndDraw(0);
iContainer->ShowNoCard();
}
}
else
{
iContainer->SetItemToListBox(m_pBookInfoArray);
}
iContainer->m_pListBox->DrawNow();
}
// void CBookListView::DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane)
// {
// }
////////////////////////////菜单隐藏/////////////////////////////
void CBookListView::DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane)
{
if(aResourceId != R_MH_BOOKLIST_MENU)
return;
//标志位:相当于显示或不显示菜单栏的开关
switch(m_nMenuFlag)
{
case 0://当m_nMenuFlag==0时,隐藏部分菜单栏
{
aMenuPane->SetItemDimmed(EFairyLandNewBook, EFalse); //要不要隐藏
aMenuPane->SetItemDimmed(EFairyLandDeleteBook, ETrue);
aMenuPane->SetItemDimmed(EFairyLandModifyBook, ETrue);
aMenuPane->SetItemDimmed(EFairyLandLookBook, ETrue);
aMenuPane->SetItemDimmed(EFairyLandUpBookData, ETrue);
aMenuPane->SetItemDimmed(EFairyLandWriteSMS, ETrue);
break;
}
case 1://当m_nMenuFlag==1时,显示所有菜单栏,即不隐藏菜单栏
{
aMenuPane->SetItemDimmed(EFairyLandNewBook, EFalse);
aMenuPane->SetItemDimmed(EFairyLandDeleteBook, EFalse);
aMenuPane->SetItemDimmed(EFairyLandModifyBook, EFalse);
aMenuPane->SetItemDimmed(EFairyLandLookBook, EFalse);
aMenuPane->SetItemDimmed(EFairyLandUpBookData, EFalse);
aMenuPane->SetItemDimmed(EFairyLandWriteSMS, EFalse);
break;
}
default:
{
break;
}
}
}
void CBookListView::StartWaitDialogL()
{
if (iWaitDialog)
{
delete iWaitDialog;
iWaitDialog = NULL;
}
iWaitDialog = new (ELeave) CAknWaitDialog((REINTERPRET_CAST(CEikDialog**, &iWaitDialog)), ETrue);
iWaitDialog->SetTone(CAknNoteDialog::EConfirmationTone);
iWaitDialog->ExecuteLD(R_FAIRYLAND_WAIT_NOTE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -