]> git.lyx.org Git - lyx.git/blob - src/frontends/qt4/GuiToc.cpp
Complete the removal of the embedding stuff. Maybe. It's hard to be sure we got every...
[lyx.git] / src / frontends / qt4 / GuiToc.cpp
1 /**
2  * \file GuiToc.cpp
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author John Levon
7  * \author Abdelrazak Younes
8  * \author Angus Leeming
9  *
10  * Full author contact details are available in file CREDITS.
11  */
12
13 #include <config.h>
14
15 #include "GuiToc.h"
16 #include "GuiView.h"
17 #include "DockView.h"
18 #include "TocWidget.h"
19 #include "FuncRequest.h"
20
21 #include "insets/InsetCommand.h"
22
23 #include "TocModel.h"
24 #include "qt_helpers.h"
25
26 #include "Buffer.h"
27 #include "BufferView.h"
28 #include "BufferParams.h"
29 #include "FloatList.h"
30 #include "FuncRequest.h"
31 #include "TextClass.h"
32
33 #include "support/convert.h"
34 #include "support/debug.h"
35 #include "support/gettext.h"
36
37 #include "support/assert.h"
38
39 #include <algorithm>
40
41 using namespace std;
42
43 namespace lyx {
44 namespace frontend {
45
46 GuiToc::GuiToc(GuiView & parent, Qt::DockWidgetArea area, Qt::WindowFlags flags)
47         : DockView(parent, "toc", qt_("Outline"), area, flags)
48 {
49         widget_ = new TocWidget(*this, &parent);
50         setWidget(widget_);
51 }
52
53
54 GuiToc::~GuiToc()
55 {
56         clearTocModels();
57         delete widget_;
58 }
59
60
61 void GuiToc::clearTocModels()
62 {
63         const unsigned int size = toc_models_.size();
64         for (unsigned int i = 0; i < size; ++i) {
65                 delete toc_models_[i];
66         }
67         toc_models_.clear();
68 }
69
70
71 int GuiToc::getTocDepth(int type)
72 {
73         if (type < 0)
74                 return 0;
75         return toc_models_[type]->modelDepth();
76 }
77
78
79 QStandardItemModel * GuiToc::tocModel(int type)
80 {
81         if (type < 0)
82                 return 0;
83
84         if (toc_models_.empty()) {
85                 LYXERR(Debug::GUI, "GuiToc::tocModel(): no types available ");
86                 return 0;
87         }
88
89         LYXERR(Debug::GUI, "GuiToc: type " << type
90                 << "  toc_models_.size() " << toc_models_.size());
91
92         LASSERT(type >= 0 && type < int(toc_models_.size()), /**/);
93         return toc_models_[type];
94 }
95
96
97 QModelIndex GuiToc::currentIndex(int type) const
98 {
99         if (type < 0)
100                 return QModelIndex();
101
102         return toc_models_[type]->modelIndex(currentTocItem(type));
103 }
104
105
106 void GuiToc::goTo(int type, QModelIndex const & index)
107 {
108         if (type < 0 || !index.isValid()
109                 || index.model() != toc_models_[type]) {
110                 LYXERR(Debug::GUI, "GuiToc::goTo(): QModelIndex is invalid!");
111                 return;
112         }
113
114         LASSERT(type >= 0 && type < int(toc_models_.size()), /**/);
115
116         TocIterator const it = toc_models_[type]->tocIterator(index);
117
118         LYXERR(Debug::GUI, "GuiToc::goTo " << to_utf8(it->str()));
119
120         string const tmp = convert<string>(it->id());
121         dispatch(FuncRequest(LFUN_PARAGRAPH_GOTO, tmp));
122 }
123
124
125 void GuiToc::updateView()
126 {
127         widget_->updateView();
128 }
129
130
131 TocList const & GuiToc::tocs() const
132 {
133         return buffer().masterBuffer()->tocBackend().tocs();
134 }
135
136
137 bool GuiToc::initialiseParams(string const & data)
138 {
139         LYXERR(Debug::GUI, data);
140         QString str = toqstr(data);
141         QString new_type;
142         if (str.contains("tableofcontents")) {
143                 new_type = "tableofcontents";
144         } else if (str.contains("floatlist")) {
145                 if (str.contains("\"figure"))
146                         new_type = "figure";
147                 else if (str.contains("\"table"))
148                         new_type = "table";
149                 else if (str.contains("\"algorithm"))
150                         new_type = "algorithm";
151         } else if (!str.isEmpty()) {
152                 new_type = str;
153         } else {
154                 // Default to Outliner.
155                 new_type = "tableofcontents";
156         }
157
158         types_.clear();
159         type_names_.clear();
160         clearTocModels();
161         TocList const & tocs = buffer().masterBuffer()->tocBackend().tocs();
162         TocList::const_iterator it = tocs.begin();
163         TocList::const_iterator end = tocs.end();
164         for (; it != end; ++it) {
165                 types_.push_back(toqstr(it->first));
166                 type_names_.push_back(toqstr(guiName(it->first)));
167                 toc_models_.push_back(new TocModel(it->second));
168         }
169
170         widget_->updateGui(types_.indexOf(new_type));
171
172         return true;
173 }
174
175
176 bool GuiToc::canOutline(int type) const
177 {
178         return types_[type] == "tableofcontents";
179 }
180
181
182 void GuiToc::outlineUp()
183 {
184         dispatch(FuncRequest(LFUN_OUTLINE_UP));
185 }
186
187
188 void GuiToc::outlineDown()
189 {
190         dispatch(FuncRequest(LFUN_OUTLINE_DOWN));
191 }
192
193
194 void GuiToc::outlineIn()
195 {
196         dispatch(FuncRequest(LFUN_OUTLINE_IN));
197 }
198
199
200 void GuiToc::outlineOut()
201 {
202         dispatch(FuncRequest(LFUN_OUTLINE_OUT));
203 }
204
205
206 void GuiToc::updateBackend()
207 {
208         buffer().masterBuffer()->tocBackend().update();
209         buffer().structureChanged();
210 }
211
212
213 TocIterator GuiToc::currentTocItem(int type) const
214 {
215         LASSERT(bufferview(), /**/);
216         ParConstIterator it(bufferview()->cursor());
217         return buffer().masterBuffer()->tocBackend().item(fromqstr(types_[type]), it);
218 }
219
220
221 docstring GuiToc::guiName(string const & type) const
222 {
223         if (type == "tableofcontents")
224                 return _("Table of Contents");
225         if (type == "child")
226                 return _("Child Documents");
227         if (type == "graphics")
228                 return _("List of Graphics");
229         if (type == "equation")
230                 return _("List of Equations");
231         if (type == "footnote")
232                 return _("List of Foot notes");
233         if (type == "listing")
234                 return _("List of Listings");
235         if (type == "index")
236                 return _("List of Indexes");
237         if (type == "marginalnote")
238                 return _("List of Marginal notes");
239         if (type == "note")
240                 return _("List of Notes");
241         if (type == "citation")
242                 return _("List of Citations");
243         if (type == "label")
244                 return _("Labels and References");
245
246         FloatList const & floats = buffer().params().documentClass().floats();
247         if (floats.typeExist(type))
248                 return _(floats.getType(type).listName());
249
250         return _(type);
251 }
252
253
254 void GuiToc::dispatchParams()
255 {
256 }
257
258
259 Dialog * createGuiToc(GuiView & lv)
260 {
261         GuiView & guiview = static_cast<GuiView &>(lv);
262 #ifdef Q_WS_MACX
263         // On Mac show as a drawer at the right
264         return new GuiToc(guiview, Qt::RightDockWidgetArea, Qt::Drawer);
265 #else
266         return new GuiToc(guiview);
267 #endif
268 }
269
270
271 } // namespace frontend
272 } // namespace lyx
273
274 #include "GuiToc_moc.cpp"