📄 ansphoneappview.cpp
字号:
/*
============================================================================
Name : AnsPhoneAppView.cpp
Author : Lion
Copyright : Your copyright notice
Description : Application view implementation
============================================================================
*/
// INCLUDE FILES
#include <coemain.h>
#include "AnsPhoneAppView.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.rls"
#include <EIKDEF.H>
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");
// ============================ MEMBER FUNCTIONS ===============================
// -----------------------------------------------------------------------------
// CAnsPhoneAppView::NewL()
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CAnsPhoneAppView* CAnsPhoneAppView::NewL( const TRect& aRect )
{
CAnsPhoneAppView* self = new ( ELeave ) CAnsPhoneAppView;
CleanupStack::PushL( self );
self->ConstructL( aRect );
CleanupStack::Pop(self);
return self;
}
// -----------------------------------------------------------------------------
// CAnsPhoneAppView::NewLC()
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
//CAnsPhoneAppView* CAnsPhoneAppView::NewLC( const TRect& aRect )
// {
// CAnsPhoneAppView* self = new ( ELeave ) CAnsPhoneAppView;
// CleanupStack::PushL( self );
// self->ConstructL( aRect );
// CleanupStack::Pop(self);
// return self;
// }
// -----------------------------------------------------------------------------
// CAnsPhoneAppView::ConstructL()
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CAnsPhoneAppView::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());
// iMessagesList = new (ELeave) CAknDoubleStyleListBox;
// iMessagesList->SetContainerWindowL(*this);
ActivateL();
//DrawDeferred();
}
// -----------------------------------------------------------------------------
// CAnsPhoneAppView::CAnsPhoneAppView()
// C++ default constructor can NOT contain any code, that might leave.
// -----------------------------------------------------------------------------
//
CAnsPhoneAppView::CAnsPhoneAppView()
:iNumberNewMessages(0),
iCanStop(EFalse),
iState(EStopped),
iPreviousState(EStopped),
iMainState(EStopped)
{
// No implementation required
}
// -----------------------------------------------------------------------------
// CAnsPhoneAppView::~CAnsPhoneAppView()
// Destructor.
// -----------------------------------------------------------------------------
//
CAnsPhoneAppView::~CAnsPhoneAppView()
{
// No implementation required
delete iEngine;
delete iDisplayStatus;
delete iDisplayMessages;
delete iMessagesList;
}
// -----------------------------------------------------------------------------
// CAnsPhoneAppView::Draw()
// Draws the display.
// -----------------------------------------------------------------------------
//
void CAnsPhoneAppView::Draw( const TRect& /*aRect*/ ) const
{
CWindowGc& gc = SystemGc();
gc.Clear(Rect());
}
TInt CAnsPhoneAppView::CountComponentControls() const
{
if(iMessagesList)
{
return 1;
}
else
{
return 2;
}
}
CCoeControl* CAnsPhoneAppView::ComponentControl(TInt aIndex) const
{
if(iMessagesList)
{
return iMessagesList;
}
else
{
if(aIndex == 0)
return iDisplayStatus;
else
return iDisplayMessages;
}
}
//TKeyResponse CAnsPhoneAppView::OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType)
//{
// if(!iMessagesList)
// return EKeyWasNotConsumed;
// else
// return iMessagesList->OfferKeyEventL(aKeyEvent, aType);
//
//}
TKeyResponse CAnsPhoneAppView::OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType)
{
if (!iMessagesList)
return EKeyWasNotConsumed;
else
return iMessagesList->OfferKeyEventL(aKeyEvent, aType);
}
//////////////////////////////////////////////////////////////////////////////////////////
// MAnsPhoneEngineObserver
//
//////////////////////////////////////////////////////////////////////////////////////////
void CAnsPhoneAppView::HandlePlayMessageOverL()
// used for switching the menu back to the main one
{
iCanStop = EFalse;
}
void CAnsPhoneAppView::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 CAnsPhoneAppView::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 CAnsPhoneAppView::HandleListBoxEventL(CEikListBox* /*aListBox*/, TListBoxEvent /*aEventType*/)
{
}
//////////////////////////////////////////////////////////////////////////////////////////
// CALL FUNCTIONS
//
//////////////////////////////////////////////////////////////////////////////////////////
void CAnsPhoneAppView::AnsweringStartL()
{
iEngine->AnsweringStartL();
HBufC* text = StringLoader::LoadLC(R_ANSPHONE_DISPLAY_RUNNING);
iDisplayStatus->SetTextL(*text);
CleanupStack::PopAndDestroy(text);
iState = ERunning;
}
void CAnsPhoneAppView::AnsweringStopL()
{
iEngine->AnsweringStop();
HBufC* text = StringLoader::LoadLC(R_ANSPHONE_DISPLAY_STOPPED);
iDisplayStatus->SetTextL(*text);
CleanupStack::PopAndDestroy(text);
iState = EStopped;
}
void CAnsPhoneAppView::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 CAnsPhoneAppView::RecordMessageL()
{
iEngine->RecordMessageL(ETrue);
iPreviousState = iState;
iState = ECanStop;
}
void CAnsPhoneAppView::Stop()
{
iEngine->Stop();
iState = iPreviousState;
}
void CAnsPhoneAppView::DialL()
{
// find out which message is to be played;
TInt currentItem = iMessagesList->CurrentItemIndex();
iEngine->DialNumberL(currentItem);
}
void CAnsPhoneAppView::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 CAnsPhoneAppView::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) CAknDoubleStyleListBox;
iMessagesList = new (ELeave) CAknDoubleStyleListBox;
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 CAnsPhoneAppView::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;
}
// -----------------------------------------------------------------------------
// CAnsPhoneAppView::SizeChanged()
// Called by framework when the view size is changed.
// -----------------------------------------------------------------------------
//
void CAnsPhoneAppView::SizeChanged()
{
DrawNow();
}
// End of File
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -