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/trunk@38915 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Richard Heck 2011-06-01 13:18:08 +00:00
parent 5c0697ea17
commit 82d6524298
9 changed files with 68 additions and 22 deletions

View File

@ -435,7 +435,7 @@ QString GuiBibtex::browseBib(QString const & in_name) const
QString const label1 = qt_("Documents|#o#O"); QString const label1 = qt_("Documents|#o#O");
QString const dir1 = toqstr(lyxrc.document_path); QString const dir1 = toqstr(lyxrc.document_path);
QStringList const filter(qt_("BibTeX Databases (*.bib)")); 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); 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 label1 = qt_("Documents|#o#O");
QString const dir1 = toqstr(lyxrc.document_path); QString const dir1 = toqstr(lyxrc.document_path);
QStringList const filter(qt_("BibTeX Styles (*.bst)")); 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); qt_("Select a BibTeX style"), filter, false, label1, dir1);
} }

View File

@ -158,11 +158,11 @@ QString GuiCompare::browse(QString const & in_name) const
QString filename; QString filename;
if (lyxview().documentBufferView()) { if (lyxview().documentBufferView()) {
QString path = bufferFilePath(); 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)); qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
} else { } else {
QString path = toqstr(lyxrc.document_path); 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)); qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
filename = makeAbsPath(rel_filename, path); filename = makeAbsPath(rel_filename, path);
} }

View File

@ -1817,7 +1817,7 @@ void GuiDocument::browseLayout()
QString const label1 = qt_("Layouts|#o#O"); QString const label1 = qt_("Layouts|#o#O");
QString const dir1 = toqstr(lyxrc.document_path); QString const dir1 = toqstr(lyxrc.document_path);
QStringList const filter(qt_("LyX Layout (*.layout)")); QStringList const filter(qt_("LyX Layout (*.layout)"));
QString file = browseRelFile(QString(), bufferFilePath(), QString file = browseRelToParent(QString(), bufferFilePath(),
qt_("Local layout file"), filter, false, qt_("Local layout file"), filter, false,
label1, dir1); label1, dir1);
@ -1873,7 +1873,7 @@ void GuiDocument::browseMaster()
QString const old = latexModule->childDocLE->text(); QString const old = latexModule->childDocLE->text();
QString const docpath = toqstr(support::onlyPath(buffer().absFileName())); QString const docpath = toqstr(support::onlyPath(buffer().absFileName()));
QStringList const filter(qt_("LyX Files (*.lyx)")); 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)); qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
if (!file.isEmpty()) if (!file.isEmpty())

View File

@ -639,7 +639,7 @@ QString GuiExternal::browse(QString const & input,
QString const label1 = qt_("Documents|#o#O"); QString const label1 = qt_("Documents|#o#O");
QString const dir1 = toqstr(lyxrc.document_path); 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);
} }

View File

@ -793,7 +793,7 @@ QString GuiGraphics::browse(QString const & in_name) const
if (!clip.isDirectory()) if (!clip.isDirectory())
clipdir = addName(package().system_support().absFileName(), "clipart"); clipdir = addName(package().system_support().absFileName(), "clipart");
return browseRelFile(in_name, bufferFilePath(), return browseRelToParent(in_name, bufferFilePath(),
title, fileFilters(QString()), false, title, fileFilters(QString()), false,
qt_("Clipart|#C#c"), toqstr(clipdir), qt_("Clipart|#C#c"), toqstr(clipdir),
qt_("Documents|#o#O"), toqstr(lyxrc.document_path)); qt_("Documents|#o#O"), toqstr(lyxrc.document_path));

View File

@ -328,7 +328,7 @@ QString GuiInclude::browse(QString const & in_name, Type in_type) const
QString const docpath = toqstr(support::onlyPath(buffer().absFileName())); 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)); qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
} }

View File

@ -90,7 +90,7 @@ namespace frontend {
/** Launch a file dialog and return the chosen file. /** Launch a file dialog and return the chosen file.
filename: a suggested filename. filename: a suggested filename.
title: the title of the dialog. title: the title of the dialog.
pattern: *.ps etc. filters: *.ps etc.
dir1 = (name, dir), dir2 = (name, dir): extra buttons on the dialog. dir1 = (name, dir), dir2 = (name, dir): extra buttons on the dialog.
*/ */
QString browseFile(QString const & filename, QString browseFile(QString const & filename,
@ -194,19 +194,18 @@ QString browseDir(QString const & pathname,
} // namespace frontend } // 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 & title, QStringList const & filters, bool save,
QString const & label1, QString const & dir1, QString const & label1, QString const & dir1,
QString const & label2, QString const & dir2) QString const & label2, QString const & dir2)
{ {
QString const fname = makeAbsPath(filename, refpath); QString const fname = makeAbsPath(filename, relpath);
QString const outname = QString const outname =
frontend::browseFile(fname, title, filters, save, label1, dir1, label2, dir2); frontend::browseFile(fname, title, filters, save, label1, dir1, label2, dir2);
QString const reloutname = 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("../")) if (reloutname.startsWith("../"))
return outname; 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;
}
///////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////
// //

View File

@ -84,7 +84,7 @@ void GuiPrint::change_adaptor()
void GuiPrint::browseClicked() void GuiPrint::browseClicked()
{ {
QString file = QString file =
browseRelFile(QString(), bufferFilePath(), qt_("Print to file"), browseRelToParent(QString(), bufferFilePath(), qt_("Print to file"),
QStringList(qt_("PostScript files (*.ps)")), true); QStringList(qt_("PostScript files (*.ps)")), true);
if (!file.isEmpty()) { if (!file.isEmpty()) {
fileED->setText(file); fileED->setText(file);

View File

@ -84,14 +84,29 @@ support::FileName libFileSearch(QString const & dir, QString const & name,
support::FileName imageLibFileSearch(QString & dir, QString const & name, support::FileName imageLibFileSearch(QString & dir, QString const & name,
QString const & ext = QString()); QString const & ext = QString());
/** Wrapper around browseFile which tries to provide a filename /** Wrappers around browseFile which try to provide a filename
relative to relpath. If the relative path is of the form "foo.txt" relative to relpath.
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 \param title: title for dialog
intended to be useful for insets which encapsulate files/
\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 browseRelToParent(QString const & filename,
QString const & refpath, QString const & relpath,
QString const & title, QString const & title,
QStringList const & filters, QStringList const & filters,
bool save = false, bool save = false,
@ -100,6 +115,15 @@ QString browseRelFile(QString const & filename,
QString const & label2 = QString(), QString const & label2 = QString(),
QString const & dir2 = 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 /** Build filelists of all availabe bst/cls/sty-files. Done through
* kpsewhich and an external script, saved in *Files.lst. * kpsewhich and an external script, saved in *Files.lst.