javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtcomposite.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 09 Jun 2010 09:34:07 +0300
branchRCL_3
changeset 19 71c436fe3ce0
parent 17 0fd27995241b
child 24 6c158198356e
permissions -rw-r--r--
Revision: v2.1.28 Kit: 2010123

/*******************************************************************************
 * Copyright (c) 2005, 2010 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Nokia Corporation - S60 implementation
 *******************************************************************************/


#ifndef SWTCOMPOSITE_H
#define SWTCOMPOSITE_H


#include <AknControl.h>
#include <eiksbobs.h>
#include <mswtphysics.h>
#include "eswtwidgetscore.h"
#include "swtscrollablebase.h"
#ifdef RD_JAVA_ADVANCED_TACTILE_FEEDBACK
#include <touchfeedback.h>
#endif //RD_JAVA_ADVANCED_TACTILE_FEEDBACK

class CEikScrollBarFrame;
class CSwtScrollBar;
class CSwtUiUtils;

/**
 * CSwtComposite
 * @lib eswt
 */
NONSHARABLE_CLASS(CSwtComposite)
        : public CAknControl
        , public ASwtScrollableBase
        , public MSwtComposite
        , public MSwtPhysicsObserver
{
// Own api
public:
    static CSwtComposite* NewL(MSwtDisplay& aDisplay, TSwtPeer aPeer,
    MSwtComposite& aParent, TInt aStyle);

protected:
    CSwtComposite(MSwtDisplay& aDisplay, TSwtPeer aPeer,
                  MSwtComposite* aParent, TInt aStyle, TBool aVisibility, TBool aDimmed);
    ~CSwtComposite();
    void ConstructL();
    void CreateScrollBarFrameL();
    void UpdateFrameL();
    void RectChanged();
    virtual void SwtHandleResourceChangeL(TInt aType);

// From MCoeControlBackground
public:
    virtual void Draw(CWindowGc& aGc, const CCoeControl& aControl,
                      const TRect& aRect) const;

// From CCoeControl
public:
    TInt CountComponentControls() const;
    CCoeControl* ComponentControl(TInt aIndex) const;
    void MakeVisible(TBool aVisible);
    void SetDimmed(TBool aDimmed);
    TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType);
    void HandleResourceChange(TInt aType);

protected:
    void Draw(const TRect& aRect) const;
    void FocusChanged(TDrawNow aDrawNow);
    void PositionChanged();
    void SizeChanged();
    TTypeUid::Ptr MopSupplyObject(TTypeUid aId);

// From MEikScrollBarObserver
public:
    void HandleScrollEventL(CEikScrollBar* aScrollBar, TEikScrollEvent aEventType);

// From MSwtControl
public:
    CCoeControl& CoeControl();
    const CCoeControl& CoeControl() const;
    TBool IsFocusable(TInt aReason = KSwtFocusByApi) const;
    TInt FocusBackgroundPolicy() const;
    void ProcessKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType);
    void HandlePointerEventL(const TPointerEvent& aPointerEvent);
    TBool SetSwtFocus(TInt aReason = KSwtFocusByApi);
    TSize ComputeSizeL(TInt aWHint, TInt aHHint);
    MSwtComposite* CompositeInterface() const;
    void ComputeTabListL(RSwtControlArray& aList);
    void UpdateDoNotDrawFlag();
    void Update() const;
    void SetBounds(const TRect& aRect);
    void SetWidgetSize(const TSize& aSize);

// From ASwtScrollableBase
protected:
    CEikScrollBarFrame* SbFrame() const;
    void SetVisibleScrollBar(TInt aStyle, TBool aVisible);

// From MSwtComposite
public:
    MSwtScrollable* Scrollable();
    void RegisterChildL(MSwtControl& aChild);
    void UnregisterChild(MSwtControl& aChild);
    CSwtPeerArray* GetChildrenPeersL();
    inline const RSwtControlArray* Children() const;
    void ChildFocusChanged(MSwtControl& aControl);
    TInt CountFocusableChildren(TInt aTryBreakAfter = -1,
                                const MSwtControl* aExclude = NULL, TBool aVisualFocusCount = ETrue) const;
    void SetTabListL(MSwtControl** aControls, TInt aCount);
    CSwtPeerArray* GetTabListL() const;
    void MoveChildAbove(MSwtControl& aChild1, const MSwtControl* aChild2);
    void MoveChildBelow(MSwtControl& aChild1, const MSwtControl* aChild2);
    void NotifyRadioGroup(MSwtButton* aSelectedButton);
    MSwtControl* GetPointerGrabbingControl() const;
    void SetScrolledCompositeContentL(MSwtControl* aContent);
    MSwtControl* ScrolledCompositeContent() const;
    TInt ScrolledCompositePysicsAction() const;
    void DrawScrollBarBackground(const TRect& aRect) const;

// From MSwtPhysicsObserver
public:
    void ViewPositionChanged(const TPoint& aNewPosition, TBool aDrawNow, TUint aFlags);
    void PhysicEmulationEnded();
    TPoint ViewPosition() const;

// Own api
private:
    void  DoSetTabListL(MSwtControl** aControls, TInt aCount);
    void  ProcessCompositePointerEventL(const TPointerEvent& aPointerEvent);
    void  InvalidateScrollBars();
    TBool HasFocusableControl(const MSwtControl* aControl) const;
    void  DoHandlePointerEventL(const TPointerEvent& aPointerEvent);
    TBool PhysicsEnabled() const;
    void  PhysicsResetGeometryL();
    void  PhysicsStartTimer();
    static TInt PhysicsTimerCallback(TAny* aPtr);
    void PaintUrgently() const;
#ifdef RD_JAVA_ADVANCED_TACTILE_FEEDBACK
    void UpdateTactileFeedbackDensity();
    void DoScrollingFeedback();
#endif //RD_JAVA_ADVANCED_TACTILE_FEEDBACK

// Data
protected:
    /**
     * For creating children arrays, this is the granularity param for the c.tor
     */
    static const TInt KChildrenGranularity;

    /**
     * The controls this control contains, none is owned, none is NULL
     */
    RSwtControlArray iChildren;

    /**
     * The tab-order of controls, only filled if different from iChildren
     */
    RSwtControlArray iTabList;

    /**
     * The scroll-bar frame, owned, may be NULL
     */
    CEikScrollBarFrame* iSbFrame;

private:
    /**
     * Composite's rectangle
     */
    TRect iRect;

    TBool iActuallyInRadioButtonSelect;

    /**
     * A pointer to the control where the
     * last button down occured.
     * It can be null. Not Own.
     */
    MSwtControl* iPointerGrabbingControl;

    /**
     * Deliver all pointer event to the scrollbar when this on.
     */
    TBool iVScrollBarGrabsPointerEvents;
    TBool iHScrollBarGrabsPointerEvents;

    /**
     * The content control, in case this is a ScrolledComposite
     */
    MSwtControl* iScrlCompContent; // Now own

    /**
     * Physics related
     */
    MSwtPhysics* iPhysics;     // Own
    CPeriodic* iPhysicsTimer;  // Own
    TPoint iPhysicsStartPos;
    TPoint iPhysicsLastPos;
    TPoint iPhysicsViewPos;
    TTime iPhysicsStartTime;
    TPointerEvent iPhysicsPointerDown;
    TInt iPhysicsAction;
    TBool iPhysicsBreaking;
    RLibrary iPhysicsLib;
    MSwtControl* iPhysicsFocusedCtrl; // Not own

#ifdef RD_JAVA_ADVANCED_TACTILE_FEEDBACK
    /**
     * Kinetic scrolling tactile feedback
     */
    MTouchFeedback* iFeedback; // Not own
    TInt iLastTactileFeedbackPos;
    TInt iTactileFeedbackDensity;
    TInt iLastPointerEventType;
#endif //RD_JAVA_ADVANCED_TACTILE_FEEDBACK
};


/**
 * Returns the array containing the Composite's children
 */
inline const RSwtControlArray* CSwtComposite::Children() const
{
    return &iChildren;
}


#endif // SWTCOMPOSITE_H