filemanager/src/filemanager/src/fmdriverlistwidget.cpp
branchRCL_3
changeset 20 491b3ed49290
--- /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 <yong.5.zhang@nokia.com>
+ * 
+ * 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 <hbabstractviewitem.h>
+#include <QDir>
+#include <QGraphicsLinearLayout>
+#include <QFileSystemWatcher>
+
+#include <hblistview.h>
+#include <hbmenu.h>
+#include <hbaction.h>
+#include <hbsearchpanel.h>
+
+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 );
+}