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 "frontends/LyXView.h"
15 #include "BufferView.h"
16 #include "paragraph.h"
23 #include "ParagraphParameters.h"
27 #include "frontends/Alert.h"
29 #include "support/lstrings.h"
31 #include "BoostFormat.h"
33 void emph(BufferView * bv)
35 LyXFont font(LyXFont::ALL_IGNORE);
36 font.setEmph(LyXFont::TOGGLE);
37 toggleAndShow(bv, font);
41 void bold(BufferView * bv)
43 LyXFont font(LyXFont::ALL_IGNORE);
44 font.setSeries(LyXFont::BOLD_SERIES);
45 toggleAndShow(bv, font);
49 void noun(BufferView * bv)
51 LyXFont font(LyXFont::ALL_IGNORE);
52 font.setNoun(LyXFont::TOGGLE);
53 toggleAndShow(bv, font);
57 void number(BufferView * bv)
59 LyXFont font(LyXFont::ALL_IGNORE);
60 font.setNumber(LyXFont::TOGGLE);
61 toggleAndShow(bv, font);
64 void lang(BufferView * bv, string const & l)
66 LyXFont font(LyXFont::ALL_IGNORE);
67 Language const * lang = languages.getLanguage(l);
69 font.setLanguage(lang);
70 toggleAndShow(bv, font);
72 Alert::alert(_("Error! unknown language"),l);
76 // Change environment depth.
77 // if decInc >= 0, increment depth
78 // if decInc < 0, decrement depth
79 void changeDepth(BufferView * bv, LyXText * text, int decInc)
81 if (!bv->available() || !text)
85 bv->update(bv->text, BufferView::SELECT|BufferView::FITCUR);
90 if (text->inset_owner)
91 bv->updateInset((Inset *)text->inset_owner, true);
92 bv->update(bv->text, BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
96 void code(BufferView * bv)
98 LyXFont font(LyXFont::ALL_IGNORE);
99 font.setFamily(LyXFont::TYPEWRITER_FAMILY); // no good
100 toggleAndShow(bv, font);
104 void sans(BufferView * bv)
106 LyXFont font(LyXFont::ALL_IGNORE);
107 font.setFamily(LyXFont::SANS_FAMILY);
108 toggleAndShow(bv, font);
112 void roman(BufferView * bv)
114 LyXFont font(LyXFont::ALL_IGNORE);
115 font.setFamily(LyXFont::ROMAN_FAMILY);
116 toggleAndShow(bv, font);
120 void styleReset(BufferView * bv)
122 LyXFont font(LyXFont::ALL_INHERIT, ignore_language);
123 toggleAndShow(bv, font);
127 void underline(BufferView * bv)
129 LyXFont font(LyXFont::ALL_IGNORE);
130 font.setUnderbar(LyXFont::TOGGLE);
131 toggleAndShow(bv, font);
135 void fontSize(BufferView * bv, string const & size)
137 LyXFont font(LyXFont::ALL_IGNORE);
138 font.setLyXSize(size);
139 toggleAndShow(bv, font);
143 // Returns the current font and depth as a message.
144 string const currentState(BufferView * bv)
148 if (!bv->available())
151 LyXText * text = bv->getLyXText();
152 Buffer * buffer = bv->buffer();
153 LyXCursor const & c(text->cursor);
155 bool const show_change = buffer->params.tracking_changes
156 && c.pos() != c.par()->size()
157 && c.par()->lookupChange(c.pos()) != Change::UNCHANGED;
160 Change change(c.par()->lookupChangeFull(c.pos()));
161 Author const & a(bv->buffer()->authors().get(change.author));
162 state << _("Change: ") << a.name();
163 if (!a.email().empty()) {
164 state << " (" << a.email() << ")";
166 if (change.changetime)
167 state << _(" at ") << ctime(&change.changetime);
171 // I think we should only show changes from the default
173 LyXFont font = text->real_current_font;
174 LyXFont const & defaultfont =
175 buffer->params.getLyXTextClass().defaultfont();
176 font.reduce(defaultfont);
179 state << boost::format(_("Font: %1$s")) % font.stateText(&buffer->params);
181 state << _("Font: ") << font.stateText(&buffer->params);
184 // The paragraph depth
185 int depth = text->getDepth();
188 state << boost::format(_(", Depth: %1$d")) % depth;
190 state << _(", Depth: ") << depth;
195 // The paragraph spacing, but only if different from
197 if (!text->cursor.par()->params().spacing().isDefault()) {
198 Spacing::Space cur_space =
199 text->cursor.par()->params().spacing().getSpace();
200 state << _(", Spacing: ");
203 case Spacing::Single:
204 state << _("Single");
206 case Spacing::Onehalf:
207 state << _("OneHalf");
209 case Spacing::Double:
210 state << _("Double");
213 state << _("Other (")
214 << text->cursor.par()->params().spacing().getValue()
217 case Spacing::Default:
218 // should never happen, do nothing
223 state << _(", Paragraph: ") << text->cursor.par()->id();
225 return STRCONV(state.str());
229 /* Does the actual toggle job of the calls above.
230 * Also shows the current font state.
232 void toggleAndShow(BufferView * bv, LyXFont const & font, bool toggleall)
234 if (!bv->available())
237 if (bv->theLockingInset()) {
238 bv->theLockingInset()->setFont(bv, font, toggleall);
242 LyXText * text = bv->getLyXText();
243 // FIXME: can this happen ??
248 bv->update(text, BufferView::SELECT | BufferView::FITCUR);
249 text->toggleFree(bv, font, toggleall);
250 bv->update(text, BufferView::SELECT | BufferView::FITCUR | BufferView::CHANGE);
252 if (font.language() != ignore_language ||
253 font.number() != LyXFont::IGNORE) {
254 LyXCursor & cursor = text->cursor;
255 text->computeBidiTables(bv->buffer(), cursor.row());
256 if (cursor.boundary() !=
257 text->isBoundary(bv->buffer(), cursor.par(), cursor.pos(),
258 text->real_current_font))
259 text->setCursor(bv, cursor.par(), cursor.pos(),
260 false, !cursor.boundary());