globalize the cursor

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8339 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
André Pönitz 2004-01-13 15:25:52 +00:00
parent d8f81752eb
commit 7cfc5e86a4
8 changed files with 115 additions and 198 deletions

View File

@ -260,8 +260,6 @@ lyx_SOURCES = \
text.C \ text.C \
text2.C \ text2.C \
text3.C \ text3.C \
textcursor.C \
textcursor.h \
toc.C \ toc.C \
toc.h \ toc.h \
trans.C \ trans.C \

View File

@ -12,7 +12,6 @@
#ifndef CURSOR_H #ifndef CURSOR_H
#define CURSOR_H #define CURSOR_H
#include "textcursor.h"
#include "cursor_slice.h" #include "cursor_slice.h"
#include <iosfwd> #include <iosfwd>
@ -30,7 +29,6 @@ class InsetTabular;
* The cursor class describes the position of a cursor within a document. * The cursor class describes the position of a cursor within a document.
*/ */
class LCursor { class LCursor {
public: public:
/// type for cell number in inset /// type for cell number in inset

View File

@ -112,7 +112,7 @@ void CursorSlice::setPos(int pos)
LyXText * CursorSlice::text() const LyXText * CursorSlice::text() const
{ {
return asUpdatableInset()->getText(idx_); return asUpdatableInset() ? asUpdatableInset()->getText(idx_) : 0;
} }
@ -155,24 +155,15 @@ bool operator>(CursorSlice const & p, CursorSlice const & q)
} }
//std::ostream & operator<<(std::ostream & os, CursorSlice const & p)
//{
// os << "(par: " << p.inset_ << " idx: " << p.idx_ << " pos: " << p.pos_ << ')';
// return os;
//}
std::ostream & operator<<(std::ostream & os, CursorSlice const & item) std::ostream & operator<<(std::ostream & os, CursorSlice const & item)
{ {
os << " inset: " << item.inset_ os << " inset: " << item.inset_
// << " text: " << item.text() << " text: " << item.text()
<< " idx: " << item.idx_ << " idx: " << item.idx_
// << " par: " << item.par_ << " par: " << item.par_
// << " pos: " << item.pos_ << " pos: " << item.pos_
// << " x: " << item.inset_->x() // << " x: " << item.inset_->x()
// << " y: " << item.inset_->y() // << " y: " << item.inset_->y()
; ;
return os; return os;
} }

View File

@ -15,13 +15,13 @@
#define LYXTEXT_H #define LYXTEXT_H
#include "bufferview_funcs.h" #include "bufferview_funcs.h"
#include "cursor_slice.h"
#include "Bidi.h" #include "Bidi.h"
#include "layout.h" #include "layout.h"
#include "lyxfont.h" #include "lyxfont.h"
#include "lyxtextclass.h" #include "lyxtextclass.h"
#include "ParagraphList_fwd.h" #include "ParagraphList_fwd.h"
#include "RowList_fwd.h" #include "RowList_fwd.h"
#include "textcursor.h"
#include "insets/inset.h" #include "insets/inset.h"
@ -41,17 +41,31 @@ class UpdatableInset;
class VSpace; class VSpace;
/** // The structure that keeps track of the selections set.
This class used to hold the mapping between buffer paragraphs and struct Selection {
screen rows. Nowadays, the Paragraphs take care of their rows Selection()
themselves and this contains just most of the code for manipulating : set_(false), mark_(false)
them and interaction with the Cursor. {}
*/ bool set() const {
return set_;
}
void set(bool s) {
set_ = s;
}
bool mark() const {
return mark_;
}
void mark(bool m) {
mark_ = m;
}
private:
bool set_; // former selection
bool mark_; // former mark_set
};
// The inheritance from TextCursor should go. It's just there to ease
// transition... /// This class encapsulates the main text data and operations in LyX
class LyXText : public TextCursor { class LyXText {
// Public Functions
public: public:
/// Constructor /// Constructor
LyXText(BufferView *, bool ininset); LyXText(BufferView *, bool ininset);
@ -164,11 +178,6 @@ public:
lyx::pos_type getColumnNearX(ParagraphList::iterator pit, lyx::pos_type getColumnNearX(ParagraphList::iterator pit,
Row const & row, int & x, bool & boundary) const; Row const & row, int & x, bool & boundary) const;
/// need the selection cursor:
void setSelection();
///
void clearSelection();
/// select the word we need depending on word_location /// select the word we need depending on word_location
void getWord(CursorSlice & from, CursorSlice & to, lyx::word_location const); void getWord(CursorSlice & from, CursorSlice & to, lyx::word_location const);
/// just selects the word the cursor is in /// just selects the word the cursor is in
@ -415,8 +424,38 @@ public:
/// access to the selection anchor /// access to the selection anchor
CursorSlice const & anchor() const; CursorSlice const & anchor() const;
///
void setSelection();
///
void clearSelection();
///
CursorSlice const & selStart() const;
///
CursorSlice const & selEnd() const;
///
CursorSlice & selStart();
///
CursorSlice & selEnd();
public: public:
/** The cursor.
Later this variable has to be removed. There should be no internal
cursor in a text (and thus not in a buffer). By keeping this it is
(I think) impossible to have several views with the same buffer, but
the cursor placed at different places.
[later]
Since the LyXText now has been moved from Buffer to BufferView
it should not be absolutely needed to move the cursor...
[even later]
Nevertheless, it should still be moved, in order to keep classes
and interdependencies small.
*/
// the other end of the selection
CursorSlice anchor_;
//
Selection selection;
/// ///
int height; int height;
/// ///

View File

@ -21,6 +21,7 @@
#include "buffer.h" #include "buffer.h"
#include "bufferparams.h" #include "bufferparams.h"
#include "BufferView.h" #include "BufferView.h"
#include "cursor.h"
#include "debug.h" #include "debug.h"
#include "dispatchresult.h" #include "dispatchresult.h"
#include "encoding.h" #include "encoding.h"
@ -1936,13 +1937,13 @@ int LyXText::cursorY(CursorSlice const & cur) const
CursorSlice & LyXText::cursor() CursorSlice & LyXText::cursor()
{ {
return cursor_; return bv()->cursor().top();
} }
CursorSlice const & LyXText::cursor() const CursorSlice const & LyXText::cursor() const
{ {
return cursor_; return bv()->cursor().top();
} }
@ -1958,3 +1959,55 @@ CursorSlice const & LyXText::anchor() const
} }
CursorSlice const & LyXText::selStart() const
{
if (!selection.set())
return cursor();
// can't use std::min as this creates a new object
return anchor() < cursor() ? anchor() : cursor();
}
CursorSlice const & LyXText::selEnd() const
{
if (!selection.set())
return cursor();
return anchor() > cursor() ? anchor() : cursor();
}
CursorSlice & LyXText::selStart()
{
if (!selection.set())
return cursor();
return anchor() < cursor() ? anchor() : cursor();
}
CursorSlice & LyXText::selEnd()
{
if (!selection.set())
return cursor();
return anchor() > cursor() ? anchor() : cursor();
}
void LyXText::setSelection()
{
selection.set(true);
// a selection with no contents is not a selection
if (cursor().par() == anchor().par() && cursor().pos() == anchor().pos())
selection.set(false);
}
void LyXText::clearSelection()
{
selection.set(false);
selection.mark(false);
anchor() = cursor();
// reset this in the bv()!
if (bv() && bv()->text())
bv()->unsetXSel();
}

View File

@ -471,28 +471,8 @@ void LyXText::setFont(LyXFont const & font, bool toggleall)
} }
// important for the screen
// the cursor set functions have a special mechanism. When they // the cursor set functions have a special mechanism. When they
// realize, that you left an empty paragraph, they will delete it. // realize you left an empty paragraph, they will delete it.
// need the selection cursor:
void LyXText::setSelection()
{
TextCursor::setSelection();
}
void LyXText::clearSelection()
{
TextCursor::clearSelection();
// reset this in the bv()!
if (bv() && bv()->text())
bv()->unsetXSel();
}
void LyXText::cursorHome() void LyXText::cursorHome()
{ {

View File

@ -1,64 +0,0 @@
/**
* \file textcursor.C
* 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.
*/
#include <config.h>
#include "textcursor.h"
CursorSlice const & TextCursor::selStart() const
{
if (!selection.set())
return cursor_;
// can't use std::min as this creates a new object
return anchor_ < cursor_ ? anchor_ : cursor_;
}
CursorSlice const & TextCursor::selEnd() const
{
if (!selection.set())
return cursor_;
return anchor_ > cursor_ ? anchor_ : cursor_;
}
CursorSlice & TextCursor::selStart()
{
if (!selection.set())
return cursor_;
return anchor_ < cursor_ ? anchor_ : cursor_;
}
CursorSlice & TextCursor::selEnd()
{
if (!selection.set())
return cursor_;
return anchor_ > cursor_ ? anchor_ : cursor_;
}
void TextCursor::setSelection()
{
selection.set(true);
// a selection with no contents is not a selection
if (cursor_.par() == anchor_.par() && cursor_.pos() == anchor_.pos())
selection.set(false);
}
void TextCursor::clearSelection()
{
selection.set(false);
selection.mark(false);
anchor_ = cursor_;
}

View File

@ -1,78 +0,0 @@
// -*- C++ -*-
/**
* \file textcursor.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author unknown
* \author Lars Gullik Bjønnes
* \author John Levon
* \author André Pönitz
*
* Full author contact details are available in file CREDITS.
*/
#ifndef TEXTCURSOR_H
#define TEXTCURSOR_H
#include "cursor_slice.h"
// Do not even think of forward declaring LyXText/BufferView etc here!
// If you need Paragraph proper, go to text_func.h
/** The cursor.
Later this variable has to be removed. There should be no internal
cursor in a text (and thus not in a buffer). By keeping this it is
(I think) impossible to have several views with the same buffer, but
the cursor placed at different places.
[later]
Since the LyXText now has been moved from Buffer to BufferView
it should not be absolutely needed to move the cursor...
[even later]
Nevertheless, it should still be moved, in order to keep classes
and interdependencies small.
*/
// The structure that keeps track of the selections set.
struct Selection {
Selection()
: set_(false), mark_(false)
{}
bool set() const {
return set_;
}
void set(bool s) {
set_ = s;
}
bool mark() const {
return mark_;
}
void mark(bool m) {
mark_ = m;
}
private:
bool set_; // former selection
bool mark_; // former mark_set
};
struct TextCursor {
///
void setSelection();
///
void clearSelection();
// actual cursor position
CursorSlice cursor_;
// the other end of the selection
CursorSlice anchor_;
Selection selection;
CursorSlice const & selStart() const;
CursorSlice const & selEnd() const;
CursorSlice & selStart();
CursorSlice & selEnd();
};
#endif