chxaveditplaylistdialog.cpp

来自「symbian 下的helix player源代码」· C++ 代码 · 共 556 行 · 第 1/2 页

CPP
556
字号

/*============================================================================*
 *
 * (c) 1995-2002 RealNetworks, Inc. Patents pending. All rights reserved.
 *
 *============================================================================*/

#include <eikcapc.h>
#include <aknquerydialog.h>


//#include <hlplch.h>

#include "hxsym_debug.h"
#include "chxavmisc.h"
#include "chxavutil.h"
#include "chxavcleanupstack.h"
#include "chxavcleanstring.h"
#include "chxavescapedstring.h"
#include "player_uids.h"
#include "chxaveditplaylistdialog.h"
#include "realplayer.hrh"
#include "hxsym_leaveutil.h"
#include "realplayer.mbg"
#include "r1p.hlp.hrh"

CHXAvEditPlaylistDialog::CHXAvEditPlaylistDialog()
: m_idNextItem(0)
, m_pLastLineAdded(0)
, m_bInEditMode(false)
, m_bListAlteredFromPreDialogState(false)
{
}

CHXAvEditPlaylistDialog::~CHXAvEditPlaylistDialog()
{
    m_file.Close();
}

////////////////////////////////////////////
//
TInt CHXAvEditPlaylistDialog::SetPlaylistL(const TDesC& playListPath)
{
    TInt err = KErrGeneral;

    // we don't allow empty/invalid playlists (for now)
    CHXString strPath;
    CHXAvStringUtils::DesToString(playListPath, strPath);
    m_spPlaylist = CHXAvRAMParser::Parse(strPath);
    if( m_spPlaylist && (0 != m_spPlaylist->Length()) )
    {
        // open/lock file while dialog is active
        err = m_file.Open(CEikonEnv::Static()->FsSession(), 
            playListPath, EFileWrite|EFileShareExclusive);
    }

    return err;
}


////////////////////////////////////////////
//
void 
CHXAvEditPlaylistDialog::PreLayoutDynInitL()
{
    PopulateL();
}


////////////////////////////////////////////
//
void CHXAvEditPlaylistDialog::ProcessCommandL(TInt id)
{
    DPRINTF(SYMP_INFO, ("CHXAvEditPlaylistDialog::ProcessCommandL(): id = %d\n", id));

    switch(id)
    {
        case EAknFormCmdEdit:
        {
            HX_ASSERT(!m_bInEditMode);
            m_bInEditMode = true;
            CreateRestoreListL();
            break;
        }
        case EAknFormCmdAdd:
        case EAknFormCmdDelete:
            //XXXLCM the delete case is hard because we get no notification if user says no to are you sure? we assume yes...
            m_bListAlteredFromPreDialogState = true;
            break;
        case ERestorePlaylist:
            DoRestorePreDialogStateL();
            break;
        case EAknCmdHelp:
            {
            //CCoeAppUi* pUi = static_cast<CCoeAppUi*>(iCoeEnv->AppUi());
            //HlpLauncher::LaunchHelpApplicationL( iCoeEnv->WsSession(), pUi->AppHelpContextL() );
            }
            break;
        default:
            break;
    }
    
    CAknForm::ProcessCommandL(id);
}


////////////////////////////////////////////
// check all urls for proper syntax
bool CHXAvEditPlaylistDialog::VerifyFormL()
{
    return ForEachEdwinL(&CHXAvEditPlaylistDialog::VerifyUrlL);
}

///////////////////////////////////////////
//ForEachEdwinL helper
bool CHXAvEditPlaylistDialog::WriteUrlL(TInt /*idx*/, CEikEdwin* pEdwin)
{
    HBufC* pText = pEdwin->GetTextInHBufL();
    if(pText)
    {
        AUTO_PUSH_POP_DEL(pText);
    
        //bool bIsValid = CHXAvUtil::ValidURL(*pText);

        const TUint cchNewLine = CHXAvUtil::litSize(CHXAvUtil::KNewline);
        HBufC8* pText8 = HBufC8::NewL(pText->Length() + cchNewLine);
        AUTO_PUSH_POP_DEL(pText8);
        TPtr8 ptr = pText8->Des();
        ptr.Copy(*pText); // note: converts
        ptr.Append(CHXAvUtil::KNewline);
    
        m_file.Write(*pText8);
    }

    return true;
}

////////////////////////////////////////////
// confirm restore operation with user and do if user agrees
void CHXAvEditPlaylistDialog::DoRestorePreDialogStateL()
{
    bool bDoRestore = CHXAvMessageDialog::DoQueryL(CHXAvCleanString(R_AVP_Q_RESTORE_PLAYLIST)(), CHXAvMessageDialog::QueryOkCancel);
    if( bDoRestore )
    {
        // clear
        for( TInt idx = EIdFirstLine; idx < m_idNextItem; ++idx )
        {
            // delete line with this id (if it exists)
            CCoeControl* pControl = ControlOrNull(idx);
            if(pControl)
            {
                DeleteLine(idx, EFalse /*no redraw*/);
            }
        
        }
        // re-populate
        PopulateL();
        UpdatePageL(ETrue);
        SaveFormDataL();
        SetInitialCurrentLine();
        m_bListAlteredFromPreDialogState = false;
    }
}

////////////////////////////////////////////
// called after items are edited and 'yes' is selected by user
// when prompted to save changes
//
TBool CHXAvEditPlaylistDialog::SaveFormDataL()
{
    DPRINTF(SYMP_INFO, ("CHXAvEditPlaylistDialog::SaveFormDataL(): writing file\n"));

    // done with these...
    m_spRestoreList = 0; 

    m_bListAlteredFromPreDialogState = true;
    m_bInEditMode = false;

    // write the file
    TInt offset = 0;
    m_file.Seek(ESeekStart, offset);
    ForEachEdwinL(&CHXAvEditPlaylistDialog::WriteUrlL);

    // set size based on current position
    offset = 0;
    m_file.Seek(ESeekCurrent, offset);
    m_file.SetSize(offset);

    // flush
    HXSYM_LEAVE_IF_ERR(m_file.Flush());
    
    return ETrue;
}

////////////////////////////////////////////
// called when you go back from edit mode and when switch to new item in the list
void CHXAvEditPlaylistDialog::PrepareForFocusTransitionL()
{
    DPRINTF(SYMP_INFO, ("CHXAvEditPlaylistDialog::PrepareForFocusTransitionL()\n"));

    CAknForm::PrepareForFocusTransitionL();
};

///////////////////////////////////////////
//
bool CHXAvEditPlaylistDialog::ForEachEdwinL(PMFNForEach pfn)
{
    bool bGood = true;

    TInt idxPage = ActivePageId();
    TInt lineCount = GetNumberOfLinesOnPage(idxPage);
    for( TInt idx = 0; idx < lineCount; ++idx )
    {
        CEikCaptionedControl* pLine = GetLineByLineAndPageIndex(idx, idxPage);
        HX_ASSERT( (pLine->iId >= EIdFirstLine) && (pLine->iId < m_idNextItem) );

        CEikEdwin* pEdwin = reinterpret_cast<CEikEdwin*>(pLine->iControl);

        bGood = (this->*pfn)(idx, pEdwin);
        if( !bGood )
        {
            break;
        }
    }

    return bGood;
}

///////////////////////////////////////////
//ForEachEdwinL helper
bool CHXAvEditPlaylistDialog::VerifyUrlL(TInt /*idx*/, CEikEdwin* pEdwin)
{
    bool bIsValid = false;
    HBufC* pText = pEdwin->GetTextInHBufL();
    if(pText)
    {
        AUTO_PUSH_POP_DEL(pText);
        bIsValid = CHXAvUtil::IsValidUrl(*pText);

        if(!bIsValid)
        {
            DPRINTF(SYMP_INFO, ("CHXAvEditPlaylistDialog::VerifyUrl(): bad url: %s\n", dbg::CharPtr(*pText)()));
        }
    }
    return bIsValid;
}

///////////////////////////////////////////
//ForEachEdwinL helper
bool CHXAvEditPlaylistDialog::AppendRestoreListL(TInt /*idx*/, CEikEdwin* pEdwin)
{
    HX_ASSERT(m_spRestoreList);
    HBufC* pText = pEdwin->GetTextInHBufL();
    if(pText)
    {
        AUTO_PUSH_POP_DEL(pText);
        m_spRestoreList->AppendL(*pText); // this copies buffer
    }
    else
    {
        m_spRestoreList->AppendL(KNullDesC); 
    }
    return true;
}

///////////////////////////////////////////
//ForEachEdwinL helper
bool CHXAvEditPlaylistDialog::RestoreItemL(TInt idx, CEikEdwin* pEdwin)
{
    HX_ASSERT(idx < m_spRestoreList->MdcaCount());
    TPtrC ptr = m_spRestoreList->MdcaPoint(idx);
    pEdwin->SetTextL(&ptr);
    return true;
}

////////////////////////////////////////////
// save list of items before going into edit-text-mode state,
// in case we need to revert back; once in edit mode, user can

⌨️ 快捷键说明

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