19#include <QDomDocument>
22#define LEFT_PANE_INDEX 0
24#define MINIMUM_PANE_SIZE 1
27#define ELEMENT_CONTENTS "Contents"
28#define ELEMENT_TOPIC "Topic"
29#define ATTRIBUTE_TOPIC_ID "id"
30#define ATTRIBUTE_TOPIC_HTML "html"
31#define ATTRIBUTE_TOPIC_NAME "name"
32#define ATTRIBUTE_TOPIC_SECTION "section"
35#define ROLE_TOPIC_ID Qt::UserRole
36#define ROLE_TOPIC_QRC_PATH (Qt::UserRole+1)
48 ui.actionHome->setShortcut(QString(
"Shift+Ctrl+H"));
52 ui.actionClose->setShortcut(QString(
"Esc"));
56 ui.frmFind->setHidden(
true);
63 ui.splitter->setSizes(sizes);
75 connect(
ui.actionHome, SIGNAL(triggered()),
ui.txtBrowser, SLOT(home()));
76 connect(
ui.actionBack, SIGNAL(triggered()),
ui.txtBrowser, SLOT(backward()));
77 connect(
ui.actionForward, SIGNAL(triggered()),
ui.txtBrowser, SLOT(forward()));
78 connect(
ui.txtBrowser, SIGNAL(backwardAvailable(
bool)),
79 ui.actionBack, SLOT(setEnabled(
bool)));
80 connect(
ui.txtBrowser, SIGNAL(forwardAvailable(
bool)),
81 ui.actionForward, SLOT(setEnabled(
bool)));
90 ui.treeContents->setCurrentItem(
ui.treeContents->topLevelItem(0));
91 ui.treeContents->setItemExpanded(
ui.treeContents->topLevelItem(0),
true);
98 ui.retranslateUi(
this);
99 ui.treeContents->clear();
101 ui.treeContents->setItemExpanded(
ui.treeContents->topLevelItem(0),
true);
102 ui.treeContents->setCurrentItem(
ui.treeContents->topLevelItem(0));
103 ui.treeContents->setItemExpanded(
ui.treeContents->topLevelItem(0),
true);
112 if (!QDir(
":/help/" + lang).exists())
123 QDomDocument document;
126 if (!document.setContent(&file,
true, &errorString)) {
127 ui.txtBrowser->setPlainText(tr(
"Error Loading Help Contents: ")+errorString);
132 ui.txtBrowser->setPlainText(tr(
"Error Loading Help Contents: ")+errorString);
142 QDomElement root = document->documentElement();
144 errorString = tr(
"Supplied XML file is not a valid Contents document.");
151 ui.treeContents->addTopLevelItem(home);
155 while (!child.isNull()) {
165 QTreeWidgetItem *parent)
176 QDomElement child = topicElement.firstChildElement(
ELEMENT_TOPIC);
177 while (!child.isNull()) {
209 QTreeWidgetItem *parent)
211 QTreeWidgetItem *topic =
new QTreeWidgetItem(parent);
214 topic->setText(0, label);
215 topic->setToolTip(0, label);
226 QList<QTreeWidgetItem *> selected =
ui.treeSearch->selectedItems();
228 if (!selected.isEmpty()) {
229 ui.treeSearch->setItemSelected(selected[0],
false);
238 QList<QTreeWidgetItem *> selected =
ui.treeContents->selectedItems();
240 if (!selected.isEmpty()) {
241 ui.treeContents->setItemSelected(selected[0],
false);
249 QTextDocument::FindFlags flags = QTextDocument::FindWholeWords;
250 found =
ui.txtBrowser->document()->find(
_lastSearch, 0, flags);
251 if (!found.isNull()) {
252 ui.txtBrowser->setTextCursor(found);
262 ui.txtBrowser->setSource(QUrl(current->data(0,
278 QString subtopic = topic.mid(0, topic.indexOf(
".")).toLower();
281 for (
int i = 0;
i < startItem->childCount();
i++) {
282 QTreeWidgetItem *item = startItem->child(
i);
284 if (subtopic == item->data(0,
ROLE_TOPIC_ID).toString().toLower()) {
286 ui.treeContents->setItemExpanded(item,
true);
287 if (!topic.contains(
".")) {
304 QTreeWidgetItem *item =
306 QTreeWidgetItem *selected = 0;
311 if (
ui.treeContents->selectedItems().size()) {
312 selected =
ui.treeContents->selectedItems()[0];
314 ui.treeContents->setItemSelected(selected,
false);
316 ui.treeContents->setItemExpanded(
ui.treeContents->topLevelItem(0),
true);
317 ui.treeContents->setItemSelected(item,
true);
344 if (
ui.lineFind->text().isEmpty()) {
348 QTextDocument::FindFlags flags = 0;
349 QTextCursor cursor =
ui.txtBrowser->textCursor();
350 QString searchPhrase =
ui.lineFind->text();
353 this->statusBar()->clearMessage();
357 flags |= QTextDocument::FindBackward;
359 if (
ui.chkbxMatchCase->isChecked()) {
360 flags |= QTextDocument::FindCaseSensitively;
362 if (
ui.chkbxWholePhrase->isChecked()) {
363 flags |= QTextDocument::FindWholeWords;
373 if (!cursor.hasSelection()) {
375 cursor.movePosition(QTextCursor::Start);
377 cursor.movePosition(QTextCursor::End);
379 ui.txtBrowser->setTextCursor(cursor);
384 found =
ui.txtBrowser->document()->find(searchPhrase, cursor, flags);
387 if (!found.isNull()) {
388 ui.txtBrowser->setTextCursor(found);
393 this->statusBar()->showMessage(tr(
"Search reached end of document"));
395 this->statusBar()->showMessage(tr(
"Search reached start of document"));
397 this->statusBar()->showMessage(tr(
"Text not found in document"));
413 ui.treeSearch->clear();
416 if (
ui.lineSearch->text().isEmpty()) {
422 QTextDocument::FindFlags flags = QTextDocument::FindWholeWords;
432 found = browser.document()->find(
ui.lineSearch->text(), 0, flags);
435 if (!found.isNull()) {
441 this->statusBar()->showMessage(tr(
"Found %1 results")
442 .arg(
ui.treeSearch->topLevelItemCount()));
454 if (!topic.isEmpty()) {
#define ATTRIBUTE_TOPIC_HTML
#define ATTRIBUTE_TOPIC_NAME
#define ATTRIBUTE_TOPIC_SECTION
#define ROLE_TOPIC_QRC_PATH
#define ATTRIBUTE_TOPIC_ID
#define MINIMUM_PANE_SIZE
stop errmsg connect(const QHostAddress &address, quint16 port)
QList< QDomElement > _elementList
void contentsItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *prev)
void showTopic(QString topic)
virtual void retranslateUi()
QString getResourcePath(const QDomElement &topicElement)
QTreeWidgetItem * createTopicTreeItem(const QDomElement &topicElement, QTreeWidgetItem *parent)
void loadContentsFromXml(QString xmlFile)
QTreeWidgetItem * findTopicItem(QTreeWidgetItem *startItem, QString topic)
HelpBrowser(QWidget *parent=0)
void currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *prev)
bool loadContents(const QDomDocument *document, QString &errorString)
void parseHelpTopic(const QDomElement &element, QTreeWidgetItem *parent)
bool isValidTopicElement(const QDomElement &topicElement)
void searchItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *prev)
virtual void setSource(const QUrl &url)
static void createShortcut(const QKeySequence &key, QWidget *sender, QObject *receiver, const char *slot)
static QString language()
virtual void showWindow()