]> git.lyx.org Git - lyx.git/blob - src/insets/insetcharstyle.C
Move ids in environments to the possible wider scope.
[lyx.git] / src / insets / insetcharstyle.C
1 /**
2  * \file insetcharstyle.C
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Angus Leeming
7  * \author Martin Vermeer
8  * \author Jürgen Spitzmüller
9  *
10  * Full author contact details are available in file CREDITS.
11  */
12
13 #include <config.h>
14
15 #include "insetcharstyle.h"
16
17 #include "BufferView.h"
18 #include "dispatchresult.h"
19 #include "funcrequest.h"
20 #include "gettext.h"
21 #include "LaTeXFeatures.h"
22 #include "LColor.h"
23 #include "lyxlex.h"
24 #include "lyxtext.h"
25 #include "metricsinfo.h"
26 #include "paragraph.h"
27 #include "sgml.h"
28
29 #include "frontends/font_metrics.h"
30 #include "frontends/Painter.h"
31
32 #include <sstream>
33
34
35 using std::string;
36 using std::auto_ptr;
37 using std::istringstream;
38 using std::ostream;
39 using std::ostringstream;
40
41
42 void InsetCharStyle::init()
43 {
44         setInsetName("CharStyle");
45         setStatus(Inlined);
46 }
47
48
49 InsetCharStyle::InsetCharStyle(BufferParams const & bp,
50                                 CharStyles::iterator cs)
51         : InsetCollapsable(bp), has_label_(true)
52 {
53         params_.type = cs->name;
54         params_.latextype = cs->latextype;
55         params_.latexname = cs->latexname;
56         params_.latexparam = cs->latexparam;
57         params_.font = cs->font;
58         params_.labelfont = cs->labelfont;
59         init();
60 }
61
62
63 InsetCharStyle::InsetCharStyle(InsetCharStyle const & in)
64         : InsetCollapsable(in), params_(in.params_), has_label_(true)
65 {
66         init();
67 }
68
69
70 auto_ptr<InsetBase> InsetCharStyle::clone() const
71 {
72         return auto_ptr<InsetBase>(new InsetCharStyle(*this));
73 }
74
75
76 string const InsetCharStyle::editMessage() const
77 {
78         return _("Opened CharStyle Inset");
79 }
80
81
82 void InsetCharStyle::write(Buffer const & buf, ostream & os) const
83 {
84         params_.write(os);
85         InsetCollapsable::write(buf, os);
86 }
87
88
89 void InsetCharStyle::read(Buffer const & buf, LyXLex & lex)
90 {
91         InsetCollapsable::read(buf, lex);
92         setStatus(Inlined);
93 }
94
95
96 void InsetCharStyle::metrics(MetricsInfo & mi, Dimension & dim) const
97 {
98         LyXFont tmpfont = mi.base.font;
99         getDrawFont(mi.base.font);
100         InsetCollapsable::metrics(mi, dim);
101         mi.base.font = tmpfont;
102         dim_ = dim;
103         if (has_label_)
104                 dim_.des += ascent();
105 }
106
107
108 void InsetCharStyle::draw(PainterInfo & pi, int x, int y) const
109 {
110         setPosCache(pi, x, y);
111
112         // FIXME: setStatus(Inlined); this is not a const operation
113         LyXFont tmpfont = pi.base.font;
114         //setDrawFrame(InsetText::NEVER);
115         getDrawFont(pi.base.font);
116         InsetText::draw(pi, x, y);
117         pi.base.font = tmpfont;
118
119         pi.pain.line(x + 2, y + InsetText::descent() - 4, x + 2,
120                 y + InsetText::descent(), params_.labelfont.color());
121         pi.pain.line(x + 2, y + InsetText::descent(), x + dim_.wid - 2,
122                 y + InsetText::descent(), params_.labelfont.color());
123         pi.pain.line(x + dim_.wid - 2, y + InsetText::descent(), x + dim_.wid - 2,
124                 y + InsetText::descent() - 4, params_.labelfont.color());
125
126         if (has_label_) {
127                 LyXFont font(params_.labelfont);
128                 font.realize(LyXFont(LyXFont::ALL_SANE));
129                 font.decSize();
130                 font.decSize();
131                 int w = 0;
132                 int a = 0;
133                 int d = 0;
134                 font_metrics::rectText(params_.type, font, w, a, d);
135                 pi.pain.rectText(x + (dim_.wid - w) / 2,
136                         y + InsetText::descent() + a,
137                         params_.type, font, LColor::none, LColor::none);
138         }
139 }
140
141
142 void InsetCharStyle::getDrawFont(LyXFont & font) const
143 {
144         font = params_.font;
145 }
146
147
148 void InsetCharStyle::priv_dispatch(LCursor & cur, FuncRequest & cmd)
149 {
150         setStatus(Inlined);
151         switch (cmd.action) {
152                 case LFUN_MOUSE_PRESS:
153                         if (cmd.button() == mouse_button::button3)
154                                 has_label_ = !has_label_;
155                         else
156                                 InsetText::dispatch(cur, cmd);
157                         break;
158
159                 default:
160                         InsetCollapsable::priv_dispatch(cur, cmd);
161                         break;
162         }
163 }
164
165
166 namespace {
167
168 int outputVerbatim(std::ostream & os, InsetText const & inset)
169 {
170         int lines = 0;
171         ParagraphList::const_iterator par = inset.paragraphs().begin();
172         ParagraphList::const_iterator end = inset.paragraphs().end();
173         while (par != end) {
174                 lyx::pos_type siz = par->size();
175                 for (lyx::pos_type i = 0; i < siz; ++i) {
176                         if (par->isNewline(i)) {
177                                 os << '\n';
178                                 ++lines;
179                         } else {
180                                 os << par->getChar(i);
181                         }
182                 }
183                 ++par;
184                 if (par != end) {
185                         os << "\n";
186                         lines ++;
187                 }
188         }
189         return lines;
190 }
191
192 } // namespace anon
193
194
195 int InsetCharStyle::latex(Buffer const &, ostream & os,
196                      OutputParams const &) const
197 {
198         os << "%\n\\" << params_.latexname;
199         if (!params_.latexparam.empty())
200                 os << params_.latexparam;
201         os << "{";
202         int i = outputVerbatim(os, *this);
203         os << "}%\n";
204                 i += 2;
205         return i;
206 }
207
208
209 int InsetCharStyle::linuxdoc(Buffer const &, std::ostream & os,
210                              OutputParams const &) const
211 {
212         ostringstream oss;
213         int i = outputVerbatim(oss, *this);
214         sgml::openTag(os, params_.latexname, params_.latexparam);
215         os << sgml::escapeString(oss.str());
216         sgml::closeTag(os, params_.latexname);
217         return i;
218 }
219
220
221 int InsetCharStyle::docbook(Buffer const &, std::ostream & os,
222                             OutputParams const &) const
223 {
224         ostringstream oss;
225         int i = outputVerbatim(oss, *this);
226         sgml::openTag(os, params_.latexname, params_.latexparam);
227         os << sgml::escapeString(oss.str());
228         sgml::closeTag(os, params_.latexname);
229         return i;
230 }
231
232
233 int InsetCharStyle::plaintext(Buffer const &, std::ostream & os,
234                               OutputParams const & /*runparams*/) const
235 {
236         return outputVerbatim(os, *this);
237 }
238
239
240 void InsetCharStyle::validate(LaTeXFeatures & features) const
241 {
242         features.require(params_.type);
243 }
244
245
246 void InsetCharStyleParams::write(ostream & os) const
247 {
248         os << "CharStyle " << type << "\n";
249 }
250
251
252 void InsetCharStyleParams::read(LyXLex & lex)
253 {
254         if (lex.isOK()) {
255                 lex.next();
256                 string token = lex.getString();
257         }
258
259         if (lex.isOK()) {
260                 lex.next();
261                 type = lex.getString();
262         }
263 }