/*
This is part of TeXworks, an environment for working with TeX documents
Copyright (C) 2007-08 Jonathan Kew
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
For links to further information, or to contact the author,
see .
*/
#include "TeXDocks.h"
#include "TeXDocument.h"
#include
#include
#include
#include
TeXDock::TeXDock(const QString& title, TeXDocument *doc)
: QDockWidget(title, doc), document(doc), filled(false)
{
connect(this, SIGNAL(visibilityChanged(bool)), SLOT(myVisibilityChanged(bool)));
}
TeXDock::~TeXDock()
{
}
void TeXDock::myVisibilityChanged(bool visible)
{
if (visible && document && !filled) {
fillInfo();
filled = true;
}
}
//////////////// TAGS ////////////////
TagsDock::TagsDock(TeXDocument *doc)
: TeXDock(tr("Tags"), doc)
{
setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
tree = new TeXDockTreeWidget(this);
tree->header()->hide();
tree->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
setWidget(tree);
connect(doc, SIGNAL(tagListUpdated()), this, SLOT(listChanged()));
saveScrollValue = 0;
}
TagsDock::~TagsDock()
{
}
void TagsDock::fillInfo()
{
disconnect(tree, SIGNAL(itemSelectionChanged()), this, SLOT(followTagSelection()));
tree->clear();
const QList& tags = document->getTags();
if (tags.size() > 0) {
QTreeWidgetItem *item = 0, *bmItem = 0;
QTreeWidgetItem *bookmarks = new QTreeWidgetItem(tree);
bookmarks->setText(0, tr("Bookmarks"));
bookmarks->setFlags(Qt::ItemIsEnabled);
bookmarks->setForeground(0, Qt::blue);
tree->expandItem(bookmarks);
QTreeWidgetItem *outline = new QTreeWidgetItem(tree, bookmarks);
outline->setText(0, tr("Outline"));
outline->setFlags(Qt::ItemIsEnabled);
outline->setForeground(0, Qt::blue);
tree->expandItem(outline);
for (int index = 0; index < tags.size(); ++index) {
const TeXDocument::Tag& bm = tags[index];
if (bm.level < 1) {
bmItem = new QTreeWidgetItem(bookmarks, QTreeWidgetItem::UserType);
bmItem->setText(0, bm.text);
bmItem->setText(1, QString::number(index));
}
else {
while (item != 0 && item->type() >= QTreeWidgetItem::UserType + bm.level)
item = item->parent();
if (item == 0)
item = new QTreeWidgetItem(outline, QTreeWidgetItem::UserType + bm.level);
else
item = new QTreeWidgetItem(item, QTreeWidgetItem::UserType + bm.level);
item->setText(0, bm.text);
item->setText(1, QString::number(index));
tree->expandItem(item);
}
}
if (bookmarks->childCount() == 0)
bookmarks->setHidden(true);
if (outline->childCount() == 0)
outline->setHidden(true);
if (saveScrollValue > 0) {
tree->verticalScrollBar()->setValue(saveScrollValue);
saveScrollValue = 0;
}
connect(tree, SIGNAL(itemSelectionChanged()), this, SLOT(followTagSelection()));
} else {
QTreeWidgetItem *item = new QTreeWidgetItem();
item->setText(0, tr("No tags"));
item->setFlags(item->flags() & ~(Qt::ItemIsEnabled | Qt::ItemIsSelectable));
tree->addTopLevelItem(item);
}
}
void TagsDock::listChanged()
{
saveScrollValue = tree->verticalScrollBar()->value();
tree->clear();
filled = false;
if (document && isVisible())
fillInfo();
}
void TagsDock::followTagSelection()
{
QList items = tree->selectedItems();
if (items.count() > 0) {
QTreeWidgetItem* item = items.first();
QString dest = item->text(1);
if (!dest.isEmpty())
document->goToTag(dest.toInt());
}
}
TeXDockTreeWidget::TeXDockTreeWidget(QWidget* parent)
: QTreeWidget(parent)
{
}
TeXDockTreeWidget::~TeXDockTreeWidget()
{
}
QSize TeXDockTreeWidget::sizeHint() const
{
return QSize(180, 300);
}