|  | 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::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()
    {
        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() + QDir::separator();

        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);
    }