?? ansphoneview.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 + -