#include "exporter.h"
#include "format.h"
#include "funcrequest.h"
+#include "FuncStatus.h"
#include "gettext.h"
#include "LaTeXFeatures.h"
#include "lyx_main.h"
#include "frontends/Alert.h"
#include "frontends/LyXView.h"
+#include "support/convert.h"
#include "support/filetools.h"
#include "support/lyxalgo.h" // lyx::count
-#include "support/lyxlib.h" // float_equal
+#include "support/lyxlib.h" // lyx::sum
+#include "support/lstrings.h"
#include "support/os.h"
#include "support/systemcall.h"
using lyx::support::FileName;
using lyx::support::float_equal;
using lyx::support::GetExtension;
-using lyx::support::getFormatFromContents;
using lyx::support::IsFileReadable;
-using lyx::support::LibFileSearch;
+using lyx::support::latex_path;
using lyx::support::OnlyFilename;
using lyx::support::rtrim;
using lyx::support::subst;
}
-auto_ptr<InsetBase> InsetGraphics::clone() const
+auto_ptr<InsetBase> InsetGraphics::doClone() const
{
return auto_ptr<InsetBase>(new InsetGraphics(*this));
}
}
-void InsetGraphics::priv_dispatch(LCursor & cur, FuncRequest & cmd)
+void InsetGraphics::doDispatch(LCursor & cur, FuncRequest & cmd)
{
switch (cmd.action) {
case LFUN_GRAPHICS_EDIT: {
Buffer const & buffer = cur.buffer();
InsetGraphicsParams p;
InsetGraphicsMailer::string2params(cmd.argument, buffer, p);
- if (!p.filename.empty()) {
+ if (!p.filename.empty())
setParams(p);
- cur.bv().update();
- }
+ else
+ cur.noUpdate();
break;
}
break;
default:
- InsetOld::priv_dispatch(cur, cmd);
+ InsetBase::doDispatch(cur, cmd);
break;
}
}
+bool InsetGraphics::getStatus(LCursor & cur, FuncRequest const & cmd,
+ FuncStatus & flag) const
+{
+ switch (cmd.action) {
+ case LFUN_GRAPHICS_EDIT:
+ case LFUN_INSET_MODIFY:
+ case LFUN_INSET_DIALOG_UPDATE:
+ flag.enabled(true);
+ return true;
+
+ default:
+ return InsetBase::getStatus(cur, cmd, flag);
+ }
+}
+
+
void InsetGraphics::edit(LCursor & cur, bool)
{
InsetGraphicsMailer(*this).showDialog(&cur.bv());
}
-InsetOld::EDITABLE InsetGraphics::editable() const
+InsetBase::EDITABLE InsetGraphics::editable() const
{
return IS_EDITABLE;
}
// before writing it to the output stream.
ostringstream options;
if (!params().bb.empty())
- options << " bb=" << rtrim(params().bb) << ",\n";
+ options << "bb=" << rtrim(params().bb) << ',';
if (params().draft)
- options << " draft,\n";
+ options << "draft,";
if (params().clip)
- options << " clip,\n";
- if (!float_equal(params().scale, 0.0, 0.05)) {
- if (!float_equal(params().scale, 100.0, 0.05))
- options << " scale=" << params().scale / 100.0
- << ",\n";
+ options << "clip,";
+ double const scl = convert<double>(params().scale);
+ if (!params().scale.empty() && !float_equal(scl, 0.0, 0.05)) {
+ if (!float_equal(scl, 100.0, 0.05))
+ options << "scale=" << scl / 100.0 << ',';
} else {
if (!params().width.zero())
- options << " width=" << params().width.asLatexString() << ",\n";
+ options << "width=" << params().width.asLatexString() << ',';
if (!params().height.zero())
- options << " height=" << params().height.asLatexString() << ",\n";
+ options << "height=" << params().height.asLatexString() << ',';
if (params().keepAspectRatio)
- options << " keepaspectratio,\n";
+ options << "keepaspectratio,";
}
// Make sure rotation angle is not very close to zero;
// a float can be effectively zero but not exactly zero.
- if (!float_equal(params().rotateAngle, 0, 0.001)) {
- options << " angle=" << params().rotateAngle << ",\n";
+ if (!params().rotateAngle.empty()
+ && !float_equal(convert<double>(params().rotateAngle), 0.0, 0.001)) {
+ options << "angle=" << params().rotateAngle << ',';
if (!params().rotateOrigin.empty()) {
- options << " origin=" << params().rotateOrigin[0];
+ options << "origin=" << params().rotateOrigin[0];
if (contains(params().rotateOrigin,"Top"))
options << 't';
else if (contains(params().rotateOrigin,"Bottom"))
options << 'b';
else if (contains(params().rotateOrigin,"Baseline"))
options << 'B';
- options << ",\n";
+ options << ',';
}
}
if (!params().special.empty())
- options << params().special << ",\n";
+ options << params().special << ',';
string opts = options.str();
- // delete last ",\n"
- return opts.substr(0, opts.size() - 2);
+ // delete last ','
+ return opts.substr(0, opts.size() - 1);
}
// Right now it only works with my version of db2latex :-)
ostringstream options;
- if (!float_equal(params().scale, 0.0, 0.05)) {
- if (!float_equal(params().scale, 100.0, 0.05))
- options << " scale=\"" << static_cast<int>( (params().scale) + 0.5 )
+ double const scl = convert<double>(params().scale);
+ if (!params().scale.empty() && !float_equal(scl, 0.0, 0.05)) {
+ if (!float_equal(scl, 100.0, 0.05))
+ options << " scale=\""
+ << static_cast<int>( (scl) + 0.5 )
<< "\" ";
} else {
if (!params().width.zero()) {
// Nothing to do...
return std::make_pair(IDENTICAL_CONTENTS, file_out);
- Mover const & mover = movers(getFormatFromContents(file_in));
+ Mover const & mover = movers(formats.getFormatFromFile(file_in));
bool const success = mover.copy(file_in, file_out);
if (!success) {
lyxerr[Debug::GRAPHICS]
}
-string const stripExtension(string const & file)
+string const stripExtensionIfPossible(string const & file)
{
// Remove the extension so the LaTeX will use whatever
// is appropriate (when there are several versions in
// This works only if the filename contains no dots besides
// the just removed one. We can fool here by replacing all
// dots with a macro whose definition is just a dot ;-)
- return subst(RemoveExtension(file), ".", "\\lyxdot ");
+ // The automatic format selection does not work if the file
+ // name is escaped.
+ string const latex_name = latex_path(file,
+ lyx::support::EXCLUDE_EXTENSION);
+ if (contains(latex_name, '"'))
+ return latex_name;
+ return latex_path(RemoveExtension(file),
+ lyx::support::PROTECT_EXTENSION,
+ lyx::support::ESCAPE_DOTS);
}
if (to_format == file_format ||
(to_format == "eps" && file_format == "ps") ||
(to_format == "ps" && file_format == "eps"))
- return stripExtension(file);
- return file;
+ return stripExtensionIfPossible(file);
+ return latex_path(file, lyx::support::EXCLUDE_EXTENSION);
}
} // namespace anon
string const InsetGraphics::prepareFile(Buffer const & buf,
OutputParams const & runparams) const
{
- // We assume that the file exists (the caller checks this)
+ // The following code depends on non-empty filenames
+ if (params().filename.empty())
+ return string();
+
string const orig_file = params().filename.absFilename();
string const rel_file = params().filename.relFilename(buf.filePath());
// of include files
Buffer const * m_buffer = buf.getMasterBuffer();
+ // Return the output name if the file does not exist.
+ // We are not going to change the extension or using the name of the
+ // temporary file, the code is already complicated enough.
+ if (!IsFileReadable(orig_file))
+ return params().filename.outputFilename(m_buffer->filePath());
+
// We place all temporary files in the master buffer's temp dir.
// This is possible because we use mangled file names.
// This is necessary for DVI export.
source_file, output_file);
// We can't strip the extension, because we don't know
// the unzipped file format
- return output_file;
+ return latex_path(output_file,
+ lyx::support::EXCLUDE_EXTENSION);
}
string const unzipped_temp_file = unzippedFileName(temp_file);
}
}
- string const from = getFormatFromContents(temp_file);
+ string const from = formats.getFormatFromFile(temp_file);
+ if (from.empty()) {
+ lyxerr[Debug::GRAPHICS]
+ << "\tCould not get file format." << endl;
+ return orig_file;
+ }
string const to = findTargetFormat(from, runparams);
string const ext = formats.extension(to);
lyxerr[Debug::GRAPHICS]
output_to_file);
runparams.exportdata->addExternalFile("dvi", to_file,
output_to_file);
- return stripExtension(output_file);
+ return stripExtensionIfPossible(output_file);
}
lyxerr[Debug::GRAPHICS]
<< "\tfile to convert = " << temp_file << '\n'
<< "\t from " << from << " to " << to << '\n';
- // if no special converter defined, then we take the default one
- // from ImageMagic: convert from:inname.from to:outname.to
- if (!converters.convert(&buf, temp_file, temp_file, from, to)) {
- string const command =
- "sh " + LibFileSearch("scripts", "convertDefault.sh") +
- ' ' + formats.extension(from) + ':' + temp_file +
- ' ' + ext + ':' + to_file;
- lyxerr[Debug::GRAPHICS]
- << "No converter defined! I use convertDefault.sh:\n\t"
- << command << endl;
- Systemcall one;
- one.startscript(Systemcall::Wait, command);
- if (IsFileReadable(to_file)) {
- runparams.exportdata->addExternalFile("latex",
- to_file, output_to_file);
- runparams.exportdata->addExternalFile("dvi",
- to_file, output_to_file);
- } else {
- string str = bformat(_("No information for converting %1$s "
- "format files to %2$s.\n"
- "Try defining a convertor in the preferences."), from, to);
- Alert::error(_("Could not convert image"), str);
- }
+ if (converters.convert(&buf, temp_file, temp_file, from, to, true)) {
+ runparams.exportdata->addExternalFile("latex",
+ to_file, output_to_file);
+ runparams.exportdata->addExternalFile("dvi",
+ to_file, output_to_file);
}
- return stripExtension(output_file);
+ return stripExtensionIfPossible(output_file);
}
lyxerr[Debug::GRAPHICS] << "\tOpts = " << opts << endl;
if (!opts.empty() && !message.empty())
- before += ("[%\n" + opts + ',' + message + ']');
+ before += ('[' + opts + ',' + message + ']');
else if (!opts.empty() || !message.empty())
- before += ("[%\n" + opts + message + ']');
+ before += ('[' + opts + message + ']');
lyxerr[Debug::GRAPHICS]
<< "\tBefore = " << before
<< "\n\tafter = " << after << endl;
-
string latex_str = before + '{';
- if (file_exists)
- // Convert the file if necessary.
- // Remove the extension so the LaTeX will use whatever
- // is appropriate (when there are several versions in
- // different formats)
- latex_str += prepareFile(buf, runparams);
- else
- latex_str += relative_file + " not found!";
-
+ // Convert the file if necessary.
+ // Remove the extension so LaTeX will use whatever is appropriate
+ // (when there are several versions in different formats)
+ latex_str += prepareFile(buf, runparams);
latex_str += '}' + after;
os << latex_str;
lyxerr[Debug::GRAPHICS] << "InsetGraphics::latex outputting:\n"
<< latex_str << endl;
// Return how many newlines we issued.
- return int(lyx::count(latex_str.begin(), latex_str.end(),'\n') + 1);
+ return int(lyx::count(latex_str.begin(), latex_str.end(),'\n'));
}
return;
features.includeFile(graphic_label,
- RemoveExtension(params().filename.absFilename()));
+ RemoveExtension(params().filename.absFilename()));
features.require("graphicx");
}
-void InsetGraphics::editGraphics(InsetGraphicsParams const & p, Buffer const & buffer) const
+void InsetGraphics::editGraphics(InsetGraphicsParams const & p,
+ Buffer const & buffer) const
{
string const file_with_path = p.filename.absFilename();
- formats.edit(buffer, file_with_path, getFormatFromContents(file_with_path));
+ formats.edit(buffer, file_with_path,
+ formats.getFormatFromFile(file_with_path));
}