#include "debug.h"
#include "gettext.h"
+#include "Language.h"
#include "Length.h"
-#include "support/os.h"
+#include "frontends/FileDialog.h"
+#include "frontends/alert.h"
+
+#include "support/filetools.h"
#include "support/lstrings.h"
+#include "support/lyxalgo.h"
+#include "support/os.h"
+#include "support/Package.h"
+#include "support/Path.h"
+#include "support/Systemcall.h"
#include <QComboBox>
#include <QCheckBox>
#include <QPalette>
#include <QLineEdit>
+#include <boost/cregex.hpp>
+
#include <algorithm>
+#include <fstream>
+using std::string;
+using std::vector;
+using std::endl;
namespace lyx {
+using support::addName;
+using support::bformat;
+using support::FileFilterList;
+using support::FileName;
+using support::getExtension;
+using support::getVectorFromString;
+using support::libFileSearch;
+using support::makeAbsPath;
+using support::makeRelPath;
+using support::onlyFilename;
+using support::onlyPath;
+using support::package;
+using support::prefixIs;
+using support::quoteName;
+using support::removeExtension;
+using support::Systemcall;
+using support::token;
using support::isStrDbl;
-using std::vector;
-using std::string;
-
+namespace frontend {
string widgetsToLength(QLineEdit const * input, LengthCombo const * combo)
{
}
-//NOTE "CB" here because we probably will want one of these
-//for labeled sets, as well.
-void setAutoTextCB(QCheckBox * checkBox, QLineEdit * lineEdit,
- LengthCombo * lengthCombo)
-{
- if (!checkBox->isChecked())
- lengthToWidgets(lineEdit, lengthCombo,
- "auto", lengthCombo->currentLengthItem());
- else if (lineEdit->text() == "auto")
- lengthToWidgets(lineEdit, lengthCombo, string(),
- lengthCombo->currentLengthItem());
-}
-
-
void setValid(QWidget * widget, bool valid)
{
if (valid) {
}
}
+} // namespace frontend
QString const qt_(char const * str, const char *)
{
return toqstr(_(str));
}
+namespace {
+
+struct Sorter
+{
+ bool operator()(LanguagePair const & lhs, LanguagePair const & rhs) const {
+ return lhs.first < rhs.first;
+ }
+};
+
+
+} // namespace anon
+
+
+vector<LanguagePair> const getLanguageData(bool character_dlg)
+{
+ vector<LanguagePair>::size_type const size = character_dlg ?
+ languages.size() + 2 : languages.size();
+
+ vector<LanguagePair> langs(size);
+
+ if (character_dlg) {
+ langs[0].first = _("No change");
+ langs[0].second = "ignore";
+ langs[1].first = _("Reset");
+ langs[1].second = "reset";
+ }
+
+ vector<string>::size_type i = character_dlg ? 2 : 0;
+ for (Languages::const_iterator cit = languages.begin();
+ cit != languages.end(); ++cit) {
+ langs[i].first = _(cit->second.display());
+ langs[i].second = cit->second.lang();
+ ++i;
+ }
+
+ // Don't sort "ignore" and "reset"
+ vector<LanguagePair>::iterator begin = character_dlg ?
+ langs.begin() + 2 : langs.begin();
+
+ std::sort(begin, langs.end(), Sorter());
+
+ return langs;
+}
+
+
+docstring browseFile(docstring const & filename, docstring const & title,
+ FileFilterList const & filters, bool save,
+ docstring const & label1, docstring const & dir1,
+ docstring const & label2, docstring const & dir2)
+{
+ docstring lastPath = from_ascii(".");
+ if (!filename.empty())
+ lastPath = from_utf8(onlyPath(to_utf8(filename)));
+
+ FileDialog dlg(title, LFUN_SELECT_FILE_SYNC);
+ dlg.setButton1(label1, dir1);
+ dlg.setButton2(label2, dir2);
+
+ FileDialog::Result result;
+
+ if (save)
+ result = dlg.save(lastPath, filters,
+ from_utf8(onlyFilename(to_utf8(filename))));
+ else
+ result = dlg.open(lastPath, filters,
+ from_utf8(onlyFilename(to_utf8(filename))));
+
+ return result.second;
+}
+
+
+docstring browseRelFile(docstring const & filename, docstring const & refpath,
+ docstring const & title, FileFilterList const & filters, bool save,
+ docstring const & label1, docstring const & dir1,
+ docstring const & label2, docstring const & dir2)
+{
+ docstring const fname = from_utf8(makeAbsPath(
+ to_utf8(filename), to_utf8(refpath)).absFilename());
+
+ docstring const outname = browseFile(fname, title, filters, save,
+ label1, dir1, label2, dir2);
+ docstring const reloutname = makeRelPath(outname, refpath);
+ if (prefixIs(reloutname, from_ascii("../")))
+ return outname;
+ else
+ return reloutname;
+}
+
+
+docstring browseLibFile(docstring const & dir, docstring const & name,
+ docstring const & ext, docstring const & title,
+ FileFilterList const & filters)
+{
+ // FIXME UNICODE
+ docstring const label1 = _("System files|#S#s");
+ docstring const dir1 =
+ from_utf8(addName(package().system_support().absFilename(), to_utf8(dir)));
+
+ docstring const label2 = _("User files|#U#u");
+ docstring const dir2 =
+ from_utf8(addName(package().user_support().absFilename(), to_utf8(dir)));
+
+ docstring const result = browseFile(from_utf8(
+ libFileSearch(to_utf8(dir), to_utf8(name), to_utf8(ext)).absFilename()),
+ title, filters, false, dir1, dir2);
+
+ // remove the extension if it is the default one
+ docstring noextresult;
+ if (from_utf8(getExtension(to_utf8(result))) == ext)
+ noextresult = from_utf8(removeExtension(to_utf8(result)));
+ else
+ noextresult = result;
+
+ // remove the directory, if it is the default one
+ docstring const file = from_utf8(onlyFilename(to_utf8(noextresult)));
+ if (from_utf8(libFileSearch(to_utf8(dir), to_utf8(file), to_utf8(ext)).absFilename()) == result)
+ return file;
+ else
+ return noextresult;
+}
+
+
+docstring browseDir(docstring const & pathname, docstring const & title,
+ docstring const & label1, docstring const & dir1,
+ docstring const & label2, docstring const & dir2)
+{
+ docstring lastPath = from_ascii(".");
+ if (!pathname.empty())
+ lastPath = from_utf8(onlyPath(to_utf8(pathname)));
+
+ FileDialog dlg(title, LFUN_SELECT_FILE_SYNC);
+ dlg.setButton1(label1, dir1);
+ dlg.setButton2(label2, dir2);
+
+ FileDialog::Result const result =
+ dlg.opendir(lastPath, from_utf8(onlyFilename(to_utf8(pathname))));
+
+ return result.second;
+}
+
+
+void rescanTexStyles()
+{
+ // Run rescan in user lyx directory
+ support::Path p(package().user_support());
+ FileName const command = libFileSearch("scripts", "TeXFiles.py");
+ Systemcall one;
+ int const status = one.startscript(Systemcall::Wait,
+ lyx::support::os::python() + ' ' +
+ quoteName(command.toFilesystemEncoding()));
+ if (status == 0)
+ return;
+ // FIXME UNICODE
+ frontend::Alert::error(_("Could not update TeX information"),
+ bformat(_("The script `%s' failed."), from_utf8(command.absFilename())));
+}
+
+
+void getTexFileList(string const & filename, std::vector<string> & list)
+{
+ list.clear();
+ FileName const file = libFileSearch("", filename);
+ if (file.empty())
+ return;
+
+ list = getVectorFromString(file.fileContents(), "\n");
+
+ // Normalise paths like /foo//bar ==> /foo/bar
+ boost::RegEx regex("/{2,}");
+ std::vector<string>::iterator it = list.begin();
+ std::vector<string>::iterator end = list.end();
+ for (; it != end; ++it)
+ *it = regex.Merge((*it), "/");
+
+ // remove empty items and duplicates
+ list.erase(std::remove(list.begin(), list.end(), ""), list.end());
+ eliminate_duplicates(list);
+}
+
} // namespace lyx