filemanager/src/filemanager/src/fmdriverlistwidget.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 16 Apr 2010 14:53:38 +0300
changeset 14 1957042d8c7e
child 16 ada7962b4308
permissions -rw-r--r--
Revision: 201011 Kit: 201015

/*
 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of "Eclipse Public License v1.0"
 * which accompanies this distribution, and is available
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
 *
 * Initial Contributors:
 * Nokia Corporation - initial contribution.
 * 
 * Contributors:
 *     Yong Zhang <yong.5.zhang@nokia.com>
 * 
 * Description:
 *     The driver model file for file manager
 */
#include "fmdriverlistwidget.h"
#include "listviewitems.h"
#include "fmutils.h"
#include "fmdlgutils.h"
#include "fmviewmanager.h"
#include "fmviewdetailsdialog.h"
#include "fmoperationbase.h"
#include "fmdrivemodel.h"
#include "fmfiledialog.h"

#include <QDirModel>
#include <QGraphicsLinearLayout>
#include <QFileSystemWatcher>

#include <hblistview.h>
#include <hbmenu.h>
#include <hbaction.h>
#include <hbmessagebox.h>
#include <hbsearchpanel.h>

FmDriverListWidget::FmDriverListWidget( QGraphicsItem *parent )
: HbWidget( parent ),
  mCurrentItem( 0 ),
  mOperationService( 0 )
{
	init();
	mOperationService = FmViewManager::viewManager()->operationService();

    mFileSystemWatcher = new QFileSystemWatcher( this );
    connect( mFileSystemWatcher, SIGNAL( directoryChanged ( const QString & ) ), 
            this, SLOT( on_directoryChanged( const QString & ) ) ); 
    
    QMetaObject::connectSlotsByName( this );
}

FmDriverListWidget::~FmDriverListWidget()
{
}

void FmDriverListWidget::on_list_activated( const QModelIndex &index )
{
	emit activated( mModel->driveName( index ) );
}

void FmDriverListWidget::init()
{
	mLayout = new QGraphicsLinearLayout( this );
	mLayout->setOrientation( Qt::Vertical );

	mListView = new HbListView( this );
	mListView->setSelectionMode( HbAbstractItemView::SingleSelection );

	mModel = new FmDriveModel( this,
         FmDriveModel::FillWithVolume | FmDriveModel::FillWithDefaultVolume );
	mListView->setModel( mModel );

	mLayout->addItem( mListView );
	
	mSearchPanel = new HbSearchPanel( this );
	mSearchPanel->setObjectName( "searchPanel" );
	mSearchPanel->setSearchOptionsEnabled( true );
	mSearchPanel->setProgressive( false );
	mSearchPanel->hide();
//	mLayout->addItem( mSearchPanel );
    
	mListView->setItemPrototype( new DiskListViewItem( mListView ) );
	connect( mListView, SIGNAL( activated( const QModelIndex & ) ),
		     this, SLOT( on_list_activated( const QModelIndex & ) ) );

    connect( mListView, SIGNAL( longPressed( HbAbstractViewItem *, const QPointF & ) ),
        this, SLOT( on_list_longPressed( HbAbstractViewItem *, const QPointF & ) ) );
    
    connect( mSearchPanel, SIGNAL( searchOptionsClicked() ),
        this, SLOT( on_searchPanel_searchOptionsClicked() ) );
    
    connect( mSearchPanel, SIGNAL( criteriaChanged( const QString & ) ),
        this, SLOT( on_searchPanel_criteriaChanged( const QString & ) ) );
       
    connect( mSearchPanel, SIGNAL( exitClicked() ),
        this, SLOT( on_searchPanel_exitClicked() ) );
    
    setLayout( mLayout );
}

void FmDriverListWidget::refreshModel( const QString &path )
{
    Q_UNUSED( path );
    mModel->refresh();
}

void FmDriverListWidget::on_list_longPressed( HbAbstractViewItem *item, const QPointF &coords )
{   
    HbMenu *contextMenu = new HbMenu();

    mCurrentItem = item;
    QString diskName = mCurrentItem->modelIndex().data( Qt::DisplayRole ).toString();

    quint32 state = FmUtils::getDriverState( diskName );
    FmDriverInfo driverInfo = FmUtils::queryDriverInfo( diskName );

    if( !( state & FmDriverInfo::EDriveNotPresent ) ) {
        HbAction *viewAction = new HbAction();
        viewAction->setObjectName( "viewAction" );
        viewAction->setText( tr( "View details" ) );
        contextMenu->addAction( viewAction );

        //state = 0x210;
    
        connect( viewAction, SIGNAL( triggered() ),
        this, SLOT( on_viewAction_triggered() ) );
    }

    HbMenu *subMenu = new HbMenu( "Memory name" );
    if( ( state & FmDriverInfo::EDriveRemovable ) && !( state & FmDriverInfo::EDriveMassStorage ) ){
        if ( driverInfo.volumeName().length() ){
            HbAction *renameAction = new HbAction();
            renameAction->setObjectName( "renameAction" );
            renameAction->setText( tr( "Rename" ) );
            subMenu->addAction( renameAction );

            connect( renameAction, SIGNAL( triggered() ),
		     this, SLOT( on_renameAction_triggered() ) );
        }
        else{
            HbAction *nameAction = new HbAction();
            nameAction->setObjectName( "nameAction" );
            nameAction->setText( tr( "Name" ) );
            subMenu->addAction( nameAction );

            connect( nameAction, SIGNAL( triggered() ),
		     this, SLOT( on_nameAction_triggered() ) );
        }
        contextMenu->addMenu( subMenu );

        subMenu = new HbMenu( "Memory password" );
        if( state & FmDriverInfo::EDrivePasswordProtected ){
            HbAction *changePwdAction = new HbAction();
            changePwdAction->setObjectName( "changePwdAction" );
            changePwdAction->setText( tr( "Change Password" ) );
            subMenu->addAction( changePwdAction );

            HbAction *removePwdAction = new HbAction();
            removePwdAction->setObjectName( "removePwdAction" );
            removePwdAction->setText( tr( "Remove Password" ) );
            subMenu->addAction( removePwdAction );

            connect( changePwdAction, SIGNAL( triggered() ),
		     this, SLOT( on_changePwdAction_triggered() ) );
            connect( removePwdAction, SIGNAL( triggered() ),
		     this, SLOT( on_removePwdAction_triggered() ) );
        }
        else{
            HbAction *setPwdAction = new HbAction();
            setPwdAction->setObjectName( "setPwdAction" );
            setPwdAction->setText( tr( "Set Password" ) );
            subMenu->addAction( setPwdAction );

            connect( setPwdAction, SIGNAL( triggered() ),
		     this, SLOT( on_setPwdAction_triggered() ) );
        }
        contextMenu->addMenu( subMenu );
         
        if( state & FmDriverInfo::EDriveEjectable ){
            HbAction *ejectAction = new HbAction();
            ejectAction->setObjectName( "ejectAction" );
            ejectAction->setText( tr( "Eject" ) );
            contextMenu->addAction( ejectAction );
            
            connect( ejectAction, SIGNAL( triggered() ),
            this, SLOT( on_ejectAction_triggered() ) );
        }         
    }
#ifndef _DEBUG_ENABLE_FORMATMENU_
    if ( state & FmDriverInfo::EDriveRemovable ){
        if( state & FmDriverInfo::EDriveFormattable ){
#endif
            HbAction *formatAction = new HbAction();
            formatAction->setObjectName( "formatAction" );
            formatAction->setText( tr( "Format" ) );
            contextMenu->addAction( formatAction );

            connect( formatAction, SIGNAL( triggered() ),
             this, SLOT( on_formatAction_triggered() ) );
#ifndef _DEBUG_ENABLE_FORMATMENU_
        }
    }
#endif
    
    if( state & FmDriverInfo::EDriveLocked ){
        HbAction *unLockedAction = new HbAction();
        unLockedAction->setObjectName( "unLockedAction" );
        unLockedAction->setText( tr( "Unlock" ) );
        contextMenu->addAction( unLockedAction );

        connect( unLockedAction, SIGNAL( triggered() ),
         this, SLOT( on_unLockedAction_triggered() ) );
    } 

    contextMenu->exec( coords );   
}

void FmDriverListWidget::on_viewAction_triggered()
{
    QString diskName = mCurrentItem->modelIndex().data( Qt::DisplayRole ).toString();
    mOperationService->asyncViewDriveDetails( diskName );
}

void FmDriverListWidget::on_renameAction_triggered()
{    
    QString diskName = mCurrentItem->modelIndex().data( Qt::DisplayRole ).toString();

    quint32 state = FmUtils::getDriverState( diskName );
    FmDriverInfo driverInfo = FmUtils::queryDriverInfo( diskName );

    if ( state & FmDriverInfo::EDriveWriteProtected ){
        HbMessageBox::information( tr( "Unable to perform operation. Memory card is read only." ) );
        return;
        }

    QString title( tr( "Drive name ") );  
    QString volumeName = driverInfo.volumeName();

    if( FmDlgUtils::showTextQuery( title, volumeName ) ){

        if ( FmUtils::renameDrive( diskName, volumeName ) == 0 ){
             HbMessageBox::information( tr( "The name has been changed!" ) );
             mModel->refresh();
        }
        else{
             HbMessageBox::information( tr( "Error occurred, operation cancelled!" ) );
        }                
    }
}

void FmDriverListWidget::on_nameAction_triggered()
{
    on_renameAction_triggered();
}

void FmDriverListWidget::on_changePwdAction_triggered()
{
    QString title( tr( "Password: ")  );
    QString firstLabel( tr( "New Password: ") );
    QString secondLabel( tr( "Confirm new Password: ") );

    QString oldPwd;
    QString newPwd;

    QString diskName = mCurrentItem->modelIndex().data( Qt::DisplayRole ).toString();

    if( FmDlgUtils::showConfirmPasswordQuery( title, diskName, oldPwd ) ){
        if( FmDlgUtils::showChangePasswordQuery( firstLabel, secondLabel, newPwd ) ){
            if ( FmUtils::setDrivePwd( diskName, oldPwd, newPwd ) == 0 ){
                HbMessageBox::information( tr( "The password has been changed!" ) );
            }
            else{
                HbMessageBox::information( tr( "Error occurred, operation cancelled!" ) );
            }
        }
    }
}

void FmDriverListWidget::on_removePwdAction_triggered()
{
    QString title( tr( "Password: ")  );

    QString oldPwd;

    QString diskName = mCurrentItem->modelIndex().data( Qt::DisplayRole ).toString();
    //QString password( tr( "a ") );
    if( HbMessageBox::question( tr( "Do you want to remove the password? Memory card becomes unlocked." ) ) ){
        if( FmDlgUtils::showConfirmPasswordQuery( title, diskName, oldPwd ) ){

            if ( FmUtils::removeDrivePwd( diskName, oldPwd ) == 0 ){
                HbMessageBox::information( tr( "The password has been removed!" ) );
            }
            else{
                HbMessageBox::information( tr( "Error occurred, operation cancelled!" ) );
            }
        }
    }
}

void FmDriverListWidget::on_unLockedAction_triggered()
{
    QString title( tr( "Password: ")  );

    QString oldPwd;

    QString diskName = mCurrentItem->modelIndex().data( Qt::DisplayRole ).toString();
    
    if( FmDlgUtils::showConfirmPasswordQuery( title, diskName, oldPwd ) ){

        if ( FmUtils::unlockDrive( diskName, oldPwd ) == 0 ){
            HbMessageBox::information( tr( "The memory is unlocked!" ) );
        }
        else{
            HbMessageBox::information( tr( "Error occurred, operation cancelled!" ) );
        }
    }
}

void FmDriverListWidget::on_setPwdAction_triggered()
{
    QString firstLabel( tr( "New Password: ") );
    QString secondLabel( tr( "Confirm new Password: ") );

    QString oldPwd;
    QString newPwd;

    FmUtils::emptyPwd( oldPwd );

    QString diskName = mCurrentItem->modelIndex().data( Qt::DisplayRole ).toString();

    if( FmDlgUtils::showChangePasswordQuery( firstLabel, secondLabel, newPwd ) ){
        if ( FmUtils::setDrivePwd( diskName, oldPwd, newPwd ) == 0 ){
            HbMessageBox::information( tr( "The password has been set!" ) );
        }
        else{
            HbMessageBox::information( tr( "Error occurred, operation cancelled!" ) );
        }
    }
}

void FmDriverListWidget::on_formatAction_triggered()
{
    QString diskName = mCurrentItem->modelIndex().data( Qt::DisplayRole ).toString();

    if( HbMessageBox::question( tr( "Format? Data will be deleted during formatting." ) ) ){
        if( FmErrNone != mOperationService->asyncFormat( diskName ) )
            HbMessageBox::information( tr( "Formatting failed." ) );
        }

}

void FmDriverListWidget::on_ejectAction_triggered()
{
    QString diskName = mCurrentItem->modelIndex().data( Qt::DisplayRole ).toString();

    if( HbMessageBox::question( tr( "Eject memory card? Some applications will be closed." ) ) ){
        if( !FmUtils::ejectDrive( diskName ) ){  
            HbMessageBox::information( tr( "Error occurred, operation cancelled!") );
        }
    }
}

void FmDriverListWidget::on_directoryChanged( const QString &path )
{
    Q_UNUSED( path );
    mModel->refresh();
}

void FmDriverListWidget::activeSearchPanel()
{
    mFindTargetPath.clear();
    mLayout->addItem( mSearchPanel );
    mSearchPanel->show();
}

void FmDriverListWidget::on_searchPanel_searchOptionsClicked()
{
    mFindTargetPath = FmFileDialog::getExistingDirectory( 0, tr( "Look in:" ),
        QString(""), QStringList() );
}

void FmDriverListWidget::on_searchPanel_criteriaChanged( const QString &criteria )
{
    emit startSearch( mFindTargetPath, criteria );
    mSearchPanel->hide();
    mLayout->removeItem( mSearchPanel );
}

void FmDriverListWidget::on_searchPanel_exitClicked()
{
    mSearchPanel->hide();
    mLayout->removeItem( mSearchPanel );
}