]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/controllers/helper_funcs.C
port the graphics dialog to the new scheme and get rid of the ControlInset
[lyx.git] / src / frontends / controllers / helper_funcs.C
index 96b40435b6c62f7f1ffa0669806e9663276ae2b5..34ac0f1207a9a156061d489d7cd1f5c9a26cc61d 100644 (file)
-/* This file is part of
- * ====================================================== 
- *
- *           LyX, The Document Processor
- *
- *           Copyright 2001 The LyX Team.
+/**
+ * \file helper_funcs.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
  *
- * ======================================================
+ * \author Angus Leeming
  *
- * \file helper_funcs.C
- * \author Angus Leeming <a.leeming@ic.ac.uk>
+ * Full author contact details are available in file CREDITS
  */
 
 #include <vector>
 
-#ifdef __GNUG__
-#pragma implementation
-#endif
 
 #include <config.h>
 #include "LString.h"
 #include "helper_funcs.h"
 
+#include "frontends/FileDialog.h"
+#include "support/filetools.h" // OnlyPath, OnlyFilename
+#include "support/lstrings.h"
+#include "gettext.h" // _()
+#include "frontends/Alert.h"
+
+using std::pair;
 using std::vector;
+using std::make_pair;
+
 
-string const getStringFromVector(vector<string> const & vec,
-                                string const & delim)
+string const browseFile(string const & filename,
+                       string const & title,
+                       string const & pattern,
+                       bool save,
+                       pair<string,string> const & dir1,
+                       pair<string,string> const & dir2)
 {
-       string str;
-       for (vector<string>::size_type i=0; i<vec.size(); ++i) {
-               if (i > 0) str += delim;
-               str += vec[i];
+       string lastPath(".");
+       if (!filename.empty())
+               lastPath = OnlyPath(filename);
+
+       FileDialog fileDlg(title, LFUN_SELECT_FILE_SYNC, dir1, dir2);
+
+       FileDialog::Result result;
+
+       while (true) {
+               if (save)
+                       result = fileDlg.save(lastPath, pattern,
+                               OnlyFilename(filename));
+               else
+                       result = fileDlg.open(lastPath, pattern,
+                               OnlyFilename(filename));
+
+               if (result.second.empty())
+                       return result.second;
+
+               lastPath = OnlyPath(result.second);
+
+               if (result.second.find_first_of("#~$% ") == string::npos)
+                       break;
+
+               Alert::alert(_("Filename can't contain any "
+                       "of these characters:"),
+                       _("space, '#', '~', '$' or '%'."));
        }
-       return str;
+
+       return result.second;
+}
+
+
+string const browseRelFile(string const & filename,
+                       string const & refpath,
+                       string const & title,
+                       string const & pattern,
+                       bool save,
+                       pair<string,string> const & dir1,
+                       pair<string,string> const & dir2)
+{
+       string const fname = MakeAbsPath(filename, refpath);
+
+       string const outname = browseFile(fname, title, pattern, save,
+                                         dir1, dir2);
+       string const reloutname = MakeRelPath(outname, refpath);
+       if (prefixIs(reloutname, "../"))
+               return outname;
+       else
+               return reloutname;
 }
 
-vector<string> const getVectorFromString(string const & str,
-                                        string const & delim)
+
+string const browseDir(string const & pathname,
+                       string const & title,
+                       pair<string,string> const & dir1,
+                       pair<string,string> const & dir2)
 {
-       vector<string> vec;
-       string keys(str);
+       string lastPath(".");
+       if (!pathname.empty())
+               lastPath = OnlyPath(pathname);
+
+       FileDialog fileDlg(title, LFUN_SELECT_FILE_SYNC, dir1, dir2);
+
+       FileDialog::Result result;
+
+       while (true) {
+               result = fileDlg.opendir(lastPath,
+                               OnlyFilename(pathname));
 
-       for(;;) {
-               string::size_type const idx = keys.find(delim);
-               if (idx == string::npos) break;
-               
-               vec.push_back(keys.substr(0, idx));
+               if (result.second.empty())
+                       return result.second;
 
-               string::size_type const start = idx + delim.size();
-               keys = keys.substr(start);
+               lastPath = OnlyPath(result.second);
+
+               if (result.second.find_first_of("#~$% ") == string::npos)
+                       break;
+
+               Alert::alert(_("directory name can't contain any "
+                       "of these characters:"),
+                       _("space, '#', '~', '$' or '%'."));
        }
 
-       return vec;
+       return result.second;
 }
 
+
+// sorry this is just a temporary hack we should include vspace.h! (Jug)
+extern const char * stringFromUnit(int);
+
+vector<string> const getLatexUnits()
+{
+       vector<string> units;
+       char const * str;
+       for (int i = 0; (str = stringFromUnit(i)); ++i)
+           units.push_back(str);
+
+       return units;
+}