]> git.lyx.org Git - features.git/commitdiff
Alfredo's patch
authorAndré Pönitz <poenitz@gmx.net>
Fri, 28 Feb 2003 09:49:49 +0000 (09:49 +0000)
committerAndré Pönitz <poenitz@gmx.net>
Fri, 28 Feb 2003 09:49:49 +0000 (09:49 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@6305 a592a061-630c-0410-9148-cb99ea01b6c8

34 files changed:
src/ChangeLog
src/Makefile.am
src/MenuBackend.C
src/buffer.C
src/converter.C
src/converter.h
src/exporter.C
src/format.C [new file with mode: 0644]
src/format.h [new file with mode: 0644]
src/frontends/controllers/ChangeLog
src/frontends/controllers/ControlGraphics.C
src/frontends/controllers/ControlPrefs.C
src/frontends/controllers/ControlSendto.C
src/frontends/qt2/ChangeLog
src/frontends/qt2/QLImage.C
src/frontends/qt2/QPrefs.h
src/frontends/qt2/QSendto.C
src/frontends/qt2/QSendtoDialog.C
src/frontends/qt2/lyx_gui.C
src/frontends/xforms/ChangeLog
src/frontends/xforms/FormPreferences.C
src/frontends/xforms/FormSendto.C
src/frontends/xforms/xformsImage.C
src/graph.C [new file with mode: 0644]
src/graph.h [new file with mode: 0644]
src/graphics/ChangeLog
src/graphics/GraphicsConverter.C
src/graphics/PreviewLoader.C
src/importer.C
src/insets/ChangeLog
src/insets/insetgraphics.C
src/lyx_main.C
src/lyxfunc.C
src/lyxrc.C

index 348358d1d59e680e130c582b47e5e6a0fd35d0d9..6d6d75814a680812407c49c8a1c10789cb6b1d16 100644 (file)
@@ -1,12 +1,26 @@
+2003-02-28  Alfredo Braunstein <abraunst@libero.it>
+
+       * converter.[Ch]: split into itself +
+       * graph.[Ch]
+       * format.[Ch]
+       * Makefile.am: += graph.[Ch] + format.[Ch]
+       * MenuBackend.C
+       * buffer.C
+       * exporter.C
+       * importer.C
+       * lyx_main.C
+       * lyxfunc.C
+       * lyxrc.C: added #include "format.h"
+
 2003-02-27  Angus Leeming  <leeming@lyx.org>
 
        * BufferView_pimpl.C (dispatch): call a real, LyX dialog to insert
-       a label.
+         a label.
 
        * factory.C (createInset): add "label" to the factory.
 
        * lyx_cb.[Ch] (getPossibleLabel): rewrite MenuInsertLabel to return the
-       string and do no more.
+         string and do no more.
 
 2003-02-27  Angus Leeming  <leeming@lyx.org>
 
@@ -14,7 +28,7 @@
        * LyXAction.C (init):
        * factory.C (createInset):
        * BufferView_pimpl.C (dispatch):
-       collapse LFUN_XYZ_APPLY to LFUN_INSET_APPLY.
+         collapse LFUN_XYZ_APPLY to LFUN_INSET_APPLY.
 
        * lyxfunc.C (getStatus): remove LFUN_BIBTEX_APPLY, LFUN_CITATION_APPLY.
 
 2003-02-26  Angus Leeming  <leeming@lyx.org>
 
        * BufferView_pimpl.C (dispatch): collapse the various LFUN_XYZ_APPLY
-       blocks together.
-       Rearrange the ~includes. Strip out the unnecessary ones.
+         blocks together.
+         Rearrange the ~includes. Strip out the unnecessary ones.
 
        * factory.C (createInset): reformat.
-       create new insets for the various LFUN_XYZ_APPLY lfuns.
+         create new insets for the various LFUN_XYZ_APPLY lfuns.
 
 2003-02-26  John Levon  <levon@movementarian.org>
 
        * text3.C:
        * text2.C:
        * text.C: use lyxrow helpers above.
-       Move draw and paint routines to RowPainter.
-       Make several methods use refs not pointers.
-       Make backgroundColor() const.
-       Add markChangeInDraw(), isInInset().
-       Merge changeRegionCase into changeCase.
-       Make workWidth() shouldn't-happen code into an Assert.
+         Move draw and paint routines to RowPainter.
+         Make several methods use refs not pointers.
+         Make backgroundColor() const.
+         Add markChangeInDraw(), isInInset().
+         Merge changeRegionCase into changeCase.
+         Make workWidth() shouldn't-happen code into an Assert.
 
        * rowpainter.h:
        * rowpainter.C: new class for painting a row.
 2003-02-21  Angus Leeming  <leeming@lyx.org>
 
        * commandtags.h: Retire LFUN_CITATION_INSERT, LFUN_CITATION_CREATE,
-       LFUN_INSERT_BIBTEX, LFUN_BIBTEX_STYLE, LFUN_BIBDB_ADD, LFUN_BIBDB_DEL.
-       Bring to life LFUN_DIALOG_SHOW_NEW_INSET, LFUN_DIALOG_SHOW_NEXT_INSET,
-       LFUN_DIALOG_UPDATE, LFUN_DIALOG_HIDE, LFUN_DIALOG_DISCONNECT_INSET,
-       LFUN_BIBITEM_APPLY, LFUN_BIBTEX_APPLY, LFUN_CITATION_APPLY,
-       LFUN_INDEX_APPLY, LFUN_REF_APPLY, LFUN_TOC_APPLY, LFUN_URL_APPLY,
+         LFUN_INSERT_BIBTEX, LFUN_BIBTEX_STYLE, LFUN_BIBDB_ADD, LFUN_BIBDB_DEL.
+         Bring to life LFUN_DIALOG_SHOW_NEW_INSET, LFUN_DIALOG_SHOW_NEXT_INSET,
+         LFUN_DIALOG_UPDATE, LFUN_DIALOG_HIDE, LFUN_DIALOG_DISCONNECT_INSET,
+         LFUN_BIBITEM_APPLY, LFUN_BIBTEX_APPLY, LFUN_CITATION_APPLY,
+         LFUN_INDEX_APPLY, LFUN_REF_APPLY, LFUN_TOC_APPLY, LFUN_URL_APPLY,
 
        * BufferView_pimpl.C (dispatch):
        * LyXAction.C (init):
        * BufferView_pimpl.C (MenuInsertLyXFile):
        * lyx_cb.C (WriteAs, getContentsOfAsciiFile):
        * lyxfunc.C (menuNew, open, doImport):
-       no longer pass a LyXView & to fileDlg.
+         no longer pass a LyXView & to fileDlg.
 
 2003-02-21  Angus Leeming  <leeming@lyx.org>
 
 2003-02-15  Jean-Marc Lasgouttes  <lasgouttes@freesurf.fr>
 
        * buffer.C (makeLaTeXFile): move the code that generates the
-       preamble... 
+         preamble... 
 
        * bufferparams.C (writeLaTeX): ... in this new method
 
        * LaTeXFeatures.C (getEncodingSet): make const
-       (getLanguages): make const
+         (getLanguages): make const
 
        * MenuBackend.C (binding): returns the binding associated to this
-       action 
-       (add): sets the status of each item by calling getStatus. Adds
-       some intelligence.
-       (read): add support for OptSubMenu
-       (expand): remove extra separator at the end of expanded menu
+         action 
+         (add): sets the status of each item by calling getStatus. Adds
+         some intelligence.
+         (read): add support for OptSubMenu
+         (expand): remove extra separator at the end of expanded menu
 
 2003-02-15  John Levon  <levon@movementarian.org>
 
        * BufferView_pimpl.C:
        * bufferlist.h:
        * bufferlist.C: remove pointless BufferStorage bloat. Remove
-       inset code that had no actual effect. Remove unneeded status
-       code.
+         inset code that had no actual effect. Remove unneeded status
+         code.
 
 2003-02-14  Jean-Marc Lasgouttes  <lasgouttes@freesurf.fr>
 
        * buffer.C (makeLaTeXFile): fix counting of number of line feeds
-       in preamble
+         in preamble
 
 2003-02-14  Michael Schmitt <michael.schmitt@teststep.org>
 
        * text.C (drawLengthMarker): also draw an arrow marker for
-       symbolic lengths (medskip...)
+         symbolic lengths (medskip...)
 
 2003-02-14  John Levon  <levon@movementarian.org>
 
 2003-02-14  Jean-Marc Lasgouttes  <Jean-Marc.Lasgouttes@inria.fr>
 
        * text2.C (LyXText): change order of initilizers to shut off
-       warnings 
+         warnings 
 
 2003-02-14  John Levon  <levon@movementarian.org>
 
        * paragraph.C (asString): remove two unused variables
 
        * lyxtextclass.C (readTitleType): 
-       (Read): 
-       (LyXTextClass): handle new members titletype_ and titlename_
+         (Read): 
+         (LyXTextClass): handle new members titletype_ and titlename_
 
        * buffer.C (latexParagraphs): honor LyXTextClass::titletype
 
index b6ae4bbe25acb2a77892a4ce3de1c5136cecc69e..fe8665c74ee4455b7735709e11924b3cd2360cdf 100644 (file)
@@ -223,7 +223,11 @@ lyx_SOURCES = \
        version.C \
        version.h \
        vspace.C \
-       vspace.h
+       vspace.h \
+       graph.C \
+       graph.h \
+       format.C \
+       format.h
 
 lyx_main.o: lyx_main.C lyx_main.h config.h version.h \
        lyxrc.h support/path.h support/filetools.h \
index c0903bfda7e342cc9da5c9bbf986b4ae44427000..6fdec55cb2451ae0c3408ee957cd259c38a8c59b 100644 (file)
@@ -23,7 +23,7 @@
 #include "lyx_main.h" // for lastfiles
 #include "bufferlist.h"
 #include "buffer.h"
-#include "converter.h"
+#include "format.h"
 #include "exporter.h"
 #include "importer.h"
 #include "FloatList.h"
index 24f0dbaa4468e8cf56394cf27036c497931f9f3f..546f986c704f392198213ba488df867ca5e13fb6 100644 (file)
@@ -33,7 +33,7 @@
 #include "language.h"
 #include "exporter.h"
 #include "Lsstream.h"
-#include "converter.h"
+#include "format.h"
 #include "BufferView.h"
 #include "ParagraphParameters.h"
 #include "iterators.h"
index e1a96bc14471834f9a80038b6bbe012986bdbd29..07938d9d9d65cac927323f852a1b886275550114 100644 (file)
@@ -1,16 +1,18 @@
-/* This file is part of
- * ======================================================
+/**
+ * \file converter.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
  *
- *           LyX, The Document Processor
+ * \author Dekel Tsur
  *
- *           Copyright 1995 Matthias Ettrich
- *           Copyright 1995-2001 The LyX Team.
- *
- * ====================================================== */
+ * Full author contact details are available in file CREDITS
+ */
 
 #include <config.h>
 
 #include "converter.h"
+#include "graph.h"
+#include "format.h"
 #include "lyxrc.h"
 #include "buffer.h"
 #include "bufferview_funcs.h"
@@ -37,12 +39,8 @@ using std::isdigit;
 #endif
 
 using std::vector;
-using std::queue;
 using std::endl;
-using std::fill;
 using std::find_if;
-using std::reverse;
-using std::sort;
 
 namespace {
 
@@ -51,9 +49,8 @@ string const token_base("$$b");
 string const token_to("$$o");
 string const token_path("$$p");
 
-//////////////////////////////////////////////////////////////////////////////
 
-inline
+
 string const add_options(string const & command, string const & options)
 {
        string head;
@@ -63,188 +60,12 @@ string const add_options(string const & command, string const & options)
 
 } // namespace anon
 
-//////////////////////////////////////////////////////////////////////////////
-
-bool Format::dummy() const
-{
-       return extension().empty();
-}
-
-
-bool Format::isChildFormat() const
-{
-       if (name_.empty())
-               return false;
-       return isdigit(name_[name_.length() - 1]);
-}
-
-
-string const Format::parentFormat() const
-{
-       return name_.substr(0, name_.length() - 1);
-}
-
-//////////////////////////////////////////////////////////////////////////////
-
-// This method should return a reference, and throw an exception
-// if the format named name cannot be found (Lgb)
-Format const * Formats::getFormat(string const & name) const
-{
-       FormatList::const_iterator cit =
-               find_if(formatlist.begin(), formatlist.end(),
-                       lyx::compare_memfun(&Format::name, name));
-       if (cit != formatlist.end())
-               return &(*cit);
-       else
-               return 0;
-}
-
-
-int Formats::getNumber(string const & name) const
-{
-       FormatList::const_iterator cit =
-               find_if(formatlist.begin(), formatlist.end(),
-                       lyx::compare_memfun(&Format::name, name));
-       if (cit != formatlist.end())
-               return cit - formatlist.begin();
-       else
-               return -1;
-}
-
-
-void Formats::add(string const & name)
-{
-       if (!getFormat(name))
-               add(name, name, name, string());
-}
-
-
-// FIXME: horrednously mis-named, especially given the other ::add
-// function
-void Formats::add(string const & name, string const & extension,
-                 string const & prettyname, string const & shortcut)
-{
-       FormatList::iterator it =
-               find_if(formatlist.begin(), formatlist.end(),
-                       lyx::compare_memfun(&Format::name, name));
-       if (it == formatlist.end())
-               formatlist.push_back(Format(name, extension, prettyname,
-                                           shortcut, ""));
-       else {
-               string viewer = it->viewer();
-               *it = Format(name, extension, prettyname, shortcut, viewer);
-       }
-}
-
-
-void Formats::erase(string const & name)
-{
-       FormatList::iterator it =
-               find_if(formatlist.begin(), formatlist.end(),
-                       lyx::compare_memfun(&Format::name, name));
-       if (it != formatlist.end())
-               formatlist.erase(it);
-}
-
-
-void Formats::sort()
-{
-       std::sort(formatlist.begin(), formatlist.end());
-}
-
-
-void Formats::setViewer(string const & name, string const & command)
-{
-       add(name);
-       FormatList::iterator it =
-               find_if(formatlist.begin(), formatlist.end(),
-                       lyx::compare_memfun(&Format::name, name));
-       if (it != formatlist.end())
-               it->setViewer(command);
-}
-
-
-bool Formats::view(Buffer const * buffer, string const & filename,
-                  string const & format_name) const
-{
-       if (filename.empty())
-               return false;
-
-       Format const * format = getFormat(format_name);
-       if (format && format->viewer().empty() &&
-           format->isChildFormat())
-               format = getFormat(format->parentFormat());
-       if (!format || format->viewer().empty()) {
-#if USE_BOOST_FORMAT
-               Alert::alert(_("Cannot view file"),
-                            boost::io::str(boost::format(_("No information for viewing %1$s"))
-                          % prettyName(format_name)));
-#else
-               Alert::alert(_("Cannot view file"),
-                            _("No information for viewing ")
-                            + prettyName(format_name));
-#endif
-                          return false;
-       }
-
-       string command = format->viewer();
-
-       if (format_name == "dvi" &&
-           !lyxrc.view_dvi_paper_option.empty()) {
-               command += ' ' + lyxrc.view_dvi_paper_option;
-               string paper_size = converters.papersize(buffer);
-               if (paper_size == "letter")
-                       paper_size = "us";
-               command += ' ' + paper_size;
-               if (buffer->params.orientation
-                   == BufferParams::ORIENTATION_LANDSCAPE)
-                       command += 'r';
-       }
-
-       if (!contains(command, token_from))
-               command += ' ' + token_from;
-
-       command = subst(command, token_from,
-                       QuoteName(OnlyFilename(filename)));
-       command = subst(command, token_path, QuoteName(OnlyPath(filename)));
-
-       lyxerr[Debug::FILES] << "Executing command: " << command << endl;
-       ShowMessage(buffer, _("Executing command:"), command);
-
-       Path p(OnlyPath(filename));
-       Systemcall one;
-       int const res = one.startscript(Systemcall::DontWait, command);
-
-       if (res) {
-               Alert::alert(_("Cannot view file"),
-                          _("Error while executing"),
-                          command.substr(0, 50));
-               return false;
-       }
-       return true;
-}
 
-
-string const Formats::prettyName(string const & name) const
-{
-       Format const * format = getFormat(name);
-       if (format)
-               return format->prettyname();
-       else
-               return name;
-}
-
-
-string const Formats::extension(string const & name) const
-{
-       Format const * format = getFormat(name);
-       if (format)
-               return format->extension();
-       else
-               return name;
-}
-
-//////////////////////////////////////////////////////////////////////////////
+Converter::Converter(string const & f, string const & t, string const & c,
+         string const & l): from(f), to(t), command(c), flags(l), 
+                            From(0), To(0), latex(false), 
+                            original_dir(false), need_aux(false) 
+{}
 
 void Converter::readFlags()
 {
@@ -288,7 +109,7 @@ bool operator<(Converter const & a, Converter const & b)
                return i < 0;
 }
 
-//////////////////////////////////////////////////////////////////////////////
+
 
 class compare_Converter {
 public:
@@ -303,6 +124,7 @@ private:
 };
 
 
+
 Converter const * Converters::getConverter(string const & from,
                                            string const & to)
 {
@@ -407,172 +229,9 @@ void Converters::sort()
 }
 
 
-int Converters::bfs_init(string const & start, bool clear_visited)
-{
-       int const s = formats.getNumber(start);
-       if (s < 0)
-               return s;
-
-       Q_ = queue<int>();
-       if (clear_visited)
-               fill(visited_.begin(), visited_.end(), false);
-       if (visited_[s] == false) {
-               Q_.push(s);
-               visited_[s] = true;
-       }
-       return s;
-}
-
-
-vector<Format const *> const
-Converters::getReachableTo(string const & target, bool clear_visited)
-{
-       vector<Format const *> result;
-       int const s = bfs_init(target, clear_visited);
-       if (s < 0)
-               return result;
-
-       while (!Q_.empty()) {
-               int const i = Q_.front();
-               Q_.pop();
-               if (i != s || target != "lyx") {
-                       result.push_back(&formats.get(i));
-               }
-
-               vector<int>::iterator it = vertices_[i].in_vertices.begin();
-               vector<int>::iterator end = vertices_[i].in_vertices.end();
-               for (; it != end; ++it) {
-                       if (!visited_[*it]) {
-                               visited_[*it] = true;
-                               Q_.push(*it);
-                       }
-               }
-       }
-
-       return result;
-}
-
-
-vector<Format const *> const
-Converters::getReachable(string const & from, bool only_viewable,
-                        bool clear_visited)
-{
-       vector<Format const *> result;
-
-       if (bfs_init(from, clear_visited) < 0)
-               return result;
-
-       while (!Q_.empty()) {
-               int const i = Q_.front();
-               Q_.pop();
-               Format const & format = formats.get(i);
-               if (format.name() == "lyx")
-                       continue;
-               if (!only_viewable || !format.viewer().empty() ||
-                   format.isChildFormat())
-                       result.push_back(&format);
-
-               vector<int>::const_iterator cit =
-                       vertices_[i].out_vertices.begin();
-               vector<int>::const_iterator end =
-                       vertices_[i].out_vertices.end();
-               for (; cit != end; ++cit)
-                       if (!visited_[*cit]) {
-                               visited_[*cit] = true;
-                               Q_.push(*cit);
-                       }
-       }
-
-       return result;
-}
-
-
-bool Converters::isReachable(string const & from, string const & to)
-{
-       if (from == to)
-               return true;
-
-       int const s = bfs_init(from);
-       int const t = formats.getNumber(to);
-       if (s < 0 || t < 0)
-               return false;
-
-       while (!Q_.empty()) {
-               int const i = Q_.front();
-               Q_.pop();
-               if (i == t)
-                       return true;
-
-               vector<int>::const_iterator cit =
-                       vertices_[i].out_vertices.begin();
-               vector<int>::const_iterator end =
-                       vertices_[i].out_vertices.end();
-               for (; cit != end; ++cit) {
-                       if (!visited_[*cit]) {
-                               visited_[*cit] = true;
-                               Q_.push(*cit);
-                       }
-               }
-       }
-
-       return false;
-}
-
-
-Converters::EdgePath const
-Converters::getPath(string const & from, string const & to)
-{
-       EdgePath path;
-       if (from == to)
-               return path;
-
-       int const s = bfs_init(from);
-       int t = formats.getNumber(to);
-       if (s < 0 || t < 0)
-               return path;
-
-       vector<int> prev_edge(formats.size());
-       vector<int> prev_vertex(formats.size());
-
-       bool found = false;
-       while (!Q_.empty()) {
-               int const i = Q_.front();
-               Q_.pop();
-               if (i == t) {
-                       found = true;
-                       break;
-               }
-
-               vector<int>::const_iterator beg =
-                       vertices_[i].out_vertices.begin();
-               vector<int>::const_iterator cit = beg;
-               vector<int>::const_iterator end =
-                       vertices_[i].out_vertices.end();
-               for (; cit != end; ++cit)
-                       if (!visited_[*cit]) {
-                               int const j = *cit;
-                               visited_[j] = true;
-                               Q_.push(j);
-                               int const k = cit - beg;
-                               prev_edge[j] = vertices_[i].out_edges[k];
-                               prev_vertex[j] = i;
-                       }
-       }
-       if (!found)
-               return path;
-
-       while (t != s) {
-               path.push_back(prev_edge[t]);
-               t = prev_vertex[t];
-       }
-       reverse(path.begin(), path.end());
-       return path;
-}
-
-
-bool Converters::usePdflatex(EdgePath const & path)
+bool Converters::usePdflatex(Graph::EdgePath const & path)
 {
-       for (EdgePath::const_iterator cit = path.begin();
+       for (Graph::EdgePath::const_iterator cit = path.begin();
             cit != path.end(); ++cit) {
                Converter const & conv = converterlist_[*cit];
                if (conv.latex)
@@ -593,7 +252,7 @@ bool Converters::convert(Buffer const * buffer,
        if (from_format == to_format)
                return move(from_file, to_file, false);
 
-       EdgePath edgepath = getPath(from_format, to_format);
+       Graph::EdgePath edgepath = getPath(from_format, to_format);
        if (edgepath.empty()) {
                return false;
        }
@@ -606,7 +265,7 @@ bool Converters::convert(Buffer const * buffer,
        string to_base = ChangeExtension(to_file, "");
        string infile;
        string outfile = from_file;
-       for (EdgePath::const_iterator cit = edgepath.begin();
+       for (Graph::EdgePath::const_iterator cit = edgepath.begin();
             cit != edgepath.end(); ++cit) {
                Converter const & conv = converterlist_[*cit];
                bool dummy = conv.To->dummy() && conv.to != "program";
@@ -794,22 +453,6 @@ bool Converters::convert(Buffer const * buffer,
 }
 
 
-void Converters::buildGraph()
-{
-       vertices_ = vector<Vertex>(formats.size());
-       visited_.resize(formats.size());
-
-       for (ConverterList::iterator it = converterlist_.begin();
-            it != converterlist_.end(); ++it) {
-               int const s = formats.getNumber(it->from);
-               int const t = formats.getNumber(it->to);
-               vertices_[t].in_vertices.push_back(s);
-               vertices_[s].out_vertices.push_back(t);
-               vertices_[s].out_edges.push_back(it - converterlist_.begin());
-       }
-}
-
-
 bool Converters::formatIsUsed(string const & format)
 {
        ConverterList::const_iterator cit = converterlist_.begin();
@@ -947,32 +590,6 @@ bool Converters::runLaTeX(Buffer const * buffer, string const & command)
 }
 
 
-string const Converters::papersize(Buffer const * buffer)
-{
-       char real_papersize = buffer->params.papersize;
-       if (real_papersize == BufferParams::PAPER_DEFAULT)
-               real_papersize = lyxrc.default_papersize;
-
-       switch (real_papersize) {
-       case BufferParams::PAPER_A3PAPER:
-               return "a3";
-       case BufferParams::PAPER_A4PAPER:
-               return "a4";
-       case BufferParams::PAPER_A5PAPER:
-               return "a5";
-       case BufferParams::PAPER_B5PAPER:
-               return "b5";
-       case BufferParams::PAPER_EXECUTIVEPAPER:
-               return "foolscap";
-       case BufferParams::PAPER_LEGALPAPER:
-               return "legal";
-       case BufferParams::PAPER_USLETTER:
-       default:
-               return "letter";
-       }
-}
-
-
 string const Converters::dvips_options(Buffer const * buffer)
 {
        string result;
@@ -1023,14 +640,68 @@ string const Converters::dvipdfm_options(Buffer const * buffer)
        return result;
 }
 
+void Converters::buildGraph()
+{
+       G_.init(formats.size());
+       ConverterList::iterator beg = converterlist_.begin();
+       ConverterList::iterator end = converterlist_.end();
+       for (ConverterList::iterator it = beg; it != end ; ++it) {
+               int const s = formats.getNumber(it->from);
+               int const t = formats.getNumber(it->to);
+               G_.addEdge(s,t);
+       }
+}
 
-vector<Converters::Vertex> Converters::vertices_;
+vector<Format const *> const
+Converters::intToFormat(std::vector<int> const & input)
+{
+       vector<Format const *> result(input.size());
 
+       vector<int>::const_iterator it = input.begin();
+       vector<int>::const_iterator end = input.end();
+       vector<Format const *>::iterator rit = result.begin();
+       for ( ; it != end; ++it, ++rit) {
+               *rit = &formats.get(*it);
+       }
+       return result;
+}
+
+vector<Format const *> const
+Converters::getReachableTo(string const & target, bool clear_visited)
+{
+       vector<int> const & reachablesto = 
+               G_.getReachableTo(formats.getNumber(target), clear_visited);
+
+       return intToFormat(reachablesto);
+}
+
+vector<Format const *> const
+Converters::getReachable(string const & from, bool only_viewable,
+            bool clear_visited)
+{
+       vector<int> const & reachables = 
+               G_.getReachable(formats.getNumber(from), 
+                               only_viewable, 
+                               clear_visited);
+
+       return intToFormat(reachables);
+}
+
+bool Converters::isReachable(string const & from, string const & to)
+{
+       return G_.isReachable(formats.getNumber(from),
+                             formats.getNumber(to));
+}
+
+Graph::EdgePath const 
+Converters::getPath(string const & from, string const & to)
+{
+       return G_.getPath(formats.getNumber(from),
+                         formats.getNumber(to));
+}
 
 /// The global instance
-Formats formats;
 Converters converters;
 
 // The global copy after reading lyxrc.defaults
-Formats system_formats;
 Converters system_converters;
index b4f7b286250ff7930ce6df4e0f7facfada8c675d..4720d4f05ba71fc4cfbf1f7fc9c1df8ad36f4734 100644 (file)
 // -*- C++ -*-
-/* This file is part of
- * ======================================================
- *
- *           LyX, The Document Processor
- *
- *           Copyright 1995 Matthias Ettrich
- *           Copyright 1995-2001 The LyX Team.
- *
- * ====================================================== */
 
 #ifndef CONVERTER_H
 #define CONVERTER_H
 
-#include <vector>
-#include <queue>
-#include "LString.h"
-#include "support/lstrings.h"
-
-class Buffer;
-
-///
-class Format {
-public:
-       ///
-       Format(string const & n, string const & e, string const & p,
-              string const & s, string const & v) :
-               name_(n), extension_(e), prettyname_(p), shortcut_(s),
-               viewer_(v) {};
-       ///
-       bool dummy() const;
-       ///
-       bool isChildFormat() const;
-       ///
-       string const parentFormat() const;
-       ///
-       string const & name() const {
-               return name_;
-       }
-       ///
-       string const & extension() const {
-               return extension_;
-       }
-       ///
-       string const & prettyname() const {
-               return prettyname_;
-       }
-       ///
-       string const & shortcut() const {
-               return shortcut_;
-       }
-       ///
-       string const & viewer() const {
-               return viewer_;
-       }
-       ///
-       void setViewer(string const & v) {
-               viewer_ = v;
-       }
-private:
-       string name_;
-       ///
-       string extension_;
-       ///
-       string prettyname_;
-       ///
-       string shortcut_;
-       ///
-       string viewer_;
-};
-
+/**
+ * \file converter.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Dekel Tsur
+ *
+ * Full author contact details are available in file CREDITS
+ */
 
-inline
-bool operator<(Format const & a, Format const & b)
-{
-       // use the compare_ascii_no_case instead of compare_no_case,
-       // because in turkish, 'i' is not the lowercase version of 'I',
-       // and thus turkish locale breaks parsing of tags.
+#include "graph.h"
 
-       return compare_ascii_no_case(a.prettyname(), b.prettyname()) < 0;
-}
+#include <vector>
 
+class Format;
+class Formats;
 
-///
-class Formats {
-public:
-       ///
-       typedef std::vector<Format> FormatList;
-       ///
-       typedef FormatList::const_iterator const_iterator;
-       ///
-       Format const & get(FormatList::size_type i) const {
-               return formatlist[i];
-       }
-       ///
-       Format const * getFormat(string const & name) const;
-       ///
-       int getNumber(string const & name) const;
-       ///
-       void add(string const & name);
-       ///
-       void add(string const & name, string const & extension,
-                string const & prettyname, string const & shortcut);
-       ///
-       void erase(string const & name);
-       ///
-       void sort();
-       ///
-       void setViewer(string const & name, string const & command);
-       ///
-       bool view(Buffer const * buffer, string const & filename,
-                 string const & format_name) const;
-       ///
-       string const prettyName(string const & name) const;
-       ///
-       string const extension(string const & name) const;
-       ///
-       const_iterator begin() const {
-               return formatlist.begin();
-       }
-       ///
-       const_iterator end() const {
-               return formatlist.end();
-       }
-       ///
-       FormatList::size_type size() const {
-               return formatlist.size();
-       }
-private:
-       ///
-       FormatList formatlist;
-};
-
-///////////////////////////////////////////////////////////////////////
+class Buffer;
 
 ///
 class Converter {
 public:
        ///
        Converter(string const & f, string const & t, string const & c,
-                 string const & l)
-               : from(f), to(t), command(c), flags(l), From(0), To(0),
-                 latex(false), original_dir(false), need_aux(false) {}
+                 string const & l);
        ///
        void readFlags();
        ///
@@ -176,12 +63,13 @@ public:
 ///
 class Converters {
 public:
+       ///
+       typedef std::vector<int> EdgePath; // to be removed SOON
+       ///
        typedef std::vector<Converter> ConverterList;
        ///
        typedef ConverterList::const_iterator const_iterator;
        ///
-       typedef std::vector<int> EdgePath;
-       ///
        Converter const & get(int i) const {
                return converterlist_[i];
        }
@@ -206,9 +94,9 @@ public:
        ///
        bool isReachable(string const & from, string const & to);
        ///
-       EdgePath const getPath(string const & from, string const & to);
+       Graph::EdgePath const getPath(string const & from, string const & to);
        ///
-       bool usePdflatex(EdgePath const & path);
+       bool usePdflatex(Graph::EdgePath const & path);
        ///
        bool convert(Buffer const * buffer,
                     string const & from_file, string const & to_file_base,
@@ -219,8 +107,6 @@ public:
                     string const & from_file, string const & to_file_base,
                     string const & from_format, string const & to_format);
        ///
-       string const papersize(Buffer const * buffer);
-       ///
        string const dvips_options(Buffer const * buffer);
        ///
        string const dvipdfm_options(Buffer const * buffer);
@@ -229,8 +115,6 @@ public:
        ///
        void updateLast(Formats const & formats);
        ///
-       void buildGraph();
-       ///
        bool formatIsUsed(string const & format);
        ///
        const_iterator begin() const {
@@ -239,7 +123,12 @@ public:
        const_iterator end() const {
                return converterlist_.end();
        }
+       ///
+       void buildGraph();
 private:
+       ///
+       std::vector<Format const *> const
+       Converters::intToFormat(std::vector<int> const & input);
        ///
        bool scanLog(Buffer const * buffer, string const & command,
                     string const & filename);
@@ -250,28 +139,13 @@ private:
        ///
        string latex_command_;
        ///
-       struct Vertex {
-               std::vector<int> in_vertices;
-               std::vector<int> out_vertices;
-               std::vector<int> out_edges;
-       };
-       ///
-       static
-       std::vector<Vertex> vertices_;
-       ///
-       std::vector<bool> visited_;
-       ///
-       std::queue<int> Q_;
-       ///
-       int bfs_init(string const & start, bool clear_visited = true);
-       ///
        bool move(string const & from, string const & to, bool copy);
+       ///
+       Graph G_;
 };
 
-extern Formats formats;
 extern Converters converters;
 
-extern Formats system_formats;
 extern Converters system_converters;
 
-#endif
+#endif //CONVERTER_H
index 098f24979709833f0b653843ff515ba0e9450ec2..8ebafda41ec79cd2c7b58e56f8c273679c8bcde4 100644 (file)
@@ -18,6 +18,7 @@
 #include "support/filetools.h"
 #include "lyxrc.h"
 #include "converter.h"
+#include "format.h"
 #include "frontends/Alert.h"
 #include "gettext.h"
 #include "BufferView.h"
@@ -46,7 +47,7 @@ bool Exporter::Export(Buffer * buffer, string const & format,
        if (find(backends.begin(), backends.end(), format) == backends.end()) {
                for (vector<string>::const_iterator it = backends.begin();
                     it != backends.end(); ++it) {
-                       Converters::EdgePath p =
+                       Graph::EdgePath p =
                                converters.getPath(*it, format);
                        if (!p.empty()) {
                                lyxrc.pdf_mode = converters.usePdflatex(p);
diff --git a/src/format.C b/src/format.C
new file mode 100644 (file)
index 0000000..0cb8072
--- /dev/null
@@ -0,0 +1,258 @@
+/**
+ * \file format.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Dekel Tsur
+ *
+ * Full author contact details are available in file CREDITS
+ */
+
+#include "format.h"
+#include "lyxrc.h"
+#include "debug.h"
+#include "lyx_cb.h" // for ShowMessage() ... to be removed?
+#include "gettext.h"
+#include "LString.h"
+
+#include "frontends/Alert.h" //to be removed?
+
+#include "support/filetools.h"
+#include "support/path.h"
+#include "support/systemcall.h"
+#include "support/lyxfunctional.h"
+
+
+namespace {
+
+string const token_from("$$i");
+string const token_path("$$p");
+
+} //namespace anon
+
+bool operator<(Format const & a, Format const & b)
+{
+       // use the compare_ascii_no_case instead of compare_no_case,
+       // because in turkish, 'i' is not the lowercase version of 'I',
+       // and thus turkish locale breaks parsing of tags.
+
+       return compare_ascii_no_case(a.prettyname(), b.prettyname()) < 0;
+}
+
+Format::Format(string const & n, string const & e, string const & p,
+       string const & s, string const & v): name_(n), 
+                                           extension_(e), 
+                                           prettyname_(p), 
+                                           shortcut_(s),
+                                           viewer_(v) 
+{}
+
+
+bool Format::dummy() const
+{
+       return extension().empty();
+}
+
+
+bool Format::isChildFormat() const
+{
+       if (name_.empty())
+               return false;
+       return isdigit(name_[name_.length() - 1]);
+}
+
+
+string const Format::parentFormat() const
+{
+       return name_.substr(0, name_.length() - 1);
+}
+
+
+// This method should return a reference, and throw an exception
+// if the format named name cannot be found (Lgb)
+Format const * Formats::getFormat(string const & name) const
+{
+       FormatList::const_iterator cit =
+               find_if(formatlist.begin(), formatlist.end(),
+                       lyx::compare_memfun(&Format::name, name));
+       if (cit != formatlist.end())
+               return &(*cit);
+       else
+               return 0;
+}
+
+
+int Formats::getNumber(string const & name) const
+{
+       FormatList::const_iterator cit =
+               find_if(formatlist.begin(), formatlist.end(),
+                       lyx::compare_memfun(&Format::name, name));
+       if (cit != formatlist.end())
+               return cit - formatlist.begin();
+       else
+               return -1;
+}
+
+
+void Formats::add(string const & name)
+{
+       if (!getFormat(name))
+               add(name, name, name, string());
+}
+
+
+void Formats::add(string const & name, string const & extension,
+                 string const & prettyname, string const & shortcut)
+{
+       FormatList::iterator it =
+               find_if(formatlist.begin(), formatlist.end(),
+                       lyx::compare_memfun(&Format::name, name));
+       if (it == formatlist.end())
+               formatlist.push_back(Format(name, extension, prettyname,
+                                           shortcut, ""));
+       else {
+               string viewer = it->viewer();
+               *it = Format(name, extension, prettyname, shortcut, viewer);
+       }
+}
+
+
+void Formats::erase(string const & name)
+{
+       FormatList::iterator it =
+               find_if(formatlist.begin(), formatlist.end(),
+                       lyx::compare_memfun(&Format::name, name));
+       if (it != formatlist.end())
+               formatlist.erase(it);
+}
+
+
+void Formats::sort()
+{
+       cout << "here" << endl;
+       std::sort(formatlist.begin(), formatlist.end());
+       cout << "and here " << formatlist.size() << endl;
+}
+
+
+void Formats::setViewer(string const & name, string const & command)
+{
+       add(name);
+       FormatList::iterator it =
+               find_if(formatlist.begin(), formatlist.end(),
+                       lyx::compare_memfun(&Format::name, name));
+       if (it != formatlist.end())
+               it->setViewer(command);
+}
+
+
+bool Formats::view(Buffer const * buffer, string const & filename,
+                  string const & format_name) const
+{
+       if (filename.empty())
+               return false;
+
+       Format const * format = getFormat(format_name);
+       if (format && format->viewer().empty() &&
+           format->isChildFormat())
+               format = getFormat(format->parentFormat());
+       if (!format || format->viewer().empty()) {
+#if USE_BOOST_FORMAT
+               Alert::alert(_("Cannot view file"),
+                            boost::io::str(boost::format(_("No information for viewing %1$s"))
+                          % prettyName(format_name)));
+#else
+               Alert::alert(_("Cannot view file"),
+                            _("No information for viewing ")
+                            + prettyName(format_name));
+#endif
+                          return false;
+       }
+
+       string command = format->viewer();
+
+       if (format_name == "dvi" &&
+           !lyxrc.view_dvi_paper_option.empty()) {
+               command += ' ' + lyxrc.view_dvi_paper_option;
+               string paper_size = papersize(buffer);
+               if (paper_size == "letter")
+                       paper_size = "us";
+               command += ' ' + paper_size;
+               if (buffer->params.orientation
+                   == BufferParams::ORIENTATION_LANDSCAPE)
+                       command += 'r';
+       }
+
+       if (!contains(command, token_from))
+               command += ' ' + token_from;
+
+       command = subst(command, token_from,
+                       QuoteName(OnlyFilename(filename)));
+       command = subst(command, token_path, QuoteName(OnlyPath(filename)));
+
+       lyxerr[Debug::FILES] << "Executing command: " << command << endl;
+       ShowMessage(buffer, _("Executing command:"), command);
+
+       Path p(OnlyPath(filename));
+       Systemcall one;
+       int const res = one.startscript(Systemcall::DontWait, command);
+
+       if (res) {
+               Alert::alert(_("Cannot view file"),
+                          _("Error while executing"),
+                          command.substr(0, 50));
+               return false;
+       }
+       return true;
+}
+
+
+string const Formats::prettyName(string const & name) const
+{
+       Format const * format = getFormat(name);
+       if (format)
+               return format->prettyname();
+       else
+               return name;
+}
+
+
+string const Formats::extension(string const & name) const
+{
+       Format const * format = getFormat(name);
+       if (format)
+               return format->extension();
+       else
+               return name;
+}
+
+
+string const papersize(Buffer const * buffer)
+{
+       char real_papersize = buffer->params.papersize;
+       if (real_papersize == BufferParams::PAPER_DEFAULT)
+               real_papersize = lyxrc.default_papersize;
+
+       switch (real_papersize) {
+       case BufferParams::PAPER_A3PAPER:
+               return "a3";
+       case BufferParams::PAPER_A4PAPER:
+               return "a4";
+       case BufferParams::PAPER_A5PAPER:
+               return "a5";
+       case BufferParams::PAPER_B5PAPER:
+               return "b5";
+       case BufferParams::PAPER_EXECUTIVEPAPER:
+               return "foolscap";
+       case BufferParams::PAPER_LEGALPAPER:
+               return "legal";
+       case BufferParams::PAPER_USLETTER:
+       default:
+               return "letter";
+       }
+}
+
+
+Formats formats;
+
+Formats system_formats;
diff --git a/src/format.h b/src/format.h
new file mode 100644 (file)
index 0000000..a14909f
--- /dev/null
@@ -0,0 +1,132 @@
+// -*- C++ -*-
+
+
+#ifndef FORMAT_H
+#define FORMAT_H
+
+
+/**
+ * \file format.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Dekel Tsur
+ *
+ * Full author contact details are available in file CREDITS
+ */
+
+
+
+#include "buffer.h"
+#include "LString.h"
+#include "support/lstrings.h"
+
+#include <vector>
+
+string const papersize(Buffer const * buffer) ;
+
+class Format {
+public:
+       ///
+       Format(string const & n, string const & e, string const & p,
+              string const & s, string const & v);
+       ///
+       bool dummy() const;
+       ///
+       bool isChildFormat() const;
+       ///
+       string const parentFormat() const;
+       ///
+       string const & name() const {
+               return name_;
+       }
+       ///
+       string const & extension() const {
+               return extension_;
+       }
+       ///
+       string const & prettyname() const {
+               return prettyname_;
+       }
+       ///
+       string const & shortcut() const {
+               return shortcut_;
+       }
+       ///
+       string const & viewer() const {
+               return viewer_;
+       }
+       ///
+       void setViewer(string const & v) {
+               viewer_ = v;
+       }
+private:
+       string name_;
+       ///
+       string extension_;
+       ///
+       string prettyname_;
+       ///
+       string shortcut_;
+       ///
+       string viewer_;
+};
+
+
+bool operator<(Format const & a, Format const & b);
+
+///
+class Formats {
+public:
+       ///
+       typedef std::vector<Format> FormatList;
+       ///
+       typedef FormatList::const_iterator const_iterator;
+       ///
+       Format const & get(FormatList::size_type i) const {
+               return formatlist[i];
+       }
+       ///
+       Format const * getFormat(string const & name) const;
+       ///
+       int getNumber(string const & name) const;
+       ///
+       void add(string const & name);
+       ///
+       void add(string const & name, string const & extension,
+                string const & prettyname, string const & shortcut);
+       ///
+       void erase(string const & name);
+       ///
+       void sort();
+       ///
+       void setViewer(string const & name, string const & command);
+       ///
+       bool view(Buffer const * buffer, string const & filename,
+                 string const & format_name) const;
+       ///
+       string const prettyName(string const & name) const;
+       ///
+       string const extension(string const & name) const;
+       ///
+       const_iterator begin() const {
+               return formatlist.begin();
+       }
+       ///
+       const_iterator end() const {
+               return formatlist.end();
+       }
+       ///
+       FormatList::size_type size() const {
+               return formatlist.size();
+       }
+private:
+       ///
+       FormatList formatlist;
+};
+
+extern Formats formats;
+
+extern Formats system_formats;
+
+#endif //FORMAT_H
index d0f18f792bcff1d565219e3cbf57774607c99ffd..0cab2480ea16c26bf804a4ed658a838491c30b82 100644 (file)
@@ -1,3 +1,9 @@
+2003-02-28  Alfredo Braunstein  <abraunst@libero.it>
+
+       * ControlGraphics.C: removed #include "converter.h"
+       * ControlPrefs.C:
+       * ControlSendto.C: added #include "format.h"
+
 2003-02-27  Angus Leeming  <leeming@lyx.org>
 
        * ControlLabel.[Ch]: new files. A controller for the Label dialog.
index 146980e0ca4a60f56c44ffbf910a63cf90650bfa..5daacdea2fa367393dbb791049a73ffaf2b82f42 100644 (file)
@@ -18,7 +18,6 @@
 
 #include "buffer.h"
 #include "BufferView.h"
-#include "converter.h"
 #include "gettext.h"
 #include "lyxrc.h"
 
index 74888b16d4f4cfe38d6474ee5a11465e57697e53..de6c73763b7c95afe4428907cfc21ae0d5087519 100644 (file)
@@ -23,6 +23,7 @@
 #include "support/filetools.h"
 #include "frontends/Dialogs.h"
 #include "converter.h"
+#include "format.h"
 #include "debug.h"
 
 extern string system_lyxdir;
index e06f4cf6d60845a3b0914ffb8fa84a9ecaadbf7e..4b414272b33737726ac268e8a05d3f4f3615b9e0 100644 (file)
@@ -15,6 +15,7 @@
 #include "ViewBase.h"
 #include "buffer.h"
 #include "converter.h"
+#include "format.h"
 #include "exporter.h"
 #include "gettext.h"
 #include "lyxrc.h"
index ba0f8d97e483e0b42aed426d5ddc16c5cd57cd98..2dc49de8fc97c62937a836f164e2a97b25a3dae2 100644 (file)
@@ -1,3 +1,10 @@
+2003-02-28  Alfredo Braunstein <abraunst@libero.it>
+
+       * QLImage.C 
+       * QSendto.C
+       * QSendtoDialog.C: removed #include "converter.h", and...
+       * QPrefs.h: added #include "format.h"
+
 2003-02-25  John Levon  <levon@movementarian.org>
 
        From Nathan Weston
index e260490cebba062ae9a8f29ee104c54c735e8a6d..3a542dece45ff30cbf72c5d1b40043ac2c47971a 100644 (file)
@@ -14,7 +14,7 @@
 
 #include "QLImage.h"
 #include "graphics/GraphicsParams.h"
-#include "converter.h"
+#include "format.h"
 #include "debug.h"
 #include "support/LAssert.h"
 #include "support/lyxfunctional.h"  // compare_memfun
index 9cfda169d714998e146a43538b29459fcb3ec453..cddf96836199dae514bd4af7a0ee68651352e575 100644 (file)
@@ -14,6 +14,7 @@
 
 
 #include "converter.h"
+#include "format.h"
 
 #include "Qt2Base.h"
 #include "ControlPrefs.h"
index 6d4c694bb34367805258e656de149afe368bb41a..22038d0b33ed2cdd3e4af021a2114554b5942eef 100644 (file)
@@ -23,7 +23,7 @@
 
 #include "debug.h"
 #include "qt_helpers.h"
-#include "converter.h"
+#include "format.h"
 
 using std::vector;
 
index fbf51ec3e8e1702b35c6191772c9733e01a8a05c..892a2adf14107657f03e5d816a1d8bde6fdd35e0 100644 (file)
@@ -16,7 +16,6 @@
 #include "qt_helpers.h"
 #include "debug.h"
 
-#include "converter.h"
 #include "LString.h"
 
 #include <qcombobox.h>
index bc39179d47465a2bb61da7f8bb1c86194e750f18..0b6da693d1e9009304e8aadb26770e95e7e07e3f 100644 (file)
@@ -125,8 +125,7 @@ void lyx_gui::parse_init(int & argc, char * argv[])
 
 
 void lyx_gui::parse_lyxrc()
-{
-}
+{}
 
 
 void lyx_gui::start(string const & batch, vector<string> const & files)
index 94804e1acead0827e123dc927e7c5ae363cdcbfd..d14a9721e867649e39cf536db7a5623dad8465a1 100644 (file)
@@ -1,3 +1,9 @@
+2003-02-28  Alfredo Braunstein <abraunst@libero.it>
+
+       * FormPreferences.C
+       * FormSento.C
+       * xformsImage.C: Added #include "format.h"
+
 2003-02-27  Angus Leeming  <leeming@lyx.org>
 
        * Dialogs.C (build): add a label dialog.
index c440e25aae7481f364e3af35202f257627d87461..97f8e3da1d72b5e1b95949e8a90e64a4ba060efa 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "buffer.h"
 #include "converter.h"
+#include "format.h"
 #include "debug.h"
 #include "language.h"
 #include "frnt_lang.h"
index cefad280a755cca9ffa348ffe85abdda50a125f5..5316c9bcb786788b7d320808df532a3a31197e52 100644 (file)
@@ -17,7 +17,7 @@
 #include "xformsBC.h"
 #include "Tooltips.h"
 #include "xforms_helpers.h"
-#include "converter.h"
+#include "format.h"
 #include "gettext.h"
 #include FORMS_H_LOCATION
 
index 5af697e469edde87c47c931351e4c93dab12665a..adb5dcdf1992edb93d71a1d0548231cc9e517de2 100644 (file)
@@ -14,7 +14,7 @@
 #include "xformsImage.h"
 #include "graphics/GraphicsParams.h"
 #include "Color.h"
-#include "converter.h"              // formats
+#include "format.h"
 #include "debug.h"
 #include "support/LAssert.h"
 #include "support/lyxfunctional.h"  // compare_memfun
diff --git a/src/graph.C b/src/graph.C
new file mode 100644 (file)
index 0000000..ea1edc6
--- /dev/null
@@ -0,0 +1,197 @@
+/**
+ * \file graph.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Dekel Tsur
+ *
+ * Full author contact details are available in file CREDITS
+ */
+
+#include "graph.h"
+#include "format.h"
+
+#include <queue>
+#include <vector>
+
+using std::queue;
+using std::vector;
+
+
+
+int Graph::bfs_init(int s, bool clear_visited)
+{
+       if (s < 0)
+               return s;
+
+       Q_ = std::queue<int>();
+
+       if (clear_visited)
+               fill(visited_.begin(), visited_.end(), false);
+       if (visited_[s] == false) {
+               Q_.push(s);
+               visited_[s] = true;
+       }
+       return s;
+}
+
+
+vector<int> const
+Graph::getReachableTo(int target, bool clear_visited)
+{
+       vector<int> result;
+       int const s = bfs_init(target, clear_visited);
+       if (s < 0)
+               return result;
+
+       while (!Q_.empty()) {
+               int const i = Q_.front();
+               Q_.pop();
+               if (i != s || formats.get(target).name() != "lyx") {
+                       result.push_back(i);
+               }
+
+               vector<int>::iterator it = vertices_[i].in_vertices.begin();
+               vector<int>::iterator end = vertices_[i].in_vertices.end();
+               for (; it != end; ++it) {
+                       if (!visited_[*it]) {
+                               visited_[*it] = true;
+                               Q_.push(*it);
+                       }
+               }
+       }
+
+       return result;
+}
+
+
+vector<int> const
+Graph::getReachable(int from, bool only_viewable,
+                   bool clear_visited)
+{
+       vector<int> result;
+       if (bfs_init(from, clear_visited) < 0)
+               return result;
+
+       while (!Q_.empty()) {
+               int const i = Q_.front();
+               Q_.pop();
+               Format const & format = formats.get(i);
+               if (format.name() == "lyx")
+                       continue;
+               if (!only_viewable || !format.viewer().empty() ||
+                   format.isChildFormat())
+                       result.push_back(i);
+
+               vector<int>::const_iterator cit =
+                       vertices_[i].out_vertices.begin();
+               vector<int>::const_iterator end =
+                       vertices_[i].out_vertices.end();
+               for (; cit != end; ++cit)
+                       if (!visited_[*cit]) {
+                               visited_[*cit] = true;
+                               Q_.push(*cit);
+                       }
+       }
+
+       return result;
+}
+
+
+bool Graph::isReachable(int from, int to)
+{
+       if (from == to)
+               return true;
+
+       int const s = bfs_init(from);
+       if (s < 0 || to < 0)
+               return false;
+
+       while (!Q_.empty()) {
+               int const i = Q_.front();
+               Q_.pop();
+               if (i == to)
+                       return true;
+
+               vector<int>::const_iterator cit =
+                       vertices_[i].out_vertices.begin();
+               vector<int>::const_iterator end =
+                       vertices_[i].out_vertices.end();
+               for (; cit != end; ++cit) {
+                       if (!visited_[*cit]) {
+                               visited_[*cit] = true;
+                               Q_.push(*cit);
+                       }
+               }
+       }
+
+       return false;
+}
+
+
+Graph::EdgePath const
+Graph::getPath(int from, int t)
+{
+       EdgePath path;
+       if (from == t)
+               return path;
+
+       int const s = bfs_init(from);
+       if (s < 0 || t < 0)
+               return path;
+
+       vector<int> prev_edge(formats.size());
+       vector<int> prev_vertex(formats.size());
+
+       bool found = false;
+       while (!Q_.empty()) {
+               int const i = Q_.front();
+               Q_.pop();
+               if (i == t) {
+                       found = true;
+                       break;
+               }
+
+               vector<int>::const_iterator beg =
+                       vertices_[i].out_vertices.begin();
+               vector<int>::const_iterator cit = beg;
+               vector<int>::const_iterator end =
+                       vertices_[i].out_vertices.end();
+               for (; cit != end; ++cit)
+                       if (!visited_[*cit]) {
+                               int const j = *cit;
+                               visited_[j] = true;
+                               Q_.push(j);
+                               int const k = cit - beg;
+                               prev_edge[j] = vertices_[i].out_edges[k];
+                               prev_vertex[j] = i;
+                       }
+       }
+       if (!found)
+               return path;
+
+       while (t != s) {
+               path.push_back(prev_edge[t]);
+               t = prev_vertex[t];
+       }
+       reverse(path.begin(), path.end());
+       return path;
+}
+
+void Graph::init(int size)
+{
+       vertices_ = vector<Vertex>(size);
+       visited_.resize(size);
+       numedges_ = 0;
+}
+
+void Graph::addEdge(int s, int t)
+{
+       vertices_[t].in_vertices.push_back(s);
+       vertices_[s].out_vertices.push_back(t);
+       vertices_[s].out_edges.push_back(numedges_++);
+}
+
+vector<Graph::Vertex> Graph::vertices_;
+
+
diff --git a/src/graph.h b/src/graph.h
new file mode 100644 (file)
index 0000000..e7c4ac6
--- /dev/null
@@ -0,0 +1,65 @@
+// -*- C++ -*-
+
+#ifndef GRAPH_H
+#define GRAPH_H
+
+/**
+ * \file graph.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Dekel Tsur
+ *
+ * Full author contact details are available in file CREDITS
+ */
+
+#include "LString.h"
+
+#include <queue>
+#include <vector>
+
+class Graph {
+public: 
+       Graph() : numedges_(0) {};
+       ///
+       typedef std::vector<int> EdgePath;
+       ///
+       std::vector<int> const
+       getReachableTo(int, bool clear_visited);
+       ///
+       std::vector<int> const
+       getReachable(int, bool only_viewable,
+                    bool clear_visited);
+       ///
+       bool isReachable(int, int);
+       ///
+       EdgePath const getPath(int, int);
+       ///
+       void addEdge(int s, int t);
+       ///
+       void init(int size);
+
+private:
+       ///
+       int bfs_init(int, bool clear_visited = true);
+
+       ///
+       struct Vertex {
+               std::vector<int> in_vertices;
+               std::vector<int> out_vertices;
+               std::vector<int> out_edges;
+       };
+       ///
+       static
+       std::vector<Vertex> vertices_;
+       ///
+       std::vector<bool> visited_;
+       ///
+       std::queue<int> Q_;
+
+       int numedges_;
+
+};
+
+
+#endif //GRAPH_H
index ee900fc2a7789c4558bdc7a74179978655871c5e..76ec4744bae95d7b149e385b0eac1868e19752a1 100644 (file)
@@ -1,3 +1,8 @@
+2003-02-28  Alfredo Braunstein <abraunst@libero.it>
+
+       * GraphicsConverter.C
+       * PreviewLoader.C: added #include "format.h"
+
 2003-02-26  Angus Leeming  <leeming@lyx.org>
 
        * PreviewedInset.[Ch]: strip out the caching of the BufferView and
index 5db2442febb68a006458c245b1b3860bbe80dd89..58f83eec3ed04828b5c3e52dc953c7618fb2d6a0 100644 (file)
@@ -13,6 +13,7 @@
 #include "GraphicsConverter.h"
 
 #include "converter.h"
+#include "format.h"
 #include "debug.h"
 
 #include "support/filetools.h"
index 37aab6ca3693834787867fdcccff2ee06b35b672..7e8015f069e124948779b82d00b3058a510ec51e 100644 (file)
@@ -15,6 +15,8 @@
 
 #include "buffer.h"
 #include "converter.h"
+#include "format.h"
+
 #include "debug.h"
 #include "lyxrc.h"
 #include "LColor.h"
index 808ec9c39573f7ec7dec4fdd7ca34ddb18a0f84b..bc74a4b8d8f5cad813cee190f5b7c7ebb8e41c1f 100644 (file)
@@ -12,6 +12,7 @@
 
 #include "importer.h"
 #include "converter.h"
+#include "format.h"
 #include "frontends/LyXView.h"
 #include "funcrequest.h"
 
index 676a375e48201a56d2994d941c02b5385f691a77..69162f4591eaa4d0142d952cbec8ab7900d415c8 100644 (file)
@@ -1,3 +1,7 @@
+2003-02-28  Alfredo Braunstein  <abraunst@libero.it>
+
+       * insetgraphics.C: added include "format.h"
+
 2003-02-27  Angus Leeming  <leeming@lyx.org>
 
        * indexlabel.C: use a real, LyX dialog rather than that nasty Alert
index c0a30cb2e877e2751d7a7c7683b6add6a0bf4e0f..bf44b496d9e90d54bf3d5e692b7adcb73541bc32 100644 (file)
@@ -64,6 +64,7 @@ TODO
 #include "buffer.h"
 #include "BufferView.h"
 #include "converter.h"
+#include "format.h"
 #include "frontends/Painter.h"
 #include "lyxrc.h"
 #include "frontends/font_metrics.h"
index 65bd38cb65ab16655c503d6ab51701075069a380..6e3699fdaba9b08f7fc33d696b0c774ec87e6109 100644 (file)
@@ -33,6 +33,7 @@
 #include "lastfiles.h"
 #include "encoding.h"
 #include "converter.h"
+#include "format.h"
 #include "lyxtextclasslist.h"
 
 #include "frontends/Alert.h"
index c5a3f73c8feb7b62b70580a14dea72840da4b830..f14984b7f1c134715f3d5c54a4632b1a0a13b1d3 100644 (file)
@@ -34,7 +34,7 @@
 #include "frontends/lyx_gui.h"
 #include "vspace.h"
 #include "FloatList.h"
-#include "converter.h"
+#include "format.h"
 #include "exporter.h"
 #include "importer.h"
 #include "TextCache.h"
index e2e1a72cd3ea472379d6000485d827db3247a63f..d3170f7c0f6be7e9d5ee135290a3965ca0d3a58b 100644 (file)
@@ -24,6 +24,7 @@
 #include "support/LAssert.h"
 #include "support/userinfo.h"
 #include "converter.h"
+#include "format.h"
 #include "gettext.h"
 #include "lyxlex.h"