2002-09-25 14:26:13 +00:00
|
|
|
|
/**
|
2007-04-25 01:24:38 +00:00
|
|
|
|
* \file InsetCollapsable.cpp
|
2002-09-25 14:26:13 +00:00
|
|
|
|
* This file is part of LyX, the document processor.
|
|
|
|
|
* Licence details can be found in the file COPYING.
|
2002-03-21 17:09:55 +00:00
|
|
|
|
*
|
2002-09-25 14:26:13 +00:00
|
|
|
|
* \author Alejandro Aguilar Sierra
|
|
|
|
|
* \author J<EFBFBD>rgen Vigna
|
|
|
|
|
* \author Lars Gullik Bj<EFBFBD>nnes
|
2002-03-21 17:09:55 +00:00
|
|
|
|
*
|
2003-08-23 00:17:00 +00:00
|
|
|
|
* Full author contact details are available in file CREDITS.
|
2000-06-28 16:03:01 +00:00
|
|
|
|
*/
|
2000-03-08 13:52:57 +00:00
|
|
|
|
|
|
|
|
|
#include <config.h>
|
|
|
|
|
|
2007-04-25 01:24:38 +00:00
|
|
|
|
#include "InsetCollapsable.h"
|
2002-08-13 14:40:38 +00:00
|
|
|
|
|
2007-04-26 04:41:58 +00:00
|
|
|
|
#include "Buffer.h"
|
|
|
|
|
#include "BufferParams.h"
|
2000-03-08 13:52:57 +00:00
|
|
|
|
#include "BufferView.h"
|
2007-04-26 14:56:30 +00:00
|
|
|
|
#include "Cursor.h"
|
2007-11-03 18:50:54 +00:00
|
|
|
|
#include "Dimension.h"
|
2007-04-26 04:41:58 +00:00
|
|
|
|
#include "DispatchResult.h"
|
2006-10-08 08:47:26 +00:00
|
|
|
|
#include "FloatList.h"
|
2005-04-22 08:57:22 +00:00
|
|
|
|
#include "FuncStatus.h"
|
2007-10-30 12:30:46 +00:00
|
|
|
|
#include "Language.h"
|
2007-08-22 18:55:03 +00:00
|
|
|
|
#include "LaTeXFeatures.h"
|
2007-04-26 11:30:54 +00:00
|
|
|
|
#include "Lexer.h"
|
2007-04-26 04:41:58 +00:00
|
|
|
|
#include "FuncRequest.h"
|
|
|
|
|
#include "MetricsInfo.h"
|
2007-10-30 12:30:46 +00:00
|
|
|
|
#include "ParagraphParameters.h"
|
2007-11-07 23:25:08 +00:00
|
|
|
|
#include "TextClass.h"
|
2000-03-08 13:52:57 +00:00
|
|
|
|
|
2006-10-07 16:15:06 +00:00
|
|
|
|
#include "frontends/FontMetrics.h"
|
2002-08-13 14:40:38 +00:00
|
|
|
|
#include "frontends/Painter.h"
|
2000-07-04 11:30:07 +00:00
|
|
|
|
|
2008-02-18 07:14:42 +00:00
|
|
|
|
#include "support/debug.h"
|
2007-11-28 22:12:03 +00:00
|
|
|
|
#include "support/docstream.h"
|
2008-02-18 07:14:42 +00:00
|
|
|
|
#include "support/gettext.h"
|
2007-11-28 22:12:03 +00:00
|
|
|
|
|
2007-12-12 10:16:00 +00:00
|
|
|
|
using namespace std;
|
2006-10-21 00:16:43 +00:00
|
|
|
|
|
|
|
|
|
namespace lyx {
|
|
|
|
|
|
2001-04-04 20:34:04 +00:00
|
|
|
|
|
2005-09-28 15:02:47 +00:00
|
|
|
|
InsetCollapsable::CollapseStatus InsetCollapsable::status() const
|
|
|
|
|
{
|
2007-08-16 16:36:50 +00:00
|
|
|
|
return autoOpen_ ? Open : status_;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
InsetCollapsable::Geometry InsetCollapsable::geometry() const
|
|
|
|
|
{
|
|
|
|
|
switch (decoration()) {
|
|
|
|
|
case Classic:
|
2007-08-31 07:15:32 +00:00
|
|
|
|
if (status() == Open) {
|
2007-08-16 16:36:50 +00:00
|
|
|
|
if (openinlined_)
|
|
|
|
|
return LeftButton;
|
|
|
|
|
else
|
|
|
|
|
return TopButton;
|
|
|
|
|
} else
|
|
|
|
|
return ButtonOnly;
|
2007-08-17 12:11:32 +00:00
|
|
|
|
|
2007-08-16 16:36:50 +00:00
|
|
|
|
case Minimalistic:
|
2007-09-01 11:40:09 +00:00
|
|
|
|
return status() == Open ? NoButton : ButtonOnly ;
|
2007-08-17 12:11:32 +00:00
|
|
|
|
|
2007-08-16 16:36:50 +00:00
|
|
|
|
case Conglomerate:
|
2007-09-01 11:40:09 +00:00
|
|
|
|
return status() == Open ? SubLabel : Corners ;
|
2007-08-16 16:36:50 +00:00
|
|
|
|
}
|
2007-08-17 12:11:32 +00:00
|
|
|
|
|
|
|
|
|
// dummy return value to shut down a warning,
|
|
|
|
|
// this is dead code.
|
|
|
|
|
return NoButton;
|
2005-09-28 15:02:47 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-11-03 09:03:08 +00:00
|
|
|
|
InsetCollapsable::InsetCollapsable(BufferParams const & bp,
|
2008-02-05 10:34:01 +00:00
|
|
|
|
CollapseStatus status, TextClassPtr tc)
|
|
|
|
|
: InsetText(bp), status_(status),
|
2006-12-04 04:31:18 +00:00
|
|
|
|
openinlined_(false), autoOpen_(false), mouse_hover_(false)
|
2000-03-08 13:52:57 +00:00
|
|
|
|
{
|
2008-02-05 10:34:01 +00:00
|
|
|
|
setLayout(tc);
|
2004-03-25 09:16:36 +00:00
|
|
|
|
setAutoBreakRows(true);
|
2004-08-14 15:55:22 +00:00
|
|
|
|
setDrawFrame(true);
|
2007-10-25 12:41:02 +00:00
|
|
|
|
setFrameColor(Color_collapsableframe);
|
Fix bug 4037 and related problems. The patch has been cleaned up a bit
from the one posted to the list.
The basic idea has two parts. First, we hard code an "empty layout"
(called PlainLayout, for want of a better name) in TextClass and read it
before doing anything else. It can therefore be customized by classes,
if they want---say, to make it left-aligned. Second, InsetText's are
divided into three types: (i) normal ones, that use the "default" layout
defined by the text class; (ii) highly restrictive ones, such as ERT and
(not quite an inset) table cells, which demand the empty layout; (iii)
middling ones, which default to an empty layout and use the empty layout
in place of the default. (This is so we don't get the same problem we
had with ERT in e.g. footnotes.) The type of inset is signaled by new
methods InsetText::forceEmptyLayout() and InsetText::useEmptyLayout().
(The latter might better be called: useEmptyLayoutInsteadOfDefault(),
but that's silly.) The old InsetText::forceDefaultParagraphs() has been
split into these, plus a new method InsetText::allowParagraphCustomization().
A lot of the changes just adapt to this change.
The other big change is in GuiToolbar: We want to show LyXDefault and
the "default" layout only when they're active.
There are a handful of places where I'm not entirely sure whether we
should be using forceEmptyLayout or !allowParagraphCustomization() or
both. The InsetCaption is one of these. These places, and some others,
are marked with FIXMEs, so I'd appreciate it if people would search
through the patch and let me know whether these need changing. If they
don't, the FIXMEs can be deleted.
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@22966 a592a061-630c-0410-9148-cb99ea01b6c8
2008-02-12 17:31:07 +00:00
|
|
|
|
paragraphs().back().layout(bp.getTextClass().emptyLayout());
|
2000-03-08 13:52:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-04-29 12:32:14 +00:00
|
|
|
|
InsetCollapsable::InsetCollapsable(InsetCollapsable const & rhs)
|
2007-05-28 22:27:45 +00:00
|
|
|
|
: InsetText(rhs),
|
2008-02-05 10:34:01 +00:00
|
|
|
|
textClass_(rhs.textClass_),
|
2007-08-13 20:12:52 +00:00
|
|
|
|
layout_(rhs.layout_),
|
2007-11-03 00:56:48 +00:00
|
|
|
|
labelstring_(rhs.labelstring_),
|
2007-11-17 22:55:30 +00:00
|
|
|
|
button_dim(rhs.button_dim),
|
2007-04-29 12:32:14 +00:00
|
|
|
|
status_(rhs.status_),
|
|
|
|
|
openinlined_(rhs.openinlined_),
|
|
|
|
|
autoOpen_(rhs.autoOpen_),
|
|
|
|
|
// the sole purpose of this copy constructor
|
|
|
|
|
mouse_hover_(false)
|
2006-12-05 05:36:59 +00:00
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-12-25 18:53:38 +00:00
|
|
|
|
docstring InsetCollapsable::toolTip(BufferView const & bv, int x, int y) const
|
|
|
|
|
{
|
|
|
|
|
Dimension dim = dimensionCollapsed();
|
2008-02-12 09:11:06 +00:00
|
|
|
|
if (geometry() == NoButton)
|
|
|
|
|
return layout_->labelstring;
|
|
|
|
|
else if (x > xo(bv) + dim.wid || y > yo(bv) + dim.des)
|
2007-12-25 18:53:38 +00:00
|
|
|
|
return docstring();
|
|
|
|
|
|
|
|
|
|
switch (status_) {
|
|
|
|
|
case Open:
|
|
|
|
|
return _("Left-click to collapse the inset");
|
|
|
|
|
case Collapsed:
|
|
|
|
|
return _("Left-click to open the inset");
|
|
|
|
|
}
|
|
|
|
|
return docstring();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void InsetCollapsable::setLayout(BufferParams const & bp)
|
2007-08-13 12:13:17 +00:00
|
|
|
|
{
|
2008-02-05 10:34:01 +00:00
|
|
|
|
setLayout(bp.getTextClassPtr());
|
2007-11-03 09:03:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2008-02-05 10:34:01 +00:00
|
|
|
|
void InsetCollapsable::setLayout(TextClassPtr tc)
|
2007-11-03 09:03:08 +00:00
|
|
|
|
{
|
2008-02-05 10:34:01 +00:00
|
|
|
|
textClass_ = tc;
|
|
|
|
|
if ( tc.get() != 0 ) {
|
|
|
|
|
layout_ = &tc->insetlayout(name());
|
|
|
|
|
labelstring_ = layout_->labelstring;
|
|
|
|
|
} else {
|
2008-02-21 16:31:59 +00:00
|
|
|
|
layout_ = &TextClass::emptyInsetLayout();
|
2008-02-05 10:34:01 +00:00
|
|
|
|
labelstring_ = _("UNDEFINED");
|
|
|
|
|
}
|
2007-11-02 21:27:41 +00:00
|
|
|
|
|
|
|
|
|
setButtonLabel();
|
2007-08-13 12:13:17 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2003-08-28 07:41:31 +00:00
|
|
|
|
void InsetCollapsable::write(Buffer const & buf, ostream & os) const
|
2000-04-19 14:42:19 +00:00
|
|
|
|
{
|
2004-02-03 16:44:57 +00:00
|
|
|
|
os << "status ";
|
2003-12-12 14:02:14 +00:00
|
|
|
|
switch (status_) {
|
|
|
|
|
case Open:
|
2004-02-03 16:44:57 +00:00
|
|
|
|
os << "open";
|
2003-12-12 14:02:14 +00:00
|
|
|
|
break;
|
|
|
|
|
case Collapsed:
|
2004-02-03 16:44:57 +00:00
|
|
|
|
os << "collapsed";
|
2003-12-12 14:02:14 +00:00
|
|
|
|
break;
|
|
|
|
|
}
|
2004-02-03 16:44:57 +00:00
|
|
|
|
os << "\n";
|
2004-03-25 09:16:36 +00:00
|
|
|
|
text_.write(buf, os);
|
2000-04-19 14:42:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-04-26 11:30:54 +00:00
|
|
|
|
void InsetCollapsable::read(Buffer const & buf, Lexer & lex)
|
2000-04-19 14:42:19 +00:00
|
|
|
|
{
|
2003-12-12 14:02:14 +00:00
|
|
|
|
bool token_found = false;
|
2001-08-06 19:13:25 +00:00
|
|
|
|
if (lex.isOK()) {
|
2001-04-02 14:02:58 +00:00
|
|
|
|
lex.next();
|
2001-08-06 19:13:25 +00:00
|
|
|
|
string const token = lex.getString();
|
2003-12-12 14:02:14 +00:00
|
|
|
|
if (token == "status") {
|
2001-04-02 14:02:58 +00:00
|
|
|
|
lex.next();
|
2003-12-12 14:02:14 +00:00
|
|
|
|
string const tmp_token = lex.getString();
|
|
|
|
|
|
2007-08-16 16:36:50 +00:00
|
|
|
|
if (tmp_token == "collapsed") {
|
2003-12-12 14:02:14 +00:00
|
|
|
|
status_ = Collapsed;
|
|
|
|
|
token_found = true;
|
|
|
|
|
} else if (tmp_token == "open") {
|
|
|
|
|
status_ = Open;
|
|
|
|
|
token_found = true;
|
|
|
|
|
} else {
|
|
|
|
|
lyxerr << "InsetCollapsable::read: Missing status!"
|
|
|
|
|
<< endl;
|
|
|
|
|
// Take countermeasures
|
|
|
|
|
lex.pushToken(token);
|
|
|
|
|
}
|
2001-04-02 14:02:58 +00:00
|
|
|
|
} else {
|
2007-11-28 22:12:03 +00:00
|
|
|
|
LYXERR0("InsetCollapsable::read: Missing 'status'-tag!");
|
2003-12-12 14:02:14 +00:00
|
|
|
|
// take countermeasures
|
2001-07-25 22:05:53 +00:00
|
|
|
|
lex.pushToken(token);
|
2001-04-02 14:02:58 +00:00
|
|
|
|
}
|
2000-04-19 14:42:19 +00:00
|
|
|
|
}
|
2008-02-20 16:56:33 +00:00
|
|
|
|
//this must be set before we enter InsetText::read()
|
2007-11-03 09:03:08 +00:00
|
|
|
|
setLayout(buf.params());
|
|
|
|
|
|
2008-02-20 16:56:33 +00:00
|
|
|
|
InsetText::read(buf, lex);
|
|
|
|
|
|
2004-01-30 11:41:12 +00:00
|
|
|
|
if (!token_found)
|
|
|
|
|
status_ = isOpen() ? Open : Collapsed;
|
2003-12-12 14:02:14 +00:00
|
|
|
|
|
2007-10-30 12:30:46 +00:00
|
|
|
|
// Force default font, if so requested
|
|
|
|
|
// This avoids paragraphs in buffer language that would have a
|
|
|
|
|
// foreign language after a document language change, and it ensures
|
|
|
|
|
// that all new text in ERT and similar gets the "latex" language,
|
|
|
|
|
// since new text inherits the language from the last position of the
|
|
|
|
|
// existing text. As a side effect this makes us also robust against
|
|
|
|
|
// bugs in LyX that might lead to font changes in ERT in .lyx files.
|
|
|
|
|
resetParagraphsFont();
|
2000-04-19 14:42:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2004-11-30 01:59:49 +00:00
|
|
|
|
Dimension InsetCollapsable::dimensionCollapsed() const
|
2000-03-08 13:52:57 +00:00
|
|
|
|
{
|
2007-11-03 09:03:08 +00:00
|
|
|
|
BOOST_ASSERT(layout_);
|
2004-11-30 01:59:49 +00:00
|
|
|
|
Dimension dim;
|
2007-11-03 00:35:07 +00:00
|
|
|
|
theFontMetrics(layout_->labelfont).buttonText(
|
|
|
|
|
labelstring_, dim.wid, dim.asc, dim.des);
|
2004-11-30 01:59:49 +00:00
|
|
|
|
return dim;
|
2000-03-08 13:52:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-09-21 20:39:47 +00:00
|
|
|
|
void InsetCollapsable::metrics(MetricsInfo & mi, Dimension & dim) const
|
2000-03-08 13:52:57 +00:00
|
|
|
|
{
|
2007-11-03 09:03:08 +00:00
|
|
|
|
BOOST_ASSERT(layout_);
|
|
|
|
|
|
2005-09-28 15:02:47 +00:00
|
|
|
|
autoOpen_ = mi.base.bv->cursor().isInside(this);
|
|
|
|
|
|
2007-10-30 12:30:46 +00:00
|
|
|
|
FontInfo tmpfont = mi.base.font;
|
2007-11-03 00:35:07 +00:00
|
|
|
|
mi.base.font = layout_->font;
|
2007-10-30 12:30:46 +00:00
|
|
|
|
mi.base.font.realize(tmpfont);
|
|
|
|
|
|
2007-08-31 07:15:32 +00:00
|
|
|
|
switch (geometry()) {
|
|
|
|
|
case NoButton:
|
2007-08-19 15:45:35 +00:00
|
|
|
|
InsetText::metrics(mi, dim);
|
|
|
|
|
break;
|
2007-08-31 07:15:32 +00:00
|
|
|
|
case Corners:
|
2004-03-25 09:16:36 +00:00
|
|
|
|
InsetText::metrics(mi, dim);
|
2007-08-31 12:05:41 +00:00
|
|
|
|
dim.des -= 3;
|
2007-09-18 20:48:39 +00:00
|
|
|
|
dim.asc -= 1;
|
2007-08-16 16:36:50 +00:00
|
|
|
|
break;
|
2007-08-31 12:05:41 +00:00
|
|
|
|
case SubLabel: {
|
|
|
|
|
InsetText::metrics(mi, dim);
|
|
|
|
|
// consider width of the inset label
|
2007-11-03 00:35:07 +00:00
|
|
|
|
FontInfo font(layout_->labelfont);
|
2007-10-28 18:51:54 +00:00
|
|
|
|
font.realize(sane_font);
|
2007-08-31 12:05:41 +00:00
|
|
|
|
font.decSize();
|
|
|
|
|
font.decSize();
|
|
|
|
|
int w = 0;
|
|
|
|
|
int a = 0;
|
|
|
|
|
int d = 0;
|
2007-11-03 00:35:07 +00:00
|
|
|
|
theFontMetrics(font).rectText(labelstring_, w, a, d);
|
2007-10-06 08:15:40 +00:00
|
|
|
|
dim.des += a + d;
|
2007-08-31 12:05:41 +00:00
|
|
|
|
break;
|
|
|
|
|
}
|
2007-08-31 07:15:32 +00:00
|
|
|
|
case TopButton:
|
|
|
|
|
case LeftButton:
|
|
|
|
|
case ButtonOnly:
|
2004-11-30 01:59:49 +00:00
|
|
|
|
dim = dimensionCollapsed();
|
2007-08-16 16:36:50 +00:00
|
|
|
|
if (geometry() == TopButton
|
|
|
|
|
|| geometry() == LeftButton) {
|
2007-09-05 13:45:58 +00:00
|
|
|
|
Dimension textdim;
|
|
|
|
|
InsetText::metrics(mi, textdim);
|
|
|
|
|
openinlined_ = (textdim.wid + dim.wid) < mi.base.textwidth;
|
2004-03-10 08:50:46 +00:00
|
|
|
|
if (openinlined_) {
|
2007-09-01 09:24:20 +00:00
|
|
|
|
// Correct for button width.
|
2007-09-05 13:45:58 +00:00
|
|
|
|
dim.wid += textdim.wid;
|
|
|
|
|
dim.des = max(dim.des - textdim.asc + dim.asc, textdim.des);
|
|
|
|
|
dim.asc = textdim.asc;
|
2004-03-10 08:50:46 +00:00
|
|
|
|
} else {
|
2007-11-02 16:34:37 +00:00
|
|
|
|
dim.des += textdim.height() + TEXT_TO_INSET_OFFSET;
|
2007-09-05 13:45:58 +00:00
|
|
|
|
dim.wid = max(dim.wid, textdim.wid);
|
2004-03-10 08:50:46 +00:00
|
|
|
|
}
|
2003-12-02 07:15:42 +00:00
|
|
|
|
}
|
2007-08-16 16:36:50 +00:00
|
|
|
|
break;
|
2003-07-18 07:47:07 +00:00
|
|
|
|
}
|
2007-10-30 12:30:46 +00:00
|
|
|
|
|
|
|
|
|
mi.base.font = tmpfont;
|
2000-03-08 13:52:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2006-12-04 04:31:18 +00:00
|
|
|
|
bool InsetCollapsable::setMouseHover(bool mouse_hover)
|
|
|
|
|
{
|
|
|
|
|
mouse_hover_ = mouse_hover;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2003-12-02 07:15:42 +00:00
|
|
|
|
void InsetCollapsable::draw(PainterInfo & pi, int x, int y) const
|
2000-03-08 13:52:57 +00:00
|
|
|
|
{
|
2007-11-03 09:03:08 +00:00
|
|
|
|
BOOST_ASSERT(layout_);
|
|
|
|
|
|
2007-08-25 14:43:59 +00:00
|
|
|
|
autoOpen_ = pi.base.bv->cursor().isInside(this);
|
2007-10-29 10:47:41 +00:00
|
|
|
|
ColorCode const old_color = pi.background_color;
|
2007-09-02 14:34:15 +00:00
|
|
|
|
pi.background_color = backgroundColor();
|
2007-08-16 16:36:50 +00:00
|
|
|
|
|
2007-10-30 12:30:46 +00:00
|
|
|
|
FontInfo tmpfont = pi.base.font;
|
2007-11-03 00:35:07 +00:00
|
|
|
|
pi.base.font = layout_->font;
|
2007-10-30 12:30:46 +00:00
|
|
|
|
pi.base.font.realize(tmpfont);
|
|
|
|
|
|
2007-08-18 23:26:07 +00:00
|
|
|
|
// Draw button first -- top, left or only
|
|
|
|
|
Dimension dimc = dimensionCollapsed();
|
2007-09-05 22:08:41 +00:00
|
|
|
|
|
2007-08-31 12:05:41 +00:00
|
|
|
|
if (geometry() == TopButton ||
|
|
|
|
|
geometry() == LeftButton ||
|
|
|
|
|
geometry() == ButtonOnly) {
|
2007-09-17 21:45:14 +00:00
|
|
|
|
button_dim.x1 = x + 0;
|
|
|
|
|
button_dim.x2 = x + dimc.width();
|
2007-09-06 12:25:30 +00:00
|
|
|
|
button_dim.y1 = y - dimc.asc;
|
|
|
|
|
button_dim.y2 = y + dimc.des;
|
2004-11-30 01:59:49 +00:00
|
|
|
|
|
2007-11-03 00:35:07 +00:00
|
|
|
|
pi.pain.buttonText(x, y, labelstring_, layout_->labelfont,
|
|
|
|
|
mouse_hover_);
|
2007-09-01 11:40:09 +00:00
|
|
|
|
} else {
|
|
|
|
|
button_dim.x1 = 0;
|
|
|
|
|
button_dim.y1 = 0;
|
|
|
|
|
button_dim.x2 = 0;
|
|
|
|
|
button_dim.y2 = 0;
|
2007-08-18 23:26:07 +00:00
|
|
|
|
}
|
2006-03-10 16:10:35 +00:00
|
|
|
|
|
2007-09-17 21:45:14 +00:00
|
|
|
|
Dimension const textdim = InsetText::dimension(*pi.base.bv);
|
2007-09-09 20:21:43 +00:00
|
|
|
|
int const baseline = y;
|
2007-08-18 23:26:07 +00:00
|
|
|
|
int textx, texty;
|
|
|
|
|
switch (geometry()) {
|
|
|
|
|
case LeftButton:
|
2007-09-17 21:45:14 +00:00
|
|
|
|
textx = x + dimc.width();
|
2007-09-06 12:00:32 +00:00
|
|
|
|
texty = baseline;
|
2007-08-18 23:26:07 +00:00
|
|
|
|
InsetText::draw(pi, textx, texty);
|
|
|
|
|
break;
|
|
|
|
|
case TopButton:
|
2007-09-17 21:45:14 +00:00
|
|
|
|
textx = x;
|
|
|
|
|
texty = baseline + dimc.des + textdim.asc;
|
2007-08-18 23:26:07 +00:00
|
|
|
|
InsetText::draw(pi, textx, texty);
|
|
|
|
|
break;
|
|
|
|
|
case ButtonOnly:
|
|
|
|
|
break;
|
|
|
|
|
case NoButton:
|
2007-09-17 21:45:14 +00:00
|
|
|
|
textx = x;
|
2007-09-06 12:00:32 +00:00
|
|
|
|
texty = baseline;
|
2007-08-18 23:26:07 +00:00
|
|
|
|
InsetText::draw(pi, textx, texty);
|
|
|
|
|
break;
|
|
|
|
|
case SubLabel:
|
|
|
|
|
case Corners:
|
2007-09-17 21:45:14 +00:00
|
|
|
|
textx = x;
|
2007-09-06 14:17:03 +00:00
|
|
|
|
texty = baseline;
|
2007-08-18 23:26:07 +00:00
|
|
|
|
const_cast<InsetCollapsable *>(this)->setDrawFrame(false);
|
|
|
|
|
InsetText::draw(pi, textx, texty);
|
|
|
|
|
const_cast<InsetCollapsable *>(this)->setDrawFrame(true);
|
2007-08-19 15:45:35 +00:00
|
|
|
|
|
2007-09-21 20:39:47 +00:00
|
|
|
|
int desc = textdim.descent();
|
2007-09-25 06:49:04 +00:00
|
|
|
|
if (geometry() == Corners)
|
2007-08-19 15:45:35 +00:00
|
|
|
|
desc -= 3;
|
|
|
|
|
|
2007-09-17 21:45:14 +00:00
|
|
|
|
const int xx1 = x + TEXT_TO_INSET_OFFSET - 1;
|
2007-09-18 20:18:50 +00:00
|
|
|
|
const int xx2 = x + textdim.wid - TEXT_TO_INSET_OFFSET + 1;
|
2007-09-01 20:38:25 +00:00
|
|
|
|
pi.pain.line(xx1, y + desc - 4,
|
|
|
|
|
xx1, y + desc,
|
2007-11-03 00:35:07 +00:00
|
|
|
|
layout_->labelfont.color());
|
2007-11-07 21:57:19 +00:00
|
|
|
|
if (status_ == Open)
|
2007-09-01 20:38:25 +00:00
|
|
|
|
pi.pain.line(xx1, y + desc,
|
|
|
|
|
xx2, y + desc,
|
2007-11-03 00:35:07 +00:00
|
|
|
|
layout_->labelfont.color());
|
2007-08-19 15:45:35 +00:00
|
|
|
|
else {
|
|
|
|
|
// Make status_ value visible:
|
2007-09-01 20:38:25 +00:00
|
|
|
|
pi.pain.line(xx1, y + desc,
|
|
|
|
|
xx1 + 4, y + desc,
|
2007-11-03 00:35:07 +00:00
|
|
|
|
layout_->labelfont.color());
|
2007-09-01 20:38:25 +00:00
|
|
|
|
pi.pain.line(xx2 - 4, y + desc,
|
|
|
|
|
xx2, y + desc,
|
2007-11-03 00:35:07 +00:00
|
|
|
|
layout_->labelfont.color());
|
2007-08-19 15:45:35 +00:00
|
|
|
|
}
|
2007-09-17 22:18:07 +00:00
|
|
|
|
pi.pain.line(x + textdim.wid - 3, y + desc, x + textdim.wid - 3, y + desc - 4,
|
2007-11-03 00:35:07 +00:00
|
|
|
|
layout_->labelfont.color());
|
2007-08-19 15:45:35 +00:00
|
|
|
|
|
2007-09-01 17:55:21 +00:00
|
|
|
|
// the label below the text. Can be toggled.
|
|
|
|
|
if (geometry() == SubLabel) {
|
2007-11-03 00:35:07 +00:00
|
|
|
|
FontInfo font(layout_->labelfont);
|
2007-10-28 18:51:54 +00:00
|
|
|
|
font.realize(sane_font);
|
2007-08-19 15:45:35 +00:00
|
|
|
|
font.decSize();
|
|
|
|
|
font.decSize();
|
|
|
|
|
int w = 0;
|
|
|
|
|
int a = 0;
|
|
|
|
|
int d = 0;
|
2007-11-03 00:35:07 +00:00
|
|
|
|
theFontMetrics(font).rectText(labelstring_, w, a, d);
|
2007-10-06 08:15:40 +00:00
|
|
|
|
int const ww = max(textdim.wid, w);
|
|
|
|
|
pi.pain.rectText(x + (ww - w) / 2, y + desc + a,
|
2007-11-03 00:35:07 +00:00
|
|
|
|
labelstring_, font, Color_none, Color_none);
|
2007-10-06 08:15:40 +00:00
|
|
|
|
desc += d;
|
2007-08-19 15:45:35 +00:00
|
|
|
|
}
|
|
|
|
|
|
2007-09-18 20:18:50 +00:00
|
|
|
|
// a visual cue when the cursor is inside the inset
|
2007-08-19 15:45:35 +00:00
|
|
|
|
Cursor & cur = pi.base.bv->cursor();
|
|
|
|
|
if (cur.isInside(this)) {
|
2007-09-25 06:49:04 +00:00
|
|
|
|
y -= textdim.asc;
|
2007-08-19 15:45:35 +00:00
|
|
|
|
y += 3;
|
2007-11-03 00:35:07 +00:00
|
|
|
|
pi.pain.line(xx1, y + 4, xx1, y, layout_->labelfont.color());
|
|
|
|
|
pi.pain.line(xx1 + 4, y, xx1, y, layout_->labelfont.color());
|
2007-09-18 20:18:50 +00:00
|
|
|
|
pi.pain.line(xx2, y + 4, xx2, y,
|
2007-11-03 00:35:07 +00:00
|
|
|
|
layout_->labelfont.color());
|
2007-09-01 20:38:25 +00:00
|
|
|
|
pi.pain.line(xx2 - 4, y, xx2, y,
|
2007-11-03 00:35:07 +00:00
|
|
|
|
layout_->labelfont.color());
|
2007-08-19 15:45:35 +00:00
|
|
|
|
}
|
2007-08-18 23:26:07 +00:00
|
|
|
|
break;
|
2003-03-20 14:13:49 +00:00
|
|
|
|
}
|
2007-09-05 13:52:43 +00:00
|
|
|
|
pi.background_color = old_color;
|
2007-10-30 12:30:46 +00:00
|
|
|
|
|
|
|
|
|
pi.base.font = tmpfont;
|
2003-03-20 14:13:49 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-05-28 22:27:45 +00:00
|
|
|
|
void InsetCollapsable::cursorPos(BufferView const & bv,
|
2006-10-17 16:23:27 +00:00
|
|
|
|
CursorSlice const & sl, bool boundary, int & x, int & y) const
|
2004-11-30 01:59:49 +00:00
|
|
|
|
{
|
2007-09-20 14:11:37 +00:00
|
|
|
|
if (geometry() == ButtonOnly)
|
|
|
|
|
status_ = Open;
|
2007-08-16 16:36:50 +00:00
|
|
|
|
BOOST_ASSERT(geometry() != ButtonOnly);
|
2006-04-05 23:56:29 +00:00
|
|
|
|
|
2006-10-17 16:23:27 +00:00
|
|
|
|
InsetText::cursorPos(bv, sl, boundary, x, y);
|
2007-09-17 21:45:14 +00:00
|
|
|
|
Dimension const textdim = InsetText::dimension(bv);
|
2006-04-05 23:56:29 +00:00
|
|
|
|
|
2007-08-16 16:36:50 +00:00
|
|
|
|
switch (geometry()) {
|
|
|
|
|
case LeftButton:
|
|
|
|
|
x += dimensionCollapsed().wid;
|
|
|
|
|
break;
|
2007-09-05 14:15:07 +00:00
|
|
|
|
case TopButton: {
|
2007-09-17 21:45:14 +00:00
|
|
|
|
y += dimensionCollapsed().des + textdim.asc;
|
2007-08-16 16:36:50 +00:00
|
|
|
|
break;
|
2007-09-05 14:15:07 +00:00
|
|
|
|
}
|
2007-08-16 16:36:50 +00:00
|
|
|
|
case NoButton:
|
|
|
|
|
case SubLabel:
|
|
|
|
|
case Corners:
|
|
|
|
|
// Do nothing
|
|
|
|
|
break;
|
|
|
|
|
case ButtonOnly:
|
|
|
|
|
// Cannot get here
|
|
|
|
|
break;
|
2004-11-30 01:59:49 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-04-29 13:39:47 +00:00
|
|
|
|
Inset::EDITABLE InsetCollapsable::editable() const
|
2003-03-20 14:13:49 +00:00
|
|
|
|
{
|
2007-08-16 16:36:50 +00:00
|
|
|
|
return geometry() != ButtonOnly? HIGHLY_EDITABLE : IS_EDITABLE;
|
2000-03-08 13:52:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2003-12-02 07:15:42 +00:00
|
|
|
|
bool InsetCollapsable::descendable() const
|
2000-03-08 13:52:57 +00:00
|
|
|
|
{
|
2007-08-16 16:36:50 +00:00
|
|
|
|
return geometry() != ButtonOnly;
|
2000-03-08 13:52:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
2000-04-24 20:58:23 +00:00
|
|
|
|
|
2005-04-22 08:57:22 +00:00
|
|
|
|
bool InsetCollapsable::hitButton(FuncRequest const & cmd) const
|
2003-07-30 14:43:14 +00:00
|
|
|
|
{
|
2003-09-02 20:42:28 +00:00
|
|
|
|
return button_dim.contains(cmd.x, cmd.y);
|
2003-07-30 14:43:14 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2006-10-08 09:36:16 +00:00
|
|
|
|
docstring const InsetCollapsable::getNewLabel(docstring const & l) const
|
2003-12-01 14:51:52 +00:00
|
|
|
|
{
|
2006-10-08 09:36:16 +00:00
|
|
|
|
docstring label;
|
2003-12-01 14:51:52 +00:00
|
|
|
|
pos_type const max_length = 15;
|
2004-03-25 09:16:36 +00:00
|
|
|
|
pos_type const p_siz = paragraphs().begin()->size();
|
2007-12-12 19:28:07 +00:00
|
|
|
|
pos_type const n = min(max_length, p_siz);
|
2003-12-01 14:51:52 +00:00
|
|
|
|
pos_type i = 0;
|
|
|
|
|
pos_type j = 0;
|
2005-07-15 15:49:40 +00:00
|
|
|
|
for (; i < n && j < p_siz; ++j) {
|
2004-03-25 09:16:36 +00:00
|
|
|
|
if (paragraphs().begin()->isInset(j))
|
2003-12-01 14:51:52 +00:00
|
|
|
|
continue;
|
2004-03-25 09:16:36 +00:00
|
|
|
|
label += paragraphs().begin()->getChar(j);
|
2003-12-01 14:51:52 +00:00
|
|
|
|
++i;
|
|
|
|
|
}
|
2004-03-25 09:16:36 +00:00
|
|
|
|
if (paragraphs().size() > 1 || (i > 0 && j < p_siz)) {
|
2006-10-08 09:56:41 +00:00
|
|
|
|
label += "...";
|
2003-12-01 14:51:52 +00:00
|
|
|
|
}
|
2004-03-08 21:14:45 +00:00
|
|
|
|
return label.empty() ? l : label;
|
2003-12-01 14:51:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2008-02-11 08:20:13 +00:00
|
|
|
|
void InsetCollapsable::edit(Cursor & cur, bool front, EntryDirection entry_from)
|
2003-10-15 08:49:44 +00:00
|
|
|
|
{
|
2004-01-30 11:41:12 +00:00
|
|
|
|
//lyxerr << "InsetCollapsable: edit left/right" << endl;
|
2004-03-18 12:53:43 +00:00
|
|
|
|
cur.push(*this);
|
2008-02-10 19:52:45 +00:00
|
|
|
|
InsetText::edit(cur, front, entry_from);
|
2003-10-15 08:49:44 +00:00
|
|
|
|
}
|
|
|
|
|
|
2003-11-04 12:36:59 +00:00
|
|
|
|
|
2007-04-29 13:39:47 +00:00
|
|
|
|
Inset * InsetCollapsable::editXY(Cursor & cur, int x, int y)
|
2003-11-04 12:36:59 +00:00
|
|
|
|
{
|
2004-01-30 11:41:12 +00:00
|
|
|
|
//lyxerr << "InsetCollapsable: edit xy" << endl;
|
2007-08-16 16:36:50 +00:00
|
|
|
|
if (geometry() == ButtonOnly
|
|
|
|
|
|| (button_dim.contains(x, y)
|
2007-08-31 12:05:41 +00:00
|
|
|
|
&& geometry() != NoButton))
|
2005-07-15 00:39:44 +00:00
|
|
|
|
return this;
|
|
|
|
|
cur.push(*this);
|
2004-03-25 09:16:36 +00:00
|
|
|
|
return InsetText::editXY(cur, x, y);
|
2003-11-04 12:36:59 +00:00
|
|
|
|
}
|
|
|
|
|
|
2003-10-15 08:49:44 +00:00
|
|
|
|
|
2007-04-26 14:56:30 +00:00
|
|
|
|
void InsetCollapsable::doDispatch(Cursor & cur, FuncRequest & cmd)
|
2000-07-04 11:30:07 +00:00
|
|
|
|
{
|
2005-07-15 11:43:07 +00:00
|
|
|
|
//lyxerr << "InsetCollapsable::doDispatch (begin): cmd: " << cmd
|
|
|
|
|
// << " cur: " << cur << " bvcur: " << cur.bv().cursor() << endl;
|
2004-08-14 19:55:00 +00:00
|
|
|
|
|
2002-08-19 10:11:13 +00:00
|
|
|
|
switch (cmd.action) {
|
2004-03-30 12:36:33 +00:00
|
|
|
|
case LFUN_MOUSE_PRESS:
|
2007-08-16 16:36:50 +00:00
|
|
|
|
if (cmd.button() == mouse_button::button1
|
|
|
|
|
&& hitButton(cmd)
|
2007-08-31 07:15:32 +00:00
|
|
|
|
&& geometry() != NoButton) {
|
2007-01-04 13:53:16 +00:00
|
|
|
|
// reset selection if necessary (see bug 3060)
|
|
|
|
|
if (cur.selection())
|
|
|
|
|
cur.bv().cursor().clearSelection();
|
|
|
|
|
else
|
|
|
|
|
cur.noUpdate();
|
2006-11-17 17:42:52 +00:00
|
|
|
|
cur.dispatched();
|
|
|
|
|
break;
|
|
|
|
|
}
|
2007-08-31 07:15:32 +00:00
|
|
|
|
if (geometry() == NoButton)
|
2004-11-24 21:58:42 +00:00
|
|
|
|
InsetText::doDispatch(cur, cmd);
|
2007-08-16 16:36:50 +00:00
|
|
|
|
else if (geometry() != ButtonOnly
|
|
|
|
|
&& !hitButton(cmd))
|
2004-11-24 21:58:42 +00:00
|
|
|
|
InsetText::doDispatch(cur, cmd);
|
2004-08-14 15:55:22 +00:00
|
|
|
|
else
|
2006-04-15 15:10:03 +00:00
|
|
|
|
cur.undispatched();
|
2004-03-30 12:36:33 +00:00
|
|
|
|
break;
|
2002-08-19 10:11:13 +00:00
|
|
|
|
|
2004-03-30 12:36:33 +00:00
|
|
|
|
case LFUN_MOUSE_MOTION:
|
2005-04-22 14:59:13 +00:00
|
|
|
|
case LFUN_MOUSE_DOUBLE:
|
|
|
|
|
case LFUN_MOUSE_TRIPLE:
|
2007-08-31 12:05:41 +00:00
|
|
|
|
if (geometry() == NoButton)
|
2004-11-24 21:58:42 +00:00
|
|
|
|
InsetText::doDispatch(cur, cmd);
|
2007-08-16 16:36:50 +00:00
|
|
|
|
else if (geometry() != ButtonOnly
|
|
|
|
|
&& !hitButton(cmd))
|
2004-11-24 21:58:42 +00:00
|
|
|
|
InsetText::doDispatch(cur, cmd);
|
2004-11-30 01:59:49 +00:00
|
|
|
|
else
|
|
|
|
|
cur.undispatched();
|
2004-03-30 12:36:33 +00:00
|
|
|
|
break;
|
2002-08-19 10:11:13 +00:00
|
|
|
|
|
2004-03-30 12:36:33 +00:00
|
|
|
|
case LFUN_MOUSE_RELEASE:
|
|
|
|
|
if (cmd.button() == mouse_button::button3) {
|
2007-08-31 12:05:41 +00:00
|
|
|
|
// There is no button to right click:
|
2008-02-05 23:29:15 +00:00
|
|
|
|
if (decoration() == Minimalistic ||
|
|
|
|
|
geometry() == Corners ||
|
2007-08-31 12:05:41 +00:00
|
|
|
|
geometry() == SubLabel ||
|
2008-02-05 23:29:15 +00:00
|
|
|
|
geometry() == NoButton
|
|
|
|
|
) {
|
2007-11-07 21:57:19 +00:00
|
|
|
|
if (status_ == Open)
|
2007-08-20 04:56:04 +00:00
|
|
|
|
setStatus(cur, Collapsed);
|
|
|
|
|
else
|
|
|
|
|
setStatus(cur, Open);
|
|
|
|
|
break;
|
|
|
|
|
} else {
|
|
|
|
|
// Open the Inset
|
|
|
|
|
// configuration dialog
|
|
|
|
|
showInsetDialog(&cur.bv());
|
|
|
|
|
break;
|
|
|
|
|
}
|
2004-03-30 12:36:33 +00:00
|
|
|
|
}
|
2004-03-25 09:16:36 +00:00
|
|
|
|
|
2007-08-31 07:15:32 +00:00
|
|
|
|
if (geometry() == NoButton) {
|
2006-11-17 17:42:52 +00:00
|
|
|
|
// The mouse click has to be within the inset!
|
|
|
|
|
InsetText::doDispatch(cur, cmd);
|
2004-02-16 11:58:51 +00:00
|
|
|
|
break;
|
2006-11-17 17:42:52 +00:00
|
|
|
|
}
|
2002-08-19 10:11:13 +00:00
|
|
|
|
|
2006-12-20 13:25:46 +00:00
|
|
|
|
if (cmd.button() == mouse_button::button1 && hitButton(cmd)) {
|
|
|
|
|
// if we are selecting, we do not want to
|
|
|
|
|
// toggle the inset.
|
|
|
|
|
if (cur.selection())
|
|
|
|
|
break;
|
2006-12-19 15:42:10 +00:00
|
|
|
|
// Left button is clicked, the user asks to
|
|
|
|
|
// toggle the inset visual state.
|
2006-11-17 17:42:52 +00:00
|
|
|
|
cur.dispatched();
|
|
|
|
|
cur.updateFlags(Update::Force | Update::FitCursor);
|
2007-08-16 16:36:50 +00:00
|
|
|
|
if (geometry() == ButtonOnly) {
|
2006-11-17 17:42:52 +00:00
|
|
|
|
setStatus(cur, Open);
|
|
|
|
|
edit(cur, true);
|
|
|
|
|
}
|
|
|
|
|
else {
|
2005-05-06 20:00:31 +00:00
|
|
|
|
setStatus(cur, Collapsed);
|
2003-12-12 15:21:31 +00:00
|
|
|
|
}
|
2006-11-17 17:42:52 +00:00
|
|
|
|
cur.bv().cursor() = cur;
|
2004-02-16 11:58:51 +00:00
|
|
|
|
break;
|
2004-03-30 12:36:33 +00:00
|
|
|
|
}
|
2003-12-01 13:35:49 +00:00
|
|
|
|
|
2006-11-17 17:42:52 +00:00
|
|
|
|
// The mouse click is within the opened inset.
|
2007-08-16 16:36:50 +00:00
|
|
|
|
if (geometry() == TopButton
|
|
|
|
|
|| geometry() == LeftButton)
|
2006-12-28 03:00:48 +00:00
|
|
|
|
InsetText::doDispatch(cur, cmd);
|
2004-03-30 12:36:33 +00:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case LFUN_INSET_TOGGLE:
|
2006-09-01 15:41:38 +00:00
|
|
|
|
if (cmd.argument() == "open")
|
2005-05-06 20:00:31 +00:00
|
|
|
|
setStatus(cur, Open);
|
2006-09-01 15:41:38 +00:00
|
|
|
|
else if (cmd.argument() == "close")
|
2005-05-06 20:00:31 +00:00
|
|
|
|
setStatus(cur, Collapsed);
|
2006-09-01 15:41:38 +00:00
|
|
|
|
else if (cmd.argument() == "toggle" || cmd.argument().empty())
|
2007-11-07 21:57:19 +00:00
|
|
|
|
if (status_ == Open) {
|
2005-10-24 09:42:20 +00:00
|
|
|
|
setStatus(cur, Collapsed);
|
2007-08-20 04:56:04 +00:00
|
|
|
|
if (geometry() == ButtonOnly)
|
|
|
|
|
cur.top().forwardPos();
|
|
|
|
|
} else
|
2005-10-24 09:42:20 +00:00
|
|
|
|
setStatus(cur, Open);
|
2005-05-06 20:00:31 +00:00
|
|
|
|
else // if assign or anything else
|
2004-04-07 05:28:51 +00:00
|
|
|
|
cur.undispatched();
|
2004-03-30 12:36:33 +00:00
|
|
|
|
cur.dispatched();
|
|
|
|
|
break;
|
|
|
|
|
|
2007-10-30 12:30:46 +00:00
|
|
|
|
case LFUN_PASTE:
|
|
|
|
|
case LFUN_CLIPBOARD_PASTE:
|
|
|
|
|
case LFUN_PRIMARY_SELECTION_PASTE: {
|
|
|
|
|
InsetText::doDispatch(cur, cmd);
|
|
|
|
|
// Since we can only store plain text, we must reset all
|
|
|
|
|
// attributes.
|
|
|
|
|
// FIXME: Change only the pasted paragraphs
|
|
|
|
|
|
|
|
|
|
resetParagraphsFont();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
2004-03-30 12:36:33 +00:00
|
|
|
|
default:
|
2007-11-03 09:03:08 +00:00
|
|
|
|
if (layout_ && layout_->forceltr) {
|
2007-10-30 12:30:46 +00:00
|
|
|
|
// Force any new text to latex_language
|
|
|
|
|
// FIXME: This should only be necessary in constructor, but
|
|
|
|
|
// new paragraphs that are created by pressing enter at the
|
|
|
|
|
// start of an existing paragraph get the buffer language
|
|
|
|
|
// and not latex_language, so we take this brute force
|
|
|
|
|
// approach.
|
|
|
|
|
cur.current_font.setLanguage(latex_language);
|
|
|
|
|
cur.real_current_font.setLanguage(latex_language);
|
|
|
|
|
}
|
2004-11-24 21:58:42 +00:00
|
|
|
|
InsetText::doDispatch(cur, cmd);
|
2004-03-30 12:36:33 +00:00
|
|
|
|
break;
|
2001-04-02 14:02:58 +00:00
|
|
|
|
}
|
2000-07-04 11:30:07 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-10-11 10:13:45 +00:00
|
|
|
|
bool InsetCollapsable::allowMultiPar() const
|
|
|
|
|
{
|
2007-11-03 00:35:07 +00:00
|
|
|
|
return layout_->multipar;
|
2007-10-11 10:13:45 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-10-30 12:30:46 +00:00
|
|
|
|
void InsetCollapsable::resetParagraphsFont()
|
|
|
|
|
{
|
|
|
|
|
Font font;
|
2007-11-16 12:39:10 +00:00
|
|
|
|
font.fontInfo() = inherit_font;
|
2007-11-03 00:35:07 +00:00
|
|
|
|
if (layout_->forceltr)
|
2007-10-30 12:30:46 +00:00
|
|
|
|
font.setLanguage(latex_language);
|
2007-11-03 00:35:07 +00:00
|
|
|
|
if (layout_->passthru) {
|
2007-10-30 12:30:46 +00:00
|
|
|
|
ParagraphList::iterator par = paragraphs().begin();
|
|
|
|
|
ParagraphList::iterator const end = paragraphs().end();
|
|
|
|
|
while (par != end) {
|
|
|
|
|
par->resetFonts(font);
|
|
|
|
|
par->params().clear();
|
|
|
|
|
++par;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-04-26 14:56:30 +00:00
|
|
|
|
bool InsetCollapsable::getStatus(Cursor & cur, FuncRequest const & cmd,
|
2005-04-22 08:57:22 +00:00
|
|
|
|
FuncStatus & flag) const
|
|
|
|
|
{
|
|
|
|
|
switch (cmd.action) {
|
2007-10-30 12:30:46 +00:00
|
|
|
|
// suppress these
|
|
|
|
|
case LFUN_ACCENT_ACUTE:
|
|
|
|
|
case LFUN_ACCENT_BREVE:
|
|
|
|
|
case LFUN_ACCENT_CARON:
|
|
|
|
|
case LFUN_ACCENT_CEDILLA:
|
|
|
|
|
case LFUN_ACCENT_CIRCLE:
|
|
|
|
|
case LFUN_ACCENT_CIRCUMFLEX:
|
|
|
|
|
case LFUN_ACCENT_DOT:
|
|
|
|
|
case LFUN_ACCENT_GRAVE:
|
|
|
|
|
case LFUN_ACCENT_HUNGARIAN_UMLAUT:
|
|
|
|
|
case LFUN_ACCENT_MACRON:
|
|
|
|
|
case LFUN_ACCENT_OGONEK:
|
|
|
|
|
case LFUN_ACCENT_SPECIAL_CARON:
|
|
|
|
|
case LFUN_ACCENT_TIE:
|
|
|
|
|
case LFUN_ACCENT_TILDE:
|
|
|
|
|
case LFUN_ACCENT_UMLAUT:
|
|
|
|
|
case LFUN_ACCENT_UNDERBAR:
|
|
|
|
|
case LFUN_ACCENT_UNDERDOT:
|
|
|
|
|
case LFUN_APPENDIX:
|
|
|
|
|
case LFUN_BIBITEM_INSERT:
|
|
|
|
|
case LFUN_BOX_INSERT:
|
|
|
|
|
case LFUN_BRANCH_INSERT:
|
2007-11-25 18:34:37 +00:00
|
|
|
|
case LFUN_NEW_LINE:
|
2007-10-30 12:30:46 +00:00
|
|
|
|
case LFUN_CAPTION_INSERT:
|
|
|
|
|
case LFUN_CLEARPAGE_INSERT:
|
|
|
|
|
case LFUN_CLEARDOUBLEPAGE_INSERT:
|
|
|
|
|
case LFUN_DEPTH_DECREMENT:
|
|
|
|
|
case LFUN_DEPTH_INCREMENT:
|
|
|
|
|
case LFUN_ENVIRONMENT_INSERT:
|
|
|
|
|
case LFUN_ERT_INSERT:
|
|
|
|
|
case LFUN_FILE_INSERT:
|
|
|
|
|
case LFUN_FLEX_INSERT:
|
|
|
|
|
case LFUN_FLOAT_INSERT:
|
|
|
|
|
case LFUN_FLOAT_LIST:
|
|
|
|
|
case LFUN_FLOAT_WIDE_INSERT:
|
|
|
|
|
case LFUN_FONT_BOLD:
|
|
|
|
|
case LFUN_FONT_TYPEWRITER:
|
|
|
|
|
case LFUN_FONT_DEFAULT:
|
|
|
|
|
case LFUN_FONT_EMPH:
|
|
|
|
|
case LFUN_FONT_FREE_APPLY:
|
|
|
|
|
case LFUN_FONT_FREE_UPDATE:
|
|
|
|
|
case LFUN_FONT_NOUN:
|
|
|
|
|
case LFUN_FONT_ROMAN:
|
|
|
|
|
case LFUN_FONT_SANS:
|
|
|
|
|
case LFUN_FONT_FRAK:
|
|
|
|
|
case LFUN_FONT_ITAL:
|
|
|
|
|
case LFUN_FONT_SIZE:
|
|
|
|
|
case LFUN_FONT_STATE:
|
|
|
|
|
case LFUN_FONT_UNDERLINE:
|
|
|
|
|
case LFUN_FOOTNOTE_INSERT:
|
|
|
|
|
case LFUN_HFILL_INSERT:
|
|
|
|
|
case LFUN_HYPERLINK_INSERT:
|
|
|
|
|
case LFUN_INDEX_INSERT:
|
|
|
|
|
case LFUN_INDEX_PRINT:
|
|
|
|
|
case LFUN_INSET_INSERT:
|
|
|
|
|
case LFUN_LABEL_GOTO:
|
|
|
|
|
case LFUN_LABEL_INSERT:
|
|
|
|
|
case LFUN_LINE_INSERT:
|
2007-11-23 02:10:00 +00:00
|
|
|
|
case LFUN_NEWPAGE_INSERT:
|
2007-10-30 12:30:46 +00:00
|
|
|
|
case LFUN_PAGEBREAK_INSERT:
|
|
|
|
|
case LFUN_LAYOUT:
|
|
|
|
|
case LFUN_LAYOUT_PARAGRAPH:
|
|
|
|
|
case LFUN_LAYOUT_TABULAR:
|
|
|
|
|
case LFUN_MARGINALNOTE_INSERT:
|
|
|
|
|
case LFUN_MATH_DISPLAY:
|
|
|
|
|
case LFUN_MATH_INSERT:
|
|
|
|
|
case LFUN_MATH_MATRIX:
|
|
|
|
|
case LFUN_MATH_MODE:
|
|
|
|
|
case LFUN_MENU_OPEN:
|
|
|
|
|
case LFUN_NOACTION:
|
|
|
|
|
case LFUN_NOMENCL_INSERT:
|
|
|
|
|
case LFUN_NOMENCL_PRINT:
|
|
|
|
|
case LFUN_NOTE_INSERT:
|
|
|
|
|
case LFUN_NOTE_NEXT:
|
|
|
|
|
case LFUN_OPTIONAL_INSERT:
|
|
|
|
|
case LFUN_PARAGRAPH_PARAMS:
|
|
|
|
|
case LFUN_PARAGRAPH_PARAMS_APPLY:
|
|
|
|
|
case LFUN_PARAGRAPH_SPACING:
|
|
|
|
|
case LFUN_PARAGRAPH_UPDATE:
|
|
|
|
|
case LFUN_REFERENCE_NEXT:
|
|
|
|
|
case LFUN_SERVER_GOTO_FILE_ROW:
|
|
|
|
|
case LFUN_SERVER_NOTIFY:
|
|
|
|
|
case LFUN_SERVER_SET_XY:
|
|
|
|
|
case LFUN_SPACE_INSERT:
|
2007-12-06 11:04:56 +00:00
|
|
|
|
case LFUN_SPECIALCHAR_INSERT:
|
2007-10-30 12:30:46 +00:00
|
|
|
|
case LFUN_TABULAR_INSERT:
|
|
|
|
|
case LFUN_TOC_INSERT:
|
|
|
|
|
case LFUN_WRAP_INSERT:
|
2007-11-03 00:35:07 +00:00
|
|
|
|
if (layout_->passthru) {
|
2007-10-30 12:30:46 +00:00
|
|
|
|
flag.enabled(false);
|
|
|
|
|
return true;
|
|
|
|
|
} else
|
|
|
|
|
return InsetText::getStatus(cur, cmd, flag);
|
2005-04-22 08:57:22 +00:00
|
|
|
|
|
|
|
|
|
case LFUN_INSET_TOGGLE:
|
2006-09-01 15:41:38 +00:00
|
|
|
|
if (cmd.argument() == "open" || cmd.argument() == "close" ||
|
|
|
|
|
cmd.argument() == "toggle")
|
2005-04-22 08:57:22 +00:00
|
|
|
|
flag.enabled(true);
|
|
|
|
|
else
|
|
|
|
|
flag.enabled(false);
|
|
|
|
|
return true;
|
|
|
|
|
|
2007-10-30 12:30:46 +00:00
|
|
|
|
case LFUN_LANGUAGE:
|
2007-11-03 00:35:07 +00:00
|
|
|
|
flag.enabled(!layout_->forceltr);
|
2007-10-30 12:30:46 +00:00
|
|
|
|
return InsetText::getStatus(cur, cmd, flag);
|
|
|
|
|
|
|
|
|
|
case LFUN_BREAK_PARAGRAPH:
|
|
|
|
|
case LFUN_BREAK_PARAGRAPH_SKIP:
|
2007-11-03 00:35:07 +00:00
|
|
|
|
flag.enabled(layout_->multipar);
|
2007-10-30 12:30:46 +00:00
|
|
|
|
return true;
|
|
|
|
|
|
2005-04-22 08:57:22 +00:00
|
|
|
|
default:
|
|
|
|
|
return InsetText::getStatus(cur, cmd, flag);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2006-10-08 09:36:16 +00:00
|
|
|
|
void InsetCollapsable::setLabel(docstring const & l)
|
2001-07-24 22:08:49 +00:00
|
|
|
|
{
|
2007-11-03 00:35:07 +00:00
|
|
|
|
labelstring_ = l;
|
2001-07-24 22:08:49 +00:00
|
|
|
|
}
|
2001-08-07 15:07:36 +00:00
|
|
|
|
|
|
|
|
|
|
2007-04-26 14:56:30 +00:00
|
|
|
|
void InsetCollapsable::setStatus(Cursor & cur, CollapseStatus status)
|
2003-09-16 15:39:33 +00:00
|
|
|
|
{
|
2004-11-30 01:59:49 +00:00
|
|
|
|
status_ = status;
|
2003-12-12 14:02:14 +00:00
|
|
|
|
setButtonLabel();
|
2005-05-06 20:00:31 +00:00
|
|
|
|
if (status_ == Collapsed)
|
|
|
|
|
cur.leaveInset(*this);
|
2003-09-16 15:39:33 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-02-16 09:11:19 +00:00
|
|
|
|
docstring InsetCollapsable::floatName(string const & type, BufferParams const & bp) const
|
2006-10-08 08:47:26 +00:00
|
|
|
|
{
|
2007-04-29 19:53:54 +00:00
|
|
|
|
FloatList const & floats = bp.getTextClass().floats();
|
2006-10-08 08:47:26 +00:00
|
|
|
|
FloatList::const_iterator it = floats[type];
|
|
|
|
|
// FIXME UNICODE
|
2007-05-01 08:26:40 +00:00
|
|
|
|
return (it == floats.end()) ? from_ascii(type) : bp.B_(it->second.name());
|
2006-10-08 08:47:26 +00:00
|
|
|
|
}
|
2006-10-21 00:16:43 +00:00
|
|
|
|
|
|
|
|
|
|
2007-08-25 20:12:50 +00:00
|
|
|
|
InsetCollapsable::Decoration InsetCollapsable::decoration() const
|
|
|
|
|
{
|
2007-11-03 09:03:08 +00:00
|
|
|
|
if (!layout_ || layout_->decoration == "classic")
|
2007-08-25 20:12:50 +00:00
|
|
|
|
return Classic;
|
2007-11-03 00:35:07 +00:00
|
|
|
|
if (layout_->decoration == "minimalistic")
|
2007-08-25 20:12:50 +00:00
|
|
|
|
return Minimalistic;
|
2007-11-03 00:35:07 +00:00
|
|
|
|
if (layout_->decoration == "conglomerate")
|
2007-08-25 20:12:50 +00:00
|
|
|
|
return Conglomerate;
|
2007-11-03 09:03:08 +00:00
|
|
|
|
if (lyxCode() == FLEX_CODE)
|
|
|
|
|
// FIXME: Is this really necessary?
|
2007-08-25 20:12:50 +00:00
|
|
|
|
return Conglomerate;
|
|
|
|
|
return Classic;
|
|
|
|
|
}
|
|
|
|
|
|
2007-08-20 19:02:38 +00:00
|
|
|
|
|
2008-01-03 16:10:44 +00:00
|
|
|
|
bool InsetCollapsable::isMacroScope(Buffer const &) const
|
2007-12-21 20:42:46 +00:00
|
|
|
|
{
|
|
|
|
|
// layout_ == 0 leads to no latex output, so ignore
|
|
|
|
|
// the macros outside
|
|
|
|
|
if (!layout_)
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
// see InsetCollapsable::latex(...) below. In these case
|
|
|
|
|
// an environment is opened there
|
|
|
|
|
if (!layout_->latexname.empty())
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-08-20 19:02:38 +00:00
|
|
|
|
int InsetCollapsable::latex(Buffer const & buf, odocstream & os,
|
|
|
|
|
OutputParams const & runparams) const
|
|
|
|
|
{
|
2007-11-03 09:03:08 +00:00
|
|
|
|
// FIXME: What should we do layout_ is 0?
|
|
|
|
|
// 1) assert
|
|
|
|
|
// 2) through an error
|
|
|
|
|
if (!layout_)
|
|
|
|
|
return 0;
|
|
|
|
|
|
2007-08-20 19:02:38 +00:00
|
|
|
|
// This implements the standard way of handling the LaTeX output of
|
|
|
|
|
// a collapsable inset, either a command or an environment. Standard
|
|
|
|
|
// collapsable insets should not redefine this, non-standard ones may
|
|
|
|
|
// call this.
|
2007-11-03 00:35:07 +00:00
|
|
|
|
if (!layout_->latexname.empty()) {
|
|
|
|
|
if (layout_->latextype == "command") {
|
2007-08-20 19:02:38 +00:00
|
|
|
|
// FIXME UNICODE
|
2007-11-01 06:25:47 +00:00
|
|
|
|
if (runparams.moving_arg)
|
|
|
|
|
os << "\\protect";
|
2007-11-03 00:35:07 +00:00
|
|
|
|
os << '\\' << from_utf8(layout_->latexname);
|
|
|
|
|
if (!layout_->latexparam.empty())
|
|
|
|
|
os << from_utf8(layout_->latexparam);
|
2007-08-20 19:02:38 +00:00
|
|
|
|
os << '{';
|
2007-11-03 00:35:07 +00:00
|
|
|
|
} else if (layout_->latextype == "environment") {
|
|
|
|
|
os << "%\n\\begin{" << from_utf8(layout_->latexname) << "}\n";
|
|
|
|
|
if (!layout_->latexparam.empty())
|
|
|
|
|
os << from_utf8(layout_->latexparam);
|
2007-08-20 19:02:38 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2007-10-20 17:05:28 +00:00
|
|
|
|
OutputParams rp = runparams;
|
2007-11-03 00:35:07 +00:00
|
|
|
|
if (layout_->passthru)
|
2007-10-20 17:05:28 +00:00
|
|
|
|
rp.verbatim = true;
|
2007-11-03 00:35:07 +00:00
|
|
|
|
if (layout_->needprotect)
|
2007-11-01 06:25:47 +00:00
|
|
|
|
rp.moving_arg = true;
|
2007-10-20 17:05:28 +00:00
|
|
|
|
int i = InsetText::latex(buf, os, rp);
|
2007-11-03 00:35:07 +00:00
|
|
|
|
if (!layout_->latexname.empty()) {
|
|
|
|
|
if (layout_->latextype == "command") {
|
2007-08-20 19:02:38 +00:00
|
|
|
|
os << "}";
|
2007-11-03 00:35:07 +00:00
|
|
|
|
} else if (layout_->latextype == "environment") {
|
|
|
|
|
os << "\n\\end{" << from_utf8(layout_->latexname) << "}\n";
|
2007-08-20 19:02:38 +00:00
|
|
|
|
i += 4;
|
|
|
|
|
}
|
2007-09-16 10:36:57 +00:00
|
|
|
|
}
|
2007-08-20 19:02:38 +00:00
|
|
|
|
return i;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-08-22 18:55:03 +00:00
|
|
|
|
void InsetCollapsable::validate(LaTeXFeatures & features) const
|
|
|
|
|
{
|
2007-11-03 09:03:08 +00:00
|
|
|
|
if (!layout_)
|
|
|
|
|
return;
|
|
|
|
|
|
2007-08-22 18:55:03 +00:00
|
|
|
|
// Force inclusion of preamble snippet in layout file
|
2007-11-03 00:35:07 +00:00
|
|
|
|
features.require(layout_->name);
|
2007-08-22 18:55:03 +00:00
|
|
|
|
InsetText::validate(features);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2008-02-21 16:31:59 +00:00
|
|
|
|
bool InsetCollapsable::undefined() const
|
|
|
|
|
{
|
|
|
|
|
std::string const & n = getLayout().name;
|
|
|
|
|
return n.empty() || n == TextClass::emptyInsetLayout().name;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2006-10-21 00:16:43 +00:00
|
|
|
|
} // namespace lyx
|