findfiledialog.cpp Example File | Qt Assistant Manual

- Qt 5.4
- Qt Assistant Manual
- Simple Text Viewer Example
- findfiledialog.cpp Example File
- Qt 5.4.2 Reference Documentation

# findfiledialog.cpp Example File

simpletextviewer/findfiledialog.cpp

    /****************************************************************************
    **
    ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
    ** Contact: http://www.qt-project.org/legal
    **
    ** This file is part of the examples of the Qt Toolkit.
    **
    ** $QT_BEGIN_LICENSE:BSD$
    ** You may use this file under the terms of the BSD license as follows:
    **
    ** "Redistribution and use in source and binary forms, with or without
    ** modification, are permitted provided that the following conditions are
    ** met:
    **   * Redistributions of source code must retain the above copyright
    **     notice, this list of conditions and the following disclaimer.
    **   * Redistributions in binary form must reproduce the above copyright
    **     notice, this list of conditions and the following disclaimer in
    **     the documentation and/or other materials provided with the
    **     distribution.
    **   * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
    **     of its contributors may be used to endorse or promote products derived
    **     from this software without specific prior written permission.
    **
    **
    ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
    **
    ** $QT_END_LICENSE$
    **
    ****************************************************************************/

    #include <QtCore/QDir>
    #include <QtWidgets/QLayout>
    #include <QtWidgets/QComboBox>
    #include <QtWidgets/QTreeWidget>
    #include <QtWidgets/QLayout>
    #include <QtWidgets/QFileDialog>
    #include <QtWidgets/QDialogButtonBox>
    #include <QtWidgets/QToolButton>
    #include <QtWidgets/QPushButton>
    #include <QtWidgets/QLabel>

    #include "findfiledialog.h"
    #include "assistant.h"
    #include "textedit.h"

    FindFileDialog::FindFileDialog(TextEdit *editor, Assistant *assistant)
        : QDialog(editor)
    {
        currentAssistant = assistant;
        currentEditor = editor;

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

        directoryComboBox->addItem(QDir::toNativeSeparators(QDir::currentPath()));
        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(QDir::toNativeSeparators(newDirectory));
            directoryComboBox->setCurrentIndex(directoryComboBox->count() - 1);
            update();
        }
    }

    void FindFileDialog::help()
    {
        currentAssistant->showDocumentation("filedialog.html");
    }

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

        QString fileName = item->text(0);
        QString path = directoryComboBox->currentText() + QDir::separator();

        currentEditor->setContents(path + fileName);
        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(QString)),
                this, SLOT(update()));
        connect(directoryComboBox, SIGNAL(currentIndexChanged(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);
    }