70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync/* $Id$ */
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync/** @file
d34409ad02ea0d28e08a6c4b089a412fdb3b4c9cvboxsync * VBox Qt GUI - VirtualBox Qt extensions: QIRichTextLabel class implementation.
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync */
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync/*
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync * Copyright (C) 2012 Oracle Corporation
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync *
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync * available from http://www.virtualbox.org. This file is free software;
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync * you can redistribute it and/or modify it under the terms of the GNU
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync * General Public License (GPL) as published by the Free Software
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync */
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync
a9b62afc62b28da7a1a77f34259f8013892d9664vboxsync#ifdef VBOX_WITH_PRECOMPILED_HEADERS
a9b62afc62b28da7a1a77f34259f8013892d9664vboxsync# include <precomp.h>
a9b62afc62b28da7a1a77f34259f8013892d9664vboxsync#else /* !VBOX_WITH_PRECOMPILED_HEADERS */
a9b62afc62b28da7a1a77f34259f8013892d9664vboxsync
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync/* Global includes: */
a9b62afc62b28da7a1a77f34259f8013892d9664vboxsync# include <QVBoxLayout>
a9b62afc62b28da7a1a77f34259f8013892d9664vboxsync# include <QUrl>
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync/* Local includes: */
a9b62afc62b28da7a1a77f34259f8013892d9664vboxsync# include "QIRichTextLabel.h"
a9b62afc62b28da7a1a77f34259f8013892d9664vboxsync
a9b62afc62b28da7a1a77f34259f8013892d9664vboxsync#endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
a9b62afc62b28da7a1a77f34259f8013892d9664vboxsync
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync/* Constructor: */
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsyncQIRichTextLabel::QIRichTextLabel(QWidget *pParent)
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync : QWidget(pParent)
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync , m_pTextEdit(new QTextEdit(this))
cc160154983fdb816d385031bc2b50b2433ea855vboxsync , m_iMinimumTextWidth(0)
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync{
cc160154983fdb816d385031bc2b50b2433ea855vboxsync /* Setup self: */
cc160154983fdb816d385031bc2b50b2433ea855vboxsync setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
35b2796df95e871101bebb55b92df1080532166dvboxsync
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync /* Setup text-edit: */
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync m_pTextEdit->setReadOnly(true);
cc160154983fdb816d385031bc2b50b2433ea855vboxsync m_pTextEdit->setFocusPolicy(Qt::NoFocus);
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync m_pTextEdit->setFrameShape(QFrame::NoFrame);
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync m_pTextEdit->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync m_pTextEdit->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
35b2796df95e871101bebb55b92df1080532166dvboxsync
35b2796df95e871101bebb55b92df1080532166dvboxsync /* Tune text-edit viewport palette: */
35b2796df95e871101bebb55b92df1080532166dvboxsync m_pTextEdit->viewport()->setAutoFillBackground(false);
35b2796df95e871101bebb55b92df1080532166dvboxsync QPalette pal = m_pTextEdit->viewport()->palette();
35b2796df95e871101bebb55b92df1080532166dvboxsync pal.setColor(QPalette::Active, QPalette::Text, pal.color(QPalette::Active, QPalette::WindowText));
35b2796df95e871101bebb55b92df1080532166dvboxsync pal.setColor(QPalette::Inactive, QPalette::Text, pal.color(QPalette::Inactive, QPalette::WindowText));
35b2796df95e871101bebb55b92df1080532166dvboxsync pal.setColor(QPalette::Disabled, QPalette::Text, pal.color(QPalette::Disabled, QPalette::WindowText));
35b2796df95e871101bebb55b92df1080532166dvboxsync m_pTextEdit->viewport()->setPalette(pal);
35b2796df95e871101bebb55b92df1080532166dvboxsync
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync /* Add into parent: */
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync QVBoxLayout *pMainLayout = new QVBoxLayout(this);
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync pMainLayout->setMargin(0);
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync pMainLayout->addWidget(m_pTextEdit);
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync}
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync
cc160154983fdb816d385031bc2b50b2433ea855vboxsync/* Text getter: */
cc160154983fdb816d385031bc2b50b2433ea855vboxsyncQString QIRichTextLabel::text() const
cc160154983fdb816d385031bc2b50b2433ea855vboxsync{
cc160154983fdb816d385031bc2b50b2433ea855vboxsync return m_pTextEdit->toHtml();
cc160154983fdb816d385031bc2b50b2433ea855vboxsync}
cc160154983fdb816d385031bc2b50b2433ea855vboxsync
b1e7bd9b836768429ce3f7df78cddecbcccf439evboxsync/* Register image: */
b1e7bd9b836768429ce3f7df78cddecbcccf439evboxsyncvoid QIRichTextLabel::registerImage(const QImage &image, const QString &strName)
b1e7bd9b836768429ce3f7df78cddecbcccf439evboxsync{
b1e7bd9b836768429ce3f7df78cddecbcccf439evboxsync /* Register passed image in internal text-document: */
b1e7bd9b836768429ce3f7df78cddecbcccf439evboxsync m_pTextEdit->document()->addResource(QTextDocument::ImageResource, QUrl(strName), QVariant(image));
b1e7bd9b836768429ce3f7df78cddecbcccf439evboxsync}
b1e7bd9b836768429ce3f7df78cddecbcccf439evboxsync
0e80eb5bf89bace5dd7e15be7c6f1a204ae79f91vboxsync/* Word-wrap mode getter: */
0e80eb5bf89bace5dd7e15be7c6f1a204ae79f91vboxsyncQTextOption::WrapMode QIRichTextLabel::wordWrapMode() const
0e80eb5bf89bace5dd7e15be7c6f1a204ae79f91vboxsync{
0e80eb5bf89bace5dd7e15be7c6f1a204ae79f91vboxsync return m_pTextEdit->wordWrapMode();
0e80eb5bf89bace5dd7e15be7c6f1a204ae79f91vboxsync}
0e80eb5bf89bace5dd7e15be7c6f1a204ae79f91vboxsync
0e80eb5bf89bace5dd7e15be7c6f1a204ae79f91vboxsync/* Word-wrap mode setter: */
0e80eb5bf89bace5dd7e15be7c6f1a204ae79f91vboxsyncvoid QIRichTextLabel::setWordWrapMode(QTextOption::WrapMode policy)
0e80eb5bf89bace5dd7e15be7c6f1a204ae79f91vboxsync{
0e80eb5bf89bace5dd7e15be7c6f1a204ae79f91vboxsync m_pTextEdit->setWordWrapMode(policy);
0e80eb5bf89bace5dd7e15be7c6f1a204ae79f91vboxsync}
0e80eb5bf89bace5dd7e15be7c6f1a204ae79f91vboxsync
609611925b20335313ed4b8fe0bb88d7fdc9d10avboxsync/* API: Event-filter setter: */
609611925b20335313ed4b8fe0bb88d7fdc9d10avboxsyncvoid QIRichTextLabel::installEventFilter(QObject *pFilterObj)
609611925b20335313ed4b8fe0bb88d7fdc9d10avboxsync{
609611925b20335313ed4b8fe0bb88d7fdc9d10avboxsync QWidget::installEventFilter(pFilterObj);
609611925b20335313ed4b8fe0bb88d7fdc9d10avboxsync m_pTextEdit->installEventFilter(pFilterObj);
609611925b20335313ed4b8fe0bb88d7fdc9d10avboxsync}
609611925b20335313ed4b8fe0bb88d7fdc9d10avboxsync
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync/* Minimum text-width setter: */
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsyncvoid QIRichTextLabel::setMinimumTextWidth(int iMinimumTextWidth)
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync{
cc160154983fdb816d385031bc2b50b2433ea855vboxsync /* Remember minimum text width: */
cc160154983fdb816d385031bc2b50b2433ea855vboxsync m_iMinimumTextWidth = iMinimumTextWidth;
cc160154983fdb816d385031bc2b50b2433ea855vboxsync
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync /* Get corresponding QTextDocument: */
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync QTextDocument *pTextDocument = m_pTextEdit->document();
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync /* Bug in QTextDocument (?) : setTextWidth doesn't work from the first time. */
cc160154983fdb816d385031bc2b50b2433ea855vboxsync for (int iTry = 0; pTextDocument->textWidth() != m_iMinimumTextWidth && iTry < 3; ++iTry)
cc160154983fdb816d385031bc2b50b2433ea855vboxsync pTextDocument->setTextWidth(m_iMinimumTextWidth);
cc160154983fdb816d385031bc2b50b2433ea855vboxsync /* Get corresponding QTextDocument size: */
cc160154983fdb816d385031bc2b50b2433ea855vboxsync QSize size = pTextDocument->size().toSize();
cc160154983fdb816d385031bc2b50b2433ea855vboxsync
cc160154983fdb816d385031bc2b50b2433ea855vboxsync /* Resize to content size: */
cc160154983fdb816d385031bc2b50b2433ea855vboxsync m_pTextEdit->setMinimumSize(size);
cc160154983fdb816d385031bc2b50b2433ea855vboxsync layout()->activate();
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync}
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync/* Text setter: */
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsyncvoid QIRichTextLabel::setText(const QString &strText)
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync{
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync /* Set text: */
cc160154983fdb816d385031bc2b50b2433ea855vboxsync m_pTextEdit->setHtml(strText);
cc160154983fdb816d385031bc2b50b2433ea855vboxsync
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync /* Get corresponding QTextDocument: */
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync QTextDocument *pTextDocument = m_pTextEdit->document();
cc160154983fdb816d385031bc2b50b2433ea855vboxsync /* Adjust text-edit size: */
cc160154983fdb816d385031bc2b50b2433ea855vboxsync pTextDocument->adjustSize();
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync /* Get corresponding QTextDocument size: */
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync QSize size = pTextDocument->size().toSize();
cc160154983fdb816d385031bc2b50b2433ea855vboxsync
cc160154983fdb816d385031bc2b50b2433ea855vboxsync /* Set minimum text width to corresponding value: */
cc160154983fdb816d385031bc2b50b2433ea855vboxsync setMinimumTextWidth(m_iMinimumTextWidth == 0 ? size.width() : m_iMinimumTextWidth);
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync}
70b7f4772418e18c9c140e0656cad6f4cdda7527vboxsync