diff -r 95243422089a -r 491b3ed49290 filemanager/src/filemanager/src/fmdriverlistwidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/filemanager/src/filemanager/src/fmdriverlistwidget.cpp Tue Aug 31 15:06:05 2010 +0300 @@ -0,0 +1,459 @@ +/* + * 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 + * + * Description: + * The driver model file for file manager + */ +#include "fmdriverlistwidget.h" +#include "fmutils.h" +#include "fmdlgutils.h" +#include "fmviewmanager.h" +#include "fmviewdetailsdialog.h" +#include "fmoperationbase.h" +#include "fmdrivemodel.h" +#include "fmfiledialog.h" +#include "fmoperationservice.h" +#include +#include +#include +#include + +#include +#include +#include +#include + +FmDriverListWidget::FmDriverListWidget( QGraphicsItem *parent ) +: HbWidget( parent ), mListView(0), mModel(0), + mCurrentItem(0), mSearchPanel(0), + mFileSystemWatcher(0), mLayout(0), mContextMenu(0), mListLongPressed( false ) +{ + init(); + mFileSystemWatcher = new QFileSystemWatcher( this ); + connect( mFileSystemWatcher, SIGNAL( directoryChanged ( const QString & ) ), + this, SLOT( on_directoryChanged( const QString & ) ) ); + + QMetaObject::connectSlotsByName( this ); +} + +FmDriverListWidget::~FmDriverListWidget() +{ + if (mContextMenu) { + mContextMenu->deleteLater(); + } +} + +void FmDriverListWidget::on_list_activated( const QModelIndex &index ) +{ + FM_LOG("FmDriverListWidget::on_list_activated"); + if( mListLongPressed ) { + FM_LOG("FmDriverListWidget::on_list_activated return because long pressed"); + return; + } + FM_LOG("FmDriverListWidget::on_list_activated emit activate to open drive"); + emit activated( mModel->driveName( index ) ); +} + +void FmDriverListWidget::init() +{ + mLayout = new QGraphicsLinearLayout( this ); + mLayout->setOrientation( Qt::Vertical ); + + mListView = new HbListView( this ); + mListView->setLayoutName( "drive" ); + mModel = new FmDriveModel( this, + FmDriveModel::FillWithVolume | FmDriveModel::FillWithDefaultVolume | + FmDriveModel::FillWithTotalSize | FmDriveModel::FillWithFreeSize ); + mListView->setModel( mModel ); + mLayout->addItem( mListView ); + mSearchPanel = new HbSearchPanel( this ); + mSearchPanel->setObjectName( "searchPanel" ); + mSearchPanel->setSearchOptionsEnabled( true ); + mSearchPanel->setProgressive( false ); + mSearchPanel->hide(); + connect( mListView, SIGNAL( activated( const QModelIndex & ) ), + this, SLOT( on_list_activated( const QModelIndex & ) ) ); + connect( mListView, SIGNAL( pressed( const QModelIndex & ) ), + this, SLOT( on_list_pressed( 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() ), Qt::QueuedConnection ); + + 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::refreshDrive() +{ + mModel->refresh(); +} + +void FmDriverListWidget::on_list_longPressed( HbAbstractViewItem *item, const QPointF &coords ) +{ + FM_LOG("FmDriverListWidget::on_list_longPressed"); + mListLongPressed = true; + mCurrentItem = item; + QString diskName = mModel->driveName( mCurrentItem->modelIndex() ); + + if( !mContextMenu ) { + mContextMenu = new HbMenu(); + } else { + mContextMenu->clearActions(); + } + FmDriverInfo driverInfo = FmUtils::queryDriverInfo( diskName ); + FmDriverInfo::DriveType driveType = driverInfo.driveType(); + FmDriverInfo::DriveState state = driverInfo.driveState(); + if( !( state & FmDriverInfo::EDriveNotPresent ) ) { + if( state & FmDriverInfo::EDriveAvailable ) { + HbAction *viewAction = new HbAction(); + viewAction->setObjectName( "viewAction" ); + viewAction->setText( hbTrId( "txt_fmgr_menu_view_details_memory" ) ); + mContextMenu->addAction( viewAction ); + connect( viewAction, SIGNAL( triggered() ), + this, SLOT( on_viewAction_triggered() ), Qt::QueuedConnection ); + + if( driveType == FmDriverInfo::EDriveTypeMemoryCard || driveType == FmDriverInfo::EDriveTypeUsbMemory ) { + // MMC or Usb memory + + // Name/Rename action + if ( driverInfo.volumeName().length() ){ + HbAction *renameAction = new HbAction(); + renameAction->setObjectName( "renameAction" ); + renameAction->setText( hbTrId( "txt_fmgr_menu_rename" ) ); + mContextMenu->addAction( renameAction ); + + connect( renameAction, SIGNAL( triggered() ), + this, SLOT( on_renameAction_triggered() ), Qt::QueuedConnection ); + } else { + HbAction *nameAction = new HbAction(); + nameAction->setObjectName( "nameAction" ); + nameAction->setText( hbTrId( "txt_fmgr_menu_name" ) ); + mContextMenu->addAction( nameAction ); + + connect( nameAction, SIGNAL( triggered() ), + this, SLOT( on_nameAction_triggered() ), Qt::QueuedConnection ); + } + + // Set/Change/Remove password action + if( driveType == FmDriverInfo::EDriveTypeMemoryCard ) { // MMC + if( state & FmDriverInfo::EDrivePasswordProtected ){ + HbAction *changePwdAction = new HbAction(); + changePwdAction->setObjectName( "changePwdAction" ); + changePwdAction->setText( hbTrId( "txt_fmgr_menu_change_password" ) ); + mContextMenu->addAction( changePwdAction ); + + HbAction *removePwdAction = new HbAction(); + removePwdAction->setObjectName( "removePwdAction" ); + removePwdAction->setText( hbTrId( "txt_fmgr_menu_remove_password" ) ); + mContextMenu->addAction( removePwdAction ); + + connect( changePwdAction, SIGNAL( triggered() ), + this, SLOT( on_changePwdAction_triggered() ), Qt::QueuedConnection ); + connect( removePwdAction, SIGNAL( triggered() ), + this, SLOT( on_removePwdAction_triggered() ), Qt::QueuedConnection ); + } + else{ + HbAction *setPwdAction = new HbAction(); + setPwdAction->setObjectName( "setPwdAction" ); + setPwdAction->setText( hbTrId( "txt_fmgr_menu_set_password" ) ); + mContextMenu->addAction( setPwdAction ); + + connect( setPwdAction, SIGNAL( triggered() ), + this, SLOT( on_setPwdAction_triggered() ), Qt::QueuedConnection ); + } + } + } //if( driveType == FmDriverInfo::EDriveTypeMemoryCard || driveType == FmDriverInfo::EDriveTypeUsbMemory ) + } //if( state & FmDriverInfo::EDriveAvailable ) + + // Eject action + // put outside of EDriveAvailable so that removable drive which is corrupted or locked can be removed + if( state & FmDriverInfo::EDriveEjectable ){ + HbAction *ejectAction = new HbAction(); + ejectAction->setObjectName( "ejectAction" ); + ejectAction->setText( hbTrId( "txt_fmgr_menu_eject" ) ); + mContextMenu->addAction( ejectAction ); + + connect( ejectAction, SIGNAL( triggered() ), + this, SLOT( on_ejectAction_triggered() ), Qt::QueuedConnection ); + } + + // Format action + if ( ( state & FmDriverInfo::EDriveRemovable ) || ( state & FmDriverInfo::EDriveCorrupted ) + || ( state & FmDriverInfo::EDriveLocked ) ){ + HbAction *formatAction = new HbAction(); + formatAction->setObjectName( "formatAction" ); + formatAction->setText( hbTrId( "txt_fmgr_menu_format" ) ); + mContextMenu->addAction( formatAction ); + + connect( formatAction, SIGNAL( triggered() ), + this, SLOT( on_formatAction_triggered() ), Qt::QueuedConnection ); + } + } //if( !( state & FmDriverInfo::EDriveNotPresent ) ) + + // Unlock action + // put ouside of !EDriveNotPresent judgment so that + // user could unlock drive if connected to PC with mass storage mode + if( state & FmDriverInfo::EDriveLocked ){ + HbAction *unLockedAction = new HbAction(); + unLockedAction->setObjectName( "unLockedAction" ); + unLockedAction->setText( hbTrId( "Unlock" ) ); + mContextMenu->addAction( unLockedAction ); + + connect( unLockedAction, SIGNAL( triggered() ), + this, SLOT( on_unLockedAction_triggered() ), Qt::QueuedConnection ); + } + + // Pop up menu or open drive + if( mContextMenu->actions().count() > 0 ) { + mContextMenu->setPreferredPos( coords ); + mContextMenu->open(); + } else { + emit activated( diskName ); + } +} + +void FmDriverListWidget::on_list_pressed( const QModelIndex & index ) +{ + Q_UNUSED( index ); + mListLongPressed = false; +} + +void FmDriverListWidget::on_viewAction_triggered() +{ + QString diskName = mModel->driveName( mCurrentItem->modelIndex() ); + FmViewManager::viewManager()->operationService()->asyncViewDriveDetails( diskName ); +} + +void FmDriverListWidget::on_renameAction_triggered() +{ + QString diskName = mModel->driveName( mCurrentItem->modelIndex() ); + + FmDriverInfo::DriveState state = FmUtils::queryDriverInfo( diskName ).driveState(); + FmDriverInfo driverInfo = FmUtils::queryDriverInfo( diskName ); + + if ( state & FmDriverInfo::EDriveWriteProtected ){ + FmDlgUtils::information( hbTrId( "Unable to perform operation. Memory card is read only." ) ); + return; + } + + QString title( hbTrId( "Drive name ") ); + //save the volume status, empty or set + bool needToSetVolume = false; + QString volumeName = FmUtils::getVolumeNameWithDefaultNameIfNull( diskName, needToSetVolume ); + QString oldVolumeName( volumeName ); + QString associatedDrives( FmUtils::getDriveLetterFromPath( diskName ) ); + //use isReturnFalseWhenNoTextChanged = false in order that FmUtils::renameDrive( driveName, volumeName ) will + //be excuted at lease once to set the volume name. + while( FmDlgUtils::showTextQuery( title, volumeName, QStringList(), FmMaxLengthofDriveName, associatedDrives, false ) ){ + //if volume is not set or oldVolumeName != volumeName , FmUtils::renameDrive will be called + if ( oldVolumeName == volumeName && !needToSetVolume ) { + break; + } + int err = FmUtils::renameDrive( diskName, volumeName ); + if ( err == FmErrNone ) { + FmDlgUtils::information( hbTrId( "The name has been changed!" ) ); + mModel->refresh(); + break; + } else if( err == FmErrBadName ) { + FmDlgUtils::information( hbTrId( "Illegal characters! Use only letters and numbers." ) ); + } else{ + FmDlgUtils::information( hbTrId( "Error occurred, operation cancelled!" ) ); + break; + } + } +} + +void FmDriverListWidget::on_nameAction_triggered() +{ + on_renameAction_triggered(); +} + +void FmDriverListWidget::on_setPwdAction_triggered() +{ + QString firstLabel( hbTrId( "New Password: ") ); + QString secondLabel( hbTrId( "Confirm new Password: ") ); + + QString oldPwd; + QString newPwd; + + FmUtils::emptyPwd( oldPwd ); + + QString diskName = mModel->driveName( mCurrentItem->modelIndex() ); + + QString associatedDrives( FmUtils::getDriveLetterFromPath( diskName ) ); + if( FmDlgUtils::showMultiPasswordQuery( firstLabel, secondLabel, newPwd, FmMaxLengthofDrivePassword, associatedDrives ) ) { + if ( FmUtils::setDrivePwd( diskName, oldPwd, newPwd ) == 0 ){ + FmDlgUtils::information( hbTrId( "The password has been set!" ) ); + } + else{ + FmDlgUtils::information( hbTrId( "Error occurred, operation cancelled!" ) ); + } + } +} + +void FmDriverListWidget::on_changePwdAction_triggered() +{ + QString title( hbTrId( "txt_common_dialog_password") ); + QString firstLabel( hbTrId( "txt_common_dialog_new_password") ); + QString secondLabel( hbTrId( "Confirm new Password: ") ); + + QString oldPwd; + QString newPwd; + + QString diskName = mModel->driveName( mCurrentItem->modelIndex() ); + + QString associatedDrives( FmUtils::getDriveLetterFromPath( diskName ) ); + while( FmDlgUtils::showSinglePasswordQuery( title, oldPwd, FmMaxLengthofDrivePassword, associatedDrives ) ) { + if ( FmUtils::checkDrivePwd( diskName, oldPwd ) == 0 ){ + if( FmDlgUtils::showMultiPasswordQuery( firstLabel, secondLabel, newPwd, FmMaxLengthofDrivePassword, associatedDrives ) ){ + if ( FmUtils::setDrivePwd( diskName, oldPwd, newPwd ) == 0 ){ + FmDlgUtils::information( hbTrId( "The password has been changed!" ) ); + } else { + FmDlgUtils::information( hbTrId( "Error occurred, operation cancelled!" ) ); + } + break; + } else { + //cancel muti password query + break; + } + } else { + FmDlgUtils::information( hbTrId( "The password is incorrect, try again!" ) ); + } + + } +} + +void FmDriverListWidget::on_removePwdAction_triggered() +{ + QString title( hbTrId( "Password: ") ); + + QString oldPwd; + + QString diskName = mModel->driveName( mCurrentItem->modelIndex() ); + if( FmDlgUtils::question( hbTrId( "Do you want to remove the password? Memory card becomes unlocked." ) ) ){ + QString associatedDrives( FmUtils::getDriveLetterFromPath( diskName ) ); + while( FmDlgUtils::showSinglePasswordQuery( title, oldPwd, FmMaxLengthofDrivePassword, associatedDrives ) ) { + if ( FmUtils::checkDrivePwd( diskName, oldPwd ) == 0 ) { + if ( FmUtils::removeDrivePwd( diskName, oldPwd ) == 0 ){ + FmDlgUtils::information( hbTrId( "The password has been removed!" ) ); + } + else{ + FmDlgUtils::information( hbTrId( "Error occurred, operation cancelled!" ) ); + } + break; + } + else { + FmDlgUtils::information( hbTrId( "The password is incorrect, try again!" ) ); + } + + } + } +} + +void FmDriverListWidget::on_unLockedAction_triggered() +{ + QString title( hbTrId( "Password: ") ); + + QString oldPwd; + + QString diskName = mModel->driveName( mCurrentItem->modelIndex() ); + + //Do not add associatedDrives as Locked MMC is not available Drive but only present Drive + while( FmDlgUtils::showSinglePasswordQuery( title, oldPwd, FmMaxLengthofDrivePassword ) ) { + int err = FmUtils::unlockDrive( diskName, oldPwd ); + if( err == FmErrNone ) { + FmDlgUtils::information( hbTrId( "The memory is unlocked!" ) ); + break; + } else if ( err == FmErrAccessDenied ) { + FmDlgUtils::information( hbTrId( "The password is incorrect, try again!" ) ); + } else if (err == FmErrAlreadyExists ) { + FmDlgUtils::information( hbTrId( "The disk has already been unlocked!" ) ); + break; + } else if( err == FmErrNotSupported ) { + FmDlgUtils::information( hbTrId( "The media does not support password locking!" ) ); + break; + } else { + FmDlgUtils::information( hbTrId( "Error occurred, operation cancelled!" ) ); + break; + } + } +} + +void FmDriverListWidget::on_formatAction_triggered() +{ + QString diskName = mModel->driveName( mCurrentItem->modelIndex() ); + + if( FmDlgUtils::question( hbTrId( "Format? Data will be deleted during formatting." ) ) ){ + if( FmErrNone != FmViewManager::viewManager()->operationService()->asyncFormat( diskName ) ) + FmDlgUtils::information( hbTrId( "Formatting failed." ) ); + } +} + +void FmDriverListWidget::on_ejectAction_triggered() +{ + QString diskName = mModel->driveName( mCurrentItem->modelIndex() ); + + if( FmDlgUtils::question( hbTrId( "Eject memory card? Some applications will be closed." ) ) ){ + FmUtils::ejectDrive( diskName ); + } +} + +void FmDriverListWidget::on_directoryChanged( const QString &path ) +{ + Q_UNUSED( path ); + mModel->refresh(); +} + +void FmDriverListWidget::activeSearchPanel() +{ + QStringList driveList; + FmUtils::getDriveList( driveList, true ); + if(driveList.count() > 0 ) { + mFindTargetPath = driveList.first(); + if( FmUtils::isDriveC( mFindTargetPath ) ) { + mFindTargetPath = QString( Folder_C_Data ); + } + } else { + mFindTargetPath.clear(); + } + mLayout->addItem( mSearchPanel ); + mSearchPanel->show(); +} + +void FmDriverListWidget::on_searchPanel_searchOptionsClicked() +{ + mFindTargetPath = FmUtils::fillPathWithSplash( FmFileDialog::getExistingDirectory( 0, hbTrId( "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 ); +}