src/hbwidgets/widgets/hbpushbutton.cpp
changeset 0 16d8024aca5e
child 1 f7ac710697a9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hbwidgets/widgets/hbpushbutton.cpp	Mon Apr 19 14:02:13 2010 +0300
@@ -0,0 +1,1033 @@
+/****************************************************************************
+**
+** 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 "hbpushbutton.h"
+#include "hbpushbutton_p.h"
+#include "hbstyle.h"
+#include "hbstyleoptionpushbutton.h"
+#include "hbgesturefilter.h"
+#include "hbgesture.h"
+#include "hbframedrawerpool_p.h"
+#include "hbnamespace.h"
+#ifdef HB_EFFECTS
+#include "hbeffect.h"
+#include "hbeffectinternal_p.h"
+#endif
+
+#include <QGraphicsSceneMouseEvent>
+#include <QTimer>
+#include <QGraphicsItem>
+#include <QDebug>
+
+
+/*!
+    @beta
+    @hbwidgets
+    \class HbPushButton
+
+    \brief The HbPushButton widget provides a button with command.
+    
+    \image html hbpushbutton.png A pushbutton with text ,icon and tooltip provided . 
+    
+    A push button enable users to perform important commands easily.
+    A push button has a rectangular shape and typically displays a text label describing its command.
+    Push Button can appear in any container except toolbars where ToolButton HbToolButton is used and palettes.
+    A simple push button can be created as shown in the example below.
+    \snippet{ultimatecodesnippet/ultimatecodesnippet.cpp,16}
+
+    A Push buttons display a textual label. Pushbutton also
+    can have icon.These can be set using the constructors and changed later using setText(),setIcon( ).
+    In addition to this a push button also displays additional text label.
+    Additional text can be set using setAdditionalText().
+    Aligning of icon , text and additional text can be changed using setStretched()true/false property.
+    Default with setStretched()=false it will place icon and text vertically.
+
+    \image html buttonIconTextV.png A pushbutton with icon ,text.
+
+    and along with additional text will place icon horizontally to both texts ,where both text comes vertically aligned.    
+    
+    \image html buttonIconTextAdditionalTextV.png A pushbutton with icon ,text and additional text.
+
+    For setStretched()=true, it will stretch layout to have icon and text horizontally,side by side.
+
+    \image html buttonIconTextH.png A pushbutton with icon ,text.
+
+    and along with additional text will place all of them to Horizontally in one line .
+    
+    \image html buttonIconTextAdditionalTextH.png A pushbutton with custom icon ,text and additional text.
+
+    Pushbutton can have both text and additoinal text placed vertically,this can be used in case Dialer button or 
+    Virtual key pad buttons with stretched = false.Pushbutton doesn't supports both text in one line 
+    stretched = true is not valid.
+    Pushbutton will not have stretch layout by default.
+       
+    \image html buttonTextAdditional.png A pushbutton with additional text and text.
+
+    Pushbutton can have different states like normal, pressed, disabled, latched and focused.
+    A push button emits the signal clicked() when it is activated by tapping it.
+    Push buttons also provide less commonly used signals, for example, pressed() and
+    released() and emits longPress() on long press.
+
+    Alignment of the text within the text and additionaltext items can be set using 
+    setTextAlignment() and setAdditionalText(), default text alignment is Qt::AlignHCenter | Qt::AlignVCenter
+
+    The push button is derived from HbWidget so it can be added to any QGraphicsLayout
+    instance for layouting.
+    \snippet{ultimatecodesnippet/ultimatecodesnippet.cpp,17}
+
+    Push button can also be used as toggle button , following is code snippet
+     \snippet{ultimatecodesnippet/ultimatecodesnippet.cpp,30}
+
+    and onOffButton as 
+     \snippet{ultimatecodesnippet/ultimatecodesnippet.cpp,29}
+
+    Push button will come up with additional text following is code snippet.
+    1. Push button with icon , text and additionalText
+     \snippet{ultimatecodesnippet/ultimatecodesnippet.cpp,35}
+
+    2. Pushbutton with additionalText and text.
+     \snippet{ultimatecodesnippet/ultimatecodesnippet.cpp,36}
+
+    \sa HbAbstractButton , HbToolButton
+*/
+    
+
+/*!
+    \reimp
+    \fn int HbPushButton::type() const
+ */
+
+/*!
+    \fn void HbPushButton::longPress( QPointF )
+    This signal is emitted in case of longpress.
+ */
+
+HbPushButtonPrivate::HbPushButtonPrivate() :
+    textItem(0),
+    additionalTextItem(0),
+    touchArea(0),
+    iconItem(0),
+    frameItem(0),
+    focusItem(0),
+    orientation(Qt::Vertical),
+    backgroundFrameDrawer(0),
+    gestureFilter(0),
+    gestureLongpressed(0),
+    longPressTimer(0),
+    textAlignment(Qt::AlignHCenter | Qt::AlignVCenter ),
+    additionalTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter ),
+    stretched(false),
+    navigationKeyPress(false),
+    hasTextAlignment(false),
+    hasAdditionalTextAlignment(false)
+{
+#ifdef HB_EFFECTS
+     //HbEffectInternal::add(HB_PUSHBUTTON_TYPE,"pushbutton_pressed.fxml", "pressed");
+     HbEffectInternal::add(HB_PUSHBUTTON_TYPE,"pushbutton_released", "released");
+#endif
+  
+}
+
+/*
+  Destructor.
+ */
+HbPushButtonPrivate::~HbPushButtonPrivate()
+{
+    if(gestureFilter){
+        delete gestureFilter;
+        gestureFilter = NULL;
+    }
+}
+
+/*
+  createPrimitives.
+ */
+void HbPushButtonPrivate::createPrimitives()
+{
+    Q_Q(HbPushButton);
+
+    if ( !frameItem ) {
+        frameItem = q->style()->createPrimitive( HbStyle::P_PushButton_background, q );
+    }
+    if ( !text.isNull() ) {
+        if ( !textItem ) {
+            textItem = q->style()->createPrimitive( HbStyle::P_PushButton_text, q );
+        }
+    } else {
+        if( textItem ){
+            delete textItem;
+        }
+        textItem = 0;
+    }
+    if ( !additionalText.isNull() ) {
+        if ( !additionalTextItem ) {
+            additionalTextItem = q->style()->createPrimitive( HbStyle::P_PushButton_additionaltext, q );
+        }
+    } else {
+        if( additionalTextItem ){
+            delete additionalTextItem;
+        }
+        additionalTextItem = 0;
+    }
+
+    if ( !icon.isNull() ) {
+        if ( !iconItem ) {
+            iconItem = q->style()->createPrimitive( HbStyle::P_PushButton_icon, q);
+        }
+    } else {
+        if( iconItem ){
+            delete iconItem;
+        }
+        iconItem = 0;
+    }
+
+    if( !touchArea ) {
+        touchArea = q->style()->createPrimitive( HbStyle::P_PushButton_toucharea, q );
+    }
+
+    if( !focusItem ) {
+    focusItem = q->style()->createPrimitive(HbStyle::P_PushButton_focus, q);
+    //focus primitive is will not be visible by default, 
+    //only in case of keyboard focus events it will be Visible.
+    focusItem->setVisible( false );
+    }
+}
+
+/*
+  initGesture.
+ */
+void HbPushButtonPrivate::initGesture()
+{
+    Q_Q(HbPushButton);
+    // Create gesture filter
+    gestureFilter = new HbGestureSceneFilter( Qt::LeftButton, q );
+    // Add gestures for longpress
+    gestureLongpressed = new HbGesture( HbGesture::longpress,5 );
+    gestureFilter->addGesture( gestureLongpressed );
+
+    // scene event filter for gesture can be installed
+    // if widget is already added to scene
+    if (q->scene()) {
+        q->installSceneEventFilter(gestureFilter);
+        if (touchArea) {
+            touchArea->installSceneEventFilter(gestureFilter);
+        }
+    }
+
+}
+
+void HbPushButtonPrivate::_q_handleLongPress(QPointF point)
+{
+    Q_Q(HbPushButton);
+    if(!longPress){
+        longPress = true;
+        emit q->longPress( point );
+    }
+}
+
+void HbPushButtonPrivate::_q_handleLongKeyPress( )
+{
+    Q_Q(HbPushButton);
+    if(!longPress){
+        longPress = true;
+        emit q->longPress( q->pos() );
+    }
+}
+
+void HbPushButtonPrivate::initialize()
+{
+    Q_Q(HbPushButton);
+    q_ptr = q;
+    createPrimitives();
+    initGesture();
+
+}
+
+/*!
+    @beta
+    Constructs a new HbPushButton with \a parent.
+ */
+HbPushButton::HbPushButton( QGraphicsItem *parent )
+    : HbAbstractButton( *new HbPushButtonPrivate, parent )
+{
+    Q_D(HbPushButton);
+    d->initialize();
+    connect( d->gestureLongpressed, SIGNAL(longPress(QPointF)),
+        this, SLOT(_q_handleLongPress(QPointF)));
+    setProperty("state", "normal");
+     
+}
+
+/*!
+    @beta
+    Constructs a new HbPushButton with \a text and \a parent.
+ */
+HbPushButton::HbPushButton(const QString &text, QGraphicsItem *parent)
+    : HbAbstractButton(*new HbPushButtonPrivate, parent)
+{
+    Q_D(HbPushButton);
+    d->text = text;
+    d->initialize();
+    connect( d->gestureLongpressed, SIGNAL(longPress(QPointF)),
+        this, SLOT(_q_handleLongPress(QPointF)) );
+    setProperty("state", "normal");
+     
+
+}
+
+/*!
+    @beta
+    Constructs a new HbPushButton with \a icon, \a text and \a parent.
+ */
+HbPushButton::HbPushButton( const HbIcon &icon, const QString &text, QGraphicsItem *parent )
+    : HbAbstractButton( *new HbPushButtonPrivate, parent )
+{
+    Q_D(HbPushButton);
+    d->icon = icon;
+    d->text = text;
+    d->initialize();
+    connect( d->gestureLongpressed, SIGNAL(longPress(QPointF)),
+        this, SLOT(_q_handleLongPress(QPointF)) );
+    setProperty("state", "normal");
+
+}
+
+/*!
+    \deprecated HbPushButton::HbPushButton(const HbIcon&, const QString&, Qt::Orientation, QGraphicsItem*)
+        is deprecated.
+    Constructs a new HbPushButton with \a icon, \a text \a orientation and \a parent.
+ */
+HbPushButton::HbPushButton( const HbIcon &icon, const QString &text,
+    Qt::Orientation orientation, QGraphicsItem *parent )
+    : HbAbstractButton( *new HbPushButtonPrivate, parent )
+{
+    Q_D(HbPushButton);
+    d->icon = icon;
+    d->text = text;
+    d->initialize();
+    d->orientation = orientation;
+    connect( d->gestureLongpressed, SIGNAL(longPress(QPointF)),
+        this, SLOT(_q_handleLongPress(QPointF)) );
+    setProperty("state", "normal");
+            
+}
+
+/*!
+    Destructs the push button.
+ */
+HbPushButton::~HbPushButton()
+{
+    Q_D(HbPushButton);
+    if( d->gestureFilter ) {
+        removeSceneEventFilter( d->gestureFilter );
+    }
+}
+
+/*!
+    @beta
+    Sets the \a background of the button.
+
+    \note The background can contain different images for pressed and released states.
+
+    \sa background()
+ */
+void  HbPushButton::setBackground( const HbIcon &background )
+{
+    Q_D(HbPushButton);
+    if( !d->frameItem ) {
+       d->createPrimitives();
+    }
+    if ( d->background != background ) {
+        d->background = background;
+        d->backgroundFrameDrawer = 0;
+        HbStyleOptionPushButton buttonOption;
+        initStyleOption( &buttonOption );
+        style()->updatePrimitive( d->frameItem, HbStyle::P_PushButton_background, &buttonOption );
+    }
+}
+
+/*!
+    @beta
+    Returns the background of the button.
+
+    \sa setBackground()
+ */
+HbIcon HbPushButton::background() const
+{
+    Q_D(const HbPushButton);
+    return d->background;
+}
+
+/*!
+    @beta
+    Sets the \a framebackground of the button.
+
+    \note The background can contain different types of frame drawers(Nine piece,
+    three piece or single).Ownership is transferred to the Pushbutton
+
+    \sa frameBackground()
+ */
+void  HbPushButton::setFrameBackground( HbFrameDrawer *backgroundFrameDrawer )
+{
+    Q_D(HbPushButton);
+    if (d->backgroundFrameDrawer != backgroundFrameDrawer) {
+        if( !d->frameItem ) {
+            d->createPrimitives();
+        }
+        d->backgroundFrameDrawer=backgroundFrameDrawer;
+        d->background=HbIcon();
+        HbStyleOptionPushButton buttonOption;
+        initStyleOption( &buttonOption );
+        style()->updatePrimitive( d->frameItem, HbStyle::P_PushButton_background, &buttonOption );
+    }
+}
+
+/*!
+    @beta
+    Returns the background of the button.
+
+    \sa setBackground()
+ */
+HbFrameDrawer* HbPushButton::frameBackground() const
+{
+    Q_D(const HbPushButton);
+    return ( d->backgroundFrameDrawer );
+}
+
+
+/*!
+    @beta
+    Sets the \a text shown on the button.
+
+    \sa text()
+ */
+void HbPushButton::setText( const QString &text )
+{
+    Q_D(HbPushButton);
+    if ( d->text != text ) {
+        bool doPolish = text.isEmpty() || d->text.isEmpty();
+        d->text = text;
+        d->createPrimitives();
+        //updatePrimitives();
+        if( d->textItem ){
+            HbStyleOptionPushButton buttonOption;
+            initStyleOption(&buttonOption);
+            style()->updatePrimitive( d->textItem, HbStyle::P_PushButton_text, &buttonOption);
+        }
+        if(doPolish) {
+            repolish();
+        }
+    }
+}
+
+
+/*!
+    @beta
+    Returns the text shown on the button.
+
+    \sa setText()
+ */
+QString HbPushButton::text() const
+{
+    Q_D(const HbPushButton);
+    return d->text;
+}
+
+
+/*!
+    @beta
+    Sets the \a additional text shown on the button.
+    Additional text is only shown in case 
+    1. with icon and text in Qt::Horizontal alignment.
+    2. with additionalText and text in Qt::Vertical alignment.
+
+    \sa additionalText()
+ */
+void HbPushButton::setAdditionalText( const QString &additionalText )
+{
+    Q_D(HbPushButton);
+    if ( d->additionalText != additionalText ) {
+        bool doPolish = additionalText.isEmpty() || d->additionalText.isEmpty();
+        d->additionalText = additionalText;
+        d->createPrimitives();
+        // updatePrimitives();
+        if(d->additionalTextItem){
+            HbStyleOptionPushButton buttonOption;
+            initStyleOption(&buttonOption);
+            style()->updatePrimitive( d->additionalTextItem, HbStyle::P_PushButton_additionaltext, &buttonOption);
+        }
+        if( doPolish ) {
+            repolish();
+        }
+    }
+}
+
+/*!
+    @beta
+    Returns the additional text shown on the button.
+
+    \sa setAdditionalText()
+ */
+QString HbPushButton::additionalText() const
+{
+    Q_D(const HbPushButton);
+    return d->additionalText;
+}
+
+/*!
+    @beta
+    Sets the \a icon shown on the button.
+
+    \note The icon can contain images for different modes.
+
+    \sa icon()
+ */
+void HbPushButton::setIcon(const HbIcon &icon)
+{
+    Q_D(HbPushButton);
+
+    if ( d->icon != icon ) {
+        bool doPolish = icon.isNull() || d->icon.isNull();
+        d->icon = icon;
+        d->createPrimitives();
+        //updatePrimitives();
+        if(d->iconItem ){
+            HbStyleOptionPushButton buttonOption;
+            initStyleOption( &buttonOption );
+            style()->updatePrimitive( d->iconItem, HbStyle::P_PushButton_icon, &buttonOption );
+
+        }
+        if( doPolish ){
+            repolish();
+        }
+    }
+}
+
+/*!
+    @beta
+    Returns the icon shown on the button.
+    \sa setIcon()
+ */
+
+HbIcon HbPushButton::icon() const
+{
+    Q_D(const HbPushButton);
+    return d->icon;
+}
+
+
+/*!
+    \deprecated HbPushButton::setOrientation( Qt::Orientation )
+        is deprecated. Please use HbPushButton::setStretched(bool) instead 
+
+    Set the orientation.Default orientation is Qt::Vertical.
+    In case of icon ,text and additional text it has to be set to Qt::Horizontal.
+    In case of additionalText and text it has to be set to Qt:Vertical.
+    \sa orientation()
+*/
+void HbPushButton::setOrientation( Qt::Orientation orientation )
+{
+    Q_D(HbPushButton);
+    if( d->orientation != orientation ) {
+        d->orientation = orientation;
+        // calling setStretchedMode internaly this api is going to be depricated.
+        bool stretched = 
+            (d->orientation == Qt::Vertical)?(false):(true);
+        setStretched( stretched );        
+    }
+    qDebug()<<"This api is deprecated use HbPushButton::setStretched( bool stretched )";
+}
+
+/*!
+    \deprecated HbPushButton::orientation() const
+        is deprecated.Please use bool HbPushButton::isStretched() const instead 
+
+    Returns orientation of button
+    \sa setOrientation ()
+*/
+Qt::Orientation HbPushButton::orientation() const
+{
+    Q_D(const HbPushButton);
+    qDebug()<<"This api is deprecated use bool HbPushButton::isStretched() const";
+    return d->orientation;    
+}
+
+/*!
+    Set the text alignment for primarytext  and additional text.
+    The default alignment is Qt::AlignHCenter | Qt::AlignVCenter.
+    \sa textAlignment()
+*/
+void HbPushButton::setTextAlignment( Qt::Alignment alignment )
+{
+    Q_D(HbPushButton); 
+
+    //HbWidgetBase* textItem = static_cast<HbWidgetBase*>(d->textItem);		
+    if(!d->textItem){
+        //need to create text item if user call alignment api before setText.
+        d->textItem = style()->createPrimitive( HbStyle::P_PushButton_text, this);
+    }
+    //HbWidgetBasePrivate *textItem_p = HbWidgetBasePrivate::d_ptr(textItem);	
+    // check for textitem and api protection flag
+    if(alignment != d->textAlignment ){
+        //take the alignment 
+        d->textAlignment = alignment;
+        //set the api protection flag 
+        //HbWidgetBasePrivate::d_ptr(textItem)->setApiProtectionFlag(HbWidgetBasePrivate::AC_TextAlign,true);
+        d->hasTextAlignment = true;
+        HbStyleOptionPushButton buttonOption;            
+        initStyleOption( &buttonOption );
+        style()->updatePrimitive( 
+        d->textItem, HbStyle::P_PushButton_text, &buttonOption );
+    }
+    d->hasTextAlignment = true;
+}
+
+/*!
+    Returns the text alignment for primary text and additional text
+    \sa setTextAlignment()
+*/
+Qt::Alignment HbPushButton::textAlignment( ) const
+{
+    Q_D(const HbPushButton);
+    return d->textAlignment;
+}
+
+
+/*!
+    Set the text alignment for additional text.
+    The default alignment is Qt::AlignHCenter | Qt::AlignVCenter.
+    \sa additionalTextAlignment()
+*/
+void HbPushButton::setAdditionalTextAlignment( Qt::Alignment alignment )
+{
+    Q_D(HbPushButton); 
+
+    //HbWidgetBase* additionalTextItem = static_cast<HbWidgetBase*>(d->additionalTextItem);	
+    if(!d->additionalTextItem){
+        //need to create text item if user call alignment api before setAdditionalText.
+        d->additionalTextItem = style()->createPrimitive( HbStyle::P_PushButton_additionaltext, this);
+    }
+    // check for textitem and api protection flag
+    if(alignment != d->additionalTextAlignment ){
+        //take the alignment 
+        d->additionalTextAlignment = alignment;
+        //set the api protection flag 
+        //HbWidgetBasePrivate::d_ptr(additionalTextItem)->setApiProtectionFlag(HbWidgetBasePrivate::AC_TextAlign,true);
+        d->hasAdditionalTextAlignment = true;
+        HbStyleOptionPushButton buttonOption;            
+        initStyleOption( &buttonOption );
+        style()->updatePrimitive( 
+        d->additionalTextItem, HbStyle::P_PushButton_additionaltext, &buttonOption );
+    }
+}
+
+/*!
+    Returns the text alignment for additional text
+    \sa setAdditionalTextAlignment()
+*/
+Qt::Alignment HbPushButton::additionalTextAlignment( ) const
+{
+    Q_D(const HbPushButton);
+    return d->additionalTextAlignment;
+}
+
+/*!
+    Sets the stretched layout for button by default it set to true. setStretched true/false.
+    For the case icon and text with value false will appear icon and text vertically aligned.
+    and with value true will appear icon and text horizontally aligned.
+    For the case icon , text and additional text with value false will appear like 
+    both text will be vertically aligned and icon will be horizontally.
+    and with value true icon , text and additionaltext will come horizontally aligned in one line
+    For the case text and additonaltext(dialer button case ) only value false is applicable and both texts will 
+    appeare vertically 
+
+    \sa isStretched()
+*/
+void HbPushButton::setStretched( bool stretched )
+{
+    Q_D(HbPushButton);
+    if( d->stretched != stretched ) {
+        d->stretched = stretched;
+        repolish();
+    }
+}
+
+/*!
+    Returns the whether button has streteched layout or not.
+    \sa setStretched ()
+*/
+bool HbPushButton::isStretched() const
+{
+    Q_D(const HbPushButton);
+    return d->stretched;
+}
+
+/*!
+    \reimp
+ */
+QGraphicsItem* HbPushButton::primitive( HbStyle::Primitive primitive ) const
+{
+    Q_D(const HbPushButton);
+
+    switch (primitive) {
+        case HbStyle::P_PushButton_background:
+            return d->frameItem;
+        case HbStyle::P_PushButton_icon:
+            return d->iconItem;
+        case HbStyle::P_PushButton_text:
+            return d->textItem;
+        case HbStyle::P_PushButton_toucharea:
+            return d->touchArea;
+        case HbStyle::P_PushButton_additionaltext:
+            return d->additionalTextItem;
+        case HbStyle::P_PushButton_focus:
+            return d->focusItem;
+        default:
+            return 0;
+    }
+}
+
+/*!
+    \reimp
+ */
+void HbPushButton::recreatePrimitives()
+{
+   Q_D(HbPushButton);
+   HbWidget::recreatePrimitives();
+
+   delete d->frameItem;
+   d->frameItem = 0;
+   delete d->iconItem;
+   d->iconItem = 0;
+   delete d->textItem;
+   d->textItem = 0;
+   delete d->touchArea;
+   d->touchArea = 0;
+   delete d->additionalTextItem;
+   d->additionalTextItem = 0;
+   delete d->focusItem;
+   d->focusItem = 0;
+   
+   d->createPrimitives();
+   setFrameBackground(0);
+}
+/*!
+    \reimp
+ */
+void HbPushButton::updatePrimitives()
+{
+    Q_D(HbPushButton);
+    HbWidget::updatePrimitives();
+
+    HbStyleOptionPushButton buttonOption;
+    initStyleOption(&buttonOption);
+    if ( d->textItem ) {
+        style()->updatePrimitive( d->textItem, HbStyle::P_PushButton_text, &buttonOption );
+    }
+    if ( d->touchArea ) {
+        style()->updatePrimitive( d->touchArea, HbStyle::P_PushButton_toucharea, &buttonOption );
+    }	
+    if( d->additionalTextItem ){
+        style()->updatePrimitive(
+            d->additionalTextItem,HbStyle::P_PushButton_additionaltext,&buttonOption );
+    }
+    if ( d->iconItem) {
+        style()->updatePrimitive( d->iconItem, HbStyle::P_PushButton_icon, &buttonOption );
+    }
+    if ( d->frameItem ){
+        style()->updatePrimitive( d->frameItem, HbStyle::P_PushButton_background, &buttonOption );
+    }
+    // update will happen only for keyevents when focusItem will be visible.
+    if( d->focusItem && hasFocus() && d->focusItem->isVisible() ) {
+        style()->updatePrimitive( d->focusItem,HbStyle::P_PushButton_focus, &buttonOption );
+    }
+}
+
+/*!
+    \internal
+ */
+HbPushButton::HbPushButton(HbPushButtonPrivate &dd, QGraphicsItem * parent) :
+    HbAbstractButton(dd, parent)
+{
+    Q_D(HbPushButton);
+    d->initGesture();
+    connect( d->gestureLongpressed, SIGNAL(longPress(QPointF)),
+        this, SLOT(_q_handleLongPress(QPointF)) );
+}
+
+/*!
+    Initializes \a option with the values from this HbPushButton. 
+    This method is useful for subclasses when they need a HbStyleOptionPushButton,
+    but don't want to fill in all the information themselves.
+ */
+void HbPushButton::initStyleOption(HbStyleOptionPushButton *option) const
+{
+    Q_D(const HbPushButton);
+
+    HbAbstractButton::initStyleOption(option);
+
+    Q_ASSERT(option);
+    option->background = d->background;
+    option->text = d->text;
+    option->additionalText = d->additionalText;
+    option->icon = d->icon;
+    option->isCheckable = d->checkable;
+    option->textAlignment = d->textAlignment;
+    option->additionalTextAlignment = d->additionalTextAlignment;
+    option->hasTextAlignment = d->hasTextAlignment;
+    option->hasAdditionalTextAlignment = d->hasAdditionalTextAlignment;
+    if(option->backgroundFrameDrawer) {
+        HbFrameDrawerPool::release(option->backgroundFrameDrawer);
+        option->backgroundFrameDrawer = 0;
+    }
+    option->backgroundFrameDrawer=( d->backgroundFrameDrawer );
+}
+
+/*!
+    \reimp
+ */
+void HbPushButton::keyPressEvent(QKeyEvent *event)
+{
+    Q_D(HbPushButton);
+
+    switch (event->key()) {
+        case Qt::Key_Select:
+        case Qt::Key_Enter:
+        case Qt::Key_Return:{
+                if (!event->isAutoRepeat() && !d->autoRepeat && !d->longPressTimer) {
+                    d->longPressTimer = new QTimer();
+                    d->longPressTimer->setInterval(300);
+                    connect( d->longPressTimer, SIGNAL(timeout()), this, SLOT(_q_handleLongKeyPress()) );
+                    d->longPressTimer->start();
+                }else{
+                    #ifdef HB_EFFECTS
+                        HbEffect::start( this, HB_PUSHBUTTON_TYPE, "pressed" );
+                    #endif
+                }
+            }
+            break;
+        case Qt::Key_Up:
+        case Qt::Key_Left:
+        case Qt::Key_Right:
+        case Qt::Key_Down:{
+                d->navigationKeyPress = true;
+            }
+            break;       
+    }
+    HbAbstractButton::keyPressEvent(event);
+}
+
+
+/*!
+    \reimp
+ */
+void HbPushButton::keyReleaseEvent(QKeyEvent *event)
+{
+    Q_D(HbPushButton);
+    switch(event->key()){
+        case Qt::Key_Select:
+        case Qt::Key_Enter:
+        case Qt::Key_Return:{
+                #ifdef HB_EFFECTS
+                    HbEffect::start( this, HB_PUSHBUTTON_TYPE, "released" );
+                #endif                
+                if( d->longPressTimer && d->longPressTimer->isActive() ) {                    
+                    d->longPressTimer->stop();
+                    delete d->longPressTimer;
+                    d->longPressTimer = 0;                    
+                } 
+            }
+            break;
+            case Qt::Key_Up:
+            case Qt::Key_Left:
+            case Qt::Key_Right:
+            case Qt::Key_Down:{
+                    d->navigationKeyPress = false;
+                }
+            break;       
+    }
+    HbAbstractButton::keyReleaseEvent( event );
+}
+
+/*!
+    \reimp
+ */
+void HbPushButton::mousePressEvent( QGraphicsSceneMouseEvent *event )
+{
+    Q_D(HbPushButton);
+    HbAbstractButton::mousePressEvent(event);
+    HbStyleOptionPushButton buttonOption;
+    initStyleOption( &buttonOption );
+    if( d->frameItem ){
+        style()->updatePrimitive( d->frameItem, HbStyle::P_PushButton_background, &buttonOption );
+    }
+#ifdef HB_EFFECTS
+    if ( hitButton(event->pos()) ){
+        HbEffect::start( this, HB_PUSHBUTTON_TYPE, "pressed" );
+    }
+#endif
+    setProperty("state", "pressed");    
+}
+
+/*!
+    \reimp
+ */
+void HbPushButton::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(HbPushButton);
+    HbAbstractButton::mouseReleaseEvent(event);
+    HbStyleOptionPushButton buttonOption;
+    initStyleOption( &buttonOption );     
+    if( d->frameItem ){
+        style()->updatePrimitive( d->frameItem, HbStyle::P_PushButton_background, &buttonOption );
+    }
+#ifdef HB_EFFECTS
+    if ( hitButton(event->pos()) ){
+        HbEffect::start( this, HB_PUSHBUTTON_TYPE, "released" );
+    }
+#endif
+    setProperty("state", "normal"); 
+}
+
+/*!
+    \reimp
+ */
+void HbPushButton::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+    Q_D(HbPushButton);
+    HbAbstractButton::mouseMoveEvent(event);
+    HbStyleOptionPushButton buttonOption;
+    initStyleOption( &buttonOption );
+    if( d->frameItem ){
+        style()->updatePrimitive( d->frameItem, HbStyle::P_PushButton_background, &buttonOption );
+    }
+    if (d->down) {
+        setProperty("state", "pressed"); 
+    } else {
+        setProperty("state", "normal"); 
+    }
+}
+
+
+/*!
+    \reimp
+ */
+void HbPushButton::resizeEvent(QGraphicsSceneResizeEvent *event)
+{
+    HbAbstractButton::resizeEvent(event);
+}
+/*!
+  reimp
+
+*/
+void HbPushButton::polish( HbStyleParameters& params )
+{
+    Q_D( HbPushButton );
+    if(d->stretched && (d->textItem && d->additionalTextItem && !d->iconItem)){
+        d->stretched = false;
+        qWarning()<<"Warning::Invalid Layout: Text and additonalText horizontal appearance not supported";
+    }
+    HbAbstractButton::polish( params );
+}
+
+
+/*!
+    \reimp
+ */
+void HbPushButton::focusInEvent(QFocusEvent *event)
+{
+    Q_D(HbPushButton);
+    if((event->reason() == Qt::TabFocusReason || event->reason() == Qt::BacktabFocusReason) 
+        && ( d->navigationKeyPress ) ) {
+        if(d->focusItem) {
+            d->focusItem->setVisible(true);
+            if( hasFocus()){
+                HbStyleOptionPushButton buttonOption;
+                initStyleOption( &buttonOption );
+                style()->updatePrimitive( d->focusItem,HbStyle::P_PushButton_focus, &buttonOption );
+            }
+        } else {
+            d->focusItem = style()->createPrimitive(HbStyle::P_PushButton_focus, this);
+        }
+    }
+    HbAbstractButton::focusInEvent(event);
+}
+
+/*!
+    \reimp
+ */
+void HbPushButton::focusOutEvent(QFocusEvent *event)
+{
+    Q_D(HbPushButton);
+    if(d->focusItem) {
+        d->focusItem->setVisible(false);
+    }
+    HbAbstractButton::focusOutEvent(event);
+}
+
+/*!
+    \reimp
+ */
+QVariant HbPushButton::itemChange(GraphicsItemChange change, const QVariant &value)
+{
+    Q_D(HbPushButton);
+
+    switch ( change ) {
+        case ItemEnabledHasChanged:
+        case ItemVisibleChange: {
+                updatePrimitives( );
+            }
+            break;
+        case ItemSceneHasChanged: {
+                // scene event filter for gestures can be installed
+                // once the widget has been added to the scene
+                if(!value.isNull() && d->gestureFilter) {
+                    installSceneEventFilter(d->gestureFilter);
+                    if (d->touchArea) {
+                        d->touchArea->installSceneEventFilter(d->gestureFilter);
+                    }
+                }
+                updatePrimitives();
+            }
+            break;
+        default:
+            break;
+    }
+    return HbAbstractButton::itemChange( change, value );
+}
+
+/*!
+  Overloaded hit detection to include touch area
+ */
+bool HbPushButton::hitButton(const QPointF &pos) const
+{
+    Q_D( const HbPushButton );
+    QRectF compRect = d->touchArea->boundingRect( );
+    compRect.translate( d->touchArea->pos() );
+    return compRect.contains( pos );
+}
+
+#include "moc_hbpushbutton.cpp"
+