⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 booklistview.cpp

📁 一个比较完整的有关移动开发的例子 vc++6.0下编译通过
💻 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 + -