Angus Leeming wrote:

> Question 2
> ==========
> Is this safe? What happens if command.size() < 50?
> 
> +       bformat(_("An error occurred whilst running %1$s"),
> +               command.substr(0, 50)));

I have replaced it with MakeDisplayPath, which works well.

> Question 4
> ==========
> Why is LyXRC::RC_EDITOR needed? Isn't this just part of the format
> definition? Ie, why not extend RC_FORMAT? (And ditch RC_VIEWER also.)

I did that. I also removed EditCommand from the external templates, it
turned out to be rather easy. Updated patch attached.


Georg
Index: lib/ChangeLog
===================================================================
RCS file: /cvs/lyx/lyx-devel/lib/ChangeLog,v
retrieving revision 1.579
diff -u -p -r1.579 ChangeLog
--- lib/ChangeLog	2004/04/06 21:07:26	1.579
+++ lib/ChangeLog	2004/04/12 19:38:50
@@ -1,3 +1,9 @@
+2004-04-12  Georg Baum  <[EMAIL PROTECTED]>
+
+	* configure.m4: merge \viewer and \format. Add editor to \format
+	* configure.m4: check for more viewers and editors
+	* external_templates: remove EditCommand
+
 2004-04-06  Georg Baum  <[EMAIL PROTECTED]>
 
 	* external_templates: use some new variables instead of $$Basename
Index: lib/configure.m4
===================================================================
RCS file: /cvs/lyx/lyx-devel/lib/configure.m4,v
retrieving revision 1.75
diff -u -p -r1.75 configure.m4
--- lib/configure.m4	2004/03/22 16:22:52	1.75
+++ lib/configure.m4	2004/04/12 19:38:54
@@ -237,6 +237,20 @@ fi
 test $latex_to_dvi != "none" && latex_to_dvi="$latex_to_dvi \$\$i"
 test $latex_to_pdf != "none" && latex_to_pdf="$latex_to_pdf \$\$i"
 
+SEARCH_PROG([for a TGIF viewer and editor], TGIF_EDITOR, tgif)
+TGIF_VIEWER="$TGIF_EDITOR"
+
+SEARCH_PROG([for a FIG viewer and editor], FIG_EDITOR, xfig)
+FIG_VIEWER="$FIG_EDITOR"
+
+SEARCH_PROG([for a FEN viewer and editor], FEN_EDITOR, xboard)
+test "$FEN" = "xboard" && FEN_EDITOR="xboard -lpf \$\$i -mode EditPosition"
+FEN_VIEWER="$FEN_EDITOR"
+
+SEARCH_PROG([for a raster image viewer], RASTERIMAGE_VIEWER, xv kview gimp)
+
+SEARCH_PROG([for a raster image editor], RASTERIMAGE_EDITOR, gimp)
+
 # Search for an installed reLyX or a ready-to-install one
 save_PATH=${PATH}
 PATH=${PATH}:./reLyX/
@@ -492,113 +560,102 @@
 # want to customize LyX, make a copy of the file LYXDIR/lyxrc as
 # ~/.lyx/lyxrc and edit this file instead. Any setting in lyxrc will
 # override the values given here.
-\\Format asciichess asc "ASCII (chess output)" ""
-\\Format asciiimage asc "ASCII (image)" ""
-\\Format asciixfig  asc "ASCII (xfig output)" ""
-\\Format agr      agr	GRACE		""
-\\Format bmp      bmp	BMP		""
-\\Format date     ""    "date command"  ""
-\\Format dateout  "tmp" "date (output)" ""
-\\Format docbook  sgml	DocBook		B
-\\Format dvi	  dvi	DVI		D
-\\Format eps	  eps	EPS		""
-\\Format fax	  ""	Fax		""
-\\Format fen      fen   FEN             ""
-\\Format fig	  fig	XFig		""
-\\Format gif	  gif	GIF		""
-\\Format html	  html	HTML		H
-\\Format jpg	  jpg	JPG		""
-\\Format latex	  tex	LaTeX		L
-\\Format linuxdoc sgml	LinuxDoc	x
-\\Format lyx      lyx	LyX		""
-\\Format lyxpreview	lyxpreview	"LyX Preview"		""
-\\Format literate nw	NoWeb		N
-\\Format pbm	  pbm	PBM		""
-\\Format pdf	  pdf  "PDF (ps2pdf)"	P
-\\Format pdf2	  pdf  "PDF (pdflatex)"	F
-\\Format pdf3	  pdf  "PDF (dvipdfm)"	m
-\\Format pdftex   pdftex_t PDFTEX       ""
-\\Format pgm	  pgm	PGM		""
-\\Format png	  png	PNG		""
-\\Format ppm	  ppm	PPM		""
-\\Format program  ""	Program		""
-\\Format ps	  ps	Postscript	t
-\\Format pstex    pstex_t PSTEX         ""
-\\Format text	  txt	ASCII		A
-\\Format textparagraph txt ASCII(paragraphs)	""
-\\Format tgif     obj	TGIF		""
-\\Format tiff     tif	TIFF		""
-\\Format word	  doc	Word		W
-\\Format xbm	  xbm	XBM		""
-\\Format xpm	  xpm	XPM		""
-
-\\converter date dateout "date +%d-%m-%Y > \$\$o" ""
-\\converter docbook dvi "$docbook_to_dvi_command" ""
-\\converter docbook html "$docbook_to_html_command" ""
-\\converter dvi pdf3 "$dvi_to_pdf_command" ""
-\\converter dvi ps "$dvi_to_ps_command" ""
-\\converter fen asciichess "python \$\$s/fen2ascii.py \$\$i \$\$o" ""
-\\converter fig pdftex "sh \$\$s/fig2pdftex.sh \$\$i \$\$o" ""
-\\converter fig pstex  "sh \$\$s/fig2pstex.sh \$\$i \$\$o" ""
-\\converter html latex "$html_to_latex_command" ""
-\\converter latex html "$latex_to_html_command" "originaldir,needaux"
-\\converter latex dvi "$latex_to_dvi" "latex"
-\\converter latex lyx "$tex_to_lyx_command" ""
-\\converter latex pdf2 "$latex_to_pdf" "latex"
-\\converter linuxdoc dvi "$linuxdoc_to_dvi_command" ""
-\\converter linuxdoc html "$linuxdoc_to_html_command" ""
-\\converter linuxdoc latex "$linuxdoc_to_latex_command" ""
-\\converter linuxdoc lyx "$linuxdoc_to_lyx_command" ""
-\\converter literate latex "$literate_to_tex_command" ""
-\\converter literate lyx "$literate_to_lyx_command" ""
-\\converter lyxpreview ppm "$lyxpreview_to_bitmap_command" ""
-\\converter ps fax "$fax_command" ""
-\\converter ps pdf "$ps_to_pdf_command" ""
-\\converter word latex "$word_to_latex_command" ""
-
-\\viewer dvi "$DVI_VIEWER"
-\\viewer html "$HTML_VIEWER"
-\\viewer pdf "$PDF_VIEWER"
-\\viewer pdf2 "$PDF_VIEWER"
-\\viewer pdf3 "$PDF_VIEWER"
-\\viewer ps "$PS_VIEWER"
-\\viewer eps "$EPS_VIEWER"
-
-$rc_entries
-\\font_encoding "$chk_fontenc"
+\\Format asciichess asc    "ASCII (chess output)"  "" ""	""
+\\Format asciiimage asc    "ASCII (image)"         "" ""	""
+\\Format asciixfig  asc    "ASCII (xfig output)"   "" ""	""
+\\Format agr        agr     GRACE                  "" ""	""
+\\Format bmp        bmp     BMP                    "" "$RASTERIMAGE_VIEWER"	"$RASTERIMAGE_EDITOR"
+\\Format date       ""     "date command"          "" ""	""
+\\Format dateout    tmp    "date (output)"         "" ""	""
+\\Format docbook    sgml    DocBook                B  ""	""
+\\Format dvi        dvi     DVI                    D  "$DVI_VIEWER"	""
+\\Format eps        eps     EPS                    "" "$EPS_VIEWER"	""
+\\Format fax        ""      Fax                    "" ""	""
+\\Format fen        fen     FEN                    "" "$FEN_VIEWER"	"$FEN_EDITOR"
+\\Format fig        fig     XFig                   "" "$FIG_VIEWER"	"$FIG_EDITOR"
+\\Format gif        gif     GIF                    "" "$RASTERIMAGE_VIEWER"	"$RASTERIMAGE_EDITOR"
+\\Format html       html    HTML                   H  "$HTML_VIEWER"	""
+\\Format jpg        jpg     JPG                    "" "$RASTERIMAGE_VIEWER"	"$RASTERIMAGE_EDITOR"
+\\Format latex      tex     LaTeX                  L  ""	""
+\\Format linuxdoc   sgml    LinuxDoc               x  ""	""
+\\Format lyx        lyx     LyX                    "" ""	""
+\\Format lyxpreview lyxpreview "LyX Preview"       "" ""	""
+\\Format literate   nw      NoWeb                  N  ""	""
+\\Format pbm        pbm     PBM                    "" "$RASTERIMAGE_VIEWER"	"$RASTERIMAGE_EDITOR"
+\\Format pdf        pdf    "PDF (ps2pdf)"          P  "$PDF_VIEWER"	""
+\\Format pdf2       pdf    "PDF (pdflatex)"        F  "$PDF_VIEWER"	""
+\\Format pdf3       pdf    "PDF (dvipdfm)"         m  "$PDF_VIEWER"	""
+\\Format pdftex     pdftex_t PDFTEX                "" ""	""
+\\Format pgm        pgm     PGM                    "" "$RASTERIMAGE_VIEWER"	"$RASTERIMAGE_EDITOR"
+\\Format png        png     PNG                    "" "$RASTERIMAGE_VIEWER"	"$RASTERIMAGE_EDITOR"
+\\Format ppm        ppm     PPM                    "" "$RASTERIMAGE_VIEWER"	"$RASTERIMAGE_EDITOR"
+\\Format program    ""      Program                "" ""	""
+\\Format ps         ps      Postscript             t  "$PS_VIEWER"	""
+\\Format pstex      pstex_t PSTEX                  "" ""	""
+\\Format text       txt     ASCII                  A  ""	""
+\\Format textparagraph txt "ASCII (paragraphs)"    "" ""	""
+\\Format tgif       obj     TGIF                   "" "$TGIF_VIEWER"	"$TGIF_EDITOR"
+\\Format tiff       tif     TIFF                   "" "$RASTERIMAGE_VIEWER"	"$RASTERIMAGE_EDITOR"
+\\Format word       doc     Word                   W  ""	""
+\\Format xbm        xbm     XBM                    "" "$RASTERIMAGE_VIEWER"	"$RASTERIMAGE_EDITOR"
+\\Format xpm        xpm     XPM                    "" "$RASTERIMAGE_VIEWER"	"$RASTERIMAGE_EDITOR"
+
+\\converter date       dateout    "date +%d-%m-%Y > \$\$o"	""
+\\converter docbook    dvi        "$docbook_to_dvi_command"	""
+\\converter docbook    html       "$docbook_to_html_command"	""
+\\converter dvi        pdf3       "$dvi_to_pdf_command"	""
+\\converter dvi        ps         "$dvi_to_ps_command"	""
+\\converter fen        asciichess "python \$\$s/fen2ascii.py \$\$i \$\$o"	""
+\\converter fig        pdftex     "sh \$\$s/fig2pdftex.sh \$\$i \$\$o"	""
+\\converter fig        pstex      "sh \$\$s/fig2pstex.sh \$\$i \$\$o"	""
+\\converter html       latex      "$html_to_latex_command"	""
+\\converter latex      html       "$latex_to_html_command"	"originaldir,needaux"
+\\converter latex      dvi        "$latex_to_dvi"	"latex"
+\\converter latex      lyx        "$tex_to_lyx_command"	""
+\\converter latex      pdf2       "$latex_to_pdf"	"latex"
+\\converter linuxdoc   dvi        "$linuxdoc_to_dvi_command"	""
+\\converter linuxdoc   html       "$linuxdoc_to_html_command"	""
+\\converter linuxdoc   latex      "$linuxdoc_to_latex_command"	""
+\\converter linuxdoc   lyx        "$linuxdoc_to_lyx_command"	""
+\\converter literate   latex      "$literate_to_tex_command"	""
+\\converter literate   lyx        "$literate_to_lyx_command"	""
+\\converter lyxpreview ppm        "$lyxpreview_to_bitmap_command"	""
+\\converter ps         fax        "$fax_command"	""
+\\converter ps         pdf        "$ps_to_pdf_command"	""
+\\converter word       latex      "$word_to_latex_command"	""
 EOF
 
 ### the graphic converter part with the predefined ones
-#### Search for tne nonstandard converting progs
+#### Search for the nonstandard converting progs
 #
 SEARCH_PROG([for an FIG -> EPS/PPM converter], FIG2DEV, fig2dev)
 if test "$FIG2DEV" = "fig2dev"; then
 cat >>$outfile <<EOF
-\\converter fig eps "fig2dev -L eps \$\$i \$\$o" ""
-\\converter fig ppm "fig2dev -L ppm \$\$i \$\$o" ""
-\\converter fig png "fig2dev -L png \$\$i \$\$o" ""
+\\converter fig        eps        "fig2dev -L eps \$\$i \$\$o" ""
+\\converter fig        ppm        "fig2dev -L ppm \$\$i \$\$o" ""
+\\converter fig        png        "fig2dev -L png \$\$i \$\$o" ""
 EOF
 fi
 
 SEARCH_PROG([for an TIFF -> PS converter], TIFF2PS, tiff2ps)
 if test "$TIFF2PS" = "tiff2ps"; then
 cat >>$outfile <<EOF
-\\converter tiff eps "tiff2ps \$\$i > \$\$o" ""
+\\converter tiff        eps         "tiff2ps \$\$i > \$\$o" ""
 EOF
 fi
 
 SEARCH_PROG([for an TGIF -> EPS/PPM converter], TGIF, tgif)
 if test "$TGIF" = "tgif"; then
 cat >>$outfile <<EOF
-\\converter tgif eps "tgif -stdout -print -color -eps \$\$i > \$\$o" ""
-\\converter tgif png "tgif -stdout -print -color -xpm \$\$i | xpmtoppm | pnmtopng > \$\$o" ""
+\\converter tgif       eps        "tgif -stdout -print -color -eps \$\$i > \$\$o" ""
+\\converter tgif       pdf        "tgif -stdout -print -color -pdf \$\$i > \$\$o" ""
 EOF
 fi
 
 SEARCH_PROG([for an EPS -> PDF converter], EPSTOPDF, epstopdf)
 if test "$EPSTOPDF" = "epstopdf"; then
 cat >>$outfile <<EOF
-\\converter eps pdf "epstopdf --outfile=\$\$o \$\$i" ""
+\\converter eps        pdf        "epstopdf --outfile=\$\$o \$\$i" ""
 EOF
 fi
 
@@ -606,13 +641,19 @@
 SEARCH_PROG([for a Grace -> Image converter], GRACE, gracebat)
 if test "$GRACE" = "gracebat"; then
 cat >>$outfile <<EOF
-\\converter agr eps "gracebat -hardcopy -printfile \$\$o -hdevice EPS \$\$i 2>/dev/null" ""
-\\converter agr png "gracebat -hardcopy -printfile \$\$o -hdevice PNG \$\$i 2>/dev/null" ""
-\\converter agr jpg "gracebat -hardcopy -printfile \$\$o -hdevice JPEG \$\$i 2>/dev/null" ""
-\\converter agr ppm "gracebat -hardcopy -printfile \$\$o -hdevice PNM \$\$i 2>/dev/null" ""
+\\converter agr        eps        "gracebat -hardcopy -printfile \$\$o -hdevice EPS \$\$i 2>/dev/null" ""
+\\converter agr        png        "gracebat -hardcopy -printfile \$\$o -hdevice PNG \$\$i 2>/dev/null" ""
+\\converter agr        jpg        "gracebat -hardcopy -printfile \$\$o -hdevice JPEG \$\$i 2>/dev/null" ""
+\\converter agr        ppm        "gracebat -hardcopy -printfile \$\$o -hdevice PNM \$\$i 2>/dev/null" ""
 EOF
 fi
 
+cat >>$outfile <<EOF
+
+$rc_entries
+\\font_encoding "$chk_fontenc"
+EOF
+
 ######## X FONTS
 # create a fonts.dir file to make X fonts available to LyX
 echo "checking for TeX fonts"
Index: lib/external_templates
===================================================================
RCS file: /cvs/lyx/lyx-devel/lib/external_templates,v
retrieving revision 1.23
diff -u -p -r1.23 external_templates
--- lib/external_templates	2004/04/06 21:07:27	1.23
+++ lib/external_templates	2004/04/12 19:38:54
@@ -38,11 +38,9 @@ Template RasterImage
 	GuiName "Bitmap: $$AbsOrRelPathParent$$Basename"
 	HelpText
 		A bitmap file.
-		This template uses Gimp for editing.
 	HelpTextEnd
 	InputFormat "*"
 	FileFilter "*.{gif,png,jpg,bmp,pbm,ppm,tga,tif,xpm,xbm}"
-	EditCommand "gimp $$Absname"
 	AutomaticProduction true
 	Transform Rotate
 	Transform Resize
@@ -90,11 +88,9 @@ Template XFig
 	GuiName "XFig: $$AbsOrRelPathParent$$Basename"
 	HelpText
 		An XFig figure.
-		This template uses XFig for editing.
 	HelpTextEnd
 	InputFormat fig
 	FileFilter "*.fig"
-	EditCommand "xfig $$Absname"
 	AutomaticProduction true
 	Transform Rotate
 	Transform Resize
@@ -157,7 +153,6 @@ Template ChessDiagram
 	HelpTextEnd
 	InputFormat fen
 	FileFilter "*.fen"
-	EditCommand "xboard -lpf $$Absname -mode EditPosition"
 	AutomaticProduction true
 	Format LaTeX
 		Product "\\loadgame{$$AbsOrRelPathMaster$$Basename}\\showboard"
Index: src/ChangeLog
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/ChangeLog,v
retrieving revision 1.1891
diff -u -p -r1.1891 ChangeLog
--- src/ChangeLog	2004/04/08 16:08:13	1.1891
+++ src/ChangeLog	2004/04/12 19:39:59
@@ -1,3 +1,8 @@
+2004-04-12  Georg Baum  <[EMAIL PROTECTED]>
+
+	* format.[Ch]: add editor to Format
+	* lyxrc.[Ch]: merge RC_FORMAT and RC_VIEWER. Add editor to Format
+	* LyXAction.C, lfuns.h, lyxfunc.C: add lfun LFUN_GRAPHICS_EDIT
 
 2004-04-08  André Pönitz  <[EMAIL PROTECTED]>
 
Index: src/LyXAction.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/LyXAction.C,v
retrieving revision 1.198
diff -u -p -r1.198 LyXAction.C
--- src/LyXAction.C	2004/04/05 18:34:33	1.198
+++ src/LyXAction.C	2004/04/12 19:40:04
@@ -325,6 +325,7 @@ void LyXAction::init()
 		{ LFUN_PARAGRAPH_APPLY, "paragraph-params-apply", Noop },
 		{ LFUN_PARAGRAPH_UPDATE, "", Noop },
 		{ LFUN_EXTERNAL_EDIT, "external-edit", Noop },
+		{ LFUN_GRAPHICS_EDIT, "graphics-edit", Noop },
 		{ LFUN_REPEAT, "repeat", NoBuffer },
 		{ LFUN_WORD_FIND, "word-find", Noop },
 		{ LFUN_WORD_REPLACE, "word-replace", Noop },
Index: src/format.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/format.C,v
retrieving revision 1.22
diff -u -p -r1.22 format.C
--- src/format.C	2004/02/06 08:23:39	1.22
+++ src/format.C	2004/04/12 19:40:12
@@ -27,6 +27,7 @@
 using lyx::support::bformat;
 using lyx::support::compare_ascii_no_case;
 using lyx::support::contains;
+using lyx::support::MakeDisplayPath;
 using lyx::support::OnlyFilename;
 using lyx::support::OnlyPath;
 using lyx::support::Path;
@@ -70,8 +71,8 @@ bool operator<(Format const & a, Format 
 }
 
 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)
+	       string const & s, string const & v, string const & ed)
+	: name_(n), extension_(e), prettyname_(p), shortcut_(s), viewer_(v), editor_(ed)
 {}
 
 
@@ -124,23 +125,22 @@ int Formats::getNumber(string const & na
 void Formats::add(string const & name)
 {
 	if (!getFormat(name))
-		add(name, name, name, string());
+		add(name, name, name, string(), string(), string());
 }
 
 
 void Formats::add(string const & name, string const & extension,
-		  string const & prettyname, string const & shortcut)
+                  string const & prettyname, string const & shortcut,
+                  string const & viewer, string const & editor)
 {
 	FormatList::iterator it =
 		find_if(formatlist.begin(), formatlist.end(),
 			FormatNamesEqual(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);
-	}
+					    shortcut, viewer, editor));
+	else
+		*it = Format(name, extension, prettyname, shortcut, viewer, editor);
 }
 
 
@@ -172,7 +172,7 @@ void Formats::setViewer(string const & n
 
 
 bool Formats::view(Buffer const & buffer, string const & filename,
-		   string const & format_name) const
+                   string const & format_name) const
 {
 	if (filename.empty())
 		return false;
@@ -183,7 +183,7 @@ bool Formats::view(Buffer const & buffer
 		format = getFormat(format->parentFormat());
 	if (!format || format->viewer().empty()) {
 // I believe this is the wrong place to show alerts, it should be done by
-// the caller (this should be "utility" code
+// the caller (this should be "utility" code)
 		Alert::error(_("Cannot view file"),
 			bformat(_("No information for viewing %1$s"),
 				prettyName(format_name)));
@@ -219,8 +219,53 @@ bool Formats::view(Buffer const & buffer
 
 	if (res) {
 		Alert::error(_("Cannot view file"),
+			     bformat(_("An error occurred whilst running %1$s"),
+			       MakeDisplayPath(command, 50)));
+		return false;
+	}
+	return true;
+}
+
+
+bool Formats::edit(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->editor().empty() &&
+	    format->isChildFormat())
+		format = getFormat(format->parentFormat());
+	if (!format || format->editor().empty()) {
+// I believe this is the wrong place to show alerts, it should be done by
+// the caller (this should be "utility" code)
+		Alert::error(_("Cannot edit file"),
+			bformat(_("No information for editing %1$s"),
+				prettyName(format_name)));
+		return false;
+	}
+
+	string command = format->editor();
+
+	if (!contains(command, token_from))
+		command += ' ' + token_from;
+
+	command = subst(command, token_from,
+			QuoteName(OnlyFilename(filename)));
+	command = subst(command, token_path, QuoteName(OnlyPath(filename)));
+	command = subst(command, token_socket, QuoteName(lyxsocket->address()));
+	lyxerr[Debug::FILES] << "Executing command: " << command << std::endl;
+	buffer.message(_("Executing command: ") + command);
+
+	Path p(OnlyPath(filename));
+	Systemcall one;
+	int const res = one.startscript(Systemcall::DontWait, command);
+
+	if (res) {
+		Alert::error(_("Cannot edit file"),
 			     bformat(_("An error occurred whilst running %1$s"),
-			       command.substr(0, 50)));
+			       MakeDisplayPath(command, 50)));
 		return false;
 	}
 	return true;
Index: src/format.h
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/format.h,v
retrieving revision 1.7
diff -u -p -r1.7 format.h
--- src/format.h	2003/10/06 15:42:15	1.7
+++ src/format.h	2004/04/12 19:40:12
@@ -21,7 +21,7 @@ class Format {
 public:
 	///
 	Format(std::string const & n, std::string const & e, std::string const & p,
-	       std::string const & s, std::string const & v);
+	       std::string const & s, std::string const & v, std::string const & ed);
 	///
 	bool dummy() const;
 	///
@@ -52,6 +52,10 @@ public:
 	void setViewer(std::string const & v) {
 		viewer_ = v;
 	}
+	///
+	std::string const & editor() const {
+		return editor_;
+	}
 private:
 	std::string name_;
 	///
@@ -62,6 +66,8 @@ private:
 	std::string shortcut_;
 	///
 	std::string viewer_;
+	///
+	std::string editor_;
 };
 
 
@@ -86,7 +92,8 @@ public:
 	void add(std::string const & name);
 	///
 	void add(std::string const & name, std::string const & extension,
-		 std::string const & prettyname, std::string const & shortcut);
+	         std::string const & prettyname, std::string const & shortcut,
+	         std::string const & viewer, std::string const & editor);
 	///
 	void erase(std::string const & name);
 	///
@@ -95,6 +102,9 @@ public:
 	void setViewer(std::string const & name, std::string const & command);
 	///
 	bool view(Buffer const & buffer, std::string const & filename,
+		  std::string const & format_name) const;
+	///
+	bool edit(Buffer const & buffer, std::string const & filename,
 		  std::string const & format_name) const;
 	///
 	std::string const prettyName(std::string const & name) const;
Index: src/lfuns.h
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/lfuns.h,v
retrieving revision 1.34
diff -u -p -r1.34 lfuns.h
--- src/lfuns.h	2004/03/31 16:50:57	1.34
+++ src/lfuns.h	2004/04/12 19:40:14
@@ -348,6 +348,7 @@ enum kb_action {
 	LFUN_BUFFERPARAMS_APPLY,
 	// 265
 	LFUN_LYXRC_APPLY,
+	LFUN_GRAPHICS_EDIT,
 
 	LFUN_LASTACTION                  // end of the table
 };
Index: src/lyxfunc.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/lyxfunc.C,v
retrieving revision 1.612
diff -u -p -r1.612 lyxfunc.C
--- src/lyxfunc.C	2004/04/07 20:20:11	1.612
+++ src/lyxfunc.C	2004/04/12 19:40:18
@@ -483,6 +483,7 @@ FuncStatus LyXFunc::getStatus(FuncReques
 	case LFUN_SET_COLOR:
 	case LFUN_MESSAGE:
 	case LFUN_EXTERNAL_EDIT:
+	case LFUN_GRAPHICS_EDIT:
 	case LFUN_ALL_INSETS_TOGGLE:
 	case LFUN_LANGUAGE_BUFFER:
 	case LFUN_TEXTCLASS_APPLY:
@@ -1257,6 +1258,12 @@ void LyXFunc::dispatch(FuncRequest const
 		case LFUN_EXTERNAL_EDIT: {
 			FuncRequest fr(action, argument);
 			InsetExternal().dispatch(view()->cursor(), fr);
+			break;
+		}
+
+		case LFUN_GRAPHICS_EDIT: {
+			FuncRequest fr(action, argument);
+			InsetGraphics().dispatch(view()->cursor(), fr);
 			break;
 		}
 
Index: src/lyxrc.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/lyxrc.C,v
retrieving revision 1.170
diff -u -p -r1.170 lyxrc.C
--- src/lyxrc.C	2004/04/08 12:55:44	1.170
+++ src/lyxrc.C	2004/04/12 19:40:24
@@ -161,6 +161,7 @@ keyword_item lyxrcTags[] = {
 	{ "\\user_email", LyXRC::RC_USER_EMAIL },
 	{ "\\user_name", LyXRC::RC_USER_NAME },
 	{ "\\view_dvi_paper_option", LyXRC::RC_VIEWDVI_PAPEROPTION },
+	// compatibility with versions older than 1.4.0 only
 	{ "\\viewer" ,LyXRC::RC_VIEWER},
 	{ "\\wheel_jump", LyXRC::RC_WHEEL_JUMP }
 };
@@ -979,6 +980,7 @@ int LyXRC::read(LyXLex & lexrc)
 			}
 			break;
 		}
+		// compatibility with versions older than 1.4.0 only
 		case RC_VIEWER: {
 			string format, command;
 			if (lexrc.next()) {
@@ -1006,6 +1008,29 @@ int LyXRC::read(LyXLex & lexrc)
 			if (lexrc.next()) {
 				shortcut = lexrc.getString();
 			}
+			string viewer, editor;
+			// Hack to ensure compatibility with versions older
+			// than 1.4.0
+			int le = lexrc.lex();
+			if (le != LyXLex::LEX_FEOF && le != LyXLex::LEX_UNDEF) {
+				viewer = lexrc.getString();
+				if (le == LyXLex::LEX_DATA) {
+					if (token(viewer, ' ', 0) == "none")
+						viewer.erase();
+					if (lexrc.next()) {
+						editor = lexrc.getString();
+						if (token(editor, ' ', 0) == "none")
+							editor.erase();
+					}
+				} else {
+					// We have got a known token.
+					// Therefore this is an old style
+					// format definition without
+					// viewer and editor.
+					lexrc.pushToken(viewer);
+					viewer.erase();
+				}
+			}
 			if (prettyname.empty()) {
 				if (converters.formatIsUsed(format)) {
 					lyxerr << "Can't delete format "
@@ -1015,7 +1040,7 @@ int LyXRC::read(LyXLex & lexrc)
 				}
 			} else {
 				formats.add(format, extension, prettyname,
-					    shortcut);
+					    shortcut, viewer, editor);
 			}
 			break;
 		}
@@ -1801,7 +1826,7 @@ void LyXRC::write(ostream & os, bool ign
 		   << "#\n\n";
 
 	case RC_FORMAT:
-		// Look for deleted formats
+		// New/modifed formats
 		for (Formats::const_iterator cit = formats.begin();
 		     cit != formats.end(); ++cit) {
 			Format const * format =
@@ -1809,29 +1834,25 @@ void LyXRC::write(ostream & os, bool ign
 			if (!format ||
 			    format->extension() != cit->extension() ||
 			    format->prettyname() != cit->prettyname() ||
-			    format->shortcut() != cit->shortcut())
+			    format->shortcut() != cit->shortcut() ||
+			    format->viewer() != cit->viewer() ||
+			    format->editor() != cit->editor())
 				os << "\\format \"" << cit->name() << "\" \""
 				   << cit->extension() << "\" \""
 				   << cit->prettyname() << "\" \""
-				   << cit->shortcut() << "\"\n";
+				   << cit->shortcut() << "\" \""
+				   << cit->viewer() << "\" \""
+				   << cit->editor() << "\"\n";
 		}
 
-		// New/modifed formats
+		// Look for deleted formats
 		for (Formats::const_iterator cit = system_formats.begin();
 		     cit != system_formats.end(); ++cit)
 			if (!formats.getFormat(cit->name()))
 				os << "\\format \"" << cit->name()
-				   << "\" \"\" \"\" \"\"\n";
+				   << "\" \"\" \"\" \"\" \"\" \"\"\n";
 	case RC_VIEWER:
-		for (Formats::const_iterator cit = formats.begin();
-		     cit != formats.end(); ++cit) {
-			Format const * format =
-				system_formats.getFormat(cit->name());
-			if ((!format || format->viewer() != cit->viewer()) &&
-			    (format || !cit->viewer().empty()))
-				os << "\\viewer \"" << cit->name() << "\" \""
-				   << cit->viewer() << "\"\n";
-		}
+		// Ignore it
 
 		os << "\n#\n"
 		   << "# CONVERTERS SECTION ##########################\n"
Index: src/frontends/controllers/ChangeLog
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/controllers/ChangeLog,v
retrieving revision 1.437
diff -u -p -r1.437 ChangeLog
--- src/frontends/controllers/ChangeLog	2004/04/07 05:28:51	1.437
+++ src/frontends/controllers/ChangeLog	2004/04/12 19:40:54
@@ -1,3 +1,7 @@
+2004-04-12  Georg Baum  <[EMAIL PROTECTED]>
+
+	* ControlGraphics.[Ch] (editGraphics): new method
+
 2004-04-07  Martin Vermeer  <[EMAIL PROTECTED]>
 
 	* ControlDocument.C: 'assign' for opening/closing branch insets
Index: src/frontends/controllers/ControlGraphics.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/controllers/ControlGraphics.C,v
retrieving revision 1.82
diff -u -p -r1.82 ControlGraphics.C
--- src/frontends/controllers/ControlGraphics.C	2004/01/08 10:59:49	1.82
+++ src/frontends/controllers/ControlGraphics.C	2004/04/12 19:40:55
@@ -133,6 +133,16 @@ bool ControlGraphics::isFilenameValid(st
 }
 
 
+void ControlGraphics::editGraphics()
+{
+	BOOST_ASSERT(params_.get());
+
+	dialog().view().apply();
+	string const lfun =
+		InsetGraphicsMailer::params2string(params(), kernel().buffer());
+	kernel().dispatch(FuncRequest(LFUN_GRAPHICS_EDIT, lfun));
+}
+
 namespace frnt {
 
 namespace {
Index: src/frontends/controllers/ControlGraphics.h
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/controllers/ControlGraphics.h,v
retrieving revision 1.24
diff -u -p -r1.24 ControlGraphics.h
--- src/frontends/controllers/ControlGraphics.h	2004/01/08 10:59:49	1.24
+++ src/frontends/controllers/ControlGraphics.h	2004/04/12 19:40:55
@@ -51,6 +51,8 @@ public:
 	bool bbChanged;
 	/// test if file exist
 	bool isFilenameValid(std::string const & fname) const;
+	/// edit file
+	void editGraphics();
 
 private:
 	///
Index: src/frontends/qt2/ChangeLog
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/qt2/ChangeLog,v
retrieving revision 1.667
diff -u -p -r1.667 ChangeLog
--- src/frontends/qt2/ChangeLog	2004/04/07 20:20:14	1.667
+++ src/frontends/qt2/ChangeLog	2004/04/12 19:41:07
@@ -1,3 +1,10 @@
+2004-04-12  Georg Baum  <[EMAIL PROTECTED]>
+
+	* QPrefsDialog.C, ui/QPrefFileformatsModule.ui: add editor to format
+	* QGraphics.[Ch]: add slotEdit()
+	* QGraphicsDialog.[Ch]: add edit_clicked()
+	* ui/QGraphicsDialogBase.ui: add Edit button
+
 2004-04-07  Alfredo Braunstein  <[EMAIL PROTECTED]>
 
 	* QLPainter.[Ch]: adjust to changes in Painter.h
Index: src/frontends/qt2/QGraphics.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/qt2/QGraphics.C,v
retrieving revision 1.44
diff -u -p -r1.44 QGraphics.C
--- src/frontends/qt2/QGraphics.C	2004/04/08 15:03:30	1.44
+++ src/frontends/qt2/QGraphics.C	2004/04/12 19:41:09
@@ -415,3 +415,9 @@ bool QGraphics::isValid()
 {
 	return !dialog_->filename->text().isEmpty();
 }
+
+
+void QGraphics::slotEdit()
+{
+	controller().editGraphics();
+}
Index: src/frontends/qt2/QGraphics.h
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/qt2/QGraphics.h,v
retrieving revision 1.15
diff -u -p -r1.15 QGraphics.h
--- src/frontends/qt2/QGraphics.h	2003/10/06 15:42:50	1.15
+++ src/frontends/qt2/QGraphics.h	2004/04/12 19:41:09
@@ -30,6 +30,8 @@ public:
 	friend class QGraphicsDialog;
 	///
 	QGraphics(Dialog &);
+public slots:
+	void slotEdit();
 protected:
 	virtual bool isValid();
 private:
Index: src/frontends/qt2/QGraphicsDialog.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/qt2/QGraphicsDialog.C,v
retrieving revision 1.23
diff -u -p -r1.23 QGraphicsDialog.C
--- src/frontends/qt2/QGraphicsDialog.C	2004/01/08 10:59:49	1.23
+++ src/frontends/qt2/QGraphicsDialog.C	2004/04/12 19:41:09
@@ -39,6 +39,8 @@ QGraphicsDialog::QGraphicsDialog(QGraphi
 		form, SLOT(slotClose()));
 	connect(restorePB, SIGNAL(clicked()),
 		form, SLOT(slotRestore()));
+	connect(editPB, SIGNAL(clicked()),
+		this, SLOT(edit_clicked()));
 }
 
 
@@ -92,4 +94,11 @@ void QGraphicsDialog::browse_clicked()
 void QGraphicsDialog::getBB_clicked()
 {
 	form_->getBB();
+}
+
+
+void QGraphicsDialog::edit_clicked()
+{
+	form_->changed();
+	form_->controller().editGraphics();
 }
Index: src/frontends/qt2/QGraphicsDialog.h
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/qt2/QGraphicsDialog.h,v
retrieving revision 1.11
diff -u -p -r1.11 QGraphicsDialog.h
--- src/frontends/qt2/QGraphicsDialog.h	2003/09/07 01:45:38	1.11
+++ src/frontends/qt2/QGraphicsDialog.h	2004/04/12 19:41:09
@@ -30,6 +30,7 @@ protected slots:
 	virtual void change_WUnit();
 	virtual void browse_clicked();
 	virtual void getBB_clicked();
+	virtual void edit_clicked();
 protected:
 	virtual void closeEvent(QCloseEvent * e);
 private:
Index: src/frontends/qt2/QPrefsDialog.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/qt2/QPrefsDialog.C,v
retrieving revision 1.32
diff -u -p -r1.32 QPrefsDialog.C
--- src/frontends/qt2/QPrefsDialog.C	2004/03/31 16:50:58	1.32
+++ src/frontends/qt2/QPrefsDialog.C	2004/04/12 19:41:10
@@ -381,6 +381,7 @@ void QPrefsDialog::switch_format(int nr)
 	fileformatsModule->extensionED->setText(toqstr(f.extension()));
 	fileformatsModule->shortcutED->setText(toqstr(f.shortcut()));
 	fileformatsModule->viewerED->setText(toqstr(f.viewer()));
+	fileformatsModule->editorED->setText(toqstr(f.editor()));
 	fileformatsModule->formatRemovePB->setEnabled(
 		!form_->converters().formatIsUsed(f.name()));
 }
@@ -407,10 +408,10 @@ void QPrefsDialog::modify_format()
 	string const extension = fromqstr(fileformatsModule->extensionED->text());
 	string const shortcut = fromqstr(fileformatsModule->shortcutED->text());
 	string const viewer = fromqstr(fileformatsModule->viewerED->text());
+	string const editor = fromqstr(fileformatsModule->editorED->text());
 
-	form_->formats().add(name, extension, prettyname, shortcut);
+	form_->formats().add(name, extension, prettyname, shortcut, viewer, editor);
 	form_->formats().sort();
-	form_->formats().setViewer(name, viewer);
 
 	fileformatsModule->formatsLB->setUpdatesEnabled(false);
 	updateFormats();
Index: src/frontends/qt2/ui/QGraphicsDialogBase.ui
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/qt2/ui/QGraphicsDialogBase.ui,v
retrieving revision 1.5
diff -u -p -r1.5 QGraphicsDialogBase.ui
--- src/frontends/qt2/ui/QGraphicsDialogBase.ui	2003/12/30 19:05:42	1.5
+++ src/frontends/qt2/ui/QGraphicsDialogBase.ui	2004/04/12 19:41:13
@@ -1117,6 +1117,25 @@
                         <bool>false</bool>
                     </property>
                 </widget>
+                <widget>
+                    <class>QPushButton</class>
+                    <property stdset="1">
+                        <name>name</name>
+                        <cstring>editPB</cstring>
+                    </property>
+                    <property stdset="1">
+                        <name>text</name>
+                        <string>&amp;Edit</string>
+                    </property>
+                    <property stdset="1">
+                        <name>autoDefault</name>
+                        <bool>false</bool>
+                    </property>
+                    <property stdset="1">
+                        <name>default</name>
+                        <bool>false</bool>
+                    </property>
+                </widget>
                 <spacer>
                     <property>
                         <name>name</name>
@@ -1455,6 +1474,7 @@
     <tabstop>draftCB</tabstop>
     <tabstop>unzipCB</tabstop>
     <tabstop>restorePB</tabstop>
+    <tabstop>editPB</tabstop>
     <tabstop>okPB</tabstop>
     <tabstop>applyPB</tabstop>
     <tabstop>closePB</tabstop>
Index: src/frontends/qt2/ui/QPrefFileformatsModule.ui
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/qt2/ui/QPrefFileformatsModule.ui,v
retrieving revision 1.6
diff -u -p -r1.6 QPrefFileformatsModule.ui
--- src/frontends/qt2/ui/QPrefFileformatsModule.ui	2003/03/28 01:21:42	1.6
+++ src/frontends/qt2/ui/QPrefFileformatsModule.ui	2004/04/12 19:41:13
@@ -159,6 +159,13 @@
                                 <cstring>viewerED</cstring>
                             </property>
                         </widget>
+                        <widget row="5"  column="1" >
+                            <class>QLineEdit</class>
+                            <property stdset="1">
+                                <name>name</name>
+                                <cstring>editorED</cstring>
+                            </property>
+                        </widget>
                         <widget row="2"  column="1" >
                             <class>QLineEdit</class>
                             <property stdset="1">
@@ -218,6 +225,21 @@
                                 <cstring>viewerED</cstring>
                             </property>
                         </widget>
+                        <widget row="5"  column="0" >
+                            <class>QLabel</class>
+                            <property stdset="1">
+                                <name>name</name>
+                                <cstring>editorLA</cstring>
+                            </property>
+                            <property stdset="1">
+                                <name>text</name>
+                                <string>Ed&amp;itor:</string>
+                            </property>
+                            <property>
+                                <name>buddy</name>
+                                <cstring>editorED</cstring>
+                            </property>
+                        </widget>
                         <widget row="0"  column="1" >
                             <class>QLineEdit</class>
                             <property stdset="1">
@@ -347,5 +369,6 @@
     <tabstop>shortcutED</tabstop>
     <tabstop>extensionED</tabstop>
     <tabstop>viewerED</tabstop>
+    <tabstop>editorED</tabstop>
 </tabstops>
 </UI>
Index: src/frontends/xforms/ChangeLog
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/xforms/ChangeLog,v
retrieving revision 1.899
diff -u -p -r1.899 ChangeLog
--- src/frontends/xforms/ChangeLog	2004/04/07 20:20:14	1.899
+++ src/frontends/xforms/ChangeLog	2004/04/12 19:41:34
@@ -1,3 +1,7 @@
+2004-04-12  Georg Baum  <[EMAIL PROTECTED]>
+
+	* FormPreferences.C, forms/form_preferences.fd: add editor to format
+	* FormGraphics.C, forms/form_graphics.fd: add Edit button
 
 2004-04-07  Alfredo Braunstein  <[EMAIL PROTECTED]>
 
Index: src/frontends/xforms/FormGraphics.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/xforms/FormGraphics.C,v
retrieving revision 1.122
diff -u -p -r1.122 FormGraphics.C
--- src/frontends/xforms/FormGraphics.C	2004/04/05 14:05:03	1.122
+++ src/frontends/xforms/FormGraphics.C	2004/04/12 19:41:36
@@ -642,7 +642,10 @@ ButtonPolicy::SMInput FormGraphics::inpu
 		setEnabled(extra_->input_subcaption,
 			   fl_get_button(extra_->check_subcaption));
 
+	} else if (ob == dialog_->button_edit) {
+		controller().editGraphics();
 	}
+
 
 	return ButtonPolicy::SMI_VALID;
 }
Index: src/frontends/xforms/FormPreferences.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/xforms/FormPreferences.C,v
retrieving revision 1.185
diff -u -p -r1.185 FormPreferences.C
--- src/frontends/xforms/FormPreferences.C	2004/03/31 18:51:10	1.185
+++ src/frontends/xforms/FormPreferences.C	2004/04/12 19:41:41
@@ -996,6 +996,7 @@ void FormPreferences::Formats::build()
 
 	fl_set_input_return(dialog_->input_format, FL_RETURN_CHANGED);
 	fl_set_input_return(dialog_->input_viewer, FL_RETURN_CHANGED);
+	fl_set_input_return(dialog_->input_editor, FL_RETURN_CHANGED);
 	fl_set_input_return(dialog_->input_shrtcut, FL_RETURN_CHANGED);
 	fl_set_input_return(dialog_->input_gui_name, FL_RETURN_CHANGED);
 	fl_set_input_return(dialog_->input_extension, FL_RETURN_CHANGED);
@@ -1010,6 +1011,7 @@ void FormPreferences::Formats::build()
 	setPrehandler(dialog_->button_add);
 	setPrehandler(dialog_->input_extension);
 	setPrehandler(dialog_->input_viewer);
+	setPrehandler(dialog_->input_editor);
 	setPrehandler(dialog_->input_shrtcut);
 }
 
@@ -1036,6 +1038,9 @@ FormPreferences::Formats::feedback(FL_OB
 	if (ob == dialog_->input_viewer)
 		return  _("The command used to launch the viewer application.");
 
+	if (ob == dialog_->input_editor)
+		return  _("The command used to launch the editor application.");
+
 	if (ob == dialog_->button_delete)
 		return  _("Remove the current format from the list of available "
 			  "formats. Note: you must then \"Apply\" the change.");
@@ -1062,7 +1067,8 @@ bool FormPreferences::Formats::input(FL_
 	    || ob == dialog_->input_gui_name
 	    || ob == dialog_->input_shrtcut
 	    || ob == dialog_->input_extension
-	    || ob == dialog_->input_viewer)
+	    || ob == dialog_->input_viewer
+	    || ob == dialog_->input_editor)
 		return Input();
 
 	if (ob == dialog_->button_add)
@@ -1109,11 +1115,11 @@ bool FormPreferences::Formats::Add()
 	string const extension = fl_get_input(dialog_->input_extension);
 	string const shortcut =  fl_get_input(dialog_->input_shrtcut);
 	string const viewer =  fl_get_input(dialog_->input_viewer);
+	string const editor =  fl_get_input(dialog_->input_editor);
 
 	Format const * old = formats().getFormat(name);
 	string const old_prettyname = old ? old->prettyname() : string();
-	formats().add(name, extension, prettyname, shortcut);
-	formats().setViewer(name, viewer);
+	formats().add(name, extension, prettyname, shortcut, viewer, editor);
 	if (!old || prettyname != old_prettyname) {
 		UpdateBrowser();
 		if (old)
@@ -1140,6 +1146,7 @@ bool FormPreferences::Formats::Browser()
 	fl_set_input(dialog_->input_shrtcut, f.shortcut().c_str());
 	fl_set_input(dialog_->input_extension, f.extension().c_str());
 	fl_set_input(dialog_->input_viewer, f.viewer().c_str());
+	fl_set_input(dialog_->input_editor, f.editor().c_str());
 
 	fl_set_object_label(dialog_->button_add,
 			    idex(_("Modify|#M")).c_str());
Index: src/frontends/xforms/forms/form_graphics.fd
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/xforms/forms/form_graphics.fd,v
retrieving revision 1.44
diff -u -p -r1.44 form_graphics.fd
--- src/frontends/xforms/forms/form_graphics.fd	2003/09/29 21:40:13	1.44
+++ src/frontends/xforms/forms/form_graphics.fd	2004/04/12 19:41:43
@@ -9,14 +9,14 @@ SnapGrid: 5
 
 =============== FORM ===============
 Name: form_graphics
-Width: 395
+Width: 490
 Height: 300
-Number of Objects: 6
+Number of Objects: 7
 
 --------------------
 class: FL_BOX
 type: FLAT_BOX
-box: 0 0 395 300
+box: 0 0 490 300
 boxtype: FL_FLAT_BOX
 colors: FL_COL1 FL_COL1
 alignment: FL_ALIGN_CENTER
@@ -34,7 +34,7 @@ argument: 
 --------------------
 class: FL_TABFOLDER
 type: TOP_TABFOLDER
-box: 0 5 395 260
+box: 0 5 490 260
 boxtype: FL_FLAT_BOX
 colors: FL_COL1 FL_COL1
 alignment: FL_ALIGN_TOP_LEFT
@@ -69,8 +69,26 @@ argument: 0
 
 --------------------
 class: FL_BUTTON
+type: NORMAL_BUTTON
+box: 100 270 90 25
+boxtype: FL_UP_BOX
+colors: FL_COL1 FL_COL1
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_NORMAL_SIZE
+lcol: FL_BLACK
+label: Edit|#E
+shortcut:
+resize: FL_RESIZE_ALL
+gravity: FL_NorthEast FL_NorthEast
+name: button_edit
+callback: C_FormDialogView_InputCB
+argument: 0
+
+--------------------
+class: FL_BUTTON
 type: RETURN_BUTTON
-box: 110 270 90 25
+box: 205 270 90 25
 boxtype: FL_UP_BOX
 colors: FL_COL1 FL_COL1
 alignment: FL_ALIGN_CENTER
@@ -88,7 +106,7 @@ argument: 0
 --------------------
 class: FL_BUTTON
 type: NORMAL_BUTTON
-box: 300 270 90 25
+box: 395 270 90 25
 boxtype: FL_UP_BOX
 colors: FL_COL1 FL_COL1
 alignment: FL_ALIGN_CENTER
@@ -106,7 +124,7 @@ argument: 0
 --------------------
 class: FL_BUTTON
 type: NORMAL_BUTTON
-box: 205 270 90 25
+box: 300 270 90 25
 boxtype: FL_UP_BOX
 colors: FL_COL1 FL_COL1
 alignment: FL_ALIGN_CENTER
@@ -123,14 +141,14 @@ argument: 0
 
 =============== FORM ===============
 Name: form_graphics_file
-Width: 395
+Width: 490
 Height: 235
 Number of Objects: 15
 
 --------------------
 class: FL_BOX
 type: FLAT_BOX
-box: 0 0 395 235
+box: 0 0 490 235
 boxtype: FL_FLAT_BOX
 colors: FL_COL1 FL_COL1
 alignment: FL_ALIGN_CENTER
@@ -148,7 +166,7 @@ argument: 
 --------------------
 class: FL_LABELFRAME
 type: ENGRAVED_FRAME
-box: 5 125 385 105
+box: 5 125 480 105
 boxtype: FL_NO_BOX
 colors: FL_BLACK FL_COL1
 alignment: FL_ALIGN_TOP_LEFT
@@ -166,7 +184,7 @@ argument: 
 --------------------
 class: FL_INPUT
 type: NORMAL_INPUT
-box: 60 10 225 25
+box: 60 10 320 25
 boxtype: FL_DOWN_BOX
 colors: FL_COL1 FL_MCOL
 alignment: FL_ALIGN_LEFT
@@ -184,7 +202,7 @@ argument: 0
 --------------------
 class: FL_BUTTON
 type: NORMAL_BUTTON
-box: 290 10 100 25
+box: 385 10 100 25
 boxtype: FL_UP_BOX
 colors: FL_COL1 FL_COL1
 alignment: FL_ALIGN_CENTER
@@ -202,7 +220,7 @@ argument: 0
 --------------------
 class: FL_LABELFRAME
 type: ENGRAVED_FRAME
-box: 5 55 385 55
+box: 5 55 480 55
 boxtype: FL_NO_BOX
 colors: FL_BLACK FL_COL1
 alignment: FL_ALIGN_TOP_LEFT
@@ -399,14 +417,14 @@ argument: 0
 
 =============== FORM ===============
 Name: form_graphics_bbox
-Width: 395
+Width: 490
 Height: 235
 Number of Objects: 10
 
 --------------------
 class: FL_BOX
 type: FLAT_BOX
-box: 0 0 395 235
+box: 0 0 490 235
 boxtype: FL_FLAT_BOX
 colors: FL_COL1 FL_COL1
 alignment: FL_ALIGN_CENTER
@@ -585,14 +603,14 @@ argument: 0
 
 =============== FORM ===============
 Name: form_graphics_extra
-Width: 395
+Width: 490
 Height: 235
 Number of Objects: 8
 
 --------------------
 class: FL_BOX
 type: FLAT_BOX
-box: 0 0 395 235
+box: 0 0 490 235
 boxtype: FL_FLAT_BOX
 colors: FL_COL1 FL_COL1
 alignment: FL_ALIGN_CENTER
Index: src/frontends/xforms/forms/form_preferences.fd
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/xforms/forms/form_preferences.fd,v
retrieving revision 1.65
diff -u -p -r1.65 form_preferences.fd
--- src/frontends/xforms/forms/form_preferences.fd	2004/03/31 18:51:11	1.65
+++ src/frontends/xforms/forms/form_preferences.fd	2004/04/12 19:41:44
@@ -1705,13 +1705,13 @@ argument: 
 =============== FORM ===============
 Name: form_preferences_formats
 Width: 450
-Height: 360
-Number of Objects: 9
+Height: 400
+Number of Objects: 10
 
 --------------------
 class: FL_BOX
 type: FLAT_BOX
-box: 0 0 450 360
+box: 0 0 450 400
 boxtype: FL_FLAT_BOX
 colors: FL_COL1 FL_COL1
 alignment: FL_ALIGN_CENTER
@@ -1835,9 +1835,27 @@ callback: C_FormDialogView_InputCB
 argument: 0
 
 --------------------
+class: FL_INPUT
+type: NORMAL_INPUT
+box: 280 230 150 30
+boxtype: FL_DOWN_BOX
+colors: FL_COL1 FL_MCOL
+alignment: FL_ALIGN_LEFT
+style: FL_NORMAL_STYLE
+size: FL_NORMAL_SIZE
+lcol: FL_BLACK
+label: Editor:|#i
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: input_editor
+callback: C_FormDialogView_InputCB
+argument: 0
+
+--------------------
 class: FL_BUTTON
 type: NORMAL_BUTTON
-box: 240 270 90 30
+box: 240 300 90 30
 boxtype: FL_UP_BOX
 colors: FL_COL1 FL_COL1
 alignment: FL_ALIGN_CENTER
@@ -1855,7 +1873,7 @@ argument: 0
 --------------------
 class: FL_BUTTON
 type: NORMAL_BUTTON
-box: 340 270 90 30
+box: 340 300 90 30
 boxtype: FL_UP_BOX
 colors: FL_COL1 FL_COL1
 alignment: FL_ALIGN_CENTER
Index: src/insets/ChangeLog
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/insets/ChangeLog,v
retrieving revision 1.999
diff -u -p -r1.999 ChangeLog
--- src/insets/ChangeLog	2004/04/08 10:09:08	1.999
+++ src/insets/ChangeLog	2004/04/12 19:42:05
@@ -1,3 +1,11 @@
+2004-04-12  Georg Baum  <[EMAIL PROTECTED]>
+
+	* ExternalTemplate.[Ch]: remove editCommand
+	* ExternalSupport.C (editExternal): use formats.edit() instead of
+	the removed editCommand template parameter
+	* insetgraphics.C (priv_dispatch): handle LFUN_GRAPHICS_EDIT
+	* insetgraphics.[Ch] (editGraphics): new method
+
 2004-04-01  Georg Baum  <[EMAIL PROTECTED]>
 
 	* insetinclude.C (validate): set/reset features.buffer_ when
Index: src/insets/ExternalSupport.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/insets/ExternalSupport.C,v
retrieving revision 1.6
diff -u -p -r1.6 ExternalSupport.C
--- src/insets/ExternalSupport.C	2004/04/06 21:07:27	1.6
+++ src/insets/ExternalSupport.C	2004/04/12 19:42:07
@@ -19,6 +19,7 @@
 #include "buffer.h"
 #include "converter.h"
 #include "debug.h"
+#include "format.h"
 
 #include "support/filetools.h"
 #include "support/forkedcall.h"
@@ -51,23 +52,9 @@ Template const * getTemplatePtr(InsetExt
 
 void editExternal(InsetExternalParams const & params, Buffer const & buffer)
 {
-	Template const * const et_ptr = getTemplatePtr(params);
-	if (!et_ptr)
-		return;
-	Template const & et = *et_ptr;
-
-	if (et.editCommand.empty())
-		return;
-
-	string const command = doSubstitution(params, buffer, et.editCommand);
-
-	support::Path p(buffer.filePath());
-	support::Forkedcall call;
-	if (lyxerr.debugging(Debug::EXTERNAL)) {
-		lyxerr << "Executing '" << command << "' in '"
-		       << buffer.filePath() << '\'' << endl;
-	}
-	call.startscript(support::Forkedcall::DontWait, command);
+	string const file_with_path = params.filename.absFilename();
+	formats.edit(buffer, file_with_path,
+	             support::getExtFromContents(file_with_path));
 }
 
 
Index: src/insets/ExternalTemplate.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/insets/ExternalTemplate.C,v
retrieving revision 1.33
diff -u -p -r1.33 ExternalTemplate.C
--- src/insets/ExternalTemplate.C	2003/10/07 22:59:58	1.33
+++ src/insets/ExternalTemplate.C	2004/04/12 19:42:08
@@ -101,7 +101,6 @@ public:
 		    << "\tHelpTextEnd\n"
 		    << "\tInputFormat " << et.inputFormat << '\n'
 		    << "\tFileFilter " << et.fileRegExp << '\n'
-		    << "\tEditCommand " << et.editCommand << '\n'
 		    << "\tAutomaticProduction " << et.automaticProduction << '\n';
 
 		typedef vector<TransformID> IDs;
@@ -298,7 +297,6 @@ void Template::readTemplate(LyXLex & lex
 		TO_HELPTEXT,
 		TO_INPUTFORMAT,
 		TO_FILTER,
-		TO_EDITCMD,
 		TO_AUTOMATIC,
 		TO_TRANSFORM,
 		TO_FORMAT,
@@ -307,7 +305,6 @@ void Template::readTemplate(LyXLex & lex
 
 	keyword_item templateoptiontags[] = {
 		{ "automaticproduction", TO_AUTOMATIC },
-		{ "editcommand", TO_EDITCMD },
 		{ "filefilter", TO_FILTER },
 		{ "format", TO_FORMAT },
 		{ "guiname", TO_GUINAME },
@@ -338,11 +335,6 @@ void Template::readTemplate(LyXLex & lex
 		case TO_FILTER:
 			lex.next(true);
 			fileRegExp = lex.getString();
-			break;
-
-		case TO_EDITCMD:
-			lex.next(true);
-			editCommand = lex.getString();
 			break;
 
 		case TO_AUTOMATIC:
Index: src/insets/ExternalTemplate.h
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/insets/ExternalTemplate.h,v
retrieving revision 1.25
diff -u -p -r1.25 ExternalTemplate.h
--- src/insets/ExternalTemplate.h	2003/10/07 22:59:58	1.25
+++ src/insets/ExternalTemplate.h	2004/04/12 19:42:08
@@ -54,8 +54,6 @@ struct Template {
 	std::string inputFormat;
 	/// A file extension regular expression for the file browser
 	std::string fileRegExp;
-	/// What command should be executed to edit the file?
-	std::string editCommand;
 	/// Should we do automatic production of the output?
 	bool automaticProduction;
 	/// A collection of transforms that we can use to transform the data.
Index: src/insets/insetgraphics.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/insets/insetgraphics.C,v
retrieving revision 1.242
diff -u -p -r1.242 insetgraphics.C
--- src/insets/insetgraphics.C	2004/04/08 15:03:31	1.242
+++ src/insets/insetgraphics.C	2004/04/12 19:42:12
@@ -190,6 +186,14 @@ void InsetGraphics::statusChanged() cons
 void InsetGraphics::priv_dispatch(LCursor & cur, FuncRequest & cmd)
 {
 	switch (cmd.action) {
+        case LFUN_GRAPHICS_EDIT: {
+		Buffer const & buffer = *cur.bv().buffer();
+		InsetGraphicsParams p;
+		InsetGraphicsMailer::string2params(cmd.argument, buffer, p);
+		editGraphics(p, buffer);
+		break;
+	}
+
 	case LFUN_INSET_MODIFY: {
 		Buffer const & buffer = cur.buffer();
 		InsetGraphicsParams p;
@@ -689,6 +701,13 @@ bool InsetGraphics::setParams(InsetGraph
 InsetGraphicsParams const & InsetGraphics::params() const
 {
 	return params_;
+}
+
+
+void InsetGraphics::editGraphics(InsetGraphicsParams const & p, Buffer const & buffer) const
+{
+	string const file_with_path = p.filename.absFilename();
+	formats.edit(buffer, file_with_path, getExtFromContents(file_with_path));
 }
 
 
Index: src/insets/insetgraphics.h
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/insets/insetgraphics.h,v
retrieving revision 1.96
diff -u -p -r1.96 insetgraphics.h
--- src/insets/insetgraphics.h	2004/03/18 12:53:39	1.96
+++ src/insets/insetgraphics.h	2004/04/12 19:42:13
@@ -79,6 +79,8 @@ public:
 	void draw(PainterInfo & pi, int x, int y) const;
 	///
 	void edit(LCursor & cur, bool left);
+	///
+	void editGraphics(InsetGraphicsParams const &, Buffer const &) const;
 protected:
 	///
 	void priv_dispatch(LCursor & cur, FuncRequest & cmd);

Reply via email to