move some selection related stuff over to textcursor.C

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@7218 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
André Pönitz 2003-06-27 13:13:04 +00:00
parent 013df200fb
commit 3390fc33d7
5 changed files with 107 additions and 86 deletions

View File

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

View File

@ -277,8 +277,6 @@ public:
void setSelection();
///
void clearSelection();
///
string const selectionAsString(Buffer const *, bool label) const;
/// select the word we need depending on word_location
void getWord(LyXCursor & from, LyXCursor & to,

View File

@ -530,7 +530,6 @@ bool LyXText::changeDepth(bv_funcs::DEPTH_CHANGE type, bool test_only)
LyXCursor tmpcursor;
setCursor(tmpcursor, start, 0);
//redoParagraphs(tmpcursor, &(*pastend));
redoParagraphs(tmpcursor, pastend);
// We need to actually move the text->cursor. I don't
@ -757,98 +756,18 @@ void LyXText::partialRebreak()
// need the selection cursor:
void LyXText::setSelection()
{
bool const lsel = selection.set();
if (!selection.set()) {
last_sel_cursor = selection.cursor;
selection.start = selection.cursor;
selection.end = selection.cursor;
}
selection.set(true);
// first the toggling area
if (cursor.y() < last_sel_cursor.y()
|| (cursor.y() == last_sel_cursor.y()
&& cursor.x() < last_sel_cursor.x())) {
toggle_end_cursor = last_sel_cursor;
toggle_cursor = cursor;
} else {
toggle_end_cursor = cursor;
toggle_cursor = last_sel_cursor;
}
last_sel_cursor = cursor;
// and now the whole selection
if (selection.cursor.par() == cursor.par())
if (selection.cursor.pos() < cursor.pos()) {
selection.end = cursor;
selection.start = selection.cursor;
} else {
selection.end = selection.cursor;
selection.start = cursor;
}
else if (selection.cursor.y() < cursor.y() ||
(selection.cursor.y() == cursor.y()
&& selection.cursor.x() < cursor.x())) {
selection.end = cursor;
selection.start = selection.cursor;
}
else {
selection.end = selection.cursor;
selection.start = cursor;
}
// a selection with no contents is not a selection
if (selection.start.par() == selection.end.par() &&
selection.start.pos() == selection.end.pos())
selection.set(false);
bool const lsel = TextCursor::setSelection();
if (inset_owner && (selection.set() || lsel))
inset_owner->setUpdateStatus(bv(), InsetText::SELECTION);
}
string const LyXText::selectionAsString(Buffer const * buffer,
bool label) const
{
if (!selection.set()) return string();
// should be const ...
ParagraphList::iterator startpit = selection.start.par();
ParagraphList::iterator endpit = selection.end.par();
pos_type const startpos(selection.start.pos());
pos_type const endpos(selection.end.pos());
if (startpit == endpit) {
return startpit->asString(buffer, startpos, endpos, label);
}
string result;
// First paragraph in selection
result += startpit->asString(buffer, startpos, startpit->size(), label) + "\n\n";
// The paragraphs in between (if any)
ParagraphList::iterator pit = boost::next(startpit);
for (; pit != endpit; ++pit) {
result += pit->asString(buffer, 0, pit->size(), label) + "\n\n";
}
// Last paragraph in selection
result += endpit->asString(buffer, 0, endpos, label);
return result;
}
void LyXText::clearSelection()
{
selection.set(false);
selection.mark(false);
last_sel_cursor = selection.end = selection.start = selection.cursor = cursor;
TextCursor::clearSelection();
// reset this in the bv_owner!
if (bv_owner && bv_owner->text)
bv_owner->text->xsel_cache.set(false);

95
src/textcursor.C Normal file
View File

@ -0,0 +1,95 @@
#include "textcursor.h"
bool TextCursor::setSelection()
{
bool const lsel = selection.set();
if (!selection.set()) {
last_sel_cursor = selection.cursor;
selection.start = selection.cursor;
selection.end = selection.cursor;
}
selection.set(true);
// first the toggling area
if (cursor.y() < last_sel_cursor.y()
|| (cursor.y() == last_sel_cursor.y()
&& cursor.x() < last_sel_cursor.x())) {
toggle_end_cursor = last_sel_cursor;
toggle_cursor = cursor;
} else {
toggle_end_cursor = cursor;
toggle_cursor = last_sel_cursor;
}
last_sel_cursor = cursor;
// and now the whole selection
if (selection.cursor.par() == cursor.par())
if (selection.cursor.pos() < cursor.pos()) {
selection.end = cursor;
selection.start = selection.cursor;
} else {
selection.end = selection.cursor;
selection.start = cursor;
}
else if (selection.cursor.y() < cursor.y() ||
(selection.cursor.y() == cursor.y()
&& selection.cursor.x() < cursor.x())) {
selection.end = cursor;
selection.start = selection.cursor;
}
else {
selection.end = selection.cursor;
selection.start = cursor;
}
// a selection with no contents is not a selection
if (selection.start.par() == selection.end.par() &&
selection.start.pos() == selection.end.pos())
selection.set(false);
return lsel;
}
void TextCursor::clearSelection()
{
selection.set(false);
selection.mark(false);
last_sel_cursor = selection.end = selection.start = selection.cursor = cursor;
}
string const TextCursor::selectionAsString(Buffer const * buffer,
bool label) const
{
if (!selection.set())
return string();
// should be const ...
ParagraphList::iterator startpit = selection.start.par();
ParagraphList::iterator endpit = selection.end.par();
size_t const startpos = selection.start.pos();
size_t const endpos = selection.end.pos();
if (startpit == endpit)
return startpit->asString(buffer, startpos, endpos, label);
// First paragraph in selection
string result =
startpit->asString(buffer, startpos, startpit->size(), label) + "\n\n";
// The paragraphs in between (if any)
ParagraphList::iterator pit = startpit;
for (++pit; pit != endpit; ++pit)
result += pit->asString(buffer, 0, pit->size(), label) + "\n\n";
// Last paragraph in selection
result += endpit->asString(buffer, 0, endpos, label);
return result;
}

View File

@ -56,6 +56,13 @@ private:
};
struct TextCursor {
/// returns true if selection was set previously
bool setSelection();
///
void clearSelection();
///
string const selectionAsString(Buffer const * buffer, bool label) const;
// actual cursor position
LyXCursor cursor;