#include "lyxcursor.h"
#include "CutAndPaste.h"
#include "font.h"
+#include "minibuffer.h"
+#include "toolbar.h"
using std::ostream;
using std::ifstream;
using std::max;
extern unsigned char getCurrentTextClass(Buffer *);
+extern LyXTextClass::size_type current_layout;
InsetText::InsetText(Buffer * buf)
buffer = buf;
cursor_visible = false;
cursor.x_fix = -1;
- selection_start = selection_end = 0;
interline_space = 1;
no_selection = false;
init_inset = true;
autoBreakRows = false;
xpos = 0.0;
if (ins) {
- if (par)
- delete par;
- par = ins->par->Clone();
+ SetParagraphData(ins->par);
autoBreakRows = ins->autoBreakRows;
}
par->SetInsetOwner(this);
cursor.par = par;
cursor.pos = 0;
+ selection_start_cursor = selection_end_cursor = cursor;
}
return;
int s_start, s_end;
- if (selection_start > selection_end) {
- s_start = selection_end;
- s_end = selection_start;
+ if (selection_start_cursor.pos > selection_end_cursor.pos) {
+ s_start = selection_end_cursor.pos;
+ s_end = selection_start_cursor.pos;
} else {
- s_start = selection_start;
- s_end = selection_end;
+ s_start = selection_start_cursor.pos;
+ s_end = selection_end_cursor.pos;
}
if ((s_start > endpos) || (s_end < startpos))
return;
return;
}
the_locking_inset = 0;
- selection_start = selection_end = inset_pos = inset_x = inset_y = 0;
-// no_selection = true;
+ inset_pos = inset_x = inset_y = 0;
setPos(bv->painter(), x, y);
checkAndActivateInset(bv, x, y, button);
- selection_start = selection_end = cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
current_font = real_current_font = GetFont(par, cursor.pos);
bv->text->FinishUndo();
UpdateLocal(bv, true);
the_locking_inset->InsetUnlock(bv);
the_locking_inset = 0;
}
+ HideInsetCursor(bv);
lyxerr[Debug::INSETS] << "InsetText::InsetUnlock(" << this <<
")" << endl;
if (hasSelection()) {
- selection_start = selection_end = cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
UpdateLocal(bv, false);
}
no_selection = false;
void InsetText::InsetButtonPress(BufferView * bv, int x, int y, int button)
{
if (hasSelection()) {
- selection_start = selection_end = cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
UpdateLocal(bv, false);
}
no_selection = false;
UpdateLocal(bv, true);
}
}
- selection_start = selection_end = cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
}
return;
}
if (!no_selection) {
- int old = selection_end;
+ LyXCursor old = selection_end_cursor;
HideInsetCursor(bv);
setPos(bv->painter(), x, y);
- selection_end = cursor.pos;
- if (old != selection_end)
+ selection_end_cursor = cursor;
+ if (old != selection_end_cursor)
UpdateLocal(bv, false);
ShowInsetCursor(bv);
}
bv->text->cursor.par->ParFromPos(bv->text->cursor.pos)->previous,
bv->text->cursor.par->ParFromPos(bv->text->cursor.pos)->next);
cutSelection();
- cursor.pos = selection_start;
+ cursor = selection_start_cursor;
par->InsertChar(cursor.pos,arg[0]);
SetCharFont(cursor.pos,current_font);
++cursor.pos;
- selection_start = selection_end = cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
UpdateLocal(bv, true);
break;
// --- Cursor Movements ---------------------------------------------
case LFUN_RIGHTSEL:
bv->text->FinishUndo();
moveRight(bv, false);
- selection_end = cursor.pos;
+ selection_end_cursor = cursor;
UpdateLocal(bv, false);
break;
case LFUN_RIGHT:
bv->text->FinishUndo();
result = moveRight(bv);
if (hasSelection()) {
- selection_start = selection_end = cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
UpdateLocal(bv, false);
} else {
- selection_start = selection_end = cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
}
break;
case LFUN_LEFTSEL:
bv->text->FinishUndo();
moveLeft(bv, false);
- selection_end = cursor.pos;
+ selection_end_cursor = cursor;
UpdateLocal(bv, false);
break;
case LFUN_LEFT:
bv->text->FinishUndo();
result= moveLeft(bv);
if (hasSelection()) {
- selection_start = selection_end = cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
UpdateLocal(bv, false);
} else {
- selection_start = selection_end = cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
}
break;
case LFUN_DOWNSEL:
bv->text->FinishUndo();
moveDown(bv);
- selection_end = cursor.pos;
+ selection_end_cursor = cursor;
UpdateLocal(bv, false);
break;
case LFUN_DOWN:
bv->text->FinishUndo();
result = moveDown(bv);
if (hasSelection()) {
- selection_start = selection_end = cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
UpdateLocal(bv, false);
} else {
- selection_start = selection_end = cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
}
break;
case LFUN_UPSEL:
bv->text->FinishUndo();
moveUp(bv);
- selection_end = cursor.pos;
+ selection_end_cursor = cursor;
UpdateLocal(bv, false);
break;
case LFUN_UP:
bv->text->FinishUndo();
result = moveUp(bv);
if (hasSelection()) {
- selection_start = selection_end = cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
UpdateLocal(bv, false);
} else {
- selection_start = selection_end = cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
}
break;
case LFUN_BACKSPACE:
- if (!cursor.pos) { // || par->IsNewline(cursor.pos-1)) {
+ if (!cursor.pos) {
if (hasSelection()) {
- selection_start = selection_end = cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
UpdateLocal(bv, false);
}
break;
bv->text->cursor.par->ParFromPos(bv->text->cursor.pos)->next);
bool ret = true;
if (hasSelection()) {
- LyXParagraph::size_type i = selection_start;
- for (; i < selection_end; ++i) {
- par->Erase(selection_start);
+ LyXParagraph::size_type i = selection_start_cursor.pos;
+ for (; i < selection_end_cursor.pos; ++i) {
+ par->Erase(selection_start_cursor.pos);
}
} else
ret = Delete();
if (ret) { // we need update
- selection_start = selection_end = cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
UpdateLocal(bv, true);
} else if (hasSelection()) {
- selection_start = selection_end = cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
UpdateLocal(bv, false);
}
}
if (cutSelection()) {
// we need update
- cursor.pos = selection_end = selection_start;
+ cursor = selection_end_cursor = selection_start_cursor;
UpdateLocal(bv, true);
} else if (hasSelection()) {
- selection_start = selection_end = cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
UpdateLocal(bv, false);
}
resetPos(bv->painter());
bv->text->FinishUndo();
if (copySelection()) {
// we need update
- selection_start = selection_end = cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
UpdateLocal(bv, true);
} else if (hasSelection()) {
- selection_start = selection_end = cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
UpdateLocal(bv, false);
}
break;
bv->text->cursor.par->ParFromPos(bv->text->cursor.pos)->previous,
bv->text->cursor.par->ParFromPos(bv->text->cursor.pos)->next);
if (pasteSelection()) {
- selection_start = selection_end = cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
UpdateLocal(bv, true);
}
}
cursor.x -= SingleWidth(bv->painter(), par, cursor.pos);
cursor.x -= SingleWidth(bv->painter(), par, cursor.pos);
if (hasSelection()) {
- selection_start = selection_end = cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
UpdateLocal(bv, false);
} else {
- selection_start = selection_end = cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
}
resetPos(bv->painter());
break;
for(; cursor.pos < checkpos; ++cursor.pos)
cursor.x += SingleWidth(bv->painter(), par, cursor.pos);
if (hasSelection()) {
- selection_start = selection_end = cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
UpdateLocal(bv, false);
} else {
- selection_start = selection_end = cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
}
}
resetPos(bv->painter());
SetCharFont(cursor.pos,current_font);
UpdateLocal(bv, true);
++cursor.pos;
- selection_start = selection_end = cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
resetPos(bv->painter());
break;
+ case LFUN_LAYOUT:
+ {
+ // Derive layout number from given argument (string)
+ // and current buffer's textclass (number). */
+ LyXTextClassList::ClassList::size_type tclass =
+ buffer->params.textclass;
+ std::pair <bool, LyXTextClass::size_type> layout =
+ textclasslist.NumberOfLayout(tclass, arg);
+
+ // If the entry is obsolete, use the new one instead.
+ if (layout.first) {
+ string obs = textclasslist.Style(tclass,layout.second).
+ obsoleted_by();
+ if (!obs.empty())
+ layout = textclasslist.NumberOfLayout(tclass, obs);
+ }
+
+ // see if we found the layout number:
+ if (!layout.first) {
+ string msg = string(N_("Layout ")) + arg + N_(" not known");
+
+ bv->owner()->getMiniBuffer()->Set(msg);
+ break;
+ }
+
+ if (current_layout != layout.second) {
+ bv->text->SetLayout(cursor, selection_start_cursor,
+ selection_end_cursor, layout.second);
+ bv->owner()->getToolbar()->combox->select(cursor.par->GetLayout()+1);
+ UpdateLocal(bv, true);
+ }
+ }
+ break;
default:
result = UNDISPATCHED;
break;
int InsetText::Latex(ostream & os, bool /*fragile*/, bool /*fp*/) const
{
- TexRow texrow;
- int ret = par->SimpleTeXOnePar(os, texrow);
- return ret;
+ TexRow texrow;
+ buffer->latexParagraphs(os, par, 0, texrow);
+ return texrow.rows();
}
void InsetText::resetPos(Painter & pain) const
{
+ cursor.par = par;
+
if (!rows.size())
return;
par->InsertChar(cursor.pos, LyXParagraph::META_INSET);
par->InsertInset(cursor.pos, inset);
if (hasSelection()) {
- selection_start = selection_end = cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
} else {
- selection_start = selection_end = cursor.pos;
+ selection_start_cursor = selection_end_cursor = cursor;
}
UpdateLocal(bv, true);
static_cast<UpdatableInset*>(inset)->Edit(bv, 0, 0, 0);
}
int s_start, s_end;
- if (selection_start > selection_end) {
- s_start = selection_end;
- s_end = selection_start;
+ if (selection_start_cursor.pos > selection_end_cursor.pos) {
+ s_start = selection_end_cursor.pos;
+ s_end = selection_start_cursor.pos;
} else {
- s_start = selection_start;
- s_end = selection_end;
+ s_start = selection_start_cursor.pos;
+ s_end = selection_end_cursor.pos;
}
LyXFont newfont;
while(s_start < s_end) {
bv->updateInset(this, flag);
if (flag)
resetPos(bv->painter());
+ bv->owner()->getToolbar()->combox->select(cursor.par->GetLayout()+1);
}
LyXParagraph * endpar = par;
int start, end;
- if (selection_start > selection_end) {
- start = selection_end;
- end = selection_start;
+ if (selection_start_cursor.pos > selection_end_cursor.pos) {
+ start = selection_end_cursor.pos;
+ end = selection_start_cursor.pos;
} else {
- start = selection_start;
- end = selection_end;
+ start = selection_start_cursor.pos;
+ end = selection_end_cursor.pos;
}
return cap.cutSelection(par, &endpar, start, end,buffer->params.textclass);
CutAndPaste cap;
int start, end;
- if (selection_start > selection_end) {
- start = selection_end;
- end = selection_start;
+ if (selection_start_cursor.pos > selection_end_cursor.pos) {
+ start = selection_end_cursor.pos;
+ end = selection_start_cursor.pos;
} else {
- start = selection_start;
- end = selection_end;
+ start = selection_start_cursor.pos;
+ end = selection_end_cursor.pos;
}
return cap.copySelection(par, par, start, end, buffer->params.textclass);
}
{
return getMaxWidth(pain, inset) - x;
}
+
+void InsetText::SetParagraphData(LyXParagraph *p)
+{
+ if (par)
+ delete par;
+ par = p->Clone();
+ par->SetInsetOwner(this);
+ init_inset = true;
+}