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

📄 ansphoneview.cpp

📁 该源码主要用于操作nokia的S60手机如何控制接打或拨叫电话
💻 CPP
字号:
/**
*
* @brief Definition of CAnsPhoneView
*
* Copyright (c) EMCC Software Ltd 2003
* @version 1.0
*/
#include "AnsPhoneView.h"

#include <eiklabel.h>
#include <aknlists.h>
#include <akniconarray.h>
#include <akntitle.h>
#include <stringloader.h>
#include <barsread.h>
#include <AnsPhone.rsg>
#include <AnsPhone.mbg>
#include "AnsPhoneAppUi.h"
#include "AnsPhone.loc"

const TInt KMessageTextMaxLength	= 100;
const TInt KMessageTextTimeMaxLength = 50;

const TInt KDisplayMarginVertical		= 20;

const TInt KNumberIcons = 1;


_LIT(KMessageTextStart, "0\t");
_LIT(KDisplayTextNoNewMessages, "-");

_LIT(KMbmFile, "\\System\\apps\\AnsPhone\\AnsPhone.mbm");


CAnsPhoneView::CAnsPhoneView()
:iNumberNewMessages(0),
 iCanStop(EFalse),
 iState(EStopped),
 iPreviousState(EStopped),
 iMainState(EStopped)
	{
	}

CAnsPhoneView::~CAnsPhoneView()
	{
	delete iEngine;
	delete iDisplayStatus;
	delete iDisplayMessages;
	delete iMessagesList;
	}

CAnsPhoneView* CAnsPhoneView::NewL(const TRect& aRect)
	{
	CAnsPhoneView* self = new (ELeave) CAnsPhoneView();
	CleanupStack::PushL(self);
	self->ConstructL(aRect);
	CleanupStack::Pop(self);
	return self;
	}

void CAnsPhoneView::ConstructL(const TRect& aRect)
	{
	iEngine = CAnsPhoneEngine::NewL(*this);

	CreateWindowL();
	SetRect(aRect);

	TInt heightDisplays = (Rect().Height() - 3 * KDisplayMarginVertical) / 2;
	TInt widthControls = Rect().Width();

	iDisplayStatus = new (ELeave) CEikLabel();
	iDisplayStatus->SetContainerWindowL(*this);
	TRect rect = TRect(	TPoint(0, KDisplayMarginVertical), TSize(widthControls, heightDisplays));
	iDisplayStatus->SetRect(rect);
	iDisplayStatus->SetAlignment(EHCenterVCenter);

	HBufC* text = StringLoader::LoadLC(R_ANSPHONE_DISPLAY_STOPPED);
	iDisplayStatus->SetTextL(*text);
	CleanupStack::PopAndDestroy(text);

    iDisplayStatus->SetFont(iEikonEnv->TitleFont());

	iDisplayMessages = new (ELeave) CEikLabel();
	iDisplayMessages->SetContainerWindowL(*this);
	rect = TRect(	TPoint(0, iDisplayStatus->Rect().Height() + 2 * KDisplayMarginVertical),
					TSize(widthControls, heightDisplays));
	iDisplayMessages->SetRect(rect);
	iDisplayMessages->SetAlignment(EHCenterVCenter);
	iDisplayMessages->SetTextL(KDisplayTextNoNewMessages);

    iDisplayMessages->SetFont(iEikonEnv->LegendFont());

	ActivateL();
	DrawDeferred();
	}

//////////////////////////////////////////////////////////////////////////////////////////
//	CCoeControl
//
//////////////////////////////////////////////////////////////////////////////////////////

void CAnsPhoneView::Draw(const TRect& /*aRect*/) const
	{
	CWindowGc& gc = SystemGc();
	gc.Clear(Rect());
	}

TInt CAnsPhoneView::CountComponentControls() const
	{
	if(iMessagesList)
		{
		return 1;
		}
	else
		{
		return 2;
		}
	}

CCoeControl* CAnsPhoneView::ComponentControl(TInt aIndex) const
	{
	if(iMessagesList)
		{
		return iMessagesList;
		}
	else
		{
		if(aIndex == 0)
			return iDisplayStatus;
		else
			return iDisplayMessages;
		}
	}

TKeyResponse CAnsPhoneView::OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType)
// this is only used when the messages are on display;
// this is so that another menu can be displayed
	{
	if(!iMessagesList)
		return EKeyWasNotConsumed;
	else
		return iMessagesList->OfferKeyEventL(aKeyEvent, aType);
	}

//////////////////////////////////////////////////////////////////////////////////////////
//	MAnsPhoneEngineObserver
//
//////////////////////////////////////////////////////////////////////////////////////////

void CAnsPhoneView::HandlePlayMessageOverL()
// used for switching the menu back to the main one
	{
	iCanStop = EFalse;
	}

void CAnsPhoneView::HandleCallChangeL(const RCall::TStatus& aStatus)
// updates the view for a call change
	{
	STATIC_CAST(CAnsPhoneAppUi*, iCoeEnv->AppUi())->BringAppToFront();
	if(aStatus == RCall::EStatusConnected)
		{
		HBufC* text = StringLoader::LoadLC(R_ANSPHONE_DISPLAY_ANSWERING);
		iDisplayStatus->SetTextL(*text);
		CleanupStack::PopAndDestroy(text);
		iState = EAnswering;
		}
	else
		{
		// hangingup: if the call has been hung up by the other person, whether they have recorded or not
		HBufC* text = StringLoader::LoadLC(R_ANSPHONE_DISPLAY_RUNNING);
		iDisplayStatus->SetTextL(*text);
		CleanupStack::PopAndDestroy(text);
		iState = ERunning;
		}
	}

void CAnsPhoneView::HandleNewMessageL()
// updates the view for a new message coming in
	{
	iNumberNewMessages++;

	HBufC* statusText = StringLoader::LoadLC(R_ANSPHONE_DISPLAY_RUNNING);
	iDisplayStatus->SetTextL(*statusText);
	iDisplayStatus->DrawDeferred();
	CleanupStack::PopAndDestroy(statusText );

	TBuf<KMessageTextMaxLength> buf;
	buf.AppendNum(iNumberNewMessages);

	HBufC* messagesText = NULL;
	if(iNumberNewMessages == 1)
		messagesText = StringLoader::LoadLC(R_ANSPHONE_DISPLAY_NEWMESSAGE);
	else
		messagesText = StringLoader::LoadLC(R_ANSPHONE_DISPLAY_NEWMESSAGES);
	buf.Append(*messagesText);
	CleanupStack::PopAndDestroy(messagesText);

	iDisplayMessages->SetTextL(buf);
	iDisplayMessages->DrawDeferred();
	}

//////////////////////////////////////////////////////////////////////////////////////////
//	MEikListBoxObserver
//
//////////////////////////////////////////////////////////////////////////////////////////

void CAnsPhoneView::HandleListBoxEventL(CEikListBox* /*aListBox*/, TListBoxEvent /*aEventType*/)
	{
	}

//////////////////////////////////////////////////////////////////////////////////////////
//	CALL FUNCTIONS
//
//////////////////////////////////////////////////////////////////////////////////////////

void CAnsPhoneView::AnsweringStartL()
	{
	iEngine->AnsweringStartL();
	HBufC* text = StringLoader::LoadLC(R_ANSPHONE_DISPLAY_RUNNING);
	iDisplayStatus->SetTextL(*text);
	CleanupStack::PopAndDestroy(text);
	iState = ERunning;
	}

void CAnsPhoneView::AnsweringStopL()
	{
	iEngine->AnsweringStop();
	HBufC* text = StringLoader::LoadLC(R_ANSPHONE_DISPLAY_STOPPED);
	iDisplayStatus->SetTextL(*text);
	CleanupStack::PopAndDestroy(text);
	iState = EStopped;
	}

void CAnsPhoneView::PlayMessageL()
	{
	if(iMessagesList)
		{
		// find out which message is to be played;
		TInt currentItem = iMessagesList->CurrentItemIndex();
		iEngine->PlayMessageL(ETrue, currentItem, EFalse);
		}
	else
		{
		iEngine->PlayMessageL(ETrue, 0, ETrue);
		}

	iPreviousState = iState;
	iState = ECanStop;
	}

void CAnsPhoneView::RecordMessageL()
	{
	iEngine->RecordMessageL(ETrue);
	iPreviousState = iState;
	iState = ECanStop;
	}

void CAnsPhoneView::Stop()
	{
	iEngine->Stop();
	iState = iPreviousState;
	}

void CAnsPhoneView::DialL()
	{
	// find out which message is to be played;
	TInt currentItem = iMessagesList->CurrentItemIndex();
	iEngine->DialNumberL(currentItem);
	}

void CAnsPhoneView::DeleteMessageL()
	{
	// find out which message is to be played;
	TInt currentItem = iMessagesList->CurrentItemIndex();
	iEngine->DeleteMessage(currentItem);

	CDesCArray* content = STATIC_CAST(CDesCArray*, iMessagesList->Model()->ItemTextArray());
	content->Delete(currentItem);
	iMessagesList->HandleItemRemovalL();
	}

/////////////////////////////////////////////////////////////////////////////////////////////////////
//	MESSAGES
//
/////////////////////////////////////////////////////////////////////////////////////////////////////

void CAnsPhoneView::ShowMessagesL()
	{
	// change the status pane title
	CAknTitlePane* titlePane = STATIC_CAST(CAknTitlePane*,
						STATIC_CAST(CAknAppUi*, iEikonEnv->EikAppUi())->StatusPane()->ControlL(TUid::Uid(EEikStatusPaneUidTitle)));

	HBufC* text = StringLoader::LoadLC(R_ANSPHONE_TITLE_MESSAGES);
	titlePane->SetTextL(*text);
	CleanupStack::PopAndDestroy(text);

	if(iMessagesList)
		delete iMessagesList;

	iDisplayStatus->MakeVisible(EFalse);
	iDisplayMessages->MakeVisible(EFalse);

	// construct the list
	iMessagesList = new (ELeave) CAknDoubleGraphicStyleListBox();
	iMessagesList->SetContainerWindowL(*this);
	TResourceReader reader;
	iEikonEnv->CreateResourceReaderLC(reader, R_ANSPHONE_LISTBOX_MESSAGES);	// PUSH
	iMessagesList->ConstructFromResourceL(reader);
	CleanupStack::PopAndDestroy();														// reader
	iMessagesList->SetListBoxObserver(this);
	iMessagesList->CreateScrollBarFrameL();
	iMessagesList->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
	TRect rect = TRect(	TPoint(0, 0), TSize(Rect().Width(), Rect().Height()));
	iMessagesList->SetRect(rect);

	iMessagesList->ItemDrawer()->ColumnData()->SetAlignmentL(CGraphicsContext::ECenter);

	// Create an array of icons, reading them from the file
	CArrayPtr<CGulIcon>* icons = new(ELeave) CAknIconArray(KNumberIcons);
	CleanupStack::PushL(icons);
	icons->AppendL(iEikonEnv->CreateIconL(KMbmFile, EMbmAnsphoneMessicon, EMbmAnsphoneMessiconmask));
	iMessagesList->Model()->SetOwnershipType(ELbmOwnsItemArray);
	iMessagesList->ItemDrawer()->ColumnData()->SetIconArray(icons); // passing ownership of icons
	CleanupStack::Pop(icons);

	// populate the list
	CDesCArray* content = STATIC_CAST(CDesCArray*, iMessagesList->Model()->ItemTextArray());

	// the format of the text inserted in each line is "0\t<phone number><tab character><time>")
	const CArrayFixSeg<CAnsPhoneEngine::TMessage>& messages = iEngine->MessageList();
	TInt numberMessages = messages.Count();
	for(TInt b = 0; b < numberMessages; b++)
		{
		const CAnsPhoneEngine::TMessage& message = messages.At(b);
		TBuf<KMessageTextMaxLength> buf;
		buf.Append(KMessageTextStart);

		TBuf<KNumberMaxLength> numberBuf;
		TInt index = 0;
		iEngine->TrimIndex(message.iNumber, numberBuf, index);
		buf.Append(numberBuf);
		buf.Append(CEditableText::ETabCharacter);
		_LIT(KMessageTextTimeFormat, "%:0%H%:1%T %*E%*D%*X%*N%Y %1 %2 %3");
		TBuf<KMessageTextTimeMaxLength> time;
		message.iTime.FormatL(time, KMessageTextTimeFormat);
		buf.Append(time);

		content->AppendL(buf);
		}

    iMessagesList->HandleItemAdditionL();

    iMessagesList->ActivateL();
    iMessagesList->DrawDeferred();

	iMainState = iState;
	iState = EMessages;
	}

void CAnsPhoneView::BackL()
	{
	// change the status pane title
	CAknTitlePane* titlePane = STATIC_CAST(CAknTitlePane*,
						STATIC_CAST(CAknAppUi*, iEikonEnv->EikAppUi())->StatusPane()->ControlL(TUid::Uid(EEikStatusPaneUidTitle)));

	HBufC* text = StringLoader::LoadLC(R_ANSPHONE_TITLE_APP);
	titlePane->SetTextL(*text);
	CleanupStack::PopAndDestroy(text);

	delete iMessagesList;
	iMessagesList = NULL;

	iDisplayStatus->MakeVisible(ETrue);
	iDisplayMessages->MakeVisible(ETrue);

	iNumberNewMessages = 0;
	iDisplayMessages->SetTextL(KDisplayTextNoNewMessages);

	iState = iMainState;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -