src/hbwidgets/editors/hbformatdialog.cpp
changeset 0 16d8024aca5e
child 1 f7ac710697a9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hbwidgets/editors/hbformatdialog.cpp	Mon Apr 19 14:02:13 2010 +0300
@@ -0,0 +1,400 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (developer.feedback@nokia.com)
+**
+** This file is part of the HbWidgets module of the UI Extensions for Mobile.
+**
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this file.
+** Please review the following information to ensure the GNU Lesser General
+** Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at developer.feedback@nokia.com.
+**
+****************************************************************************/
+#include "hbformatdialog.h"
+#include "hbformatdialog_p.h"
+
+#include <hbwidget.h>
+
+#include <hbpushbutton.h>
+#include <hbcombobox.h>
+#include <hbdialog.h>
+#include <hbcolordialog.h>
+#include <hbabstractedit.h>
+#include <hbabstractedit_p.h>
+#include <hbstyle.h>
+
+#include <QGraphicsItem>
+#include <QGraphicsGridLayout>
+#include <QTextListFormat>
+#include <QTextCharFormat>
+#include <QTextBlockFormat>
+#include <QTextList>
+
+/*!
+    \class HbFormatDialog
+    \brief HbFormatDialog is a text format dialog class for HbAbstractEdit based 
+    editors. It offers the default UI and basic formatting functions. This class 
+    can be customized by overloading the setContent and polish methods. Signals 
+    related to the format changes are sent from the editor.
+
+    HbFormatDialogPointer should be used as pointer to HbFormatDialog object.
+
+    @proto
+    @hbwidgets
+
+   Simplest way of using HbFormatDialog is like this:
+
+   \snippet{ultimatecodesnippet/ultimatecodesnippet.cpp,48}
+
+   Example of subclassing the HbFormatDialog class:
+   \snippet{ultimatecodesnippet/ultimatecodesnippet.cpp,49}
+
+   HbFormatDialog instance shared with many editors:
+   \snippet{ultimatecodesnippet/ultimatecodesnippet.cpp,50}
+ */
+
+/*!
+    Constructs a HbFormatDialog.
+ */
+HbFormatDialog::HbFormatDialog(QGraphicsItem *parent) : HbDialog(*new HbFormatDialogPrivate, parent)
+{}
+
+/*!
+    Destructor.
+*/
+HbFormatDialog::~HbFormatDialog()
+{}
+
+/*!
+    Launches a format dialog user interface for the \a editor.
+
+    \sa setContent
+ */
+void HbFormatDialog::launch(HbAbstractEdit *editor)
+{
+    Q_D(HbFormatDialog);
+
+    setFlag(QGraphicsItem::ItemIsMovable);       
+    setTimeout(HbPopup::NoTimeout);
+    setBackgroundFaded(false);
+
+    d->editor = editor;
+    if (editor) {
+        if (editor->textCursor().isNull())
+            return;
+        setContent(editor->textCursor());
+        show();
+    }
+}
+
+/*!
+    Sets and updates the content widget for the format dialog. This method can be overloaded. 
+ */
+void HbFormatDialog::setContent(QTextCursor cursor)
+{
+    Q_D(HbFormatDialog);
+
+    QTextCharFormat format = cursor.charFormat(); // current char format
+
+    // Set content
+    if (!contentWidget()) {
+        HbWidget *container = new HbWidget;
+
+        d->layout = new QGraphicsGridLayout();
+
+        d->comboSize = new HbComboBox(container);
+        d->comboSize->addItem ("8");
+        d->comboSize->addItem ("9");
+        d->comboSize->addItem ("10");
+        d->comboSize->addItem ("11");
+        d->comboSize->addItem ("12");
+        d->comboSize->addItem ("14");
+        d->comboSize->addItem ("16");
+        d->comboSize->addItem ("18");
+        d->comboSize->addItem ("20");
+        d->comboSize->addItem ("22");
+        d->comboSize->addItem ("24");
+        d->comboSize->addItem ("26");
+        d->comboSize->addItem ("28");
+        d->comboSize->addItem ("36");
+        d->comboSize->addItem ("48");
+        d->comboSize->addItem ("72");
+        connect(d->comboSize, SIGNAL(currentIndexChanged(const QString &)), SLOT(setFontPointSize(const QString &)));
+        d->layout->addItem(d->comboSize, 0, 0, 1, 3);
+
+        d->buttonColor = new HbPushButton(container);
+        connect(d->buttonColor, SIGNAL(clicked()), SLOT(_q_setColor()));
+        d->layout->addItem(d->buttonColor, 0, 3, 1, 1);
+
+        d->buttonAlignLeft = new HbPushButton(container);
+        d->buttonAlignLeft->setIcon(HbIcon("qtg_mono_text_align_left.svg"));
+        d->buttonAlignLeft->setCheckable(true);
+        connect(d->buttonAlignLeft, SIGNAL(toggled(bool)), SLOT(setAlignmentLeft(bool))); 
+        connect(d->buttonAlignLeft, SIGNAL(toggled(bool)), SLOT(_q_setAlignment(bool))); 
+        d->layout->addItem(d->buttonAlignLeft, 1, 0);
+
+        d->buttonAlignCenter = new HbPushButton(container);
+        d->buttonAlignCenter->setIcon(HbIcon("qtg_mono_text_align_center.svg"));
+        d->buttonAlignCenter->setCheckable(true);
+        connect(d->buttonAlignCenter, SIGNAL(toggled(bool)), SLOT(setAlignmentCenter(bool)));
+        connect(d->buttonAlignCenter, SIGNAL(toggled(bool)), SLOT(_q_setAlignment(bool)));
+        d->layout->addItem(d->buttonAlignCenter, 1, 1);
+
+        d->buttonAlignRight = new HbPushButton(container);
+        d->buttonAlignRight->setIcon(HbIcon("qtg_mono_text_align_right.svg"));
+        d->buttonAlignRight->setCheckable(true);
+        connect(d->buttonAlignRight, SIGNAL(toggled(bool)), SLOT(setAlignmentRight(bool)));
+        connect(d->buttonAlignRight, SIGNAL(toggled(bool)), SLOT(_q_setAlignment(bool)));
+        d->layout->addItem(d->buttonAlignRight, 1, 2);
+
+        d->buttonAlignJustify = new HbPushButton(container);
+        d->buttonAlignJustify->setIcon(HbIcon("qtg_mono_text_align_justify.svg"));
+        d->buttonAlignJustify->setCheckable(true);
+        connect(d->buttonAlignJustify, SIGNAL(toggled(bool)), SLOT(setAlignmentJustify(bool)));
+        connect(d->buttonAlignJustify, SIGNAL(toggled(bool)), SLOT(_q_setAlignment(bool)));
+        d->layout->addItem(d->buttonAlignJustify, 1, 3);
+
+        d->buttonBold = new HbPushButton(container);
+        d->buttonBold->setIcon(HbIcon("qtg_mono_bold.svg")); 
+        d->buttonBold->setCheckable(true);
+        connect(d->buttonBold, SIGNAL(toggled(bool)), SLOT(setStyleBold(bool)));
+        d->layout->addItem(d->buttonBold, 2, 0);
+
+        d->buttonItalic = new HbPushButton(container);
+        d->buttonItalic->setIcon(HbIcon("qtg_mono_italic.svg"));
+        d->buttonItalic->setCheckable(true);
+        connect(d->buttonItalic, SIGNAL(toggled(bool)), SLOT(setStyleItalic(bool)));
+        d->layout->addItem(d->buttonItalic, 2, 1);
+
+        d->buttonUnderline = new HbPushButton(container);
+        d->buttonUnderline->setIcon(HbIcon("qtg_mono_underline.svg"));
+        d->buttonUnderline->setCheckable(true);
+        connect(d->buttonUnderline, SIGNAL(toggled(bool)), SLOT(setStyleUnderline(bool)));
+        d->layout->addItem(d->buttonUnderline, 2, 2);
+
+        d->buttonBullet = new HbPushButton(container);
+        d->buttonBullet->setIcon(HbIcon("qtg_mono_bullet.svg"));
+        d->buttonBullet->setCheckable(true);
+        connect(d->buttonBullet, SIGNAL(toggled(bool)), SLOT(setStyleBullet(bool)));
+        d->layout->addItem(d->buttonBullet, 2, 3);
+
+        container->setLayout(d->layout);
+
+        setContentWidget(container);
+    }
+
+    // Update content
+    d->comboSize->setCurrentIndex(d->comboSize->findText(QString::number(format.font().pointSize())));
+
+    d->colorChanged(format.foreground().color());
+
+    d->buttonAlignLeft->setChecked(cursor.blockFormat().alignment() == Qt::AlignLeft);
+    d->buttonAlignCenter->setChecked(cursor.blockFormat().alignment() == Qt::AlignCenter);
+    d->buttonAlignRight->setChecked(cursor.blockFormat().alignment() == Qt::AlignRight);
+    d->buttonAlignJustify->setChecked(cursor.blockFormat().alignment() == Qt::AlignJustify);
+
+    d->buttonBold->setChecked(format.font().bold());
+    d->buttonItalic->setChecked(format.font().italic());
+    d->buttonUnderline->setChecked(format.font().underline());
+    if (cursor.currentList()) {
+        d->buttonBullet->setChecked(cursor.currentList()->format().style() == QTextListFormat::ListDisc);
+    }
+}
+
+/*!
+    \reimp
+ */
+void HbFormatDialog::polish(HbStyleParameters& params)
+{
+    Q_D(HbFormatDialog);
+
+    params.addParameter("button-width");
+    params.addParameter("button-height");
+    params.addParameter("popup-margin");
+    params.addParameter("vertical-middle-margin");
+    params.addParameter("horizontal-middle-margin");
+    HbDialog::polish( params );
+
+    qreal buttonWidth = params.value("button-width").toDouble();
+    qreal buttonHeight = params.value("button-height").toDouble();
+    d->buttonColor->setMinimumSize(buttonWidth, buttonHeight);
+    d->buttonAlignLeft->setMinimumSize(buttonWidth, buttonHeight);
+    d->buttonAlignCenter->setMinimumSize(buttonWidth, buttonHeight);
+    d->buttonAlignRight->setMinimumSize(buttonWidth, buttonHeight);
+    d->buttonAlignJustify->setMinimumSize(buttonWidth, buttonHeight);
+    d->buttonBold->setMinimumSize(buttonWidth, buttonHeight);
+    d->buttonItalic->setMinimumSize(buttonWidth, buttonHeight);
+    d->buttonUnderline->setMinimumSize(buttonWidth, buttonHeight);
+    d->buttonBullet->setMinimumSize(buttonWidth, buttonHeight);
+
+    qreal popupMargin = params.value("popup-margin").toDouble();
+    setContentsMargins(popupMargin, popupMargin, popupMargin, popupMargin);
+
+    d->layout->setVerticalSpacing(params.value("vertical-middle-margin").toDouble());
+    d->layout->setHorizontalSpacing(params.value("horizontal-middle-margin").toDouble());
+}
+
+/*!
+   Merges new format for a selection, word under cursor or new chars after cursor position 
+ */
+void HbFormatDialog::mergeCharFormat(const QTextCharFormat &format)
+{
+    Q_D(HbFormatDialog);
+
+    QTextCursor cursor = d->editor->textCursor();
+    if (cursor.hasSelection()) {
+        cursor.mergeCharFormat(format);
+    } else {
+        int position = cursor.position();
+        QChar currentChar = cursor.document()->characterAt(position);
+        cursor.select(QTextCursor::WordUnderCursor);
+        int selectionStart = cursor.selectionStart();
+        int selectionEnd = cursor.selectionEnd();
+        if (position == selectionStart || position == selectionEnd || currentChar.isSpace()) {
+            HbAbstractEditPrivate::d_ptr(d->editor)->nextCharCursor.mergeCharFormat(format);
+        } else {
+            cursor.mergeCharFormat(format); 
+        }
+    }
+}
+
+/*!
+   Sets font size as \a size for a selection, word under cursor or new chars after cursor position 
+ */
+void HbFormatDialog::setFontPointSize(const QString &size)
+{
+    Q_D(HbFormatDialog);
+
+    qreal pointSize = size.toFloat();
+    QTextCursor cursor = d->editor->textCursor();
+    if (pointSize != cursor.charFormat().font().pointSize()) {
+        if (pointSize > 0) {
+            QTextCharFormat fmt;
+            fmt.setFontPointSize(pointSize);
+            mergeCharFormat(fmt);
+        }
+    }
+}
+
+/*!
+   Sets or removes bullets for the selected paragraphs or a paragraph containing cursor.
+ */
+void HbFormatDialog::setStyleBullet(bool toggled)
+{
+    Q_D(HbFormatDialog);
+
+    QTextCursor cursor = d->editor->textCursor();
+    QTextListFormat::Style style;
+    if (toggled) {
+        style = QTextListFormat::ListDisc;
+    } else {
+        style = QTextListFormat::ListStyleUndefined;
+    }
+    QTextBlockFormat blockFmt;
+    cursor.beginEditBlock();
+    blockFmt = cursor.blockFormat();
+    QTextListFormat listFmt;
+    int indent = blockFmt.indent() + 1;
+    if (cursor.currentList()) {
+        listFmt = cursor.currentList()->format();
+        if (!toggled)
+            indent = 0;
+     } else {
+        blockFmt.setIndent(0);
+        cursor.setBlockFormat(blockFmt);
+    }
+    listFmt.setIndent(indent);
+    listFmt.setStyle(style);
+    cursor.createList(listFmt);
+    cursor.endEditBlock();
+}
+
+/*!
+   Sets alignment to left for the selected paragraphs or a paragraph containing cursor.
+ */
+void HbFormatDialog::setAlignmentLeft(bool toggled)
+{
+    Q_D(HbFormatDialog);
+
+    if (toggled) {
+        d->setAlignment(Qt::AlignLeft);
+    }
+}
+
+/*!
+   Sets alignment to center for the selected paragraphs or a paragraph containing cursor.
+ */
+void HbFormatDialog::setAlignmentCenter(bool toggled)
+{
+    Q_D(HbFormatDialog);
+
+    if (toggled) {
+        d->setAlignment(Qt::AlignCenter);
+    }
+}
+
+/*!
+   Sets alignment to right for the selected paragraphs or a paragraph containing cursor.
+ */
+void HbFormatDialog::setAlignmentRight(bool toggled)
+{
+    Q_D(HbFormatDialog);
+
+    if (toggled) {
+        d->setAlignment(Qt::AlignRight);
+    }
+}
+
+/*!
+   Sets alignment to justify for the selected paragraphs or a paragraph containing cursor.
+ */
+void HbFormatDialog::setAlignmentJustify(bool toggled)
+{
+    Q_D(HbFormatDialog);
+
+    if (toggled) {
+        d->setAlignment(Qt::AlignJustify);
+    }
+}
+
+/*!
+   Sets text bold for a selection, word under cursor or new chars after cursor position 
+ */
+void HbFormatDialog::setStyleBold(bool toggled)
+{
+    QTextCharFormat fmt;
+    fmt.setFontWeight(toggled ? QFont::Bold : QFont::Normal);
+    mergeCharFormat(fmt);
+}
+
+/*!
+   Sets text italic for a selection, word under cursor or new chars after cursor position 
+ */
+void HbFormatDialog::setStyleItalic(bool toggled)
+{
+    QTextCharFormat fmt;
+    fmt.setFontItalic(toggled);
+    mergeCharFormat(fmt);
+}
+
+/*!
+   Sets text underlined for a selection, word under cursor or new chars after cursor position 
+ */
+void HbFormatDialog::setStyleUnderline(bool toggled)
+{
+    QTextCharFormat fmt;
+    fmt.setFontUnderline(toggled);
+    mergeCharFormat(fmt);
+}