1 /**
2 * \file BranchList.cpp
3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
5 *
6 * \author Martin Vermeer
7 * \author Jürgen Spitzmüller
8 *
9 * Full author contact details are available in file CREDITS.
10 */
11
12 #include <config.h>
13
14 #include "BranchList.h"
15 #include "Color.h"
16
17 #include "frontends/Application.h"
18
19 #include "support/lstrings.h"
20
21 #include <algorithm>
22
23 using namespace std;
24
25
26 namespace lyx {
27
28 namespace {
29
30 class BranchNamesEqual : public std::unary_function<Branch, bool>
31 {
32 public:
BranchNamesEqual(docstring const & name)33 BranchNamesEqual(docstring const & name)
34 : name_(name)
35 {}
36
operator ()(Branch const & branch) const37 bool operator()(Branch const & branch) const
38 {
39 return branch.branch() == name_;
40 }
41 private:
42 docstring name_;
43 };
44
45 } // namespace
46
47
Branch()48 Branch::Branch()
49 : selected_(false), filenameSuffix_(false)
50 {
51 // no theApp() with command line export
52 if (theApp())
53 theApp()->getRgbColor(Color_background, color_);
54 else
55 frontend::Application::getRgbColorUncached(Color_background, color_);
56 }
57
58
branch() const59 docstring const & Branch::branch() const
60 {
61 return branch_;
62 }
63
64
setBranch(docstring const & s)65 void Branch::setBranch(docstring const & s)
66 {
67 branch_ = s;
68 }
69
70
isSelected() const71 bool Branch::isSelected() const
72 {
73 return selected_;
74 }
75
76
setSelected(bool b)77 bool Branch::setSelected(bool b)
78 {
79 if (b == selected_)
80 return false;
81 selected_ = b;
82 return true;
83 }
84
85
hasFileNameSuffix() const86 bool Branch::hasFileNameSuffix() const
87 {
88 return filenameSuffix_;
89 }
90
91
setFileNameSuffix(bool b)92 void Branch::setFileNameSuffix(bool b)
93 {
94 filenameSuffix_ = b;
95 }
96
97
color() const98 RGBColor const & Branch::color() const
99 {
100 return color_;
101 }
102
103
setColor(RGBColor const & c)104 void Branch::setColor(RGBColor const & c)
105 {
106 color_ = c;
107 }
108
109
setColor(string const & str)110 void Branch::setColor(string const & str)
111 {
112 if (str.size() == 7 && str[0] == '#')
113 color_ = rgbFromHexName(str);
114 else {
115 // no color set or invalid color - use normal background
116 // no theApp() with command line export
117 if (theApp())
118 theApp()->getRgbColor(Color_background, color_);
119 else
120 frontend::Application::getRgbColorUncached(Color_background, color_);
121 }
122 }
123
124
find(docstring const & name)125 Branch * BranchList::find(docstring const & name)
126 {
127 List::iterator it =
128 find_if(list.begin(), list.end(), BranchNamesEqual(name));
129 return it == list.end() ? 0 : &*it;
130 }
131
132
find(docstring const & name) const133 Branch const * BranchList::find(docstring const & name) const
134 {
135 List::const_iterator it =
136 find_if(list.begin(), list.end(), BranchNamesEqual(name));
137 return it == list.end() ? 0 : &*it;
138 }
139
140
add(docstring const & s)141 bool BranchList::add(docstring const & s)
142 {
143 bool added = false;
144 size_t i = 0;
145 while (true) {
146 size_t const j = s.find_first_of(separator_, i);
147 docstring name;
148 if (j == docstring::npos)
149 name = s.substr(i);
150 else
151 name = s.substr(i, j - i);
152 // Is this name already in the list?
153 bool const already =
154 find_if(list.begin(), list.end(),
155 BranchNamesEqual(name)) != list.end();
156 if (!already) {
157 added = true;
158 Branch br;
159 br.setBranch(name);
160 br.setSelected(false);
161 br.setFileNameSuffix(false);
162 list.push_back(br);
163 }
164 if (j == docstring::npos)
165 break;
166 i = j + 1;
167 }
168 return added;
169 }
170
171
remove(docstring const & s)172 bool BranchList::remove(docstring const & s)
173 {
174 size_t const size = list.size();
175 list.remove_if(BranchNamesEqual(s));
176 return size != list.size();
177 }
178
179
rename(docstring const & oldname,docstring const & newname,bool const merge)180 bool BranchList::rename(docstring const & oldname,
181 docstring const & newname, bool const merge)
182 {
183 if (newname.empty())
184 return false;
185 if (find_if(list.begin(), list.end(),
186 BranchNamesEqual(newname)) != list.end()) {
187 // new name already taken
188 if (merge)
189 return remove(oldname);
190 return false;
191 }
192
193 Branch * branch = find(oldname);
194 if (!branch)
195 return false;
196 branch->setBranch(newname);
197 return true;
198 }
199
200
getFileNameSuffix() const201 docstring BranchList::getFileNameSuffix() const
202 {
203 docstring result;
204 List::const_iterator it = list.begin();
205 for (; it != list.end(); ++it) {
206 if (it->isSelected() && it->hasFileNameSuffix())
207 result += "-" + it->branch();
208 }
209 return support::subst(result, from_ascii("/"), from_ascii("_"));
210 }
211
212 } // namespace lyx
213