#include <algorithm>
#include <iterator>
+using lyx::support::absolutePath;
using lyx::support::addName;
+using lyx::support::FileName;
using lyx::support::package;
namespace fs = boost::filesystem;
if (c == '[')
break;
getline(is, tmp);
- if (tmp == "" || tmp[0] == '#' || tmp[0] == ' ')
+ if (tmp == "" || tmp[0] == '#' || tmp[0] == ' ' || !absolutePath(tmp))
continue;
// read lastfiles
- if (fs::exists(tmp) && !fs::is_directory(tmp) && lastfiles.size() < num_lastfiles)
- lastfiles.push_back(tmp);
+ FileName const file(tmp);
+ if (fs::exists(file.toFilesystemEncoding()) &&
+ !fs::is_directory(file.toFilesystemEncoding()) &&
+ lastfiles.size() < num_lastfiles)
+ lastfiles.push_back(file);
else
- lyxerr[Debug::INIT] << "LyX: Warning: Ignore last file: " << tmp << endl;
+ LYXERR(Debug::INIT) << "LyX: Warning: Ignore last file: " << tmp << endl;
} while (is.good());
}
{
os << '\n' << sec_lastfiles << '\n';
copy(lastfiles.begin(), lastfiles.end(),
- ostream_iterator<string>(os, "\n"));
+ ostream_iterator<FileName>(os, "\n"));
}
-void LastFilesSection::add(string const & file)
+void LastFilesSection::add(FileName const & file)
{
// If file already exist, delete it and reinsert at front.
LastFiles::iterator it = find(lastfiles.begin(), lastfiles.end(), file);
if (0 < no && no <= absolute_max_last_files)
num_lastfiles = no;
else {
- lyxerr[Debug::INIT] << "LyX: session: too many last files\n"
+ LYXERR(Debug::INIT) << "LyX: session: too many last files\n"
<< "\tdefault (=" << default_num_last_files
<< ") used." << endl;
num_lastfiles = default_num_last_files;
if (c == '[')
break;
getline(is, tmp);
- if (tmp == "" || tmp[0] == '#' || tmp[0] == ' ')
+ if (tmp == "" || tmp[0] == '#' || tmp[0] == ' ' || !absolutePath(tmp))
continue;
- if (fs::exists(tmp) && !fs::is_directory(tmp))
- lastopened.push_back(tmp);
+ FileName const file(tmp);
+ if (fs::exists(file.toFilesystemEncoding()) &&
+ !fs::is_directory(file.toFilesystemEncoding()))
+ lastopened.push_back(file);
else
- lyxerr[Debug::INIT] << "LyX: Warning: Ignore last opened file: " << tmp << endl;
+ LYXERR(Debug::INIT) << "LyX: Warning: Ignore last opened file: " << tmp << endl;
} while (is.good());
}
{
os << '\n' << sec_lastopened << '\n';
copy(lastopened.begin(), lastopened.end(),
- ostream_iterator<string>(os, "\n"));
+ ostream_iterator<FileName>(os, "\n"));
}
-void LastOpenedSection::add(string const & file)
+void LastOpenedSection::add(FileName const & file)
{
lastopened.push_back(file);
}
itmp.ignore(2); // ignore ", "
itmp >> pos;
itmp.ignore(2); // ignore ", "
- itmp >> fname;
- if (fs::exists(fname) && !fs::is_directory(fname) && lastfilepos.size() < num_lastfilepos)
- lastfilepos[fname] = boost::tie(pit, pos);
+ getline(itmp, fname);
+ if (!absolutePath(fname))
+ continue;
+ FileName const file(fname);
+ if (fs::exists(file.toFilesystemEncoding()) &&
+ !fs::is_directory(file.toFilesystemEncoding()) &&
+ lastfilepos.size() < num_lastfilepos)
+ lastfilepos[file] = boost::tie(pit, pos);
else
- lyxerr[Debug::INIT] << "LyX: Warning: Ignore pos of last file: " << fname << endl;
+ LYXERR(Debug::INIT) << "LyX: Warning: Ignore pos of last file: " << fname << endl;
} catch (...) {
- lyxerr[Debug::INIT] << "LyX: Warning: unknown pos of last file: " << tmp << endl;
+ LYXERR(Debug::INIT) << "LyX: Warning: unknown pos of last file: " << tmp << endl;
}
} while (is.good());
}
}
-void LastFilePosSection::save(string const & fname, FilePos pos)
+void LastFilePosSection::save(FileName const & fname, FilePos pos)
{
lastfilepos[fname] = pos;
}
-LastFilePosSection::FilePos LastFilePosSection::load(string const & fname) const
+LastFilePosSection::FilePos LastFilePosSection::load(FileName const & fname) const
{
FilePosMap::const_iterator entry = lastfilepos.find(fname);
// Has position information, return it.
}
+void BookmarksSection::clear()
+{
+ // keep bookmark[0], the temporary one
+ bookmarks.resize(1);
+ bookmarks.resize(max_bookmarks + 1);
+}
+
+
void BookmarksSection::read(istream & is)
{
string tmp;
try {
// read bookmarks
- // id, pos, file\n
- unsigned int id;
+ // idx, pit, pos, file\n
+ unsigned int idx;
+ pit_type pit;
pos_type pos;
string fname;
istringstream itmp(tmp);
- itmp >> id;
+ itmp >> idx;
+ itmp.ignore(2); // ignore ", "
+ itmp >> pit;
itmp.ignore(2); // ignore ", "
itmp >> pos;
itmp.ignore(2); // ignore ", "
- itmp >> fname;
+ getline(itmp, fname);
+ if (!absolutePath(fname))
+ continue;
+ FileName const file(fname);
// only load valid bookmarks
- if (fs::exists(fname) && !fs::is_directory(fname) && bookmarks.size() < max_bookmarks)
- bookmarks.push_back(Bookmark(fname, id, pos));
- else
- lyxerr[Debug::INIT] << "LyX: Warning: Ignore bookmark of file: " << fname << endl;
+ if (fs::exists(file.toFilesystemEncoding()) &&
+ !fs::is_directory(file.toFilesystemEncoding()) &&
+ idx <= max_bookmarks)
+ bookmarks[idx] = Bookmark(file, pit, 0, pos);
+ else
+ LYXERR(Debug::INIT) << "LyX: Warning: Ignore bookmark of file: " << fname << endl;
} catch (...) {
- lyxerr[Debug::INIT] << "LyX: Warning: unknown Bookmark info: " << tmp << endl;
+ LYXERR(Debug::INIT) << "LyX: Warning: unknown Bookmark info: " << tmp << endl;
}
} while (is.good());
}
void BookmarksSection::write(ostream & os) const
{
os << '\n' << sec_bookmarks << '\n';
- for (size_t i = 0; i < bookmarks.size(); ++i) {
- os << bookmarks[i].par_id << ", "
- << bookmarks[i].par_pos << ", "
- << bookmarks[i].filename << '\n';
+ for (size_t i = 1; i <= max_bookmarks; ++i) {
+ if (isValid(i))
+ os << i << ", "
+ << bookmarks[i].par_pit << ", "
+ << bookmarks[i].par_pos << ", "
+ << bookmarks[i].filename << '\n';
}
}
-void BookmarksSection::save(std::string const & fname, int par_id, pos_type par_pos, bool persistent)
+void BookmarksSection::save(FileName const & fname, pit_type par_pit, int par_id, pos_type par_pos, unsigned int idx)
{
- if (persistent) {
- bookmarks.push_front(Bookmark(fname, par_id, par_pos));
- if (bookmarks.size() > max_bookmarks)
- bookmarks.pop_back();
- }
- else
- temp_bookmark = Bookmark(fname, par_id, par_pos);
+ // silently ignore bookmarks when idx is out of range
+ if (idx <= max_bookmarks)
+ bookmarks[idx] = Bookmark(fname, par_pit, par_id, par_pos);
}
bool BookmarksSection::isValid(unsigned int i) const
{
- // i == 0, or in the queue
- return i <= bookmarks.size();
+ return i <= max_bookmarks && !bookmarks[i].filename.empty();
}
BookmarksSection::Bookmark const & BookmarksSection::bookmark(unsigned int i) const
{
- if (i == 0)
- return temp_bookmark;
- else
- return bookmarks[i-1];
+ return bookmarks[i];
}
string key = tmp.substr(0, pos);
int state;
int location;
+ int posx;
+ int posy;
istringstream value(tmp.substr(pos + 3));
value >> state;
- value.ignore(1); // ignore " "
value >> location;
- toolbars[key] = ToolbarInfo(state, location);
+ value >> posx;
+ value >> posy;
+ toolbars.push_back(boost::make_tuple(key, ToolbarInfo(state, location, posx, posy)));
} else
- lyxerr[Debug::INIT] << "LyX: Warning: Ignore toolbar info: " << tmp << endl;
+ LYXERR(Debug::INIT) << "LyX: Warning: Ignore toolbar info: " << tmp << endl;
} catch (...) {
- lyxerr[Debug::INIT] << "LyX: Warning: unknown Toolbar info: " << tmp << endl;
+ LYXERR(Debug::INIT) << "LyX: Warning: unknown Toolbar info: " << tmp << endl;
}
} while (is.good());
+ // sort the toolbars by location, line and position
+ std::sort(toolbars.begin(), toolbars.end());
}
void ToolbarSection::write(ostream & os) const
{
os << '\n' << sec_toolbars << '\n';
- for (ToolbarMap::const_iterator tb = toolbars.begin();
+ for (ToolbarList::const_iterator tb = toolbars.begin();
tb != toolbars.end(); ++tb) {
- os << tb->first << " = "
- << static_cast<int>(tb->second.state) << " "
- << static_cast<int>(tb->second.location) << '\n';
+ os << tb->get<0>() << " = "
+ << static_cast<int>(tb->get<1>().state) << " "
+ << static_cast<int>(tb->get<1>().location) << " "
+ << tb->get<1>().posx << " "
+ << tb->get<1>().posy << '\n';
}
}
ToolbarSection::ToolbarInfo & ToolbarSection::load(string const & name)
{
- return toolbars[name];
+ for (ToolbarList::iterator tb = toolbars.begin();
+ tb != toolbars.end(); ++tb)
+ if (tb->get<0>() == name)
+ return tb->get<1>();
+ // add a new item
+ toolbars.push_back(boost::make_tuple(name, ToolbarSection::ToolbarInfo()));
+ return toolbars.back().get<1>();
+}
+
+
+bool operator<(ToolbarSection::ToolbarItem const & a, ToolbarSection::ToolbarItem const & b)
+{
+ ToolbarSection::ToolbarInfo lhs = a.get<1>();
+ ToolbarSection::ToolbarInfo rhs = b.get<1>();
+ // on if before off
+ if (lhs.state != rhs.state)
+ return static_cast<int>(lhs.state) < static_cast<int>(rhs.state);
+ // order of dock does not really matter
+ if (lhs.location != rhs.location)
+ return static_cast<int>(lhs.location) < static_cast<int>(rhs.location);
+ // if the same dock, the order depends on position
+ if (lhs.location == ToolbarSection::ToolbarInfo::TOP ||
+ lhs.location == ToolbarSection::ToolbarInfo::BOTTOM)
+ return lhs.posy < rhs.posy || (lhs.posy == rhs.posy && lhs.posx < rhs.posx);
+ else if (lhs.location == ToolbarSection::ToolbarInfo::LEFT ||
+ lhs.location == ToolbarSection::ToolbarInfo::RIGHT)
+ return lhs.posx < rhs.posx || (lhs.posx == rhs.posx && lhs.posy < rhs.posy);
+ else
+ return true;
}
string value = tmp.substr(pos + 3);
sessioninfo[key] = value;
} else
- lyxerr[Debug::INIT] << "LyX: Warning: Ignore session info: " << tmp << endl;
+ LYXERR(Debug::INIT) << "LyX: Warning: Ignore session info: " << tmp << endl;
} catch (...) {
- lyxerr[Debug::INIT] << "LyX: Warning: unknown Session info: " << tmp << endl;
+ LYXERR(Debug::INIT) << "LyX: Warning: unknown Session info: " << tmp << endl;
}
} while (is.good());
}
{
// locate the session file
// note that the session file name 'session' is hard-coded
- session_file = addName(package().user_support(), "session");
+ session_file = FileName(addName(package().user_support().absFilename(), "session"));
//
readFile();
}
{
// we will not complain if we can't find session_file nor will
// we issue a warning. (Lgb)
- ifstream is(session_file.c_str());
+ ifstream is(session_file.toFilesystemEncoding().c_str());
string tmp;
while (getline(is, tmp)) {
else if (tmp == sec_session)
sessionInfo().read(is);
else
- lyxerr[Debug::INIT] << "LyX: Warning: unknown Session section: " << tmp << endl;
+ LYXERR(Debug::INIT) << "LyX: Warning: unknown Session section: " << tmp << endl;
}
}
void Session::writeFile() const
{
- ofstream os(session_file.c_str());
+ ofstream os(session_file.toFilesystemEncoding().c_str());
if (os) {
os << "## Automatically generated lyx session file \n"
<< "## Editing this file manually may cause lyx to crash.\n";
toolbars().write(os);
sessionInfo().write(os);
} else
- lyxerr[Debug::INIT] << "LyX: Warning: unable to save Session: "
+ LYXERR(Debug::INIT) << "LyX: Warning: unable to save Session: "
<< session_file << endl;
}