diff -r 000000000000 -r 1450b09d0cfd ginebra2/WebChromeContainerSnippet.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ginebra2/WebChromeContainerSnippet.cpp Tue May 04 12:39:35 2010 +0300 @@ -0,0 +1,105 @@ +/* +* Copyright (c) 2010 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: +* +*/ + + +#include "WebChromeContainerSnippet.h" +#include "WebChromeItem.h" +#include "ChromeWidget.h" +#include "ChromeRenderer.h" +#include "ChromeSnippet.h" + +#include + +namespace GVA { + + WebChromeContainerSnippet::WebChromeContainerSnippet(const QString & elementId, ChromeWidget * chrome, const QRectF& ownerArea, const QWebElement & element, QGraphicsWidget* gwidget) + : ChromeSnippet(elementId, chrome, gwidget, element), + m_ownerArea(ownerArea), + m_layoutHeight(0) + { + QGraphicsWidget * item = static_cast (widget()); + //NB: maybe size should be fixed only in one direction? + item->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)); + //NB: add a method for setting owner area + //item->setPreferredSize(m_ownerArea.width(), m_ownerArea.height()); + //Also resize in case item is not part of anchor layout + //item->resize(item->preferredSize()); + + //NB: Linear layout efaults to horizontal: handle vertical layouts too. + m_layout = new QGraphicsLinearLayout(); + m_layout->setContentsMargins(0,0,0,0); + m_layout->setSpacing(0); + + //Add a stretch element at the beginning. + m_layout->addStretch(); + item->setLayout(m_layout); + //When chrome is resized owner areas for snippets may change + QObject::connect(m_chrome->renderer(), SIGNAL(chromeResized()), this, SLOT(updateOwnerArea())); + } + + WebChromeContainerSnippet::~WebChromeContainerSnippet() + { + // delete m_layout; + } + + void WebChromeContainerSnippet::positionChildren() + { + ; //Do nothing since the layout positions children automatically. + } + + void WebChromeContainerSnippet::addChild(ChromeSnippet * child) + { + //Prevent layout from stretching the child widgets. NB: Revisit this to make configurable from chrome? + child->widget()->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)); + //child->widget()->setParentItem(this->widget()); // Shouldn't be needed, right? + m_layout->addItem(child->widget()); + //Add a stretch after each element so the layout looks like this: |stretch|item|stretch|item . . . . stretch|item| + m_layout->addStretch(); + + // If child is not a container itself, connect to its mouseEvent + WebChromeContainerSnippet * s = qobject_cast (child); + if (!s ) { + //qDebug() << __PRETTY_FUNCTION__ << s << child->elementId(); + // Connect to mouse events of snippets + WebChromeItem * item = static_cast (child->widget()); + connect(item, SIGNAL(mouseEvent(QEvent::Type)), this, SIGNAL(snippetMouseEvent(QEvent::Type))); + } + qreal childHeight = child->widget()->size().height(); + if(childHeight > m_layoutHeight){ + m_layoutHeight = childHeight; + updateOwnerArea(); + } + } + + void WebChromeContainerSnippet:: updateOwnerArea() + { + QGraphicsWidget * item = static_cast (widget()); + //Resize the item + m_ownerArea = m_chrome->getSnippetRect(m_elementId); + item->setPreferredSize(m_ownerArea.width(), m_layoutHeight); + //Also resize in case item is not part of anchor layout + item->resize(item->preferredSize()); + } + + void WebChromeContainerSnippet::setLayoutHeight(int height){ + if(m_layoutHeight != height){ + m_layoutHeight = height; + updateOwnerArea(); + } + } + +} // endof namespace GVA