Hi,
The attached patch adds 'buffer name', 'buffer path', 'buffer class'
to InsetInfo. It is request at our feature poll. Note that this make
InsetInfo somewhat useful to normal users, and we may need to add a
menu item or shortcut for info-insert when 1.6.0 is released.
The patch (for 1.6.x of course) will be submitted tomorrow if there is
no objection.
Cheers,
Bo
http://wiki.lyx.org/LyX/FeaturePoll
New insets
* Insert the document filename. When printing, this thing resolves
to the name (and optionally path) of the LyX file. Very useful for
"Our ref:".
o Helge Hafting
o Rudi Gaelzer
o Hellmut Weber
Index: src/insets/InsetInfo.cpp
===================================================================
--- src/insets/InsetInfo.cpp (revision 22196)
+++ src/insets/InsetInfo.cpp (working copy)
@@ -14,6 +14,7 @@
#include <sstream>
#include <stack>
+#include "Buffer.h"
#include "BufferParams.h"
#include "BufferView.h"
#include "support/debug.h"
@@ -31,6 +32,7 @@
#include "TextClassList.h"
#include "support/docstream.h"
+#include "support/FileName.h"
#include "support/lstrings.h"
#include "support/ExceptionMessage.h"
@@ -41,7 +43,7 @@
InsetInfo::InsetInfo(BufferParams const & bp, string const & name)
- : InsetText(bp), type_(UNKNOWN_INFO), name_(), bp_(bp),
+ : InsetText(bp), type_(UNKNOWN_INFO), name_(),
mouse_hover_(false)
{
setAutoBreakRows(true);
@@ -80,6 +82,7 @@
translator.addPair(InsetInfo::PACKAGE_INFO, "package");
translator.addPair(InsetInfo::TEXTCLASS_INFO, "textclass");
translator.addPair(InsetInfo::MENU_INFO, "menu");
+ translator.addPair(InsetInfo::BUFFER_INFO, "buffer");
return translator;
}
@@ -95,7 +98,7 @@
-void InsetInfo::read(Buffer const &, Lexer & lex)
+void InsetInfo::read(Buffer const & buf, Lexer & lex)
{
string token;
while (lex.isOK()) {
@@ -117,7 +120,7 @@
_("Missing \\end_inset at this point."),
from_utf8(token));
}
- updateInfo();
+ updateInfo(buf);
}
@@ -157,24 +160,25 @@
string type;
name_ = trim(split(name, type, ' '));
type_ = nameTranslator().find(type);
- updateInfo();
}
-void InsetInfo::updateInfo()
+void InsetInfo::updateInfo(Buffer const & buf)
{
InsetText::clear();
+ BufferParams const & bp = buf.params();
+
switch (type_) {
case UNKNOWN_INFO:
setText(_("Unknown Info: ") + from_utf8(name_),
- bp_.getFont(), false);
+ bp.getFont(), false);
break;
case SHORTCUT_INFO: {
FuncRequest func = lyxaction.lookupFunc(name_);
if (func.action != LFUN_UNKNOWN_ACTION)
setText(theTopLevelKeymap().printBindings(func),
- bp_.getFont(), false);
+ bp.getFont(), false);
break;
}
case LYXRC_INFO: {
@@ -186,33 +190,33 @@
// remove \n and ""
result = rtrim(result, "\n");
result = trim(result, "\"");
- setText(from_utf8(result), bp_.getFont(), false);
+ setText(from_utf8(result), bp.getFont(), false);
break;
}
case PACKAGE_INFO:
// check in packages.lst
setText(LaTeXFeatures::isAvailable(name_) ? _("yes") : _("no"),
- bp_.getFont(), false);
+ bp.getFont(), false);
break;
case TEXTCLASS_INFO: {
// name_ is the class name
pair<bool, lyx::textclass_type> pp =
textclasslist.numberOfClass(name_);
setText(pp.first ? _("yes") : _("no"),
- bp_.getFont(), false);
+ bp.getFont(), false);
break;
}
case MENU_INFO: {
stack<docstring> names;
FuncRequest func = lyxaction.lookupFunc(name_);
if (func.action == LFUN_UNKNOWN_ACTION) {
- setText(_("No menu entry for "), bp_.getFont(), false);
+ setText(_("No menu entry for "), bp.getFont(), false);
break;
}
// iterate through the menubackend to find it
Menu menu = menubackend.getMenubar();
if (!menu.searchFunc(func, names)) {
- setText(_("No menu entry for "), bp_.getFont(), false);
+ setText(_("No menu entry for "), bp.getFont(), false);
break;
}
// if find, return its path.
@@ -225,12 +229,23 @@
info.insertInset(0, new InsetSpecialChar(InsetSpecialChar::MENU_SEPARATOR),
Change(Change::UNCHANGED));
for (i = 0; i < names.top().length(); ++i)
- info.insertChar(i, names.top()[i], bp_.getFont(), false);
+ info.insertChar(i, names.top()[i], bp.getFont(), false);
names.pop();
}
break;
}
+ case BUFFER_INFO: {
+ if (name_ == "name")
+ setText(from_utf8(buf.fileName().onlyFileName()), bp.getFont(), false);
+ else if (name_ == "path")
+ setText(from_utf8(buf.filePath()), bp.getFont(), false);
+ else if (name_ == "class")
+ setText(from_utf8(bp.getTextClass().name()), bp.getFont(), false);
+ else
+ setText(_("Unknown buffer info"), bp.getFont(), false);
+ break;
}
+ }
// remove indent
paragraphs().begin()->params().noindent(true);
}
Index: src/insets/InsetInfo.h
===================================================================
--- src/insets/InsetInfo.h (revision 22196)
+++ src/insets/InsetInfo.h (working copy)
@@ -29,8 +29,8 @@
This inset has two arguments: the type and argument of the information. The
screen and latex output is the content of the information. An InsetInfo can
-have type "shortcut", "lyxrc", "package", "textclass", or "menu". Arguments
-and outputs vary by type.
+have type "shortcut", "lyxrc", "package", "textclass", "menu", or "buffer".
+Arguments and outputs vary by type.
shortcut: argument of this type of InsetInfo is the name of the LFUN such as
"math-insert \alpha". The syntax is the same as what is used in the bind
@@ -52,9 +52,10 @@
triggers this LFUN. For example, "File > Paste", where '>' is actually
\lyxarrow (an InsetSpecialChar).
+buffer: argument can be one of "name", "path", "class". This inset output the
+ filename, path, and textclass of this buffer.
-Because this inset is intended to be used only by document maintainers,
-there is no GUI, no menu entry for this inset. A user can define a
+There is currently no GUI, no menu entry for this inset. A user can define a
shortcut for "info-insert" (e.g. C-S-I), and
1. input the type and argument of this inset, e.g. "menu paste", in
@@ -79,6 +80,7 @@
PACKAGE_INFO, // Availability of package
TEXTCLASS_INFO, // Availability of textclass
MENU_INFO, // Which menu item is used for certain function
+ BUFFER_INFO, // Buffer related information
};
///
@@ -99,22 +101,20 @@
InsetCode lyxCode() const { return INFO_CODE; }
///
void setInfo(std::string const & info);
+ /// update info_ and text
+ void updateInfo(Buffer const &);
///
bool setMouseHover(bool mouse_hover);
private:
/// The translator between the information type enum and corresponding string.
Translator<info_type, std::string> const & nameTranslator() const;
- /// update info_ and text
- void updateInfo();
///
virtual Inset * clone() const { return new InsetInfo(*this); }
///
info_type type_;
///
std::string name_;
- /// store the buffer parameter
- BufferParams const & bp_;
///
bool mouse_hover_;
};
Index: src/Text3.cpp
===================================================================
--- src/Text3.cpp (revision 22196)
+++ src/Text3.cpp (working copy)
@@ -1279,6 +1279,7 @@
docstring ds = cur.selectionAsString(false);
cutSelection(cur, true, false);
static_cast<InsetInfo *>(inset)->setInfo(to_utf8(ds));
+ static_cast<InsetInfo *>(inset)->updateInfo(cur.bv().buffer());
}
insertInset(cur, inset);
cur.posForward();