File indexing completed on 2024-04-28 16:26:31

0001 /******************************************************************************************
0002     begin                : Wed Aug 14 2002
0003     copyright            : (C) 2003 by Jeroen Wijnhout (Jeroen.Wijnhout@kdemail.net)
0004                                2007-2022 by Michel Ludwig (michel.ludwig@kdemail.net)
0005 
0006 from Kate (C) 2001 by Matt Newell
0007 
0008  ******************************************************************************************/
0009 
0010 /***************************************************************************
0011  *                                                                         *
0012  *   This program is free software; you can redistribute it and/or modify  *
0013  *   it under the terms of the GNU General Public License as published by  *
0014  *   the Free Software Foundation; either version 2 of the License, or     *
0015  *   (at your option) any later version.                                   *
0016  *                                                                         *
0017  ***************************************************************************/
0018 
0019 // 2007-03-12 dani
0020 //  - use KileDocument::Extensions
0021 
0022 #include "widgets/filebrowserwidget.h"
0023 
0024 #include <QAbstractItemView>
0025 #include <QFocusEvent>
0026 #include <QLayout>
0027 #include <QToolTip>
0028 #include <QVBoxLayout>
0029 
0030 #include <KActionCollection>
0031 #include <KActionMenu>
0032 #include <KCharsets>
0033 #include <KFilePlacesModel>
0034 #include <KLocalizedString>
0035 #include <KToolBar>
0036 #include <KConfig>
0037 #include <kio_version.h>
0038 
0039 #include "kileconfig.h"
0040 #include "kiledebug.h"
0041 
0042 namespace KileWidget {
0043 
0044 FileBrowserWidget::FileBrowserWidget(KileDocument::Extensions *extensions, QWidget *parent)
0045     : QWidget(parent), m_extensions(extensions)
0046 {
0047     m_configGroup = KConfigGroup(KSharedConfig::openConfig(),"FileBrowserWidget");
0048 
0049     QVBoxLayout* layout = new QVBoxLayout(this);
0050     layout->setContentsMargins(0, 0, 0, 0);
0051     layout->setSpacing(0);
0052     setLayout(layout);
0053 
0054     m_toolbar = new KToolBar(this);
0055     m_toolbar->setMovable(false);
0056     m_toolbar->setToolButtonStyle(Qt::ToolButtonIconOnly);
0057     m_toolbar->setContextMenuPolicy(Qt::NoContextMenu);
0058     layout->addWidget(m_toolbar);
0059 
0060     KFilePlacesModel* model = new KFilePlacesModel(this);
0061     m_urlNavigator = new KUrlNavigator(model, QUrl::fromLocalFile(QDir::homePath()), this);
0062     layout->addWidget(m_urlNavigator);
0063     connect(m_urlNavigator, SIGNAL(urlChanged(QUrl)), SLOT(setDir(QUrl)));
0064 
0065     m_dirOperator = new KDirOperator(QUrl(), this);
0066     m_dirOperator->setViewConfig(m_configGroup);
0067     m_dirOperator->readConfig(m_configGroup);
0068     m_dirOperator->setViewMode(KFile::Tree);
0069     m_dirOperator->setMode(KFile::Files);
0070     setFocusProxy(m_dirOperator);
0071 
0072     connect(m_urlNavigator, SIGNAL(urlChanged(QUrl)), m_dirOperator, SLOT(setFocus()));
0073     connect(m_dirOperator, SIGNAL(fileSelected(KFileItem)), this, SIGNAL(fileSelected(KFileItem)));
0074     connect(m_dirOperator, SIGNAL(urlEntered(QUrl)), this, SLOT(dirUrlEntered(QUrl)));
0075 
0076 
0077 
0078     setupToolbar();
0079 
0080     layout->addWidget(m_dirOperator);
0081     layout->setStretchFactor(m_dirOperator, 2);
0082     readConfig();
0083 }
0084 
0085 FileBrowserWidget::~FileBrowserWidget()
0086 {
0087 }
0088 
0089 void FileBrowserWidget::readConfig()
0090 {
0091     QString lastDir = KileConfig::lastDir();
0092     QFileInfo ldi(lastDir);
0093     if (!ldi.isReadable()) {
0094         KILE_DEBUG_MAIN << "lastDir is not readable";
0095         m_dirOperator->home();
0096     }
0097     else {
0098         setDir(QUrl::fromLocalFile(lastDir));
0099     }
0100 
0101     bool filterLatex = KileConfig::showLaTeXFilesOnly();
0102     toggleShowLaTeXFilesOnly(filterLatex);
0103 }
0104 
0105 void FileBrowserWidget::writeConfig()
0106 {
0107     KileConfig::setLastDir(m_dirOperator->url().toLocalFile());
0108     m_dirOperator->writeConfig(m_configGroup);
0109 }
0110 
0111 void FileBrowserWidget::setupToolbar()
0112 {
0113 #if KIO_VERSION < QT_VERSION_CHECK(5, 100, 0)
0114     KActionCollection *coll = m_dirOperator->actionCollection();
0115     m_toolbar->addAction(coll->action("back"));
0116     m_toolbar->addAction(coll->action("forward"));
0117 #else
0118     m_toolbar->addAction(m_dirOperator->action(KDirOperator::Back));
0119     m_toolbar->addAction(m_dirOperator->action(KDirOperator::Forward));
0120 #endif
0121 
0122     QAction *action = new QAction(this);
0123     action->setIcon(QIcon::fromTheme("document-open"));
0124     action->setText(i18n("Open selected"));
0125     connect(action, SIGNAL(triggered()), this, SLOT(emitFileSelectedSignal()));
0126     m_toolbar->addAction(action);
0127 
0128     QAction *showOnlyLaTexFilesAction = new QAction(this);
0129     showOnlyLaTexFilesAction->setText(i18n("Show LaTeX Files Only"));
0130     showOnlyLaTexFilesAction->setCheckable(true);
0131     showOnlyLaTexFilesAction->setChecked(KileConfig::showLaTeXFilesOnly());
0132     connect(showOnlyLaTexFilesAction, SIGNAL(triggered(bool)), this, SLOT(toggleShowLaTeXFilesOnly(bool)));
0133 
0134     // section for settings menu
0135     KActionMenu *optionsMenu = new KActionMenu(QIcon::fromTheme("configure"), i18n("Options"), this);
0136     optionsMenu->setPopupMode(QToolButton::InstantPopup);
0137 #if KIO_VERSION < QT_VERSION_CHECK(5, 100, 0)
0138     optionsMenu->addAction(m_dirOperator->actionCollection()->action("short view"));
0139     optionsMenu->addAction(m_dirOperator->actionCollection()->action("detailed view"));
0140     optionsMenu->addAction(m_dirOperator->actionCollection()->action("tree view"));
0141     optionsMenu->addAction(m_dirOperator->actionCollection()->action("detailed tree view"));
0142 #else
0143     optionsMenu->addAction(m_dirOperator->action(KDirOperator::ShortView));
0144     optionsMenu->addAction(m_dirOperator->action(KDirOperator::DetailedView));
0145     optionsMenu->addAction(m_dirOperator->action(KDirOperator::TreeView));
0146     optionsMenu->addAction(m_dirOperator->action(KDirOperator::DetailedTreeView));
0147 #endif
0148     optionsMenu->addSeparator();
0149     optionsMenu->addAction(showOnlyLaTexFilesAction);
0150 #if KIO_VERSION < QT_VERSION_CHECK(5, 100, 0)
0151     optionsMenu->addAction(m_dirOperator->actionCollection()->action("show hidden"));
0152 #else
0153     optionsMenu->addAction(m_dirOperator->action(KDirOperator::ShowHiddenFiles));
0154 #endif
0155 
0156     m_toolbar->addSeparator();
0157     m_toolbar->addAction(optionsMenu);
0158 }
0159 
0160 void FileBrowserWidget::toggleShowLaTeXFilesOnly(bool filter)
0161 {
0162     KileConfig::setShowLaTeXFilesOnly(filter);
0163 
0164     if(filter) {
0165         // FileBrowserWidget filter for sidebar
0166         QString filter =  m_extensions->latexDocuments()
0167                           + ' ' + m_extensions->latexPackages()
0168                           + ' ' + m_extensions->bibtex()
0169                           + ' ' +  m_extensions->metapost();
0170         filter.replace('.', "*.");
0171         m_dirOperator->setNameFilter(filter);
0172     }
0173     else {
0174         m_dirOperator->clearFilter();
0175     }
0176     m_dirOperator->rereadDir();
0177 }
0178 
0179 QUrl FileBrowserWidget::currentUrl() const
0180 {
0181     return m_dirOperator->url();
0182 }
0183 
0184 void FileBrowserWidget::dirUrlEntered(const QUrl &u)
0185 {
0186     m_urlNavigator->setLocationUrl(u);
0187 }
0188 
0189 void FileBrowserWidget::setDir(const QUrl &url)
0190 {
0191     m_dirOperator->setUrl(url, true);
0192 }
0193 
0194 void FileBrowserWidget::emitFileSelectedSignal()
0195 {
0196     KFileItemList itemList = m_dirOperator->selectedItems();
0197     for(KFileItemList::iterator it = itemList.begin(); it != itemList.end(); ++it) {
0198         emit(fileSelected(*it));
0199     }
0200 
0201     m_dirOperator->view()->clearSelection();
0202 }
0203 
0204 }
0205