/**
* \file xforms_helpers.C
- * Copyright 2000-2002 The LyX Team.
- * See the file COPYING.
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
*
- * \author Angus Leeming, a.leeming@ic.ac.uk
+ * \author Angus Leeming
+ *
+ * Full author contact details are available in file CREDITS
*/
#include <config.h>
-#ifdef __GNUG__
-#pragma implementation
-#endif
#include "xforms_helpers.h"
#include "support/filetools.h"
#include "support/lstrings.h" // frontStrip, strip
-#include <algorithm>
#include <fstream>
-#include <vector>
+
#include FORMS_H_LOCATION
using std::ofstream;
using std::pair;
using std::vector;
+using std::make_pair;
+
+bool isActive(FL_OBJECT * ob)
+{
+ return ob && ob->active > 0;
+}
+
+std::pair<string, string> parse_shortcut(string const & str)
+{
+ string::size_type i = str.find_first_of("&");
+ if (i == string::npos || i == str.length() - 1)
+ return make_pair(str, string());
+
+ // FIXME: handle &&
+
+ string::value_type c = str[i + 1];
+ return make_pair(str.substr(0, i) + str.substr(i + 1),
+ string("#") + c);
+}
+
+
+// A wrapper for the xforms routine, but this one accepts uint args
+unsigned long fl_getmcolor(int i,
+ unsigned int * r, unsigned int * g, unsigned int * b)
+{
+ int r2, g2, b2;
+ unsigned long ret_val = ::fl_getmcolor(i, &r2, &g2, &b2);
+ *r = r2;
+ *g = g2;
+ *b = b2;
+ return ret_val;
+}
+
// Set an FL_OBJECT to activated or deactivated
void setEnabled(FL_OBJECT * ob, bool enable)
{
if (enable) {
fl_activate_object(ob);
- fl_set_object_lcol(ob, FL_BLACK);
+ fl_set_object_lcol(ob, FL_LCOL);
} else {
fl_deactivate_object(ob);
fl_set_object_lcol(ob, FL_INACTIVE);
}
-// Given an fl_choice, create a vector of its entries
-vector<string> const getVectorFromChoice(FL_OBJECT * ob)
+// Given an fl_choice or an fl_browser, create a vector of its entries
+vector<string> const getVector(FL_OBJECT * ob)
{
- vector<string> vec;
- if (!ob || ob->objclass != FL_CHOICE)
- return vec;
+ vector <string> 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)));
+ switch (ob->objclass) {
+ case FL_CHOICE:
+ 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(trim(text));
+ }
+ break;
+ case FL_BROWSER:
+ for(int i = 0; i < fl_get_browser_maxline(ob); ++i) {
+ string const text = fl_get_browser_line(ob, i+1);
+ vec.push_back(trim(text));
+ }
+ break;
+ default:
+ lyx::Assert(0);
}
return vec;
}
-/// Given an fl_input, return its contents.
-string const getStringFromInput(FL_OBJECT * ob)
+///
+string const getString(FL_OBJECT * ob, int line)
{
- if (!ob || ob->objclass != FL_INPUT)
- return string();
+ // Negative line value does not make sense.
+ lyx::Assert(line >= 0);
- char const * tmp = fl_get_input(ob);
- return (tmp) ? tmp : string();
-}
+ char const * tmp = 0;
+ switch (ob->objclass) {
+ case FL_INPUT:
+ tmp = fl_get_input(ob);
+ break;
+ case FL_BROWSER:
+ if (line == 0)
+ line = fl_get_browser(ob);
-// 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();
+ if (line >= 1 && line <= fl_get_browser_maxline(ob))
+ tmp = fl_get_browser_line(ob, line);
+ break;
- char const * tmp = fl_get_browser_line(ob, line);
- return (tmp) ? tmp : string();
-}
+ case FL_CHOICE:
+ if (line == 0)
+ line = fl_get_choice(ob);
-// 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 (line >= 1 && line <= fl_get_choice_maxitems(ob))
+ tmp = fl_get_choice_item_text(ob, line);
+ break;
- 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)));
+ default:
+ lyx::Assert(0);
}
- return vec;
+ return tmp ? trim(tmp) : string();
}
-
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)));
+ string const length = trim(fl_get_input(input));
if (length.empty())
return string();
- //don't return unit-from-choice if the input(field) contains a unit
+ // 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)));
+ string unit = trim(fl_get_choice_text(choice));
unit = subst(unit, "%%", "%");
return length + unit;
fl_set_input(input, str.c_str());
// we assume that "default_unit" is in the choice as "we"
// have control over that!
- // No need to check for it's precence in the choice, therefore.
+ // No need to check for its presence in the choice, therefore.
fl_set_choice_text(choice, default_unit.c_str());
} else {
updateWidgetsFromLength(input, choice,
lyx::Assert(input && input->objclass == FL_INPUT &&
choice && choice->objclass == FL_CHOICE);
- if (len.zero()) {
+ if (len.empty()) {
fl_set_input(input, "");
fl_set_choice_text(choice, default_unit.c_str());
} else {
// Else set the choice to the default unit.
string const unit = subst(stringFromUnit(len.unit()),"%","%%");
- vector<string> const vec = getVectorFromChoice(choice);
+ vector<string> const vec = getVector(choice);
vector<string>::const_iterator it =
std::find(vec.begin(), vec.end(), unit);
if (it != vec.end()) {
for(;;) {
string::size_type const nxtpos1 = sin.find(' ', curpos);
string::size_type const nxtpos2 = sin.find('\n', curpos);
- string::size_type const nxtpos = std::min(nxtpos1, nxtpos1);
+ string::size_type const nxtpos = std::min(nxtpos1, nxtpos2);
string const word = nxtpos == string::npos ?
sin.substr(curpos) : sin.substr(curpos, nxtpos-curpos);
if (!os)
return false;
- os << "### This file is part of\n"
- << "### ========================================================\n"
- << "### LyX, The Document Processor\n"
- << "###\n"
- << "### Copyright 1995 Matthias Ettrich\n"
- << "### Copyright 1995-2002 The LyX Team.\n"
- << "###\n"
- << "### ========================================================\n"
- << "\n"
- << "# This file is written by LyX, if you want to make your own\n"
- << "# modifications you should do them from inside LyX and save\n"
- << "\n";
+ os << "###"
+ << "### file " << filename << "\n\n"
+ << "### This file is written by LyX, if you want to make your own\n"
+ << "### modifications you should do them from inside LyX and save\n"
+ << '\n';
for (int i = 0; i < xformCount; ++i) {
string const tag = xformTags[i].tag;
fl_getmcolor(colorID, &color.r, &color.g, &color.b);
- os << tag << " "
- << color.r << " " << color.g << " " << color.b << "\n";
+ os << tag << ' '
+ << color.r << ' ' << color.g << ' ' << color.b << '\n';
}
return true;