#include "lyxtext.h"
#include "LString.h"
+#include "Lsstream.h"
#include "paragraph.h"
+#include "funcrequest.h"
#include "frontends/LyXView.h"
#include "undo_funcs.h"
#include "buffer.h"
#include "bufferparams.h"
+#include "errorlist.h"
#include "gettext.h"
#include "BufferView.h"
#include "CutAndPaste.h"
#include "paragraph_funcs.h"
#include "insets/insetbibitem.h"
+#include "insets/insetenv.h"
#include "insets/insetfloat.h"
+#include "insets/insetwrap.h"
#include "support/LAssert.h"
#include "support/textutils.h"
#include "support/lstrings.h"
-#include "support/BoostFormat.h"
#include <boost/tuple/tuple.hpp>
using std::vector;
// set layout over selection and make a total rebreak of those paragraphs
void LyXText::setLayout(string const & layout)
{
- LyXCursor tmpcursor = cursor; /* store the current cursor */
+ LyXCursor tmpcursor = cursor; // store the current cursor
// if there is no selection just set the layout
- // of the current paragraph */
+ // of the current paragraph
if (!selection.set()) {
selection.start = cursor; // dummy selection
selection.end = cursor;
}
+
+ // special handling of new environment insets
+ BufferParams const & params = bv()->buffer()->params;
+ LyXLayout_ptr const & lyxlayout = params.getLyXTextClass()[layout];
+ if (lyxlayout->is_environment) {
+ // move everything in a new environment inset
+ lyxerr << "setting layout " << layout << endl;
+ bv()->owner()->dispatch(FuncRequest(LFUN_HOME));
+ bv()->owner()->dispatch(FuncRequest(LFUN_ENDSEL));
+ bv()->owner()->dispatch(FuncRequest(LFUN_CUT));
+ Inset * inset = new InsetEnvironment(params, layout);
+ if (bv()->insertInset(inset)) {
+ //inset->edit(bv());
+ //bv()->owner()->dispatch(FuncRequest(LFUN_PASTE));
+ }
+ else
+ delete inset;
+ return;
+ }
+
ParagraphList::iterator endpit = setLayout(cursor, selection.start,
selection.end, layout);
redoParagraphs(selection.start, endpit);
// we have to reset the selection, because the
// geometry could have changed
- setCursor(selection.start.par(),
- selection.start.pos(), false);
+ setCursor(selection.start.par(), selection.start.pos(), false);
selection.cursor = cursor;
setCursor(selection.end.par(), selection.end.pos(), false);
updateCounters();
// Wow, redoParagraphs is stupid.
LyXCursor tmpcursor;
- setCursor(tmpcursor, &(*start), 0);
+ setCursor(tmpcursor, start, 0);
//redoParagraphs(tmpcursor, &(*pastend));
- redoParagraphs(tmpcursor, &(*pastend));
+ redoParagraphs(tmpcursor, pastend);
// We need to actually move the text->cursor. I don't
// understand why ...
++endpit;
undoendpit = endpit;
}
- } else if (endpit!= pars_end) {
+ } else if (endpit != pars_end) {
// because of parindents etc.
++endpit;
}
}
if (isOK) {
- Floating const & fl
- = textclass.floats().getType(static_cast<InsetFloat*>(in)->type());
+ string type;
+
+ if (in->lyxCode() == Inset::FLOAT_CODE)
+ type = static_cast<InsetFloat*>(in)->params().type;
+ else if (in->lyxCode() == Inset::WRAP_CODE)
+ type = static_cast<InsetWrap*>(in)->params().type;
+ else
+ lyx::Assert(0);
+
+ Floating const & fl = textclass.floats().getType(type);
textclass.counters().step(fl.type());
// Doesn't work... yet.
-#if USE_BOOST_FORMAT
- s = boost::io::str(boost::format(_("%1$s #:")) % buf->B_(fl.name()));
- // s << boost::format(_("%1$s %1$d:")
- // % fl.name()
- // % buf->counters().value(fl.name());
-#else
- ostringstream o;
- //o << fl.name() << ' ' << buf->counters().value(fl.name()) << ":";
- o << buf->B_(fl.name()) << " #:";
- s = STRCONV(o.str());
-#endif
+ s = bformat(_("%1$s #:"), buf->B_(fl.name()));
} else {
// par->SetLayout(0);
// s = layout->labelstring;
string const oldLabel = pit->params().labelString();
- int maxdepth = 0;
+ size_t maxdepth = 0;
if (pit != ownerParagraphs().begin())
maxdepth = boost::prior(pit)->getMaxDepthAfter();
endpit = selection.end.par();
int endpos = selection.end.pos();
- boost::tie(endpit, endpos) = realcut ?
+ boost::tie(endpit, endpos) = realcut ?
CutAndPaste::cutSelection(ownerParagraphs(),
selection.start.par(), endpit,
selection.start.pos(), endpos,
|| selection.start.pos() < selection.end.pos()))
selection.start.pos(selection.start.pos() + 1);
- CutAndPaste::copySelection(&*selection.start.par(),
- &*selection.end.par(),
+ CutAndPaste::copySelection(selection.start.par(),
+ selection.end.par(),
selection.start.pos(), selection.end.pos(),
bv()->buffer()->params.textclass);
}
setUndo(bv(), Undo::INSERT,
cursor.par(), boost::next(cursor.par()));
- Paragraph * endpar;
- ParagraphList::iterator actpit = cursor.par();
- int pos = cursor.pos();
+ ParagraphList::iterator endpit;
+ PitPosPair ppp;
- Paragraph * actpar = &*actpit;
- CutAndPaste::pasteSelection(&actpar, &endpar, pos,
- bv()->buffer()->params.textclass);
+ ErrorList el;
- redoParagraphs(cursor, endpar);
+ boost::tie(ppp, endpit) =
+ CutAndPaste::pasteSelection(ownerParagraphs(),
+ cursor.par(), cursor.pos(),
+ bv()->buffer()->params.textclass,
+ el);
+ bv()->setErrorList(el);
+ bv()->showErrorList(_("Paste"));
+
+ redoParagraphs(cursor, endpit);
setCursor(cursor.par(), cursor.pos());
clearSelection();
selection.cursor = cursor;
- setCursor(actpit, pos);
+ setCursor(ppp.first, ppp.second);
setSelection();
updateCounters();
}
// same paragraph and there is a previous row then put the cursor on
// the end of the previous row
cur.iy(y + row->baseline());
- if (row != beg &&
- pos &&
- boost::prior(row)->par() == row->par() &&
- pos < pit->size() &&
+ if (row != beg &&
+ pos &&
+ boost::prior(row)->par() == row->par() &&
+ pos < pit->size() &&
pit->getChar(pos) == Paragraph::META_INSET) {
Inset * ins = pit->getInset(pos);
if (ins && (ins->needFullRow() || ins->display())) {
y -= row->height();
}
}
-
+
cur.row(row);
// y is now the beginning of the cursor row
y += row->baseline();
if (body_pos > 0 && c == body_pos - 1) {
tmpx += fill_label_hfill +
font_metrics::width(layout->labelsep,
- getLabelFont(bv()->buffer(), &*rit_par));
+ getLabelFont(bv()->buffer(), rit_par));
if (rit_par->isLineSeparator(body_pos - 1))
tmpx -= singleWidth(rit_par, body_pos - 1);
}
y -= topy;
Inset * inset_hit = checkInsetHit(x, y1);
if (inset_hit && isHighlyEditableInset(inset_hit)) {
- inset_hit->edit(bv(), x, y - (y2 - y1), mouse_button::none);
+ inset_hit->localDispatch(
+ FuncRequest(bv(), LFUN_INSET_EDIT, x, y - (y2 - y1), mouse_button::none));
}
}
#else
y -= topy;
Inset * inset_hit = checkInsetHit(x, y1);
if (inset_hit && isHighlyEditableInset(inset_hit)) {
- inset_hit->edit(bv(), x, y - (y2 - y1), mouse_button::none);
+ FuncRequest cmd(bv(), LFUN_INSET_EDIT, x, y - (y2 - y1), mouse_button::none);
+ inset_hit->localDispatch(cmd);
}
}
#else