3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
7 * \author Abdelrazak Younes
9 * Full author contact details are available in file CREDITS.
14 #include "QTocDialog.h"
16 #include "qt_helpers.h"
17 #include "controllers/ControlToc.h"
21 #include <QTreeWidget>
22 #include <QTreeWidgetItem>
23 #include <QPushButton>
24 #include <QCloseEvent>
39 QTocDialog::QTocDialog(QToc * form)
40 : form_(form), depth_(2)
45 tocTW->setSortingEnabled(false);
46 tocTW->setColumnCount(1);
47 // hide the pointless QHeader
48 // QWidget * w = static_cast<QWidget*>(tocTW->child("list view header"));
52 connect(closePB, SIGNAL(clicked()),
53 form, SLOT(slotClose()));
55 connect( tocTW, SIGNAL(itemClicked(QTreeWidgetItem*)), this, SLOT(select_adaptor(QTreeWidgetItem*)));
56 connect( typeCO, SIGNAL( activated(int) ), this, SLOT( activate_adaptor(int) ) );
57 connect( updatePB, SIGNAL( clicked() ), this, SLOT( update_adaptor() ) );
58 connect( depthSL, SIGNAL( valueChanged(int) ), this, SLOT( depth_adaptor(int) ) );
62 QTocDialog::~QTocDialog()
66 void QTocDialog::on_moveUpPB_clicked()
73 void QTocDialog::on_moveDownPB_clicked()
80 void QTocDialog::on_moveInPB_clicked()
87 void QTocDialog::on_moveOutPB_clicked()
94 void QTocDialog::enableButtons(bool enable)
96 moveUpPB->setEnabled(enable);
97 moveDownPB->setEnabled(enable);
98 moveInPB->setEnabled(enable);
99 moveOutPB->setEnabled(enable);
100 updatePB->setEnabled(enable);
103 void QTocDialog::updateType()
107 vector<string> const & choice = form_->controller().getTypes();
108 string const & type = toc::getType(form_->controller().params().getCmdName());
110 for (vector<string>::const_iterator it = choice.begin();
111 it != choice.end(); ++it) {
112 string const & guiname = form_->controller().getGuiName(*it);
113 typeCO->insertItem(toqstr(guiname));
115 typeCO->setCurrentItem(it - choice.begin());
116 form_->setTitle(guiname);
121 void QTocDialog::updateToc(bool newdepth)
123 vector<string> const & choice = form_->controller().getTypes();
126 type = choice[typeCO->currentItem()];
128 toc::Toc const & contents = form_->controller().getContents(type);
130 // Check if all elements are the same.
131 if (!newdepth && form_->get_toclist() == contents) {
137 form_->get_toclist() = contents;
139 if (form_->get_toclist().empty())
142 tocTW->setUpdatesEnabled(false);
144 QTreeWidgetItem * topLevelItem;
146 toc::Toc::const_iterator iter = form_->get_toclist().begin();
148 while (iter != form_->get_toclist().end()) {
150 if (iter->depth == 1) {
151 topLevelItem = new QTreeWidgetItem(tocTW);
152 // tocTW->addTopLevelItem(topLevelItem);
153 topLevelItem->setText(0, toqstr(iter->str));
154 if (iter->depth < depth_) tocTW->collapseItem(topLevelItem);
157 << "Table of contents\n"
158 << "Added Top Level item " << iter->str
159 << " at depth " << iter->depth
162 populateItem(topLevelItem, iter);
165 if (iter == form_->get_toclist().end())
171 tocTW->setUpdatesEnabled(true);
173 form_->setTitle(fromqstr(typeCO->currentText()));
177 void QTocDialog::populateItem(QTreeWidgetItem * parentItem, toc::Toc::const_iterator& iter)
179 int curdepth = iter->depth+1;
180 QTreeWidgetItem * item;
182 while (iter != form_->get_toclist().end()) {
186 if (iter == form_->get_toclist().end())
189 if (iter->depth < curdepth) {
193 if (iter->depth > curdepth) {
198 item = new QTreeWidgetItem(parentItem);
199 item->setText(0, toqstr(iter->str));
200 // parentItem->addChild(item);
202 if (iter->depth < depth_) tocTW->collapseItem(item);
203 // else tocTW->expandItem(item);
205 << "Table of contents: Added item " << iter->str
206 << " at depth " << iter->depth
208 << fromqstr(parentItem->text(0)) << '"'
211 populateItem(item, iter);
215 void QTocDialog::activate_adaptor(int)
221 void QTocDialog::depth_adaptor(int depth)
231 void QTocDialog::select_adaptor(QTreeWidgetItem * item)
233 form_->select(fromqstr(item->text(0)));
237 void QTocDialog::update_adaptor()
243 void QTocDialog::closeEvent(QCloseEvent * e)
249 } // namespace frontend
254 stack<pair<QTreeWidgetItem *, QTreeWidgetItem *> > istack;
255 QTreeWidgetItem * last = 0;
256 QTreeWidgetItem * parent = 0;
257 QTreeWidgetItem * item;
259 // Yes, it is this ugly. Two reasons - root items must have
260 // a QListView parent, rather than QListViewItem; and the
261 // TOC can move in and out an arbitrary number of levels
263 for (toc::Toc::const_iterator iter = form_->get_toclist().begin();
264 iter != form_->get_toclist().end(); ++iter) {
266 if (iter->depth == 0) {
269 if (iter->depth == curdepth) {
270 // insert it after the last one we processed
272 item = (last ? new QTreeWidgetItem(tocTW,last) : new QTreeWidgetItem(tocTW));
274 item = (last ? new QTreeWidgetItem(parent,last) : new QTreeWidgetItem(parent));
275 } else if (iter->depth > curdepth) {
276 int diff = iter->depth - curdepth;
277 // first save old parent and last
279 istack.push(pair< QTreeWidgetItem *, QTreeWidgetItem * >(parent,last));
280 item = (last ? new QTreeWidgetItem(last) : new QTreeWidgetItem(tocTW));
283 int diff = curdepth - iter->depth;
284 pair<QTreeWidgetItem *, QTreeWidgetItem * > top;
292 // insert it after the last one we processed
294 item = (last ? new QTreeWidgetItem(tocTW,last) : new QTreeWidgetItem(tocTW));
296 item = (last ? new QTreeWidgetItem(parent,last) : new QTreeWidgetItem(parent));
298 item->setText(0, toqstr(iter->str));
299 item->setOpen(iter->depth < depth_);
300 curdepth = iter->depth;