chxavfileviewwindow.cpp
来自「symbian 下的helix player源代码」· C++ 代码 · 共 1,905 行 · 第 1/4 页
CPP
1,905 行
// transfer icon array ownership to list box (CEikColumnListBox uses ColumnData())
m_pListBox->ItemDrawer()->FormattedCellData()->SetIconArrayL(pIcons);
}
////////////////////////////////////////////////////////////
// return full path to current folder
const TDesC&
CHXAvFileViewWindow::GetFullPath() const
{
if( m_spStore )
{
return m_spStore->GetFullPath();
}
return m_spCurrentPage->FolderInfo()->GetRoot();
}
/*
* SyncToCurrentPageL
* ------------------
*
*/
void
CHXAvFileViewWindow::SyncToCurrentPageL()
{
m_spStore = 0;
m_spFileUI = 0;
TInt idEmptyList = R_AVP_FILE_FOLDER_EMPTY_TEXT;
CHXAvMediaFolderInfo* pFolderInfo = m_spCurrentPage->FolderInfo();
bool bIsMmc = pFolderInfo->IsMmcFolder();
const CHXAvFile::DriveInfo info = pFolderInfo->GetDriveInfo();
switch( info.state )
{
case CHXAvFile::dsAccessible:
// normal case: accessible drive
InitFileStoreL();
idEmptyList = R_AVP_FILE_FOLDER_EMPTY_TEXT;
break;
case CHXAvFile::dsCorrupted:
idEmptyList = bIsMmc ? R_AVP_MMC_CORRUPT : R_AVP_FILE_FOLDER_EMPTY_TEXT;
break;
case CHXAvFile::dsLocked:
idEmptyList = bIsMmc ? R_AVP_MMC_LOCKED : R_AVP_FILE_FOLDER_EMPTY_TEXT;
break;
default:
idEmptyList = bIsMmc ? R_AVP_MMC_NOT_INSERTED : R_AVP_FILE_FOLDER_EMPTY_TEXT;
break;
}
m_pListBox->View()->SetListEmptyTextL(CHXAvCleanString(idEmptyList)());
}
////////////////////////////////////////////
// CCoeControl
void CHXAvFileViewWindow::GetHelpContext(TCoeHelpContext& aContext) const
{
aContext = TCoeHelpContext( CHXAvMisc::KHelpUID, KRP_HLP_LIST );
}
/*
* ComponentControl
* ----------------
* Return a pointer to the ith component of this control.
*
*/
CCoeControl *
CHXAvFileViewWindow::ComponentControl(TInt aIndex) const
{
HX_ASSERT(0 == aIndex);
return m_pListBox;
}
/*
* CountComponentControls
* ----------------------
* Return the number of subcontrols in this control.
*
*/
TInt CHXAvFileViewWindow::CountComponentControls() const
{
return 1;
}
/*
* SizeChanged
* -----------
* The size of this control has changed so adjust the child controls.
*
*/
void CHXAvFileViewWindow::SizeChanged()
{
TRect rc = Rect();
if (m_pListBox)
{
m_pListBox->SetRect(rc);
}
}
//////////////////////////////////////
//
// assumes we are using listbox with scrolling
// loop (wrapping) behavior specified
//
TKeyResponse CHXAvFileViewWindow::HandleShiftMarkKeyL(TInt keyCode)
{
// default: consume arrow key so current item does not change
TKeyResponse response = EKeyWasConsumed;
const CHXAvFileStore::Entries& entries = m_spStore->GetEntries();
TInt idxThis = m_pListBox->CurrentItemIndex();
if( !entries[idxThis].m_entry.IsDir() )
{
TInt idxEnd = m_pListBox->Model()->NumberOfItems();
TInt idxNext = idxThis + 1;
if( idxNext >= idxEnd )
{
idxNext = 0;
}
TInt idxPrev = idxThis - 1;
if( idxPrev < 0 )
{
idxPrev = idxEnd - 1;
}
TInt idxNextToSelect = (EKeyUpArrow == keyCode ? idxPrev : idxNext);
if (!entries[idxNextToSelect].m_entry.IsDir())
{
// allow arrow key to pass to listbox so it changes current item
response = EKeyWasNotConsumed;
// mark current item
if( m_shiftMarkState == smShiftMark )
{
m_pListBox->View()->SelectItemL(idxThis);
}
else
{
m_pListBox->View()->DeselectItem(idxThis);
}
// mark next item
if( m_shiftMarkState == smShiftMark )
{
m_pListBox->View()->SelectItemL(idxNextToSelect);
}
else
{
m_pListBox->View()->DeselectItem(idxNextToSelect);
}
}
}
return response;
}
//////////////////////////////////////
//
TKeyResponse CHXAvFileViewWindow::HandleEventKeyEventL(const TKeyEvent& event)
{
TKeyResponse response = EKeyWasNotConsumed;
DPRINTF(SYMP_WSEVENTS, ("CHXAvFileViewWindow::HandleEventKeyEventL(): event key: code = %d\n", event.iCode));
if( event.iModifiers & EModifierShift)
{
//
// shift + key
//
switch( event.iCode )
{
case EKeyOK: // selection key
case EKeyEnter: // 'enter' on keyboard
DPRINTF(SYMP_WSEVENTS, ("CHXAvFileViewWindow::HandleEventKeyEventL(): shift + ok (or enter)\n"));
if( HasHilightItem() && HilightItemIsFile() )
{
TInt cmd = (HilightItemIsMarked() ? EAknCmdUnmark : EAknCmdMark);
UserMarkL(cmd);
response = EKeyWasConsumed;
}
break;
case EKeyUpArrow:
case EKeyDownArrow:
DPRINTF(SYMP_WSEVENTS, ("CHXAvFileViewWindow::HandleEventKeyEventL(): shift + arrow\n"));
response = HandleShiftMarkKeyL(event.iCode);
break;
default:
break;
}
}
else
{
//
// key alone
//
switch( event.iCode )
{
case EKeyOK:
case EKeyEnter:
DPRINTF(SYMP_WSEVENTS, ("CHXAvFileViewWindow::HandleEventKeyEventL(): ok button click\n"));
if(IsDriveLocked())
{
// do 'unlock drive' ui if current drive is locked
UserUnlockDriveL();
response = EKeyWasConsumed;
} // else, see HandleListBoxEventL()
break;
case EKeyBackspace: // 0x0d ('c')
case EKeyDelete: // 0x7f (keyboard delete)
UserDeleteSelectedItemsL();
response = EKeyWasConsumed;
break;
case EKeyLeftArrow:
case EKeyRightArrow:
//
// these go to tab control
//
if( m_wpTabGroup )
{
if( EKeyWasConsumed == m_wpTabGroup->OfferKeyEventL(event, EEventKey) )
{
TInt idxTab = m_wpTabGroup->ActiveTabIndex();
// save current folder in view and hilighted item before switching
SaveCurrentPageInfoL();
LoadPageL(idxTab);
response = EKeyWasConsumed;
}
}
break;
default:
break;
}
}
//
// give list box next crack (only for EEventKey, since
// listbox always returns EKeyWasConsumed and we want
// ignored keys to be forwarded to parent control
//
if( (EKeyWasNotConsumed == response) && m_pListBox )
{
response = m_pListBox->OfferKeyEventL(event, EEventKey);
}
return response;
}
/*
* OfferKeyEventL
* --------------
* A key event is occurring.
*
*/
TKeyResponse CHXAvFileViewWindow::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
{
TKeyResponse response = EKeyWasNotConsumed;
DPRINTF(SYMP_WSEVENTS, ("CHXAvFileViewWindow::OfferKeyEventL(): code = %d; sc = %d\n", aKeyEvent.iCode, aKeyEvent.iScanCode));
switch(aType)
{
case EEventKey:
// see aKeyEvent.iCode
response = HandleEventKeyEventL(aKeyEvent);
break;
case EEventKeyUp:
// see aKeyEvent.iScanCode
response = HandleKeyUpEventL(aKeyEvent);
break;
case EEventKeyDown:
// see aKeyEvent.iScanCode
response = HandleKeyDownEventL(aKeyEvent);
break;
default:
/* do nothing */
break;
}
return response;
}
/*
* CreateFileViewListBoxL
* ----------------------
* Create the file view list box.
*
*/
void CHXAvFileViewWindow::CreateFileViewListBoxL()
{
HX_DELETE(m_pListBox);
//
// list entries for 'CAknDoubleLargeStyleListBox' should look like:
//
// {idxIcon}\t{top text}\t{bottom text}
//
// CEikColumnListBox derived
m_pListBox = new (ELeave) CAknDoubleLargeStyleListBox();
TInt flags = EAknGenericListBoxFlags | EAknListBoxMultipleSelection | EAknListBoxLoopScrolling;
m_pListBox->ConstructL(this, flags);
m_pListBox->SetMopParent(this);
CreateAndAddIconsL();
m_pListBox->CreateScrollBarFrameL( ETrue );
m_pListBox->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOn, CEikScrollBarFrame::EAuto);
m_pListBox->SetListBoxObserver(this);
// set default message that is displayed when a folder is empty
m_pListBox->View()->SetListEmptyTextL(CHXAvCleanString(R_AVP_FILE_FOLDER_EMPTY_TEXT)());
m_pListBox->ActivateL();
}
////////////////////////////////////////////
// MEikListBoxObserver
void CHXAvFileViewWindow::HandleListBoxEventL(CEikListBox* /*aListBox*/,TListBoxEvent aEventType)
{
DPRINTF(SYMP_INFO, ("CHXAvFileViewWindow::HandleListBoxEventL(): type = %d\n", aEventType));
if( aEventType == MEikListBoxObserver::EEventEnterKeyPressed ||
aEventType == MEikListBoxObserver::EEventItemClicked )
{
// selection button was clicked; this is only called if an item is selected
if(GetMarkedItemCount() == 0)
{
// open the hilighted item
UserOpenCurrentItemL();
}
else
{
m_pFileView->HandleCommandL(EShowDefaultMenu);
}
}
}
////////////////////////////////////////////////////////////
// show contents of child folder
//
TInt CHXAvFileViewWindow::SwitchToChildFolderAndRefreshL(const TDesC& folder)
{
HX_ASSERT(m_spStore);
TInt idxItem = m_pListBox->CurrentItemIndex();
HX_ASSERT(idxItem != -1);
TRAPD(err, m_spStore->SwitchToChildFolderL(folder));
if(KErrNone == err)
{
//
// remember the current index so we can re-set
// to it in case user opts to return back to this
// parent folder
//
HX_ASSERT(m_spCurrentPage);
m_spCurrentPage->Indexes().Push((void *)idxItem);
RefreshListBoxL();
m_pFileView->UpdateViewStateL();
}
return err;
}
/*
* UserOpenCurrentItemL
* --------------------
* Called by the user when they hit Play command in the file view.
* We either open up the directory or play the file that is currently selected.
*
*/
void
CHXAvFileViewWindow::UserOpenCurrentItemL()
{
HX_ASSERT(GetMarkedItemCount() == 0); // can't open when items are in selection list!
TInt idxItem = m_pListBox->CurrentItemIndex();
const TEntry& entry = GetFileInfoL(idxItem).m_entry;
if( entry.IsDir())
{
// "open folder"
TInt err = SwitchToChildFolderAndRefreshL(entry.iName);
if(err != KErrNone)
{
CHXAvMessageDialog::DoAlertErrorL(CHXAvCleanString(R_ERR_OPEN_FOLDER_FAILED)());
// refresh current folder; perhaps view is out of sync with file system
RefreshListBoxL(idxItem);
}
}
else
{
// "open file"
TFileName* pPath = CHXAvFile::AllocFileNameL(GetFullPath(), entry.iName);
AUTO_PUSH_POP_DEL(pPath);
HBufC* pUrl = CHXAvFile::AllocFileUrlL(*pPath);
AUTO_PUSH_POP_DEL(pUrl);
m_playerUI->ActivatePlayViewL(*pUrl);
}
}
/*
* GetFileInfoL
* ------------
* get file entry info for current item, with debug checks
*
*/
const CHXAvFile::FileInfo&
CHXAvFileViewWindow::GetFileInfoL(TInt idx) const
{
HX_ASSERT(m_spStore);
const CHXAvFileStore::Entries& entries = m_spStore->GetEntries();
HX_ASSERT(idx >= 0);
HX_ASSERT(idx < entries.Nelements());
return entries[idx];
}
////////////////////////////////////////////////////////////
//
void CHXAvFileViewWindow::UserSwitchToParentFolderAndRefreshL()
{
HX_ASSERT(m_spStore);
HX_ASSERT(m_spCurrentPage);
bool bAtRoot = m_spStore->IsAtRoot();
HX_ASSERT(!bAtRoot);
m_spStore->SwitchToParentFolderL();
// get last index
TInt idx = (TInt)(m_spCurrentPage->Indexes().TopOfStack());
m_spCurrentPage->Indexes().Pop();
RefreshListBoxL(idx);
m_pFileView->UpdateViewStateL();
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?