]> git.lyx.org Git - lyx.git/blobdiff - src/session.C
Fix loop when opening TOC widget in an empty document, basically by Richard Heck.
[lyx.git] / src / session.C
index 79a72e2320e561ab84cf339fbad7fdd293adbccb..d8ac631cd31f169701b9b5a6e01a5e2e9c992358 100644 (file)
@@ -83,7 +83,7 @@ void LastFilesSection::read(istream & is)
                    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());
 }
 
@@ -113,7 +113,7 @@ void LastFilesSection::setNumberOfLastFiles(unsigned int no)
        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;
@@ -137,7 +137,7 @@ void LastOpenedSection::read(istream & is)
                    !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());
 }
 
@@ -193,9 +193,9 @@ void LastFilePosSection::read(istream & is)
                            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());
 }
@@ -231,6 +231,14 @@ LastFilePosSection::FilePos LastFilePosSection::load(FileName const & fname) con
 }
 
 
+void BookmarksSection::clear()
+{
+       // keep bookmark[0], the temporary one
+       bookmarks.resize(1);
+       bookmarks.resize(max_bookmarks + 1);
+}
+
+
 void BookmarksSection::read(istream & is)
 {
        string tmp;
@@ -244,11 +252,14 @@ void BookmarksSection::read(istream & is)
 
                try {
                        // read bookmarks
-                       // pit, pos, file\n
+                       // idx, pit, pos, file\n
+                       unsigned int idx;
                        pit_type pit;
                        pos_type pos;
                        string fname;
                        istringstream itmp(tmp);
+                       itmp >> idx;
+                       itmp.ignore(2);  // ignore ", "
                        itmp >> pit;
                        itmp.ignore(2);  // ignore ", "
                        itmp >> pos;
@@ -260,12 +271,12 @@ void BookmarksSection::read(istream & is)
                        // only load valid bookmarks
                        if (fs::exists(file.toFilesystemEncoding()) &&
                            !fs::is_directory(file.toFilesystemEncoding()) &&
-                           bookmarks.size() < max_bookmarks)
-                               bookmarks.push_back(Bookmark(file, pit, 0, pos));
+                           idx <= max_bookmarks)
+                               bookmarks[idx] = Bookmark(file, pit, pos, 0, 0);
                        else
-                               lyxerr[Debug::INIT] << "LyX: Warning: Ignore bookmark of file: " << fname << endl;
+                               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());
 }
@@ -274,41 +285,34 @@ void BookmarksSection::read(istream & is)
 void BookmarksSection::write(ostream & os) const
 {
        os << '\n' << sec_bookmarks << '\n';
-       for (size_t i = 0; i < bookmarks.size(); ++i) {
-               os << bookmarks[i].par_pit << ", "
-                  << bookmarks[i].par_pos << ", "
-                  << bookmarks[i].filename << '\n';
+       for (size_t i = 1; i <= max_bookmarks; ++i) {
+               if (isValid(i))
+                       os << i << ", "
+                          << bookmarks[i].bottom_pit << ", "
+                          << bookmarks[i].bottom_pos << ", "
+                          << bookmarks[i].filename << '\n';
        }
 }
 
 
-void BookmarksSection::save(FileName const & fname, pit_type par_pit, int par_id, pos_type par_pos, bool persistent)
+void BookmarksSection::save(FileName const & fname, pit_type bottom_pit, pos_type bottom_pos,
+       int top_id, pos_type top_pos, unsigned int idx)
 {
-       if (persistent) {
-               bookmarks.push_back(Bookmark(fname, par_pit, par_id, par_pos));
-               if (bookmarks.size() > max_bookmarks)
-                       bookmarks.pop_back();
-               }
-       else
-               temp_bookmark = Bookmark(fname, par_pit, par_id, par_pos);
+       // silently ignore bookmarks when idx is out of range
+       if (idx <= max_bookmarks)
+               bookmarks[idx] = Bookmark(fname, bottom_pit, bottom_pos, top_id, top_pos);
 }
 
 
 bool BookmarksSection::isValid(unsigned int i) const
 {
-       if (i == 0)
-               return !temp_bookmark.filename.empty();
-       else
-               return i <= bookmarks.size() && !bookmarks[i-1].filename.empty();
+       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];
 }
 
 
@@ -339,33 +343,63 @@ void ToolbarSection::read(istream & is)
                                value >> location;
                                value >> posx;
                                value >> posy;
-                               toolbars[key] = ToolbarInfo(state, location, posx, 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) << " "
-                 << tb->second.posx << " "
-                 << tb->second.posy << '\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;
 }
 
 
@@ -390,9 +424,9 @@ void SessionInfoSection::read(istream & is)
                                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());
 }
@@ -431,7 +465,7 @@ Session::Session(unsigned int num) :
 {
        // locate the session file
        // note that the session file name 'session' is hard-coded
-       session_file = FileName(addName(package().user_support(), "session"));
+       session_file = FileName(addName(package().user_support().absFilename(), "session"));
        //
        readFile();
 }
@@ -463,7 +497,7 @@ void Session::readFile()
                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;
        }
 }
 
@@ -482,7 +516,7 @@ void Session::writeFile() const
                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;
 }