diff -r 6a20128ce557 -r ebfee66fde93 messagingapp/msgui/unifiedviewer/src/univiewerbodywidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgui/unifiedviewer/src/univiewerbodywidget.cpp Fri Jun 04 10:25:39 2010 +0100 @@ -0,0 +1,512 @@ +/* + * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: This widget displays the body of the viewer + * + */ + +#include "univiewerbodywidget.h" + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include "univiewertextitem.h" +#include "univiewerpixmapwidget.h" +#include "msgmediautil.h" +// LOCAL CONSTANTS +const QString AUDIO_ICON("qtg_mono_audio"); + +// Localization +#define LOC_TITLE hbTrId("txt_messaging_title_messaging") +#define LOC_OPEN hbTrId("txt_common_menu_open") +#define LOC_SAVE hbTrId("txt_common_menu_save") + +//--------------------------------------------------------------- +//UniViewerBodyWidget::UniViewerBodyWidget +// @see header file +//--------------------------------------------------------------- +UniViewerBodyWidget::UniViewerBodyWidget(QGraphicsItem *parent) : + HbWidget(parent), mHasText(false), mHasPixmap(false), mTextItem(0), mSlideCounter(0), + mPixmapItem(0), mAudioItem(0) +{ + this->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed); + // Signal mapper for opening media files + mSignalMapper = new QSignalMapper(this); + connect(mSignalMapper, SIGNAL(mapped(const QString &)), this, SLOT(openMedia(const QString &))); +} + +//--------------------------------------------------------------- +//UniViewerBodyWidget::~UniViewerBodyWidget +// @see header file +//--------------------------------------------------------------- +UniViewerBodyWidget::~UniViewerBodyWidget() +{ +} + +//--------------------------------------------------------------- +//UniViewerBodyWidget::setImage +// @see header file +//--------------------------------------------------------------- +void UniViewerBodyWidget::setPixmap(QString pixmapFile) +{ + setHasPixmap(true); + //create image item instance + if (!mPixmapItem) { + mPixmapItem = new UniViewerPixmapWidget(this); + HbStyle::setItemName(mPixmapItem, "pixmap"); + connect(mPixmapItem, SIGNAL(shortTap(QString)), this, SLOT(openMedia(QString))); + } + + mPixmapItem->hide(); + mPixmapItem->setPixmap(pixmapFile); + + this->repolish(); +} + +//--------------------------------------------------------------- +//UniViewerBodyWidget::setAudio +// @see header file +//--------------------------------------------------------------- +void UniViewerBodyWidget::setAudio(QString audiofile) +{ + if (!mAudioItem) { + mAudioItem = new HbPushButton(this); + HbStyle::setItemName(mAudioItem, "audioItem"); + } + mAudioItem->hide(); + QFileInfo fileInfo(audiofile); + mAudioItem->setIcon(HbIcon(AUDIO_ICON)); + mAudioItem->setText(fileInfo.baseName()); + MsgMediaUtil mediaUtil; + mAudioItem->setAdditionalText(mediaUtil.mediaDuration(audiofile)); + mAudioItem->setTextAlignment(Qt::AlignLeft); + + // Connect to signal mapper with file name + mSignalMapper->setMapping(mAudioItem, audiofile); + connect(mAudioItem, SIGNAL(clicked()), mSignalMapper, SLOT(map())); + + this->repolish(); +} + +//--------------------------------------------------------------- +//UniViewerBodyWidget::setVideo +// @see header file +//--------------------------------------------------------------- +void UniViewerBodyWidget::setVideo(QString videofile) +{ + Q_UNUSED(videofile) +} + +//--------------------------------------------------------------- +//UniViewerBodyWidget::setTextContent +// @see header file +//--------------------------------------------------------------- +void UniViewerBodyWidget::setTextContent(QString text) +{ + setHasText(true); + + if (!mTextItem) { + mTextItem = new UniViewerTextItem(this); + HbStyle::setItemName(mTextItem, "textItem"); + connect(mTextItem, SIGNAL(sendMessage(const QString&)), this, + SIGNAL(sendMessage(const QString&))); + } + mTextItem->hide(); + text.replace(QChar::ParagraphSeparator, QChar::LineSeparator); + text.replace('\r', QChar::LineSeparator); + mTextItem->setText(text); + this->repolish(); +} + +//--------------------------------------------------------------- +//UniViewerBodyWidget::setTextContent +// @see header file +//--------------------------------------------------------------- +void UniViewerBodyWidget::setSlideCounter(QString &slideCounter) +{ + if (!mSlideCounter) { + mSlideCounter = new HbTextItem(this); + HbStyle::setItemName(mSlideCounter, "slideCounter"); + } + + mSlideCounter->hide(); + mSlideCounter->setText(slideCounter); + this->repolish(); +} + +//--------------------------------------------------------------- +// UniViewerBodyWidget::setHasText +// @see header file +//--------------------------------------------------------------- +void UniViewerBodyWidget::setHasText(bool text) +{ + mHasText = text; +} + +//--------------------------------------------------------------- +// UniViewerBodyWidget::hasText +// @see header file +//--------------------------------------------------------------- +bool UniViewerBodyWidget::hasText() +{ + return mHasText; +} + +//--------------------------------------------------------------- +// UniViewerBodyWidget::setHasPixmap +// @see header file +//--------------------------------------------------------------- +void UniViewerBodyWidget::setHasPixmap(bool pixmap) +{ + mHasPixmap = pixmap; +} + +//--------------------------------------------------------------- +// UniViewerBodyWidget::hasPixmap +// @see header file +//--------------------------------------------------------------- +bool UniViewerBodyWidget::hasPixmap() +{ + return mHasPixmap; +} + +//--------------------------------------------------------------- +// UniViewerBodyWidget::setSlideContents +// @see header file +//--------------------------------------------------------------- +void UniViewerBodyWidget::setSlideContents(UniMessageInfoList objList, QString slideString) +{ + if (!slideString.isEmpty()) { + setSlideCounter(slideString); + } + + int count = objList.count(); + for (int a = 0; a < count; ++a) { + UniMessageInfo* info = objList.at(a); + QString type = info->mimetype(); + + if (type.contains("text")) { + QFile file(info->path()); + if (file.open(QIODevice::ReadOnly)) { + QString textContent(file.readAll()); + setTextContent(textContent); + } + } + else if (type.contains("video")) { + setVideo(info->path()); + } + else if (type.contains("audio")) { + setAudio(info->path()); + } + else if (type.contains("image")) { + setPixmap(info->path()); + } + + delete info; + } +} + +//--------------------------------------------------------------- +//UniViewerBodyWidget :: clearContent +// @see header file +//--------------------------------------------------------------- +void UniViewerBodyWidget::clearContent() +{ + // delete the temp items(pixmap) & clear permanent items(text) + if (mPixmapItem) { + mPixmapItem->setParent(NULL); + delete mPixmapItem; + mPixmapItem = NULL; + } + + if (mAudioItem) { + mAudioItem->setParent(NULL); + delete mAudioItem; + mAudioItem = NULL; + } + + if (mTextItem) { + mTextItem->setParent(NULL); + delete mTextItem; + mTextItem = NULL; + } + + setHasText(false); + setHasPixmap(false); + repolish(); +} + +//--------------------------------------------------------------- +//UniViewerBodyWidget::sizeHint +// @see header file +//--------------------------------------------------------------- +QSizeF UniViewerBodyWidget::sizeHint(Qt::SizeHint which, const QSizeF & constraint) const +{ + QSizeF szHint = HbWidget::sizeHint(which, constraint); + + HbMainWindow *mainWindow = this->mainWindow(); + if (!mainWindow) { + return szHint; + } + + qreal screenWidth = 0.0; + qreal screenHeight = 0.0; + qreal leftMargin = 0.0; + qreal rightMargin = 0.0; + qreal chromeHeight = 0.0; + qreal toolbarHeight = 0.0; + qreal iconSize = 0.0; + qreal spacing = 0.0; + qreal unitSize = HbDeviceProfile::profile(mPixmapItem).unitValue(); + style()->parameter("hb-param-screen-width", screenWidth); + style()->parameter("hb-param-screen-height", screenHeight); + style()->parameter("hb-param-margin-gene-left", leftMargin); + style()->parameter("hb-param-margin-gene-right", rightMargin); + style()->parameter("hb-param-widget-chrome-height", chromeHeight); + style()->parameter("hb-param-widget-toolbar-height", toolbarHeight); + style()->parameter("hb-param-graphic-size-primary-large", iconSize); + style()->parameter("hb-param-margin-gene-middle-vertical", spacing); + + qreal maxWidth = 0.0; + qreal maxHeight = 0.0; + + // Calculate max height & max width. + if (mainWindow->orientation() == Qt::Horizontal) { + qreal temp; + temp = screenWidth; + screenWidth = screenHeight; + screenHeight = temp; + + if (mPixmapItem && mHasText) { + maxWidth = (screenWidth / 2) - leftMargin - unitSize; + } + else { + maxWidth = screenWidth - leftMargin - rightMargin; + } + maxHeight = screenHeight - chromeHeight - toolbarHeight; + + if (mAudioItem) { + mAudioItem->setStretched(true); + } + } + else if (mainWindow->orientation() == Qt::Vertical) { + maxWidth = screenWidth - leftMargin - rightMargin; + maxHeight = screenHeight - chromeHeight - toolbarHeight; + + if (mAudioItem) { + mAudioItem->setStretched(false); + } + } + + // Slide Counter + QSizeF slideCounterSize(0, 0); + if (mSlideCounter) { + slideCounterSize = mSlideCounter->effectiveSizeHint(which, constraint); + mSlideCounter->show(); + } + // Audio Item + QSizeF audioSize(0, 0); + if (mAudioItem) { + audioSize = mAudioItem->effectiveSizeHint(which, constraint); + mAudioItem->show(); + } + + // Text Item + QSizeF textSize(0, 0); + if (mTextItem) { + textSize = mTextItem->effectiveSizeHint(which, constraint); + mTextItem->show(); + } + + // Pixmap Item + QSizeF pixmapSize(0, 0); + if (mPixmapItem) { + qreal imageWidth = mPixmapItem->icon().defaultSize().width(); + qreal imageHeight = mPixmapItem->icon().defaultSize().height(); + + qreal widthToSet = 0.0; + qreal heightToSet = 0.0; + + if (imageWidth < iconSize) { + widthToSet = iconSize; + heightToSet = iconSize; + } + else if (imageWidth <= maxWidth) { + // resize not needed + widthToSet = imageWidth; + heightToSet = qMin(imageHeight, maxHeight); + } + else { + // resize needed, keep aspect-ratio and resize + widthToSet = maxWidth; + heightToSet = maxWidth * (imageHeight / imageWidth); + heightToSet = qMin(heightToSet, maxHeight); + + } + if (heightToSet == maxHeight) { + widthToSet = heightToSet * (imageWidth / imageHeight); + } + + pixmapSize.setHeight(heightToSet); + pixmapSize.setWidth(widthToSet); + mPixmapItem->setPreferredSize(pixmapSize); + mPixmapItem->show(); + } + + // Calculate the size hint to be returned. + szHint.setHeight(0); + + if (!slideCounterSize.isNull()) { + szHint.rheight() += (slideCounterSize.height() + spacing); + } + if (!audioSize.isNull()) { + szHint.rheight() += (audioSize.height() + spacing); + } + + if (mainWindow->orientation() == Qt::Horizontal) { + qreal remainingHeight = qMax(pixmapSize.height(), textSize.height()); + if (remainingHeight > 0.0) { + szHint.rheight() += (remainingHeight + spacing); + } + } + else if (mainWindow->orientation() == Qt::Vertical) { + if (!pixmapSize.isNull()) { + szHint.rheight() += (pixmapSize.height() + spacing); + } + if (!textSize.isNull()) { + szHint.rheight() += (textSize.height() + spacing); + } + } + szHint.rheight() = qMax(maxHeight, szHint.height()); + + return szHint; +} + +//--------------------------------------------------------------- +//UniViewerBodyWidget::longPressed +// @see header file +//--------------------------------------------------------------- +void UniViewerBodyWidget::longPressed(QPointF position) +{ + + HbMenu* menu = new HbMenu; + menu->setAttribute(Qt::WA_DeleteOnClose); + menu->addAction(LOC_OPEN, this, SLOT(openMedia())); + menu->addAction(LOC_SAVE, this, SLOT(saveMedia())); + menu->setPreferredPos(position); + menu->show(); +} + +//--------------------------------------------------------------- +//UniViewerBodyWidget::openMedia +// @see header file +//--------------------------------------------------------------- +void UniViewerBodyWidget::openMedia() +{ +} + +//--------------------------------------------------------------- +//UniViewerBodyWidget::openMedia +// @see header file +//--------------------------------------------------------------- +void UniViewerBodyWidget::openMedia(const QString& fileName) +{ + XQSharableFile sf; + XQAiwRequest* request = 0; + + if (!sf.open(fileName)) { + return; + } + + // Get handlers + XQApplicationManager appManager; + QList fileHandlers = appManager.list(sf); + if (fileHandlers.count() > 0) { + XQAiwInterfaceDescriptor d = fileHandlers.first(); + request = appManager.create(sf, d); + + if (!request) { + sf.close(); + return; + } + } + else { + sf.close(); + return; + } + + // Result handlers + connect(request, SIGNAL(requestOk(const QVariant&)), this, SLOT(handleOk(const QVariant&))); + connect(request, SIGNAL(requestError(const QVariant&)), this, + SLOT(handleError(const QVariant&))); + + request->setEmbedded(true); + request->setSynchronous(true); + + // Fill args + QList args; + args << qVariantFromValue(sf); + request->setArguments(args); + + // Fill headers + QString key("WindowTitle"); + QVariant value(QString(LOC_TITLE)); + XQRequestInfo info; + info.setInfo(key, value); + request->setInfo(info); + + request->send(); + + // Cleanup + sf.close(); + delete request; +} + +//--------------------------------------------------------------- +//UniViewerBodyWidget::saveMedia +// @see header file +//--------------------------------------------------------------- +void UniViewerBodyWidget::saveMedia() +{ +} + +//--------------------------------------------------------------- +// UniViewerBodyWidget :: handleOk +// @see header file +//--------------------------------------------------------------- +void UniViewerBodyWidget::handleOk(const QVariant& result) +{ + Q_UNUSED(result) +} + +//--------------------------------------------------------------- +// UniViewerBodyWidget :: handleError +// @see header file +//--------------------------------------------------------------- +void UniViewerBodyWidget::handleError(int errorCode, const QString& errorMessage) +{ + Q_UNUSED(errorMessage) + Q_UNUSED(errorCode) +} +// EOF