+2001-08-07 Edwin Leuven <leuven@fee.uva.nl>
+
+ * ControlSpellchecker.C: check next word after insert in personal dict
+
2001-08-06 Juergen Vigna <jug@sad.it>
* ControlERT.[Ch]: new file
void ControlSpellchecker::insert()
{
speller_->insert(word_);
+ check();
}
+2001-08-07 Juergen Vigna <jug@sad.it>
+
+ * inset.C (getMaxWidth): recoded and all it's implementations!
+
+ * insettext.C (init,setParagraph+constructors): cleanups
+ (reinitLyXText): fixed problem with wrong cursor when all paragraphs
+ are new and I want do a save/restore of the cursor position which is
+ not possible anymore.
+
+ * insetcollapsable.C (searchBackward): recollapse inset if not found.
+ (searchBackward): ditto
+ (selectNextWord): ditto
+
2001-08-07 Angus Leeming <a.leeming@ic.ac.uk>
* insetlatexaccent.C (checkContents): Add some debug messages
unsigned int Inset::inset_id = 0;
Inset::Inset()
- : top_x(0), top_baseline(0), scx(0), id_(inset_id++), owner_(0),
- background_color_(LColor::inherit)
+ : top_x(0), topx_set(false), top_baseline(0), scx(0),
+ id_(inset_id++), owner_(0), background_color_(LColor::inherit)
{}
Inset::Inset(Inset const & in, bool same_id)
- : top_x(0), top_baseline(0), scx(0), owner_(0), name_(in.name_),
- background_color_(in.background_color_)
+ : top_x(0), topx_set(false), top_baseline(0), scx(0), owner_(0),
+ name_(in.name_), background_color_(in.background_color_)
{
if (same_id)
id_ = in.id();
int UpdatableInset::getMaxWidth(BufferView * bv, UpdatableInset const *) const
{
- if (owner())
- return static_cast<UpdatableInset*>
+ int w;
+ if (owner()){
+ w = static_cast<UpdatableInset*>
(owner())->getMaxWidth(bv, this);
- return bv->workWidth();
+ } else {
+ w = bv->workWidth();
+ }
+ if (w < 0) {
+ return -1;
+ }
+ if (owner()) {
+ if (topx_set) // this makes only sense if we have a top_x
+ w = w - top_x + owner()->x();
+ return w;
+ }
+ // check for margins left/right and extra right margin "const 5"
+ if ((w - ((2 * TEXT_TO_INSET_OFFSET) + 5)) >= 0)
+ w -= (2 * TEXT_TO_INSET_OFFSET) + 5;
+ if (topx_set) {
+ if ((w - top_x) < 10) {
+ w = 10; // minimum I require!!!
+ } else {
+ w -= top_x;
+ }
+ } else if (w < 10) {
+ w = 10;
+ }
+ return w;
}
/// open the inset
virtual void open(BufferView *) {}
/// close the inset
- virtual void close(BufferView *) {}
+ virtual void close(BufferView *) const {}
/// check if the font of the char we want inserting is correct
/// and modify it if it is not.
virtual bool checkInsertChar(LyXFont &);
///
mutable int top_x;
///
+ mutable bool topx_set; /* have we already drawn ourself! */
+ ///
mutable int top_baseline;
///
mutable int scx;
}
top_x = int(x);
+ topx_set = true;
top_baseline = baseline;
int const bl = baseline - ascent(bv, f) + ascent_collapsed();
inset.edit(bv, xp, yy, button);
}
}
+ first_after_edit = true;
}
return;
inset.edit(bv, front);
}
+ first_after_edit = true;
}
int InsetCollapsable::latex(Buffer const * buf, ostream & os,
- bool fragile, bool free_spc) const
+ bool fragile, bool free_spc) const
{
return inset.latex(buf, os, fragile, free_spc);
}
int InsetCollapsable::getMaxWidth(BufferView * bv,
- UpdatableInset const * inset) const
+ UpdatableInset const * inset) const
{
+#if 0
int const w = UpdatableInset::getMaxWidth(bv, inset);
if (w < 0) {
}
// should be at least 30 pixels !!!
return max(30, w - width_collapsed());
+#else
+ return UpdatableInset::getMaxWidth(bv, inset);
+#endif
}
void InsetCollapsable::update(BufferView * bv, LyXFont const & font,
bool reinit)
{
- if (in_update)
+ if (in_update) {
+ if (reinit && owner()) {
+ owner()->update(bv, font, true);
+ }
return;
+ }
in_update = true;
inset.update(bv, font, reinit);
if (reinit && owner()) {
UpdatableInset::RESULT result = inset.localDispatch(bv, action, arg);
if (result == FINISHED)
bv->unlockInset(this);
+ first_after_edit = false;
return result;
}
}
-void InsetCollapsable::close(BufferView * bv)
+void InsetCollapsable::close(BufferView * bv) const
{
if (collapsed_)
return;
collapsed_ = true;
- bv->updateInset(this, true);
+ bv->updateInset(const_cast<InsetCollapsable *>(this), true);
}
-void InsetCollapsable::setLabel(string const & l)
+void InsetCollapsable::setLabel(string const & l) const
{
label = l;
}
+
+
+bool InsetCollapsable::searchForward(BufferView * bv, string const & str,
+ bool const & cs, bool const & mw)
+{
+ bool found = inset.searchForward(bv, str, cs, mw);
+ if (first_after_edit && !found)
+ close(bv);
+ first_after_edit = false;
+ return found;
+}
+bool InsetCollapsable::searchBackward(BufferView * bv, string const & str,
+ bool const & cs, bool const & mw)
+{
+ bool found = inset.searchBackward(bv, str, cs, mw);
+ if (first_after_edit && !found)
+ close(bv);
+ first_after_edit = false;
+ return found;
+}
+
+
+string const InsetCollapsable::selectNextWord(BufferView * bv, float & value) const
+{
+ string str = inset.selectNextWord(bv, value);
+ if (first_after_edit && str.empty())
+ close(bv);
+ first_after_edit = false;
+ return str;
+}
void setFont(BufferView *, LyXFont const &, bool toggleall = false,
bool selectall = false);
///
- void setLabel(string const & l);
+ void setLabel(string const & l) const;
///
void setLabelFont(LyXFont & f) { labelfont = f; }
#if 0
///
void open(BufferView *);
///
- void close(BufferView *);
+ void close(BufferView *) const;
///
- string const selectNextWord(BufferView * bv, float & value) const {
- return inset.selectNextWord(bv, value);
- }
+ string const selectNextWord(BufferView * bv, float & value) const;
+
void selectSelectedWord(BufferView * bv) {
inset.selectSelectedWord(bv);
}
}
///
bool searchForward(BufferView * bv, string const & str,
- bool const & cs = true, bool const & mw = false) {
- return inset.searchForward(bv, str, cs, mw);
- }
+ bool const & cs = true, bool const & mw = false);
bool searchBackward(BufferView * bv, string const & str,
- bool const & cs = true, bool const & mw = false) {
- return inset.searchBackward(bv, str, cs, mw);
- }
+ bool const & cs = true, bool const & mw = false);
/// check if the font of the char we want inserting is correct
/// and modify it if it is not.
virtual bool checkInsertChar(LyXFont &) { return false; }
int getMaxTextWidth(Painter & pain, UpdatableInset const *) const;
///
- bool collapsed_;
+ mutable bool collapsed_;
///
LColor::color framecolor;
///
LyXFont labelfont;
public:
///
- InsetText inset;
+ mutable InsetText inset;
protected:
///
mutable int button_length;
private:
///
- string label;
+ mutable string label;
#if 0
///
bool autocollapse;
mutable int oldWidth;
///
bool in_update;
+ ///
+ mutable bool first_after_edit;
};
#endif
}
-void InsetERT::setButtonLabel()
+void InsetERT::setButtonLabel() const
{
if (status_ == Collapsed) {
setLabel(get_new_label());
}
top_x = int(x);
+ topx_set = true;
top_baseline = baseline;
int const bl = baseline - ascent(bv, f) + ascent_collapsed();
}
-void InsetERT::status(BufferView * bv, ERTStatus const st)
+void InsetERT::status(BufferView * bv, ERTStatus const st) const
{
if (st != status_) {
status_ = st;
need_update = FULL;
setButtonLabel();
if (bv)
- bv->unlockInset(this);
+ bv->unlockInset(const_cast<InsetERT *>(this));
break;
}
if (bv)
- bv->updateInset(this, true);
+ bv->updateInset(const_cast<InsetERT *>(this), true);
}
}
}
-void InsetERT::close(BufferView * bv)
+void InsetERT::close(BufferView * bv) const
{
if (collapsed_)
return;
///
void open(BufferView *);
///
- void close(BufferView *);
+ void close(BufferView *) const;
///
bool inlined() const { return status_ == Inlined; }
///
///
ERTStatus status() const { return status_; }
///
- void status(BufferView *, ERTStatus const st);
+ void status(BufferView *, ERTStatus const st) const;
///
bool showInsetDialog(BufferView *) const;
///
string const get_new_label() const;
///
- void setButtonLabel();
+ void setButtonLabel() const;
///
void set_latex_font(BufferView *);
///
- ERTStatus status_;
+ mutable ERTStatus status_;
};
#endif
cleared = true;
}
top_x = int(x);
+ topx_set = true;
top_baseline = baseline;
x += ADD_TO_TABULAR_WIDTH;
if (cleared) {
void InsetTabular::update(BufferView * bv, LyXFont const & font, bool reinit)
{
- if (in_update)
+ if (in_update) {
+ if (reinit && owner()) {
+ owner()->update(bv, font, true);
+ }
return;
+ }
in_update = true;
if (reinit) {
need_update = INIT;
InsetText::InsetText()
+ : UpdatableInset(), lt(0), in_update(false)
{
par = new Paragraph;
init();
- in_update = false;
}
-InsetText::InsetText(InsetText const & ins, bool same_id)
- : UpdatableInset()
+InsetText::InsetText(InsetText const & in, bool same_id)
+ : UpdatableInset(in, same_id), lt(0), in_update(false)
{
par = 0;
- init(&ins, same_id);
- in_update = false;
- autoBreakRows = ins.autoBreakRows;
+ init(&in, same_id);
}
InsetText & InsetText::operator=(InsetText const & it)
{
init(&it);
- autoBreakRows = it.autoBreakRows;
return * this;
}
void InsetText::init(InsetText const * ins, bool same_id)
{
+ if (ins) {
+ setParagraphData(ins->par);
+ autoBreakRows = ins->autoBreakRows;
+ drawFrame_ = ins->drawFrame_;
+ frame_color = ins->frame_color;
+ if (same_id)
+ id_ = ins->id_;
+ } else {
+ Paragraph * p = par;
+ while(p) {
+ p->setInsetOwner(this);
+ p = p->next();
+ }
+ the_locking_inset = 0;
+ drawFrame_ = NEVER;
+ frame_color = LColor::insetframe;
+ autoBreakRows = false;
+ }
top_y = 0;
last_width = 0;
last_height = 0;
insetAscent = 0;
insetDescent = 0;
insetWidth = 0;
- the_locking_inset = 0;
old_max_width = 0;
no_selection = false;
need_update = INIT;
drawTextXOffset = 0;
drawTextYOffset = 0;
- autoBreakRows = false;
- drawFrame_ = NEVER;
xpos = 0.0;
- frame_color = LColor::insetframe;
- if (ins) {
- setParagraphData(ins->par);
- autoBreakRows = ins->autoBreakRows;
- drawFrame_ = ins->drawFrame_;
- frame_color = ins->frame_color;
- if (same_id)
- id_ = ins->id_;
- }
- par->setInsetOwner(this);
locked = false;
old_par = 0;
last_drawn_width = -1;
frame_is_visible = false;
cached_bview = 0;
sstate.lpar = 0;
- lt = 0;
}
par = tmp;
}
par = new Paragraph;
- reinitLyXText();
+ reinitLyXText(true);
}
need_update = INIT;
old_max_width = nw;
bv->text->status(bv, LyXText::CHANGED_IN_DRAW);
+ topx_set = true;
return;
} else {
top_x = old_x;
// no draw is necessary !!!
if ((drawFrame_ == LOCKED) && !locked && !par->size()) {
top_x = int(x);
+ topx_set = true;
top_baseline = baseline;
x += width(bv, f);
if (need_update & CLEAR_FRAME)
if (!owner())
x += static_cast<float>(scroll());
- // if top_x differs we have a rule down and we don't have to clear anything
+ // if top_x differs we did it already
if (!cleared && (top_x == int(x)) &&
((need_update&(INIT|FULL)) || (top_baseline!=baseline) ||
(last_drawn_width!=insetWidth))) {
}
top_x = int(x);
+ topx_set = true;
if (cleared)
frame_is_visible = false;
void InsetText::update(BufferView * bv, LyXFont const & font, bool reinit)
{
- if (in_update)
+ if (in_update) {
+ if (reinit && owner()) {
+ owner()->update(bv, font, true);
+ }
return;
+ }
in_update = true;
- if (reinit) {
- need_update |= INIT;
+ if (reinit || need_update == INIT) {
+ need_update |= FULL;
+#if 0
resizeLyXText(bv);
+#else
+ reinitLyXText();
+#endif
if (owner())
owner()->update(bv, font, true);
in_update = false;
int InsetText::getMaxWidth(BufferView * bv, UpdatableInset const * inset) const
{
+#if 0
int w = UpdatableInset::getMaxWidth(bv, inset);
if (w < 0) {
- return w;
+ return -1;
}
if (owner()) {
w = w - top_x + owner()->x();
}
w -= (2 * TEXT_TO_INSET_OFFSET);
return w - top_x;
+#else
+ return UpdatableInset::getMaxWidth(bv, inset);
+#endif
}
void InsetText::setParagraphData(Paragraph * p)
{
+ // we have to unlock any locked inset otherwise we're in troubles
+ the_locking_inset = 0;
while (par) {
Paragraph * tmp = par->next();
delete par;
np = np->next();
np->setInsetOwner(this);
}
- reinitLyXText();
+ reinitLyXText(true);
}
need_update = FULL;
if (!flag)
removeNewlines();
- reinitLyXText();
+ reinitLyXText(true);
}
}
}
if (bv->screen()) {
- t->first = bv->screen()->topCursorVisible(t);
+ t->first = bv->screen()->topCursorVisible(t);
}
- if (!owner())
+ if (!owner()) {
updateLocal(bv, FULL, false);
- else
+ // this will scroll the screen such that the cursor becomes visible
+ bv->updateScrollbar();
+ } else {
need_update |= FULL;
- // this will scroll the screen such that the cursor becomes visible
- bv->updateScrollbar();
+ }
}
-void InsetText::reinitLyXText() const
+void InsetText::reinitLyXText(bool wrong_cursor) const
{
for(Cache::iterator it = cache.begin(); it != cache.end(); ++it) {
lyx::Assert(it->second.text.get());
LyXText * t = it->second.text.get();
BufferView * bv = it->first;
+ if (wrong_cursor) {
+ t->cursor.par(par);
+ t->cursor.pos(0);
+ t->clearSelection();
+ }
saveLyXTextState(t);
for (Paragraph * p = par; p; p = p->next()) {
p->resizeInsetsLyXText(bv);
if (bv->screen()) {
t->first = bv->screen()->topCursorVisible(t);
}
- if (!owner())
+ if (!owner()) {
updateLocal(bv, FULL, false);
- else
+ // this will scroll the screen such that the cursor becomes visible
+ bv->updateScrollbar();
+ } else {
need_update = FULL;
- // this will scroll the screen such that the cursor becomes visible
- bv->updateScrollbar();
+ }
}
}
void saveLyXTextState(LyXText *) const;
void restoreLyXTextState(BufferView *, LyXText *) const;
///
- void reinitLyXText() const;
+ void reinitLyXText(bool wrong_cursor = false) const;
/* Private structures and variables */
///
if (par) {
text->setCursor(bv, par, pos);
return SR_FOUND;
+#if 0
} else if (text->inset_owner) {
// test if we're inside an inset if yes unlock the inset
// and recall us with the outside LyXText!
} else {
return SR_NOT_FOUND;
}
+#endif
} else
return SR_NOT_FOUND;
}
{
// then the insets
for (InsetList::const_iterator cit = insetlist.begin();
- cit != insetlist.end(); ++cit) {
+ cit != insetlist.end(); ++cit)
+ {
if (cit->inset) {
if (cit->inset->isTextInset()) {
static_cast<UpdatableInset *>