Merge branch 'cache' into gui
[mdictionary] / trunk / src / base / gui / TranslationWidget.cpp
index e4e68bd..16216c2 100644 (file)
 //Created by Mateusz Półrola
 
 #include "TranslationWidget.h"
+#include "TranslationWidgetAutoResizer.h"
 #include <QDebug>
+#ifdef Q_WS_MAEMO_5
+    #include <QtGui/QX11Info>
+    #include <X11/Xlib.h>
+    #include <X11/Xatom.h>
+#endif
 
-TranslationWidget::TranslationWidget(Backbone *backbone, QWidget *parent):
-    QWidget(parent) {
+TranslationWidget::TranslationWidget(QWidget *parent):
+    QScrollArea(parent) {
 
-    this->backbone = backbone;
-
-    setAttribute(Qt::WA_Maemo5StackedWindow);
+    #ifdef Q_WS_MAEMO_5
+        setAttribute(Qt::WA_Maemo5StackedWindow);
+    #endif
     setWindowFlags(windowFlags() | Qt::Window);
 
     initializeUI();
+    //Q_INIT_RESOURCE(xslt);
+    setWindowTitle(tr("Translation"));
+
+    connect(textEdit, SIGNAL(search()),
+            this, SLOT(searchSelected()));
+
+}
+
+
+void TranslationWidget::show() {
+    QScrollArea::show();
 }
 
-void TranslationWidget::show(QModelIndex index) {
-    QWidget::show();
+void TranslationWidget::show(QStringList translations) {
+
+    showMaximized();
+
+    #ifdef Q_WS_MAEMO_5
+        if(!buttonsInitialized)
+            initButtons();
+    #endif
+
+    textEdit->clear();
+
+    QString trans;
+    QString t;
+    foreach(t, translations) {
+        trans += t + "\n";
+    }
+
+
+    trans=tr("<?xml version=\"1.0\" encoding=\"UTF-8\"?>") + tr("\n <ar>") + trans + tr("\n </ar>");
+//    trans.replace("&","&amp;");
+    trans=XslConversion(trans);
+    qDebug()<<trans;
+//    trans.replace("&amp;","&");
+    textEdit->insertHtml(trans);
+ //   textEdit->setPlainText(trans);
+
+    textEdit->repaint(this->rect());
+
+    update(this->rect());
+
+    emit updateSize();
+}
+
+QString TranslationWidget::XslConversion(QString translation)
+{
+    QXmlQuery myQuery(QXmlQuery::XSLT20);
+    myQuery.setFocus(translation);
+
+    QFile file(":/xsl/xsl.xsl");
+    if(!file.open(QFile::ReadOnly)){
+        qDebug()<<"can't open a xslt file";
+        return translation;
+    }
+    QString xslt;
+    xslt=file.readAll();
+    myQuery.setQuery(xslt);
+    QString result("");
+    myQuery.evaluateTo(&result);
+    return result;
+}
+
+
+#ifdef Q_WS_MAEMO_5
+void TranslationWidget::initButtons() {
+
+        int x = width() - showButtonsButton->sizeHint().width();
+        int y = height() - showButtonsButton->sizeHint().height();
+
+        showButtonsButton->move(QPoint(x,y));
+        showButtonsButton->show();
+//==================================================================
+
+        x = width() - zoomOutButton->sizeHint().width();
+        y = height() - 2*zoomOutButton->sizeHint().height();
+        zoomOutButton->move(QPoint(x, height()));
+
+        zoomOutButtonAnimation =
+                new QPropertyAnimation(zoomOutButton, "pos", this);
+
+        zoomOutButtonAnimation->setStartValue(QPoint(x, height()));
+        zoomOutButtonAnimation->setEndValue(QPoint(x,y));
+        zoomOutButtonAnimation->setDuration(200);
+        zoomOutButtonAnimation->setEasingCurve(QEasingCurve::InOutBack);
+//==================================================================
+        x = width() - zoomInButton->sizeHint().width();
+        y = height() - 3*zoomInButton->sizeHint().height();
+        zoomInButton->move(QPoint(x, height()));
+
+        zoomInButtonAnimation =
+                new QPropertyAnimation(zoomInButton, "pos", this);
+
+        zoomInButtonAnimation->setStartValue(QPoint(x, height()));
+        zoomInButtonAnimation->setEndValue(QPoint(x,y));
+        zoomInButtonAnimation->setDuration(400);
+        zoomInButtonAnimation->setEasingCurve(QEasingCurve::InOutBack);
+//==================================================================
+        x = 0;
+        y = height() - copyButton->sizeHint().height();
+
+        copyButton->move(QPoint(x, height()));
+
+        copyButtonAnimation =
+                new QPropertyAnimation(copyButton, "pos", this);
+
+        copyButtonAnimation->setStartValue(QPoint(x, height()));
+        copyButtonAnimation->setEndValue(QPoint(x,y));
+        copyButtonAnimation->setDuration(200);
+        copyButtonAnimation->setEasingCurve(QEasingCurve::InOutBack);
+//==================================================================
+        x = 0;
+        y = height() - 2*copyButton->sizeHint().height();
+
+        selectAllButton->move(QPoint(x, height()));
+
+        selectAllButtonAnimation =
+                new QPropertyAnimation(selectAllButton, "pos", this);
+
+        selectAllButtonAnimation->setStartValue(QPoint(x, height()));
+        selectAllButtonAnimation->setEndValue(QPoint(x,y));
+        selectAllButtonAnimation->setDuration(400);
+        selectAllButtonAnimation->setEasingCurve(QEasingCurve::InOutBack);
+//==================================================================
+        x = 0;
+        y = height() - 3*copyButton->sizeHint().height();
+
+        searchButton->move(QPoint(x, height()));
+
+        searchButtonAnimation =
+                new QPropertyAnimation(searchButton, "pos", this);
+
+        searchButtonAnimation->setStartValue(QPoint(x, height()));
+        searchButtonAnimation->setEndValue(QPoint(x,y));
+        searchButtonAnimation->setDuration(600);
+        searchButtonAnimation->setEasingCurve(QEasingCurve::InOutBack);
+//==================================================================
 
-    qDebug()<<index.model()->data(index);
+        buttonsAnimation = new QParallelAnimationGroup(this);
+        buttonsAnimation->addAnimation(zoomInButtonAnimation);
+        buttonsAnimation->addAnimation(zoomOutButtonAnimation);
+        buttonsAnimation->addAnimation(selectAllButtonAnimation);
+        buttonsAnimation->addAnimation(copyButtonAnimation);
+        buttonsAnimation->addAnimation(searchButtonAnimation);
+        buttonsInitialized = true;
+        buttonsVisible = false;
+
+        connect(showButtonsButton, SIGNAL(clicked()),
+                this, SLOT(showButtons()));
 }
+#endif
 
 void TranslationWidget::initializeUI() {
-    verticalLayout = new QVBoxLayout;
 
-    translationTextEdit = new QTextEdit;
+    textEdit = new TranslationTextEdit;
+    textEdit->setReadOnly(true);
+
+    resizer = new TranslationWidgetAutoResizer(textEdit);
+    connect(this, SIGNAL(updateSize()),
+            resizer, SLOT(textEditChanged()));
+
+    QWidget*w = new QWidget;
+    verticalLayout = new QVBoxLayout(w);
+    verticalLayout->addWidget(textEdit);
+
+    textEdit->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+    textEdit->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+
+
+    this->setWidget(w);
+    this->setWidgetResizable(true);
+
+
+    #ifdef Q_WS_MAEMO_5
+        zoomInButton = new QToolButton(this);
+        zoomInButton->setIcon(QIcon::fromTheme("pdf_zoomin"));
+        zoomInButton->setMinimumSize(zoomInButton->sizeHint());
+
+        zoomOutButton = new QToolButton(this);
+        zoomOutButton->setIcon(QIcon::fromTheme("pdf_zoomout"));
+        zoomOutButton->setMinimumSize(zoomOutButton->sizeHint());
+
+        selectAllButton = new QToolButton(this);
+        selectAllButton->setIcon(QIcon::fromTheme("pdf_zoomout"));
+        selectAllButton->setMinimumSize(selectAllButton->sizeHint());
+
+        copyButton = new QToolButton(this);
+        copyButton->setIcon(QIcon::fromTheme("general_notes"));
+        copyButton->setMinimumSize(copyButton->sizeHint());
+        copyButton->setEnabled(false);
+
+        searchButton = new QToolButton(this);
+        searchButton->setIcon(QIcon::fromTheme("general_search"));
+        searchButton->setMinimumSize(searchButton->sizeHint());
+        searchButton->setEnabled(false);
+
+        showButtonsButton = new QToolButton(this);
+        showButtonsButton->setArrowType(Qt::UpArrow);
+        showButtonsButton->setMinimumSize(searchButton->sizeHint());
+
+        connect(zoomInButton, SIGNAL(clicked()),
+                textEdit, SLOT(zoomIn()));
+
+        connect(zoomOutButton, SIGNAL(clicked()),
+                textEdit, SLOT(zoomOut()));
+
+
+        connect(searchButton, SIGNAL(clicked()),
+                this, SLOT(searchSelected()));
+
+        connect(copyButton, SIGNAL(clicked()),
+                textEdit, SLOT(copy()));
+
+        connect(textEdit, SIGNAL(copyAvailable(bool)),
+                searchButton, SLOT(setEnabled(bool)));
 
-    verticalLayout->addWidget(translationTextEdit);
+        connect(textEdit, SIGNAL(copyAvailable(bool)),
+                copyButton, SLOT(setEnabled(bool)));
 
-    setLayout(verticalLayout);
+        connect(selectAllButton, SIGNAL(clicked()),
+                textEdit, SLOT(selectAll()));
+
+        buttonsInitialized = false;
+
+
+
+        grabZoomKeys(true);
+    #endif
+}
+
+void TranslationWidget::searchSelected() {
+    #ifdef Q_WS_MAEMO_5
+        hide();
+    #endif
+    emit search(textEdit->textCursor().selectedText());
+}
+
+#ifdef Q_WS_MAEMO_5
+void TranslationWidget::showButtons() {
+    if(!buttonsVisible) {
+        buttonsAnimation->setDirection(QAbstractAnimation::Forward);
+        buttonsAnimation->start();
+        buttonsVisible = true;
+
+        showButtonsButton->setArrowType(Qt::DownArrow);
+    }
+    else if(buttonsVisible) {
+        buttonsAnimation->setDirection(QAbstractAnimation::Backward);
+        buttonsAnimation->start();
+        buttonsVisible = false;
+        showButtonsButton->setArrowType(Qt::UpArrow);
+    }
 }
 
+void TranslationWidget::grabZoomKeys(bool grab) {
+     if (!winId()) {
+         return;
+     }
+
+    unsigned long val = (grab) ? 1 : 0;
+    Atom atom = XInternAtom(QX11Info::display(),
+                            "_HILDON_ZOOM_KEY_ATOM", False);
+    if (!atom) {
+        return;
+    }
+
+    XChangeProperty (QX11Info::display(),
+         winId(),
+         atom,
+         XA_INTEGER,
+         32,
+         PropModeReplace,
+         reinterpret_cast<unsigned char *>(&val),
+         1);
+}
+
+void TranslationWidget::keyPressEvent(QKeyEvent* event) {
+    switch (event->key()) {
+        case Qt::Key_F7:
+        textEdit->zoomIn();
+        event->accept();
+        break;
+
+        case Qt::Key_F8:
+        textEdit->zoomOut();
+        event->accept();
+        break;
+    }
+    QWidget::keyPressEvent(event);
+}
+#endif
+
+
+