|  | Home · All Classes · Main Classes · Grouped Classes · Modules · Functions |

# findfiledialog.cpp Example File
assistant/simpletextviewer/findfiledialog.cpp

        /****************************************************************************
        **
        ** Copyright (C) 2005-2006 Trolltech ASA. All rights reserved.
        **
        ** This file is part of the example classes of the Qt Toolkit.
        **
        ** Licensees holding valid Qt Preview licenses may use this file in
        ** accordance with the Qt Preview License Agreement provided with the
        ** Software.
        **
        ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
        ** information about Qt Commercial License Agreements.
        **
        ** Contact info@trolltech.com if any conditions of this licensing are
        ** not clear to you.
        **
        ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
        ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        **
        ****************************************************************************/

        #include <QtGui>

        #include "findfiledialog.h"

        FindFileDialog::FindFileDialog(QTextEdit *editor, QAssistantClient *assistant,
                                       QWidget *parent)
            : QDialog(parent)
        {
            currentAssistantClient = assistant;
            currentEditor = editor;

            createButtons();
            createComboBoxes();
            createFilesTree();
            createLabels();
            createLayout();

            directoryComboBox->addItem(QDir::currentPath() + QDir::separator());
            fileNameComboBox->addItem("*");
            findFiles();

            setWindowTitle(tr("Find File"));
        }

        void FindFileDialog::browse()
        {
            QString currentDirectory = directoryComboBox->currentText();
            QString newDirectory = QFileDialog::getExistingDirectory(this,
                                       tr("Select Directory"), currentDirectory);
            if (!newDirectory.isEmpty()) {
                directoryComboBox->addItem(newDirectory);
                directoryComboBox->setCurrentIndex(directoryComboBox->count() - 1);
                update();
            }
        }

        void FindFileDialog::help()
        {
            currentAssistantClient->showPage(QLibraryInfo::location(QLibraryInfo::ExamplesPath) +
                    QDir::separator() +  "assistant/simpletextviewer/documentation/filedialog.html");
        }

        void FindFileDialog::openFile(QTreeWidgetItem *item)
        {
            if (!item) {
                item = foundFilesTree->currentItem();
                if (!item)
                    return;
            }

            QString fileName = item->text(0);
            QString path = directoryComboBox->currentText();

            QFile file(path + fileName);
            if (file.open(QIODevice::ReadOnly)) {
                QString data(file.readAll());

                if (fileName.endsWith(".html"))
                    currentEditor->setHtml(data);
                else
                    currentEditor->setPlainText(data);
            }
            close();
        }

        void FindFileDialog::update()
        {
            findFiles();
            buttonBox->button(QDialogButtonBox::Open)->setEnabled(
                    foundFilesTree->topLevelItemCount() > 0);
        }

        void FindFileDialog::findFiles()
        {
            QRegExp filePattern(fileNameComboBox->currentText() + "*");
            filePattern.setPatternSyntax(QRegExp::Wildcard);

            QDir directory(directoryComboBox->currentText());

            QStringList allFiles = directory.entryList(QDir::Files | QDir::NoSymLinks);
            QStringList matchingFiles;

            foreach (QString file, allFiles) {
                if (filePattern.exactMatch(file))
                    matchingFiles << file;
            }
            showFiles(matchingFiles);
        }

        void FindFileDialog::showFiles(const QStringList &files)
        {
            foundFilesTree->clear();

            for (int i = 0; i < files.count(); ++i) {
                QTreeWidgetItem *item = new QTreeWidgetItem(foundFilesTree);
                item->setText(0, files[i]);
            }

            if (files.count() > 0)
                foundFilesTree->setCurrentItem(foundFilesTree->topLevelItem(0));
        }

        void FindFileDialog::createButtons()
        {
            browseButton = new QToolButton;
            browseButton->setText(tr("..."));
            connect(browseButton, SIGNAL(clicked()), this, SLOT(browse()));

            buttonBox = new QDialogButtonBox(QDialogButtonBox::Open
                                             | QDialogButtonBox::Cancel
                                             | QDialogButtonBox::Help);
            connect(buttonBox, SIGNAL(accepted()), this, SLOT(openFile()));
            connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
            connect(buttonBox, SIGNAL(helpRequested()), this, SLOT(help()));
        }

        void FindFileDialog::createComboBoxes()
        {
            directoryComboBox = new QComboBox;
            fileNameComboBox = new QComboBox;

            fileNameComboBox->setEditable(true);
            fileNameComboBox->setSizePolicy(QSizePolicy::Expanding,
                                            QSizePolicy::Preferred);

            directoryComboBox->setMinimumContentsLength(30);
            directoryComboBox->setSizeAdjustPolicy(
                    QComboBox::AdjustToMinimumContentsLength);
            directoryComboBox->setSizePolicy(QSizePolicy::Expanding,
                                             QSizePolicy::Preferred);

            connect(fileNameComboBox, SIGNAL(editTextChanged(const QString &)),
                    this, SLOT(update()));
            connect(directoryComboBox, SIGNAL(currentIndexChanged(const QString &)),
                    this, SLOT(update()));
        }

        void FindFileDialog::createFilesTree()
        {
            foundFilesTree = new QTreeWidget;
            foundFilesTree->setColumnCount(1);
            foundFilesTree->setHeaderLabels(QStringList(tr("Matching Files")));
            foundFilesTree->setRootIsDecorated(false);
            foundFilesTree->setSelectionMode(QAbstractItemView::SingleSelection);

            connect(foundFilesTree, SIGNAL(itemActivated(QTreeWidgetItem *, int)),
                    this, SLOT(openFile(QTreeWidgetItem *)));
        }

        void FindFileDialog::createLabels()
        {
            directoryLabel = new QLabel(tr("Search in:"));
            fileNameLabel = new QLabel(tr("File name (including wildcards):"));
        }

        void FindFileDialog::createLayout()
        {
            QHBoxLayout *fileLayout = new QHBoxLayout;
            fileLayout->addWidget(fileNameLabel);
            fileLayout->addWidget(fileNameComboBox);

            QHBoxLayout *directoryLayout = new QHBoxLayout;
            directoryLayout->addWidget(directoryLabel);
            directoryLayout->addWidget(directoryComboBox);
            directoryLayout->addWidget(browseButton);

            QVBoxLayout *mainLayout = new QVBoxLayout;
            mainLayout->addLayout(fileLayout);
            mainLayout->addLayout(directoryLayout);
            mainLayout->addWidget(foundFilesTree);
            mainLayout->addStretch();
            mainLayout->addWidget(buttonBox);
            setLayout(mainLayout);
        }