]> git.lyx.org Git - lyx.git/commitdiff
Import patch from Dekel.
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Mon, 6 Nov 2000 11:20:22 +0000 (11:20 +0000)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Mon, 6 Nov 2000 11:20:22 +0000 (11:20 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@1199 a592a061-630c-0410-9148-cb99ea01b6c8

23 files changed:
ChangeLog
NEWS
lib/configure
lib/configure.m4
lib/lyxrc.example
lib/ui/default.ui
src/LaTeXLog.C
src/MenuBackend.C
src/MenuBackend.h
src/converter.C
src/converter.h
src/exporter.C
src/exporter.h
src/frontends/xforms/FormPreferences.C
src/frontends/xforms/FormPreferences.h
src/frontends/xforms/Menubar_pimpl.C
src/frontends/xforms/form_preferences.C
src/frontends/xforms/forms/form_preferences.fd
src/insets/figinset.C
src/lyx_main.C
src/lyxfunc.C
src/lyxrc.C
src/support/rename.C

index dccc44daf8a84acfc79d0d037fda52a084482cc3..a11c45e67475b0f6cbe3ea32531f1344cf5faa19 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,43 @@
+2000-11-06  Jean-Marc Lasgouttes  <Jean-Marc.Lasgouttes@inria.fr>
+
+       * lib/configure.m4: == is not a valid operator for command test.
+
+       * src/lyxrc.C: add using directive.
+
+       * src/converter.h: add std:: qualifier.
+
+2000-11-03   Dekel Tsur  <dekelts@tau.ac.il>
+
+       * src/converter.[Ch] and other files: Change the Format class to a
+       real class, and create two instances: formats and system_format.
+
+       * src/lyxrc.C (output): Output the difference between formats and
+       system_formats.
+
+       * src/frontends/xforms/FormPreferences.C (input): Simplify.
+       (buildFormats): Insert formats into browser.
+       (inputFormats): Made the browser and add button functional.
+       (applyFormats): Update formats from format_vec.
+
+       * src/converter.C: Changed all (*it). to it->
+       (Format::dummy): New method.
+       (Format::importer): New format flag.
+       (Formats::GetAllFormats): New method.
+       (Formats::Add): Delete format from the map if prettyname is empty.
+       (Converter::Convert): Print an error message if moving the file fails.
+       (Converter::GetReachableTo): New method
+
+       * src/MenuBackend.[Ch]: Add support for importformats tag.
+
+       * src/support/rename.C (rename): Call to lyx::copy if ::rename fails. 
+
+       * lib/configure.m4: Add word->tex and ps->fax converters.
+
+       * lib/ui/default.ui: Use ImportFormats on file->import menu.
+       Return fax to file menu.
+
+       * NEWS: Updated.
+
 2000-11-04  Lars Gullik Bjønnes  <larsbj@lyx.org>
 
        * src/frontends/xforms/FormPreferences.h (operator=): move out of RGB
diff --git a/NEWS b/NEWS
index 8d64d63a06dad5de243d7a1432a73ce7d063f892..c4e3c0d2ce9dcb5b51ef7547227342971c0ba081 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -52,11 +52,12 @@ Other major changes in 1.1.6 include:
   rendering when you do Ascii export if you have gifscii installed.
 
 - The code which converts from LyX format to anything else (for
-  viewing or exporting purposes) has been rewritten. In particular, the
-  PDF format is now supported. In fact it's now possible to add
-  new export formats without recompiling LyX by specifying external
-  programs or scripts in lyxrc settings (note that the old export lyxrc
-  settings no longer work).
+  viewing or exporting purposes) and from anything else to LyX has been
+  rewritten. In particular, it is now possible to export to PDF, and to
+  import from HTML/MSWord. In fact it's now possible to add new import/export
+  formats without recompiling LyX by specifying external programs or scripts
+  in lyxrc settings 
+  (note that the old import/export lyxrc settings no longer work).
 
 - LyX can do command line exports without opening any GUI components.
 
@@ -67,11 +68,14 @@ Other major changes in 1.1.6 include:
   have differently encoded languages in the same paragraph.
   The languages and the encodings are defined in text files.
 
-- Improved support for Hebrew and Arabic (already present in 1.1.5fix2).
+- Improved support for Hebrew and Arabic (also present in 1.1.5fix2).
 
 - included files work now with docbook and linuxdoc; new layout
   docbook-book.
 
+- PSpell library and Aspell spell checker support now included thanks
+  largely to Kevin Atkinson (PSpell and Aspell maintainer). 
+
 And finally, there have been a lot of smaller changes, which are
 mentioned here for your information
 
index a558d0a8212613ae6528f876c26ea04620fb91d6..f97358fd9b79c4085529e1c0e24d2bf21317647e 100755 (executable)
@@ -333,6 +333,43 @@ fi
 
 test $html_to_latex_command = "html2latex" && html_to_latex_command="html2latex \$\$FName"
 
+echo $ac_n "checking for a MSWord -> Latex converter""... $ac_c"
+echo "$ac_t""(wvCleanLatex word2x)"
+word_to_latex_command=
+for ac_prog in wvCleanLatex word2x
+do
+# Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog ; ac_word=$2
+if test -n "$ac_word"; then
+  echo $ac_n "+checking for \"$ac_word\"""... $ac_c"
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -x $ac_dir/$ac_word; then
+      word_to_latex_command="$ac_prog"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+
+  if test -n "$word_to_latex_command"; then
+    ac_result=yes
+  else
+    ac_result=no
+  fi
+  
+  echo "$ac_t""$ac_result"
+  test -n "$word_to_latex_command" && break
+fi
+done
+
+if test -z "$word_to_latex_command" ; then
+  word_to_latex_command=none
+fi
+
+test $word_to_latex_command = "wvCleanLatex" && word_to_latex_command="wvCleanLatex \$\$FName \$\$OutName"
+test $word_to_latex_command = "word2x" && word_to_latex_command="word2x -f latex \$\$FName"
+
 echo $ac_n "checking for Image converter""... $ac_c"
 echo "$ac_t""(convert)"
 image_command=
@@ -737,6 +774,43 @@ fi
 
 
 
+# Search a GUI Fax program
+echo $ac_n "checking for a fax program""... $ac_c"
+echo "$ac_t""(ksendfax)"
+fax_command=
+for ac_prog in ksendfax
+do
+# Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog ; ac_word=$2
+if test -n "$ac_word"; then
+  echo $ac_n "+checking for \"$ac_word\"""... $ac_c"
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -x $ac_dir/$ac_word; then
+      fax_command="$ac_prog"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+
+  if test -n "$fax_command"; then
+    ac_result=yes
+  else
+    ac_result=no
+  fi
+  
+  echo "$ac_t""$ac_result"
+  test -n "$fax_command" && break
+fi
+done
+
+if test -z "$fax_command" ; then
+  fax_command=none
+fi
+
+test $fax_command = "ksendfax" && fax_command="ksendfax \$\$FName"
+
 # Search for LinuxDoc support
 echo $ac_n "checking for SGML-tools 1.x (LinuxDoc)""... $ac_c"
 echo "$ac_t""(sgml2lyx)"
@@ -1017,28 +1091,32 @@ cat >lyxrc.defaults <<EOF
 \\Format pdf   pdf     PDF             P
 \\Format html  html    HTML            H
 \\Format text  txt     ASCII           A
-\\Format literate nw   NoWeb           W
+\\Format word  doc     Word            W
+\\Format literate nw   NoWeb           N
 \\Format linuxdoc sgml LinuxDoc        x
 \\Format docbook  sgml DocBook         B
-\\Format program  run  Program         r
+\\Format program  ""   Program         ""
+\\Format fax     ""    Fax             ""
 
-\\converter latex lyx "$tex_to_lyx_command" ""
 \\converter latex dvi "$LATEX" "latex,disable=linuxdoc&docbook"
 \\converter latex pdf "$PDFLATEX" "latex,disable=linuxdoc&docbook"
 \\converter latex html "$latex_to_html_command"
        "originaldir,needaux,disable=linuxdoc&docbook"
-\\converter literate lyx "$literate_to_lyx_command" ""
 \\converter literate latex "$literate_to_tex_command" ""
 \\converter dvi ps "$dvi_to_ps_command" ""
 \\converter ps pdf "$ps_to_pdf_command" ""
+\\converter ps fax "$fax_command" ""
 \\converter linuxdoc lyx "$linuxdoc_to_lyx_command" ""
 \\converter linuxdoc latex "$linuxdoc_to_latex_command" ""
 \\converter linuxdoc dvi "$linuxdoc_to_dvi_command" ""
 \\converter linuxdoc html "$linuxdoc_to_html_command" ""
 \\converter docbook dvi "$docbook_to_dvi_command" ""
 \\converter docbook html "$docbook_to_html_command" ""
-\\converter html latex "$html_to_latex_command"
-                       "disable=latex&literate&linuxdoc&docbook"
+
+\\converter latex lyx "$tex_to_lyx_command" "importer"
+\\converter literate lyx "$literate_to_lyx_command" "importer"
+\\converter html latex "$html_to_latex_command" "importer"
+\\converter word latex "$word_to_latex_command" "importer"
 
 \converter gif eps "$image_command" ""
 \converter png eps "$image_command" ""
index b726f45e8954573c257b10442045f67c44f50565..d6b3b884005fc154d37a21ab57c61bb28ab23399 100644 (file)
@@ -196,6 +196,10 @@ test $literate_to_tex_command = "noweave" && literate_to_tex_command="noweave -d
 SEARCH_PROG([for a HTML -> Latex converter],html_to_latex_command,html2latex)
 test $html_to_latex_command = "html2latex" && html_to_latex_command="html2latex \$\$FName"
 
+SEARCH_PROG([for a MSWord -> Latex converter],word_to_latex_command,wvCleanLatex word2x)
+test $word_to_latex_command = "wvCleanLatex" && word_to_latex_command="wvCleanLatex \$\$FName \$\$OutName"
+test $word_to_latex_command = "word2x" && word_to_latex_command="word2x -f latex \$\$FName"
+
 SEARCH_PROG([for Image converter],image_command,convert)
 test $image_command = "convert" && image_command="convert \$\$FName \$\$OutName"
 
@@ -248,6 +252,10 @@ dnl else
 dnl   fax_command="none"
 dnl fi
 
+# Search a GUI Fax program
+SEARCH_PROG([for a fax program], fax_command, ksendfax)
+test $fax_command = "ksendfax" && fax_command="ksendfax \$\$FName"
+
 # Search for LinuxDoc support
 SEARCH_PROG([for SGML-tools 1.x (LinuxDoc)], LINUXDOC, sgml2lyx)
 chk_linuxdoc=no
@@ -384,28 +392,32 @@ cat >lyxrc.defaults <<EOF
 \\Format pdf   pdf     PDF             P
 \\Format html  html    HTML            H
 \\Format text  txt     ASCII           A
-\\Format literate nw   NoWeb           W
+\\Format word  doc     Word            W
+\\Format literate nw   NoWeb           N
 \\Format linuxdoc sgml LinuxDoc        x
 \\Format docbook  sgml DocBook         B
-\\Format program  run  Program         r
+\\Format program  ""   Program         ""
+\\Format fax     ""    Fax             ""
 
-\\converter latex lyx "$tex_to_lyx_command" ""
 \\converter latex dvi "$LATEX" "latex,disable=linuxdoc&docbook"
 \\converter latex pdf "$PDFLATEX" "latex,disable=linuxdoc&docbook"
 \\converter latex html "$latex_to_html_command"
        "originaldir,needaux,disable=linuxdoc&docbook"
-\\converter literate lyx "$literate_to_lyx_command" ""
 \\converter literate latex "$literate_to_tex_command" ""
 \\converter dvi ps "$dvi_to_ps_command" ""
 \\converter ps pdf "$ps_to_pdf_command" ""
+\\converter ps fax "$fax_command" ""
 \\converter linuxdoc lyx "$linuxdoc_to_lyx_command" ""
 \\converter linuxdoc latex "$linuxdoc_to_latex_command" ""
 \\converter linuxdoc dvi "$linuxdoc_to_dvi_command" ""
 \\converter linuxdoc html "$linuxdoc_to_html_command" ""
 \\converter docbook dvi "$docbook_to_dvi_command" ""
 \\converter docbook html "$docbook_to_html_command" ""
-\\converter html latex "$html_to_latex_command"
-                       "disable=latex&literate&linuxdoc&docbook"
+
+\\converter latex lyx "$tex_to_lyx_command" "importer"
+\\converter literate lyx "$literate_to_lyx_command" "importer"
+\\converter html latex "$html_to_latex_command" "importer"
+\\converter word latex "$word_to_latex_command" "importer"
 
 \converter gif eps "$image_command" ""
 \converter png eps "$image_command" ""
index d2e29a70da35ef92cf9078353e191cbc671e3c50..0306a3459ab17add6d9b51f68145e06a1cc1ee99 100644 (file)
 #
 
 # The \converter command defines a converter between two formats. 
-# LyX uses the defined converters for generating output in varius formats.
+# LyX uses the defined converters for generating output in various formats,
+# or for importing.
 # The converter command has 4 arguments: The source format, the target format,
 # the command, and additional flags.
 # For example, the following defines a DVI->Postscript converter:
 # The flags argument is a list of comma separated flags.
 # Known flags are
 # - * : copy the previously defined flags
+# - importer : The converter is used for importing.
 # - latex : The converter is latex or its derivatives (pdflatex).
 # - originaldir : The converter must be invoked in the directory of the lyx
 #   file and not in the temporary directory. This is needed for tex->html
index ca97dff7cba5650d4eca67dbc696869c6c25e981..f88364c6f76e8caa3d9434add1a58306bd51e8f0 100644 (file)
@@ -52,6 +52,7 @@ Menuset
        Separator
        Submenu "Export|E" "exportfile"
        Item "Print...|P" "buffer-print"
+       Item "Fax...|F" "buffer-export fax"
        Separator
        Item "Exit|x" "lyx-quit"
        Separator
@@ -59,12 +60,9 @@ Menuset
     End
 
     Menu "fileimport"
-       OptItem "LaTeX...|L" "buffer-import latex"
-       OptItem "Ascii text as lines...|A" "buffer-import text"
-       OptItem "Ascii text as paragraphs...|p" "buffer-import textparagraph"
-       OptItem "HTML...|H" "buffer-import html"
-       OptItem "Noweb...|N" "buffer-import literate"
-       OptItem "LinuxDoc...|D" "buffer-import linuxdoc"
+       Item "Ascii text as lines...|A" "buffer-import text"
+       Item "Ascii text as paragraphs...|p" "buffer-import textparagraph"
+       ImportFormats
     End
 
     Menu "fileinsert"
index 9327c29f7e3cb26db19a3a303919b5859ff51454..a791546c5a02e039c6c59314d8c8e5cf07421b8a 100644 (file)
@@ -27,7 +27,7 @@ void ShowLatexLog()
        if (!filename.empty()) {
                fname = OnlyFilename(ChangeExtension(filename, ".log"));
                bname = OnlyFilename(ChangeExtension(filename,
-                                    Formats::Extension("literate") + ".out"));
+                                    formats.Extension("literate") + ".out"));
                path = OnlyPath(filename);
                if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1)) {
                        path = current_view->buffer()->tmppath;
index 18d39b90b8665b1f726873606833041063fd640c..eaf88f28fe24b845ae58a279bcca2a6620cc23f2 100644 (file)
@@ -55,6 +55,7 @@ MenuItem::MenuItem(Kind kind, string const & label,
        case ViewFormats:
        case UpdateFormats:
        case ExportFormats:
+       case ImportFormats:
                break;
        case Command:
                action_ = lyxaction.LookupFunc(command);
@@ -88,6 +89,7 @@ Menu & Menu::read(LyXLex & lex)
                md_documents,
                md_endmenu,
                md_exportformats,
+               md_importformats,
                md_lastfiles,
                md_optitem,
                md_references,
@@ -103,6 +105,7 @@ Menu & Menu::read(LyXLex & lex)
                { "documents", md_documents },
                { "end", md_endmenu },
                { "exportformats", md_exportformats },
+               { "importformats", md_importformats },
                { "item", md_item },
                { "lastfiles", md_lastfiles },
                { "optitem", md_optitem }, 
@@ -169,6 +172,10 @@ Menu & Menu::read(LyXLex & lex)
                        add(MenuItem(MenuItem::ExportFormats));
                        break;
 
+               case md_importformats:
+                       add(MenuItem(MenuItem::ImportFormats));
+                       break;
+
                case md_submenu: {
                        lex.next();
                        string mlabel = _(lex.GetString());
@@ -272,19 +279,21 @@ void Menu::expand(Menu & tomenu, Buffer * buf) const
                        vector<FormatPair> names;
                        kb_action action;
                        if ((*cit).kind() == MenuItem::ViewFormats) {
-                               names = Exporter::GetViewableFormats(buf);
+                               names = Exporter::GetExportableFormats(buf, true);
                                action = LFUN_PREVIEW;
                        } else if ((*cit).kind() == MenuItem::UpdateFormats) {
-                               names = Exporter::GetViewableFormats(buf);
+                               names = Exporter::GetExportableFormats(buf, true);
                                action = LFUN_UPDATE;
                        } else {
-                               names = Exporter::GetExportableFormats(buf);
+                               names = Exporter::GetExportableFormats(buf, false);
                                action = LFUN_EXPORT;
                        }
                        sort(names.begin(), names.end(), compare_formatpair());
 
                        for (vector<FormatPair>::const_iterator fit = names.begin();
                             fit != names.end() ; ++fit) {
+                               if ((*fit).format->dummy())
+                                       continue;
                                string fmt = (*fit).format->name;
                                string label = (*fit).format->prettyname;
                                bool same_before = 
@@ -311,6 +320,24 @@ void Menu::expand(Menu & tomenu, Buffer * buf) const
                }
                break;
 
+               case MenuItem::ImportFormats: {
+                       vector<FormatPair> names = Converter::GetReachableTo("lyx");
+                       sort(names.begin(), names.end(), compare_formatpair());
+
+                       for (vector<FormatPair>::const_iterator fit = names.begin();
+                            fit != names.end() ; ++fit) {
+                               if ((*fit).format->dummy())
+                                       continue;
+                               string fmt = (*fit).format->name;
+                               string label = (*fit).format->prettyname;
+                               if (!(*fit).format->shortcut.empty())
+                                       label += "|" + (*fit).format->shortcut;
+                               int action2 = lyxaction.getPseudoAction(LFUN_IMPORT, fmt);
+                               tomenu.add(MenuItem(MenuItem::Command,
+                                                   label, action2));
+                       }
+               }
+               break;
                        
                default:
                        tomenu.add(*cit);
index 2c09e4ee48b4f265643419fb88124c581ba832b1..169b9d56183794d59f6761d4035f4f9cd4a22250 100644 (file)
@@ -54,7 +54,10 @@ public:
                UpdateFormats,
                /** This is a list of exportable formats
                    typically for the File->Export menu. */
-               ExportFormats
+               ExportFormats,
+               /** This is a list of importable formats
+                   typically for the File->Export menu. */
+               ImportFormats
        };
        /// Create a Command type MenuItem
        MenuItem(Kind kind, 
index fab51433f8b268b2c5909c2495dc38e65b688af7..ac91f7cf7f3039ad8e0469ad8c557481d4af00c3 100644 (file)
@@ -38,7 +38,6 @@ using std::find_if;
 
 //////////////////////////////////////////////////////////////////////////////
 
-map<string, Format> Formats::formats;
 vector<Command> Converter::commands;
 string Converter::latex_command;
 
@@ -52,25 +51,41 @@ string const add_options(string const & command, string const & options)
 
 //////////////////////////////////////////////////////////////////////////////
 
+
+bool Format::dummy() const
+{
+       return extension.empty();
+}
+
+
 void Formats::Add(string const & name)
 {
        if (formats.find(name) == formats.end())
-               formats[name] = Format(name, name, name, string());
+               formats[name] = Format(name, name, name, "", "");
 }
 
 
 void Formats::Add(string const & name, string const & extension, 
                  string const & prettyname, string const & shortcut)
 {
-       formats[name] = Format(name, extension, prettyname, shortcut);
+
+       if (prettyname.empty()) {
+               FormatList::iterator it = formats.find(name);
+               if (it != formats.end())
+                       formats.erase(it);
+               return;
+       }
+
+       string old_viewer = formats[name].viewer;
+       formats[name] = Format(name, extension, prettyname, shortcut,
+                              old_viewer);
 }
 
 
 void Formats::SetViewer(string const & name, string const & command)
 {
-
        string command2 = command;
-       if (!contains(command2,"$$FName"))
+       if (!command2.empty() && !contains(command2,"$$FName"))
                command2 += " $$FName";
 
        Add(name);
@@ -88,7 +103,7 @@ bool Formats::View(Buffer const * buffer, string const & filename,
        if (!format || format->viewer.empty()) {
                WriteAlert(_("Can not view file"),
                           _("No information for viewing ")
-                          + Formats::PrettyName(format_name));
+                          + PrettyName(format_name));
                           return false;
        }
 
@@ -124,9 +139,9 @@ bool Formats::View(Buffer const * buffer, string const & filename,
 
 Format * Formats::GetFormat(string const & name)
 {
-       map<string, Format>::iterator it = formats.find(name);
+       FormatList::iterator it = formats.find(name);
        if (it != formats.end())
-               return &(*it).second;
+               return &it->second;
        else
                return 0;
 }
@@ -151,6 +166,18 @@ string const Formats::Extension(string const & name)
                return name;
 }
 
+
+vector<Format> 
+const Formats::GetAllFormats()
+{
+       vector<Format> result;
+       for (FormatList::iterator it = formats.begin(); 
+            it != formats.end(); ++it)
+               result.push_back(it->second);
+       return result;
+}
+
+
 //////////////////////////////////////////////////////////////////////////////
 
 class compare_Command {
@@ -167,9 +194,9 @@ private:
 void Converter::Add(string const & from, string const & to,
                    string const & command, string const & flags)
 {
-       Formats::Add(from);
-       Formats::Add(to);
-       Command Com(Formats::GetFormat(from), Formats::GetFormat(to), command);
+       formats.Add(from);
+       formats.Add(to);
+       Command Com(formats.GetFormat(from), formats.GetFormat(to), command);
        vector<Command>::iterator it = find_if(commands.begin(),
                                               commands.end(),
                                               compare_Command(Com));
@@ -193,6 +220,8 @@ void Converter::Add(string const & from, string const & to,
                                Com.command = command;
                        }
                } 
+               else if (flag_name == "importer")
+                       Com.importer = true;
                else if (flag_name == "latex")
                        Com.latex = true;
                else if (flag_name == "originaldir")
@@ -236,17 +265,47 @@ void Converter::Add(string const & from, string const & to,
 inline
 bool enable(vector<Command>::iterator it, string const & from)
 {
-       return find((*it).disable.begin(), (*it).disable.end(), from)
-               == (*it).disable.end();
+       return find(it->disable.begin(), it->disable.end(), from)
+               == it->disable.end();
+}
+
+
+vector<FormatPair> const
+Converter::GetReachableTo(string const & target)
+{
+       vector<FormatPair> result;
+
+       queue< vector<Command>::iterator > Q;
+       for (vector<Command>::iterator it = commands.begin();
+            it != commands.end(); ++it)
+               if (it->to->name == target && it->importer) {
+                       Q.push(it);
+                       it->visited = true;
+               } else
+                       it->visited = false;
+
+       while (!Q.empty()) {
+               vector<Command>::iterator it = Q.front();
+               Q.pop();
+               result.push_back(FormatPair(it->from, 0, ""));
+               for (vector<Command>::iterator it2 = commands.begin();
+                    it2 != commands.end(); ++it2)
+                       if (!it2->visited && it->from == it2->to &&
+                           it2->importer) {
+                               Q.push(it2);
+                               it2->visited = true;
+                       }
+       }
+
+       return result;
 }
 
 
 vector<FormatPair> const
-Converter::GetReachable(string const & from, string const & stop_format,
-                       bool only_viewable)
+Converter::GetReachable(string const & from, bool only_viewable)
 {
        vector<FormatPair> result;
-       Format const * format = Formats::GetFormat(from);
+       Format const * format = formats.GetFormat(from);
        if (!format)
                return result;
 
@@ -256,26 +315,25 @@ Converter::GetReachable(string const & from, string const & stop_format,
        queue< vector<Command>::iterator > Q;
        for (vector<Command>::iterator it = commands.begin();
             it != commands.end(); ++it)
-               if ((*it).from->name == from && enable(it, from)
-                   && (*it).to->name != stop_format) {
+               if (it->from->name == from && enable(it, from) 
+                   && !it->importer) {
                        Q.push(it);
-                       (*it).visited = true;
+                       it->visited = true;
                } else
-                       (*it).visited = false;
+                       it->visited = false;
 
        while (!Q.empty()) {
                vector<Command>::iterator it = Q.front();
                Q.pop();
-               if (!only_viewable || !(*it).to->viewer.empty())
-                       result.push_back(FormatPair((*it).to, (*it).from,
-                                                   (*it).command));
+               if (!only_viewable || !it->to->viewer.empty())
+                       result.push_back(FormatPair(it->to, it->from,
+                                                   it->command));
                for (vector<Command>::iterator it2 = commands.begin();
                     it2 != commands.end(); ++it2)
-                       if (!(*it2).visited && (*it).to == (*it2).from &&
-                           enable(it2, from) &&
-                           (*it2).to->name != stop_format) {
+                       if (!it2->visited && it->to == it2->from &&
+                           enable(it2, from) && !it2->importer) {
                                Q.push(it2);
-                               (*it2).visited = true;
+                               it2->visited = true;
                        }
        }
 
@@ -291,23 +349,23 @@ bool Converter::IsReachable(string const & from, string const & to)
        queue< vector<Command>::iterator > Q;
        for (vector<Command>::iterator it = commands.begin();
             it != commands.end(); ++it)
-               if ((*it).from->name == from && enable(it, from)) {
+               if (it->from->name == from && enable(it, from)) {
                        Q.push(it);
-                       (*it).visited = true;
+                       it->visited = true;
                } else
-                       (*it).visited = false;
+                       it->visited = false;
 
        while (!Q.empty()) {
                vector<Command>::iterator it = Q.front();
                Q.pop();
-               if ((*it).to->name == to)
+               if (it->to->name == to)
                        return true;
                for (vector<Command>::iterator it2 = commands.begin();
                     it2 != commands.end(); ++it2)
-                       if (!(*it2).visited && (*it).to == (*it2).from &&
+                       if (!it2->visited && it->to == it2->from &&
                            enable(it2, from)) {
                                Q.push(it2);
-                               (*it2).visited = true;
+                               it2->visited = true;
                        }
        }
        return false;
@@ -320,7 +378,7 @@ bool Converter::Convert(Buffer const * buffer,
                        string const & using_format, string & to_file)
 {
        to_file = ChangeExtension(to_file_base,
-                                 Formats::Extension(to_format));
+                                 formats.Extension(to_format));
 
        if (from_format == to_format)
                if (from_file != to_file)
@@ -331,12 +389,12 @@ bool Converter::Convert(Buffer const * buffer,
        queue< vector<Command>::iterator > Q;
        for (vector<Command>::iterator it = commands.begin();
             it != commands.end(); ++it)
-               if ((*it).from->name == from_format && enable(it, from_format)) {
+               if (it->from->name == from_format && enable(it, from_format)) {
                        Q.push(it);
-                       (*it).visited = true;
-                       (*it).previous = commands.end();
+                       it->visited = true;
+                       it->previous = commands.end();
                } else
-                       (*it).visited = false;
+                       it->visited = false;
 
        if (Q.empty()) {
                WriteAlert(_("Can not convert file"),
@@ -348,34 +406,34 @@ bool Converter::Convert(Buffer const * buffer,
        vector<Command>::iterator it;
        while (!Q.empty()) {
                it = Q.front();
-               if ((*it).to->name == to_format &&
-                   (using_format.empty() || using_format == (*it).from->name)) {
+               if (it->to->name == to_format &&
+                   (using_format.empty() || using_format == it->from->name)) {
                        found = true;
                        break;
                }
                Q.pop();
                for (vector<Command>::iterator it2 = commands.begin();
                     it2 != commands.end(); ++it2)
-                       if (!(*it2).visited && (*it).to == (*it2).from &&
+                       if (!it2->visited && it->to == it2->from &&
                            enable(it2, from_format)) {
                                Q.push(it2);
-                               (*it2).visited = true;
-                               (*it2).previous = it;
+                               it2->visited = true;
+                               it2->previous = it;
                        }
        }
 
        if (!found) {
                WriteAlert(_("Can not convert file"),
                           _("No information for converting from ")
-                          + Formats::PrettyName(from_format) + _(" to ")
-                          + Formats::PrettyName(to_format));
+                          + formats.PrettyName(from_format) + _(" to ")
+                          + formats.PrettyName(to_format));
                return false;
        }
 
        vector< vector<Command>::iterator > S;
        while (it != commands.end()) {
                S.push_back(it);
-               it = (*it).previous;
+               it = it->previous;
        }
 
        string path = OnlyPath(from_file);
@@ -389,62 +447,66 @@ bool Converter::Convert(Buffer const * buffer,
        for (vector< vector<Command>::iterator >::reverse_iterator rit =
                     S.rbegin(); rit != S.rend(); ++rit) {
                it = *rit;
-               lyxerr << "Converting from  "
-                      << (*it).from->name << " to " << (*it).to->name << endl;
+               bool dummy = it->to->dummy() && it->to->name != "program";
+               if (!dummy)
+                       lyxerr << "Converting from  "
+                              << it->from->name << " to " << it->to->name << endl;
                infile = outfile;
-               outfile = (*it).result_dir.empty()
-                       ? ChangeExtension(from_file, (*it).to->extension)
-                       : AddName(subst((*it).result_dir,
+               outfile = it->result_dir.empty()
+                       ? ChangeExtension(from_file, it->to->extension)
+                       : AddName(subst(it->result_dir,
                                        "$$BaseName", from_base),
-                                 subst((*it).result_file,
+                                 subst(it->result_file,
                                        "$$BaseName", OnlyFilename(from_base)));
 
-               if ((*it).latex) {
-                       lyxrc.pdf_mode = (*it).to->name == "pdf";
-                       lyxerr << "Running " << (*it).command << endl;
+               if (it->latex) {
+                       lyxrc.pdf_mode = it->to->name == "pdf";
+                       lyxerr << "Running " << it->command << endl;
                        run_latex = true;
-                       if (!runLaTeX(buffer, (*it).command))
+                       if (!runLaTeX(buffer, it->command))
                                return false;
                } else {
-                       if ((*it).need_aux && !run_latex
+                       if (it->need_aux && !run_latex
                            && !latex_command.empty()) {
                                lyxerr << "Running " << latex_command 
                                       << " to update aux file"<<  endl;
                                runLaTeX(buffer, latex_command);
                        }
 
-                       string infile2 = ((*it).original_dir)
+                       string infile2 = (it->original_dir)
                                ? infile : MakeRelPath(infile, path);
-                       string outfile2 = ((*it).original_dir)
+                       string outfile2 = (it->original_dir)
                                ? outfile : MakeRelPath(outfile, path);
 
-                       string command = (*it).command;
+                       string command = it->command;
                        command = subst(command, "$$FName", QuoteName(infile2));
                        command = subst(command, "$$BaseName", QuoteName(from_base));
                        command = subst(command, "$$OutName", QuoteName(outfile2));
 
-                       if (!(*it).parselog.empty())
+                       if (!it->parselog.empty())
                                command += " 2> " + QuoteName(infile2 + ".out");
 
-                       if ((*it).from->name == "dvi" && (*it).to->name == "ps")
+                       if (it->from->name == "dvi" && it->to->name == "ps")
                                command = add_options(command,
                                                      dvips_options(buffer));
 
                        lyxerr << "Calling " << command << endl;
                        if (buffer)
                                ShowMessage(buffer, _("Executing command:"), command);
-                       
+
+                       Systemcalls::Starttype type = (dummy)
+                               ? Systemcalls::SystemDontWait : Systemcalls::System;
                        Systemcalls one;
                        int res;
-                       if ((*it).original_dir && buffer) {
+                       if (it->original_dir && buffer) {
                                Path p(buffer->filepath);
-                               res = one.startscript(Systemcalls::System, command);
+                               res = one.startscript(type, command);
                        } else
-                               res = one.startscript(Systemcalls::System, command);
+                               res = one.startscript(type, command);
 
-                       if (!(*it).parselog.empty()) {
+                       if (!it->parselog.empty()) {
                                string const logfile =  infile2 + ".log";
-                               string const command2 = (*it).parselog +
+                               string const command2 = it->parselog +
                                        " < " + QuoteName(infile2 + ".out") +
                                        " > " + QuoteName(logfile);
                                one.startscript(Systemcalls::System, command2);
@@ -453,7 +515,7 @@ bool Converter::Convert(Buffer const * buffer,
                        }
 
                        if (res) {
-                               if ((*it).to->name == "program")
+                               if (it->to->name == "program")
                                        WriteAlert(_("There were errors during the Build process."),
                                                   _("You should try to fix them."));
                                else
@@ -465,23 +527,36 @@ bool Converter::Convert(Buffer const * buffer,
                }
        }
 
-       if (!(*it).result_dir.empty()) {
-               to_file = AddName(subst((*it).result_dir,
+       if (it->to->dummy())
+               return true;
+
+
+       if (!it->result_dir.empty()) {
+               to_file = AddName(subst(it->result_dir,
                                        "$$BaseName", to_base),
-                                 subst((*it).result_file,
+                                 subst(it->result_file,
                                        "$$BaseName", OnlyFilename(to_base)));
                if (from_base != to_base) {
-                       string from = subst((*it).result_dir,
+                       string from = subst(it->result_dir,
                                            "$$BaseName", from_base);
-                       string to = subst((*it).result_dir,
+                       string to = subst(it->result_dir,
                                          "$$BaseName", to_base);
-                       return lyx::rename(from, to);
+                       if (!lyx::rename(from, to)) {
+                               WriteAlert(_("Error while trying to move directory:"),
+                                          from, ("to ") + to);
+                               return false;
+                       }
                }
-       } else if (outfile != to_file)
-               if ((*it).latex)
-                       return lyx::copy(outfile, to_file);
-               else
-                       return lyx::rename(outfile, to_file);
+       } else if (outfile != to_file) {
+               bool moved = (it->latex)
+                       ? lyx::copy(outfile, to_file)
+                       : lyx::rename(outfile, to_file);
+               if (!moved) {
+                       WriteAlert(_("Error while trying to move file:"),
+                                  outfile, _("to ") + to_file);
+                       return false;
+               }
+       }
 
         return true;
 }
@@ -702,3 +777,9 @@ string const Converter::dvips_options(Buffer const * buffer)
 void Converter::init()
 {
 }
+
+/// The global instance
+Formats formats;
+
+// The global copy of the system lyxrc entries (everything except preferences)
+Formats system_formats;
index 91f1444aff805b502ae7f41f6a395360188fdcdc..37ac7d5ca56965916720960c161b503696783527 100644 (file)
@@ -29,8 +29,9 @@ public:
        Format() {}
        ///
        Format(string const & n, string const & e, string const & p,
-              string const & s) :
-               name(n), extension(e), prettyname(p), shortcut(s) {};
+              string const & s, string const & v) :
+               name(n), extension(e), prettyname(p), shortcut(s),
+               viewer(v) {};
        ///
        string name;
        ///
@@ -41,13 +42,19 @@ public:
        string shortcut;
        ///
        string viewer;
+       ///
+       bool dummy() const;
+       ///
+       string const getname() const {
+               return name;
+       }
 };
 
 ///
 struct Command {
        ///
        Command(Format const * f, Format const * t, string const & c)
-               : from(f), to(t), command(c),
+               : from(f), to(t), command(c), importer(false), 
                  latex(false), original_dir(false), need_aux(false) {}
        ///
        Format const * from;
@@ -55,6 +62,8 @@ struct Command {
        Format const * to;
        ///
        string command;
+       /// The converter is used for importing
+       bool importer;
        /// The converter is latex or its derivatives
        bool latex;
        /// Do we need to run the converter in the original directory?
@@ -94,33 +103,29 @@ public:
 ///
 class Formats {
 public:
+        ///
+        typedef std::map<string, Format> FormatList;
        ///
-       static
        void Add(string const & name);
        ///
-       static
        void Add(string const & name, string const & extension, 
                 string const & prettyname, string const & shortcut);
        ///
-       static
        void SetViewer(string const & name, string const & command);
        ///
-       static
        bool View(Buffer const * buffer, string const & filename,
                  string const & format_name);
        ///
-       static
        Format * GetFormat(string const & name);
        ///
-       static
        string const PrettyName(string const & name);
        ///
-       static
        string const Extension(string const & name);
+       ///
+       std::vector<Format> const GetAllFormats();
 private:
        ///
-       static
-       std::map<string, Format> formats;
+       FormatList formats;
 };
 
 ///
@@ -131,12 +136,12 @@ public:
        void Add(string const & from, string const & to,
                 string const & command, string const & flags);
        ///
-       
+       static
+       std::vector<FormatPair> const GetReachableTo(string const & target);
        ///
        static
        std::vector<FormatPair> const
-       GetReachable(string const & from, string const & stop_format,
-                    bool only_viewable);
+       GetReachable(string const & from, bool only_viewable);
        ///
        static
        bool IsReachable(string const & from, string const & to);
@@ -180,4 +185,8 @@ private:
        string latex_command;
 };
 
+extern Formats formats;
+extern Formats system_formats;
+
+
 #endif
index a5ebfbe540d647383d72bdbb48c81dccf36183eb..df330952c71c9e0c651df808228c3af8ac3070dd 100644 (file)
@@ -37,7 +37,7 @@ bool Exporter::Export(Buffer * buffer, string const & format0,
        if (!buffer->tmppath.empty())
                filename = AddName(buffer->tmppath, filename);
        filename = ChangeExtension(filename, 
-                                  Formats::Extension(backend_format));
+                                  formats.Extension(backend_format));
 
        // Ascii backend
        if (backend_format == "text")
@@ -65,7 +65,7 @@ bool Exporter::Export(Buffer * buffer, string const & format0,
        if (!put_in_tempdir)
                ShowMessage(buffer,
                            _("Document exported as ")
-                           + Formats::PrettyName(format)
+                           + formats.PrettyName(format)
                            + _(" to file `")
                            + MakeDisplayPath(result_file) +'\'');
        return true;
@@ -85,7 +85,7 @@ bool Exporter::Preview(Buffer * buffer, string const & format0)
                return false;
        string format;
        Converter::SplitFormat(format0, format);
-       return Formats::View(buffer, result_file, format);
+       return formats.View(buffer, result_file, format);
 }
 
 
@@ -97,24 +97,12 @@ bool Exporter::IsExportable(Buffer const * buffer, string const & format)
 
 
 vector<FormatPair> const
-Exporter::GetExportableFormats(Buffer const * buffer)
+Exporter::GetExportableFormats(Buffer const * buffer, bool only_viewable)
 {
        vector<FormatPair> result = 
-               Converter::GetReachable(BufferFormat(buffer), "lyx", false);
-       Format * format = Formats::GetFormat("text");
-       if (format)
-               result.push_back(FormatPair(format , 0, ""));
-       return result;
-}
-
-
-vector<FormatPair> const
-Exporter::GetViewableFormats(Buffer const * buffer)
-{
-       vector<FormatPair> result = 
-               Converter::GetReachable(BufferFormat(buffer), "lyx", true);
-       Format * format = Formats::GetFormat("text");
-       if (format && !format->viewer.empty())
+               Converter::GetReachable(BufferFormat(buffer), only_viewable);
+       Format * format = formats.GetFormat("text");
+       if (format && (!only_viewable || !format->viewer.empty()))
                result.push_back(FormatPair(format , 0, ""));
        return result;
 }
index 43a2ee2ef4c281806859140e40ce68a59704ed13..76a3257ea88d134a5933ce85cabc6d5c7f00b689 100644 (file)
@@ -41,11 +41,9 @@ public:
        ///
        static
        std::vector<FormatPair> const
-       GetExportableFormats(Buffer const * buffer);
+       GetExportableFormats(Buffer const * buffer, bool only_viewable);
        ///
-       static
-       std::vector<FormatPair> const
-       GetViewableFormats(Buffer const * buffer);
+       
        ///
        static
        string const BufferFormat(Buffer const * buffer);
index b7b3b5e13be5ac9775bb702a7ceac81eca758c4e..3724c564b05b93f19a880afd19c4f67eeeb5de49 100644 (file)
@@ -29,6 +29,9 @@
 #include "input_validators.h"
 #include "xform_helpers.h" // formatted()
 #include "xform_macros.h"
+#include "converter.h"
+#include "support/lyxfunctional.h"
+
 
 #ifdef SIGC_CXX_NAMESPACES
 using SigC::slot;
@@ -39,6 +42,7 @@ using std::getline;
 using std::istream;
 using std::pair;
 using std::vector;
+using std::find_if;
 
 extern string fmt(char const * fmtstr ...);
 extern Languages languages;
@@ -48,7 +52,6 @@ typedef pair<string, FormPreferences::RGB> X11Colour;
 static vector<X11Colour> colourDB;
 static string const colourFile("/usr/lib/X11/rgb.txt");
 
-
 FormPreferences::FormPreferences(LyXView * lv, Dialogs * d)
        : FormBaseBI(lv, d, _("Preferences"), new PreferencesPolicy),
          dialog_(0),
@@ -296,30 +299,24 @@ void FormPreferences::feedback( FL_OBJECT * ob )
 
 bool FormPreferences::input(FL_OBJECT * ob, long)
 {
-       bool activate = true;
-
        // whatever checks you need to ensure the user hasn't entered
        // some totally ridiculous value somewhere.  Change activate to suit.
        // comments before each test describe what is _valid_
 
-       if (ob->form->fdui == colours_) {
-               if (! inputColours( ob ) )
-                       activate = false;
-       } else if (ob->form->fdui == language_) {
-               if (! inputLanguage( ob ) )
-                       activate = false;
-       } else if (ob->form->fdui == paths_) {
-               if (! inputPaths( ob ) )
-                       activate = false;
-       } else if (ob->form->fdui == screen_fonts_) {
-               if (! inputScreenFonts() )
-                       activate = false;
-       } else if (ob->form->fdui == spellchecker_) {
-               if (! inputSpellChecker( ob ) )
-                       activate = false;
-       }
+       if (ob->form->fdui == colours_)
+               return inputColours(ob);
+       else if (ob->form->fdui == language_)
+               return inputLanguage(ob);
+       else if (ob->form->fdui == paths_)
+               return inputPaths(ob);
+       else if (ob->form->fdui == screen_fonts_)
+               return inputScreenFonts();
+       else if (ob->form->fdui == spellchecker_)
+               return inputSpellChecker(ob);
+       else if (ob->form->fdui == formats_)
+               return inputFormats(ob);
 
-       return activate;
+       return true;
 }
 
 
@@ -595,7 +592,23 @@ void FormPreferences::updateConverters()
 
 
 void FormPreferences::applyFormats() const
-{}
+{
+       vector<Format> old = formats.GetAllFormats();
+       for (vector<Format>::const_iterator it = old.begin();
+            it != old.end(); ++it)
+               if (find_if(formats_vec.begin(),formats_vec.end(),
+                           compare_memfun(&Format::getname, it->name))
+                   == formats_vec.end()) {
+                       formats.Add(it->name, string(), string(), string());
+               }
+
+       for (vector<Format>::const_iterator it = formats_vec.begin();
+            it != formats_vec.end(); ++it) {
+               formats.Add(it->name, it->extension, it->prettyname, 
+                           it->shortcut);
+               formats.SetViewer(it->name, it->viewer);
+       }
+}
 
 
 void FormPreferences::buildFormats()
@@ -608,6 +621,11 @@ void FormPreferences::buildFormats()
        fl_set_input_return(formats_->input_extension, FL_RETURN_CHANGED);
 
        fl_set_input_filter(formats_->input_format, fl_lowercase_filter);
+
+       formats_vec = formats.GetAllFormats();
+       for (vector<Format>::const_iterator it = formats_vec.begin();
+            it != formats_vec.end(); ++it)
+               fl_addto_browser(formats_->browser_formats, it->name.c_str());
 }
 
 
@@ -619,8 +637,40 @@ string const FormPreferences::feedbackFormats( FL_OBJECT const * const ) const
 }
 
 
-bool FormPreferences::inputFormats( FL_OBJECT const * const )
+bool FormPreferences::inputFormats(FL_OBJECT const * const ob)
 {
+       if (ob == formats_->browser_formats) {
+               int i = fl_get_browser(formats_->browser_formats);
+               if (i > 0) {
+                       Format const & f = formats_vec[i-1];
+                       fl_set_input(formats_->input_format, f.name.c_str());
+                       fl_set_input(formats_->input_gui_name, f.prettyname.c_str());
+                       fl_set_input(formats_->input_extension, f.extension.c_str());
+                       fl_set_input(formats_->input_viewer, f.viewer.c_str());
+               }
+       } else if (ob == formats_->button_add) {
+               string name = fl_get_input(formats_->input_format);
+               string prettyname = fl_get_input(formats_->input_gui_name);
+               string extension = fl_get_input(formats_->input_extension);
+               string viewer =  fl_get_input(formats_->input_viewer);
+               string shortcut;
+               if (prettyname.empty())
+                       return false;
+               Format format(name, extension, prettyname, shortcut, viewer);
+               vector<Format>::iterator it = find_if(formats_vec.begin(),
+                                                     formats_vec.end(),
+                                                     compare_memfun(&Format::getname, name));
+               if (it == formats_vec.end()) {
+                       formats_vec.push_back(format);
+                       fl_add_browser_line(formats_->browser_formats, 
+                                           name.c_str());
+               } else {
+                       //if (*it == format)
+                       //      return false;
+                       *it = format;
+               }
+               return true;
+       }
        return true;
 }
 
index 8abec739bdc6d68cbbca6ca66a2f91f338a46f77..538946d36323f17971b1532ab2e10ab75632b00a 100644 (file)
@@ -39,7 +39,8 @@ struct FD_form_preferences;
 struct FD_form_printer;
 struct FD_form_screen_fonts;
 struct FD_form_spellchecker;
-class  Combox;
+class Combox;
+class Format;
 
 /** This class provides an XForms implementation of the FormPreferences Dialog.
     The preferences dialog allows users to set/save their preferences.
@@ -309,6 +310,9 @@ private:
        Combox * combo_kbmap_2;
        ///
        FL_OBJECT * feedbackObj;
+       ///
+       std::vector<Format> formats_vec;
+
 };
 
 
index 07fc2cabbfe7f64cedea7d98a9fadd8c2792e085..cbc31742698138b36b1e6b996f7cb1c59728518c 100644 (file)
@@ -608,6 +608,7 @@ int Menubar::Pimpl::create_submenu(Window win, LyXView * view,
                case MenuItem::ViewFormats:
                case MenuItem::UpdateFormats:
                case MenuItem::ExportFormats:
+               case MenuItem::ImportFormats:
                        lyxerr << "Menubar::Pimpl::create_submenu: "
                                "this should not happen" << endl;
                        break;
index cd2225d6a6de509d595fef76248e631ca712fbe4..3a213a29f50caf7a12de95b35cd2a3cc929929d5 100644 (file)
@@ -462,7 +462,7 @@ FD_form_converters * FormPreferences::build_converters()
   fdui->form = fl_bgn_form(FL_NO_BOX, 450, 360);
   fdui->form->u_vdata = this;
   obj = fl_add_box(FL_FLAT_BOX, 0, 0, 450, 360, "");
-  fdui->browser_converters = obj = fl_add_browser(FL_NORMAL_BROWSER, 30, 30, 160, 270, idex(_("All converters|#A")));
+  fdui->browser_converters = obj = fl_add_browser(FL_HOLD_BROWSER, 30, 30, 160, 270, idex(_("All converters|#A")));
     fl_set_button_shortcut(obj, scex(_("All converters|#A")), 1);
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_lalign(obj, FL_ALIGN_TOP);
@@ -510,7 +510,7 @@ FD_form_formats * FormPreferences::build_formats()
   fdui->form = fl_bgn_form(FL_NO_BOX, 450, 360);
   fdui->form->u_vdata = this;
   obj = fl_add_box(FL_FLAT_BOX, 0, 0, 450, 360, "");
-  fdui->browser_formats = obj = fl_add_browser(FL_NORMAL_BROWSER, 30, 30, 160, 270, idex(_("All formats|#A")));
+  fdui->browser_formats = obj = fl_add_browser(FL_HOLD_BROWSER, 30, 30, 160, 270, idex(_("All formats|#A")));
     fl_set_button_shortcut(obj, scex(_("All formats|#A")), 1);
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_lalign(obj, FL_ALIGN_TOP);
index 796851c97cfcf3be8935440f162c1d726152591f..cb0479796025b6f48a004db1d2f6546975cb0d72 100644 (file)
@@ -1357,7 +1357,7 @@ argument:
 
 --------------------
 class: FL_BROWSER
-type: NORMAL_BROWSER
+type: HOLD_BROWSER
 box: 30 30 160 270
 boxtype: FL_DOWN_BOX
 colors: FL_COL1 FL_YELLOW
@@ -1489,7 +1489,7 @@ argument:
 
 --------------------
 class: FL_BROWSER
-type: NORMAL_BROWSER
+type: HOLD_BROWSER
 box: 30 30 160 270
 boxtype: FL_DOWN_BOX
 colors: FL_COL1 FL_YELLOW
index a82b9deb1b011417d151510b919bfa770361a0a0..d4f5c9bc6de0f4a329852fe5dca11ed08bdf0977 100644 (file)
@@ -1902,7 +1902,7 @@ void InsetFig::Preview(string const & p)
            tfname += ".eps";
        string buf1 = OnlyPath(owner->fileName());
        string buf2 = MakeAbsPath(tfname, buf1);
-       if (!Formats::View(owner, buf2, "eps"))
+       if (!formats.View(owner, buf2, "eps"))
                lyxerr << "Can't view " << buf2 << endl;
 }
 
index 324f2000c6fbc7c717b1abff70c2bb7cc657b0c5..3c8b6845f5a983847568efec024dc8fe7090a0ce 100644 (file)
@@ -400,6 +400,8 @@ void LyX::init(int */*argc*/, char **argv, bool gui)
 
        ReadRcFile("lyxrc.defaults");
        system_lyxrc = lyxrc;
+       system_formats = formats;
+
        // If there is a preferences file we read that instead
        // of the old lyxrc file.
        if (!ReadRcFile("preferences"))
index 893dc3b65217b0a7f9e8fb5e465e71f585abb346..1e4c7d1d64057af9d40f76061f92eaf6b710a7e3 100644 (file)
@@ -345,6 +345,11 @@ LyXFunc::func_status LyXFunc::getStatus(int ac) const
                disable = !Exporter::IsExportable(buf, "ps")
                        || lyxrc.fax_command == "none";
                break;
+#else
+       case LFUN_EXPORT:
+               disable = argument == "fax" &&
+                       !Exporter::IsExportable(buf, argument);
+               break;
 #endif
        case LFUN_IMPORT:
                disable = !Importer::IsImportable(argument);
@@ -3149,10 +3154,10 @@ void LyXFunc::doImport(string const & argument)
                fileDlg.SetButton(0, _("Documents"), lyxrc.document_path);
                fileDlg.SetButton(1, _("Examples"), 
                                        AddPath(system_lyxdir, "examples"));
-               string text = _("Select ") + Formats::PrettyName(format)
+               string text = _("Select ") + formats.PrettyName(format)
                        + _(" file to import");
                string format2 = (format == "textparagraph") ? "text" : format;
-               string extension = "*." + Formats::Extension(format2);
+               string extension = "*." + formats.Extension(format2);
                filename = fileDlg.Select(text, initpath, extension);
                AllowInput(owner->view());
  
index 36ba4f501c81342ed88d793bde7de900eee258bc..f653cf01b7c3393871b243d073ca561500917579 100644 (file)
@@ -37,10 +37,7 @@ using std::ofstream;
 using std::cout;
 using std::ios;
 using std::endl;
-
-// this is crappy... why are those colors command line arguments and
-// not in lyxrc?? (Matthias) 
-// Because nobody put them there. (Asger)
+using std::vector;
 
 extern LyXAction lyxaction;
 extern kb_keymap * toplevel_keymap;
@@ -871,7 +868,7 @@ int LyXRC::read(string const & filename)
                                format = lexrc.GetString();
                        if (lexrc.next())
                                command = lexrc.GetString();
-                       Formats::SetViewer(format, command);
+                       formats.SetViewer(format, command);
                        break;
                }
                case RC_FORMAT: {
@@ -884,7 +881,7 @@ int LyXRC::read(string const & filename)
                                prettyname = lexrc.GetString();
                        if (lexrc.next())
                                shortcut = lexrc.GetString();
-                       Formats::Add(format, extension, prettyname, shortcut);
+                       formats.Add(format, extension, prettyname, shortcut);
                        break;
                }
                case RC_DEFAULT_LANGUAGE:
@@ -1473,6 +1470,44 @@ void LyXRC::output(ostream & os) const
                if (default_language != system_lyxrc.default_language) {
                        os << "\\default_language " << default_language << "\n";
                }
+
+               os << "\n#\n"
+                  << "# FORMATS SECTION ##########################\n"
+                  << "#\n\n";
+
+       case RC_FORMAT: {
+               vector<Format> formats_vec = formats.GetAllFormats();
+               vector<Format> sys_formats_vec = system_formats.GetAllFormats();
+               for (vector<Format>::const_iterator it = formats_vec.begin();
+                    it != formats_vec.end(); ++it) {
+                       Format const * format = system_formats.GetFormat(it->name);
+                       if (!format || format->extension != it->extension ||
+                           format->prettyname != it->prettyname ||
+                           format->shortcut != it->shortcut)
+                               os << "\\format \"" << it->name << "\" \""
+                                  << it->extension << "\" \""
+                                  << it->prettyname << "\" \""
+                                  << it->shortcut << "\"\n";
+               }
+
+               for (vector<Format>::const_iterator it = sys_formats_vec.begin();
+                    it != sys_formats_vec.end(); ++it)
+                       if (!formats.GetFormat(it->name))
+                               os << "\\format \"" << it->name 
+                                  << "\" \"\" \"\" \"\"\n";
+       }
+       case RC_VIEWER: {
+               vector<Format> formats_vec = formats.GetAllFormats();
+               for (vector<Format>::const_iterator it = formats_vec.begin();
+                    it != formats_vec.end(); ++it) {
+                       Format const * format = system_formats.GetFormat(it->name);
+                       if ((!format || format->viewer != it->viewer) &&
+                           (format || !it->viewer.empty()))
+                               os << "\\viewer \"" << it->name << "\" \""
+                                  << it->viewer << "\"\n";
+               }
+       }
+
        }
        os.flush();
 }
index bd619347e0c46b809b37419e8fd27aba38ca7024..97c4ca0562348920f7a8ccc4a5d78a6a8d5f54c5 100644 (file)
@@ -6,5 +6,7 @@
 
 bool lyx::rename(string const & from, string const & to)
 {
-       return ::rename(from.c_str(), to.c_str()) != -1;
+       if (::rename(from.c_str(), to.c_str()) == -1)
+               return lyx::copy(from, to);
+       return true;
 }