preliminary 'global cursor' stuff

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@7784 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
André Pönitz 2003-09-17 16:44:51 +00:00
parent f6bc7cd3ec
commit 57536be00f
7 changed files with 169 additions and 6 deletions

View File

@ -492,7 +492,8 @@ int BufferView::unlockInset(UpdatableInset * inset)
dispatch(FuncRequest(LFUN_PARAGRAPH_UPDATE)); dispatch(FuncRequest(LFUN_PARAGRAPH_UPDATE));
finishUndo(); finishUndo();
return 0; return 0;
} else if (inset && theLockingInset() && }
if (inset && theLockingInset() &&
theLockingInset()->unlockInsetInInset(this, inset)) { theLockingInset()->unlockInsetInInset(this, inset)) {
// Tell the paragraph dialog that we changed paragraph // Tell the paragraph dialog that we changed paragraph
dispatch(FuncRequest(LFUN_PARAGRAPH_UPDATE)); dispatch(FuncRequest(LFUN_PARAGRAPH_UPDATE));

View File

@ -23,6 +23,7 @@
#include "buffer_funcs.h" #include "buffer_funcs.h"
#include "bufferlist.h" #include "bufferlist.h"
#include "bufferparams.h" #include "bufferparams.h"
#include "cursor.h"
#include "debug.h" #include "debug.h"
#include "factory.h" #include "factory.h"
#include "FloatList.h" #include "FloatList.h"
@ -456,8 +457,8 @@ void BufferView::Pimpl::resizeCurrentBuffer()
} }
#warning does not help much #warning does not help much
bv_->text->redoParagraphs(bv_->text->ownerParagraphs().begin(), //bv_->text->redoParagraphs(bv_->text->ownerParagraphs().begin(),
bv_->text->ownerParagraphs().end()); // bv_->text->ownerParagraphs().end());
if (par != bv_->text->ownerParagraphs().end()) { if (par != bv_->text->ownerParagraphs().end()) {
bv_->text->selection.set(true); bv_->text->selection.set(true);

View File

@ -137,6 +137,8 @@ lyx_SOURCES = \
converter.h \ converter.h \
counters.C \ counters.C \
counters.h \ counters.h \
cursor.C \
cursor.h \
debug.C \ debug.C \
debug.h \ debug.h \
dimension.C \ dimension.C \

View File

@ -368,8 +368,14 @@ string const currentState(BufferView * bv)
state << _(", Position: ") << text->cursor.pos(); state << _(", Position: ") << text->cursor.pos();
RowList::iterator rit = text->cursorRow(); RowList::iterator rit = text->cursorRow();
state << bformat(_(", Row b:%1$d e:%2$d"), rit->pos(), rit->end()); state << bformat(_(", Row b:%1$d e:%2$d"), rit->pos(), rit->end());
state << _(", Inset: ") << state << _(", Inset: ");
(text->cursor.par()->inInset() ? text->cursor.par()->inInset()->id() : -1); InsetOld * inset = text->cursor.par()->inInset();
if (inset)
state << inset << " id: " << inset->id()
<< " text: " << inset->getLyXText(bv, true)
<< " owner: " << inset->owner();
else
state << -1;
#endif #endif
return state.str(); return state.str();
} }

78
src/cursor.C Normal file
View File

@ -0,0 +1,78 @@
/**
* \file cursor.C
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Jürgen Vigna
*
* Full author contact details are available in file CREDITS.
*/
#include <config.h>
#include "buffer.h"
#include "BufferView.h"
#include "cursor.h"
#include "debug.h"
#include "iterators.h"
#include "lyxtext.h"
#include "paragraph.h"
#include "insets/updatableinset.h"
using std::vector;
dispatch_result Cursor::dispatch(FuncRequest const &)
{
for (int i = data_.size() - 1; i >= 0; --i) {
lyxerr << "trying to dispatch to " << data_[i].text_ << std::endl;
}
return UNDISPATCHED;
}
void buildCursor(Cursor & cursor, BufferView & bv)
{
UpdatableInset * inset = bv.theLockingInset();
lyxerr << "\nbuildCursor: " << inset << std::endl;
if (!inset)
return;
inset = inset->getLockingInset();
bool ok = false;
ParIterator pit = bv.buffer()->par_iterator_begin();
ParIterator end = bv.buffer()->par_iterator_end();
for ( ; pit != end && !ok; ++pit) {
InsetList::iterator it = pit->insetlist.begin();
InsetList::iterator iend = pit->insetlist.end();
for ( ; it != iend && !ok; ++it)
if (it->inset == inset || it->inset == inset->owner())
ok = true;
}
if (!ok) {
lyxerr << " tli not found! inset: " << inset << std::endl;
return;
}
vector<ParagraphList::iterator> pits;
vector<ParagraphList const *> plists;
vector<LyXText *> texts;
/*
pit.getPits(pits, plists, texts);
cursor.data_.resize(pits.size());
for (size_t i = 0, n = pits.size(); i != n; ++i) {
cursor.data_[i].text_ = texts[i];
cursor.data_[i].pit_ = pits[i];
//cursor.data_[i].pos_ = texts[i]->cursor.pos();
cursor.data_[i].pos_ = 0;
lyxerr << " text: " << cursor.data_[i].text_
<< " pit: " << cursor.data_[i].pit_->id()
<< " pos: " << cursor.data_[i].pos_
<< std::endl;
}
*/
}

62
src/cursor.h Normal file
View File

@ -0,0 +1,62 @@
// -*- C++ -*-
/**
* \file cursor.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author André Pönitz
*
* Full author contact details are available in file CREDITS.
*/
#ifndef CURSOR_H
#define CURSOR_H
#include "ParagraphList_fwd.h"
#include "textcursor.h"
#include "support/types.h"
#include "insets/insetbase.h"
#include <vector>
class LyXText;
/**
* The cursor class describes the position of a cursor within a document.
*/
class CursorItem : public TextCursor {
public:
///
CursorItem() : text_(0) {}
public:
///
LyXText * text_;
///
ParagraphList::iterator pit_;
///
int pos_;
};
class Cursor {
public:
///
Cursor() {}
///
dispatch_result dispatch(FuncRequest const & cmd);
public:
/// mainly used as stack, bnut wee need random access
std::vector<CursorItem> data_;
};
/// build cursor from current cursor in view
void buildCursor(Cursor & cursor, BufferView & bv);
/// build cursor from (x,y) coordinates
void buildCursor(Cursor & cursor, BufferView & bv, int x, int y);
#endif // LYXCURSOR_H

View File

@ -27,6 +27,7 @@
#include "bufferlist.h" #include "bufferlist.h"
#include "bufferparams.h" #include "bufferparams.h"
#include "BufferView.h" #include "BufferView.h"
#include "cursor.h"
#include "debug.h" #include "debug.h"
#include "encoding.h" #include "encoding.h"
#include "exporter.h" #include "exporter.h"
@ -891,6 +892,18 @@ void LyXFunc::dispatch(FuncRequest const & ev, bool verbose)
if (view()->available()) if (view()->available())
view()->hideCursor(); view()->hideCursor();
#if 1
{
Cursor cursor;
buildCursor(cursor, *view());
if (cursor.dispatch(FuncRequest(ev, view())) == DISPATCHED) {
lyxerr << "dispatched by Cursor::dispatch()\n";
goto exit_with_message;
}
}
#endif
if (view()->available() && view()->theLockingInset()) { if (view()->available() && view()->theLockingInset()) {
InsetOld::RESULT result; InsetOld::RESULT result;
if (action > 1 || (action == LFUN_UNKNOWN_ACTION && if (action > 1 || (action == LFUN_UNKNOWN_ACTION &&