#include "BufferView.h"
#include "Cursor.h"
#include "CutAndPaste.h"
-#include "support/debug.h"
#include "DispatchResult.h"
#include "ErrorList.h"
#include "factory.h"
#include "FuncRequest.h"
-#include "support/gettext.h"
#include "InsetList.h"
#include "Intl.h"
#include "Language.h"
#include "Paragraph.h"
#include "paragraph_funcs.h"
#include "ParagraphParameters.h"
-#include "ParIterator.h"
#include "TextClass.h"
#include "TextMetrics.h"
#include "VSpace.h"
#include "insets/InsetText.h"
#include "insets/InsetInfo.h"
-#include "support/lstrings.h"
-#include "support/lyxlib.h"
#include "support/convert.h"
+#include "support/debug.h"
+#include "support/gettext.h"
+#include "support/lstrings.h"
#include "support/lyxtime.h"
#include "mathed/InsetMathHull.h"
using cap::copySelection;
using cap::cutSelection;
using cap::pasteFromStack;
-using cap::pasteClipboard;
+using cap::pasteClipboardText;
+using cap::pasteClipboardGraphics;
using cap::replaceSelection;
// globals...
// somewhere, and an ordinary formula
// otherwise
if (sel.find(from_ascii("\\newcommand")) == string::npos
+ && sel.find(from_ascii("\\newlyxcommand")) == string::npos
&& sel.find(from_ascii("\\def")) == string::npos)
{
InsetMathHull * formula = new InsetMathHull;
cur.recordUndo();
if (cmd.action == LFUN_INDEX_INSERT) {
- docstring ds = support::subst(text->getStringToIndex(cur), '\n', ' ');
+ docstring ds = subst(text->getStringToIndex(cur), '\n', ' ');
text->insertInset(cur, inset);
if (edit)
inset->edit(cur, true);
// Now put this into inset
static_cast<InsetCollapsable *>(inset)->text_.insertStringAsParagraphs(cur, ds);
- } else {
- bool gotsel = false;
- if (cur.selection()) {
- lyx::dispatch(FuncRequest(LFUN_CUT));
- gotsel = true;
- }
- text->insertInset(cur, inset);
+ return true;
+ }
- if (edit)
- inset->edit(cur, true);
+ bool gotsel = false;
+ if (cur.selection()) {
+ lyx::dispatch(FuncRequest(LFUN_CUT));
+ gotsel = true;
+ }
+ text->insertInset(cur, inset);
- if (gotsel && pastesel) {
- lyx::dispatch(FuncRequest(LFUN_PASTE, "0"));
- InsetText * insetText = dynamic_cast<InsetText *>(inset);
- if (insetText && !insetText->allowMultiPar()
- || cur.lastpit() == 0) {
- // reset first par to default
- LayoutPtr const layout =
- cur.buffer().params().getTextClass().defaultLayout();
- cur.text()->paragraphs().begin()->layout(layout);
- cur.pos() = 0;
- cur.pit() = 0;
- // Merge multiple paragraphs -- hack
- while (cur.lastpit() > 0) {
- mergeParagraph(cur.buffer().params(),
- cur.text()->paragraphs(), 0);
- }
- } else {
- // reset surrounding par to default
- docstring const layoutname =
- cur.buffer().params().getTextClass().defaultLayoutName();
- cur.leaveInset(*inset);
- text->setLayout(cur, layoutname);
+ if (edit)
+ inset->edit(cur, true);
+
+ if (!gotsel || !pastesel)
+ return true;
+
+ lyx::dispatch(FuncRequest(LFUN_PASTE, "0"));
+ InsetText * insetText = dynamic_cast<InsetText *>(inset);
+ if (insetText && !insetText->allowMultiPar() || cur.lastpit() == 0) {
+ // reset first par to default
+ LayoutPtr const layout =
+ cur.buffer().params().getTextClass().defaultLayout();
+ cur.text()->paragraphs().begin()->layout(layout);
+ cur.pos() = 0;
+ cur.pit() = 0;
+ // Merge multiple paragraphs -- hack
+ while (cur.lastpit() > 0) {
+ mergeParagraph(cur.buffer().params(),
+ cur.text()->paragraphs(), 0);
}
- }
+ } else {
+ // reset surrounding par to default
+ docstring const layoutname =
+ cur.buffer().params().getTextClass().defaultLayoutName();
+ cur.leaveInset(*inset);
+ text->setLayout(cur, layoutname);
}
+
return true;
}
// Not found; do nothing
if (toclevel == Layout::NOT_IN_TOC || toclevel > thistoclevel)
break;
- pit_type const newpit = std::distance(bgn, dest);
- pit_type const len = std::distance(start, finish);
+ pit_type const newpit = distance(bgn, dest);
+ pit_type const len = distance(start, finish);
pit_type const deletepit = pit + len;
buf.undo().recordUndo(cur, ATOMIC_UNDO, newpit, deletepit - 1);
pars.insert(dest, start, finish);
break;
}
// One such was found:
- pit_type newpit = std::distance(bgn, dest);
- pit_type const len = std::distance(start, finish);
+ pit_type newpit = distance(bgn, dest);
+ pit_type const len = distance(start, finish);
buf.undo().recordUndo(cur, ATOMIC_UNDO, pit, newpit - 1);
pars.insert(dest, start, finish);
start = boost::next(bgn, pit);
pit_type const pit = cur.pit();
recUndo(cur, pit, pit + 1);
cur.finishUndo();
- std::swap(pars_[pit], pars_[pit + 1]);
+ swap(pars_[pit], pars_[pit + 1]);
updateLabels(cur.buffer());
needsUpdate = true;
++cur.pit();
pit_type const pit = cur.pit();
recUndo(cur, pit - 1, pit);
cur.finishUndo();
- std::swap(pars_[pit], pars_[pit - 1]);
+ swap(pars_[pit], pars_[pit - 1]);
updateLabels(cur.buffer());
--cur.pit();
needsUpdate = true;
} else {
cur.undispatched();
}
+ cur.updateFlags(Update::FitCursor);
break;
case LFUN_BUFFER_END:
} else {
cur.undispatched();
}
+ cur.updateFlags(Update::FitCursor);
break;
case LFUN_CHAR_FORWARD:
charsTranspose(cur);
break;
- case LFUN_PASTE:
+ case LFUN_PASTE: {
cur.message(_("Paste"));
cap::replaceSelection(cur);
- if (cmd.argument().empty() && !theClipboard().isInternal())
- pasteClipboard(cur, bv->buffer().errorList("Paste"));
- else {
- string const arg(to_utf8(cmd.argument()));
+
+ // without argument?
+ string const arg = to_utf8(cmd.argument());
+ if (arg.empty()) {
+ if (theClipboard().isInternal())
+ pasteFromStack(cur, bv->buffer().errorList("Paste"), 0);
+ else if (theClipboard().hasGraphicsContents())
+ pasteClipboardGraphics(cur, bv->buffer().errorList("Paste"));
+ else
+ pasteClipboardText(cur, bv->buffer().errorList("Paste"));
+ } else if (isStrUnsignedInt(arg)) {
+ // we have a numerical argument
pasteFromStack(cur, bv->buffer().errorList("Paste"),
- isStrUnsignedInt(arg) ?
- convert<unsigned int>(arg) :
- 0);
+ convert<unsigned int>(arg));
+ } else {
+ Clipboard::GraphicsType type;
+ if (arg == "pdf")
+ type = Clipboard::PdfGraphicsType;
+ else if (arg == "png")
+ type = Clipboard::PngGraphicsType;
+ else if (arg == "jpeg")
+ type = Clipboard::JpegGraphicsType;
+ else if (arg == "linkback")
+ type = Clipboard::LinkBackGraphicsType;
+ else
+ BOOST_ASSERT(false);
+
+ pasteClipboardGraphics(cur, bv->buffer().errorList("Paste"), type);
}
+
bv->buffer().errors("Paste");
cur.clearSelection(); // bug 393
cur.finishUndo();
break;
+ }
case LFUN_CUT:
cutSelection(cur, true, true);
is >> x >> y;
if (!is)
lyxerr << "SETXY: Could not parse coordinates in '"
- << to_utf8(cmd.argument()) << std::endl;
+ << to_utf8(cmd.argument()) << endl;
else
tm.setCursorFromCoordinates(cur, x, y);
break;
case LFUN_CLIPBOARD_PASTE:
cur.clearSelection();
- pasteClipboard(cur, bv->buffer().errorList("Paste"),
+ pasteClipboardText(cur, bv->buffer().errorList("Paste"),
cmd.argument() == "paragraph");
bv->buffer().errors("Paste");
break;
if (cmd.argument().empty())
break;
docstring hexstring = cmd.argument();
- if (lyx::support::isHex(hexstring)) {
- char_type c = lyx::support::hexToInt(hexstring);
+ if (isHex(hexstring)) {
+ char_type c = hexToInt(hexstring);
if (c >= 32 && c < 0x10ffff) {
lyxerr << "Inserting c: " << c << endl;
docstring s = docstring(1, c);
CursorSlice old = bvcur.top();
int const wh = bv->workHeight();
- int const y = std::max(0, std::min(wh - 1, cmd.y));
+ int const y = max(0, min(wh - 1, cmd.y));
tm.setCursorFromCoordinates(cur, cmd.x, y);
cur.setTargetX(cmd.x);
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();
string const s1 = token(s, ' ', 1);
int const nargs = s1.empty() ? 0 : convert<int>(s1);
string const s2 = token(s, ' ', 2);
- string const type = s2.empty() ? "newcommand" : s2;
- cur.insert(new MathMacroTemplate(from_utf8(token(s, ' ', 0)), nargs, false, from_utf8(type)));
+ MacroType type = MacroTypeNewcommand;
+ if (s2 == "def")
+ type = MacroTypeDef;
+ cur.insert(new MathMacroTemplate(from_utf8(token(s, ' ', 0)), nargs, false, type));
//cur.nextInset()->edit(cur, true);
}
break;
case LFUN_MATH_MATRIX:
case LFUN_MATH_DELIM:
case LFUN_MATH_BIGDELIM: {
- if (cur.selection())
- cur.clearSelection();
- // FIXME: instead of the above, this one
- // should be used (but it asserts with Bidi enabled)
- // cf. http://bugzilla.lyx.org/show_bug.cgi?id=4055
- // cap::replaceSelection(cur);
+ cap::replaceSelection(cur);
cur.insert(new InsetMathHull(hullSimple));
checkAndActivateInset(cur, true);
BOOST_ASSERT(cur.inMathed());
enable = cur.selection();
break;
- case LFUN_PASTE:
+ case LFUN_PASTE: {
if (cmd.argument().empty()) {
if (theClipboard().isInternal())
enable = cap::numberOfSelections() > 0;
else
enable = !theClipboard().empty();
- } else {
- string const arg = to_utf8(cmd.argument());
- if (isStrUnsignedInt(arg)) {
- unsigned int n = convert<unsigned int>(arg);
- enable = cap::numberOfSelections() > n;
- } else
- // unknown argument
- enable = false;
+ break;
+ }
+
+ // we have an argument
+ string const arg = to_utf8(cmd.argument());
+ if (isStrUnsignedInt(arg)) {
+ // it's a number and therefore means the internal stack
+ unsigned int n = convert<unsigned int>(arg);
+ enable = cap::numberOfSelections() > n;
+ break;
+ }
+
+ // explicit graphics type?
+ if ((arg == "pdf" && theClipboard().hasGraphicsContents(Clipboard::PdfGraphicsType))
+ || (arg == "png" && theClipboard().hasGraphicsContents(Clipboard::PngGraphicsType))
+ || (arg == "jpeg" && theClipboard().hasGraphicsContents(Clipboard::JpegGraphicsType))
+ || (arg == "linkback" && theClipboard().hasGraphicsContents(Clipboard::LinkBackGraphicsType))) {
+ enable = true;
+ break;
}
+
+ // unknown argument
+ enable = false;
break;
+ }
case LFUN_CLIPBOARD_PASTE:
enable = !theClipboard().empty();