]> git.lyx.org Git - lyx.git/blob - src/Spacing.cpp
Fix bug 4463. The crash was due to a call to X from inside a child process.
[lyx.git] / src / Spacing.cpp
1 /**
2  * \file Spacing.cpp
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Lars Gullik Bjønnes
7  * \author Jean-Marc Lasgouttes
8  *
9  * Full author contact details are available in file CREDITS.
10  */
11
12 #include <config.h>
13
14 #include "Spacing.h"
15 #include "support/lstrings.h"
16 #include "support/convert.h"
17
18 #include <sstream>
19 #include <string>
20
21 using namespace std;
22
23 namespace lyx {
24
25
26 string const Spacing::spacing_string[]
27         = {"single", "onehalf", "double", "other"};
28
29
30 string const Spacing::getValueAsString() const
31 {
32         switch (space) {
33         case Default: // nothing special should happen with this...
34         case Single: return "1.0";
35         case Onehalf: return "1.25";
36         case Double: return "1.667";
37         case Other: return value;
38         }
39         return "1.0";
40 }
41
42
43 double Spacing::getValue() const
44 {
45         return convert<double>(getValueAsString());
46 }
47
48
49 void Spacing::set(Spacing::Space sp, double val)
50 {
51         set(sp, convert<string>(val));
52 }
53
54
55 void Spacing::set(Spacing::Space sp, string const & val)
56 {
57         space = sp;
58         if (sp == Other) {
59                 switch (int(convert<double>(val) * 1000 + 0.5)) {
60                 case 1000:
61                         space = Single;
62                         break;
63                 case 1250:
64                         space = Onehalf;
65                         break;
66                 case 1667:
67                         space = Double;
68                         break;
69                 default:
70                         value = val;
71                         break;
72                 }
73         }
74 }
75
76
77 void Spacing::writeFile(ostream & os, bool para) const
78 {
79         if (space == Default) return;
80
81         string cmd = para ? "\\paragraph_spacing " : "\\spacing ";
82
83         if (getSpace() == Spacing::Other) {
84                 os << cmd << spacing_string[getSpace()]
85                    << ' ' << getValueAsString() << "\n";
86         } else {
87                 os << cmd << spacing_string[getSpace()] << "\n";
88         }
89 }
90
91
92 string const Spacing::writeEnvirBegin(bool useSetSpace) const
93 {
94         switch (space) {
95         case Default: break; // do nothing
96         case Single:
97                 return (useSetSpace ? "\\begin{SingleSpace}"
98                         : "\\begin{singlespace}");
99         case Onehalf:
100                 return (useSetSpace ? "\\begin{OnehalfSpace}"
101                         : "\\begin{onehalfspace}");
102         case Double:
103                 return (useSetSpace ? "\\begin{DoubleSpace}" 
104                         : "\\begin{doublespace}");
105         case Other:
106         {
107                 ostringstream ost;
108                 ost << (useSetSpace ? "\\begin{Spacing}{"
109                         : "\\begin{spacing}{" )
110                     << getValueAsString() << '}';
111                 return ost.str();
112         }
113         }
114         return string();
115 }
116
117
118 string const Spacing::writeEnvirEnd(bool useSetSpace) const
119 {
120         switch (space) {
121         case Default: break; // do nothing
122         case Single:
123                 return (useSetSpace ? "\\end{SingleSpace}"
124                         : "\\end{singlespace}");
125         case Onehalf:
126                 return (useSetSpace ? "\\end{OnehalfSpace}"
127                         : "\\end{onehalfspace}");
128         case Double:
129                 return (useSetSpace ? "\\end{DoubleSpace}" 
130                         : "\\end{doublespace}");
131         case Other:
132                 return (useSetSpace ? "\\end{Spacing}" : "\\end{spacing}") ;
133         }
134         return string();
135 }
136
137
138 } // namespace lyx