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