#include "lyxlex.h"
#include "support/FileInfo.h"
#include "support/filetools.h"
+#include "support/lstrings.h" // frontStrip, strip
#include "gettext.h"
+#include "support/LAssert.h"
+#include "lyxlength.h"
+#include "lyxgluelength.h"
using std::ofstream;
using std::pair;
using std::vector;
+// Extract shortcut from <ident>|<shortcut> string
+char const * flyx_shortcut_extract(char const * sc)
+{
+ // Find '|' in the sc and return the string after that.
+ register char const * sd = sc;
+ while (sd[0]!= 0 && sd[0] != '|') ++sd;
+
+ if (sd[0] == '|') {
+ ++sd;
+ //lyxerr << sd << endl;
+ return sd;
+ }
+ return "";
+}
+
+
+// Extract identifier from <ident>|<shortcut> string
+char const * flyx_ident_extract(char const * sc)
+{
+ register char const * se = sc;
+ while (se[0]!= 0 && se[0] != '|') ++se;
+
+ if (se[0] == 0) return sc;
+
+ char * sb = new char[se - sc + 1];
+ int index = 0;
+ register char const * sd = sc;
+ while (sd != se) {
+ sb[index] = sd[0];
+ ++index; ++sd;
+ }
+ sb[index] = 0;
+ return sb;
+}
+
+
// Set an FL_OBJECT to activated or deactivated
void setEnabled(FL_OBJECT * ob, bool enable)
{
}
+// Given an fl_choice, create a vector of its entries
+vector<string> const getVectorFromChoice(FL_OBJECT * ob)
+{
+ vector<string> vec;
+ if (!ob || ob->objclass != FL_CHOICE)
+ return vec;
+
+ for(int i = 0; i < fl_get_choice_maxitems(ob); ++i) {
+ string const text = fl_get_choice_item_text(ob, i+1);
+ vec.push_back(strip(frontStrip(text)));
+ }
+
+ return vec;
+}
+
+
+/// Given an fl_input, return its contents.
+string const getStringFromInput(FL_OBJECT * ob)
+{
+ if (!ob || ob->objclass != FL_INPUT)
+ return string();
+
+ char const * tmp = fl_get_input(ob);
+ return (tmp) ? tmp : string();
+}
+
+
+// Given an fl_browser, return the contents of line
+string const getStringFromBrowser(FL_OBJECT * ob, int line)
+{
+ if (!ob || ob->objclass != FL_BROWSER ||
+ line < 1 || line > fl_get_browser_maxline(ob))
+ return string();
+
+ char const * tmp = fl_get_browser_line(ob, line);
+ return (tmp) ? tmp : string();
+}
+
+// Given an fl_browser, return the contents of the currently
+// highlighted line.
+// If nothing is selected, return an empty string
+string const getSelectedStringFromBrowser(FL_OBJECT * ob)
+{
+ if (!ob || ob->objclass != FL_BROWSER)
+ return string();
+
+ int const line = fl_get_browser(ob);
+ if (line < 1 || line > fl_get_browser_maxline(ob))
+ return string();
+
+ if (!fl_isselected_browser_line(ob, line))
+ return string();
+
+ char const * tmp = fl_get_browser_line(ob, line);
+ return (tmp) ? tmp : string();
+}
+
+
+// Given an fl_browser, create a vector of its entries
+vector<string> const getVectorFromBrowser(FL_OBJECT * ob)
+{
+ vector<string> vec;
+ if (!ob || ob->objclass != FL_BROWSER)
+ return vec;
+
+ for(int i = 0; i < fl_get_browser_maxline(ob); ++i) {
+ string const text = fl_get_browser_line(ob, i+1);
+ vec.push_back(strip(frontStrip(text)));
+ }
+
+ return vec;
+}
+
+
+string getLengthFromWidgets(FL_OBJECT * input, FL_OBJECT * choice)
+{
+ // Paranoia check
+ lyx::Assert(input && input->objclass == FL_INPUT &&
+ choice && choice->objclass == FL_CHOICE);
+
+ string const length = strip(frontStrip(fl_get_input(input)));
+ if (length.empty())
+ return string();
+
+ //don't return unit-from-choice if the input(field) contains a unit
+ if (isValidGlueLength(length))
+ return length;
+
+ string unit = strip(frontStrip(fl_get_choice_text(choice)));
+ unit = subst(unit, "%%", "%");
+
+ return length + unit;
+}
+
+
+#if 1
+// this should definitely be the other way around!!!
+void updateWidgetsFromLength(FL_OBJECT * input, FL_OBJECT * choice,
+ LyXLength const & len,
+ string const & default_unit)
+{
+ if (len.zero())
+ updateWidgetsFromLengthString(input, choice,
+ string(), default_unit);
+ else
+ updateWidgetsFromLengthString(input, choice,
+ len.asString(), default_unit);
+
+}
+
+
+// Most of the code here is a poor duplication of the parser code
+// which is in LyXLength. Use that instead
+void updateWidgetsFromLengthString(FL_OBJECT * input, FL_OBJECT * choice,
+ string const & str,
+ string const & default_unit)
+{
+ // Paranoia check
+ lyx::Assert(input && input->objclass == FL_INPUT &&
+ choice && choice->objclass == FL_CHOICE);
+
+ if (str.empty()) {
+ fl_set_input(input, "");
+ int unitpos = 1; // xforms has Fortran-style indexing
+ for(int i = 0; i < fl_get_choice_maxitems(choice); ++i) {
+ string const text = fl_get_choice_item_text(choice,i+1);
+ if (default_unit ==
+ lowercase(strip(frontStrip(text)))) {
+ unitpos = i+1;
+ break;
+ }
+ }
+ fl_set_choice(choice, unitpos);
+ return;
+ }
+
+ // The unit is presumed to begin at the first char a-z
+ string const tmp = lowercase(strip(frontStrip(str)));
+
+ string::const_iterator p = tmp.begin();
+ for (; p != tmp.end(); ++p) {
+ if (*p >= 'a' && *p <= 'z')
+ break;
+ }
+
+ string len = "0";
+ int unitpos = 1; // xforms has Fortran-style indexing
+
+ if (p == tmp.end()) {
+ if (isStrDbl(tmp))
+ len = tmp;
+
+ } else {
+ string tmplen = string(tmp.begin(), p);
+ if (isStrDbl(tmplen))
+ len = tmplen;
+ string unit = string(p, tmp.end());
+ unit = subst(unit, "%", "%%");
+
+ for(int i = 0; i < fl_get_choice_maxitems(choice); ++i) {
+ string const text = fl_get_choice_item_text(choice,i+1);
+ if (unit == lowercase(strip(frontStrip(text)))) {
+ unitpos = i+1;
+ break;
+ }
+ }
+ }
+
+ fl_set_input(input, len.c_str());
+ fl_set_choice(choice, unitpos);
+}
+#else
+void updateWidgetsFromLengthString(FL_OBJECT * input, FL_OBJECT * choice,
+ string const & str,
+ string const & default_unit)
+{
+ updateWidgetsFromLength(input, choice,
+ LyXLength(str), default_unit);
+}
+
+
+void updateWidgetsFromLength(FL_OBJECT * input, FL_OBJECT * choice,
+ LyXLength const & len,
+ string const & default_unit)
+{
+ // Paranoia check
+ lyx::Assert(input && input->objclass == FL_INPUT &&
+ choice && choice->objclass == FL_CHOICE);
+
+ if (len.zero()) {
+ fl_set_input(input, "");
+ fl_set_choice_text(choice, default_unit.c_str());
+ } else {
+ ostringstream buffer;
+ buffer << len.value();
+ fl_set_input(input, buffer.str().c_str());
+ fl_set_choice_text(choice, stringFromUnit(len.unit()));
+ }
+}
+#endif
+
+
// Take a string and add breaks so that it fits into a desired label width, w
string formatted(string const & sin, int w, int size, int style)
{
-#ifdef WITH_WARNINGS
-#warning Why cant this be done by a one pass algo? (Lgb)
-#endif
+ // FIX: Q: Why cant this be done by a one pass algo? (Lgb)
+
string sout;
if (sin.empty()) return sout;
- // break sin up into a vector of individual words
+ // breaks in up into a vector of individual words
vector<string> sentence;
string word;
for (string::const_iterator sit = sin.begin();
sit != sin.end(); ++sit) {
if ((*sit) == ' ' || (*sit) == '\n') {
- sentence.push_back(word);
- word.erase();
+ if (!word.empty()) {
+ sentence.push_back(word);
+ word.erase();
+ }
if ((*sit) == '\n') word += '\n';
} else {
if (!lexrc.setFile(filename))
return false;
- while (lexrc.IsOK()) {
+ while (lexrc.isOK()) {
int const le = lexrc.lex();
switch (le) {
RGBColor col;
if (!lexrc.next()) break;
- col.r = lexrc.GetInteger();
+ col.r = lexrc.getInteger();
if (!lexrc.next()) break;
- col.g = lexrc.GetInteger();
+ col.g = lexrc.getInteger();
if (!lexrc.next()) break;
- col.b = lexrc.GetInteger();
+ col.b = lexrc.getInteger();
fl_mapcolor(le, col.r, col.g, col.b);
}
<< "### LyX, The Document Processor\n"
<< "###\n"
<< "### Copyright 1995 Matthias Ettrich\n"
- << "### Copyright 1995-2000 The LyX Team.\n"
+ << "### Copyright 1995-2001 The LyX Team.\n"
<< "###\n"
<< "### ========================================================\n"
<< "\n"
}
FileInfo const tp(name);
- if (!tp.isDir()) {
+ if (!tp.isOK() || !tp.isDir()) {
error_message = N_("Directory does not exist.");
return false;
}
}
FileInfo const tp(name);
- if (!tp.isDir()) {
+ if (!tp.isOK() || !tp.isDir()) {
error_message = N_("Directory does not exist.");
return false;
}
}
FileInfo d(name);
- if (!d.isDir()) {
+
+ if (!d.isOK() || !d.isDir()) {
d.newFile(dir);
}
- if (!d.isDir()) {
+ if (!d.isOK() || !d.isDir()) {
error_message = N_("Directory does not exist.");
return false;
}
}
FileInfo f(name);
- if (dir == name || f.isDir()) {
+ if (dir == name || (f.isOK() && f.isDir())) {
error_message = N_("A file is required, not a directory.");
return false;
}
- if (f.exist() && !f.writable()) {
+ if (f.isOK() && f.exist() && !f.writable()) {
error_message = N_("Cannot write to this file.");
return false;
}
}
FileInfo d(name);
- if (!d.isDir()) {
+
+ if (!d.isOK() && !d.isDir()) {
d.newFile(dir);
}
- if (!d.isDir()) {
+ if (!d.isOK() || !d.isDir()) {
error_message = N_("Directory does not exist.");
return false;
}
}
FileInfo f(name);
- if (dir == name || f.isDir()) {
+ if (dir == name || (f.isOK() && f.isDir())) {
error_message = N_("A file is required, not a directory.");
return false;
}