From 387ad00b613a8966c6d79818cde7c96b2defd3dd Mon Sep 17 00:00:00 2001 From: Richard Heck Date: Wed, 1 Jun 2011 13:19:52 +0000 Subject: [PATCH] Fix bug #7540. Patch based upon one added to bug report by Max Funk. Basically, patch adds routine that calcuates relative paths to parent rather than child directories. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_2_0_X@38917 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/frontends/qt4/GuiBibtex.cpp | 4 ++-- src/frontends/qt4/GuiCompare.cpp | 4 ++-- src/frontends/qt4/GuiDocument.cpp | 4 ++-- src/frontends/qt4/GuiExternal.cpp | 2 +- src/frontends/qt4/GuiGraphics.cpp | 2 +- src/frontends/qt4/GuiInclude.cpp | 2 +- src/frontends/qt4/GuiPrefs.cpp | 32 ++++++++++++++++++++++---- src/frontends/qt4/GuiPrint.cpp | 2 +- src/frontends/qt4/qt_helpers.h | 38 +++++++++++++++++++++++++------ 9 files changed, 68 insertions(+), 22 deletions(-) diff --git a/src/frontends/qt4/GuiBibtex.cpp b/src/frontends/qt4/GuiBibtex.cpp index 29a86aefca..e6a30ae9a4 100644 --- a/src/frontends/qt4/GuiBibtex.cpp +++ b/src/frontends/qt4/GuiBibtex.cpp @@ -435,7 +435,7 @@ QString GuiBibtex::browseBib(QString const & in_name) const QString const label1 = qt_("Documents|#o#O"); QString const dir1 = toqstr(lyxrc.document_path); QStringList const filter(qt_("BibTeX Databases (*.bib)")); - return browseRelFile(in_name, bufferFilePath(), + return browseRelToParent(in_name, bufferFilePath(), qt_("Select a BibTeX database to add"), filter, false, label1, dir1); } @@ -445,7 +445,7 @@ QString GuiBibtex::browseBst(QString const & in_name) const QString const label1 = qt_("Documents|#o#O"); QString const dir1 = toqstr(lyxrc.document_path); QStringList const filter(qt_("BibTeX Styles (*.bst)")); - return browseRelFile(in_name, bufferFilePath(), + return browseRelToParent(in_name, bufferFilePath(), qt_("Select a BibTeX style"), filter, false, label1, dir1); } diff --git a/src/frontends/qt4/GuiCompare.cpp b/src/frontends/qt4/GuiCompare.cpp index 3b97aa1106..83ffd5ace4 100644 --- a/src/frontends/qt4/GuiCompare.cpp +++ b/src/frontends/qt4/GuiCompare.cpp @@ -158,11 +158,11 @@ QString GuiCompare::browse(QString const & in_name) const QString filename; if (lyxview().documentBufferView()) { QString path = bufferFilePath(); - filename = browseRelFile(in_name, path, title, filters, false, + filename = browseRelToParent(in_name, path, title, filters, false, qt_("Documents|#o#O"), toqstr(lyxrc.document_path)); } else { QString path = toqstr(lyxrc.document_path); - QString rel_filename = browseRelFile(in_name, path, title, filters, false, + QString rel_filename = browseRelToParent(in_name, path, title, filters, false, qt_("Documents|#o#O"), toqstr(lyxrc.document_path)); filename = makeAbsPath(rel_filename, path); } diff --git a/src/frontends/qt4/GuiDocument.cpp b/src/frontends/qt4/GuiDocument.cpp index 26961f26a2..a836d65a95 100644 --- a/src/frontends/qt4/GuiDocument.cpp +++ b/src/frontends/qt4/GuiDocument.cpp @@ -1781,7 +1781,7 @@ void GuiDocument::browseLayout() QString const label1 = qt_("Layouts|#o#O"); QString const dir1 = toqstr(lyxrc.document_path); QStringList const filter(qt_("LyX Layout (*.layout)")); - QString file = browseRelFile(QString(), bufferFilePath(), + QString file = browseRelToParent(QString(), bufferFilePath(), qt_("Local layout file"), filter, false, label1, dir1); @@ -1837,7 +1837,7 @@ void GuiDocument::browseMaster() QString const old = latexModule->childDocLE->text(); QString const docpath = toqstr(support::onlyPath(buffer().absFileName())); QStringList const filter(qt_("LyX Files (*.lyx)")); - QString file = browseRelFile(old, docpath, title, filter, false, + QString file = browseRelToSub(old, docpath, title, filter, false, qt_("Documents|#o#O"), toqstr(lyxrc.document_path)); if (!file.isEmpty()) diff --git a/src/frontends/qt4/GuiExternal.cpp b/src/frontends/qt4/GuiExternal.cpp index 5991654500..e71504d27b 100644 --- a/src/frontends/qt4/GuiExternal.cpp +++ b/src/frontends/qt4/GuiExternal.cpp @@ -639,7 +639,7 @@ QString GuiExternal::browse(QString const & input, QString const label1 = qt_("Documents|#o#O"); QString const dir1 = toqstr(lyxrc.document_path); - return browseRelFile(input, bufpath, title, filter, false, label1, dir1); + return browseRelToParent(input, bufpath, title, filter, false, label1, dir1); } diff --git a/src/frontends/qt4/GuiGraphics.cpp b/src/frontends/qt4/GuiGraphics.cpp index 054b9bb891..465ffcea34 100644 --- a/src/frontends/qt4/GuiGraphics.cpp +++ b/src/frontends/qt4/GuiGraphics.cpp @@ -793,7 +793,7 @@ QString GuiGraphics::browse(QString const & in_name) const if (!clip.isDirectory()) clipdir = addName(package().system_support().absFileName(), "clipart"); - return browseRelFile(in_name, bufferFilePath(), + return browseRelToParent(in_name, bufferFilePath(), title, fileFilters(QString()), false, qt_("Clipart|#C#c"), toqstr(clipdir), qt_("Documents|#o#O"), toqstr(lyxrc.document_path)); diff --git a/src/frontends/qt4/GuiInclude.cpp b/src/frontends/qt4/GuiInclude.cpp index 266fa25f91..7f5c96bd18 100644 --- a/src/frontends/qt4/GuiInclude.cpp +++ b/src/frontends/qt4/GuiInclude.cpp @@ -328,7 +328,7 @@ QString GuiInclude::browse(QString const & in_name, Type in_type) const QString const docpath = toqstr(support::onlyPath(buffer().absFileName())); - return browseRelFile(in_name, docpath, title, filters, false, + return browseRelToParent(in_name, docpath, title, filters, false, qt_("Documents|#o#O"), toqstr(lyxrc.document_path)); } diff --git a/src/frontends/qt4/GuiPrefs.cpp b/src/frontends/qt4/GuiPrefs.cpp index fbc128e471..d77893f67c 100644 --- a/src/frontends/qt4/GuiPrefs.cpp +++ b/src/frontends/qt4/GuiPrefs.cpp @@ -90,7 +90,7 @@ namespace frontend { /** Launch a file dialog and return the chosen file. filename: a suggested filename. title: the title of the dialog. - pattern: *.ps etc. + filters: *.ps etc. dir1 = (name, dir), dir2 = (name, dir): extra buttons on the dialog. */ QString browseFile(QString const & filename, @@ -194,19 +194,18 @@ QString browseDir(QString const & pathname, } // namespace frontend -QString browseRelFile(QString const & filename, QString const & refpath, +QString browseRelToParent(QString const & filename, QString const & relpath, QString const & title, QStringList const & filters, bool save, QString const & label1, QString const & dir1, QString const & label2, QString const & dir2) { - QString const fname = makeAbsPath(filename, refpath); - + QString const fname = makeAbsPath(filename, relpath); QString const outname = frontend::browseFile(fname, title, filters, save, label1, dir1, label2, dir2); QString const reloutname = - toqstr(makeRelPath(qstring_to_ucs4(outname), qstring_to_ucs4(refpath))); + toqstr(makeRelPath(qstring_to_ucs4(outname), qstring_to_ucs4(relpath))); if (reloutname.startsWith("../")) return outname; @@ -215,6 +214,29 @@ QString browseRelFile(QString const & filename, QString const & refpath, } +QString browseRelToSub(QString const & filename, QString const & relpath, + QString const & title, QStringList const & filters, bool save, + QString const & label1, QString const & dir1, + QString const & label2, QString const & dir2) +{ + QString const fname = makeAbsPath(filename, relpath); + + QString const outname = + frontend::browseFile(fname, title, filters, save, label1, dir1, label2, dir2); + + QString const reloutname = + toqstr(makeRelPath(qstring_to_ucs4(outname), qstring_to_ucs4(relpath))); + + QString testname = reloutname; + testname.remove(QRegExp("^(\\.\\./)+")); + + if (testname.contains("/")) + return outname; + else + return reloutname; +} + + ///////////////////////////////////////////////////////////////////// // diff --git a/src/frontends/qt4/GuiPrint.cpp b/src/frontends/qt4/GuiPrint.cpp index 120d1d2c98..b0fd8718aa 100644 --- a/src/frontends/qt4/GuiPrint.cpp +++ b/src/frontends/qt4/GuiPrint.cpp @@ -84,7 +84,7 @@ void GuiPrint::change_adaptor() void GuiPrint::browseClicked() { QString file = - browseRelFile(QString(), bufferFilePath(), qt_("Print to file"), + browseRelToParent(QString(), bufferFilePath(), qt_("Print to file"), QStringList(qt_("PostScript files (*.ps)")), true); if (!file.isEmpty()) { fileED->setText(file); diff --git a/src/frontends/qt4/qt_helpers.h b/src/frontends/qt4/qt_helpers.h index 5c410ea086..d7a471ca06 100644 --- a/src/frontends/qt4/qt_helpers.h +++ b/src/frontends/qt4/qt_helpers.h @@ -84,14 +84,29 @@ support::FileName libFileSearch(QString const & dir, QString const & name, support::FileName imageLibFileSearch(QString & dir, QString const & name, QString const & ext = QString()); -/** Wrapper around browseFile which tries to provide a filename - relative to relpath. If the relative path is of the form "foo.txt" - or "bar/foo.txt", then it is returned as relative. OTOH, if it is - of the form "../baz/foo.txt", an absolute path is returned. This is - intended to be useful for insets which encapsulate files/ +/** Wrappers around browseFile which try to provide a filename + relative to relpath. + +\param title: title for dialog + +\param filters: *.ps, etc + +\param save: whether to save dialog info (current path, etc) for next use. + +The \param labelN and \param dirN arguments provide for extra buttons +in the dialog (e.g., "Templates" and a path to that directory). + +The difference between the functions concerns when we think we have a +relative path. + +In \c browseRelToParent, we return a relative path only if it IS NOT of + the form "../../foo.txt". + +In \c browseRelToSub, we return a relative path only if it IS of the + form "../../foo.txt". */ -QString browseRelFile(QString const & filename, - QString const & refpath, +QString browseRelToParent(QString const & filename, + QString const & relpath, QString const & title, QStringList const & filters, bool save = false, @@ -100,6 +115,15 @@ QString browseRelFile(QString const & filename, QString const & label2 = QString(), QString const & dir2 = QString()); +QString browseRelToSub(QString const & filename, + QString const & relpath, + QString const & title, + QStringList const & filters, + bool save = false, + QString const & label1 = QString(), + QString const & dir1 = QString(), + QString const & label2 = QString(), + QString const & dir2 = QString()); /** Build filelists of all availabe bst/cls/sty-files. Done through * kpsewhich and an external script, saved in *Files.lst.