]> git.lyx.org Git - features.git/commitdiff
Add new dialog for templates and examples
authorJuergen Spitzmueller <spitz@lyx.org>
Tue, 19 Mar 2019 05:59:24 +0000 (06:59 +0100)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Thu, 18 Jun 2020 13:48:17 +0000 (15:48 +0200)
This lists all respective files from user, build and system directory
in a structured way and thus allows for easier access to them.

Fixes: #2396, #6861
lib/ui/stdmenus.inc
src/LyXAction.cpp
src/frontends/qt4/GuiApplication.cpp
src/frontends/qt4/GuiLyXFiles.cpp [new file with mode: 0644]
src/frontends/qt4/GuiLyXFiles.h [new file with mode: 0644]
src/frontends/qt4/GuiView.cpp
src/frontends/qt4/GuiView.h
src/frontends/qt4/Makefile.am
src/frontends/qt4/ui/LyXFilesUi.ui [new file with mode: 0644]

index b9f16b04040b84df625fb7257e669d02e3c64039..a0c3bf2631629a38333973740d7ae21542b4ade4 100644 (file)
@@ -43,9 +43,10 @@ Menuset
 
        Menu "file"
                Item "New|N" "buffer-new"
-               Item "New from Template...|m" "buffer-new-template"
+               Item "New from Template...|m" "dialog-show lyxfiles templates"
                Item "Open...|O" "file-open"
                Submenu "Open Recent|t" "file_lastfiles"
+               Item "Open Example File...|p" "dialog-show lyxfiles examples"
                Separator
                Item "Close|C" "buffer-close"
                Item "Close All" "buffer-close-all"
index d6c821e55a041ac8f050fe5522b52a62656200e3..082d6080d4e6383010a9b97cd41e2466675ae6fe 100644 (file)
@@ -714,8 +714,11 @@ void LyXAction::init()
  * \li Action: Creates a new buffer (that is, document) from a template.
  * \li Notion: Path for new files and templates can be set in Preferences dialog.
                Template will be asked for via Open-dialog.
- * \li Syntax: buffer-new-template [<FILE>]
- * \li Params: <FILE>: filename of created file with absolute path.
+ * \li Syntax: buffer-new-template [<FILE>] [<TEMPLATE FILE>]
+ * \li Params: <FILE>: filename of created file with absolute path. If empty
+ *                     or "newfile", a file with appropriate name is generated.
+ *             <TEMPLATE FILE>: filename of template with absolute path. If empty,
+ *                              a dialog is opened to select the new file.
  * \endvar
  */
                { LFUN_BUFFER_NEW_TEMPLATE,"buffer-new-template", NoBuffer, Buffer },
index ac3e4e8f97678788b3718977f37c804a44dc8dd6..ea5241cdeb5c32e87fb9c3025d0176555e80b823 100644 (file)
@@ -1332,6 +1332,7 @@ bool GuiApplication::getStatus(FuncRequest const & cmd, FuncStatus & flag) const
        case LFUN_DIALOG_SHOW: {
                string const name = cmd.getArg(0);
                return name == "aboutlyx"
+                       || name == "lyxfiles"
                        || name == "prefs"
                        || name == "texinfo"
                        || name == "progress"
@@ -1655,26 +1656,29 @@ void GuiApplication::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                if (!current_view_
                   || (!lyxrc.open_buffers_in_tabs && current_view_->documentBufferView() != 0)) {
                        createView(QString(), false); // keep hidden
-                       current_view_->newDocument(to_utf8(cmd.argument()), false);
+                       current_view_->newDocument(to_utf8(cmd.argument()));
                        current_view_->show();
                        setActiveWindow(current_view_);
                } else {
-                       current_view_->newDocument(to_utf8(cmd.argument()), false);
+                       current_view_->newDocument(to_utf8(cmd.argument()));
                }
                break;
 
-       case LFUN_BUFFER_NEW_TEMPLATE:
+       case LFUN_BUFFER_NEW_TEMPLATE: {
+               string const file = (cmd.getArg(0) == "newfile") ? string() : cmd.getArg(0);
+               string const temp = cmd.getArg(1);
                validateCurrentView();
                if (!current_view_
                   || (!lyxrc.open_buffers_in_tabs && current_view_->documentBufferView() != 0)) {
                        createView();
-                       current_view_->newDocument(to_utf8(cmd.argument()), true);
+                       current_view_->newDocument(file, temp, true);
                        if (!current_view_->documentBufferView())
                                current_view_->close();
                } else {
-                       current_view_->newDocument(to_utf8(cmd.argument()), true);
+                       current_view_->newDocument(file, temp, true);
                }
                break;
+       }
 
        case LFUN_FILE_OPEN: {
                // FIXME: normally the code below is not needed, since getStatus makes sure that
diff --git a/src/frontends/qt4/GuiLyXFiles.cpp b/src/frontends/qt4/GuiLyXFiles.cpp
new file mode 100644 (file)
index 0000000..4c1ff45
--- /dev/null
@@ -0,0 +1,405 @@
+/**
+ * \file GuiLyXFiles.cpp
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Jürgen Spitzmüller
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#include <config.h>
+
+#include "GuiLyXFiles.h"
+#include "GuiApplication.h"
+#include "qt_helpers.h"
+
+#include "FileDialog.h"
+#include "Buffer.h"
+#include "BufferParams.h"
+#include "FuncRequest.h"
+#include "Language.h"
+#include "LyXRC.h"
+
+#include "support/environment.h"
+#include "support/filetools.h"
+#include "support/gettext.h"
+#include "support/lstrings.h"
+#include "support/Messages.h"
+#include "support/qstring_helpers.h"
+#include "support/Package.h"
+
+#include <QDirIterator>
+#include <QFileIconProvider>
+#include <QTreeWidget>
+
+using namespace std;
+using namespace lyx::support;
+
+namespace lyx {
+namespace frontend {
+
+namespace {
+
+void getFiles(QMap<QString, QString> & in, QString const type)
+{
+       // We look for lyx files in the subdirectory dir of
+       //   1) user_lyxdir
+       //   2) build_lyxdir (if not empty)
+       //   3) system_lyxdir
+       // in this order. Files with a given sub-hierarchy will
+       // only be listed once.
+       // We also consider i18n subdirectories and prefer them.
+       QStringList dirs;
+       QStringList relpaths;
+       QStringList langcodes;
+
+       // The three locations to look at.
+       string const user = addPath(package().user_support().absFileName(), fromqstr(type));
+       string const build = addPath(package().build_support().absFileName(), fromqstr(type));
+       string const system = addPath(package().system_support().absFileName(), fromqstr(type));
+
+       // If the LANGUAGE variable is set, use it as a fallback for searching for files.
+       string lang = getGuiMessages().language();
+       string const language = getEnv("LANGUAGE");
+       if (!language.empty())
+               lang += ":" + language;
+
+       // Get all supported languages (by code) in order to exclude those
+       // dirs later.
+       QAbstractItemModel * language_model = guiApp->languageModel();
+       for (int i = 0; i != language_model->rowCount(); ++i) {
+               QModelIndex index = language_model->index(i, 0);
+               Language const * lang =
+                       languages.getLanguage(fromqstr(index.data(Qt::UserRole).toString()));
+               if (!lang)
+                       continue;
+               string const code = lang->code();
+               langcodes << toqstr(code);
+               // Also store code without country code
+               string const shortcode = token(code, '_', 0);
+               if (shortcode != code)
+                       langcodes << toqstr(shortcode);
+       }
+
+       for (auto const & l : getVectorFromString(lang, ":")) {
+               FileName tmp;
+               // First try with the full name
+               // `en' files are not in a subdirectory
+               if (l == "en")
+                       break;
+               else {
+                       dirs << toqstr(addPath(user, l));
+                       dirs << toqstr(addPath(build, l));
+                       dirs << toqstr(addPath(system, l));
+               }
+               // Then the name without country code
+               string const shortl = token(l, '_', 0);
+               if (shortl != l) {
+                       dirs << toqstr(addPath(user, shortl));
+                       dirs << toqstr(addPath(build, shortl));
+                       dirs << toqstr(addPath(system, shortl));
+               }
+       }
+
+       // Next, search in the base path
+       dirs << toqstr(user)
+            << toqstr(build)
+            << toqstr(system);
+
+       for (int i = 0; i < dirs.size(); ++i) {
+               QString const dir = dirs.at(i);
+               QDirIterator it(dir, QDir::Files, QDirIterator::Subdirectories);
+               while (it.hasNext()) {
+                       QString fn(QFile(it.next()).fileName());
+                       if (!fn.endsWith(".lyx"))
+                               continue;
+                       QString const relpath = toqstr(makeRelPath(qstring_to_ucs4(fn),
+                                                                  qstring_to_ucs4(dir)));
+                       // <cat>/
+                       int s = relpath.indexOf('/', 0);
+                       QString cat = qt_("General");
+                       if (s != -1) {
+                               // <cat>/<subcat>/
+                               cat = relpath.left(s);
+                               int sc = relpath.indexOf('/', s + 1);
+                               QString const subcat = (sc == -1) ?
+                                                       QString() : relpath.mid(s + 1, sc - s - 1);
+                               if (langcodes.contains(cat)
+                                   && !langcodes.contains(dir.right(dir.lastIndexOf('/'))))
+                                       // Skip i18n dir
+                                       continue;
+                               if (!subcat.isEmpty())
+                                       cat += '/' + subcat;
+                       }
+                       if (!relpaths.contains(relpath)) {
+                               relpaths.append(relpath);
+                               in.insert(fn, cat);
+                       }
+               }
+       }
+}
+
+}// namespace anon
+
+
+GuiLyXFiles::GuiLyXFiles(GuiView & lv)
+       : GuiDialog(lv, "lyxfiles", qt_("New File From Template"))
+{
+       setupUi(this);
+
+       // The filter bar
+       filter_ = new FancyLineEdit(this);
+       filter_->setButtonPixmap(FancyLineEdit::Right, getPixmap("images/", "editclear", "svgz,png"));
+       filter_->setButtonVisible(FancyLineEdit::Right, true);
+       filter_->setButtonToolTip(FancyLineEdit::Right, qt_("Clear text"));
+       filter_->setAutoHideButton(FancyLineEdit::Right, true);
+       filter_->setPlaceholderText(qt_("All available labels"));
+       filter_->setToolTip(qt_("Enter string to filter the list of available labels"));
+#if (QT_VERSION < 0x050000)
+       connect(filter_, SIGNAL(downPressed()),
+               filesLW, SLOT(setFocus()));
+#else
+       connect(filter_, &FancyLineEdit::downPressed,
+               filesLW, [=](){ focusAndHighlight(filesLW); });
+#endif
+
+       filterBarL->addWidget(filter_, 0);
+       findKeysLA->setBuddy(filter_);
+
+       connect(buttonBox, SIGNAL(clicked(QAbstractButton *)),
+               this, SLOT(slotButtonBox(QAbstractButton *)));
+
+       connect(filesLW, SIGNAL(itemClicked(QTreeWidgetItem *, int)),
+               this, SLOT(changed_adaptor()));
+       connect(filesLW, SIGNAL(itemSelectionChanged()),
+               this, SLOT(changed_adaptor()));
+       connect(filter_, SIGNAL(textEdited(QString)),
+               this, SLOT(filterLabels()));
+       connect(filter_, SIGNAL(rightButtonClicked()),
+               this, SLOT(resetFilter()));
+
+       bc().setPolicy(ButtonPolicy::OkApplyCancelPolicy);
+       bc().setOK(buttonBox->button(QDialogButtonBox::Open));
+       bc().setCancel(buttonBox->button(QDialogButtonBox::Cancel));
+
+       //filesLW->setViewMode(QListView::ListMode);
+       filesLW->setIconSize(QSize(22, 22));
+
+       fileTypeCO->addItem(qt_("Templates"), toqstr("templates"));
+       fileTypeCO->addItem(qt_("Examples"), toqstr("examples"));
+
+       setFocusProxy(filter_);
+}
+
+
+void GuiLyXFiles::changed_adaptor()
+{
+       changed();
+}
+
+
+void GuiLyXFiles::on_fileTypeCO_activated(int)
+{
+       updateContents();
+}
+
+
+void GuiLyXFiles::on_filesLW_itemDoubleClicked(QTreeWidgetItem *, int)
+{
+       applyView();
+       dispatchParams();
+       close();
+}
+
+
+void GuiLyXFiles::on_browsePB_pressed()
+{
+       bool const examples = (type_ == "examples");
+       FileDialog dlg(qt_("Select template file"));
+       dlg.setButton1(qt_("D&ocuments"), toqstr(lyxrc.document_path));
+       if (examples)
+               dlg.setButton2(qt_("&Examples"), toqstr(lyxrc.example_path));
+       else
+               dlg.setButton2(qt_("&Templates"), toqstr(lyxrc.template_path));
+
+       FileDialog::Result result = dlg.open(examples ? toqstr(lyxrc.example_path)
+                                                     : toqstr(lyxrc.template_path),
+                                QStringList(qt_("LyX Documents (*.lyx)")));
+
+       if (result.first != FileDialog::Later && !result.second.isEmpty()) {
+               file_ = toqstr(FileName(fromqstr(result.second)).absFileName());
+               dispatchParams();
+               close();
+       }
+}
+
+
+void GuiLyXFiles::updateContents()
+{
+       QString type = fileTypeCO->itemData(fileTypeCO->currentIndex()).toString();
+       QMap<QString, QString> files;
+       getFiles(files, type);
+
+       filesLW->clear();
+       QFileIconProvider iconprovider;
+       QStringList cats;
+       QMap<QString, QString>::const_iterator it = files.constBegin();
+       QFont capfont;
+       capfont.setBold(true);
+       while (it != files.constEnd()) {
+               QFileInfo const info = QFileInfo(it.key());
+               QString cat = it.value();
+               QString subcat;
+               QString catsave;
+               if (cat.contains('/')) {
+                       catsave = cat;
+                       cat = catsave.left(catsave.indexOf('/'));
+                       subcat = toqstr(translateIfPossible(
+                                       qstring_to_ucs4(catsave.mid(
+                                               catsave.indexOf('/') + 1).replace('_', ' '))));
+               }
+               cat =  toqstr(translateIfPossible(qstring_to_ucs4(cat.replace('_', ' '))));
+               QTreeWidgetItem * catItem = new QTreeWidgetItem();
+               if (!cats.contains(cat)) {
+                       catItem->setText(0, cat);
+                       catItem->setFont(0, capfont);
+                       filesLW->insertTopLevelItem(0, catItem);
+                       catItem->setExpanded(true);
+                       cats << cat;
+               } else
+                       catItem = filesLW->findItems(cat, Qt::MatchExactly).first();
+               QTreeWidgetItem * item = new QTreeWidgetItem();
+               QString const filename = info.fileName();
+               QString const guiname =
+                               toqstr(translateIfPossible(
+                                              qstring_to_ucs4(filename.left(filename.lastIndexOf(".lyx")).replace('_', ' '))));
+               item->setIcon(0, iconprovider.icon(info));
+               item->setData(0, Qt::UserRole, info.filePath());
+               item->setData(0, Qt::DisplayRole, guiname);
+               item->setData(0, Qt::ToolTipRole, info.filePath());
+               if (subcat.isEmpty())
+                       catItem->addChild(item);
+               else {
+                       QTreeWidgetItem * subcatItem = new QTreeWidgetItem();
+                       if (cats.contains(catsave)) {
+                               QList<QTreeWidgetItem *> pcats = filesLW->findItems(cat, Qt::MatchExactly);
+                               for (int iit = 0; iit < pcats.size(); ++iit) {
+                                       for (int cit = 0; cit < pcats.at(iit)->childCount(); ++cit) {
+                                               if (pcats.at(iit)->child(cit)->text(0) == subcat) {
+                                                       subcatItem = pcats.at(iit)->child(cit);
+                                                       break;
+                                               }
+                                       }
+                               }
+                       } else {
+                               subcatItem->setText(0, subcat);
+                               cats << catsave;
+                       }
+                       subcatItem->addChild(item);
+                       catItem->addChild(subcatItem);
+               }
+               ++it;
+       }
+       filesLW->sortItems(0, Qt::AscendingOrder);
+       // redo filter
+       filterLabels();
+}
+
+
+void GuiLyXFiles::slotButtonBox(QAbstractButton * button)
+{
+       switch (buttonBox->standardButton(button)) {
+       case QDialogButtonBox::Open:
+               slotOK();
+               break;
+       case QDialogButtonBox::Cancel:
+               slotClose();
+               break;
+       default:
+               break;
+       }
+}
+
+
+void GuiLyXFiles::filterLabels()
+{
+       Qt::CaseSensitivity cs = csFindCB->isChecked() ?
+               Qt::CaseSensitive : Qt::CaseInsensitive;
+       QTreeWidgetItemIterator it(filesLW);
+       while (*it) {
+               (*it)->setHidden(
+                       (*it)->childCount() == 0
+                       && !(*it)->text(0).contains(filter_->text(), cs)
+               );
+               ++it;
+       }
+}
+
+
+void GuiLyXFiles::resetFilter()
+{
+       filter_->setText(QString());
+       filterLabels();
+}
+
+
+void GuiLyXFiles::applyView()
+{
+       file_ = filesLW->currentItem()->data(0, Qt::UserRole).toString();
+}
+
+
+bool GuiLyXFiles::isValid()
+{
+       return filesLW->currentItem() && filesLW->currentItem()->isSelected();
+}
+
+
+bool GuiLyXFiles::initialiseParams(string const & type)
+{
+       type_ = type.empty() ? toqstr("templates") : toqstr(type);
+       paramsToDialog(type_);
+       return true;
+}
+
+
+void GuiLyXFiles::paramsToDialog(QString const & command)
+{
+       if (!command.isEmpty()) {
+               int i = fileTypeCO->findData(command);
+               if (i != -1)
+                       fileTypeCO->setCurrentIndex(i);
+       }
+       if (command == "examples")
+               setTitle(qt_("Open Example File"));
+       else {
+               setTitle(qt_("New File From Template"));
+       }
+
+       bc().setValid(isValid());
+}
+
+
+void GuiLyXFiles::dispatchParams()
+{
+       if (file_.isEmpty())
+               return;
+
+       string arg;
+       if (type_ == "templates")
+               arg = "newfile ";
+       arg += fromqstr(file_);
+       FuncCode const lfun = (type_ == toqstr("examples")) ?
+               LFUN_FILE_OPEN : getLfun();
+
+       dispatch(FuncRequest(lfun, arg));
+}
+
+Dialog * createGuiLyXFiles(GuiView & lv) { return new GuiLyXFiles(lv); }
+
+
+} // namespace frontend
+} // namespace lyx
+
+#include "moc_GuiLyXFiles.cpp"
diff --git a/src/frontends/qt4/GuiLyXFiles.h b/src/frontends/qt4/GuiLyXFiles.h
new file mode 100644 (file)
index 0000000..05eff9f
--- /dev/null
@@ -0,0 +1,76 @@
+// -*- C++ -*-
+/**
+ * \file GuiLyXFiles.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Jürgen Spitzmüller
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#ifndef GUILYXFILES_H
+#define GUILYXFILES_H
+
+#include "GuiDialog.h"
+#include "FancyLineEdit.h"
+#include "ui_LyXFilesUi.h"
+
+class QListWidgetItem;
+
+namespace lyx {
+
+class Format;
+
+namespace frontend {
+
+class GuiLyXFiles : public GuiDialog, public Ui::LyXFilesUi
+{
+       Q_OBJECT
+
+public:
+       GuiLyXFiles(GuiView & lv);
+
+private Q_SLOTS:
+       void changed_adaptor();
+       void on_fileTypeCO_activated(int);
+       void on_filesLW_itemDoubleClicked(QTreeWidgetItem *, int);
+       void on_browsePB_pressed();
+       void slotButtonBox(QAbstractButton *);
+       void filterLabels();
+       void resetFilter();
+
+private:
+       ///
+       bool isValid();
+       /// Apply from dialog
+       void applyView();
+       /// Update the dialog
+       void updateContents();
+
+       ///
+       bool initialiseParams(std::string const & data);
+       ///
+       void paramsToDialog(QString const & command);
+       ///
+       void clearParams() {}
+       ///
+       void dispatchParams();
+       ///
+       bool isBufferDependent() const { return false; }
+       ///
+       FuncCode getLfun() const { return LFUN_BUFFER_NEW_TEMPLATE; }
+
+private:
+       /// contains the search box
+       FancyLineEdit * filter_;
+       ///
+       QString type_;
+       ///
+       QString file_;
+};
+
+} // namespace frontend
+} // namespace lyx
+
+#endif // GUILYXFILES_H
index dcfba88c534960078fbdc4637d1ca12755ce8cf2..6624d813625cf75fbf56080f922d30496a99ceab 100644 (file)
@@ -2098,6 +2098,7 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
                if (!doc_buffer)
                        enable = name == "aboutlyx"
                                || name == "file" //FIXME: should be removed.
+                               || name == "lyxfiles"
                                || name == "prefs"
                                || name == "texinfo"
                                || name == "progress"
@@ -2566,7 +2567,8 @@ void GuiView::importDocument(string const & argument)
 }
 
 
-void GuiView::newDocument(string const & filename, bool from_template)
+void GuiView::newDocument(string const & filename, string templatefile,
+                         bool from_template)
 {
        FileName initpath(lyxrc.document_path);
        if (documentBufferView()) {
@@ -2576,9 +2578,9 @@ void GuiView::newDocument(string const & filename, bool from_template)
                        initpath = trypath;
        }
 
-       string templatefile;
        if (from_template) {
-               templatefile = selectTemplateFile().absFileName();
+               if (templatefile.empty())
+                       templatefile =  selectTemplateFile().absFileName();
                if (templatefile.empty())
                        return;
        }
@@ -4545,7 +4547,7 @@ char const * const dialognames[] = {
 "citation", "compare", "comparehistory", "document", "errorlist", "ert",
 "external", "file", "findreplace", "findreplaceadv", "float", "graphics",
 "href", "include", "index", "index_print", "info", "listings", "label", "line",
-"log", "mathdelimiter", "mathmatrix", "mathspace", "nomenclature",
+"log", "lyxfiles", "mathdelimiter", "mathmatrix", "mathspace", "nomenclature",
 "nomencl_print", "note", "paragraph", "phantom", "prefs", "ref",
 "sendto", "space", "spellchecker", "symbols", "tabular", "tabularcreate",
 "thesaurus", "texinfo", "toc", "view-source", "vspace", "wrap", "progress"};
@@ -4741,6 +4743,7 @@ Dialog * createGuiInclude(GuiView & lv);
 Dialog * createGuiIndex(GuiView & lv);
 Dialog * createGuiListings(GuiView & lv);
 Dialog * createGuiLog(GuiView & lv);
+Dialog * createGuiLyXFiles(GuiView & lv);
 Dialog * createGuiMathMatrix(GuiView & lv);
 Dialog * createGuiNote(GuiView & lv);
 Dialog * createGuiParagraph(GuiView & lv);
@@ -4811,6 +4814,8 @@ Dialog * GuiView::build(string const & name)
                return createGuiListings(*this);
        if (name == "log")
                return createGuiLog(*this);
+       if (name == "lyxfiles")
+               return createGuiLyXFiles(*this);
        if (name == "mathdelimiter")
                return createGuiDelimiter(*this);
        if (name == "mathmatrix")
index 2d0ad0097aabf87f3a318821ba1fd7680d2fcebf..3c5041662fe52ca0fb915ec8aa2884ea649750f2 100644 (file)
@@ -105,7 +105,8 @@ public:
        BufferView const * documentBufferView() const;
 
        void newDocument(std::string const & filename,
-               bool fromTemplate);
+                        std::string templatefile = std::string(),
+                        bool fromTemplate = false);
 
        /// display a message in the view
        /// could be called from any thread
index 4ffb3516076e44f6e3c8b449e98b61abd579b0a1..e2e3e1ce5e7aab126dbcef3f3b1977c3fb732aa8 100644 (file)
@@ -109,6 +109,7 @@ SOURCEFILES = \
        GuiLine.cpp \
        GuiListings.cpp \
        GuiLog.cpp \
+       GuiLyXFiles.cpp \
        GuiMathMatrix.cpp \
        GuiNomenclature.cpp \
        GuiNote.cpp \
@@ -219,6 +220,7 @@ MOCHEADER = \
        GuiLine.h \
        GuiListings.h \
        GuiLog.h \
+       GuiLyXFiles.h \
        GuiMathMatrix.h \
        GuiNomenclature.h \
        GuiNote.h \
@@ -304,6 +306,7 @@ UIFILES = \
        ListingsSettingsUi.ui \
        LocalLayoutUi.ui \
        LogUi.ui \
+       LyXFilesUi.ui \
        MarginsUi.ui \
        MasterChildUi.ui \
        MathMatrixUi.ui \
diff --git a/src/frontends/qt4/ui/LyXFilesUi.ui b/src/frontends/qt4/ui/LyXFilesUi.ui
new file mode 100644 (file)
index 0000000..5cae863
--- /dev/null
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>LyXFilesUi</class>
+ <widget class="QDialog" name="LyXFilesUi">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>381</width>
+    <height>474</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string/>
+  </property>
+  <property name="sizeGripEnabled">
+   <bool>true</bool>
+  </property>
+  <layout class="QGridLayout" name="gridLayout_2">
+   <item row="0" column="0">
+    <layout class="QGridLayout" name="gridLayout">
+     <item row="0" column="0">
+      <widget class="QLabel" name="filesTypeLA">
+       <property name="text">
+        <string>&amp;Type:</string>
+       </property>
+       <property name="buddy">
+        <cstring>fileTypeCO</cstring>
+       </property>
+      </widget>
+     </item>
+     <item row="0" column="1" colspan="2">
+      <widget class="QComboBox" name="fileTypeCO">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="0" colspan="2">
+      <widget class="QLabel" name="findKeysLA">
+       <property name="text">
+        <string>&amp;Filter:</string>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="2">
+      <layout class="QVBoxLayout" name="verticalLayout_2">
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_3">
+         <item>
+          <layout class="QHBoxLayout" name="filterBarL"/>
+         </item>
+         <item>
+          <widget class="QCheckBox" name="csFindCB">
+           <property name="toolTip">
+            <string>Filter case-sensitively</string>
+           </property>
+           <property name="text">
+            <string>Case Sensiti&amp;ve</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+      </layout>
+     </item>
+    </layout>
+   </item>
+   <item row="1" column="0">
+    <widget class="QTreeWidget" name="filesLW">
+     <property name="rootIsDecorated">
+      <bool>true</bool>
+     </property>
+     <property name="itemsExpandable">
+      <bool>true</bool>
+     </property>
+     <attribute name="headerVisible">
+      <bool>false</bool>
+     </attribute>
+     <column>
+      <property name="text">
+       <string notr="true">1</string>
+      </property>
+     </column>
+    </widget>
+   </item>
+   <item row="2" column="0">
+    <layout class="QHBoxLayout" name="horizontalLayout_2">
+     <item>
+      <spacer name="horizontalSpacer">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QPushButton" name="browsePB">
+       <property name="text">
+        <string>&amp;Browse...</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="3" column="0">
+    <layout class="QHBoxLayout">
+     <property name="spacing">
+      <number>6</number>
+     </property>
+     <property name="leftMargin">
+      <number>0</number>
+     </property>
+     <property name="topMargin">
+      <number>0</number>
+     </property>
+     <property name="rightMargin">
+      <number>0</number>
+     </property>
+     <property name="bottomMargin">
+      <number>0</number>
+     </property>
+     <item>
+      <widget class="QDialogButtonBox" name="buttonBox">
+       <property name="standardButtons">
+        <set>QDialogButtonBox::Cancel|QDialogButtonBox::Open</set>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <includes>
+  <include location="local">qt_i18n.h</include>
+ </includes>
+ <resources/>
+ <connections/>
+</ui>