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 + -
显示快捷键?