diff -r 48060abbbeaf -r b3cee849fa46 filebrowser/ui/src/fbfileview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/filebrowser/ui/src/fbfileview.cpp Tue Aug 31 15:15:20 2010 +0300 @@ -0,0 +1,1535 @@ +/* +* Copyright (c) 2010 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: +* +*/ + +#include "fbfileview.h" +#include "settingsview.h" +#include "editorview.h" +#include "searchview.h" +#include "enginewrapper.h" +#include "notifications.h" + +#include "fbfilemodel.h" +#include "filebrowsersortfilterproxymodel.h" +//#include "fbfilelistviewitem.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +//TODO check if needed to do this way +#include + +// --------------------------------------------------------------------------- + +FbFileView::FbFileView() : + mEngineWrapper(0), + mListView(0), + mToolBar(0), + mNaviPane(0), + mSearchPanel(0), + mMainLayout(0), + mFbFileModel(0), + mSortFilterProxyModel(0), + mOptionMenuActions(), + mContextMenuActions(), + mContextMenu(0), + mToolbarBackAction(0), + mItemHighlighted(false), + mLocationChanged(false), + mRemoveFileAfterCopied(false), +// mClipBoardInUse(false), + mFolderContentChanged(false), + mCurrentIndex(), + mOldPassword(), + mPanicCategory(), + mAbsoluteFilePath(), + mOverwriteOptions(), + mModelIndex(), + mNewFileName(), + mProceed(false), + mEraseMBR(false) +{ + setTitle("File Browser"); + + createMenu(); + createContextMenu(); + createToolBar(); +} + +// --------------------------------------------------------------------------- + +void FbFileView::init(EngineWrapper *engineWrapper) +{ + mEngineWrapper = engineWrapper; + + mListView = new HbListView(this); + mListView->listItemPrototype()->setStretchingStyle(HbListViewItem::StretchLandscape); + +// mListView->setItemPrototype(new FbDiskListViewItem(mListView)); + + mFbFileModel = new FbFileModel(mEngineWrapper); + if (!mListView->model()) { + + mEngineWrapper->refreshView(); + + mSortFilterProxyModel = new FileBrowserSortFilterProxyModel(this); + mSortFilterProxyModel->setSourceModel(mFbFileModel); + mSortFilterProxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive); + mSearchPanel->setPlaceholderText(QString("Type filter criteria")); + + mListView->setModel(mSortFilterProxyModel); + } + + //mListView->setRootIndex(mFileSystemModel->index(startPath)); + //mListView->setRootIndex(model->index()); + + //setItemVisible(Hb::ToolBarItem, !mEngineWrapper->isDriveListViewActive()); +// mListView->setScrollingStyle(HbScrollArea::PanWithFollowOn); + + connect(mListView, SIGNAL(activated(QModelIndex)), this, SLOT(activated(QModelIndex))); + connect(mListView, SIGNAL(longPressed(HbAbstractViewItem*,QPointF)), + this, SLOT(onLongPressed(HbAbstractViewItem*, QPointF))); + + mNaviPane = new HbLabel(this); + mNaviPane->setPlainText(QString(" ")); // TODO get from settings or default + //mNaviPane->setPlainText(QString(mEngineWrapper->currentPath())); + HbFontSpec fontSpec(HbFontSpec::PrimarySmall); + mNaviPane->setFontSpec(fontSpec); + + // Create layout and add list view and toolbar into layout: + mMainLayout = new QGraphicsLinearLayout(Qt::Vertical); + mMainLayout->addItem(mNaviPane); + mMainLayout->addItem(mListView); + setLayout(mMainLayout); +} + +// --------------------------------------------------------------------------- + +FbFileView::~FbFileView() +{ +// if (mEngineWrapper) { +// delete mEngineWrapper; +// } + if (mContextMenu) { + mContextMenu->deleteLater(); + } + + delete mSortFilterProxyModel; + delete mFbFileModel; + delete mListView; + delete mToolBar; +} + +/** + Initial setup for options menu. + Dynamic menu update during the runtime is performed by updateOptionMenu() which + to menu's aboutToShow() signal. + */ +void FbFileView::createMenu() +{ + createFileMenu(); + createEditMenu(); + createViewMenu(); + createToolsMenu(); + + createSelectionMenuItem(); + createSettingsMenuItem(); + createAboutMenuItem(); + createExitMenuItem(); + + // menu dynamic update + connect(menu(), SIGNAL(aboutToShow()), this, SLOT(updateOptionMenu())); +} + +/** + Initial setup for File submenu + */ +void FbFileView::createFileMenu() +{ + mOptionMenuActions.mFileMenu = menu()->addMenu("File"); + + mOptionMenuActions.mFileBackMoveUp = mOptionMenuActions.mFileMenu->addAction("Back/Move up", this, SLOT(fileBackMoveUp())); + mOptionMenuActions.mFileSearch = mOptionMenuActions.mFileMenu->addAction("Search...", this, SLOT(fileSearch())); + //mOptionMenuActions.mFileSearch->setVisible(false); + + mOptionMenuActions.mFileNewMenu = mOptionMenuActions.mFileMenu->addMenu("New"); + mOptionMenuActions.mFileNewFile = mOptionMenuActions.mFileNewMenu->addAction("File", this, SLOT(fileNewFile())); + mOptionMenuActions.mFileNewDirectory = mOptionMenuActions.mFileNewMenu->addAction("Directory", this, SLOT(fileNewDirectory())); + + mOptionMenuActions.mFileDelete = mOptionMenuActions.mFileMenu->addAction("Delete", this, SLOT(fileDelete())); + mOptionMenuActions.mFileRename = mOptionMenuActions.mFileMenu->addAction("Rename", this, SLOT(fileRename())); + mOptionMenuActions.mFileTouch = mOptionMenuActions.mFileMenu->addAction("Touch", this, SLOT(fileTouch())); + +// mOptionMenuActions.mFileChecksumsMenu = mOptionMenuActions.mFileMenu->addMenu("Checksums"); +// mOptionMenuActions.mFileChecksumsMD5 = mOptionMenuActions.mFileChecksumsMenu->addAction("MD5", this, SLOT(fileChecksumsMD5())); +// mOptionMenuActions.mFileChecksumsMD2 = mOptionMenuActions.mFileChecksumsMenu->addAction("MD2", this, SLOT(fileChecksumsMD2())); +// mOptionMenuActions.mFileChecksumsSHA1 = mOptionMenuActions.mFileChecksumsMenu->addAction("SHA-1", this, SLOT(fileChecksumsSHA1())); + + mOptionMenuActions.mFileSetAttributes = mOptionMenuActions.mFileMenu->addAction("Set attributes...", this, SLOT(fileSetAttributes())); + mOptionMenuActions.mFileSetAttributes->setVisible(false); +} + +/** + Initial setup for Edit submenu + */ +void FbFileView::createEditMenu() +{ + mOptionMenuActions.mEditMenu = menu()->addMenu("Edit"); + + mOptionMenuActions.mEditSnapShotToE = mOptionMenuActions.mEditMenu->addAction("Snap shot to E:", this, SLOT(editSnapShotToE())); + mOptionMenuActions.mEditSnapShotToE->setVisible(false); + mOptionMenuActions.mEditCut = mOptionMenuActions.mEditMenu->addAction("Cut", this, SLOT(editCut())); + mOptionMenuActions.mEditCopy = mOptionMenuActions.mEditMenu->addAction("Copy", this, SLOT(editCopy())); + mOptionMenuActions.mEditPaste = mOptionMenuActions.mEditMenu->addAction("Paste", this, SLOT(editPaste())); + + mOptionMenuActions.mEditCopyToFolder = mOptionMenuActions.mEditMenu->addAction("Copy to folder...", this, SLOT(editCopyToFolder())); + mOptionMenuActions.mEditMoveToFolder = mOptionMenuActions.mEditMenu->addAction("Move to folder...", this, SLOT(editMoveToFolder())); + + mOptionMenuActions.mEditSelect = mOptionMenuActions.mEditMenu->addAction("Select", this, SLOT(editSelect())); + mOptionMenuActions.mEditUnselect = mOptionMenuActions.mEditMenu->addAction("Unselect", this, SLOT(editUnselect())); + mOptionMenuActions.mEditSelectAll = mOptionMenuActions.mEditMenu->addAction("Select all", this, SLOT(editSelectAll())); + mOptionMenuActions.mEditUnselectAll = mOptionMenuActions.mEditMenu->addAction("Unselect all", this, SLOT(editUnselectAll())); +} + +/** + Initial setup for View submenu + */ +void FbFileView::createViewMenu() +{ + mOptionMenuActions.mViewMenu = menu()->addMenu("View"); + //mOptionMenuActions.mViewMenu->menuAction()->setVisible(false); + + mOptionMenuActions.mViewFilterEntries = mOptionMenuActions.mViewMenu->addAction("Filter entries", this, SLOT(viewFilterEntries())); + mOptionMenuActions.mViewRefresh = mOptionMenuActions.mViewMenu->addAction("Refresh", this, SLOT(viewRefresh())); +} + +/** + Initial setup for Tools submenu + */ +void FbFileView::createToolsMenu() +{ + mOptionMenuActions.mToolsMenu = menu()->addMenu("Tools"); + + mOptionMenuActions.mToolsAllAppsToTextFile = mOptionMenuActions.mToolsMenu->addAction("All apps to a text file", this, SLOT(toolsAllAppsToTextFile())); + mOptionMenuActions.mToolsAllAppsToTextFile->setVisible(false); + mOptionMenuActions.mToolsAllFilesToTextFile = mOptionMenuActions.mToolsMenu->addAction("All files to a text file", this, SLOT(toolsAllFilesToTextFile())); + //mOptionMenuActions.mToolsAllFilesToTextFile->setVisible(false); + +// mOptionMenuActions.mToolsAvkonIconCacheMenu = mOptionMenuActions.mToolsMenu->addMenu("Avkon icon cache"); +// mOptionMenuActions.mToolsAvkonIconCacheMenu->menuAction()->setVisible(false); +// mOptionMenuActions.mToolsAvkonIconCacheEnable = mOptionMenuActions.mToolsAvkonIconCacheMenu->addAction("Enable", this, SLOT(toolsAvkonIconCacheEnable())); +// mOptionMenuActions.mToolsAvkonIconCacheDisable = mOptionMenuActions.mToolsAvkonIconCacheMenu->addAction("Clear and disable", this, SLOT(toolsAvkonIconCacheDisable())); + + mOptionMenuActions.mToolsDisableExtendedErrors = mOptionMenuActions.mToolsMenu->addAction("Disable extended errors", this, SLOT(toolsDisableExtendedErrors())); + mOptionMenuActions.mToolsDumpMsgStoreWalk = mOptionMenuActions.mToolsMenu->addAction("Dump msg. store walk", this, SLOT(toolsDumpMsgStoreWalk())); + mOptionMenuActions.mToolsDumpMsgStoreWalk->setVisible(false); + mOptionMenuActions.mToolsEditDataTypes = mOptionMenuActions.mToolsMenu->addAction("Edit data types", this, SLOT(toolsEditDataTypes())); + mOptionMenuActions.mToolsEditDataTypes->setVisible(false); + mOptionMenuActions.mToolsEnableExtendedErrors = mOptionMenuActions.mToolsMenu->addAction("Enable extended errors", this, SLOT(toolsEnableExtendedErrors())); + + mOptionMenuActions.mToolsErrorSimulateMenu = mOptionMenuActions.mToolsMenu->addMenu("Error simulate"); + mOptionMenuActions.mToolsErrorSimulateLeave = mOptionMenuActions.mToolsErrorSimulateMenu->addAction("Leave", this, SLOT(toolsErrorSimulateLeave())); + mOptionMenuActions.mToolsErrorSimulatePanic = mOptionMenuActions.mToolsErrorSimulateMenu->addAction("Panic", this, SLOT(toolsErrorSimulatePanic())); + mOptionMenuActions.mToolsErrorSimulatePanic->setVisible(false); + mOptionMenuActions.mToolsErrorSimulateException = mOptionMenuActions.mToolsErrorSimulateMenu->addAction("Exception", this, SLOT(toolsErrorSimulateException())); + +// mOptionMenuActions.mLocalConnectivityMenu = mOptionMenuActions.mToolsMenu->addMenu("Local connectivity"); +// mOptionMenuActions.mToolsLocalConnectivityActivateInfrared = mOptionMenuActions.mLocalConnectivityMenu->addAction("Activate infrared", this, SLOT(toolsLocalConnectivityActivateInfrared())); +// mOptionMenuActions.mToolsLocalConnectivityLaunchBTUI = mOptionMenuActions.mLocalConnectivityMenu->addAction("Launch BT UI", this, SLOT(toolsLocalConnectivityLaunchBTUI())); +// mOptionMenuActions.mToolsLocalConnectivityLaunchUSBUI = mOptionMenuActions.mLocalConnectivityMenu->addAction("Launch USB UI", this, SLOT(toolsLocalConnectivityLaunchUSBUI())); + + mOptionMenuActions.mToolsMessageAttachmentsMenu = mOptionMenuActions.mToolsMenu->addMenu("Message attachments"); + mOptionMenuActions.mToolsMessageAttachmentsMenu->menuAction()->setVisible(false); + mOptionMenuActions.mToolsMessageInbox = mOptionMenuActions.mToolsMessageAttachmentsMenu->addAction("Inbox", this, SLOT(toolsMessageInbox())); + mOptionMenuActions.mToolsMessageDrafts = mOptionMenuActions.mToolsMessageAttachmentsMenu->addAction("Drafts", this, SLOT(toolsMessageDrafts())); + mOptionMenuActions.mToolsMessageSentItems = mOptionMenuActions.mToolsMessageAttachmentsMenu->addAction("Sent items", this, SLOT(toolsMessageSentItems())); + mOptionMenuActions.mToolsMessageOutbox = mOptionMenuActions.mToolsMessageAttachmentsMenu->addAction("Outbox", this, SLOT(toolsMessageOutbox())); + + mOptionMenuActions.mToolsMemoryInfo = mOptionMenuActions.mToolsMenu->addAction("Memory info", this, SLOT(toolsMemoryInfo())); + mOptionMenuActions.mToolsMemoryInfo->setVisible(false); + + mOptionMenuActions.mToolsSecureBackupMenu = mOptionMenuActions.mToolsMenu->addMenu("Secure backup"); + mOptionMenuActions.mToolsSecureBackupMenu->menuAction()->setVisible(false); + mOptionMenuActions.mToolsSecureBackStart = mOptionMenuActions.mToolsSecureBackupMenu->addAction("Start backup", this, SLOT(toolsSecureBackStart())); + mOptionMenuActions.mToolsSecureBackRestore = mOptionMenuActions.mToolsSecureBackupMenu->addAction("Start restore", this, SLOT(toolsSecureBackRestore())); + mOptionMenuActions.mToolsSecureBackStop = mOptionMenuActions.mToolsSecureBackupMenu->addAction("Stop", this, SLOT(toolsSecureBackStop())); + + mOptionMenuActions.mToolsSetDebugMask = mOptionMenuActions.mToolsMenu->addAction("Set debug mask", this, SLOT(toolsSetDebugMaskQuestion())); + mOptionMenuActions.mToolsShowOpenFilesHere = mOptionMenuActions.mToolsMenu->addAction("Show open files here", this, SLOT(toolsShowOpenFilesHere())); + mOptionMenuActions.mToolsShowOpenFilesHere->setVisible(false); +} + +/** + Creates Selection mode menu item in option menu + */ +void FbFileView::createSelectionMenuItem() +{ + if (!mOptionMenuActions.mSelection) { + mOptionMenuActions.mSelection = menu()->addAction("Selection mode"); + mOptionMenuActions.mSelection->setToolTip("Selection mode"); + mOptionMenuActions.mSelection->setCheckable(true); + connect(mOptionMenuActions.mSelection, SIGNAL(triggered()), this, SLOT(selectionModeChanged())); + } +} + +/** + Creates Setting menu item in option menu + */ +void FbFileView::createSettingsMenuItem() +{ + mOptionMenuActions.mSetting = menu()->addAction("Settings..."); + connect(mOptionMenuActions.mSetting, SIGNAL(triggered()), this, SIGNAL(aboutToShowSettingsView())); +} + + +/** + Creates About menu item in option menu + */ +void FbFileView::createAboutMenuItem() +{ + // about note + mOptionMenuActions.mAbout = menu()->addAction("About"); + connect(mOptionMenuActions.mAbout, SIGNAL(triggered()), this, SLOT(about())); +} + +/** + Creates Exit menu item in option menu + */ +void FbFileView::createExitMenuItem() +{ + // application exit + mOptionMenuActions.mExit = menu()->addAction("Exit"); + connect(mOptionMenuActions.mExit, SIGNAL(triggered()), qApp, SLOT(quit())); +} + +/** + update menu: disk admin available only in device root view. edit available only in folder view + when file or folder content exist in current folder, or clipboard has copied item. + file and view menus updated every time regarding the folder content. + tools, settings, about, exit always available. + If there's remove and add operations at same time, always remove first + to keep to the correct menu items order. + */ +void FbFileView::updateOptionMenu() +{ + bool isFileItemListEmpty = mFbFileModel->rowCount() == 0; + bool isNormalModeActive = true; //iModel->FileUtils()->IsNormalModeActive(); + bool isCurrentDriveReadOnly = mEngineWrapper->isCurrentDriveReadOnly(); //iModel->FileUtils()->IsCurrentDriveReadOnly(); + bool isCurrentItemDirectory = mEngineWrapper->getFileEntry(currentItemIndex()).isDir(); + // bool currentSelected = true; //iContainer->ListBox()->View()->ItemIsSelected(iContainer->ListBox()->View()->CurrentItemIndex()); + bool isAllSelected = mListView->selectionModel()->selection().count() == mFbFileModel->rowCount(); + //bool isNoneSelected = mListView->selectionModel()->selection().count() != 0; + bool hasSelectedItems = mListView->selectionModel()->selection().count() != 0; + bool isSelectionMode = mOptionMenuActions.mSelection && mOptionMenuActions.mSelection->isChecked(); + bool isClipBoardEmpty = !mEngineWrapper->isClipBoardListInUse(); + //bool showSnapShot = false; //iModel->FileUtils()->DriveSnapShotPossible(); + + bool showEditMenu(true); + if (isFileItemListEmpty && isClipBoardEmpty) + showEditMenu = false; + else + showEditMenu = true; + + mOptionMenuActions.mEditMenu->menuAction()->setVisible(showEditMenu); + + //mOptionMenuActions.mFileBackMoveUp->setVisible( !isDriveListViewActive); + + //aMenuPane->SetItemDimmed(EFileBrowserCmdFileView, isFileItemListEmpty || !hasSelectedItems || isCurrentItemDirectory); + //aMenuPane->SetItemDimmed(EFileBrowserCmdFileEdit, isFileItemListEmpty || !hasSelectedItems || isCurrentItemDirectory); + //aMenuPane->SetItemDimmed(EFileBrowserCmdFileSendTo, isFileItemListEmpty || driveListActive || isCurrentItemDirectory); + + mOptionMenuActions.mFileNewMenu->menuAction()->setVisible(!isCurrentDriveReadOnly); + mOptionMenuActions.mFileDelete->setVisible(!isFileItemListEmpty && !isCurrentDriveReadOnly && hasSelectedItems/*isSelectionMode*/); + mOptionMenuActions.mFileRename->setVisible(!isFileItemListEmpty && !isCurrentDriveReadOnly && hasSelectedItems/*&& isSelectionMode*/); + mOptionMenuActions.mFileTouch->setVisible(!isFileItemListEmpty && !isCurrentDriveReadOnly && hasSelectedItems); + + // TODO mOptionMenuActions.mFileChecksumsMenu->setVisible(!(isFileItemListEmpty || !hasSelectedItems || isCurrentItemDirectory)); + // TODO mOptionMenuActions.mFileSetAttributes->setVisible(!(isFileItemListEmpty || isCurrentDriveReadOnly)); + // TODO mOptionMenuActions.mFileCompress->setVisible(!(isCurrentDriveReadOnly || isFileItemListEmpty || !hasSelectedItems || isCurrentItemDirectory)); + // TODO mOptionMenuActions.mFileDecompress->setVisible(!(isCurrentDriveReadOnly || isFileItemListEmpty || !hasSelectedItems || isCurrentItemDirectory)); + + mOptionMenuActions.mEditCut->setVisible(!isFileItemListEmpty && !isCurrentDriveReadOnly && isSelectionMode); + mOptionMenuActions.mEditCopy->setVisible(!isFileItemListEmpty && isSelectionMode); + mOptionMenuActions.mEditPaste->setVisible(!(isClipBoardEmpty || isCurrentDriveReadOnly)); + mOptionMenuActions.mEditCopyToFolder->setVisible(!isFileItemListEmpty); + mOptionMenuActions.mEditMoveToFolder->setVisible(!(isCurrentDriveReadOnly || isFileItemListEmpty)); + + mOptionMenuActions.mEditSelect->setVisible(false/*!currentSelected && !isFileItemListEmpty*/); + mOptionMenuActions.mEditUnselect->setVisible(false/*currentSelected && !isFileItemListEmpty*/); + mOptionMenuActions.mEditSelectAll->setVisible(isSelectionMode && !isAllSelected && !isFileItemListEmpty); + mOptionMenuActions.mEditUnselectAll->setVisible(hasSelectedItems && !isFileItemListEmpty); + + // TODO mOptionMenuActions.mViewSort->setVisible(!(!isNormalModeActive || isFileItemListEmpty)); + // TODO mOptionMenuActions.mViewOrder->setVisible(!(!isNormalModeActive || isFileItemListEmpty)); + mOptionMenuActions.mViewRefresh->setVisible(isNormalModeActive); + mOptionMenuActions.mViewFilterEntries->setVisible(!isFileItemListEmpty); + + // TODO R_FILEBROWSER_VIEW_SORT_SUBMENU + // aMenuPane->SetItemButtonState(iModel->FileUtils()->SortMode(), EEikMenuItemSymbolOn); + + // TODO R_FILEBROWSER_VIEW_ORDER_SUBMENU + // aMenuPane->SetItemButtonState(iModel->FileUtils()->OrderMode(), EEikMenuItemSymbolOn); + + // aResourceId == R_FILEBROWSER_TOOLS_SUBMENU + bool noExtendedErrorsAllowed = mEngineWrapper->ErrRdFileExists(); + mOptionMenuActions.mToolsDisableExtendedErrors->setVisible(noExtendedErrorsAllowed); + mOptionMenuActions.mToolsEnableExtendedErrors->setVisible(!noExtendedErrorsAllowed); + +// bool infraRedAllowed = mEngineWrapper->FileExists(KIRAppPath); +// bool bluetoothAllowed = mEngineWrapper->FileExists(KBTAppPath); +// bool usbAllowed = mEngineWrapper->FileExists(KUSBAppPath); +// +// bool noLocalCon = !infraRedAllowed && !bluetoothAllowed && !usbAllowed; +// mOptionMenuActions.mToolsLocalConnectivityMenu->menuAction()->setVisible(!noLocalCon); +// +// mOptionMenuActions.mToolsLocalConnectivityActivateInfrared->setVisible(infraRedAllowed); +// mOptionMenuActions.mToolsLocalConnectivityLaunchBTUI->setVisible(bluetoothAllowed); +// mOptionMenuActions.mToolsLocalConnectivityLaunchUSBUI->setVisible(usbAllowed); +} + +void FbFileView::createContextMenu() +{ + mContextMenu = new HbMenu(); + connect(mContextMenu, SIGNAL(aboutToShow()), this, SLOT(updateContextMenu())); + + createFileContextMenu(); + createEditContextMenu(); + createViewContextMenu(); +} + + +void FbFileView::createFileContextMenu() +{ + mContextMenuActions.mFileMenu = mContextMenu->addMenu("File"); + + //mContextMenuActions.mFileBackMoveUp = mContextMenuActions.mFileMenu->addAction("Back/Move up (<-)", this, SLOT(fileBackMoveUp())); + mContextMenuActions.mFileOpenDirectory = mContextMenuActions.mFileMenu->addAction("Open directory (->)", this, SLOT(fileOpenDirectory())); +// mContextMenuActions.mFileSearch = mContextMenuActions.mFileMenu->addAction("Search...", this, SLOT(fileSearch())); + //mContextMenuActions.mFileSearch->setVisible(false); + + mContextMenuActions.mFileDelete = mContextMenuActions.mFileMenu->addAction("Delete", this, SLOT(fileDelete())); + mContextMenuActions.mFileRename = mContextMenuActions.mFileMenu->addAction("Rename", this, SLOT(fileRename())); + mContextMenuActions.mFileTouch = mContextMenuActions.mFileMenu->addAction("Touch", this, SLOT(fileTouch())); + mContextMenuActions.mFileProperties = mContextMenuActions.mFileMenu->addAction("Properties", this, SLOT(fileProperties())); + + mContextMenuActions.mFileChecksumsMenu = mContextMenuActions.mFileMenu->addMenu("Checksums"); + mContextMenuActions.mFileChecksumsMD5 = mContextMenuActions.mFileChecksumsMenu->addAction("MD5", this, SLOT(fileChecksumsMD5())); + mContextMenuActions.mFileChecksumsMD2 = mContextMenuActions.mFileChecksumsMenu->addAction("MD2", this, SLOT(fileChecksumsMD2())); + mContextMenuActions.mFileChecksumsSHA1 = mContextMenuActions.mFileChecksumsMenu->addAction("SHA-1", this, SLOT(fileChecksumsSHA1())); + +// mContextMenuActions.mFileSetAttributes = mContextMenuActions.mFileMenu->addAction("Set attributes...", this, SLOT(fileSetAttributes())); +// mContextMenuActions.mFileSetAttributes->setVisible(false); +} + +void FbFileView::createEditContextMenu() +{ + mContextMenuActions.mEditMenu = mContextMenu->addMenu("Edit"); + + //mContextMenuActions.mEditSnapShotToE = mContextMenuActions.mEditMenu->addAction("Snap shot to E:", this, SLOT(editSnapShotToE())); +// mContextMenuActions.mEditSnapShotToE->setVisible(false); + mContextMenuActions.mEditCut = mContextMenuActions.mEditMenu->addAction("Cut", this, SLOT(editCut())); + mContextMenuActions.mEditCopy = mContextMenuActions.mEditMenu->addAction("Copy", this, SLOT(editCopy())); + mContextMenuActions.mEditPaste = mContextMenuActions.mEditMenu->addAction("Paste", this, SLOT(editPaste())); + + mContextMenuActions.mEditCopyToFolder = mContextMenuActions.mEditMenu->addAction("Copy to folder...", this, SLOT(editCopyToFolder())); + mContextMenuActions.mEditMoveToFolder = mContextMenuActions.mEditMenu->addAction("Move to folder...", this, SLOT(editMoveToFolder())); +} + +void FbFileView::createViewContextMenu() +{ + +} + +void FbFileView::updateContextMenu() +{ + bool isFileItemListEmpty = mFbFileModel->rowCount() == 0; + bool isDriveListViewActive = mEngineWrapper->isDriveListViewActive(); +// bool isNormalModeActive = true; //iModel->FileUtils()->IsNormalModeActive(); + bool isCurrentDriveReadOnly = mEngineWrapper->isCurrentDriveReadOnly(); + bool isCurrentItemDirectory = mEngineWrapper->getFileEntry(currentItemIndex()).isDir(); + bool hasSelectedItems = mListView->selectionModel()->selection().count() != 0; + bool isSelectionMode = mOptionMenuActions.mSelection && mOptionMenuActions.mSelection->isChecked(); + bool isClipBoardEmpty = !mEngineWrapper->isClipBoardListInUse(); + + // File submenu + //mContextMenuActions.mFileBackMoveUp->setVisible( !isDriveListViewActive); + mContextMenuActions.mFileOpenDirectory->setVisible( !isFileItemListEmpty && !isDriveListViewActive && isCurrentItemDirectory); + + mContextMenuActions.mFileDelete->setVisible(!isFileItemListEmpty && !isDriveListViewActive && !isCurrentDriveReadOnly); + mContextMenuActions.mFileRename->setVisible(!isFileItemListEmpty && !isDriveListViewActive && !isCurrentDriveReadOnly); + mContextMenuActions.mFileTouch->setVisible(!isFileItemListEmpty && !isDriveListViewActive && !isCurrentDriveReadOnly); + mContextMenuActions.mFileProperties->setVisible(!isFileItemListEmpty && !isSelectionMode); + + mContextMenuActions.mFileChecksumsMenu->menuAction()->setVisible(!(isFileItemListEmpty || isSelectionMode /*|| !hasSelectedItems*/ || isCurrentItemDirectory || isDriveListViewActive)); + // Edit submenu + mContextMenuActions.mEditMenu->menuAction()->setVisible(!isDriveListViewActive); + mContextMenuActions.mEditCut->setVisible(!(isDriveListViewActive || isCurrentDriveReadOnly || isFileItemListEmpty)); + mContextMenuActions.mEditCopy->setVisible(!(isDriveListViewActive || isFileItemListEmpty)); + mContextMenuActions.mEditPaste->setVisible(!isDriveListViewActive && !isClipBoardEmpty && !isCurrentDriveReadOnly); + mContextMenuActions.mEditCopyToFolder->setVisible(!(isDriveListViewActive || isFileItemListEmpty)); + mContextMenuActions.mEditMoveToFolder->setVisible(!(isDriveListViewActive || isCurrentDriveReadOnly || isFileItemListEmpty)); +} + +// --------------------------------------------------------------------------- + +void FbFileView::onLongPressed(HbAbstractViewItem *listViewItem, QPointF coords) +{ + QModelIndex proxyIndex = listViewItem->modelIndex(); + //map to source model + mCurrentIndex = mSortFilterProxyModel->mapToSource(proxyIndex); + + mContextMenu->setPreferredPos(coords); + mContextMenu->show(); +} + +/** + Create a file browser tool bar + */ +void FbFileView::createToolBar() +{ + mToolBar = toolBar(); + + mToolbarBackAction = new HbAction(mToolBar); + mToolbarBackAction->setToolTip("Back"); + mToolbarBackAction->setIcon(HbIcon(QString(":/qgn_indi_tb_filebrowser_folder_parent.svg"))); + connect(mToolbarBackAction, SIGNAL(triggered()), this, SLOT(fileBackMoveUp())); + mToolBar->addAction(mToolbarBackAction); + + // Find button and its extension + HbToolBarExtension* filterExtension = new HbToolBarExtension(); + // Set search panel widget + mSearchPanel = new HbSearchPanel(filterExtension); + mSearchPanel->setMinimumWidth( 360 ); // TODO should be based on layout, screen width + connect(mSearchPanel, SIGNAL(criteriaChanged(const QString &)), this, SLOT(filterCriteriaChanged(const QString &))); + connect(mSearchPanel, SIGNAL(exitClicked()), filterExtension, SLOT(close())); + connect(mSearchPanel, SIGNAL(exitClicked()), this, SLOT(clearFilterCriteria())); + filterExtension->setContentWidget(mSearchPanel); + + HbAction* mToolbarFilterAction = mToolBar->addExtension(filterExtension); +// mToolbarFilterAction->setText("Filter"); + mToolbarFilterAction->setToolTip("Filter"); + mToolbarFilterAction->setIcon(HbIcon(QString(":/qgn_indi_tb_filebrowser_find.svg"))); + //connect(mToolbarFilterAction, SIGNAL(triggered()), this, SLOT(viewFilterEntries())); + + if (mOptionMenuActions.mSelection) { + //mOptionMenuActions.mSelection->setIcon(HbIcon(QString(":/qgn_indi_tb_filebrowser_selection_active.svg"))); + mToolBar->addAction(mOptionMenuActions.mSelection); + } + +// // TODO Paste to be added +// if (mOptionMenuActions.mEditPaste) { +// //mOptionMenuActions.mEditPaste->setIcon(HbIcon(QString(":/qgn_indi_tb_filebrowser_selection_active.svg"))); +// mToolBar->addAction(mOptionMenuActions.mEditPaste); +// } +} + +/** + Refresh FileBrowser view + */ +void FbFileView::refreshList() +{ + editUnselectAll(); + mEngineWrapper->refreshView(); + mSearchPanel->setCriteria(QString("")); + mListView->model()->revert(); + mListView->reset(); + + if (mListView->model() && mListView->model()->rowCount() > 0) { + QModelIndex firstIndex = mListView->model()->index(0, 0); + mListView->scrollTo(firstIndex); + } + + TListingMode listingMode = mEngineWrapper->listingMode(); + if (listingMode == ENormalEntries) + mNaviPane->setPlainText(QString(mEngineWrapper->currentPath())); + else if (listingMode == ESearchResults) + mNaviPane->setPlainText(QString(tr("Search results"))); + else if (listingMode == EOpenFiles) + mNaviPane->setPlainText(QString(tr("Open files"))); + else if (listingMode == EMsgAttachmentsInbox) + mNaviPane->setPlainText(QString(tr("Attachments in Inbox"))); + else if (listingMode == EMsgAttachmentsDrafts) + mNaviPane->setPlainText(QString(tr("Attachments in Drafts"))); + else if (listingMode == EMsgAttachmentsSentItems) + mNaviPane->setPlainText(QString(tr("Attachments in Sent Items"))); + else if (listingMode == EMsgAttachmentsOutbox) + mNaviPane->setPlainText(QString(tr("Attachments in Outbox"))); +} + +// --------------------------------------------------------------------------- + +void FbFileView::fileOpen(HbAction *action) +{ +// Q_UNUSED(action); + HbSelectionDialog *dlg = static_cast(sender()); + if(!action && dlg && dlg->selectedItems().count()){ + int selectionIndex = dlg->selectedItems().at(0).toInt(); + + if (selectionIndex == 0) { + // open editor view + emit aboutToShowEditorView(mAbsoluteFilePath, true); + } else if (selectionIndex == 1) { + // AppArc + mEngineWrapper->openAppArc(mAbsoluteFilePath); + } else { + // DocHandler + mEngineWrapper->openDocHandler(mAbsoluteFilePath, true); + } + } +} + +/** + Open overwrite dialog + */ +void FbFileView::fileOverwriteDialog() +{ + mOverwriteOptions = OverwriteOptions(); + // open user-dialog to select: view as text/hex, open w/AppArc or open w/DocH. embed + QStringList list; + list << QString("Overwrite all") + << QString("Skip all existing") + << QString("Gen. unique filenames") + << QString("Query postfix"); + openListDialog(list, QString("Overwrite?"), this, SLOT(fileOverwrite(HbAction *))); +} + +/** + File overwrite + */ +void FbFileView::fileOverwrite(HbAction *action) +{ + HbSelectionDialog *dlg = static_cast(sender()); + if(!action && dlg && dlg->selectedItems().count()) { + mOverwriteOptions.queryIndex = dlg->selectedItems().at(0).toInt(); + if (mOverwriteOptions.queryIndex == EFileActionQueryPostFix) { + QString heading = QString("Postfix"); + HbInputDialog::getText(heading, this, SLOT(fileOverwritePostfix(HbAction *)), QString(), scene()); + } else if (mOverwriteOptions.queryIndex == EFileActionSkipAllExisting) { + mOverwriteOptions.overWriteFlags = 0; + } + } else { + mOverwriteOptions.doFileOperations = false; + } +} + +/** + File overwrite postfix query dialog + */ +void FbFileView::fileOverwritePostfix(HbAction *action) +{ + HbInputDialog *dlg = static_cast(sender()); + if (dlg && action && action->text().compare(QString("Ok"), Qt::CaseInsensitive) == 0) { + mOverwriteOptions.postFix = dlg->value().toString(); + } else { + mOverwriteOptions.doFileOperations = false; + } +} + +// --------------------------------------------------------------------------- +/** + Show a list dialog + \param List aList of item to select item from. + \param Title text titleText of a dialog heading widget + \return None + */ +void FbFileView::openListDialog(const QStringList& items, const QString &titleText, QObject* receiver, const char* member) +{ + // Create a list and some simple content for it + HbSelectionDialog *dlg = new HbSelectionDialog(); + dlg->setAttribute(Qt::WA_DeleteOnClose); + // Set items to be popup's content + dlg->setStringItems(items); + dlg->setSelectionMode(HbAbstractItemView::SingleSelection); + + HbLabel *title = new HbLabel(dlg); + title->setPlainText(titleText); + dlg->setHeadingWidget(title); + + // Launch popup and handle the user response: + dlg->open(receiver, member); +} + +// --------------------------------------------------------------------------- + +void FbFileView::openPropertyDialog(const QStringList& propertyList, const QString& title) +{ + HbDialog *dialog = new HbDialog(); + dialog->setDismissPolicy(HbPopup::TapOutside); + dialog->setTimeout(HbPopup::NoTimeout); + + HbLabel *titleWidget = new HbLabel(); + titleWidget->setPlainText(title); + dialog->setHeadingWidget(titleWidget); + + // Create a list and some simple content for it + HbListWidget *list = new HbListWidget(); + QString str; + foreach (str, propertyList) { + list->addItem(str); + } + + // Connect list item activation signal to close the popup + connect(list, SIGNAL(activated(HbListWidgetItem*)), dialog, SLOT(close())); + + HbAction *cancelAction = new HbAction("Close"); + dialog->setPrimaryAction(cancelAction); + + // Set listwidget to be popup's content + dialog->setContentWidget(list); + // Launch popup and handle the user response: + dialog->open(); +} + +/** + Stores selection or current index mapped to source model + */ +void FbFileView::storeSelectedItemsOrCurrentItem() +{ + QItemSelectionModel *selectionIndexes = mListView->selectionModel(); + + // by default use selected items + if (selectionIndexes) { + if (selectionIndexes->hasSelection()) { + QItemSelection proxyItemSelection = mListView->selectionModel()->selection(); + QItemSelection itemSelection = mSortFilterProxyModel->mapSelectionToSource(proxyItemSelection); + mSelectionIndexes = itemSelection.indexes(); + } else { // or if none selected, use the current item index + mSelectionIndexes.clear(); + QModelIndex currentIndex = currentItemIndex(); //alreade mapped to source model + mSelectionIndexes.append(currentIndex); + } + } +} + +// --------------------------------------------------------------------------- + +QModelIndex FbFileView::currentItemIndex() +{ + return mCurrentIndex; +} + +// --------------------------------------------------------------------------- +// operations in File Menu +// --------------------------------------------------------------------------- + +/** + Move back/up in folder browsing history + */ +void FbFileView::fileBackMoveUp() +{ + mLocationChanged = true; + mEngineWrapper->moveUpOneLevel(); + //mListView->setRootIndex(currentItemIndex()); + refreshList(); + if (mEngineWrapper->isDriveListViewActive()) { + emit aboutToShowDriveView(); + } +} + +void FbFileView::fileOpenDirectory() +{ + mLocationChanged = true; + // get selected drive or directory from list view model and open it: + //if (mListView->selectionModel()->hasSelection()) { +// if (mListView->selectionModel()->selection().count() != 0) { +// QModelIndex currentIndex = currentItemIndex(); + mEngineWrapper->moveDownToDirectory(currentItemIndex()); +// mListView->setRootIndex(currentItemIndex()); + refreshList(); +// } else { +// Notifications::showErrorNote("not selected item!"); +// } +} + +void FbFileView::fileSearch() +{ + QString searchPath; +// if (mEngineWrapper->currentPath() != mInitDirPath.path()) { +// searchPath = mDirectory; +// searchPath.replace("/", "\\"); +// searchPath+="\\"; +// } + searchPath = mEngineWrapper->currentPath(); +// mSearch->open(searchPath); + emit aboutToShowSearchView(searchPath); +} + +/** + Open new file dialog + */ +void FbFileView::fileNewFile() +{ + QString heading = QString("Enter filename"); + HbInputDialog::getText(heading, this, SLOT(doFileNewFile(HbAction*)), QString(), scene()); +} + +/** + Create a new file in current directory with a name queried from user + */ +void FbFileView::doFileNewFile(HbAction *action) +{ + HbInputDialog *dlg = static_cast(sender()); + if (dlg && action && action->text().compare(QString("Ok"), Qt::CaseInsensitive) == 0) { + QString newFileName = dlg->value().toString(); + mEngineWrapper->createNewFile(newFileName); + refreshList(); + } +} + +/** + Open new directory dialog + */ +void FbFileView::fileNewDirectory() +{ + QString heading = QString("Enter directory name"); + HbInputDialog::getText(heading, this, SLOT(doFileNewDirectory(HbAction*)), QString(), scene()); +} + +/** + Create a new directory in current directory with a name queried from user + */ +void FbFileView::doFileNewDirectory(HbAction *action) +{ + HbInputDialog *dlg = static_cast(sender()); + if (dlg && action && action->text().compare(QString("Ok"), Qt::CaseInsensitive) == 0) { + QString newDirectoryName = dlg->value().toString(); + mEngineWrapper->createNewDirectory(newDirectoryName); + refreshList(); + } +} + +/** + Question for Delete actually selected files + */ +void FbFileView::fileDelete() +{ + storeSelectedItemsOrCurrentItem(); + const QString messageFormat = "Delete %1 entries?"; + QString message = messageFormat.arg(mSelectionIndexes.count()); + HbMessageBox::question(message, this, SLOT(doFileDelete(HbAction*))); +} + +/** + Delete actually selected files + */ +void FbFileView::doFileDelete(HbAction* action) +{ + if (action && action->text().compare(QString("Yes"), Qt::CaseInsensitive) == 0) { + //storeSelectedItemsOrCurrentItem(); + mEngineWrapper->deleteItems(mSelectionIndexes); + refreshList(); + } +} + +/** + Open rename dialog for actually selected files + */ +void FbFileView::fileRename() +{ + storeSelectedItemsOrCurrentItem(); + mEngineWrapper->setCurrentSelection(mSelectionIndexes); + + for (int i(0), ie(mSelectionIndexes.count()); i < ie; ++i ) { + mProceed = (i == ie-1); // if the last item + mModelIndex = mSelectionIndexes.at(i); + FileEntry entry = mEngineWrapper->getFileEntry(mModelIndex); + + QString heading = QString("Enter new name"); + HbInputDialog::getText(heading, this, SLOT(doFileRename(HbAction*)), entry.name(), scene()); + } +} + +/** + Rename actually selected files + */ +void FbFileView::doFileRename(HbAction *action) +{ + HbInputDialog *dlg = static_cast(sender()); + if (dlg && action && action->text().compare(QString("Ok"), Qt::CaseInsensitive) == 0) { + mNewFileName = dlg->value().toString(); + + if (mEngineWrapper->targetExists(mModelIndex, mNewFileName)) { + const QString messageTemplate = QString("%1 already exists, overwrite?"); + QString message = messageTemplate.arg(mNewFileName); + HbMessageBox::question(message, this, SLOT(doFileRenameFileExist(HbAction *))); + } else { + mEngineWrapper->rename(mModelIndex, mNewFileName); + if (mProceed) { + mEngineWrapper->startExecutingCommands(QString("Renaming")); + refreshList(); + } + } + } +} + +/** + Rename actually selected files + */ +void FbFileView::doFileRenameFileExist(HbAction *action) +{ + if (action && action->text().compare(QString("Yes"), Qt::CaseInsensitive) == 0) { + mEngineWrapper->rename(mModelIndex, mNewFileName); + if (mProceed) { + mEngineWrapper->startExecutingCommands(QString("Renaming")); + refreshList(); + } + } +} + +/** + Touch actually selected files + */ +void FbFileView::fileTouch() +{ + storeSelectedItemsOrCurrentItem(); + mEngineWrapper->setCurrentSelection(mSelectionIndexes); + + if (mEngineWrapper->selectionHasDirs()) { + const QString message = "Recurse touch for all selected dirs?"; + HbMessageBox::question(message, this, SLOT(doFileTouch(HbAction*))); + } + else{ + mEngineWrapper->touch(false); + refreshList(); + } +} + +/** + Touch actually selected files + */ +void FbFileView::doFileTouch(HbAction* action) +{ + bool recurse = false; + if (action && action->text().compare(QString("Yes"), Qt::CaseInsensitive) == 0) { + recurse = true; + } + mEngineWrapper->touch(recurse); + refreshList(); +} + +void FbFileView::fileChecksumsMD5() +{ + fileChecksums(EFileChecksumsMD5); +} + +void FbFileView::fileChecksumsMD2() +{ + fileChecksums(EFileChecksumsMD2); +} + +void FbFileView::fileChecksumsSHA1() +{ + fileChecksums(EFileChecksumsSHA1); +} + +void FbFileView::fileChecksums(TFileBrowserCmdFileChecksums checksumType) +{ + mEngineWrapper->showFileCheckSums(currentItemIndex(), checksumType); +} + +/** + Show file properties + */ +void FbFileView::fileProperties() +{ + QModelIndex currentIndex = currentItemIndex(); + QStringList propertyList; + QString titleText; + mEngineWrapper->properties(currentIndex, propertyList, titleText); + openPropertyDialog(propertyList, titleText); +} + +void FbFileView::fileSetAttributes() +{ + +} + +// edit menu +void FbFileView::editSnapShotToE() +{ + +} + +/** + Set selected files into clipboard. + Selected item will be removed after paste operation. + */ +void FbFileView::editCut() +{ + storeSelectedItemsOrCurrentItem(); + + // Store indices to clipboard + mClipboardIndexes.clear(); + for (int i = 0; i < mSelectionIndexes.size(); ++i) { + mClipboardIndexes.append(mSelectionIndexes.at(i)); + } + + mEngineWrapper->clipboardCut(mClipboardIndexes); + + int operations = mClipboardIndexes.count(); + const QString message = QString ("%1 entries cut to clipboard"); + QString noteMsg = message.arg(operations); + + Notifications::showInformationNote(noteMsg); +} + +/** + Set selected files into clipboard. + Selected item will not be removed after paste operation. + */ +void FbFileView::editCopy() +{ + storeSelectedItemsOrCurrentItem(); + + // Store indices to clipboard + mClipboardIndexes.clear(); + for (int i = 0; i < mSelectionIndexes.size(); ++i) { + mClipboardIndexes.append(mSelectionIndexes.at(i)); + } + + mEngineWrapper->clipboardCopy(mClipboardIndexes); + + int operations = mClipboardIndexes.count(); + + const QString message = QString ("%1 entries copied to clipboard"); + QString noteMsg = message.arg(operations); + + Notifications::showInformationNote(noteMsg); +} + +/** + Moves or copies file selection stored in clipboard to a actual directory. + Removing files depend on previous operation, i.e. Cut or Copy + */ +void FbFileView::editPaste() +{ + bool someEntryExists(false); + + // TODO Set entry items here + + someEntryExists = mEngineWrapper->isDestinationEntriesExists(mClipboardIndexes, mEngineWrapper->currentPath()); + if (someEntryExists) { + fileOverwriteDialog(); + } + + mEngineWrapper->clipboardPaste(mOverwriteOptions); +} + +/** + Open copy to folder new filename dialog + */ +void FbFileView::editCopyToFolder() +{ + QString heading = QString("Enter new name"); + HbInputDialog::getText(heading, this, SLOT(doEditCopyToFolder(HbAction*)), mEngineWrapper->currentPath(), scene()); +} + +/** + Copies current file selection to a queried directory. + */ +void FbFileView::doEditCopyToFolder(HbAction *action) +{ + HbInputDialog *dlg = static_cast(sender()); + if (dlg && action && action->text().compare(QString("Ok"), Qt::CaseInsensitive) == 0) { + QString targetDir = dlg->value().toString(); + bool someEntryExists(false); + + // TODO Set entry items here + storeSelectedItemsOrCurrentItem(); + mEngineWrapper->setCurrentSelection(mSelectionIndexes); + + someEntryExists = mEngineWrapper->isDestinationEntriesExists(mSelectionIndexes, targetDir); + if (someEntryExists) { + fileOverwriteDialog(); + } + mEngineWrapper->copyToFolder(targetDir, mOverwriteOptions, false); + refreshList(); + } +} + +/** + Open move to folder new filename dialog. + */ +void FbFileView::editMoveToFolder() +{ + QString heading = QString("Enter new name"); + HbInputDialog::getText(heading, this, SLOT(doEditMoveToFolder(HbAction*)), mEngineWrapper->currentPath(), scene()); +} + +/** + Moves current file selection to a queried directory. + */ +void FbFileView::doEditMoveToFolder(HbAction *action) +{ + HbInputDialog *dlg = static_cast(sender()); + if (dlg && action && action->text().compare(QString("Ok"), Qt::CaseInsensitive) == 0) { + QString targetDir = dlg->value().toString(); + bool someEntryExists(false); + + // TODO Set entry items here + storeSelectedItemsOrCurrentItem(); + mEngineWrapper->setCurrentSelection(mSelectionIndexes); + + someEntryExists = mEngineWrapper->isDestinationEntriesExists(mSelectionIndexes, targetDir); + if (someEntryExists) { + fileOverwriteDialog(); + } + mEngineWrapper->copyToFolder(targetDir, mOverwriteOptions, true); + refreshList(); + } +} + +/** + Select current file + */ +void FbFileView::editSelect() +{ + QItemSelectionModel *selectionModel = mListView->selectionModel(); + if (selectionModel) { + selectionModel->select(selectionModel->currentIndex(), QItemSelectionModel::SelectCurrent); + selectionModel->select(selectionModel->currentIndex(), QItemSelectionModel::Select); +// itemHighlighted(selectionModel->currentIndex()); + refreshList(); + } +} + +/** + Unselect current file + */ +void FbFileView::editUnselect() +{ + QItemSelectionModel *selectionModel = mListView->selectionModel(); + if (selectionModel) { + selectionModel->select(selectionModel->currentIndex(), QItemSelectionModel::Deselect); +// itemHighlighted(selectionModel->currentIndex()); + } +} + +/** + Select all files + */ +void FbFileView::editSelectAll() +{ + QItemSelectionModel *selectionModel = mListView->selectionModel(); + if (selectionModel) { + + //if (mFileBrowserModel->rowCount() > 0) { + if (mListView->model() && mListView->model()->rowCount() > 0) { + QModelIndex firstIndex = mListView->model()->index(0, 0); + QModelIndex lastIndex = mListView->model()->index( (mListView->model()->rowCount() - 1), 0); + + QItemSelection itemSelection(firstIndex, lastIndex); + selectionModel->select(itemSelection, QItemSelectionModel::SelectCurrent); + } + } +} + +/** + Unselect all files + */ +void FbFileView::editUnselectAll() +{ + QItemSelectionModel *selectionModel = mListView->selectionModel(); + if (selectionModel) { + selectionModel->clearSelection(); + } +} + +// --------------------------------------------------------------------------- +// view menu +// --------------------------------------------------------------------------- +void FbFileView::viewFilterEntries() +{ + if (mToolBar && mToolBar->actions().count() > 1 && mToolBar->actions().at(1)) { + HbAction* tbeFilterAction = qobject_cast(mToolBar->actions().at(1)); + if (tbeFilterAction && tbeFilterAction->toolBarExtension()) { + HbToolBarExtension *tbeFilter = tbeFilterAction->toolBarExtension(); + tbeFilter->open(); + } + } +} + +/** + Set filter criteria to proxy model + */ +void FbFileView::filterCriteriaChanged(const QString &criteria) +{ + mSortFilterProxyModel->setFilterCriteria(criteria); +} + +/** + Set filter criteria to proxy model + */ +void FbFileView::clearFilterCriteria() +{ + mSearchPanel->setCriteria(QString("")); +} + +/** + Refresh view + */ +void FbFileView::viewRefresh() +{ + refreshList(); +} + +// --------------------------------------------------------------------------- +// tools menu +// --------------------------------------------------------------------------- +void FbFileView::toolsAllAppsToTextFile() +{ + +} + +/** + Write all files to text file + */ +void FbFileView::toolsAllFilesToTextFile() +{ + mEngineWrapper->toolsWriteAllFiles(); +} + +//void FbFileView::toolsAvkonIconCacheEnable() +//{ +// +//} +//void FbFileView::toolsAvkonIconCacheDisable() +//{ +// +//} + +/** + Disable extended errors + */ +void FbFileView::toolsDisableExtendedErrors() +{ + mEngineWrapper->ToolsSetErrRd(false); +} + +void FbFileView::toolsDumpMsgStoreWalk() +{ + +} +void FbFileView::toolsEditDataTypes() +{ + +} + +/** + Enable extended errors + */ +void FbFileView::toolsEnableExtendedErrors() +{ + mEngineWrapper->ToolsSetErrRd(true); +} + +/** + Open simulate leave dialog + */ +void FbFileView::toolsErrorSimulateLeave() +{ + int leaveCode = -6; + QString heading = QString("Leave code"); + //HbInputDialog::getInteger(heading, this, SLOT(doToolsErrorSimulateLeave(HbAction*)), leaveCode, scene()); + HbInputDialog::getText(heading, this, SLOT(doToolsErrorSimulateLeave(HbAction*)), QString::number(leaveCode), scene()); +} + + +/** + Simulate leave. + */ +void FbFileView::doToolsErrorSimulateLeave(HbAction *action) +{ + HbInputDialog *dlg = static_cast(sender()); + if (dlg && action && action->text().compare(QString("Ok"), Qt::CaseInsensitive) == 0) { + bool ok; + int leaveCode = dlg->value().toString().toInt(&ok); + if (leaveCode != 0 || ok) { + mEngineWrapper->ToolsErrorSimulateLeave(leaveCode); + } + } +} + +/** + Open simulate panic dialog. + */ +void FbFileView::toolsErrorSimulatePanic() +{ + mPanicCategory = QString ("Test Category"); + QString heading = QString("Panic category"); + HbInputDialog::getText(heading, this, SLOT(doToolsErrorSimulatePanicCode(HbAction*)), mPanicCategory, scene()); +} + +/** + Simulate panic. + */ +void FbFileView::doToolsErrorSimulatePanicCode(HbAction *action) +{ + HbInputDialog *dlg = static_cast(sender()); + if (dlg && action && action->text().compare(QString("Ok"), Qt::CaseInsensitive) == 0) { + mPanicCategory = dlg->value().toString(); + int panicCode(555); + QString heading = QString("Panic code"); + HbInputDialog::getInteger(heading, this, SLOT(doToolsErrorSimulatePanic(HbAction*)), panicCode, scene()); + } +} + +/** + Simulate panic. + */ +void FbFileView::doToolsErrorSimulatePanic(HbAction *action) +{ + HbInputDialog *dlg = static_cast(sender()); + if (dlg && action && action->text().compare(QString("Ok"), Qt::CaseInsensitive) == 0) { + bool ok; + int panicCode = dlg->value().toInt(&ok); + if (panicCode != 0 || ok) { + mEngineWrapper->ToolsErrorSimulatePanic(mPanicCategory, panicCode); + } + } +} + +/** + Open simulate exception dialog. + */ +void FbFileView::toolsErrorSimulateException() +{ + int exceptionCode = 0; + QString heading = QString("Exception code"); + HbInputDialog::getInteger(heading, this, SLOT(doToolsErrorSimulateException(HbAction*)), exceptionCode, scene()); +} + +/** + Simulate exception. + */ +void FbFileView::doToolsErrorSimulateException(HbAction *action) +{ + HbInputDialog *dlg = static_cast(sender()); + if (dlg && action && action->text().compare(QString("Ok"), Qt::CaseInsensitive) == 0) { + bool ok; + int exceptionCode = dlg->value().toInt(&ok); + if (exceptionCode != 0 || ok) { + mEngineWrapper->ToolsErrorSimulateException(exceptionCode); + } + } +} + +// void FbFileView::toolsLocalConnectivityActivateInfrared() +//{ +// +//} +// void FbFileView::toolsLocalConnectivityLaunchBTUI() +//{ +// +//} +// void FbFileView::toolsLocalConnectivityLaunchUSBUI() +//{ +// +//} +void FbFileView::toolsMessageInbox() +{ + +} +void FbFileView::toolsMessageDrafts() +{ + +} +void FbFileView::toolsMessageSentItems() +{ + +} +void FbFileView::toolsMessageOutbox() +{ + +} +void FbFileView::toolsMemoryInfo() +{ + +} +void FbFileView::toolsSecureBackStart() +{ + +} +void FbFileView::toolsSecureBackRestore() +{ + +} +void FbFileView::toolsSecureBackStop() +{ + +} + +/** + Open debug mask dialog + */ +void FbFileView::toolsSetDebugMaskQuestion() +{ + quint32 dbgMask = mEngineWrapper->getDebugMask(); + QString dbgMaskText = QString("0x").append(QString::number(dbgMask, 16)); + QString heading = QString("Kernel debug mask in hex format"); + HbInputDialog::getText(heading, this, SLOT(toolsSetDebugMask(HbAction*)), dbgMaskText, scene()); +} + +/** + Set debug mask + */ +void FbFileView::toolsSetDebugMask(HbAction *action) +{ + HbInputDialog *dlg = static_cast(sender()); + if (dlg && action && action->text().compare(QString("Ok"), Qt::CaseInsensitive) == 0) { + QString dbgMaskText = dlg->value().toString(); + if (dbgMaskText.length() > 2 && dbgMaskText[0]=='0' && dbgMaskText[1]=='x') { + bool ok; + quint32 dbgMask = dbgMaskText.toUInt(&ok, 16); + if (dbgMask != 0 || ok) { + mEngineWrapper->toolsSetDebugMask(dbgMask); + Notifications::showConfirmationNote(QString("Changed")); + } else { + Notifications::showErrorNote(QString("Cannot convert value")); + } + } else { + Notifications::showErrorNote(QString("Not in hex format")); + } + } +} + +void FbFileView::toolsShowOpenFilesHere() +{ + +} + +// --------------------------------------------------------------------------- +// main menu items +// --------------------------------------------------------------------------- +void FbFileView::selectionModeChanged() +{ + if (mOptionMenuActions.mSelection->isChecked()) { + activateSelectionMode(); + } else { + deActivateSelectionMode(); + } +} + +/** + Show about note + */ +void FbFileView::about() +{ + Notifications::showAboutNote(); +} + +// --------------------------------------------------------------------------- +// End of operations +// --------------------------------------------------------------------------- + +// --------------------------------------------------------------------------- + +/** + Item is selected from list when selection mode is activated from menu + */ +void FbFileView::selectionChanged(const QItemSelection &/*selected*/, const QItemSelection &/*deselected*/) +{ + //QItemSelectionModel *selectionModel = mListView->selectionModel(); + //itemHighlighted(selectionModel->currentIndex()); +} + +/** + An item is clicked from navigation item list. Navigation item list contains + drive-, folder- or file items. Opens selected drive, folder or file popup menu + */ +void FbFileView::activated(const QModelIndex& index) +{ + if (mFbFileModel) { + //map to source model + QModelIndex activatedIndex = mSortFilterProxyModel->mapToSource(index); + + if (mEngineWrapper->getFileEntry(activatedIndex).isDir()) { + // populate new content of changed navigation view. + // mLocationChanged = true; + // mDirectory = filePath; + mEngineWrapper->moveDownToDirectory(activatedIndex); + refreshList(); + } else { // file item + // mSelectedFilePath = filePath; + FileEntry fileEntry = mEngineWrapper->getFileEntry(activatedIndex); + mAbsoluteFilePath = fileEntry.path() + fileEntry.name(); + + // open user-dialog to select: view as text/hex, open w/AppArc or open w/DocH. embed + QStringList list; + list << QString("View as text/hex") << QString("Open w/ AppArc") << QString("Open w/ DocH. embed"); + openListDialog(list, QString("Open file"), this, SLOT(fileOpen(HbAction *))); + } + } +} + +// --------------------------------------------------------------------------- + +void FbFileView::activateSelectionMode() +{ + QString path; + disconnect(mListView, SIGNAL(activated(QModelIndex)), this, SLOT(activated(QModelIndex))); + mListView->setSelectionMode(HbListView::MultiSelection); + +// QModelIndex index = mFileSystemModel->index(path,0); +// mListView->selectionModel()->setCurrentIndex(index, QItemSelectionModel::SelectCurrent); +// mListView->selectionModel()->select(index, QItemSelectionModel::Select); +// //mListView->setHighlightMode(HbItemHighlight::HighlightAlwaysVisible); +// mListView->setFocus(); // TODO use focus in + if (mListView->selectionModel()) { + connect(mListView->selectionModel(), + SIGNAL(selectionChanged(QItemSelection, QItemSelection)), + this, + SLOT(selectionChanged(QItemSelection, QItemSelection))); +// // flag to indicate that selection mode changed, "edit" sub-menu update needed +// mFolderContentChanged = true; + } +} + +// --------------------------------------------------------------------------- + +void FbFileView::deActivateSelectionMode() +{ + disconnect(mListView->selectionModel(), + SIGNAL(selectionChanged(QItemSelection, QItemSelection)), + this, + SLOT(selectionChanged(QItemSelection, QItemSelection))); + mListView->setSelectionMode(HbListView::NoSelection); + connect(mListView, SIGNAL(activated(QModelIndex)), this, SLOT(activated(QModelIndex))); + editUnselectAll(); + // flag to indicate that selection mode changed, "edit" sub-menu update needed + mFolderContentChanged = true; +} + +// ---------------------------------------------------------------------------