filemanager/src/fmfiledialog/src/fmfiledialog_p.cpp
changeset 14 1957042d8c7e
child 16 ada7962b4308
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/filemanager/src/fmfiledialog/src/fmfiledialog_p.cpp	Fri Apr 16 14:53:38 2010 +0300
@@ -0,0 +1,358 @@
+/*
+* 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:
+*     
+* 
+* Description:
+*     The source file of the file dialog implement
+*
+*/
+
+#include "fmfiledialog_p.h"
+#include "fmfilewidget.h"
+#include "fmcommon.h"
+
+#include "hbfontspec.h"
+#include <hbaction.h>
+#include <hbpushbutton.h>
+#include <hblabel.h>
+#include <hblineedit.h>
+#include <QGraphicsLinearLayout>
+
+const char *backButtonIcon = "qtg_indi_status_back.png";
+
+/*!
+    constructor
+*/
+FmFileDialogPrivate::FmFileDialogPrivate( FmFileDialog *fileDialog ) :
+    mFileDialog( fileDialog ),
+    mHeadingWidget( 0 ),
+    mCurrentPathLabel( 0 ),
+    mUpButton( 0 ),
+    mTitleLabel( 0 ),
+    mContentWidget( 0 ),
+    mContentLayout( 0 ),
+    mFileWidget( 0 ),
+    mOkAction( 0 ),
+    mCancelAction( 0 ),
+    mFileNameTitleLabel( 0 ),
+    mFileNameLineEdit( 0 )
+{
+ }
+
+/*!
+    destructor
+*/
+FmFileDialogPrivate::~FmFileDialogPrivate()
+{
+
+}
+
+/*!
+    init
+    \param directory .
+*/
+void FmFileDialogPrivate::init( const FmFileDialogArgs &args )
+{
+    mArgs = args;
+    setProperties();
+    createHeadingWidget();
+    createContentWidget();
+    createBottomWidget();
+
+    if( !mFileDialog->primaryAction() && !mFileDialog->secondaryAction() ) {
+        createAndSetActions(mFileDialog->tr("Ok"),mFileDialog->tr("Cancel"));
+    }
+
+    makeConnections();
+    setRootPath( mArgs.mDirectory );
+    mFileWidget->setModelFilter( mArgs.mDirFilters );
+    mFileWidget->setNameFilters( mArgs.mNameFilters );
+}
+
+/*!
+    createAndSetActions
+
+    \param primaryActionText
+           secondaryActionText
+*/
+void FmFileDialogPrivate::createAndSetActions(const QString & primaryActionText,
+                                                       const QString & secondaryActionText)
+{
+    // Create action for ok button and assign it to the primary action of popup
+    mOkAction = new HbAction( primaryActionText, mFileDialog );
+    Q_ASSERT( mOkAction );
+    mFileDialog->setPrimaryAction( mOkAction );
+
+    // Create action for cancel button and assign it to the secondary action of popup
+    mCancelAction = new HbAction( secondaryActionText, mFileDialog );
+    Q_ASSERT( mCancelAction );
+    mFileDialog->setSecondaryAction( mCancelAction );
+}
+
+/*!
+    setProperties
+    sets the properties of the file dialog like timeout,
+    Dismiss policy,modal etc.
+*/
+void FmFileDialogPrivate::setProperties()
+{
+    // set the file dialog as Modal.
+    mFileDialog->setModal(true);
+
+    // no dismiss for File dialog.
+    mFileDialog->setDismissPolicy( HbPopup::NoDismiss );
+
+    // File dialog will not time out.
+    mFileDialog->setTimeout( HbPopup::NoTimeout );
+}
+
+/*!
+    makeConnections
+*/
+void FmFileDialogPrivate::makeConnections()
+{
+    mFileDialog->connect( mUpButton,SIGNAL( clicked() ),
+        mFileDialog, SLOT( _q_handleUpButton() ) );
+
+    if( mFileNameLineEdit ) {
+        mFileDialog->connect( mFileNameLineEdit, SIGNAL( textChanged( QString ) ),
+            mFileDialog, SLOT( _q_handleTextChanged( QString ) ) );
+    }
+
+    mFileDialog->connect( mFileWidget, SIGNAL( pathChanged( QString ) ),
+        mFileDialog, SLOT( _q_handlePathChanged( QString ) ) );
+
+    mFileDialog->connect( mFileWidget, SIGNAL( fileActivated( QString ) ),
+        mFileDialog, SLOT( _q_handleFileActivated( QString ) ) );
+}
+
+/*!
+    creates the heading wiget elements that include
+    a label for showing the current path and a push button for
+    going to the parent directory.
+*/
+void FmFileDialogPrivate::createHeadingWidget()
+{
+    mHeadingWidget = new HbWidget( mFileDialog );
+
+    QGraphicsLinearLayout *headingLayout = new QGraphicsLinearLayout;
+    headingLayout->setOrientation(Qt::Horizontal);
+    mHeadingWidget->setLayout(headingLayout);
+    
+
+    QGraphicsLinearLayout *titleLayout = new QGraphicsLinearLayout;
+    titleLayout->setOrientation(Qt::Vertical);    
+
+    mTitleLabel = new HbLabel();
+    if( mArgs.mTitle.isEmpty() ){
+        mTitleLabel->setPlainText( QString( FmPlaceholderString ) );
+    } else {
+        mTitleLabel->setPlainText( mArgs.mTitle );
+    }
+
+    mCurrentPathLabel = new HbLabel( QString( FmPlaceholderString ) );
+    mCurrentPathLabel->setElideMode(Qt::ElideRight);
+
+    mUpButton  = new HbPushButton;
+    mUpButton->setIcon(HbIcon(backButtonIcon));
+
+    titleLayout->addItem( mTitleLabel );
+    titleLayout->setAlignment( mTitleLabel, Qt::AlignLeft);
+
+    titleLayout->addItem( mCurrentPathLabel );
+    titleLayout->setAlignment( mCurrentPathLabel, Qt::AlignLeft);
+
+    headingLayout->addItem(titleLayout);
+    headingLayout->addItem( mUpButton ) ;
+    headingLayout->setAlignment(mUpButton,Qt::AlignRight);
+
+    mFileDialog->setHeadingWidget( mHeadingWidget );
+}
+
+/*!
+    Creates the content widget. It includes the listview and model.
+
+*/
+
+void FmFileDialogPrivate::createContentWidget()
+{
+    mContentWidget = new HbWidget( mFileDialog );
+
+    mContentLayout = new QGraphicsLinearLayout;
+    mContentLayout->setOrientation(Qt::Vertical);
+    
+    mContentWidget->setLayout( mContentLayout );
+
+    mFileWidget = new FmFileWidget( mContentWidget );
+    mContentLayout->addItem( mFileWidget );
+
+    mFileDialog->setContentWidget( mContentWidget );
+}
+
+/*!
+    Creates the content widget. It includes the listview and model.
+
+*/
+
+void FmFileDialogPrivate::createBottomWidget()
+{
+    if( mArgs.mDialogMode == GetDirMode ) {
+        return;
+    }
+    HbWidget *bottomWidget = new HbWidget( mContentWidget );
+    mContentLayout->addItem( bottomWidget );
+
+    QGraphicsLinearLayout *bottomLayout = new QGraphicsLinearLayout;
+    bottomLayout->setOrientation( Qt::Horizontal );
+
+    mFileNameTitleLabel = new HbLabel( mFileDialog->tr( "file name:" ), bottomWidget );
+    bottomLayout->addItem( mFileNameTitleLabel );
+
+    mFileNameLineEdit = new HbLineEdit( bottomWidget );
+    bottomLayout->addItem( mFileNameLineEdit );    
+
+    bottomWidget->setLayout( bottomLayout );
+
+}
+
+void FmFileDialogPrivate::checkUpButton()
+{
+    QString currentPath = mFileWidget->currentPath().absoluteFilePath();
+    bool isPreventDirUp = mArgs.mOptions & FmFileDialog::PreventDirUp;
+
+    if( mFileWidget->currentViewType() == FmFileWidget::DirView ) {
+        if( isPreventDirUp &&
+            mArgs.mDirectory.contains( currentPath, Qt::CaseInsensitive ) ) {
+            // disable up when client lock top leve folder
+            mUpButton->setEnabled( false );
+        } else {
+            mUpButton->setEnabled( true );
+        }
+    } else {
+        // disable up button when at drive view
+        mUpButton->setEnabled( false );
+    }
+}
+
+void FmFileDialogPrivate::checkBottomFileWidget()
+{
+    switch( mArgs.mDialogMode )
+    {
+    case GetDirMode:
+        break;
+    case GetFileMode:
+        mFileNameLineEdit->setReadOnly( true );
+        break;
+    case SaveFileMode:
+        if( mFileWidget->currentPath().absoluteFilePath().isEmpty() ) {
+            mFileNameLineEdit->setReadOnly( true );
+        } else {
+            mFileNameLineEdit->setReadOnly( false );
+        }
+        break;
+    }
+}
+
+void FmFileDialogPrivate::checkActions()
+{
+    switch( mArgs.mDialogMode )
+    {
+    case GetDirMode:
+        if( mFileWidget->currentPath().absoluteFilePath().isEmpty() ) {
+            mOkAction->setDisabled( true );
+        } else {
+            mOkAction->setDisabled( false );
+        }
+        break;
+    case GetFileMode:
+    case SaveFileMode:
+        if( mFileWidget->currentPath().absoluteFilePath().isEmpty() ||
+            mFileNameLineEdit->text().isEmpty() ) {
+            mOkAction->setDisabled( true );
+        } else {
+            mOkAction->setDisabled( false );
+        }
+        break;
+    default:
+        Q_ASSERT( false );
+    }
+}
+
+void FmFileDialogPrivate::_q_handleUpButton()
+{
+    bool isPreventDirUp = mArgs.mOptions & FmFileDialog::PreventDirUp;
+    QString currentPath = mFileWidget->currentPath().absoluteFilePath();
+    if( isPreventDirUp &&
+        mArgs.mDirectory.contains( currentPath, Qt::CaseInsensitive ) ) {
+        return;
+    } else {
+        mFileWidget->cdUp();
+    }
+}
+
+void FmFileDialogPrivate::_q_handleTextChanged(const QString &text)
+{
+    Q_UNUSED( text );
+    checkActions();
+}
+
+void FmFileDialogPrivate::_q_handlePathChanged( const QString &path )
+{
+    if( path.isEmpty() ) {
+        mCurrentPathLabel->setPlainText( QString( FmPlaceholderString ) );
+    } else {
+        mCurrentPathLabel->setPlainText( path );
+    }
+    
+    if( mFileNameLineEdit && mArgs.mDialogMode == GetFileMode ) {
+        mFileNameLineEdit->setText( QString() );
+    }
+
+    checkUpButton();
+    checkBottomFileWidget();
+    checkActions();
+}
+
+void FmFileDialogPrivate::_q_handleFileActivated( const QString &path )
+{
+    if( mFileNameLineEdit ) {
+        mFileNameLineEdit->setText( path );
+    }
+    checkActions();
+}
+
+QString FmFileDialogPrivate::currentPath() const
+{
+    return mFileWidget->currentPath().absoluteFilePath();
+}
+
+QString FmFileDialogPrivate::selectedFile() const
+{
+    return mFileNameLineEdit->text();
+}
+
+void FmFileDialogPrivate::setRootPath( const QString &pathName )
+{
+    mFileWidget->setRootPath( pathName );
+}
+
+bool FmFileDialogPrivate::isOkAction( HbAction *action )
+{
+    if( mOkAction == action ) {
+        return true;
+    }
+
+    return false;
+}
+
+#include "moc_fmfiledialog.cpp"