#include "mathed/formulabase.h"
#include "support/filetools.h"
+#include "support/globbing.h"
#include "support/path_defines.h"
#include "support/tostr.h"
using lyx::support::AddPath;
using lyx::support::bformat;
+using lyx::support::FileFilterList;
using lyx::support::FileSearch;
using lyx::support::IsDirWriteable;
using lyx::support::MakeDisplayPath;
} // anon namespace
-BufferView::Pimpl::Pimpl(BufferView * bv, LyXView * owner,
+BufferView::Pimpl::Pimpl(BufferView & bv, LyXView * owner,
int xpos, int ypos, int width, int height)
- : bv_(bv), owner_(owner), buffer_(0), cursor_timeout(400),
+ : bv_(&bv), owner_(owner), buffer_(0), cursor_timeout(400),
using_xterm_cursor(false), cursor_(bv)
{
+ xsel_cache_.set = false;
+
workarea_.reset(WorkAreaFactory::create(xpos, ypos, width, height));
screen_.reset(LyXScreenFactory::create(workarea()));
if (errorConnection_.connected())
disconnectBuffer();
- errorConnection_ = buf.error.connect(boost::bind(&BufferView::Pimpl::addError, this, _1));
- messageConnection_ = buf.message.connect(boost::bind(&LyXView::message, owner_, _1));
- busyConnection_ = buf.busy.connect(boost::bind(&LyXView::busy, owner_, _1));
- titleConnection_ = buf.updateTitles.connect(boost::bind(&LyXView::updateWindowTitle, owner_));
- timerConnection_ = buf.resetAutosaveTimers.connect(boost::bind(&LyXView::resetAutosaveTimer, owner_));
- readonlyConnection_ = buf.readonly.connect(boost::bind(&BufferView::Pimpl::showReadonly, this, _1));
- closingConnection_ = buf.closing.connect(boost::bind(&BufferView::Pimpl::buffer, this, (Buffer *)0));
+ errorConnection_ =
+ buf.error.connect(boost::bind(&BufferView::Pimpl::addError, this, _1));
+ messageConnection_ =
+ buf.message.connect(boost::bind(&LyXView::message, owner_, _1));
+ busyConnection_ =
+ buf.busy.connect(boost::bind(&LyXView::busy, owner_, _1));
+ titleConnection_ =
+ buf.updateTitles.connect(boost::bind(&LyXView::updateWindowTitle, owner_));
+ timerConnection_ =
+ buf.resetAutosaveTimers.connect(boost::bind(&LyXView::resetAutosaveTimer, owner_));
+ readonlyConnection_ =
+ buf.readonly.connect(boost::bind(&BufferView::Pimpl::showReadonly, this, _1));
+ closingConnection_ =
+ buf.closing.connect(boost::bind(&BufferView::Pimpl::buffer, this, (Buffer *)0));
}
<< b << ')' << endl;
if (buffer_) {
disconnectBuffer();
- delete bv_->text;
- bv_->text = 0;
+ //delete bv_->text();
+ //bv_->setText(0);
}
// set current buffer
lyxerr[Debug::INFO] << "Buffer addr: " << buffer_ << endl;
connectBuffer(*buffer_);
+ buffer_->text().init(bv_);
+ buffer_->text().textwidth_ = workarea().workWidth();
+ buffer_->text().fullRebreak();
+
// If we don't have a text object for this, we make one
- if (bv_->text == 0)
+ if (bv_->text() == 0)
resizeCurrentBuffer();
// FIXME: needed when ?
// Don't forget to update the Layout
if (buffer_)
- owner_->setLayout(bv_->text->cursorPar()->layout()->name());
+ owner_->setLayout(bv_->text()->cursorPar()->layout()->name());
if (lyx::graphics::Previews::activated() && buffer_)
lyx::graphics::Previews::get().generateBufferPreviews(*buffer_);
void BufferView::Pimpl::redoCurrentBuffer()
{
lyxerr[Debug::INFO] << "BufferView::redoCurrentBuffer" << endl;
- if (buffer_ && bv_->text) {
+ if (buffer_ && bv_->text()) {
resizeCurrentBuffer();
updateScrollbar();
owner_->updateLayoutChoice();
pos_type pos = 0;
pos_type selstartpos = 0;
pos_type selendpos = 0;
- bool selection = false;
+ bool sel = false;
bool mark_set = false;
owner_->busy(true);
owner_->message(_("Formatting document..."));
- if (bv_->text) {
- par = bv_->text->cursor.par();
- pos = bv_->text->cursor.pos();
- selstartpar = bv_->text->selection.start.par();
- selstartpos = bv_->text->selection.start.pos();
- selendpar = bv_->text->selection.end.par();
- selendpos = bv_->text->selection.end.pos();
- selection = bv_->text->selection.set();
- mark_set = bv_->text->selection.mark();
- bv_->text->fullRebreak();
- update();
- } else {
- bv_->text = new LyXText(bv_, 0, false, bv_->buffer()->paragraphs());
- bv_->text->init(bv_);
- }
+ LyXText * text = bv_->text();
+ lyxerr << "### resizeCurrentBuffer: text " << text << endl;
+ if (!text)
+ return;
+
+ par = bv_->cursor().par();
+ pos = bv_->cursor().pos();
+ selstartpar = bv_->selStart().par();
+ selstartpos = bv_->selStart().pos();
+ selendpar = bv_->selEnd().par();
+ selendpos = bv_->selEnd().pos();
+ sel = bv_->selection().set();
+ mark_set = bv_->selection().mark();
+ text->textwidth_ = bv_->workWidth();
+ text->fullRebreak();
+ update();
if (par != -1) {
- bv_->text->selection.set(true);
+ bv_->selection().set(true);
// At this point just to avoid the Delete-Empty-Paragraph-
// Mechanism when setting the cursor.
- bv_->text->selection.mark(mark_set);
- if (selection) {
- bv_->text->setCursor(selstartpar, selstartpos);
- bv_->text->selection.cursor = bv_->text->cursor;
- bv_->text->setCursor(selendpar, selendpos);
- bv_->text->setSelection();
- bv_->text->setCursor(par, pos);
+ bv_->selection().mark(mark_set);
+ if (sel) {
+ text->setCursor(selstartpar, selstartpos);
+ bv_->resetAnchor();
+ text->setCursor(selendpar, selendpos);
+ bv_->setSelection();
+ text->setCursor(par, pos);
} else {
- bv_->text->setCursor(par, pos);
- bv_->text->selection.cursor = bv_->text->cursor;
- bv_->text->selection.set(false);
+ text->setCursor(par, pos);
+ bv_->resetAnchor();
+ bv_->selection().set(false);
}
}
void BufferView::Pimpl::updateScrollbar()
{
- if (!bv_->text) {
+ if (!bv_->text()) {
lyxerr[Debug::GUI] << "no text in updateScrollbar" << endl;
workarea().setScrollbarParams(0, 0, 0);
return;
}
- LyXText const & t = *bv_->text;
+ LyXText const & t = *bv_->text();
lyxerr[Debug::GUI] << "Updating scrollbar: h " << t.height << ", top_y() "
<< top_y() << ", default height " << defaultRowHeight() << endl;
int const first = top_y() + height;
int const last = top_y() + workarea().workHeight() - height;
- LyXText * text = bv_->text;
- if (text->cursor.y() < first)
+ LyXText * text = bv_->text();
+ if (text->cursorY() < first)
text->setCursorFromCoordinates(0, first);
- else if (text->cursor.y() > last)
+ else if (text->cursorY() > last)
text->setCursorFromCoordinates(0, last);
owner_->updateLayoutChoice();
if (!buffer_)
return;
- LyXText const * t = bv_->text;
+ LyXText const * t = bv_->text();
int const line_height = defaultRowHeight();
// The new absolute coordinate
LyXText * text = bv_->getLyXText();
- if (text->selection.set() &&
- (!bv_->text->xsel_cache.set() ||
- text->selection.start != bv_->text->xsel_cache.start ||
- text->selection.end != bv_->text->xsel_cache.end))
+ if (!bv_->selection().set()) {
+ xsel_cache_.set = false;
+ return;
+ }
+
+ if (!xsel_cache_.set ||
+ bv_->cursor() != xsel_cache_.cursor ||
+ bv_->anchor() != xsel_cache_.anchor)
{
- bv_->text->xsel_cache = text->selection;
+ xsel_cache_.cursor = bv_->cursor();
+ xsel_cache_.anchor = bv_->anchor();
+ xsel_cache_.set = bv_->selection().set();
sel = text->selectionAsString(*bv_->buffer(), false);
- } else if (!text->selection.set()) {
- sel = string();
- bv_->text->xsel_cache.set(false);
- }
- if (!sel.empty()) {
- workarea().putClipboard(sel);
- }
+ if (!sel.empty())
+ workarea().putClipboard(sel);
+ }
}
{
if (available()) {
screen().hideCursor();
- bv_->getLyXText()->clearSelection();
- bv_->text->xsel_cache.set(false);
+ bv_->clearSelection();
+ xsel_cache_.set = false;
}
}
getParsInRange(buffer_->paragraphs(),
top_y(), top_y() + workarea().workHeight(),
beg, end);
- bv_->text->redoParagraphs(beg, end);
- bv_->getLyXText()->redoCursor();
+ bv_->text()->redoParagraphs(beg, end);
updateScrollbar();
}
screen().redraw(*bv_);
bool BufferView::Pimpl::available() const
{
- return buffer_ && bv_->text;
+ return buffer_ && bv_->text();
}
LyXText * text = bv_->getLyXText();
- if (!text->selection.set())
+ if (!bv_->selection().set())
return Change(Change::UNCHANGED);
- return text->getPar(text->selection.start)
- ->lookupChangeFull(text->selection.start.pos());
+ return text->getPar(bv_->selStart())
+ ->lookupChangeFull(bv_->selStart().pos());
}
if (i >= saved_positions_num)
return;
saved_positions[i] = Position(buffer_->fileName(),
- bv_->text->cursorPar()->id(),
- bv_->text->cursor.pos());
+ bv_->text()->cursorPar()->id(),
+ bv_->text()->cursor().pos());
if (i > 0)
owner_->message(bformat(_("Saved bookmark %1$s"), tostr(i)));
}
string const fname = saved_positions[i].filename;
- bv_->text->clearSelection();
+ bv_->clearSelection();
if (fname != buffer_->fileName()) {
Buffer * b = 0;
if (par == buffer_->par_iterator_end())
return;
- bv_->text->setCursor(par.pit(),
+ bv_->text()->setCursor(par.pit(),
min(par->size(), saved_positions[i].par_pos));
if (i > 0)
void BufferView::Pimpl::center()
{
- LyXText * text = bv_->text;
+ LyXText * text = bv_->text();
- text->clearSelection();
+ bv_->clearSelection();
int const half_height = workarea().workHeight() / 2;
- int new_y = std::max(0, text->cursor.y() - half_height);
+ int new_y = std::max(0, text->cursorY() - half_height);
// FIXME: look at this comment again ...
// This updates top_y() but means the fitCursor() call
InsetOld * BufferView::Pimpl::getInsetByCode(InsetOld::Code code)
{
#if 0
- LyXCursor cursor = bv_->getLyXText()->cursor;
+ CursorSlice cursor = bv_->getLyXText()->cursor;
Buffer::inset_iterator it =
find_if(Buffer::inset_iterator(
- cursorPar(), cursor.pos()),
+ cursorPar(), cursor().pos()),
buffer_->inset_iterator_end(),
lyx::compare_memfun(&Inset::lyxCode, code));
return it != buffer_->inset_iterator_end() ? (*it) : 0;
// should work for now. Better infrastructure is coming. (Lgb)
Buffer * b = bv_->buffer();
- LyXText * text = bv_->getLyXText();
+ LyXText * text = bv_->getLyXText();
Buffer::inset_iterator beg = b->inset_iterator_begin();
Buffer::inset_iterator end = b->inset_iterator_end();
- bool cursorPar_seen = false;
+ bool cursor_par_seen = false;
for (; beg != end; ++beg) {
if (beg.getPar() == text->cursorPar()) {
- cursorPar_seen = true;
+ cursor_par_seen = true;
}
- if (cursorPar_seen) {
+ if (cursor_par_seen) {
if (beg.getPar() == text->cursorPar()
- && beg.getPos() >= text->cursor.pos()) {
+ && beg.getPos() >= text->cursor().pos()) {
break;
} else if (beg.getPar() != text->cursorPar()) {
break;
FileDialog::Result result =
fileDlg.open(initpath,
- _("*.lyx| LyX Documents (*.lyx)"));
+ FileFilterList(_("LyX Documents (*.lyx)")),
+ string());
if (result.first == FileDialog::Later)
return;
buf->undostack().clear();
} else {
update();
- bv_->text->setCursor(0, 0);
+ bv_->text()->setCursor(0, 0);
#warning changes FIXME
bool found = lyx::find::findNextChange(bv_);
if (found) {
}
#warning remove me
-LCursor theTempCursor(0);
+LCursor theTempCursor;
namespace {
InsetOld * insetFromCoords(BufferView * bv, int x, int y)
{
- LyXText * text = bv->text;
+ lyxerr << "insetFromCoords" << endl;
+ LyXText * text = bv->text();
InsetOld * inset = 0;
- theTempCursor = LCursor(bv);
+ theTempCursor = LCursor(*bv);
while (true) {
- InsetOld * inset_hit = text->checkInsetHit(x, y);
- if (!inset_hit)
+ InsetOld * const inset_hit = text->checkInsetHit(x, y);
+ if (!inset_hit) {
+ lyxerr << "no further inset hit" << endl;
break;
+ }
inset = inset_hit;
- if (!inset_hit->descendable())
+ if (!inset->descendable()) {
+ lyxerr << "not descendable" << endl;
break;
- text = inset_hit->getText(0);
+ }
+ int const cell = inset->getCell(x, y + bv->top_y());
+ if (cell == -1)
+ break;
+ text = inset_hit->getText(cell);
lyxerr << "Hit inset: " << inset << " at x: " << x
<< " text: " << text << " y: " << y << endl;
theTempCursor.push(static_cast<UpdatableInset*>(inset));
}
+ lyxerr << "theTempCursor: " << theTempCursor << endl;
return inset;
}
bool BufferView::Pimpl::workAreaDispatch(FuncRequest const & cmd)
{
switch (cmd.action) {
+ case LFUN_MOUSE_MOTION: {
+ if (!available())
+ return false;
+ FuncRequest cmd1 = cmd;
+ UpdatableInset * inset = bv_->fullCursor().innerInset();
+ DispatchResult res;
+ if (inset) {
+ cmd1.x -= inset->x();
+ cmd1.y -= inset->y();
+ res = inset->dispatch(*bv_, cmd1);
+ } else {
+ cmd1.y += bv_->top_y();
+ res = bv_->fullCursor().innerText()->dispatch(*bv_, cmd1);
+ }
+
+ if (bv_->fitCursor() || res.update()) {
+ bv_->update();
+ bv_->fullCursor().updatePos();
+ }
+
+ return true;
+ }
+
case LFUN_MOUSE_PRESS:
- case LFUN_MOUSE_MOTION:
case LFUN_MOUSE_RELEASE:
case LFUN_MOUSE_DOUBLE:
case LFUN_MOUSE_TRIPLE: {
// handle this event.
// built temporary path to inset
- InsetOld * inset = insetFromCoords(bv_, cmd.x, cmd.y);
- FuncRequest cmd1(cmd, bv_);
+ InsetOld * inset = insetFromCoords(bv_, cmd.x, cmd.y);
DispatchResult res;
// try to dispatch to that inset
if (inset) {
- FuncRequest cmd2 = cmd1;
- lyxerr << "dispatching action " << cmd2.action
- << " to inset " << inset << endl;
+ FuncRequest cmd2 = cmd;
+ lyxerr << "dispatching action " << cmd2.action
+ << " to inset " << inset << endl;
cmd2.x -= inset->x();
cmd2.y -= inset->y();
- res = inset->dispatch(cmd2);
+ res = inset->dispatch(*bv_, cmd2);
if (res.update()) {
bv_->update();
- bv_->cursor().updatePos();
+ bv_->fullCursor().updatePos();
}
res.update(false);
switch (res.val()) {
case FINISHED:
case FINISHED_RIGHT:
- case FINISHED_UP:
+ case FINISHED_UP:
case FINISHED_DOWN:
theTempCursor.pop();
- bv_->cursor() = theTempCursor;
- bv_->cursor().innerText()->setCursorFromCoordinates(cmd.x, top_y() + cmd.y);
+ bv_->fullCursor(theTempCursor);
+ bv_->fullCursor().innerText()
+ ->setCursorFromCoordinates(cmd.x, top_y() + cmd.y);
if (bv_->fitCursor())
bv_->update();
return true;
// otherwise set cursor to surrounding LyXText
if (!res.dispatched()) {
lyxerr << "temp cursor is: " << theTempCursor << endl;
- lyxerr << "dispatching " << cmd1
+ lyxerr << "dispatching " << cmd
<< " to surrounding LyXText "
<< theTempCursor.innerText() << endl;
- bv_->cursor() = theTempCursor;
- res = bv_->cursor().innerText()->dispatch(cmd1);
+ bv_->fullCursor(theTempCursor);
+ FuncRequest cmd1 = cmd;
+ cmd1.y += bv_->top_y();
+ res = bv_->fullCursor().innerText()->dispatch(*bv_, cmd1);
if (bv_->fitCursor() || res.update())
bv_->update();
-
+
//return DispatchResult(true, true);
}
// see workAreaKeyPress
}
-bool BufferView::Pimpl::dispatch(FuncRequest const & ev_in)
+bool BufferView::Pimpl::dispatch(FuncRequest const & ev)
{
// Make sure that the cached BufferView is correct.
- FuncRequest ev = ev_in;
- ev.setView(bv_);
-
lyxerr[Debug::ACTION] << "BufferView::Pimpl::Dispatch:"
<< " action[" << ev.action << ']'
<< " arg[" << ev.argument << ']'
case LFUN_MATH_IMPORT_SELECTION: // Imports LaTeX from the X selection
case LFUN_MATH_DISPLAY: // Open or create a displayed math inset
case LFUN_MATH_MODE: // Open or create an inlined math inset
- mathDispatch(ev);
+ mathDispatch(*bv_, ev);
break;
- case LFUN_INSET_APPLY: {
-#warning is this code ever called?
- // Remove if not triggered. Mail lyx-devel if triggered.
- // This code was replaced by code in text3.C.
- BOOST_ASSERT(false);
- string const name = ev.getArg(0);
-
- InsetBase * inset = owner_->getDialogs().getOpenInset(name);
- if (inset) {
- // This works both for 'original' and 'mathed' insets.
- // Note that the localDispatch performs update also.
- FuncRequest fr(bv_, LFUN_INSET_MODIFY, ev.argument);
- inset->dispatch(fr);
- } else {
- FuncRequest fr(bv_, LFUN_INSET_INSERT, ev.argument);
- dispatch(fr);
- }
- }
- break;
-
case LFUN_INSET_INSERT: {
// Same as above.
BOOST_ASSERT(false);
- InsetOld * inset = createInset(ev);
+ InsetOld * inset = createInset(bv_, ev);
if (!inset || !insertInset(inset))
delete inset;
break;
break;
case LFUN_ACCEPT_ALL_CHANGES: {
- bv_->text->setCursor(0, 0);
+ bv_->text()->setCursor(0, 0);
#warning FIXME changes
while (lyx::find::findNextChange(bv_))
bv_->getLyXText()->acceptChange();
}
case LFUN_REJECT_ALL_CHANGES: {
- bv_->text->setCursor(0, 0);
+ bv_->text()->setCursor(0, 0);
#warning FIXME changes
while (lyx::find::findNextChange(bv_))
bv_->getLyXText()->rejectChange();
break;
}
+ case LFUN_WORD_FIND:
+ lyx::find::find(bv_, ev);
+ break;
+
+ case LFUN_WORD_REPLACE:
+ lyx::find::replace(bv_, ev);
+ break;
+
+ case LFUN_MARK_OFF:
+ bv_->clearSelection();
+ bv_->update();
+ bv_->resetAnchor();
+ ev.message(N_("Mark off"));
+ break;
+
+ case LFUN_MARK_ON:
+ bv_->clearSelection();
+ bv_->selection().mark(true);
+ bv_->update();
+ bv_->resetAnchor();
+ ev.message(N_("Mark on"));
+ break;
+
+ case LFUN_SETMARK:
+ bv_->clearSelection();
+ if (bv_->selection().mark()) {
+ ev.message(N_("Mark removed"));
+ } else {
+ bv_->selection().mark(true);
+ ev.message(N_("Mark set"));
+ }
+ bv_->resetAnchor();
+ bv_->update();
+ break;
+
case LFUN_UNKNOWN_ACTION:
ev.errorMessage(N_("Unknown function!"));
break;
default:
- return bv_->getLyXText()->dispatch(FuncRequest(ev, bv_)).dispatched();
+ return bv_->getLyXText()->dispatch(*bv_, ev).dispatched();
} // end of switch
return true;
bool BufferView::Pimpl::insertInset(InsetOld * inset, string const & lout)
{
-#ifdef LOCK
- // if we are in a locking inset we should try to insert the
- // inset there otherwise this is a illegal function now
- if (bv_->theLockingInset()) {
- if (bv_->theLockingInset()->insetAllowed(inset))
- return bv_->theLockingInset()->insertInset(bv_, inset);
- return false;
- }
-#endif
-
// not quite sure if we want this...
- bv_->text->recUndo(bv_->text->cursor.par());
+ bv_->text()->recUndo(bv_->text()->cursor().par());
freezeUndo();
- bv_->text->clearSelection();
+ bv_->clearSelection();
if (!lout.empty()) {
- bv_->text->breakParagraph(bv_->buffer()->paragraphs());
+ bv_->text()->breakParagraph(bv_->buffer()->paragraphs());
- if (!bv_->text->cursorPar()->empty()) {
- bv_->text->cursorLeft(bv_);
- bv_->text->breakParagraph(bv_->buffer()->paragraphs());
+ if (!bv_->text()->cursorPar()->empty()) {
+ bv_->text()->cursorLeft(bv_);
+ bv_->text()->breakParagraph(bv_->buffer()->paragraphs());
}
string lres = lout;
LyXTextClass const & tclass = buffer_->params().getLyXTextClass();
bool hasLayout = tclass.hasLayout(lres);
- bv_->text->setLayout(hasLayout ? lres : tclass.defaultLayoutName());
-
- bv_->text->setParagraph(
- VSpace(VSpace::NONE), VSpace(VSpace::NONE),
- Spacing(),
- LYX_ALIGN_LAYOUT,
- string(),
- 0);
+ bv_->text()->setLayout(hasLayout ? lres : tclass.defaultLayoutName());
+ bv_->text()->setParagraph(Spacing(), LYX_ALIGN_LAYOUT, string(), 0);
}
- bv_->cursor().innerText()->insertInset(inset);
+ bv_->fullCursor().innerText()->insertInset(inset);
unFreezeUndo();
return true;
}
string const & from, string const & to)
{
bool need_update = false;
- LyXCursor cursor = bv_->text->cursor;
- LyXCursor tmpcursor = cursor;
- cursor.par(tmpcursor.par());
- cursor.pos(tmpcursor.pos());
+ CursorSlice cur = bv_->text()->cursor();
ParIterator end = bv_->buffer()->par_iterator_end();
for (ParIterator it = bv_->buffer()->par_iterator_begin();
// FIXME
- // The test it.size()==1 was needed to prevent crashes.
- // How to set the cursor correctly when it.size()>1 ??
+ // The test it.size() == 1 was needed to prevent crashes.
+ // How to set the cursor correctly when it.size() > 1 ??
if (it.size() == 1) {
- bv_->text->setCursorIntern(bv_->text->parOffset(it.pit()), 0);
- bv_->text->redoParagraph(bv_->text->cursorPar());
+ bv_->text()->setCursorIntern(bv_->text()->parOffset(it.pit()), 0);
+ bv_->text()->redoParagraph(bv_->text()->cursorPar());
}
}
}
- bv_->text->setCursorIntern(cursor.par(), cursor.pos());
+ bv_->text()->setCursorIntern(cur.par(), cur.pos());
return need_update;
}
data = "update " + tostr(accept) + '\n' + data;
bv_->owner()->getDialogs().update("paragraph", data);
}
-
-