1 /* This file is part of
2 * ======================================================
4 * LyX, The Document Processor
6 * Copyright 1995 Matthias Ettrich
7 * Copyright 1995-2001 The LyX Team.
9 * ====================================================== */
13 #include "bufferview_funcs.h"
14 #include "BufferView.h"
15 #include "paragraph.h"
22 #include "ParagraphParameters.h"
26 #include "frontends/LyXView.h"
27 #include "frontends/Alert.h"
29 #include "support/lstrings.h"
31 #include "insets/updatableinset.h"
33 #include "BoostFormat.h"
35 void emph(BufferView * bv)
37 LyXFont font(LyXFont::ALL_IGNORE);
38 font.setEmph(LyXFont::TOGGLE);
39 toggleAndShow(bv, font);
43 void bold(BufferView * bv)
45 LyXFont font(LyXFont::ALL_IGNORE);
46 font.setSeries(LyXFont::BOLD_SERIES);
47 toggleAndShow(bv, font);
51 void noun(BufferView * bv)
53 LyXFont font(LyXFont::ALL_IGNORE);
54 font.setNoun(LyXFont::TOGGLE);
55 toggleAndShow(bv, font);
59 void number(BufferView * bv)
61 LyXFont font(LyXFont::ALL_IGNORE);
62 font.setNumber(LyXFont::TOGGLE);
63 toggleAndShow(bv, font);
66 void lang(BufferView * bv, string const & l)
68 LyXFont font(LyXFont::ALL_IGNORE);
69 Language const * lang = languages.getLanguage(l);
71 font.setLanguage(lang);
72 toggleAndShow(bv, font);
74 Alert::alert(_("Error! unknown language"),l);
78 // Change environment depth.
79 // if decInc >= 0, increment depth
80 // if decInc < 0, decrement depth
81 void changeDepth(BufferView * bv, LyXText * text, int decInc)
83 if (!bv->available() || !text)
87 bv->update(bv->text, BufferView::SELECT|BufferView::FITCUR);
92 if (text->inset_owner)
93 bv->updateInset((Inset *)text->inset_owner, true);
94 bv->update(bv->text, BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
98 void code(BufferView * bv)
100 LyXFont font(LyXFont::ALL_IGNORE);
101 font.setFamily(LyXFont::TYPEWRITER_FAMILY); // no good
102 toggleAndShow(bv, font);
106 void sans(BufferView * bv)
108 LyXFont font(LyXFont::ALL_IGNORE);
109 font.setFamily(LyXFont::SANS_FAMILY);
110 toggleAndShow(bv, font);
114 void roman(BufferView * bv)
116 LyXFont font(LyXFont::ALL_IGNORE);
117 font.setFamily(LyXFont::ROMAN_FAMILY);
118 toggleAndShow(bv, font);
122 void styleReset(BufferView * bv)
124 LyXFont font(LyXFont::ALL_INHERIT, ignore_language);
125 toggleAndShow(bv, font);
129 void underline(BufferView * bv)
131 LyXFont font(LyXFont::ALL_IGNORE);
132 font.setUnderbar(LyXFont::TOGGLE);
133 toggleAndShow(bv, font);
137 void fontSize(BufferView * bv, string const & size)
139 LyXFont font(LyXFont::ALL_IGNORE);
140 font.setLyXSize(size);
141 toggleAndShow(bv, font);
145 // Returns the current font and depth as a message.
146 string const currentState(BufferView * bv)
148 if (!bv->available())
153 LyXText * text = bv->getLyXText();
154 Buffer * buffer = bv->buffer();
155 LyXCursor const & c(text->cursor);
157 bool const show_change = buffer->params.tracking_changes
158 && c.pos() != c.par()->size()
159 && c.par()->lookupChange(c.pos()) != Change::UNCHANGED;
162 Change change(c.par()->lookupChangeFull(c.pos()));
163 Author const & a(bv->buffer()->authors().get(change.author));
164 state << _("Change: ") << a.name();
165 if (!a.email().empty()) {
166 state << " (" << a.email() << ")";
168 if (change.changetime)
169 state << _(" at ") << ctime(&change.changetime);
173 // I think we should only show changes from the default
175 LyXFont font = text->real_current_font;
176 LyXFont const & defaultfont =
177 buffer->params.getLyXTextClass().defaultfont();
178 font.reduce(defaultfont);
181 state << boost::format(_("Font: %1$s")) % font.stateText(&buffer->params);
183 state << _("Font: ") << font.stateText(&buffer->params);
186 // The paragraph depth
187 int depth = text->getDepth();
190 state << boost::format(_(", Depth: %1$d")) % depth;
192 state << _(", Depth: ") << depth;
197 // The paragraph spacing, but only if different from
199 if (!text->cursor.par()->params().spacing().isDefault()) {
200 Spacing::Space cur_space =
201 text->cursor.par()->params().spacing().getSpace();
202 state << _(", Spacing: ");
205 case Spacing::Single:
206 state << _("Single");
208 case Spacing::Onehalf:
209 state << _("OneHalf");
211 case Spacing::Double:
212 state << _("Double");
215 state << _("Other (")
216 << text->cursor.par()->params().spacing().getValue()
219 case Spacing::Default:
220 // should never happen, do nothing
225 state << _(", Paragraph: ") << text->cursor.par()->id();
227 return STRCONV(state.str());
231 /* Does the actual toggle job of the calls above.
232 * Also shows the current font state.
234 void toggleAndShow(BufferView * bv, LyXFont const & font, bool toggleall)
236 if (!bv->available())
239 if (bv->theLockingInset()) {
240 bv->theLockingInset()->setFont(bv, font, toggleall);
244 LyXText * text = bv->getLyXText();
245 // FIXME: can this happen ??
250 bv->update(text, BufferView::SELECT | BufferView::FITCUR);
251 text->toggleFree(bv, font, toggleall);
252 bv->update(text, BufferView::SELECT | BufferView::FITCUR | BufferView::CHANGE);
254 if (font.language() != ignore_language ||
255 font.number() != LyXFont::IGNORE) {
256 LyXCursor & cursor = text->cursor;
257 text->computeBidiTables(bv->buffer(), cursor.row());
258 if (cursor.boundary() !=
259 text->isBoundary(bv->buffer(), cursor.par(), cursor.pos(),
260 text->real_current_font))
261 text->setCursor(bv, cursor.par(), cursor.pos(),
262 false, !cursor.boundary());