lyx_mirror/src/insets/InsetCollapsable.h
Vincent van Ravesteijn aedfb81808 Fix bug 4346: http://bugzilla.lyx.org/show_bug.cgi?id=4346.
Synchronizing insets asserts with two views open

It changes the autoOpen_ member of InsetCollapsable into a map, such that an autoOpen value can be specified for each bufferView. Now, the assertion is avoided and insetCollapsable can be open in one bufferview and be closed in the other in very special cases that the cursor end up in a closed inset.

Compare with the MathMacro::editing_ member. 

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@28573 a592a061-630c-0410-9148-cb99ea01b6c8
2009-02-21 16:27:00 +00:00

204 lines
6.2 KiB
C++

// -*- C++ -*-
/**
* \file InsetCollapsable.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Alejandro Aguilar Sierra
* \author Jürgen Vigna
* \author Lars Gullik Bjønnes
*
* Full author contact details are available in file CREDITS.
*/
#ifndef INSETCOLLAPSABLE_H
#define INSETCOLLAPSABLE_H
#include "Inset.h"
#include "InsetText.h"
#include "Box.h"
#include "TextClass.h"
namespace lyx {
class CursorSlice;
class InsetLayout;
namespace frontend { class Painter; }
/** A collapsable text inset
*/
class InsetCollapsable : public InsetText {
public:
/// By default, InsetCollapsable uses the plain layout. If you
/// want to override this in a subclass, you'll need to call
/// Paragraph::setDefaultLayout() in its constructor. See
/// InsetBranch for an example.
InsetCollapsable(Buffer const &);
///
InsetCollapsable(InsetCollapsable const & rhs);
///
InsetCollapsable * asInsetCollapsable() { return this; }
///
InsetCollapsable const * asInsetCollapsable() const { return this; }
///
docstring toolTip(BufferView const & bv, int x, int y) const;
///
docstring name() const { return from_ascii("Collapsable"); }
///
InsetLayout const & getLayout(BufferParams const &) const { return *layout_; }
///
InsetLayout const & getLayout() const { return *layout_; }
///
void setLayout(BufferParams const &);
/// (Re-)set the character style parameters from \p tc according
/// to name()
void setLayout(DocumentClass const * const tc);
///
virtual bool usePlainLayout() { return true; }
///
void read(Lexer &);
///
void write(std::ostream &) const;
///
void metrics(MetricsInfo &, Dimension &) const;
///
void draw(PainterInfo & pi, int x, int y) const;
/// return x,y of given position relative to the inset's baseline
void cursorPos(BufferView const & bv, CursorSlice const & sl,
///
bool boundary, int & x, int & y) const;
/// Returns true if (mouse) action is over the inset's button.
/// Always returns false when the inset does not have a
/// button.
bool hitButton(FuncRequest const &) const;
///
docstring const getNewLabel(docstring const & l) const;
///
EDITABLE editable(BufferView const & bv) const;
/// can we go further down on mouse click?
bool descendable(BufferView const & bv) const;
///
void setLabel(docstring const & l);
///
virtual void setButtonLabel() {}
///
bool isOpen(BufferView const & bv) const
{ return geometry(bv) != ButtonOnly; }
///
CollapseStatus status(BufferView const & bv) const;
/** Of the old CollapseStatus we only keep the values
* Open and Collapsed.
* We define a list of possible inset decoration
* styles, and a list of possible (concrete, visual)
* inset geometries. Relationships between them
* (geometries in body of table):
*
* \ CollapseStatus:
* Decoration: \ Open Collapsed
* -------------+-------------------------------
* Classic | *) TopButton, <--x) ButtonOnly
* | LeftButton
* Minimalistic | NoButton ButtonOnly
* Conglomerate | SubLabel Corners
* ---------------------------------------------
* *) toggled by openinlined_
* x) toggled by autoOpen_
*/
/// Default looks
virtual InsetLayout::InsetDecoration decoration() const;
///
enum Geometry {
TopButton,
ButtonOnly,
NoButton,
LeftButton,
SubLabel,
Corners
};
/// Returns the geometry based on CollapseStatus
/// (status_), autoOpen_ and openinlined_, and of
/// course decoration().
Geometry geometry(BufferView const & bv) const;
/// Allow spellchecking, except for insets with latex_language
bool allowSpellCheck() const { return !forceLTR(); }
///
bool allowMultiPar() const;
///
bool getStatus(Cursor &, FuncRequest const &, FuncStatus &) const;
///
void setStatus(Cursor & cur, CollapseStatus st);
///
bool setMouseHover(bool mouse_hover);
///
ColorCode backgroundColor() const { return layout_->bgcolor(); }
///
int latex(odocstream &, OutputParams const &) const;
///
int docbook(odocstream &, OutputParams const &) const;
///
void validate(LaTeXFeatures &) const;
///
InsetCode lyxCode() const { return COLLAPSABLE_CODE; }
/// Allow multiple blanks
virtual bool isFreeSpacing() const { return layout_->isFreeSpacing(); }
/// Don't eliminate empty paragraphs
virtual bool allowEmpty() const { return layout_->isKeepEmpty(); }
/// Force inset into LTR environment if surroundings are RTL?
virtual bool forceLTR() const { return layout_->isForceLtr(); }
///
virtual bool usePlainLayout() const { return true; }
/// Is this inset's layout defined in the document's textclass?
/// May be wrong after textclass change or paste from another document
bool undefined() const;
/// the string that is passed to the TOC
void tocString(odocstream &) const;
///
virtual docstring contextMenu(BufferView const & bv, int x, int y) const;
protected:
///
void doDispatch(Cursor & cur, FuncRequest & cmd);
///
void edit(Cursor & cur, bool front,
EntryDirection entry_from = ENTRY_DIRECTION_IGNORE);
///
Inset * editXY(Cursor & cur, int x, int y);
///
docstring floatName(std::string const & type, BufferParams const &) const;
///
virtual void resetParagraphsFont();
///
mutable CollapseStatus status_;
private:
/// cache for the layout_. Make sure it is in sync with the document class!
InsetLayout const * layout_;
///
Dimension dimensionCollapsed() const;
///
/// should paragraphs be forced to use the empty layout?
virtual bool forcePlainLayout(idx_type = 0) const
{ return getLayout().forcePlainLayout(); }
/// should the user be allowed to customize alignment, etc.?
virtual bool allowParagraphCustomization(idx_type = 0) const
{ return getLayout().allowParagraphCustomization(); }
docstring labelstring_;
///
mutable Box button_dim;
/// a substatus of the Open status, determined automatically in metrics
mutable bool openinlined_;
/// the inset will automatically open when the cursor is inside. This is
/// dependent on the bufferview, compare with MathMacro::editing_.
mutable std::map<BufferView const *, bool> auto_open_;
/// changes color when mouse enters/leaves this inset
bool mouse_hover_;
};
} // namespace lyx
#endif