-/* This file is part of
- * ======================================================
+/**
+ * \file insettext.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
*
- * LyX, The Document Processor
+ * \author Jürgen Vigna
*
- * Copyright 1998-2001 The LyX Team.
- *
- * ======================================================
+ * Full author contact details are available in file CREDITS
*/
#include <config.h>
#endif
#include "insettext.h"
-#include "paragraph.h"
-#include "lyxlex.h"
-#include "debug.h"
-#include "lyxfont.h"
-#include "commandtags.h"
+
#include "buffer.h"
-#include "LyXView.h"
#include "BufferView.h"
-#include "lyxtextclasslist.h"
-#include "LaTeXFeatures.h"
-#include "Painter.h"
-#include "lyxtext.h"
-#include "lyxcursor.h"
#include "CutAndPaste.h"
-#include "font.h"
+#include "debug.h"
+#include "funcrequest.h"
+#include "gettext.h"
+#include "intl.h"
+#include "LaTeXFeatures.h"
#include "LColor.h"
+#include "lyxfont.h"
+#include "lyxcursor.h"
+#include "lyxfind.h"
+#include "lyxlex.h"
#include "lyxrow.h"
#include "lyxrc.h"
-#include "intl.h"
-#include "trans_mgr.h"
-#include "lyxscreen.h"
-#include "gettext.h"
-#include "lyxfunc.h"
+#include "lyxtext.h"
+#include "paragraph.h"
#include "ParagraphParameters.h"
+#include "trans_mgr.h"
#include "undo_funcs.h"
-#include "lyxfind.h"
+#include "WordLangTuple.h"
+#include "paragraph_funcs.h"
+#include "sgml.h"
#include "frontends/Alert.h"
#include "frontends/Dialogs.h"
+#include "frontends/font_metrics.h"
+#include "frontends/LyXView.h"
+#include "frontends/Painter.h"
+#include "frontends/screen.h"
#include "support/textutils.h"
#include "support/LAssert.h"
#include "support/lstrings.h"
#include "support/lyxalgo.h" // lyx::count
+#include <boost/bind.hpp>
+
#include <fstream>
#include <algorithm>
#include <cstdlib>
using std::make_pair;
using std::vector;
using std::pair;
+using std::for_each;
using lyx::pos_type;
using lyx::textclass_type;
void InsetText::saveLyXTextState(LyXText * t) const
{
// check if my paragraphs are still valid
- Paragraph * p = par;
- while (p) {
- if (p == t->cursor.par())
+ ParagraphList::iterator it = paragraphs.begin();
+ ParagraphList::iterator end = paragraphs.end();
+ for (; it != end; ++it) {
+ if (&*it == t->cursor.par())
break;
- p = p->next();
}
- if (p && t->cursor.pos() <= p->size()) {
+ if (it != end && t->cursor.pos() <= it->size()) {
sstate.lpar = t->cursor.par();
sstate.pos = t->cursor.pos();
sstate.boundary = t->cursor.boundary();
: UpdatableInset(), lt(0), in_update(false), do_resize(0),
do_reinit(false)
{
- par = new Paragraph;
- par->layout(textclasslist[bp.textclass].defaultLayoutName());
-
+ paragraphs.set(new Paragraph);
+ paragraphs.begin()->layout(bp.getLyXTextClass().defaultLayout());
init();
}
: UpdatableInset(in, same_id), lt(0), in_update(false), do_resize(0),
do_reinit(false)
{
- par = 0;
init(&in, same_id);
}
void InsetText::init(InsetText const * ins, bool same_id)
{
if (ins) {
- setParagraphData(ins->par, same_id);
+ setParagraphData(&*(ins->paragraphs.begin()), same_id);
autoBreakRows = ins->autoBreakRows;
drawFrame_ = ins->drawFrame_;
frame_color = ins->frame_color;
if (same_id)
id_ = ins->id_;
} else {
- Paragraph * p = par;
- while (p) {
- p->setInsetOwner(this);
- p = p->next();
- }
+ for_each(paragraphs.begin(), paragraphs.end(),
+ boost::bind(&Paragraph::setInsetOwner, _1, this));
+
the_locking_inset = 0;
drawFrame_ = NEVER;
frame_color = LColor::insetframe;
need_update = FULL;
drawTextXOffset = 0;
drawTextYOffset = 0;
- xpos = 0.0;
locked = false;
old_par = 0;
last_drawn_width = -1;
InsetText::~InsetText()
{
- cached_bview = 0;
-
- // NOTE
-
- while (par) {
- Paragraph * tmp = par->next();
- delete par;
- par = tmp;
- }
+ paragraphs.clear();
}
void InsetText::clear()
{
// This is a gross hack...
- string old_layout = par->layout();
+ LyXLayout_ptr old_layout = paragraphs.begin()->layout();
- while (par) {
- Paragraph * tmp = par->next();
- delete par;
- par = tmp;
- }
- par = new Paragraph;
- par->setInsetOwner(this);
- par->layout(old_layout);
+ paragraphs.clear();
+ paragraphs.set(new Paragraph);
+ paragraphs.begin()->setInsetOwner(this);
+ paragraphs.begin()->layout(old_layout);
reinitLyXText();
need_update = INIT;
void InsetText::writeParagraphData(Buffer const * buf, ostream & os) const
{
- par->writeFile(buf, os, buf->params, 0);
+ ParagraphList::iterator it = paragraphs.begin();
+ ParagraphList::iterator end = paragraphs.end();
+ Paragraph::depth_type dth = 0;
+ for (; it != end; ++it) {
+ it->write(buf, os, buf->params, dth);
+ }
}
if (token.empty())
continue;
if (token == "\\end_inset") {
-#ifndef NO_COMPABILITY
- const_cast<Buffer*>(buf)->insertErtContents(par, pos, false);
-#endif
break;
}
+ Paragraph * tmp = &*(paragraphs.begin());
+
if (const_cast<Buffer*>(buf)->
- parseSingleLyXformat2Token(lex, par, return_par,
+ parseSingleLyXformat2Token(lex, tmp, return_par,
token, pos, depth, font)) {
// the_end read this should NEVER happen
lex.printError("\\the_end read in inset! Error in document!");
return;
}
+ paragraphs.set(tmp);
}
if (!return_par)
- return_par = par;
- par = return_par;
+ return_par = &*(paragraphs.begin());
+ paragraphs.set(return_par);
while (return_par) {
return_par->setInsetOwner(this);
return_par = return_par->next();
}
// no draw is necessary !!!
- if ((drawFrame_ == LOCKED) && !locked && !par->size()) {
+ if ((drawFrame_ == LOCKED) && !locked && paragraphs.begin()->empty()) {
top_baseline = baseline;
x += width(bv, f);
if (need_update & CLEAR_FRAME)
return;
}
- xpos = x;
if (!owner())
x += static_cast<float>(scroll());
if (the_locking_inset && (cpar(bv) == inset_par)
&& (cpos(bv) == inset_pos)) {
- inset_x = cx(bv) - top_x + drawTextXOffset;
+ inset_x = cix(bv) - top_x + drawTextXOffset;
inset_y = ciy(bv) + drawTextYOffset;
}
if (!cleared && (need_update == CURSOR)
first += row->height();
row = row->next();
}
- if (y_offset < 0)
- y_offset = y;
- lt->first_y = first;
+ if (y_offset < 0) {
+ lt->first_y = -y_offset;
+ first = y;
+ y_offset = 0;
+ } else {
+ lt->first_y = first;
+ first = 0;
+ }
if (cleared || (need_update&(INIT|FULL))) {
- int yf = y_offset;
+ int yf = y_offset + first;
y = 0;
while ((row != 0) && (yf < ph)) {
- lt->getVisibleRow(bv, y+y_offset, int(x), row,
- y+first, cleared);
+ lt->getVisibleRow(bv, y + y_offset + first, int(x),
+ row, y + lt->first_y, cleared);
+ if (bv->text->status() == LyXText::CHANGED_IN_DRAW) {
+ lt->need_break_row = row;
+ lt->fullRebreak(bv);
+ lt->setCursor(bv, lt->cursor.par(),
+ lt->cursor.pos());
+ if (lt->selection.set()) {
+ lt->setCursor(bv, lt->selection.start,
+ lt->selection.start.par(),
+ lt->selection.start.pos());
+ lt->setCursor(bv, lt->selection.end,
+ lt->selection.end.par(),
+ lt->selection.end.pos());
+ }
+ break;
+ }
y += row->height();
yf += row->height();
row = row->next();
}
} else if (!locked) {
if (need_update & CURSOR) {
- bv->screen()->toggleSelection(lt, bv, true, y_offset,int(x));
+ bv->screen().toggleSelection(lt, bv, true, y_offset,int(x));
lt->clearSelection();
lt->selection.cursor = lt->cursor;
}
- bv->screen()->update(lt, bv, y_offset, int(x));
+ bv->screen().update(lt, bv, y_offset, int(x));
} else {
locked = false;
if (need_update & SELECTION) {
- bv->screen()->toggleToggle(lt, bv, y_offset, int(x));
+ bv->screen().toggleToggle(lt, bv, y_offset, int(x));
} else if (need_update & CURSOR) {
- bv->screen()->toggleSelection(lt, bv, true, y_offset,int(x));
+ bv->screen().toggleSelection(lt, bv, true, y_offset,int(x));
lt->clearSelection();
lt->selection.cursor = lt->cursor;
}
- bv->screen()->update(lt, bv, y_offset, int(x));
+ bv->screen().update(lt, bv, y_offset, int(x));
locked = true;
}
return;
}
- if (!autoBreakRows && par->next())
- collapseParagraphs(bv->buffer()->params);
+ if (!autoBreakRows && paragraphs.begin()->next())
+ collapseParagraphs(bv);
if (the_locking_inset) {
- inset_x = cx(bv) - top_x + drawTextXOffset;
+ inset_x = cix(bv) - top_x + drawTextXOffset;
inset_y = ciy(bv) + drawTextYOffset;
the_locking_inset->update(bv, font, reinit);
}
void InsetText::updateLocal(BufferView * bv, int what, bool mark_dirty) const
{
- if (!autoBreakRows && par->next())
- collapseParagraphs(bv->buffer()->params);
+ if (!autoBreakRows && paragraphs.begin()->next())
+ collapseParagraphs(bv);
bool clear = false;
if (!lt) {
lt = getLyXText(bv);
lt->selection.cursor = lt->cursor;
if (clear)
lt = 0;
+#if 0
+ // IMO this is not anymore needed as we do this in fitInsetCursor!
+ // and we always get "true" as returnvalue of this function in the
+ // case of a locking inset (Jug 20020412)
if (locked && (need_update & CURSOR) && bv->fitCursor())
need_update |= FULL;
+#else
+ bv->fitCursor();
+#endif
if (flag)
bv->updateInset(const_cast<InsetText *>(this), mark_dirty);
if (need_update == CURSOR)
need_update = NONE;
- bv->owner()->showState();
+ bv->owner()->view_state_changed();
bv->owner()->updateMenubar();
bv->owner()->updateToolbar();
if (old_par != cpar(bv)) {
- bv->owner()->setLayout(cpar(bv)->layout());
+ bv->owner()->setLayout(cpar(bv)->layout()->name());
old_par = cpar(bv);
}
}
}
-void InsetText::edit(BufferView * bv, int x, int y, unsigned int button)
+void InsetText::edit(BufferView * bv, int x, int y, mouse_button::state button)
{
UpdatableInset::edit(bv, x, y, button);
lt = getLyXText(bv);
clear = true;
}
- if (!checkAndActivateInset(bv, x, tmp_y, button))
+ // we put here -1 and not button as now the button in the
+ // edit call should not be needed we will fix this in 1.3.x
+ // cycle hopefully (Jug 20020509)
+ // FIXME: GUII I've changed this to none: probably WRONG
+ if (!checkAndActivateInset(bv, x, tmp_y, mouse_button::none)) {
lt->setCursorFromCoordinates(bv, x - drawTextXOffset,
y + insetAscent);
+ lt->cursor.x_fix(lt->cursor.x());
+ }
lt->clearSelection();
finishUndo();
// If the inset is empty set the language of the current font to the
// language to the surronding text (if different).
- if (par->size() == 0 && !par->next() &&
+ if (paragraphs.begin()->empty() && !paragraphs.begin()->next() &&
bv->getParentLanguage(this) != lt->current_font.language())
{
LyXFont font(LyXFont::ALL_IGNORE);
showInsetCursor(bv);
// Tell the paragraph dialog that we've entered an insettext.
- bv->owner()->getDialogs()->updateParagraph();
+ bv->owner()->getDialogs().updateParagraph();
}
clear = true;
}
if (front)
- lt->setCursor(bv, par, 0);
+ lt->setCursor(bv, &*(paragraphs.begin()), 0);
else {
- Paragraph * p = par;
- while (p->next())
- p = p->next();
+ ParagraphList::iterator it = paragraphs.begin();
+ ParagraphList::iterator end = paragraphs.end();
+ while (boost::next(it) != end)
+ ++it;
// int const pos = (p->size() ? p->size()-1 : p->size());
- lt->setCursor(bv, p, p->size());
+ lt->setCursor(bv, &*it, it->size());
}
lt->clearSelection();
finishUndo();
// If the inset is empty set the language of the current font to the
// language to the surronding text (if different).
- if (par->size() == 0 && !par->next() &&
+ if (paragraphs.begin()->empty() && !paragraphs.begin()->next() &&
bv->getParentLanguage(this) != lt->current_font.language()) {
LyXFont font(LyXFont::ALL_IGNORE);
font.setLanguage(bv->getParentLanguage(this));
if (the_locking_inset) {
the_locking_inset->insetUnlock(bv);
the_locking_inset = 0;
+ updateLocal(bv, CURSOR_PAR, false);
}
hideInsetCursor(bv);
no_selection = true;
locked = false;
- int code;
+ int code = NONE;
+#if 0
if (drawFrame_ == LOCKED)
code = CURSOR|CLEAR_FRAME;
else
code = CURSOR;
+#else
+ if (drawFrame_ == LOCKED)
+ code = CLEAR_FRAME;
+#endif
bool clear = false;
if (!lt) {
lt = getLyXText(bv);
code = FULL;
} else if (owner()) {
bv->owner()->setLayout(owner()->getLyXText(bv)
- ->cursor.par()->layout());
+ ->cursor.par()->layout()->name());
} else
- bv->owner()->setLayout(bv->text->cursor.par()->layout());
+ bv->owner()->setLayout(bv->text->cursor.par()->layout()->name());
// hack for deleteEmptyParMech
- if (par->size()) {
- lt->setCursor(bv, par, 0);
- } else if (par->next()) {
- lt->setCursor(bv, par->next(), 0);
+ if (!paragraphs.begin()->empty()) {
+ lt->setCursor(bv, &*(paragraphs.begin()), 0);
+ } else if (paragraphs.begin()->next()) {
+ lt->setCursor(bv, paragraphs.begin()->next(), 0);
}
if (clear)
lt = 0;
+#if 0
updateLocal(bv, code, false);
+#else
+ if (code != NONE)
+ setUpdateStatus(bv, code);
+#endif
+}
+
+
+void InsetText::lockInset(BufferView * bv)
+{
+ locked = true;
+ the_locking_inset = 0;
+ inset_pos = inset_x = inset_y = 0;
+ inset_boundary = false;
+ inset_par = 0;
+ old_par = 0;
+ bool clear = false;
+ if (!lt) {
+ lt = getLyXText(bv);
+ clear = true;
+ }
+ lt->setCursor(bv, &*(paragraphs.begin()), 0);
+ lt->clearSelection();
+ finishUndo();
+ // If the inset is empty set the language of the current font to the
+ // language to the surronding text (if different).
+ if (paragraphs.begin()->empty() && !paragraphs.begin()->next() &&
+ bv->getParentLanguage(this) != lt->current_font.language()) {
+ LyXFont font(LyXFont::ALL_IGNORE);
+ font.setLanguage(bv->getParentLanguage(this));
+ setFont(bv, font, false);
+ }
+ if (clear)
+ lt = 0;
+ int code = CURSOR;
+ if (drawFrame_ == LOCKED)
+ code = CURSOR|DRAW_FRAME;
+ setUpdateStatus(bv, code);
}
+
void InsetText::lockInset(BufferView * bv, UpdatableInset * inset)
{
the_locking_inset = inset;
- inset_x = cx(bv) - top_x + drawTextXOffset;
+ inset_x = cix(bv) - top_x + drawTextXOffset;
inset_y = ciy(bv) + drawTextYOffset;
inset_pos = cpos(bv);
inset_par = cpar(bv);
if (!inset)
return false;
if (!the_locking_inset) {
- Paragraph * p = par;
+ Paragraph * p = &*(paragraphs.begin());
int const id = inset->id();
while(p) {
- Paragraph::inset_iterator it =
- p->inset_iterator_begin();
- Paragraph::inset_iterator const end =
- p->inset_iterator_end();
+ InsetList::iterator it =
+ p->insetlist.begin();
+ InsetList::iterator const end =
+ p->insetlist.end();
for (; it != end; ++it) {
- if ((*it) == inset) {
+ if (it.getInset() == inset) {
getLyXText(bv)->setCursorIntern(bv, p, it.getPos());
lockInset(bv, inset);
return true;
}
- if ((*it)->getInsetFromID(id)) {
+ if (it.getInset()->getInsetFromID(id)) {
getLyXText(bv)->setCursorIntern(bv, p, it.getPos());
- (*it)->edit(bv);
+ it.getInset()->edit(bv);
return the_locking_inset->lockInsetInInset(bv, inset);
}
}
} else if (the_locking_inset && (the_locking_inset == inset)) {
if (cpar(bv) == inset_par && cpos(bv) == inset_pos) {
lyxerr[Debug::INSETS] << "OK" << endl;
- inset_x = cx(bv) - top_x + drawTextXOffset;
+ inset_x = cix(bv) - top_x + drawTextXOffset;
inset_y = ciy(bv) + drawTextYOffset;
} else {
lyxerr[Debug::INSETS] << "cursor.pos != inset_pos" << endl;
getLyXText(bv)->updateInset(bv, inset);
the_locking_inset = 0;
if (lr)
- moveRight(bv, false);
+ moveRightIntern(bv, true, false);
old_par = 0; // force layout setting
if (scroll())
scroll(bv, 0.0F);
bool InsetText::updateInsetInInset(BufferView * bv, Inset * inset)
{
- if (!autoBreakRows && par->next())
- collapseParagraphs(bv->buffer()->params);
+ if (!autoBreakRows && paragraphs.begin()->next())
+ collapseParagraphs(bv);
if (inset == this)
return true;
bool clear = false;
if (the_locking_inset &&
cpar(bv) == inset_par && cpos(bv) == inset_pos)
{
- inset_x = cx(bv) - top_x + drawTextXOffset;
+ inset_x = cix(bv) - top_x + drawTextXOffset;
inset_y = ciy(bv) + drawTextYOffset;
}
}
}
-void InsetText::insetButtonPress(BufferView * bv, int x, int y, int button)
+void InsetText::lfunMousePress(FuncRequest const & cmd)
{
no_selection = true;
// use this to check mouse motion for selection!
- mouse_x = x;
- mouse_y = y;
+ mouse_x = cmd.x;
+ mouse_y = cmd.y;
- int tmp_x = x - drawTextXOffset;
- int tmp_y = y + insetAscent - getLyXText(bv)->first_y;
- Inset * inset = bv->checkInsetHit(getLyXText(bv), tmp_x, tmp_y);
+ BufferView * bv = cmd.view();
+ FuncRequest cmd1 = cmd;
+ cmd1.x -= inset_x;
+ cmd1.y -= inset_y;
+ if (!locked)
+ lockInset(bv);
+
+ int tmp_x = cmd.x - drawTextXOffset;
+ int tmp_y = cmd.y + insetAscent - getLyXText(bv)->first_y;
+ Inset * inset = getLyXText(bv)->checkInsetHit(bv, tmp_x, tmp_y);
hideInsetCursor(bv);
if (the_locking_inset) {
if (the_locking_inset == inset) {
- the_locking_inset->insetButtonPress(bv,
- x - inset_x,
- y - inset_y,
- button);
+ the_locking_inset->localDispatch(cmd1);
return;
}
#if 0
else if (inset) {
// otherwise unlock the_locking_inset and lock the new inset
the_locking_inset->insetUnlock(bv);
- inset_x = cx(bv) - top_x + drawTextXOffset;
+ inset_x = cix(bv) - top_x + drawTextXOffset;
inset_y = ciy(bv) + drawTextYOffset;
the_locking_inset = 0;
- inset->insetButtonPress(bv, x - inset_x,
- y - inset_y, button);
+ inset->localDispatch(cmd1);
// inset->edit(bv, x - inset_x, y - inset_y, button);
if (the_locking_inset)
updateLocal(bv, CURSOR, false);
if (!bv->lockInset(uinset)) {
lyxerr[Debug::INSETS] << "Cannot lock inset" << endl;
}
- inset->insetButtonPress(bv, x - inset_x, y - inset_y, button);
+ inset->localDispatch(cmd1);
if (the_locking_inset)
updateLocal(bv, CURSOR, false);
return;
}
}
- if (!inset) { // && (button == 2)) {
+ if (!inset) { // && (button == mouse_button::button2)) {
bool paste_internally = false;
- if ((button == 2) && getLyXText(bv)->selection.set()) {
- localDispatch(bv, LFUN_COPY, "");
+ if (cmd.button() == mouse_button::button2 && getLyXText(bv)->selection.set()) {
+ localDispatch(FuncRequest(bv, LFUN_COPY));
paste_internally = true;
}
bool clear = false;
}
int old_first_y = lt->first_y;
- lt->setCursorFromCoordinates(bv, x - drawTextXOffset,
- y + insetAscent);
+ lt->setCursorFromCoordinates(bv, cmd.x - drawTextXOffset,
+ cmd.y + insetAscent);
// set the selection cursor!
lt->selection.cursor = lt->cursor;
lt->cursor.x_fix(lt->cursor.x());
lt = 0;
updateLocal(bv, CURSOR, false);
}
- bv->owner()->setLayout(cpar(bv)->layout());
+
+ bv->owner()->setLayout(cpar(bv)->layout()->name());
+
// we moved the view we cannot do mouse selection in this case!
if (getLyXText(bv)->first_y != old_first_y)
no_selection = true;
// Insert primary selection with middle mouse
// if there is a local selection in the current buffer,
// insert this
- if (button == 2) {
+ if (cmd.button() == mouse_button::button2) {
if (paste_internally)
- localDispatch(bv, LFUN_PASTE, "");
+ localDispatch(FuncRequest(bv, LFUN_PASTE));
else
- localDispatch(bv, LFUN_PASTESELECTION,
- "paragraph");
+ localDispatch(FuncRequest(bv, LFUN_PASTESELECTION, "paragraph"));
}
} else {
getLyXText(bv)->clearSelection();
}
-bool InsetText::insetButtonRelease(BufferView * bv, int x, int y, int button)
+bool InsetText::lfunMouseRelease(FuncRequest const & cmd)
{
+ BufferView * bv = cmd.view();
+ FuncRequest cmd1 = cmd;
+ cmd1.x -= inset_x;
+ cmd1.y -= inset_y;
+
no_selection = true;
- if (the_locking_inset) {
- return the_locking_inset->insetButtonRelease(bv,
- x - inset_x, y - inset_y,
- button);
- }
- int tmp_x = x - drawTextXOffset;
- int tmp_y = y + insetAscent - getLyXText(bv)->first_y;
- Inset * inset = bv->checkInsetHit(getLyXText(bv), tmp_x, tmp_y);
+ if (the_locking_inset)
+ return the_locking_inset->localDispatch(cmd1);
+
+ int tmp_x = cmd.x - drawTextXOffset;
+ int tmp_y = cmd.y + insetAscent - getLyXText(bv)->first_y;
+ Inset * inset = getLyXText(bv)->checkInsetHit(bv, tmp_x, tmp_y);
bool ret = false;
if (inset) {
- if (isHighlyEditableInset(inset)) {
- ret = inset->insetButtonRelease(bv, x - inset_x,
- y - inset_y, button);
- } else {
- inset_x = cx(bv) - top_x + drawTextXOffset;
+ if (isHighlyEditableInset(inset))
+ ret = inset->localDispatch(cmd1);
+ else {
+ inset_x = cix(bv) - top_x + drawTextXOffset;
inset_y = ciy(bv) + drawTextYOffset;
- ret = inset->insetButtonRelease(bv, x - inset_x,
- y - inset_y, button);
- inset->edit(bv, x - inset_x,
- y - inset_y, button);
+ cmd1.x = cmd.x - inset_x;
+ cmd1.y = cmd.x - inset_y;
+ ret = inset->localDispatch(cmd1);
+ inset->edit(bv, cmd1.x, cmd1.y, cmd.button());
}
updateLocal(bv, CURSOR_PAR, false);
}
}
-void InsetText::insetMotionNotify(BufferView * bv, int x, int y, int state)
+void InsetText::lfunMouseMotion(FuncRequest const & cmd)
{
+ FuncRequest cmd1 = cmd;
+ cmd1.x -= inset_x;
+ cmd1.y -= inset_y;
+
if (the_locking_inset) {
- the_locking_inset->insetMotionNotify(bv, x - inset_x,
- y - inset_y,state);
+ the_locking_inset->localDispatch(cmd1);
return;
}
- if (no_selection || ((mouse_x == x) && (mouse_y == y)))
+ if (no_selection || (mouse_x == cmd.x && mouse_y == cmd.y))
return;
+ BufferView * bv = cmd.view();
bool clear = false;
if (!lt) {
lt = getLyXText(bv);
}
hideInsetCursor(bv);
LyXCursor cur = lt->cursor;
- lt->setCursorFromCoordinates(bv, x - drawTextXOffset, y + insetAscent);
+ lt->setCursorFromCoordinates
+ (bv, cmd.x - drawTextXOffset, cmd.y + insetAscent);
+ lt->cursor.x_fix(lt->cursor.x());
if (cur == lt->cursor) {
if (clear)
lt = 0;
}
-void InsetText::insetKeyPress(XKeyEvent * xke)
+Inset::RESULT InsetText::localDispatch(FuncRequest const & ev)
{
- if (the_locking_inset) {
- the_locking_inset->insetKeyPress(xke);
- return;
+ BufferView * bv = ev.view();
+ switch (ev.action) {
+ case LFUN_MOUSE_PRESS:
+ lfunMousePress(ev);
+ return DISPATCHED;
+ case LFUN_MOUSE_MOTION:
+ lfunMouseMotion(ev);
+ return DISPATCHED;
+ case LFUN_MOUSE_RELEASE:
+ return lfunMouseRelease(ev) ? DISPATCHED : UNDISPATCHED;
+ default:
+ break;
}
-}
-
-UpdatableInset::RESULT
-InsetText::localDispatch(BufferView * bv,
- kb_action action, string const & arg)
-{
- bool was_empty = par->size() == 0 && !par->next();
+ bool was_empty = (paragraphs.begin()->empty() && !paragraphs.begin()->next());
no_selection = false;
- UpdatableInset::RESULT
- result= UpdatableInset::localDispatch(bv, action, arg);
- if (result != UNDISPATCHED) {
+ RESULT result = UpdatableInset::localDispatch(ev);
+ if (result != UNDISPATCHED)
return DISPATCHED;
- }
result = DISPATCHED;
- if ((action < 0) && arg.empty())
+ if (ev.action < 0 && ev.argument.empty())
return FINISHED;
if (the_locking_inset) {
- result = the_locking_inset->localDispatch(bv, action, arg);
+ result = the_locking_inset->localDispatch(ev);
if (result == DISPATCHED_NOUPDATE)
return result;
else if (result == DISPATCHED) {
}
break;
case FINISHED_DOWN:
- if ((result = moveDown(bv)) >= FINISHED) {
+ {
+ LyXText *lt = getLyXText(bv);
+ if (lt->cursor.irow()->next()) {
+ lt->setCursorFromCoordinates(
+ bv, lt->cursor.ix() + inset_x,
+ lt->cursor.iy() -
+ lt->cursor.irow()->baseline() +
+ lt->cursor.irow()->height() + 1);
+ lt->cursor.x_fix(lt->cursor.x());
updateLocal(bv, CURSOR, false);
+ } else {
bv->unlockInset(this);
}
+ }
break;
default:
result = DISPATCHED;
break;
}
the_locking_inset = 0;
-#ifdef WITH_WARNINGS
-#warning I changed this to always return Dispatched maybe it is wrong (20011001 Jug)
-#endif
updateLocal(bv, CURSOR, false);
return result;
}
}
int updwhat = 0;
int updflag = false;
- switch (action) {
+ switch (ev.action) {
+
// Normal chars
case LFUN_SELFINSERT:
if (bv->buffer()->isReadonly()) {
// setErrorMessage(N_("Document is read only"));
break;
}
- if (!arg.empty()) {
+ if (!ev.argument.empty()) {
/* Automatically delete the currently selected
* text and replace it with what is being
* typed in now. Depends on lyxrc settings
* "auto_region_delete", which defaults to
* true (on). */
-
+#if 0
+ // This should not be needed here and is also WRONG!
setUndo(bv, Undo::INSERT,
lt->cursor.par(), lt->cursor.par()->next());
- bv->setState();
+#endif
+ bv->switchKeyMap();
if (lyxrc.auto_region_delete) {
if (lt->selection.set()) {
- lt->cutSelection(bv, false);
+ lt->cutSelection(bv, false, false);
}
}
lt->clearSelection();
- for (string::size_type i = 0; i < arg.length(); ++i) {
- bv->owner()->getIntl()->getTrans().TranslateAndInsert(arg[i], lt);
+ for (string::size_type i = 0; i < ev.argument.length(); ++i) {
+ bv->owner()->getIntl().getTransManager().
+ TranslateAndInsert(ev.argument[i], lt);
}
}
lt->selection.cursor = lt->cursor;
lt->cursorEnd(bv);
updwhat = CURSOR;
break;
+ case LFUN_PRIOR:
+ if (!crow(bv)->previous())
+ result = FINISHED_UP;
+ else {
+ lt->cursorPrevious(bv);
+ result = DISPATCHED_NOUPDATE;
+ }
+ updwhat = CURSOR;
+ break;
+ case LFUN_NEXT:
+ if (!crow(bv)->next())
+ result = FINISHED_DOWN;
+ else {
+ lt->cursorNext(bv);
+ result = DISPATCHED_NOUPDATE;
+ }
+ updwhat = CURSOR;
+ break;
case LFUN_BACKSPACE: {
- setUndo(bv, Undo::DELETE,
- lt->cursor.par(), lt->cursor.par()->next());
if (lt->selection.set())
- lt->cutSelection(bv);
+ lt->cutSelection(bv, true, false);
else
lt->backspace(bv);
updwhat = CURSOR_PAR;
break;
case LFUN_DELETE: {
- setUndo(bv, Undo::DELETE,
- lt->cursor.par(), lt->cursor.par()->next());
if (lt->selection.set()) {
- lt->cutSelection(bv);
+ lt->cutSelection(bv, true, false);
} else {
lt->Delete(bv);
}
break;
case LFUN_CUT: {
- setUndo(bv, Undo::DELETE,
- lt->cursor.par(), lt->cursor.par()->next());
lt->cutSelection(bv);
updwhat = CURSOR_PAR;
updflag = true;
if (clip.empty())
break;
- if (arg == "paragraph") {
+ if (ev.argument == "paragraph") {
lt->insertStringAsParagraphs(bv, clip);
} else {
lt->insertStringAsLines(bv, clip);
}
+ // bug 393
+ lt->clearSelection();
+
updwhat = CURSOR_PAR;
updflag = true;
break;
break;
}
}
+#if 0
+ // This should not be needed here and is also WRONG!
setUndo(bv, Undo::INSERT,
lt->cursor.par(), lt->cursor.par()->next());
+#endif
lt->pasteSelection(bv);
+ // bug 393
+ lt->clearSelection();
updwhat = CURSOR_PAR;
updflag = true;
}
result = DISPATCHED;
break;
}
+#if 0
+ // This should not be needed here and is also WRONG!
setUndo(bv, Undo::INSERT,
lt->cursor.par(), lt->cursor.par()->next());
+#endif
lt->insertChar(bv, Paragraph::META_NEWLINE);
updwhat = CURSOR | CURSOR_PAR;
updflag = true;
case LFUN_LAYOUT:
// do not set layouts on non breakable textinsets
if (autoBreakRows) {
- string cur_layout = cpar(bv)->layout();
+ string cur_layout = cpar(bv)->layout()->name();
// Derive layout number from given argument (string)
// and current buffer's textclass (number). */
- textclass_type tclass = bv->buffer()->params.textclass;
- string layout = arg;
- bool hasLayout = textclasslist[tclass].hasLayout(layout);
+ LyXTextClass const & tclass =
+ bv->buffer()->params.getLyXTextClass();
+ string layout = ev.argument;
+ bool hasLayout = tclass.hasLayout(layout);
// If the entry is obsolete, use the new one instead.
if (hasLayout) {
string const & obs =
- textclasslist[tclass][layout].
- obsoleted_by();
+ tclass[layout]->obsoleted_by();
if (!obs.empty())
layout = obs;
}
// see if we found the layout number:
if (!hasLayout) {
- string const msg = string(N_("Layout ")) + arg + N_(" not known");
- bv->owner()->getLyXFunc()->dispatch(LFUN_MESSAGE, msg);
+ FuncRequest lf(LFUN_MESSAGE, N_("Layout ") + ev.argument + N_(" not known"));
+ bv->owner()->dispatch(lf);
break;
}
if (cur_layout != layout) {
cur_layout = layout;
lt->setLayout(bv, layout);
- bv->owner()->setLayout(cpar(bv)->layout());
+ bv->owner()->setLayout(cpar(bv)->layout()->name());
updwhat = CURSOR_PAR;
updflag = true;
}
} else {
// reset the layout box
- bv->owner()->setLayout(cpar(bv)->layout());
+ bv->owner()->setLayout(cpar(bv)->layout()->name());
}
break;
case LFUN_PARAGRAPH_SPACING:
cur_value = par->params().spacing().getValue();
}
- istringstream istr(arg.c_str());
+ istringstream istr(ev.argument.c_str());
string tmp;
istr >> tmp;
Spacing::Space new_spacing = cur_spacing;
new_spacing = Spacing::Default;
} else {
lyxerr << _("Unknown spacing argument: ")
- << arg << endl;
+ << ev.argument << endl;
}
if (cur_spacing != new_spacing || cur_value != new_value) {
par->params().spacing(Spacing(new_spacing, new_value));
break;
default:
- if (!bv->Dispatch(action, arg))
+ if (!bv->dispatch(ev))
result = UNDISPATCHED;
break;
}
updateLocal(bv, updwhat, updflag);
/// If the action has deleted all text in the inset, we need to change the
// language to the language of the surronding text.
- if (!was_empty && par->size() == 0 && !par->next()) {
+ if (!was_empty && paragraphs.begin()->empty() && !paragraphs.begin()->next()) {
LyXFont font(LyXFont::ALL_IGNORE);
font.setLanguage(bv->getParentLanguage(this));
setFont(bv, font, false);
}
-int InsetText::latex(Buffer const * buf, ostream & os, bool, bool) const
+int InsetText::latex(Buffer const * buf, ostream & os,
+ bool moving_arg, bool) const
{
TexRow texrow;
- buf->latexParagraphs(os, par, 0, texrow);
+ buf->latexParagraphs(os, &*(paragraphs.begin()), 0,
+ texrow, moving_arg);
return texrow.rows();
}
int InsetText::ascii(Buffer const * buf, ostream & os, int linelen) const
{
- Paragraph * p = par;
unsigned int lines = 0;
- while (p) {
- string const tmp = buf->asciiParagraph(p, linelen, p->previous()==0);
+ ParagraphList::iterator beg = paragraphs.begin();
+ ParagraphList::iterator end = paragraphs.end();
+ ParagraphList::iterator it = beg;
+ for (; it != end; ++it) {
+ string const tmp = buf->asciiParagraph(*it, linelen, it == beg);
lines += lyx::count(tmp.begin(), tmp.end(), '\n');
os << tmp;
- p = p->next();
}
return lines;
}
-int InsetText::docbook(Buffer const * buf, ostream & os) const
+int InsetText::docbook(Buffer const * buf, ostream & os, bool mixcont) const
{
- Paragraph * p = par;
+ Paragraph * p = &*(paragraphs.begin());
unsigned int lines = 0;
vector<string> environment_stack(10);
string sgmlparam;
int desc_on = 0; // description mode
- LyXLayout const & style =
- textclasslist[buf->params.textclass][p->layout()];
+ LyXLayout_ptr const & style = p->layout();
// environment tag closing
for (; depth > p->params().depth(); --depth) {
if (environment_inner[depth] != "!-- --") {
item_name = "listitem";
- buf->sgmlCloseTag(os, command_depth + depth,
- item_name);
+ lines += sgml::closeTag(os, command_depth + depth, mixcont, item_name);
if (environment_inner[depth] == "varlistentry")
- buf->sgmlCloseTag(os, depth+command_depth,
- environment_inner[depth]);
+ lines += sgml::closeTag(os, depth+command_depth, mixcont, environment_inner[depth]);
}
- buf->sgmlCloseTag(os, depth + command_depth,
- environment_stack[depth]);
+ lines += sgml::closeTag(os, depth + command_depth, mixcont, environment_stack[depth]);
environment_stack[depth].erase();
environment_inner[depth].erase();
}
if (depth == p->params().depth()
- && environment_stack[depth] != style.latexname()
+ && environment_stack[depth] != style->latexname()
&& !environment_stack[depth].empty()) {
if (environment_inner[depth] != "!-- --") {
item_name= "listitem";
- buf->sgmlCloseTag(os, command_depth+depth,
- item_name);
+ lines += sgml::closeTag(os, command_depth+depth, mixcont, item_name);
if (environment_inner[depth] == "varlistentry")
- buf->sgmlCloseTag(os,
- depth + command_depth,
- environment_inner[depth]);
+ lines += sgml::closeTag(os, depth + command_depth, mixcont, environment_inner[depth]);
}
- buf->sgmlCloseTag(os, depth + command_depth,
- environment_stack[depth]);
+ lines += sgml::closeTag(os, depth + command_depth, mixcont, environment_stack[depth]);
environment_stack[depth].erase();
environment_inner[depth].erase();
}
// Write opening SGML tags.
- switch (style.latextype) {
+ switch (style->latextype) {
case LATEX_PARAGRAPH:
- buf->sgmlOpenTag(os, depth + command_depth,
- style.latexname());
+ lines += sgml::openTag(os, depth + command_depth, mixcont, style->latexname());
break;
case LATEX_COMMAND:
- buf->sgmlError(p, 0,
- _("Error : LatexType Command not allowed here.\n"));
+ buf->sgmlError(p, 0, _("Error : LatexType Command not allowed here.\n"));
return -1;
break;
environment_stack[depth].erase();
}
- if (environment_stack[depth] != style.latexname()) {
+ if (environment_stack[depth] != style->latexname()) {
if (environment_stack.size() == depth + 1) {
environment_stack.push_back("!-- --");
environment_inner.push_back("!-- --");
}
- environment_stack[depth] = style.latexname();
+ environment_stack[depth] = style->latexname();
environment_inner[depth] = "!-- --";
- buf->sgmlOpenTag(os, depth + command_depth,
- environment_stack[depth]);
+ lines += sgml::openTag(os, depth + command_depth, mixcont, environment_stack[depth]);
} else {
if (environment_inner[depth] != "!-- --") {
item_name= "listitem";
- buf->sgmlCloseTag(os,
- command_depth + depth,
- item_name);
+ lines += sgml::closeTag(os, command_depth + depth, mixcont, item_name);
if (environment_inner[depth] == "varlistentry")
- buf->sgmlCloseTag(os,
- depth + command_depth,
- environment_inner[depth]);
+ lines += sgml::closeTag(os, depth + command_depth, mixcont, environment_inner[depth]);
}
}
- if (style.latextype == LATEX_ENVIRONMENT) {
- if (!style.latexparam().empty()) {
- if (style.latexparam() == "CDATA")
+ if (style->latextype == LATEX_ENVIRONMENT) {
+ if (!style->latexparam().empty()) {
+ if (style->latexparam() == "CDATA")
os << "<![CDATA[";
else
- buf->sgmlOpenTag(os, depth + command_depth,
- style.latexparam());
+ lines += sgml::openTag(os, depth + command_depth, mixcont, style->latexparam());
}
break;
}
- desc_on = (style.labeltype == LABEL_MANUAL);
+ desc_on = (style->labeltype == LABEL_MANUAL);
- if (desc_on)
- environment_inner[depth]= "varlistentry";
- else
- environment_inner[depth]= "listitem";
+ environment_inner[depth] = desc_on?"varlistentry":"listitem";
+ lines += sgml::openTag(os, depth + 1 + command_depth, mixcont, environment_inner[depth]);
- buf->sgmlOpenTag(os, depth + 1 + command_depth,
- environment_inner[depth]);
+ item_name = desc_on?"term":"para";
+ lines += sgml::openTag(os, depth + 1 + command_depth, mixcont, item_name);
- if (desc_on) {
- item_name= "term";
- buf->sgmlOpenTag(os, depth + 1 + command_depth,
- item_name);
- } else {
- item_name= "para";
- buf->sgmlOpenTag(os, depth + 1 + command_depth,
- item_name);
- }
break;
default:
- buf->sgmlOpenTag(os, depth + command_depth,
- style.latexname());
+ lines += sgml::openTag(os, depth + command_depth, mixcont, style->latexname());
break;
}
- buf->simpleDocBookOnePar(os, p, desc_on,
- depth + 1 + command_depth);
+ buf->simpleDocBookOnePar(os, p, desc_on, depth + 1 + command_depth);
p = p->next();
string end_tag;
// write closing SGML tags
- switch (style.latextype) {
+ switch (style->latextype) {
case LATEX_ENVIRONMENT:
- if (!style.latexparam().empty()) {
- if (style.latexparam() == "CDATA")
+ if (!style->latexparam().empty()) {
+ if (style->latexparam() == "CDATA")
os << "]]>";
else
- buf->sgmlCloseTag(os, depth + command_depth,
- style.latexparam());
+ lines += sgml::closeTag(os, depth + command_depth, mixcont, style->latexparam());
}
break;
case LATEX_ITEM_ENVIRONMENT:
if (desc_on == 1) break;
end_tag= "para";
- buf->sgmlCloseTag(os, depth + 1 + command_depth, end_tag);
+ lines += sgml::closeTag(os, depth + 1 + command_depth, mixcont, end_tag);
break;
case LATEX_PARAGRAPH:
- buf->sgmlCloseTag(os, depth + command_depth, style.latexname());
+ lines += sgml::closeTag(os, depth + command_depth, mixcont, style->latexname());
break;
default:
- buf->sgmlCloseTag(os, depth + command_depth, style.latexname());
+ lines += sgml::closeTag(os, depth + command_depth, mixcont, style->latexname());
break;
}
}
if (!environment_stack[depth].empty()) {
if (environment_inner[depth] != "!-- --") {
item_name = "listitem";
- buf->sgmlCloseTag(os, command_depth + depth,
- item_name);
+ lines += sgml::closeTag(os, command_depth + depth, mixcont, item_name);
if (environment_inner[depth] == "varlistentry")
- buf->sgmlCloseTag(os, depth + command_depth,
- environment_inner[depth]);
+ lines += sgml::closeTag(os, depth + command_depth, mixcont, environment_inner[depth]);
}
- buf->sgmlCloseTag(os, depth + command_depth,
- environment_stack[depth]);
+ lines += sgml::closeTag(os, depth + command_depth, mixcont, environment_stack[depth]);
}
}
void InsetText::validate(LaTeXFeatures & features) const
{
- Paragraph * p = par;
- while (p) {
- p->validate(features);
- p = p->next();
- }
+ for_each(paragraphs.begin(), paragraphs.end(),
+ boost::bind(&Paragraph::validate, _1, boost::ref(features)));
}
-int InsetText::beginningOfMainBody(Buffer const * buf, Paragraph * p) const
+int InsetText::beginningOfMainBody(Paragraph * p) const
{
- if (textclasslist[buf->params.textclass][p->layout()].labeltype != LABEL_MANUAL)
+ if (p->layout()->labeltype != LABEL_MANUAL)
return 0;
else
return p->beginningOfMainBody();
}
-void InsetText::getCursorPos(BufferView * bv,
- int & x, int & y) const
+void InsetText::getCursorPos(BufferView * bv, int & x, int & y) const
{
if (the_locking_inset) {
the_locking_inset->getCursorPos(bv, x, y);
return;
}
- x = cx(bv);
- y = cy(bv);
+ x = cx(bv) - top_x - TEXT_TO_INSET_OFFSET;
+ y = cy(bv) - TEXT_TO_INSET_OFFSET;
}
-unsigned int InsetText::insetInInsetY()
+int InsetText::insetInInsetY() const
{
if (!the_locking_inset)
return 0;
LyXFont const font(getLyXText(bv)->getFont(bv->buffer(), cpar(bv), cpos(bv)));
- int const asc = lyxfont::maxAscent(font);
- int const desc = lyxfont::maxDescent(font);
+ int const asc = font_metrics::maxAscent(font);
+ int const desc = font_metrics::maxDescent(font);
if (isCursorVisible())
bv->hideLockedInsetCursor();
LyXFont const font =
getLyXText(bv)->getFont(bv->buffer(), cpar(bv), cpos(bv));
- int const asc = lyxfont::maxAscent(font);
- int const desc = lyxfont::maxDescent(font);
+ int const asc = font_metrics::maxAscent(font);
+ int const desc = font_metrics::maxDescent(font);
- bv->fitLockedInsetCursor(cx(bv), ciy(bv), asc, desc);
+ bv->fitLockedInsetCursor(cx(bv), cy(bv), asc, desc);
if (show)
bv->showLockedInsetCursor(cx(bv), cy(bv), asc, desc);
setCursorVisible(true);
LyXFont const font =
getLyXText(bv)->getFont(bv->buffer(), cpar(bv), cpos(bv));
- int const asc = lyxfont::maxAscent(font);
- int const desc = lyxfont::maxDescent(font);
+ int const asc = font_metrics::maxAscent(font);
+ int const desc = font_metrics::maxDescent(font);
if (bv->fitLockedInsetCursor(cx(bv), cy(bv), asc, desc))
need_update |= FULL;
}
-UpdatableInset::RESULT
+Inset::RESULT
InsetText::moveRight(BufferView * bv, bool activate_inset, bool selecting)
{
if (getLyXText(bv)->cursor.par()->isRightToLeftPar(bv->buffer()->params))
return moveLeftIntern(bv, false, activate_inset, selecting);
else
- return moveRightIntern(bv, false, activate_inset, selecting);
+ return moveRightIntern(bv, true, activate_inset, selecting);
}
-UpdatableInset::RESULT
+Inset::RESULT
InsetText::moveLeft(BufferView * bv, bool activate_inset, bool selecting)
{
if (getLyXText(bv)->cursor.par()->isRightToLeftPar(bv->buffer()->params))
return moveRightIntern(bv, true, activate_inset, selecting);
else
- return moveLeftIntern(bv, true, activate_inset, selecting);
+ return moveLeftIntern(bv, false, activate_inset, selecting);
}
-UpdatableInset::RESULT
-InsetText::moveRightIntern(BufferView * bv, bool behind,
+Inset::RESULT
+InsetText::moveRightIntern(BufferView * bv, bool front,
bool activate_inset, bool selecting)
{
if (!cpar(bv)->next() && (cpos(bv) >= cpar(bv)->size()))
return FINISHED_RIGHT;
- if (activate_inset && checkAndActivateInset(bv, behind))
+ if (activate_inset && checkAndActivateInset(bv, front))
return DISPATCHED;
getLyXText(bv)->cursorRight(bv);
if (!selecting)
}
-UpdatableInset::RESULT
-InsetText::moveLeftIntern(BufferView * bv, bool behind,
+Inset::RESULT
+InsetText::moveLeftIntern(BufferView * bv, bool front,
bool activate_inset, bool selecting)
{
if (!cpar(bv)->previous() && (cpos(bv) <= 0))
getLyXText(bv)->cursorLeft(bv);
if (!selecting)
getLyXText(bv)->selection.cursor = getLyXText(bv)->cursor;
- if (activate_inset && checkAndActivateInset(bv, behind))
+ if (activate_inset && checkAndActivateInset(bv, front))
return DISPATCHED;
return DISPATCHED_NOUPDATE;
}
-UpdatableInset::RESULT
-InsetText::moveUp(BufferView * bv)
+Inset::RESULT InsetText::moveUp(BufferView * bv)
{
if (!crow(bv)->previous())
return FINISHED_UP;
}
-UpdatableInset::RESULT
-InsetText::moveDown(BufferView * bv)
+Inset::RESULT InsetText::moveDown(BufferView * bv)
{
if (!crow(bv)->next())
return FINISHED_DOWN;
return the_locking_inset->insertInset(bv, inset);
return false;
}
- bool clear = false;
- if (!lt) {
- lt = getLyXText(bv);
- clear = true;
- }
- setUndo(bv, Undo::FINISH, lt->cursor.par(), lt->cursor.par()->next());
- freezeUndo();
inset->setOwner(this);
hideInsetCursor(bv);
- lt->insertInset(bv, inset);
+ getLyXText(bv)->insertInset(bv, inset);
bv->fitCursor();
- if (clear)
- lt = 0;
updateLocal(bv, CURSOR_PAR|CURSOR, true);
- unFreezeUndo();
return true;
}
{
vector<string> label_list;
- Paragraph * tpar = par;
- while (tpar) {
- Paragraph::inset_iterator beg = tpar->inset_iterator_begin();
- Paragraph::inset_iterator end = tpar->inset_iterator_end();
+ ParagraphList::iterator pit = paragraphs.begin();
+ ParagraphList::iterator pend = paragraphs.end();
+ for (; pit != pend; ++pit) {
+ InsetList::iterator beg = pit->insetlist.begin();
+ InsetList::iterator end = pit->insetlist.end();
for (; beg != end; ++beg) {
- vector<string> const l = (*beg)->getLabelList();
+ vector<string> const l = beg.getInset()->getLabelList();
label_list.insert(label_list.end(), l.begin(), l.end());
}
- tpar = tpar->next();
}
return label_list;
}
the_locking_inset->setFont(bv, font, toggleall, selectall);
return;
}
- if ((!par->next() && !par->size()) || !cpar(bv)->size()) {
+ if ((!paragraphs.begin()->next() && paragraphs.begin()->empty()) || cpar(bv)->empty()) {
getLyXText(bv)->setFont(bv, font, toggleall);
return;
}
}
-bool InsetText::checkAndActivateInset(BufferView * bv, bool behind)
+bool InsetText::checkAndActivateInset(BufferView * bv, bool front)
{
if (cpar(bv)->isInset(cpos(bv))) {
- unsigned int x;
- unsigned int y;
Inset * inset =
static_cast<UpdatableInset*>(cpar(bv)->getInset(cpos(bv)));
if (!isHighlyEditableInset(inset))
return false;
- LyXFont const font =
- getLyXText(bv)->getFont(bv->buffer(), cpar(bv), cpos(bv));
- if (behind) {
- x = inset->width(bv, font);
- y = font.isRightToLeft() ? 0 : inset->descent(bv, font);
- } else {
- x = 0;
- y = font.isRightToLeft() ? inset->descent(bv, font) : 0;
- }
- //inset_x = cx(bv) - top_x + drawTextXOffset;
- //inset_y = cy(bv) + drawTextYOffset;
- inset->edit(bv, x, y, 0);
+ inset->edit(bv, front);
if (!the_locking_inset)
return false;
updateLocal(bv, CURSOR, false);
bool InsetText::checkAndActivateInset(BufferView * bv, int x, int y,
- int button)
+ mouse_button::state button)
{
x -= drawTextXOffset;
int dummyx = x;
int dummyy = y + insetAscent;
- Inset * inset = bv->checkInsetHit(getLyXText(bv), dummyx, dummyy);
+ Inset * inset = getLyXText(bv)->checkInsetHit(bv, dummyx, dummyy);
+ // we only do the edit() call if the inset was hit by the mouse
+ // or if it is a highly editable inset. So we should call this
+ // function from our own edit with button < 0.
+ // FIXME: GUII jbl. I've changed this to ::none for now which is probably
+ // WRONG
+ if (button == mouse_button::none && !isHighlyEditableInset(inset))
+ return false;
if (inset) {
if (x < 0)
x = insetWidth;
if (y < 0)
y = insetDescent;
- inset_x = cx(bv) - top_x + drawTextXOffset;
+ inset_x = cix(bv) - top_x + drawTextXOffset;
inset_y = ciy(bv) + drawTextYOffset;
inset->edit(bv, x - inset_x, y - inset_y, button);
if (!the_locking_inset)
{
// we have to unlock any locked inset otherwise we're in troubles
the_locking_inset = 0;
- while (par) {
- Paragraph * tmp = par->next();
- delete par;
- par = tmp;
- }
- par = new Paragraph(*p, same_id);
- par->setInsetOwner(this);
- Paragraph * np = par;
+ paragraphs.clear();
+ paragraphs.set(new Paragraph(*p, same_id));
+ paragraphs.begin()->setInsetOwner(this);
+ Paragraph * np = &*(paragraphs.begin());
while (p->next()) {
p = p->next();
np->next(new Paragraph(*p, same_id));
void InsetText::setText(string const & data, LyXFont const & font)
{
clear();
- for (unsigned int i=0; i < data.length(); ++i)
- par->insertChar(i, data[i], font);
+ for (unsigned int i = 0; i < data.length(); ++i)
+ paragraphs.begin()->insertChar(i, data[i], font);
reinitLyXText();
}
}
+int InsetText::cix(BufferView * bv) const
+{
+ // we do nothing dangerous so we use a local cache
+ LyXText * llt = getLyXText(bv);
+ int x = llt->cursor.ix() + top_x + TEXT_TO_INSET_OFFSET;
+ if (the_locking_inset) {
+ LyXFont font = llt->getFont(bv->buffer(), llt->cursor.par(),
+ llt->cursor.pos());
+ if (font.isVisibleRightToLeft())
+ x -= the_locking_inset->width(bv, font);
+ }
+ return x;
+}
+
+
int InsetText::cy(BufferView * bv) const
{
LyXFont font;
if (recursive && the_locking_inset)
return the_locking_inset->getLyXText(lbv, true);
LyXText * lt = cached_text.get();
- lyx::Assert(lt && lt->firstRow()->par() == par);
+ lyx::Assert(lt && lt->firstRow()->par() == &*(paragraphs.begin()));
return lt;
}
// Super UGLY! (Lgb)
it->second.remove = true;
if (recursive) {
/// then remove all LyXText in text-insets
- Paragraph * p = par;
- for (; p; p = p->next()) {
- p->deleteInsetsLyXText(bv);
- }
+ for_each(paragraphs.begin(), paragraphs.end(),
+ boost::bind(&Paragraph::deleteInsetsLyXText, _1, bv));
}
}
}
do_resize = 0;
// lyxerr << "InsetText::resizeLyXText\n";
- if (!par->next() && !par->size()) { // no data, resize not neccessary!
+ if (!paragraphs.begin()->next() && paragraphs.begin()->empty()) { // no data, resize not neccessary!
// we have to do this as a fixed width may have changed!
LyXText * t = getLyXText(bv);
saveLyXTextState(t);
LyXText * t = it->second.text.get();
saveLyXTextState(t);
- for (Paragraph * p = par; p; p = p->next()) {
- p->resizeInsetsLyXText(bv);
- }
+
+ for_each(paragraphs.begin(), paragraphs.end(),
+ boost::bind(&Paragraph::resizeInsetsLyXText, _1, bv));
+
t->init(bv, true);
restoreLyXTextState(bv, t);
if (the_locking_inset) {
- inset_x = cx(bv) - top_x + drawTextXOffset;
+ inset_x = cix(bv) - top_x + drawTextXOffset;
inset_y = ciy(bv) + drawTextYOffset;
}
- if (bv->screen()) {
- t->first_y = bv->screen()->topCursorVisible(t);
- }
+ t->first_y = bv->screen().topCursorVisible(t->cursor, t->first_y);
if (!owner()) {
updateLocal(bv, FULL, false);
// this will scroll the screen such that the cursor becomes visible
do_reinit = false;
do_resize = 0;
// lyxerr << "InsetText::reinitLyXText\n";
- for(Cache::iterator it = cache.begin(); it != cache.end(); ++it) {
+ for (Cache::iterator it = cache.begin(); it != cache.end(); ++it) {
lyx::Assert(it->second.text.get());
LyXText * t = it->second.text.get();
BufferView * bv = it->first;
saveLyXTextState(t);
- for (Paragraph * p = par; p; p = p->next()) {
- p->resizeInsetsLyXText(bv);
- }
+
+ for_each(paragraphs.begin(), paragraphs.end(),
+ boost::bind(&Paragraph::resizeInsetsLyXText, _1, bv));
+
t->init(bv, true);
restoreLyXTextState(bv, t);
if (the_locking_inset) {
- inset_x = cx(bv) - top_x + drawTextXOffset;
+ inset_x = cix(bv) - top_x + drawTextXOffset;
inset_y = ciy(bv) + drawTextYOffset;
}
- if (bv->screen()) {
- t->first_y = bv->screen()->topCursorVisible(t);
- }
+ t->first_y = bv->screen().topCursorVisible(t->cursor, t->first_y);
if (!owner()) {
updateLocal(bv, FULL, false);
// this will scroll the screen such that the cursor becomes visible
{
bool changed = false;
- for (Paragraph * p = par; p; p = p->next()) {
- for (int i = 0; i < p->size(); ++i) {
- if (p->getChar(i) == Paragraph::META_NEWLINE) {
+ ParagraphList::iterator it = paragraphs.begin();
+ ParagraphList::iterator end = paragraphs.end();
+ for (; it != end; ++it) {
+ for (int i = 0; i < it->size(); ++i) {
+ if (it->getChar(i) == Paragraph::META_NEWLINE) {
changed = true;
- p->erase(i);
+ it->erase(i);
}
}
}
if ((top_x + drawTextXOffset + w) > pain.paperWidth())
w = pain.paperWidth();
// w -= TEXT_TO_INSET_OFFSET;
- pain.fillRectangle(top_x, ty, w+1, h+1, backgroundColor());
+ pain.fillRectangle(top_x + 1, ty + 1, w - 1, h - 1, backgroundColor());
cleared = true;
need_update = FULL;
frame_is_visible = false;
Paragraph * InsetText::getParFromID(int id) const
{
-#if 0
- Paragraph * result = par;
- Paragraph * ires = 0;
- while (result && result->id() != id) {
- if ((ires = result->getParFromID(id)))
- return ires;
- result = result->next();
- }
- return result;
-#else
- Paragraph * tmp = par;
- while (tmp) {
- if (tmp->id() == id) {
- return tmp;
+ ParagraphList::iterator it = paragraphs.begin();
+ ParagraphList::iterator end = paragraphs.end();
+ for (; it != end; ++it) {
+ if (it->id() == id) {
+ return &*(it);
}
- Paragraph * tmp2 = tmp->getParFromID(id);
+ Paragraph * tmp2 = it->getParFromID(id);
if (tmp2 != 0) {
return tmp2;
}
- tmp = tmp->next();
}
return 0;
-#endif
}
if (the_locking_inset)
if ((result = the_locking_inset->firstParagraph()))
return result;
- return par;
+ return &*(paragraphs.begin());
}
Paragraph * InsetText::getFirstParagraph(int i) const
{
- return (i == 0) ? par : 0;
+ return (i == 0) ? &*(paragraphs.begin()) : 0;
}
Paragraph * InsetText::paragraph() const
{
- return par;
+ return &*(paragraphs.begin());
}
// as we could have to insert a paragraph before this one and just
// link the actual to a new ones next and set it with this function
// and are done!
- par = p;
+ paragraphs.set(p);
// set ourself as owner for all the paragraphs inserted!
- Paragraph * np = par;
- while (np) {
- np->setInsetOwner(this);
- np = np->next();
- }
+ for_each(paragraphs.begin(), paragraphs.end(),
+ boost::bind(&Paragraph::setInsetOwner, _1, this));
+
reinitLyXText();
// redraw myself when asked for
need_update = INIT;
if (id_arg == id())
return const_cast<InsetText *>(this);
- Paragraph * lp = par;
-
- while (lp) {
- for (Paragraph::inset_iterator it = lp->inset_iterator_begin(),
- en = lp->inset_iterator_end();
- it != en; ++it)
- {
- if ((*it)->id() == id_arg)
- return *it;
- Inset * in = (*it)->getInsetFromID(id_arg);
+ ParagraphList::iterator pit = paragraphs.begin();
+ ParagraphList::iterator pend = paragraphs.end();
+ for (; pit != pend; ++pit) {
+ InsetList::iterator it = pit->insetlist.begin();
+ InsetList::iterator end = pit->insetlist.end();
+ for (; it != end; ++it) {
+ if (it.getInset()->id() == id_arg)
+ return it.getInset();
+ Inset * in = it.getInset()->getInsetFromID(id_arg);
if (in)
return in;
}
- lp = lp->next();
}
return 0;
}
-string const InsetText::selectNextWordToSpellcheck(BufferView * bv, float & value) const
+WordLangTuple const
+InsetText::selectNextWordToSpellcheck(BufferView * bv,
+ float & value) const
{
bool clear = false;
- string str;
+ WordLangTuple word;
if (!lt) {
lt = getLyXText(bv);
clear = true;
}
if (the_locking_inset) {
- str = the_locking_inset->selectNextWordToSpellcheck(bv, value);
- if (!str.empty()) {
+ word = the_locking_inset->selectNextWordToSpellcheck(bv, value);
+ if (!word.word().empty()) {
value += cy(bv);
if (clear)
lt = 0;
- return str;
+ return word;
}
- // we have to go on checking so move cusor to the next char
+ // we have to go on checking so move cursor to the next char
lt->cursor.pos(lt->cursor.pos() + 1);
}
- str = lt->selectNextWordToSpellcheck(bv, value);
- if (str.empty())
+ word = lt->selectNextWordToSpellcheck(bv, value);
+ if (word.word().empty())
bv->unlockInset(const_cast<InsetText *>(this));
else
value = cy(bv);
if (clear)
lt = 0;
- return str;
+ return word;
}
if (need_update & SELECTION)
need_update = NONE;
- bv->screen()->toggleSelection(lt, bv, kill_selection, y_offset, x);
+ bv->screen().toggleSelection(lt, bv, kill_selection, y_offset, x);
if (clear)
lt = 0;
}
bool InsetText::searchForward(BufferView * bv, string const & str,
bool cs, bool mw)
{
+ bool clear = false;
+ if (!lt) {
+ lt = getLyXText(bv);
+ clear = true;
+ }
if (the_locking_inset) {
if (the_locking_inset->searchForward(bv, str, cs, mw))
return true;
- bool clear = false;
- if (!lt) {
- lt = getLyXText(bv);
- clear = true;
- }
- Paragraph * lpar = lt->cursor.par();
- pos_type pos = lt->cursor.pos();
- if (pos < lpar->size() - 1)
- ++pos;
- else {
- pos = 0;
- lpar = lpar->next();
- }
- if (!lpar) {
- if (clear)
- lt = 0;
- // we have to unlock ourself in this function by default!
- bv->unlockInset(const_cast<InsetText *>(this));
- return false;
- }
- lt->setCursor(bv, lpar, pos);
- if (clear)
- lt = 0;
- }
- if (LyXFind(bv, str, true, true, cs , mw)) {
- return true;
+ lt->cursorRight(bv, true);
+ }
+ lyxfind::SearchResult result =
+ lyxfind::LyXFind(bv, lt, str, true, cs, mw);
+
+ if (result == lyxfind::SR_FOUND) {
+ LyXCursor cur = lt->cursor;
+ bv->unlockInset(bv->theLockingInset());
+ if (bv->lockInset(this))
+ locked = true;
+ lt->cursor = cur;
+ lt->setSelectionOverString(bv, str);
+ updateLocal(bv, SELECTION, false);
}
- // we have to unlock ourself in this function by default!
- bv->unlockInset(const_cast<InsetText *>(this));
- return false;
+ if (clear)
+ lt = 0;
+ return (result != lyxfind::SR_NOT_FOUND);
}
bool InsetText::searchBackward(BufferView * bv, string const & str,
bool cs, bool mw)
{
- if (the_locking_inset)
+ if (the_locking_inset) {
if (the_locking_inset->searchBackward(bv, str, cs, mw))
return true;
- if (LyXFind(bv, str, false, true, cs, mw)) {
- return true;
}
- // we have to unlock ourself in this function by default!
- bv->unlockInset(const_cast<InsetText *>(this));
- return false;
+ bool clear = false;
+ if (!lt) {
+ lt = getLyXText(bv);
+ clear = true;
+ }
+ if (!locked) {
+ Paragraph * p = &*(paragraphs.begin());
+ while (p->next())
+ p = p->next();
+ lt->setCursor(bv, p, p->size());
+ }
+ lyxfind::SearchResult result =
+ lyxfind::LyXFind(bv, lt, str, false, cs, mw);
+
+ if (result == lyxfind::SR_FOUND) {
+ LyXCursor cur = lt->cursor;
+ bv->unlockInset(bv->theLockingInset());
+ if (bv->lockInset(this))
+ locked = true;
+ lt->cursor = cur;
+ lt->setSelectionOverString(bv, str);
+ updateLocal(bv, SELECTION, false);
+ }
+ if (clear)
+ lt = 0;
+ return (result != lyxfind::SR_NOT_FOUND);
}
}
-void InsetText::collapseParagraphs(BufferParams const & bparams) const
+void InsetText::collapseParagraphs(BufferView * bv) const
{
- while(par->next()) {
- if (par->size() && par->next()->size() &&
- !par->isSeparator(par->size()-1))
+ BufferParams const & bparams = bv->buffer()->params;
+ LyXText * llt = getLyXText(bv);
+
+ while (paragraphs.begin()->next()) {
+ if (!paragraphs.begin()->empty() && !paragraphs.begin()->next()->empty() &&
+ !paragraphs.begin()->isSeparator(paragraphs.begin()->size() - 1))
{
- par->insertChar(par->size(), ' ');
+ paragraphs.begin()->insertChar(paragraphs.begin()->size(), ' ');
}
- par->pasteParagraph(bparams);
+ if (llt->selection.set()) {
+ if (llt->selection.start.par() == paragraphs.begin()->next()) {
+ llt->selection.start.par(&*(paragraphs.begin()));
+ llt->selection.start.pos(
+ llt->selection.start.pos() + paragraphs.begin()->size());
+ }
+ if (llt->selection.end.par() == paragraphs.begin()->next()) {
+ llt->selection.end.par(&*(paragraphs.begin()));
+ llt->selection.end.pos(
+ llt->selection.end.pos() + paragraphs.begin()->size());
+ }
+ }
+ mergeParagraph(bparams, &*paragraphs.begin());
}
reinitLyXText();
}
lastbuffer->next()->previous(lastbuffer);
lastbuffer = lastbuffer->next();
}
- lastbuffer = par;
+ lastbuffer = &*(paragraphs.begin());
while (lastbuffer->next())
lastbuffer = lastbuffer->next();
- if (newpar->size() && lastbuffer->size() &&
- !lastbuffer->isSeparator(lastbuffer->size()-1))
+ if (!newpar->empty() && !lastbuffer->empty() &&
+ !lastbuffer->isSeparator(lastbuffer->size() - 1))
{
lastbuffer->insertChar(lastbuffer->size(), ' ');
}
// paste it!
lastbuffer->next(buf);
buf->previous(lastbuffer);
- lastbuffer->pasteParagraph(bparams);
+ mergeParagraph(bparams, lastbuffer);
reinitLyXText();
}
+
+
+void InsetText::addPreview(grfx::PreviewLoader & loader) const
+{
+ Paragraph * par = getFirstParagraph(0);
+ while (par) {
+ InsetList::iterator it = par->insetlist.begin();
+ InsetList::iterator end = par->insetlist.end();
+ for (; it != end; ++it) {
+ it.getInset()->addPreview(loader);
+ }
+
+ par = par->next();
+ }
+}