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"
21 #include "support/LOstream.h"
25 InsetCollapsable::InsetCollapsable(Buffer * bf)
32 framecolor = LColor::footnoteframe;
34 button_length = button_top_y = button_bottom_y = 0;
35 setInsetName("Collapsable");
39 Inset * InsetCollapsable::Clone() const
41 InsetCollapsable * result = new InsetCollapsable(buffer);
42 result->init(buffer, this);
44 result->collapsed = collapsed;
48 void InsetCollapsable::Write(ostream & os) const
50 os << getInsetName() << "\n\ncollapsed ";
55 WriteParagraphData(os);
59 void InsetCollapsable::Read(LyXLex & lex)
63 string token = lex.GetString();
64 if (token == "collapsed") {
66 collapsed = lex.GetBool();
73 int InsetCollapsable::ascent_collapsed(Painter & pain, LyXFont const &) const
75 int width = 0, ascent = 0, descent = 0;
76 pain.buttonText(0, 0, label.c_str(), labelfont, false,
77 width, ascent, descent);
82 int InsetCollapsable::descent_collapsed(Painter & pain, LyXFont const &) const
84 int width = 0, ascent = 0, descent = 0;
85 pain.buttonText(0, 0, label.c_str(), labelfont, false,
86 width, ascent, descent);
91 int InsetCollapsable::width_collapsed(Painter & pain, LyXFont const &) const
93 int width, ascent, descent;
94 pain.buttonText(TEXT_TO_INSET_OFFSET, 0, label.c_str(), labelfont, false,
95 width, ascent, descent);
96 return width + (2*TEXT_TO_INSET_OFFSET);
100 int InsetCollapsable::ascent(Painter & pain, LyXFont const & font) const
103 return ascent_collapsed(pain, font);
105 return InsetText::ascent(pain, font) + TEXT_TO_TOP_OFFSET;
109 int InsetCollapsable::descent(Painter & pain, LyXFont const & font) const
112 return descent_collapsed(pain, font);
114 return InsetText::descent(pain, font) + TEXT_TO_BOTTOM_OFFSET;
118 int InsetCollapsable::width(Painter & pain, LyXFont const & font) const
121 return width_collapsed(pain, font);
123 return getMaxWidth(pain, this) - widthOffset + 2;
127 void InsetCollapsable::draw_collapsed(Painter & pain, LyXFont const &,
128 int baseline, float & x) const
131 pain.buttonText(int(x) + TEXT_TO_INSET_OFFSET, baseline,
132 label.c_str(), labelfont, true, width);
133 x += width + (2 * TEXT_TO_INSET_OFFSET);
137 void InsetCollapsable::draw(Painter & pain, LyXFont const & f,
138 int baseline, float & x) const
140 button_length = width_collapsed(pain, labelfont) + 2;
141 button_top_y = -ascent_collapsed(pain, f);
142 button_bottom_y = descent_collapsed(pain, f);
144 draw_collapsed(pain, f, baseline, x);
150 draw_collapsed(pain, f, baseline, x);
153 int w = getMaxTextWidth(pain, this);
154 int h = ascent(pain,f) + descent(pain, f);
156 pain.rectangle(int(x), baseline - ascent(pain, f), w, h, framecolor);
159 drawTextXOffset = int(x) - top_x;
160 InsetText::draw(pain, f, baseline, x);
164 void InsetCollapsable::Edit(BufferView * bv, int x, int y, unsigned int button)
166 if (collapsed && autocollapse) {
168 UpdateLocal(bv, true);
169 InsetText::Edit(bv, 0, 0, button);
170 } else if (!collapsed) {
171 InsetText::Edit(bv, x, y, button);
176 Inset::EDITABLE InsetCollapsable::Editable() const
180 return HIGHLY_EDITABLE;
184 void InsetCollapsable::InsetUnlock(BufferView * bv)
189 InsetText::InsetUnlock(bv);
190 UpdateLocal(bv, false);
194 void InsetCollapsable::UpdateLocal(BufferView * bv, bool flag)
196 InsetText::UpdateLocal(bv, flag);
200 void InsetCollapsable::InsetButtonPress(BufferView * bv,int x,int y,int button)
202 if (!collapsed && (x >= button_length)) {
203 InsetText::InsetButtonPress(bv, x, y, button);
208 void InsetCollapsable::InsetButtonRelease(BufferView * bv,
209 int x, int y, int button)
211 if ((x >= 0) && (x < button_length) &&
212 (y >= button_top_y) && (y < button_bottom_y)) {
215 InsetText::InsetButtonRelease(bv, 0, 0, button);
216 UpdateLocal(bv, true);
219 UpdateLocal(bv, false);
220 bv->unlockInset(this);
222 } else if (!collapsed && (x >= button_length) && (y >= button_top_y)) {
223 InsetText::InsetButtonRelease(bv, x, y, button);
228 void InsetCollapsable::InsetMotionNotify(BufferView * bv,
229 int x, int y, int state)
231 if (x >= button_length) {
232 InsetText::InsetMotionNotify(bv, x, y, state);
237 int InsetCollapsable::getMaxWidth(Painter & pain,
238 UpdatableInset const * inset) const
240 if ((this == inset) && !owner())
241 return pain.paperWidth();
243 return static_cast<UpdatableInset*>(owner())->getMaxWidth(pain,inset);
245 return static_cast<UpdatableInset*>(owner())->getMaxWidth(pain,inset)-
246 width_collapsed(pain, labelfont) - 2 - widthOffset;
248 return pain.paperWidth()-width_collapsed(pain, labelfont)-2-widthOffset;
252 int InsetCollapsable::getMaxTextWidth(Painter & pain,
253 UpdatableInset const * inset, int) const
255 return getMaxWidth(pain, inset) -
256 width_collapsed(pain, labelfont) - widthOffset - 2;