the autoopen patch (fixes bug 1921)

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@10495 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Jürgen Spitzmüller 2005-09-28 15:02:47 +00:00
parent aba9a83f22
commit 5a704fe310
5 changed files with 48 additions and 31 deletions

View File

@ -1,3 +1,8 @@
2005-09-28 Jürgen Spitzmüller <j.spitzmueller@gmx.de>
* cursor.C (setSelection): do not open collapsable insets;
the insets do by themselves now (autoopen).
2005-09-28 Jürgen Spitzmüller <j.spitzmueller@gmx.de>
* buffer.C: format is up to 244.

View File

@ -468,9 +468,6 @@ void LCursor::setSelection(DocIterator const & where, size_t n)
selection() = true;
anchor_ = where;
pos() += n;
// Open all collapsed insets
for (int i = depth() - 1; i >= 0; --i)
operator[](i).inset().setStatus(*this, InsetBase::Open);
}

View File

@ -1,3 +1,9 @@
2005-09-28 Jürgen Spitzmüller <j.spitzmueller@gmx.de>
* insetcollapsable.[Ch]: implement Alfredo Braunstein's approach
of autoopen, which means that collapsables automatically open
whenever the cursor enters (and close again on leave) (fixes bug 1921).
2005-09-28 Jürgen Spitzmüller <j.spitzmueller@gmx.de>
* insetspace.C: rename '\,' to '\thinspace{}' (avoid parsing error)

View File

@ -40,9 +40,16 @@ using std::min;
using std::ostream;
InsetCollapsable::CollapseStatus InsetCollapsable::status() const
{
return (autoOpen_ && status_ != Inlined) ? Open : status_;
}
InsetCollapsable::InsetCollapsable
(BufferParams const & bp, CollapseStatus status)
: InsetText(bp), label("Label"), status_(status), openinlined_(false)
: InsetText(bp), label("Label"), status_(status),
openinlined_(false), autoOpen_(false)
{
setAutoBreakRows(true);
setDrawFrame(true);
@ -122,12 +129,14 @@ Dimension InsetCollapsable::dimensionCollapsed() const
void InsetCollapsable::metrics(MetricsInfo & mi, Dimension & dim) const
{
autoOpen_ = mi.base.bv->cursor().isInside(this);
mi.base.textwidth -= 2 * TEXT_TO_INSET_OFFSET;
if (status_ == Inlined) {
if (status() == Inlined) {
InsetText::metrics(mi, dim);
} else {
dim = dimensionCollapsed();
if (status_ == Open) {
if (status() == Open) {
InsetText::metrics(mi, textdim_);
openinlined_ = (textdim_.wid + dim.wid <= mi.base.textwidth);
if (openinlined_) {
@ -151,7 +160,7 @@ void InsetCollapsable::metrics(MetricsInfo & mi, Dimension & dim) const
void InsetCollapsable::draw(PainterInfo & pi, int x, int y) const
{
const int xx = x + TEXT_TO_INSET_OFFSET;
if (status_ == Inlined) {
if (status() == Inlined) {
InsetText::draw(pi, xx, y);
} else {
Dimension dimc = dimensionCollapsed();
@ -162,7 +171,7 @@ void InsetCollapsable::draw(PainterInfo & pi, int x, int y) const
button_dim.y2 = top + dimc.height();
pi.pain.buttonText(xx, top + dimc.asc, label, labelfont_);
if (status_ == Open) {
if (status() == Open) {
int textx, texty;
if (openinlined_) {
textx = xx + dimc.width();
@ -181,13 +190,13 @@ void InsetCollapsable::draw(PainterInfo & pi, int x, int y) const
void InsetCollapsable::drawSelection(PainterInfo & pi, int x, int y) const
{
x += TEXT_TO_INSET_OFFSET;
if (status_ == Open) {
if (status() == Open) {
if (openinlined_)
x += dimensionCollapsed().wid;
else
y += dimensionCollapsed().des + textdim_.asc;
}
if (status_ != Collapsed)
if (status() != Collapsed)
InsetText::drawSelection(pi, x, y);
}
@ -195,32 +204,30 @@ void InsetCollapsable::drawSelection(PainterInfo & pi, int x, int y) const
void InsetCollapsable::cursorPos
(CursorSlice const & sl, bool boundary, int & x, int & y) const
{
if (status_ == Collapsed) {
x = xo();
y = yo();
} else {
InsetText::cursorPos(sl, boundary, x, y);
if (status_ == Open) {
if (openinlined_)
x += dimensionCollapsed().wid;
else
y += dimensionCollapsed().height() - ascent()
+ TEXT_TO_INSET_OFFSET + textdim_.asc;
}
x += TEXT_TO_INSET_OFFSET;
BOOST_ASSERT(status() != Collapsed);
InsetText::cursorPos(sl, boundary, x, y);
if (status() == Open) {
if (openinlined_)
x += dimensionCollapsed().wid;
else
y += dimensionCollapsed().height() - ascent()
+ TEXT_TO_INSET_OFFSET + textdim_.asc;
}
x += TEXT_TO_INSET_OFFSET;
}
InsetBase::EDITABLE InsetCollapsable::editable() const
{
return status_ != Collapsed ? HIGHLY_EDITABLE : IS_EDITABLE;
return status() != Collapsed ? HIGHLY_EDITABLE : IS_EDITABLE;
}
bool InsetCollapsable::descendable() const
{
return status_ != Collapsed;
return status() != Collapsed;
}
@ -262,7 +269,7 @@ void InsetCollapsable::edit(LCursor & cur, bool left)
InsetBase * InsetCollapsable::editXY(LCursor & cur, int x, int y)
{
//lyxerr << "InsetCollapsable: edit xy" << endl;
if (status_ == Collapsed)
if (status() == Collapsed)
return this;
cur.push(*this);
return InsetText::editXY(cur, x, y);
@ -276,9 +283,9 @@ void InsetCollapsable::doDispatch(LCursor & cur, FuncRequest & cmd)
switch (cmd.action) {
case LFUN_MOUSE_PRESS:
if (status_ == Inlined)
if (status() == Inlined)
InsetText::doDispatch(cur, cmd);
else if (status_ == Open && !hitButton(cmd))
else if (status() == Open && !hitButton(cmd))
InsetText::doDispatch(cur, cmd);
else
cur.noUpdate();
@ -289,7 +296,7 @@ void InsetCollapsable::doDispatch(LCursor & cur, FuncRequest & cmd)
case LFUN_MOUSE_TRIPLE:
if (status_ == Inlined)
InsetText::doDispatch(cur, cmd);
else if (status_ == Open && !hitButton(cmd))
else if (status() && !hitButton(cmd))
InsetText::doDispatch(cur, cmd);
else
cur.undispatched();
@ -301,7 +308,7 @@ void InsetCollapsable::doDispatch(LCursor & cur, FuncRequest & cmd)
break;
}
switch (status_) {
switch (status()) {
case Collapsed:
//lyxerr << "InsetCollapsable::lfunMouseRelease 1" << endl;

View File

@ -69,7 +69,7 @@ public:
///
bool inlined() const { return status_ == Inlined; }
///
CollapseStatus status() const { return status_; }
CollapseStatus status() const;
///
bool allowSpellCheck() const { return true; }
///
@ -107,6 +107,8 @@ private:
mutable CollapseStatus status_;
/// a substatus of the Open status, determined automatically in metrics
mutable bool openinlined_;
/// the inset will automatically open when the cursor is inside
mutable bool autoOpen_;
///
mutable Dimension textdim_;
};