chxavfileview.cpp

来自「symbian 下的helix player源代码」· C++ 代码 · 共 446 行

CPP
446
字号
/************************************************************************
 * chxavfileview.cpp
 * -----------------
 *
 * Synopsis:
 * Contains the implementation of the CHXAvFileView class.  This class 
 * is derived from CHXAvViewBase which is derived from CAknView.  This
 * object instantiates and own a control called the CHXAvFileViewWindow.
 * This control owns two component controls, the list box and a find box.
 *
 * Target:
 * Symbian OS
 *
 *
 * (c) 1995-2003 RealNetworks, Inc. Patents pending. All rights reserved.
 *
 ************************************************************************/

// Symbian includes...
#include <coeccntx.h>
#include <eikenv.h>
#include <eikappui.h>
#include <eikapp.h>
#include <eikdoc.h>
#include <eikmenup.h>
#include <eikon.hrh>
#include <aknviewappui.h>
#include <apchangeobserver.h>
#include <akniconarray.h> 
#include <aknselectionlist.h>
#include <SenduiMtmUids.h>
#include <sendui.h>
#include <SendNorm.rsg>



// Includes for this project...
#include "hxsym_debug.h"
#include "realplayer.rsg"
#include "chxavfileviewwindow.h"
#include "chxavviewbase.h"
#include "chxavfileview.h"
#include "realplayer.hrh"
#include "chxavplayerui.h"
#include "chxavfileviewpageinfo.h"
#include "chxavfolderdisplayinfo.h"
#include "realplayer.mbg"

namespace 
{

inline
bool IsViewAtRoot(CHXAvFileViewWindow* pWin)
{
    CHXAvFileStorePtr spStore = pWin->GetStore();
    return !spStore || spStore->IsAtRoot();
}

}



/* 
 * CHXAvFileView
 * -------------
 * Constructor.
 *
 */
CHXAvFileView::CHXAvFileView(TInt viewIndex, CHXAvPlayerUI *playerUI) 
: CHXAvViewBase(viewIndex, playerUI)
, m_idxInitPage(0)
{
}



/*
 * ~CHXAvFileView
 * --------------
 * Destructor.
 *
 */
CHXAvFileView::~CHXAvFileView()
{
}



/* 
 * ConstructL
 * ----------
 * Construction of elements.
 *
 */
void CHXAvFileView::ConstructL()
{
    BaseConstructL(R_AVP_FILE_VIEW_INFO);

    m_spPageInfo = new (ELeave) CHXAvFileViewPageInfoVector();
    AppendPageInfoL();

    m_spSendAppUi = CSendAppUi::NewL(ECmdSendVia); 
}



/*
 * CreatePageInfoL
 * ---------------
 * Create and add to the list all of the page info stuff.
 *
 */
void 
CHXAvFileView::AppendPageInfoL()
{
    // Get mmc and local folder information...
    HX_ASSERT(m_playerUI != NULL);
    const CHXAvVector<CHXAvMediaFolderInfoPtr>& spFolderInfo = m_playerUI->GetMediaStoreInfoL(true);

    // Add local tab...
    CHXAvFileViewPageInfoPtr spInfo1 = new (ELeave) CHXAvFileViewPageInfo();
    spInfo1->ConstructL(spFolderInfo[0]->GetRoot(), true, EMbmRealplayerFileview_local_tab, EMbmRealplayerFileview_local_tab_mask);
    CHXAvUtil::Append(*m_spPageInfo, spInfo1);

    if( spFolderInfo.Nelements() > 1 )
    {
        // Add mmc tab
        CHXAvFileViewPageInfoPtr EMbmRealplayer = new (ELeave) CHXAvFileViewPageInfo();
        EMbmRealplayer->ConstructL(spFolderInfo[1]->GetRoot(), false, EMbmRealplayerFileview_mmc_tab, EMbmRealplayerFileview_mmc_tab_mask);
	CHXAvUtil::Append(*m_spPageInfo, EMbmRealplayer);
    }
}



/*
 * HandleCommandL
 * --------------
 * Handle commands passed to us by our control and directly.
 *
 */
void CHXAvFileView::HandleCommandL(TInt command)
{
    bool bAtRoot = IsViewAtRoot(m_spWindow.raw_ptr());

    switch(command)
    {
        case EAknSoftkeyOk:
        case EOpenFolder:
        case EPlay:
            m_spWindow->UserOpenCurrentItemL();
	    break;
        case EAknSoftkeyBack:
	  HX_ASSERT(!bAtRoot);
          if( !bAtRoot )
	  {
	      // go back to root
	      m_spWindow->UserSwitchToParentFolderAndRefreshL();
	  }
	  break;
      case EAknMarkAll:
      case EAknUnmarkAll:
      case EAknCmdUnmark:
      case EAknCmdMark:
	  m_spWindow->UserMarkL(command);
	  break;
      case EShowDefaultMenu:
          ShowPopupMenuL(R_AVP_FILE_VIEW_MENU_BAR);
          break;
      case EEditPlaylist:
	  m_spWindow->UserEditCurrentItemL();
	  break;
      case EDelete:
	  m_spWindow->UserDeleteSelectedItemsL();
	  break;
      case EMoveToFolder:
	  m_spWindow->UserMoveSelectedItemsL();
	  break;
      case ECopyToFolder:
          m_spWindow->UserCopySelectedItemsL();
          break;
      case ENewFolder:
	  m_spWindow->UserNewFolderL();
	  break;
      case ERename:
	  m_spWindow->UserRenameCurrentItemL();
	  break;
	  /*
      case EAknCmdAddToPinboard:
	  m_spWindow->UserAddSelectedToPinboardL();
	  break;*/
      case ECmdSendVia:
      case ECmdSendCmd1:
      case ECmdSendCmd2:
      case ECmdSendCmd3:
      case ECmdSendCmd4:
      case ECmdSendCmd5:
      case ECmdSendCmd6:
	  m_spWindow->UserSendSelectedItemsL(command, m_spSendAppUi.Ptr());
	  break;
      case EUnlockDrive:
        m_spWindow->UserUnlockDriveL();
        break;
    default:
        m_playerUI->HandleCommandL(command);
	break;
    }
}





/*
 * UpdateViewStateL
 * ----------------
 *
 */
////////////////////////////////////////////////////////
// make sure view state (everything but window area) appropriately
// reflects state of the file view window; updates menu bar commands
// and title text
void CHXAvFileView::UpdateViewStateL()
{
    if(IsViewAtRoot(m_spWindow.raw_ptr()))
    {
	Cba()->SetCommandSetL(R_AVKON_SOFTKEYS_OPTIONS_EXIT);

        // use long caption from caption resource; initially overridden app title is shown
        SetDefaultAppTitleL();
    }
    else
    {
	Cba()->SetCommandSetL(R_AVKON_SOFTKEYS_OPTIONS_BACK);

        CHXAvFolderDisplayInfo info;
        info.SetFolderPathL(m_spWindow->GetFullPath());

        // in case folder name has weird control characters 
        HBufC* pFixedText = CHXAvMisc::AllocDisplayFriendlyStringL(info.GetDisplayText());
        AUTO_PUSH_POP_DEL(pFixedText);
        m_titlePane->SetTextL(*pFixedText);
    }
    UpdateMenuBar();
    Cba()->DrawNow();
    m_spWindow->UpdateTopAndBottomL();
}

/////////////////////////////////////
// set menu bar, depending on whether or not current window
// view represents a valid (accessible) drive or not
void CHXAvFileView::UpdateMenuBar()
{
    TInt idMenuBar = m_spWindow->GetStore() ? R_AVP_FILE_VIEW_MENU_BAR : R_AVP_FILE_VIEW_NODRIVE_MENU_BAR;
    MenuBar()->SetMenuTitleResourceId(idMenuBar);
}

/*
 * CreateViewWindowForActivatingViewL
 * -------------------
 * Construct view window needed for active view
 *
 */
CCoeControl* CHXAvFileView::CreateViewWindowForActivatingViewL()
{
    DPRINTF(SYMP_INFO, ("CHXAvFileView::CreateViewWindowForActivatingViewL()\n"));
    if (!m_spWindow)
    {
        m_spWindow = new (ELeave) CHXAvFileViewWindow();
        HX_ASSERT(m_spPageInfo);        
        m_spWindow->ConstructL(ClientRect(), m_playerUI, this, m_spPageInfo, m_idxInitPage);
    }

    return m_spWindow.raw_ptr();
}


/*
 * FinishViewDeactivateL
 * ---------------------
 *
 */
void CHXAvFileView::FinishViewDeactivateL()
{
    DPRINTF(SYMP_INFO, ("CHXAvFileView::FinishViewDeactivateL()\n"));
    if( m_spWindow )
    {
        // remember the index of the page that is currently visible
        m_idxInitPage = m_spWindow->GetCurrentPageIndex();
        HX_ASSERT(m_idxInitPage >= 0);
        m_spWindow->SaveCurrentPageInfoL();
        m_spWindow = 0; 
    }
} 

 
/* 
 * DynInitMenuPaneL
 * ----------------
 * Called when a menu pane is about to be displayed.
 *
 */
void
CHXAvFileView::DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane)
{

    HX_ASSERT(m_spWindow);
    switch (aResourceId)
    {
	case R_AVP_FILE_VIEW_MENU_PANE:
	    InitMainMenuPaneL(aMenuPane);
	    break;
	case R_AVP_MARK_MENU_PANE:
	    InitMarkMenuPaneL(aMenuPane);
	    break;
        case R_AVP_OPEN_MENU_PANE:
            InitOpenMenuPaneL(aMenuPane);
	    break;
        case R_SENDUI_MENU:
	    m_spSendAppUi->DisplaySendCascadeMenuL(*aMenuPane);
	    break;
        case R_AVP_FILE_VIEW_NODRIVE_MENU_PANE:
            aMenuPane->SetItemDimmed(EUnlockDrive, !m_spWindow->IsDriveLocked());
            CHXAvMisc::InitDebugMenuItemsL(aMenuPane);
            CHXAvMisc::InitHelpMenuItem(aMenuPane);
            break;
        default:
            break;
    }
}




/*
 * InitMainMenuPaneL
 * -----------------
 * Main menu is set up here.
 *
 */
void 
CHXAvFileView::InitMainMenuPaneL(CEikMenuPane* pPane)
{
    HX_ASSERT(m_spSendAppUi);

    //
    // note:
    //
    // only files can be marked
    // any items marked -> selection applies to marks
    // no items marked -> selection applies to hilight item
    //
    bool bItemsAreMarked = m_spWindow->GetMarkedItemCount() > 0;
    bool bAtLeastOneItemSelected = bItemsAreMarked || m_spWindow->HasHilightItem();
    bool bSingleItemSelected = m_spWindow->HasHilightItem() && !bItemsAreMarked;
    bool bSingleFileSelected = bSingleItemSelected && m_spWindow->HilightItemIsFile();
    bool bSingleFolderSelected = bSingleItemSelected && !m_spWindow->HilightItemIsFile();
    bool bOneOrMoreFilesSelected = bItemsAreMarked || bSingleFileSelected;
    bool bAtLeastOneFileInView = !m_spWindow->IsEmpty() && (m_spWindow->GetUnmarkedItemCount() + m_spWindow->GetMarkedItemCount() > 0);
    bool bPlaylistItemSelected = bSingleFileSelected && m_spWindow->HilightItemIsPlaylist();
    
    
    pPane->SetItemDimmed(EPlay, !bSingleFileSelected);
    pPane->SetItemDimmed(EOpenFolder, !bSingleFolderSelected);
    pPane->SetItemDimmed(EDelete, !bAtLeastOneItemSelected);
    pPane->SetItemDimmed(EMarkCascade, !bAtLeastOneFileInView);
    pPane->SetItemDimmed(ERename, !bSingleItemSelected);
    pPane->SetItemDimmed(EMoveToFolder, !bOneOrMoreFilesSelected);
    pPane->SetItemDimmed(ECopyToFolder, true /*!bOneOrMoreFilesSelected*/); //XXXLCM
    pPane->SetItemDimmed(EEditPlaylist, !bPlaylistItemSelected);
    //pPane->SetItemDimmed(EViewInfo, !bSingleFileSelected);
    // enable create folder item only if page allows it at current level
    pPane->SetItemDimmed(ENewFolder, !m_spWindow->IsCreateChildFolderAllowed());

    if (bOneOrMoreFilesSelected)
    {
	// send
	TSendingCapabilities caps(0, 1024,
				  TSendingCapabilities::ESupportsAttachments );
	TInt pos = 0;
	pPane->ItemAndPos(EMarkCascade, pos);
	m_spSendAppUi->DisplaySendMenuItemL(*pPane, pos + 1, caps);

	// add to pinboard
	//m_playerUI->PinbModel().AddLinkMenuItemL(*pPane, ECmdSendVia);
    }

    CHXAvMisc::InitDebugMenuItemsL(pPane);
    CHXAvMisc::InitHelpMenuItem(pPane);
   
}






/*
 * InitMarkMenuPaneL
 * -----------------
 * Marked items menu.
 *
 */ 
void 
CHXAvFileView::InitMarkMenuPaneL(CEikMenuPane* pPane)
{
    HX_ASSERT(!m_spWindow->IsEmpty());

    // we can unmark the hilight item if it is marked
    pPane->SetItemDimmed(EAknCmdUnmark, !m_spWindow->HilightItemIsMarked());

    // we can mark the hilight item if it is a file (and unmarked)
    TBool bMarkable = !m_spWindow->HilightItemIsMarked() &&
	m_spWindow->HilightItemIsFile();
    pPane->SetItemDimmed(EAknCmdMark, !bMarkable);

    TBool bHasMarkedItems = m_spWindow->GetMarkedItemCount() > 0;
    TBool bHasUnMarkedMarkableItems = m_spWindow->GetUnmarkedItemCount() > 0;
    pPane->SetItemDimmed(EAknMarkAll, !bHasUnMarkedMarkableItems);
    pPane->SetItemDimmed(EAknUnmarkAll, !bHasMarkedItems);
}




/*
 * InitOpenMenuPaneL
 * -----------------
 * Open menu items.
 *
 */
void 
CHXAvFileView::InitOpenMenuPaneL(CEikMenuPane* pPane)
{
    // see if the guide exists
    const TDesC& guide = m_playerUI->GetGuideUrlL(true);
    bool bGuideExists = (guide.Length() > 0);

    // only show 'open guide' if guide home page exists
    pPane->SetItemDimmed(EOpenGuide, !bGuideExists);

    // only show 'open recent' if at least one recent clip exists
    pPane->SetItemDimmed(EOpenRecentDialog, (m_playerUI->GetRecentClipCount() == 0));
}

⌨️ 快捷键说明

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