]> git.lyx.org Git - lyx.git/blob - src/frontends/qt4/GuiToc.cpp
Implementation of the conclusion of the "LyX/Mac 1.6 -- Window issues" thread:
[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 <boost/assert.hpp>
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         BOOST_ASSERT(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         BOOST_ASSERT(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 = QString::fromUtf8(data.c_str());
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 (!data.empty())
152                 new_type = toqstr(data);
153         else
154                 // Default to Outliner.
155                 new_type = "tableofcontents";
156
157         types_.clear();
158         type_names_.clear();
159         clearTocModels();
160         TocList const & tocs = buffer().masterBuffer()->tocBackend().tocs();
161         TocList::const_iterator it = tocs.begin();
162         TocList::const_iterator end = tocs.end();
163         for (; it != end; ++it) {
164                 types_.push_back(toqstr(it->first));
165                 type_names_.push_back(toqstr(guiName(it->first)));
166                 toc_models_.push_back(new TocModel(it->second));
167         }
168
169         int selected_type = -1;
170         for (int i = 0; i != types_.size(); ++i) {
171                 if (new_type == types_[i]) {
172                         selected_type = i;
173                         break;
174                 }
175         }
176         widget_->updateGui(selected_type);
177
178         return true;
179 }
180
181
182 bool GuiToc::canOutline(int type) const
183 {
184         return types_[type] == "tableofcontents";
185 }
186
187
188 void GuiToc::outlineUp()
189 {
190         dispatch(FuncRequest(LFUN_OUTLINE_UP));
191 }
192
193
194 void GuiToc::outlineDown()
195 {
196         dispatch(FuncRequest(LFUN_OUTLINE_DOWN));
197 }
198
199
200 void GuiToc::outlineIn()
201 {
202         dispatch(FuncRequest(LFUN_OUTLINE_IN));
203 }
204
205
206 void GuiToc::outlineOut()
207 {
208         dispatch(FuncRequest(LFUN_OUTLINE_OUT));
209 }
210
211
212 void GuiToc::updateBackend()
213 {
214         buffer().masterBuffer()->tocBackend().update();
215         buffer().structureChanged();
216 }
217
218
219 TocIterator GuiToc::currentTocItem(int type) const
220 {
221         BOOST_ASSERT(bufferview());
222         ParConstIterator it(bufferview()->cursor());
223         return buffer().masterBuffer()->tocBackend().item(fromqstr(types_[type]), it);
224 }
225
226
227 docstring GuiToc::guiName(string const & type) const
228 {
229         if (type == "tableofcontents")
230                 return _("Table of Contents");
231         if (type == "child")
232                 return _("Child Documents");
233         if (type == "embedded")
234                 return _("Embedded Files");
235         if (type == "graphics")
236                 return _("List of Graphics");
237         if (type == "equation")
238                 return _("List of Equations");
239         if (type == "footnote")
240                 return _("List of Foot notes");
241         if (type == "listing")
242                 return _("List of Listings");
243         if (type == "index")
244                 return _("List of Indexes");
245         if (type == "marginalnote")
246                 return _("List of Marginal notes");
247         if (type == "note")
248                 return _("List of Notes");
249         if (type == "citation")
250                 return _("List of Citations");
251         if (type == "label")
252                 return _("Labels and References");
253
254         FloatList const & floats = buffer().params().documentClass().floats();
255         if (floats.typeExist(type))
256                 return _(floats.getType(type).listName());
257
258         return _(type);
259 }
260
261
262 void GuiToc::dispatchParams()
263 {
264 }
265
266
267 Dialog * createGuiToc(GuiView & lv)
268 {
269         GuiView & guiview = static_cast<GuiView &>(lv);
270 #ifdef Q_WS_MACX
271         // On Mac show as a drawer at the right
272         return new GuiToc(guiview, Qt::RightDockWidgetArea, Qt::Drawer);
273 #else
274         return new GuiToc(guiview);
275 #endif
276 }
277
278
279 } // namespace frontend
280 } // namespace lyx
281
282 #include "GuiToc_moc.cpp"