]> git.lyx.org Git - lyx.git/blob - src/MetricsInfo.cpp
Merge branch 'master' of git.lyx.org:lyx
[lyx.git] / src / MetricsInfo.cpp
1 /**
2  * \file MetricsInfo.cpp
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author André Pönitz
7  *
8  * Full author contact details are available in file CREDITS.
9  */
10
11 #include <config.h>
12
13 #include "BufferView.h"
14 #include "ColorSet.h"
15 #include "LyXRC.h"
16 #include "MetricsInfo.h"
17
18 #include "insets/Inset.h"
19
20 #include "mathed/MathSupport.h"
21
22 #include "frontends/Painter.h"
23
24 #include "support/docstring.h"
25 #include "support/lassert.h"
26 #include "support/RefChanger.h"
27
28 using namespace std;
29
30
31 namespace lyx {
32
33 /////////////////////////////////////////////////////////////////////////
34 //
35 // MetricsBase
36 //
37 /////////////////////////////////////////////////////////////////////////
38
39 MetricsBase::MetricsBase(BufferView * b, FontInfo f, int w)
40         : bv(b), font(move(f)), style(LM_ST_TEXT), fontname("mathnormal"),
41           textwidth(w), solid_line_thickness_(1), solid_line_offset_(1),
42           dotted_line_thickness_(1)
43 {
44         if (lyxrc.zoom >= 200) {
45                 // derive the line thickness from zoom factor
46                 // the zoom is given in percent
47                 // (increase thickness at 250%, 450% etc.)
48                 solid_line_thickness_ = (lyxrc.zoom + 50) / 200;
49                 // adjust line_offset_ too
50                 solid_line_offset_ = 1 + solid_line_thickness_ / 2;
51         }
52         if (lyxrc.zoom >= 100) {
53                 // derive the line thickness from zoom factor
54                 // the zoom is given in percent
55                 // (increase thickness at 150%, 250% etc.)
56                 dotted_line_thickness_ = (lyxrc.zoom + 50) / 100;
57         }
58 }
59
60
61 Changer MetricsBase::changeFontSet(string const & name, bool cond)
62 {
63         RefChanger<MetricsBase> rc = make_save(*this);
64         if (!cond)
65                 rc->keep();
66         else {
67                 ColorCode oldcolor = font.color();
68                 string const oldname = fontname;
69                 fontname = name;
70                 font = sane_font;
71                 augmentFont(font, name);
72                 font.setSize(rc->old.font.size());
73                 if (name != "lyxtex"
74                     && ((isTextFont(oldname) && oldcolor != Color_foreground)
75                         || (isMathFont(oldname) && oldcolor != Color_math)))
76                         font.setColor(oldcolor);
77         }
78         return move(rc);
79 }
80
81
82 /////////////////////////////////////////////////////////////////////////
83 //
84 // MetricsInfo
85 //
86 /////////////////////////////////////////////////////////////////////////
87
88 MetricsInfo::MetricsInfo(BufferView * bv, FontInfo font, int textwidth,
89                          MacroContext const & mc)
90         : base(bv, font, textwidth), macrocontext(mc)
91 {}
92
93
94 /////////////////////////////////////////////////////////////////////////
95 //
96 // PainterInfo
97 //
98 /////////////////////////////////////////////////////////////////////////
99
100 PainterInfo::PainterInfo(BufferView * bv, lyx::frontend::Painter & painter)
101         : pain(painter), ltr_pos(false), change_(), selected(false),
102         do_spellcheck(true), full_repaint(true), background_color(Color_background)
103 {
104         base.bv = bv;
105 }
106
107
108 void PainterInfo::draw(int x, int y, char_type c)
109 {
110         pain.text(x, y, c, base.font);
111 }
112
113
114 void PainterInfo::draw(int x, int y, docstring const & str)
115 {
116         pain.text(x, y, str, base.font);
117 }
118
119
120 ColorCode PainterInfo::backgroundColor(Inset const * inset, bool sel) const
121 {
122         ColorCode const color_bg = inset->backgroundColor(*this);
123
124         if (selected && sel)
125                 // This inset is in a selection
126                 return Color_selection;
127         else {
128                 if (color_bg != Color_none)
129                         // This inset has its own color
130                         return color_bg;
131                 else {
132                         if (background_color == Color_none)
133                                 // This inset has no own color and does not inherit a color
134                                 return Color_background;
135                         else
136                                 // This inset has no own color, but inherits a color
137                                 return background_color;
138                 }
139         }
140 }
141
142
143 Color PainterInfo::textColor(Color const & color) const
144 {
145         if (change_.changed()) 
146                 return change_.color();
147         if (selected)
148                 return Color_selectiontext;
149         return color;
150 }
151
152
153 Changer MetricsBase::changeScript(bool cond)
154 {
155         switch (style) {
156         case LM_ST_DISPLAY:
157         case LM_ST_TEXT:
158                 return changeStyle(LM_ST_SCRIPT, cond);
159         case LM_ST_SCRIPT:
160         case LM_ST_SCRIPTSCRIPT:
161                 return changeStyle(LM_ST_SCRIPTSCRIPT, cond);
162         }
163         //remove Warning
164         LASSERT(false, return Changer());
165 }
166
167
168 Changer MetricsBase::changeFrac(bool cond)
169 {
170         switch (style) {
171         case LM_ST_DISPLAY:
172                 return changeStyle(LM_ST_TEXT, cond);
173         case LM_ST_TEXT:
174                 return changeStyle(LM_ST_SCRIPT, cond);
175         case LM_ST_SCRIPT:
176         case LM_ST_SCRIPTSCRIPT:
177                 return changeStyle(LM_ST_SCRIPTSCRIPT, cond);
178         }
179         //remove Warning
180         return Changer();
181 }
182
183
184 Changer MetricsBase::changeStyle(Styles new_style, bool cond)
185 {
186         static const int diff[4][4] =
187                 { { 0, 0, -3, -5 },
188                   { 0, 0, -3, -5 },
189                   { 3, 3,  0, -2 },
190                   { 5, 5,  2,  0 } };
191         int t = diff[style][new_style];
192         RefChanger<MetricsBase> rc = make_save(*this);
193         if (!cond)
194                 rc->keep();
195         else {
196                 if (t > 0)
197                         while (t--)
198                                 font.incSize();
199                 else
200                         while (t++)
201                                 font.decSize();
202                 style = new_style;
203         }
204         return move(rc);
205 }
206
207
208 } // namespace lyx