helpdialog.cpp

来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 1,320 行 · 第 1/3 页

CPP
1,320
字号
        QFile file(*i);        if (!file.exists()) {            QMessageBox::warning(this, tr("Warning"),                tr("Documentation file %1 does not exist!\n"                    "Skipping file.").arg(QFileInfo(file).absoluteFilePath()));            continue;        }        fileAges += QFileInfo(file).lastModified().toTime_t();        DocuParser *handler = DocuParser::createParser(*i);        bool ok = handler->parse(&file);        file.close();        if (!ok){            QString msg = QString::fromLatin1("In file %1:\n%2")                          .arg(QFileInfo(file).absoluteFilePath())                          .arg(handler->errorProtocol());            QMessageBox::critical(this, tr("Parse Error"), tr(msg.toUtf8()));            delete handler;            continue;        }        QList<IndexItem*> indLst = handler->getIndexItems();        int counter = 0;        foreach (IndexItem *indItem, indLst) {            QFileInfo fi(indItem->reference);            lst.append(IndexKeyword(indItem->keyword, indItem->reference));            if (++counter%100 == 0) {                if (ui.progressPrepare)                    ui.progressPrepare->setValue(counter);                processEvents();                if (lwClosed) {                    return;                }            }        }        delete handler;    }    if (!lst.isEmpty())        qSort(lst);    QFile indexout(cacheFilesPath + QDir::separator() + QLatin1String("indexdb40.")		+ Config::configuration()->profileName());    if (verifyDirectory(cacheFilesPath) && indexout.open(QFile::WriteOnly)) {        QDataStream s(&indexout);        s << fileAges;        s << lst;        indexout.close();    }}void HelpDialog::setupTitleMap(){    if (titleMapDone)        return;    bool needRebuild = false;    if (Config::configuration()->profileName() == QLatin1String("default")) {        const QStringList docuFiles = Config::configuration()->docFiles();        for (QStringList::ConstIterator it = docuFiles.begin(); it != docuFiles.end(); ++it) {            if (!QFile::exists(*it)) {                Config::configuration()->saveProfile(Profile::createDefaultProfile());                Config::configuration()->loadDefaultProfile();                needRebuild = true;                break;            }        }    }    if (Config::configuration()->docRebuild() || needRebuild) {        removeOldCacheFiles();        Config::configuration()->setDocRebuild(false);        Config::configuration()->saveProfile(Config::configuration()->profile());    }    if (contentList.isEmpty())        getAllContents();    titleMapDone = true;    titleMap.clear();    for (QList<QPair<QString, ContentList> >::Iterator it = contentList.begin(); it != contentList.end(); ++it) {        ContentList lst = (*it).second;        foreach (ContentItem item, lst) {            titleMap[item.reference] = item.title.trimmed();        }    }    processEvents();}void HelpDialog::getAllContents(){    QFile contentFile(cacheFilesPath + QDir::separator() + QLatin1String("contentdb40.")		+ Config::configuration()->profileName());    contentList.clear();    if (!contentFile.open(QFile::ReadOnly)) {        buildContentDict();        return;    }    QDataStream ds(&contentFile);    quint32 fileAges;    ds >> fileAges;    if (fileAges != getFileAges()) {        contentFile.close();        removeOldCacheFiles(true);        buildContentDict();        return;    }    QString key;    QList<ContentItem> lst;    while (!ds.atEnd()) {        ds >> key;        ds >> lst;        contentList += qMakePair(key, QList<ContentItem>(lst));    }    contentFile.close();    processEvents();}void HelpDialog::buildContentDict(){    QStringList docuFiles = Config::configuration()->docFiles();    quint32 fileAges = 0;    for (QStringList::iterator it = docuFiles.begin(); it != docuFiles.end(); ++it) {        QFile file(*it);        if (!file.exists()) {            QMessageBox::warning(this, tr("Warning"),            tr("Documentation file %1 does not exist!\n"                "Skipping file.").arg(QFileInfo(file).absoluteFilePath()));            continue;        }        fileAges += QFileInfo(file).lastModified().toTime_t();        DocuParser *handler = DocuParser::createParser(*it);        if (!handler) {            QMessageBox::warning(this, tr("Warning"),            tr("Documentation file %1 is not compatible!\n"                "Skipping file.").arg(QFileInfo(file).absoluteFilePath()));            continue;        }        bool ok = handler->parse(&file);        file.close();        if (ok) {            contentList += qMakePair(*it, QList<ContentItem>(handler->getContentItems()));            delete handler;        } else {            QString msg = QString::fromLatin1("In file %1:\n%2")                          .arg(QFileInfo(file).absoluteFilePath())                          .arg(handler->errorProtocol());            QMessageBox::critical(this, tr("Parse Error"), tr(msg.toUtf8()));            continue;        }    }    QFile contentOut(cacheFilesPath + QDir::separator() + QLatin1String("contentdb40.")		+ Config::configuration()->profileName());    if (contentOut.open(QFile::WriteOnly)) {        QDataStream s(&contentOut);        s << fileAges;        for (QList<QPair<QString, ContentList> >::Iterator it = contentList.begin(); it != contentList.end(); ++it) {            s << *it;        }        contentOut.close();    }}void HelpDialog::currentTabChanged(int index){    QString s = ui.tabWidget->widget(index)->objectName();    if (s == QLatin1String("indexPage"))        QTimer::singleShot(0, this, SLOT(loadIndexFile()));    else if (s == QLatin1String("bookmarkPage"))        insertBookmarks();    else if (s == QLatin1String("contentPage"))        QTimer::singleShot(0, this, SLOT(insertContents()));    else if (s == QLatin1String("searchPage"))        QTimer::singleShot(0, this, SLOT(setupFullTextIndex()));}void HelpDialog::showInitDoneMessage(){    if (initDoneMsgShown)        return;    initDoneMsgShown = true;    help->statusBar()->showMessage(tr("Done"), 3000);}void HelpDialog::showTopic(QTreeWidgetItem *item){    if (item)        showTopic();}void HelpDialog::showTopic(){    QString tabName = ui.tabWidget->currentWidget()->objectName();    if (tabName == QLatin1String("indexPage"))        showIndexTopic();    else if (tabName == QLatin1String("bookmarkPage"))        showBookmarkTopic();    else if (tabName == QLatin1String("contentPage"))        showContentsTopic();}void HelpDialog::showIndexTopic(){    int row = ui.listIndex->currentIndex().row();    if (row == -1 || row >= indexModel->rowCount())        return;    QString description = indexModel->description(row);    QStringList links = indexModel->links(row);    bool blocked = ui.editIndex->blockSignals(true);    ui.editIndex->setText(description);    ui.editIndex->blockSignals(blocked);    if (links.count() == 1) {        emit showLink(links.first());    } else {        qSort(links);        QStringList::Iterator it = links.begin();        QStringList linkList;        QStringList linkNames;        for (; it != links.end(); ++it) {            linkList << *it;            linkNames << titleOfLink(*it);        }        QString link = TopicChooser::getLink(this, linkNames, linkList, description);        if (!link.isEmpty())            emit showLink(link);    }    ui.listIndex->setCurrentIndex(indexModel->index(indexModel->stringList().indexOf(description)));    ui.listIndex->scrollTo(ui.listIndex->currentIndex(), QAbstractItemView::PositionAtTop);}void HelpDialog::searchInIndex(const QString &searchString){    QRegExp atoz(QLatin1String("[A-Z]"));    int matches = searchString.count(atoz);    if (matches > 0 && !searchString.contains(QLatin1String(".*")))    {        int start = 0;        QString newSearch;        for (; matches > 0; --matches) {            int match = searchString.indexOf(atoz, start+1);            if (match <= start)                continue;            newSearch += searchString.mid(start, match-start);            newSearch += QLatin1String(".*");            start = match;        }        newSearch += searchString.mid(start);        ui.listIndex->setCurrentIndex(indexModel->filter(newSearch, searchString));    }    else        ui.listIndex->setCurrentIndex(indexModel->filter(searchString, searchString));}QString HelpDialog::titleOfLink(const QString &link){    QString s = HelpDialog::removeAnchorFromLink(link);    s = titleMap[s];    if (s.isEmpty())        return link;    return s;}bool HelpDialog::eventFilter(QObject * o, QEvent * e){    if (o == ui.editIndex && e->type() == QEvent::KeyPress) {        switch (static_cast<QKeyEvent*>(e)->key()) {            case Qt::Key_Up:            case Qt::Key_Down:            case Qt::Key_PageDown:            case Qt::Key_PageUp:                QApplication::sendEvent(ui.listIndex, e);                break;            default:                break;        }    } else if (o == ui.listContents->viewport()) {        if (e->type() == QEvent::MouseButtonRelease) {            QMouseEvent *me = static_cast<QMouseEvent*>(e);            if (me->button() == Qt::LeftButton) {                QTreeWidgetItem *item = ui.listContents->itemAt(me->pos());                QRect vRect = ui.listContents->visualItemRect(item);                // only show topic if we clicked an item                if (item && vRect.contains(me->pos()))                    showTopic(item);            }        }    }    return QWidget::eventFilter(o, e);}void HelpDialog::addBookmark(){    if (!bookmarksInserted)        insertBookmarks();    QString link = help->browsers()->currentBrowser()->source().toString();    QString title = help->browsers()->currentBrowser()->documentTitle();    if (title.isEmpty())        title = titleOfLink(link);    QTreeWidgetItem *i = new QTreeWidgetItem(ui.listBookmarks, 0);    i->setText(0, title);    i->setData(0, LinkRole, link);    ui.buttonRemove->setEnabled(true);    saveBookmarks();    help->updateBookmarkMenu();}void HelpDialog::on_buttonAdd_clicked(){    addBookmark();}void HelpDialog::on_buttonRemove_clicked(){    if (!ui.listBookmarks->currentItem())        return;    delete ui.listBookmarks->currentItem();    saveBookmarks();    if (ui.listBookmarks->topLevelItemCount() != 0) {        ui.listBookmarks->setCurrentItem(ui.listBookmarks->topLevelItem(0));    }    ui.buttonRemove->setEnabled(ui.listBookmarks->topLevelItemCount() > 0);    help->updateBookmarkMenu();}void HelpDialog::insertBookmarks(){    if (bookmarksInserted)        return;    bookmarksInserted = true;    ui.listBookmarks->clear();    QFile f(cacheFilesPath + QDir::separator() + QLatin1String("bookmarks.")		+ Config::configuration()->profileName());    if (!f.open(QFile::ReadOnly))        return;    QTextStream ts(&f);    while (!ts.atEnd()) {        QTreeWidgetItem *i = new QTreeWidgetItem(ui.listBookmarks, 0);        i->setText(0, ts.readLine());        i->setData(0, LinkRole, ts.readLine());    }    ui.buttonRemove->setEnabled(ui.listBookmarks->topLevelItemCount() > 0);    help->updateBookmarkMenu();    showInitDoneMessage();}void HelpDialog::showBookmarkTopic(){    if (!ui.listBookmarks->currentItem())        return;    QTreeWidgetItem *i = (QTreeWidgetItem*)ui.listBookmarks->currentItem();    emit showLink(i->data(0, LinkRole).toString());}static void store(QTreeWidgetItem *i, QTextStream &ts){    ts << i->text(0) << endl;    ts << i->data(0, LinkRole).toString() << endl;    for (int index = 0; index < i->childCount(); ++index)        store(i->child(index), ts);}static void store(QTreeWidget *tw, QTextStream &ts){    for (int index = 0; index < tw->topLevelItemCount(); ++index)        store(tw->topLevelItem(index), ts);}void HelpDialog::saveBookmarks(){    QFile f(cacheFilesPath + QDir::separator() + QLatin1String("bookmarks.")		+ Config::configuration()->profileName());    if (!f.open(QFile::WriteOnly))        return;    QTextStream ts(&f);    store(ui.listBookmarks, ts);    f.close();}void HelpDialog::insertContents(){#ifdef Q_WS_MAC    static const QLatin1String IconPath(":/trolltech/assistant/images/win/book.png");#else    static const QLatin1String IconPath(":/trolltech/assistant/images/win/book.png");#endif    if (contentsInserted)        return;    if (contentList.isEmpty())        getAllContents();    contentsInserted = true;    ui.listContents->clear();    setCursor(Qt::WaitCursor);    if (!titleMapDone)        setupTitleMap();#if 0 // ### port me    ui.listContents->setSorting(-1);#endif    for (QList<QPair<QString, ContentList> >::Iterator it = contentList.begin(); it != contentList.end(); ++it) {        QTreeWidgetItem *newEntry;        QTreeWidgetItem *contentEntry;        QStack<QTreeWidgetItem*> stack;        stack.clear();        int depth = 0;        bool root = false;        QTreeWidgetItem *lastItem[64];        for (int j = 0; j < 64; ++j)            lastItem[j] = 0;        ContentList lst = (*it).second;        for (ContentList::ConstIterator it = lst.constBegin(); it != lst.constEnd(); ++it) {            ContentItem item = *it;            if (item.depth == 0) {                newEntry = new QTreeWidgetItem(ui.listContents, 0);                newEntry->setIcon(0, QIcon(IconPath));                newEntry->setText(0, item.title);                newEntry->setData(0, LinkRole, item.reference);                stack.push(newEntry);                depth = 1;                root = true;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?