Files
qt-creator/shared/help/bookmarkmanager.cpp

867 lines
28 KiB
C++
Raw Normal View History

2008-12-02 12:01:29 +01:00
/***************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Qt Software Information (qt-info@nokia.com)
**
**
** Non-Open Source Usage
**
** Licensees may use this file in accordance with the Qt Beta Version
** License Agreement, Agreement version 2.2 provided with the Software or,
** alternatively, in accordance with the terms contained in a written
** agreement between you and Nokia.
**
** GNU General Public License Usage
**
** Alternatively, this file may be used under the terms of the GNU General
** Public License versions 2.0 or 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the packaging
** of this file. Please review the following information to ensure GNU
** General Public Licensing requirements will be met:
**
** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
** http://www.gnu.org/copyleft/gpl.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt GPL Exception version
** 1.2, included in the file GPL_EXCEPTION.txt in this package.
**
***************************************************************************/
#include "bookmarkmanager.h"
#include "centralwidget.h"
#include <QtGui/QMenu>
#include <QtGui/QIcon>
#include <QtGui/QStyle>
#include <QtGui/QLabel>
#include <QtGui/QLayout>
#include <QtCore/QEvent>
#include <QtGui/QComboBox>
#include <QtGui/QKeyEvent>
#include <QtGui/QLineEdit>
#include <QtGui/QMessageBox>
#include <QtGui/QHeaderView>
#include <QtGui/QToolButton>
#include <QtGui/QPushButton>
#include <QtGui/QApplication>
#include <QtHelp/QHelpEngineCore>
#include <QtGui/QDialogButtonBox>
#include <QtGui/QSortFilterProxyModel>
QT_BEGIN_NAMESPACE
BookmarkDialog::BookmarkDialog(BookmarkManager *manager, const QString &title,
const QString &url, QWidget *parent)
: QDialog(parent)
, m_url(url)
, m_title(title)
, bookmarkManager(manager)
{
installEventFilter(this);
ui.setupUi(this);
ui.bookmarkEdit->setText(title);
ui.newFolderButton->setVisible(false);
ui.buttonBox->button(QDialogButtonBox::Ok)->setDefault(true);
ui.bookmarkFolders->addItems(bookmarkManager->bookmarkFolders());
proxyModel = new QSortFilterProxyModel(this);
proxyModel->setFilterKeyColumn(0);
proxyModel->setDynamicSortFilter(true);
proxyModel->setFilterRole(Qt::UserRole + 10);
proxyModel->setSourceModel(bookmarkManager->treeBookmarkModel());
proxyModel->setFilterRegExp(QRegExp(QLatin1String("Folder"),
Qt::CaseSensitive, QRegExp::FixedString));
ui.treeView->setModel(proxyModel);
ui.treeView->expandAll();
ui.treeView->setVisible(false);
ui.treeView->header()->setVisible(false);
ui.treeView->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui.buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
connect(ui.buttonBox, SIGNAL(accepted()), this, SLOT(addAccepted()));
connect(ui.newFolderButton, SIGNAL(clicked()), this, SLOT(addNewFolder()));
connect(ui.toolButton, SIGNAL(clicked()), this, SLOT(toolButtonClicked()));
connect(ui.bookmarkEdit, SIGNAL(textChanged(const QString&)), this,
SLOT(textChanged(const QString&)));
connect(bookmarkManager->treeBookmarkModel(), SIGNAL(itemChanged(QStandardItem*)),
this, SLOT(itemChanged(QStandardItem*)));
connect(ui.bookmarkFolders, SIGNAL(currentIndexChanged(const QString&)), this,
SLOT(selectBookmarkFolder(const QString&)));
connect(ui.treeView, SIGNAL(customContextMenuRequested(const QPoint&)), this,
SLOT(customContextMenuRequested(const QPoint&)));
connect(ui.treeView->selectionModel(),
SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)),
this, SLOT(currentChanged(const QModelIndex&, const QModelIndex&)));
}
BookmarkDialog::~BookmarkDialog()
{
}
void BookmarkDialog::addAccepted()
{
const QItemSelection selection = ui.treeView->selectionModel()->selection();
const QModelIndexList list = selection.indexes();
QModelIndex index;
if (!list.isEmpty())
index = proxyModel->mapToSource(list.at(0));
bookmarkManager->addNewBookmark(index, ui.bookmarkEdit->text(), m_url);
accept();
}
void BookmarkDialog::addNewFolder()
{
const QItemSelection selection = ui.treeView->selectionModel()->selection();
const QModelIndexList list = selection.indexes();
QModelIndex index;
if (!list.isEmpty())
index = list.at(0);
QModelIndex newFolder =
bookmarkManager->addNewFolder(proxyModel->mapToSource(index));
if (newFolder.isValid()) {
ui.treeView->expand(index);
const QModelIndex &index = proxyModel->mapFromSource(newFolder);
ui.treeView->selectionModel()->setCurrentIndex(index,
QItemSelectionModel::ClearAndSelect);
ui.bookmarkFolders->clear();
ui.bookmarkFolders->addItems(bookmarkManager->bookmarkFolders());
const QString name = index.data().toString();
ui.bookmarkFolders->setCurrentIndex(ui.bookmarkFolders->findText(name));
}
ui.treeView->setFocus();
}
void BookmarkDialog::toolButtonClicked()
{
bool visible = !ui.treeView->isVisible();
ui.treeView->setVisible(visible);
ui.newFolderButton->setVisible(visible);
if (visible) {
resize(QSize(width(), 400));
ui.toolButton->setText(QLatin1String("-"));
} else {
resize(width(), minimumHeight());
ui.toolButton->setText(QLatin1String("+"));
}
}
void BookmarkDialog::itemChanged(QStandardItem *item)
{
if (renameItem != item) {
renameItem = item;
oldText = item->text();
return;
}
if (item->text() != oldText) {
ui.bookmarkFolders->clear();
ui.bookmarkFolders->addItems(bookmarkManager->bookmarkFolders());
QString name = tr("Bookmarks");
const QModelIndex& index = ui.treeView->currentIndex();
if (index.isValid())
name = index.data().toString();
ui.bookmarkFolders->setCurrentIndex(ui.bookmarkFolders->findText(name));
}
}
void BookmarkDialog::textChanged(const QString& string)
{
ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!string.isEmpty());
}
void BookmarkDialog::selectBookmarkFolder(const QString &folderName)
{
if (folderName.isEmpty())
return;
if (folderName == tr("Bookmarks")) {
ui.treeView->clearSelection();
return;
}
QStandardItemModel *model = bookmarkManager->treeBookmarkModel();
QList<QStandardItem*> list = model->findItems(folderName,
Qt::MatchCaseSensitive | Qt::MatchRecursive, 0);
if (!list.isEmpty()) {
QModelIndex index = model->indexFromItem(list.at(0));
ui.treeView->selectionModel()->setCurrentIndex(
proxyModel->mapFromSource(index), QItemSelectionModel::ClearAndSelect);
}
}
void BookmarkDialog::customContextMenuRequested(const QPoint &point)
{
QModelIndex index = ui.treeView->indexAt(point);
if (!index.isValid())
return;
QMenu menu(QLatin1String(""), this);
QAction *removeItem = menu.addAction(tr("Delete Folder"));
QAction *renameItem = menu.addAction(tr("Rename Folder"));
QAction *picked_action = menu.exec(ui.treeView->mapToGlobal(point));
if (!picked_action)
return;
if (picked_action == removeItem) {
bookmarkManager->removeBookmarkItem(ui.treeView,
proxyModel->mapToSource(index));
ui.bookmarkFolders->clear();
ui.bookmarkFolders->addItems(bookmarkManager->bookmarkFolders());
QString name = tr("Bookmarks");
index = ui.treeView->currentIndex();
if (index.isValid())
name = index.data().toString();
ui.bookmarkFolders->setCurrentIndex(ui.bookmarkFolders->findText(name));
}
else if (picked_action == renameItem) {
QStandardItem *item = bookmarkManager->treeBookmarkModel()->
itemFromIndex(proxyModel->mapToSource(index));
if (item) {
item->setEditable(true);
ui.treeView->edit(index);
item->setEditable(false);
}
}
}
void BookmarkDialog::currentChanged(const QModelIndex& current,
const QModelIndex& previous)
{
Q_UNUSED(previous)
if (!current.isValid()) {
ui.bookmarkFolders->setCurrentIndex(
ui.bookmarkFolders->findText(tr("Bookmarks")));
return;
}
ui.bookmarkFolders->setCurrentIndex(
ui.bookmarkFolders->findText(current.data().toString()));
}
bool BookmarkDialog::eventFilter(QObject *object, QEvent *e)
{
if (object == this && e->type() == QEvent::KeyPress) {
QKeyEvent *ke = static_cast<QKeyEvent*>(e);
QModelIndex index = ui.treeView->currentIndex();
switch (ke->key()) {
case Qt::Key_F2: {
const QModelIndex& source = proxyModel->mapToSource(index);
QStandardItem *item =
bookmarkManager->treeBookmarkModel()->itemFromIndex(source);
if (item) {
item->setEditable(true);
ui.treeView->edit(index);
item->setEditable(false);
}
} break;
case Qt::Key_Delete: {
bookmarkManager->removeBookmarkItem(ui.treeView,
proxyModel->mapToSource(index));
ui.bookmarkFolders->clear();
ui.bookmarkFolders->addItems(bookmarkManager->bookmarkFolders());
QString name = tr("Bookmarks");
index = ui.treeView->currentIndex();
if (index.isValid())
name = index.data().toString();
ui.bookmarkFolders->setCurrentIndex(ui.bookmarkFolders->findText(name));
} break;
default:
break;
}
}
return QObject::eventFilter(object, e);
}
BookmarkWidget::BookmarkWidget(BookmarkManager *manager, QWidget *parent,
bool showButtons)
: QWidget(parent)
, addButton(0)
, removeButton(0)
, bookmarkManager(manager)
{
setup(showButtons);
installEventFilter(this);
}
BookmarkWidget::~BookmarkWidget()
{
}
void BookmarkWidget::removeClicked()
{
const QModelIndex& index = treeView->currentIndex();
if (searchField->text().isEmpty()) {
bookmarkManager->removeBookmarkItem(treeView,
filterBookmarkModel->mapToSource(index));
}
}
void BookmarkWidget::filterChanged()
{
bool searchBookmarks = searchField->text().isEmpty();
if (!searchBookmarks) {
regExp.setPattern(searchField->text());
filterBookmarkModel->setSourceModel(bookmarkManager->listBookmarkModel());
} else {
regExp.setPattern(QLatin1String(""));
filterBookmarkModel->setSourceModel(bookmarkManager->treeBookmarkModel());
}
if (addButton)
addButton->setEnabled(searchBookmarks);
if (removeButton)
removeButton->setEnabled(searchBookmarks);
filterBookmarkModel->setFilterRegExp(regExp);
QModelIndex index = treeView->indexAt(QPoint(1, 1));
if (index.isValid())
treeView->setCurrentIndex(index);
if (searchBookmarks)
expandItems();
}
void BookmarkWidget::expand(const QModelIndex& index)
{
const QModelIndex& source = filterBookmarkModel->mapToSource(index);
QStandardItem *item = bookmarkManager->treeBookmarkModel()->itemFromIndex(source);
if (item)
item->setData(treeView->isExpanded(index), Qt::UserRole + 11);
}
void BookmarkWidget::activated(const QModelIndex &index)
{
if (!index.isValid())
return;
QString data = index.data(Qt::UserRole + 10).toString();
if (data != QLatin1String("Folder"))
emit requestShowLink(data);
}
void BookmarkWidget::customContextMenuRequested(const QPoint &point)
{
QModelIndex index = treeView->indexAt(point);
if (!index.isValid())
return;
QAction *showItem = 0;
QAction *removeItem = 0;
QAction *renameItem = 0;
QAction *showItemNewTab = 0;
QMenu menu(QLatin1String(""), this);
QString data = index.data(Qt::UserRole + 10).toString();
if (data == QLatin1String("Folder")) {
removeItem = menu.addAction(tr("Delete Folder"));
renameItem = menu.addAction(tr("Rename Folder"));
} else {
showItem = menu.addAction(tr("Show Bookmark"));
showItemNewTab = menu.addAction(tr("Show Bookmark in New Tab"));
if (searchField->text().isEmpty()) {
menu.addSeparator();
removeItem = menu.addAction(tr("Delete Bookmark"));
renameItem = menu.addAction(tr("Rename Bookmark"));
}
}
QAction *picked_action = menu.exec(treeView->mapToGlobal(point));
if (!picked_action)
return;
if (picked_action == showItem) {
emit requestShowLink(data);
}
else if (picked_action == showItemNewTab) {
CentralWidget::instance()->setSourceInNewTab(data);
}
else if (picked_action == removeItem) {
bookmarkManager->removeBookmarkItem(treeView,
filterBookmarkModel->mapToSource(index));
}
else if (picked_action == renameItem) {
const QModelIndex& source = filterBookmarkModel->mapToSource(index);
QStandardItem *item =
bookmarkManager->treeBookmarkModel()->itemFromIndex(source);
if (item) {
item->setEditable(true);
treeView->edit(index);
item->setEditable(false);
}
}
}
void BookmarkWidget::setup(bool showButtons)
{
regExp.setPatternSyntax(QRegExp::FixedString);
regExp.setCaseSensitivity(Qt::CaseInsensitive);
QLayout *vlayout = new QVBoxLayout(this);
vlayout->setMargin(4);
QLabel *label = new QLabel(tr("Filter:"), this);
vlayout->addWidget(label);
searchField = new QLineEdit(this);
vlayout->addWidget(searchField);
connect(searchField, SIGNAL(textChanged(const QString &)), this,
SLOT(filterChanged()));
treeView = new TreeView(this);
vlayout->addWidget(treeView);
QString system = QLatin1String("win");
#ifdef Q_OS_MAC
system = QLatin1String("mac");
#endif
if (showButtons) {
QLayout *hlayout = new QHBoxLayout();
vlayout->addItem(hlayout);
hlayout->addItem(new QSpacerItem(40, 20, QSizePolicy::Expanding));
addButton = new QToolButton(this);
addButton->setText(tr("Add"));
addButton->setIcon(QIcon(QString::fromUtf8(
":/trolltech/assistant/images/%1/addtab.png").arg(system)));
addButton->setAutoRaise(true);
addButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
hlayout->addWidget(addButton);
connect(addButton, SIGNAL(clicked()), this, SIGNAL(addBookmark()));
removeButton = new QToolButton(this);
removeButton->setText(tr("Remove"));
removeButton->setIcon(QIcon(QString::fromUtf8(
":/trolltech/assistant/images/%1/closetab.png").arg(system)));
removeButton->setAutoRaise(true);
removeButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
hlayout->addWidget(removeButton);
connect(removeButton, SIGNAL(clicked()), this, SLOT(removeClicked()));
}
filterBookmarkModel = new QSortFilterProxyModel(this);
treeView->setModel(filterBookmarkModel);
treeView->setDragEnabled(true);
treeView->setAcceptDrops(true);
treeView->setAutoExpandDelay(1000);
treeView->setDropIndicatorShown(true);
treeView->header()->setVisible(false);
treeView->viewport()->installEventFilter(this);
treeView->setContextMenuPolicy(Qt::CustomContextMenu);
connect(treeView, SIGNAL(expanded(const QModelIndex&)), this,
SLOT(expand(const QModelIndex&)));
connect(treeView, SIGNAL(collapsed(const QModelIndex&)), this,
SLOT(expand(const QModelIndex&)));
connect(treeView, SIGNAL(activated(const QModelIndex&)), this,
SLOT(activated(const QModelIndex&)));
connect(treeView, SIGNAL(customContextMenuRequested(const QPoint&)),
this, SLOT(customContextMenuRequested(const QPoint&)));
filterBookmarkModel->setFilterKeyColumn(0);
filterBookmarkModel->setDynamicSortFilter(true);
filterBookmarkModel->setSourceModel(bookmarkManager->treeBookmarkModel());
expandItems();
}
void BookmarkWidget::expandItems()
{
QStandardItemModel *model = bookmarkManager->treeBookmarkModel();
QList<QStandardItem*>list = model->findItems(QLatin1String("*"),
Qt::MatchWildcard | Qt::MatchRecursive, 0);
foreach (const QStandardItem* item, list) {
const QModelIndex& index = model->indexFromItem(item);
treeView->setExpanded(filterBookmarkModel->mapFromSource(index),
item->data(Qt::UserRole + 11).toBool());
}
}
void BookmarkWidget::focusInEvent(QFocusEvent *e)
{
if (e->reason() != Qt::MouseFocusReason) {
searchField->selectAll();
searchField->setFocus();
QModelIndex index = treeView->indexAt(QPoint(1, 1));
if (index.isValid())
treeView->setCurrentIndex(index);
}
}
bool BookmarkWidget::eventFilter(QObject *object, QEvent *e)
{
if (object == this && e->type() == QEvent::KeyPress) {
QKeyEvent *ke = static_cast<QKeyEvent*>(e);
QModelIndex index = treeView->currentIndex();
switch (ke->key()) {
if (index.isValid() && searchField->text().isEmpty()) {
case Qt::Key_F2: {
const QModelIndex& source = filterBookmarkModel->mapToSource(index);
QStandardItem *item =
bookmarkManager->treeBookmarkModel()->itemFromIndex(source);
if (item) {
item->setEditable(true);
treeView->edit(index);
item->setEditable(false);
}
} break;
case Qt::Key_Delete: {
bookmarkManager->removeBookmarkItem(treeView,
filterBookmarkModel->mapToSource(index));
} break;
}
case Qt::Key_Up:
case Qt::Key_Down:
treeView->subclassKeyPressEvent(ke);
break;
case Qt::Key_Enter: {
case Qt::Key_Return:
index = treeView->selectionModel()->currentIndex();
if (index.isValid()) {
QString data = index.data(Qt::UserRole + 10).toString();
if (!data.isEmpty() && data != QLatin1String("Folder"))
emit requestShowLink(data);
}
} break;
case Qt::Key_Escape:
emit escapePressed();
break;
default:
break;
}
}
else if (object == treeView->viewport() && e->type() == QEvent::MouseButtonRelease) {
const QModelIndex& index = treeView->currentIndex();
QMouseEvent *me = static_cast<QMouseEvent*>(e);
if (index.isValid() && (me->button() == Qt::MidButton)) {
QString data = index.data(Qt::UserRole + 10).toString();
if (!data.isEmpty() && data != QLatin1String("Folder"))
CentralWidget::instance()->setSourceInNewTab(data);
}
}
return QWidget::eventFilter(object, e);
}
BookmarkModel::BookmarkModel(int rows, int columns, QObject * parent)
: QStandardItemModel(rows, columns, parent)
{
}
BookmarkModel::~BookmarkModel()
{
}
Qt::DropActions BookmarkModel::supportedDropActions() const
{
return Qt::MoveAction;
}
Qt::ItemFlags BookmarkModel::flags(const QModelIndex &index) const
{
Qt::ItemFlags defaultFlags = QStandardItemModel::flags(index);
if (index.data(Qt::UserRole + 10).toString() == QLatin1String("Folder"))
return (Qt::ItemIsDropEnabled | defaultFlags) &~ Qt::ItemIsDragEnabled;
return (Qt::ItemIsDragEnabled | defaultFlags) &~ Qt::ItemIsDropEnabled;
}
BookmarkManager::BookmarkManager(QHelpEngineCore* _helpEngine)
: treeModel(new BookmarkModel(0, 1, this))
, listModel(new BookmarkModel(0, 1, this))
, helpEngine(_helpEngine)
{
folderIcon = QApplication::style()->standardIcon(QStyle::SP_DirClosedIcon);
treeModel->setHeaderData(0, Qt::Horizontal, QObject::tr("Bookmark"));
listModel->setHeaderData(0, Qt::Horizontal, QObject::tr("Bookmark"));
connect(treeModel, SIGNAL(itemChanged(QStandardItem*)), this,
SLOT(itemChanged(QStandardItem*)));
}
BookmarkManager::~BookmarkManager()
{
treeModel->clear();
listModel->clear();
}
BookmarkModel* BookmarkManager::treeBookmarkModel()
{
return treeModel;
}
BookmarkModel* BookmarkManager::listBookmarkModel()
{
return listModel;
}
void BookmarkManager::saveBookmarks()
{
qint32 depth = 0;
QByteArray bookmarks;
QDataStream stream(&bookmarks, QIODevice::WriteOnly);
QStandardItem *root = treeModel->invisibleRootItem();
for (int i = 0; i < root->rowCount(); ++i) {
const QStandardItem *item = root->child(i);
stream << depth; // root
stream << item->data(Qt::DisplayRole).toString();
stream << item->data(Qt::UserRole + 10).toString();
stream << item->data(Qt::UserRole + 11).toBool();
if (item->rowCount() > 0) {
readBookmarksRecursive(item, stream, (depth +1));
}
}
helpEngine->setCustomValue(QLatin1String("Bookmarks"), bookmarks);
}
QStringList BookmarkManager::bookmarkFolders() const
{
QStringList folders(tr("Bookmarks"));
QList<QStandardItem*>list = treeModel->findItems(QLatin1String("*"),
Qt::MatchWildcard | Qt::MatchRecursive, 0);
QString data;
foreach (const QStandardItem *item, list) {
data = item->data(Qt::UserRole + 10).toString();
if (data == QLatin1String("Folder"))
folders << item->data(Qt::DisplayRole).toString();
}
return folders;
}
QModelIndex BookmarkManager::addNewFolder(const QModelIndex& index)
{
QStandardItem *item = new QStandardItem(uniqueFolderName());
item->setEditable(false);
item->setData(false, Qt::UserRole + 11);
item->setData(QLatin1String("Folder"), Qt::UserRole + 10);
item->setIcon(QApplication::style()->standardIcon(QStyle::SP_DirClosedIcon));
if (index.isValid()) {
treeModel->itemFromIndex(index)->appendRow(item);
} else {
treeModel->appendRow(item);
}
return treeModel->indexFromItem(item);
}
void BookmarkManager::removeBookmarkItem(QTreeView *treeView, const QModelIndex& index)
{
QStandardItem *item = treeModel->itemFromIndex(index);
if (item) {
QString data = index.data(Qt::UserRole + 10).toString();
if (data == QLatin1String("Folder") && item->rowCount() > 0) {
int value = QMessageBox::question(treeView, tr("Remove"),
tr("You are going to delete a Folder, this will also<br>"
"remove it's content. Are you sure to continue?"),
QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel);
if (value == QMessageBox::Cancel)
return;
}
if (data != QLatin1String("Folder")) {
QList<QStandardItem*>itemList = listModel->findItems(item->text());
foreach (const QStandardItem *i, itemList) {
if (i->data(Qt::UserRole + 10) == data) {
listModel->removeRow(i->row());
break;
}
}
} else {
removeBookmarkFolderItems(item);
}
treeModel->removeRow(item->row(), index.parent());
}
}
void BookmarkManager::showBookmarkDialog(QWidget* parent, const QString &name,
const QString &url)
{
BookmarkDialog dialog(this, name, url, parent);
dialog.exec();
}
void BookmarkManager::addNewBookmark(const QModelIndex& index,
const QString &name, const QString &url)
{
QStandardItem *item = new QStandardItem(name);
item->setEditable(false);
item->setData(false, Qt::UserRole + 11);
item->setData(url, Qt::UserRole + 10);
if (index.isValid()) {
treeModel->itemFromIndex(index)->appendRow(item);
listModel->appendRow(item->clone());
} else {
treeModel->appendRow(item);
listModel->appendRow(item->clone());
}
}
void BookmarkManager::itemChanged(QStandardItem *item)
{
if (renameItem != item) {
renameItem = item;
oldText = item->text();
return;
}
if (item->text() != oldText) {
if (item->data(Qt::UserRole + 10).toString() != QLatin1String("Folder")) {
QList<QStandardItem*>itemList = listModel->findItems(oldText);
if (itemList.count() > 0)
itemList.at(0)->setText(item->text());
}
}
}
void BookmarkManager::setupBookmarkModels()
{
treeModel->clear();
listModel->clear();
qint32 depth;
bool expanded;
QString name, type;
QList<int> lastDepths;
QList<QStandardItem*> parents;
QByteArray ba = helpEngine->customValue(QLatin1String("Bookmarks")).toByteArray();
QDataStream stream(ba);
while (!stream.atEnd()) {
stream >> depth >> name >> type >> expanded;
QStandardItem *item = new QStandardItem(name);
item->setEditable(false);
item->setData(type, Qt::UserRole + 10);
item->setData(expanded, Qt::UserRole + 11);
if (depth == 0) {
parents.clear(); lastDepths.clear();
treeModel->appendRow(item);
parents << item; lastDepths << depth;
} else {
if (depth <= lastDepths.last()) {
while (depth <= lastDepths.last() && parents.count() > 0) {
parents.pop_back(); lastDepths.pop_back();
}
}
parents.last()->appendRow(item);
if (type == QLatin1String("Folder")) {
parents << item; lastDepths << depth;
}
}
if (type == QLatin1String("Folder"))
item->setIcon(folderIcon);
else
listModel->appendRow(item->clone());
}
}
QString BookmarkManager::uniqueFolderName() const
{
QString folderName = tr("New Folder");
QList<QStandardItem*> list = treeModel->findItems(folderName,
Qt::MatchContains | Qt::MatchRecursive, 0);
if (!list.isEmpty()) {
QStringList names;
foreach (const QStandardItem *item, list)
names << item->text();
for (int i = 1; i <= names.count(); ++i) {
folderName = (tr("New Folder") + QLatin1String(" %1")).arg(i);
if (!names.contains(folderName))
break;
}
}
return folderName;
}
void BookmarkManager::removeBookmarkFolderItems(QStandardItem *item)
{
for (int j = 0; j < item->rowCount(); ++j) {
QStandardItem *child = item->child(j);
if (child->rowCount() > 0)
removeBookmarkFolderItems(child);
QString data = child->data(Qt::UserRole + 10).toString();
QList<QStandardItem*>itemList = listModel->findItems(child->text());
foreach (const QStandardItem *i, itemList) {
if (i->data(Qt::UserRole + 10) == data) {
listModel->removeRow(i->row());
break;
}
}
}
}
void BookmarkManager::readBookmarksRecursive(const QStandardItem *item,
QDataStream &stream,
const qint32 depth) const
{
for (int j = 0; j < item->rowCount(); ++j) {
const QStandardItem *child = item->child(j);
stream << depth;
stream << child->data(Qt::DisplayRole).toString();
stream << child->data(Qt::UserRole + 10).toString();
stream << child->data(Qt::UserRole + 11).toBool();
if (child->rowCount() > 0)
readBookmarksRecursive(child, stream, (depth +1));
}
}
QT_END_NAMESPACE