]> git.lyx.org Git - lyx.git/blob - src/Spacing.C
8846a742ea016f28fc4f3591b1af9ae95e0b92ed
[lyx.git] / src / Spacing.C
1 /**
2  * \file Spacing.C
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 lyx::support::strToDbl;
22
23 //using std::ios;
24 using std::ostream;
25 using std::ostringstream;
26 using std::string;
27
28
29 string const Spacing::spacing_string[]
30         = {"single", "onehalf", "double", "other"};
31
32
33 string const Spacing::getValueAsString() const
34 {
35         switch (space) {
36         case Default: // nothing special should happen with this...
37         case Single: return "1.0";
38         case Onehalf: return "1.25";
39         case Double: return "1.667";
40         case Other: return value;
41         }
42         return "1.0";
43 }
44
45
46 double Spacing::getValue() const
47 {
48         return strToDbl(getValueAsString());
49 }
50
51
52 void Spacing::set(Spacing::Space sp, float val)
53 {
54         set(sp, convert<string>(val));
55 }
56
57
58 void Spacing::set(Spacing::Space sp, string const & val)
59 {
60         space = sp;
61         if (sp == Other) {
62                 switch (int(strToDbl(val) * 1000 + 0.5)) {
63                 case 1000:
64                         space = Single;
65                         break;
66                 case 1250:
67                         space = Onehalf;
68                         break;
69                 case 1667:
70                         space = Double;
71                         break;
72                 default:
73                         value = val;
74                         break;
75                 }
76         }
77 }
78
79
80 void Spacing::writeFile(ostream & os, bool para) const
81 {
82         if (space == Default) return;
83
84         string cmd = para ? "\\paragraph_spacing " : "\\spacing ";
85
86         if (getSpace() == Spacing::Other) {
87                 os << cmd << spacing_string[getSpace()]
88                    << ' ' << getValueAsString() << "\n";
89         } else {
90                 os << cmd << spacing_string[getSpace()] << "\n";
91         }
92 }
93
94
95 string const Spacing::writeEnvirBegin() const
96 {
97         switch (space) {
98         case Default: break; // do nothing
99         case Single:
100                 return "\\begin{singlespace}";
101         case Onehalf:
102                 return "\\begin{onehalfspace}";
103         case Double:
104                 return "\\begin{doublespace}";
105         case Other:
106         {
107                 ostringstream ost;
108                 ost << "\\begin{spacing}{"
109                     << getValueAsString() << '}';
110                 return ost.str();
111         }
112         }
113         return string();
114 }
115
116
117 string const Spacing::writeEnvirEnd() const
118 {
119         switch (space) {
120         case Default: break; // do nothing
121         case Single:
122                 return "\\end{singlespace}";
123         case Onehalf:
124                 return "\\end{onehalfspace}";
125         case Double:
126                 return "\\end{doublespace}";
127         case Other:
128                 return "\\end{spacing}";
129         }
130         return string();
131 }