ansphoneview.cpp

来自「series60 应用程序开发的源代码 series60 应用程序开发的源代码」· C++ 代码 · 共 381 行

CPP
381
字号
/**
*
* @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 + =
减小字号Ctrl + -
显示快捷键?