1 /* This file is part of
2 * ======================================================
4 * LyX, The Document Processor
6 * Copyright (C) 1998 The LyX Team.
8 *======================================================*/
13 #pragma implementation
16 #include "insetcollapsable.h"
19 #include "BufferView.h"
23 InsetCollapsable::InsetCollapsable(Buffer * bf)
30 framecolor = LColor::footnoteframe;
32 button_length = button_top_y = button_bottom_y = 0;
33 setInsetName("Collapsable");
37 Inset * InsetCollapsable::Clone() const
39 InsetCollapsable * result = new InsetCollapsable(buffer);
40 result->init(buffer, this);
42 result->collapsed = collapsed;
46 void InsetCollapsable::Write(ostream & os) const
48 os << getInsetName() << "\n\ncollapsed ";
53 WriteParagraphData(os);
57 void InsetCollapsable::Read(LyXLex & lex)
61 string token = lex.GetString();
62 if (token == "collapsed") {
64 collapsed = lex.GetBool();
71 int InsetCollapsable::ascent_collapsed(Painter & pain, LyXFont const &) const
73 int width = 0, ascent = 0, descent = 0;
74 pain.buttonText(0, 0, label.c_str(), labelfont, false,
75 width, ascent, descent);
80 int InsetCollapsable::descent_collapsed(Painter & pain, LyXFont const &) const
82 int width = 0, ascent = 0, descent = 0;
83 pain.buttonText(0, 0, label.c_str(), labelfont, false,
84 width, ascent, descent);
89 int InsetCollapsable::width_collapsed(Painter & pain, LyXFont const &) const
91 int width, ascent, descent;
92 pain.buttonText(TEXT_TO_INSET_OFFSET, 0, label.c_str(), labelfont, false,
93 width, ascent, descent);
94 return width + (2*TEXT_TO_INSET_OFFSET);
98 int InsetCollapsable::ascent(Painter & pain, LyXFont const & font) const
101 return ascent_collapsed(pain, font);
103 return InsetText::ascent(pain, font) + TEXT_TO_TOP_OFFSET;
107 int InsetCollapsable::descent(Painter & pain, LyXFont const & font) const
110 return descent_collapsed(pain, font);
112 return InsetText::descent(pain, font) + TEXT_TO_BOTTOM_OFFSET;
116 int InsetCollapsable::width(Painter & pain, LyXFont const & font) const
119 return width_collapsed(pain, font);
121 return getMaxWidth(pain, this) - widthOffset + 2;
125 void InsetCollapsable::draw_collapsed(Painter & pain, LyXFont const &,
126 int baseline, float & x) const
129 pain.buttonText(int(x) + TEXT_TO_INSET_OFFSET, baseline,
130 label.c_str(), labelfont, true, width);
131 x += width + (2 * TEXT_TO_INSET_OFFSET);
135 void InsetCollapsable::draw(Painter & pain, LyXFont const & f,
136 int baseline, float & x) const
138 button_length = width_collapsed(pain, labelfont) + 2;
139 button_top_y = -ascent_collapsed(pain, f);
140 button_bottom_y = descent_collapsed(pain, f);
142 draw_collapsed(pain, f, baseline, x);
149 draw_collapsed(pain, f, baseline, x);
152 int w = getMaxTextWidth(pain,this);
153 int h = ascent(pain,f) + descent(pain,f);
155 pain.rectangle(int(x), baseline - ascent(pain, f), w, h, framecolor);
158 drawTextXOffset = int(x) - top_x;
159 InsetText::draw(pain, f, baseline, x);
163 void InsetCollapsable::Edit(BufferView *bv, int x, int y, unsigned int button)
165 if (collapsed && autocollapse) {
167 UpdateLocal(bv, true);
168 InsetText::Edit(bv, 0, 0, button);
169 } else if (!collapsed) {
170 InsetText::Edit(bv, x, y, button);
175 Inset::EDITABLE InsetCollapsable::Editable() const
179 return HIGHLY_EDITABLE;
182 void InsetCollapsable::InsetUnlock(BufferView *bv)
187 InsetText::InsetUnlock(bv);
188 UpdateLocal(bv, false);
192 void InsetCollapsable::UpdateLocal(BufferView * bv, bool flag)
194 InsetText::UpdateLocal(bv, flag);
198 void InsetCollapsable::InsetButtonPress(BufferView *bv,int x,int y,int button)
200 if (!collapsed && (x >= button_length)) {
201 InsetText::InsetButtonPress(bv, x, y, button);
206 void InsetCollapsable::InsetButtonRelease(BufferView *bv, int x, int y, int button)
208 if ((x >= 0) && (x < button_length) &&
209 (y >= button_top_y) && (y < button_bottom_y)) {
212 InsetText::InsetButtonRelease(bv, 0, 0, button);
213 UpdateLocal(bv, true);
216 UpdateLocal(bv, false);
217 bv->unlockInset(this);
219 } else if (!collapsed && (x >= button_length) && (y >= button_top_y)) {
220 InsetText::InsetButtonRelease(bv, x, y, button);
224 void InsetCollapsable::InsetMotionNotify(BufferView *bv, int x, int y, int state)
226 if (x >= button_length) {
227 InsetText::InsetMotionNotify(bv, x, y, state);
231 int InsetCollapsable::getMaxWidth(Painter & pain, UpdatableInset const * inset) const
233 if ((this == inset) && !owner())
234 return pain.paperWidth();
236 return (static_cast<UpdatableInset*>(owner())->getMaxWidth(pain,inset));
238 return (static_cast<UpdatableInset*>(owner())->getMaxWidth(pain,inset)-
239 width_collapsed(pain, labelfont) - 2 - widthOffset);
241 return pain.paperWidth()-width_collapsed(pain, labelfont)-2-widthOffset;
244 int InsetCollapsable::getMaxTextWidth(Painter & pain,
245 UpdatableInset const * inset, int) const
247 return getMaxWidth(pain, inset) -
248 width_collapsed(pain, labelfont) - widthOffset - 2;