javauis/lcdui_akn/lcdui/inc/CMIDChoiceGroupControl.h
branchRCL_3
changeset 66 2455ef1f5bbc
child 77 7cee158cb8cd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/lcdui_akn/lcdui/inc/CMIDChoiceGroupControl.h	Wed Sep 01 12:33:18 2010 +0100
@@ -0,0 +1,364 @@
+/*
+* Copyright (c) 2003-2006 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:  The CMIDChoiceGroup control container. Owns and manipulates
+*                the choicegroup model and creates / deletes the actual
+*                control as needed.
+*
+*/
+
+#ifndef CMIDCHOICEGROUPCONTROL_H
+#define CMIDCHOICEGROUPCONTROL_H
+
+#include <eiklbo.h>
+#include <lcdui.h>
+
+#include <AknUtils.h>
+// CAknPopupList inheritance in CMIDChoiceGroupPopupList declaration
+#include <aknPopup.h>
+
+#include "CMIDChoiceGroupListBox.h"
+#include "CMIDChoiceGroupModel.h"
+
+#ifdef RD_SCALABLE_UI_V2
+#include "CMIDForm.h"
+#endif
+
+
+#ifdef RD_TACTILE_FEEDBACK
+#include <touchfeedback.h>
+#endif
+
+
+class CMIDChoiceGroupItem;
+
+// Forward declaration for the observer interface
+class CMIDChoiceGroupControl;
+
+// Choicegroup control observer interface. The observer
+// is notified when the control size changes, so that it can adjust
+// its size accordingly
+class MMIDChoiceGroupControlObserver
+{
+public:
+    enum TChoiceGroupControlEvent
+    {
+        ESizeChanged,
+        EScrollRequest
+    };
+public:
+    virtual void HandleChoiceGroupControlEventL(
+        CMIDChoiceGroupControl* aControl,
+        TChoiceGroupControlEvent aEvent,
+        TAny* aParam) = 0;
+};
+
+// Popup list that shows the contents of the popup choice group.
+// This derived class is needed in order that opened popup can be
+// properly resized if its content changes.
+NONSHARABLE_CLASS(CMIDChoiceGroupPopupList) : public CAknPopupList
+{
+public:
+    static CMIDChoiceGroupPopupList* NewL(CEikListBox* aListBox, TInt aCbaResource,
+    AknPopupLayouts::TAknPopupLayouts aType);
+    virtual ~CMIDChoiceGroupPopupList();
+
+    // Resizes the popup list
+    void ResizeList();
+
+#ifdef RD_SCALABLE_UI_V2
+public: // from CCoeControl
+    void HandlePointerEventL(const TPointerEvent& aPointerEvent);
+#endif //RD_SCALABLE_UI_V2
+
+private:
+    CMIDChoiceGroupPopupList();
+};
+
+// Choice group control. Encapsulates the actual control and popup
+NONSHARABLE_CLASS(CMIDChoiceGroupControl) :
+        public CCoeControl,
+        public MEikListBoxObserver,
+        public MMIDChoiceGroupModelObserver
+{
+public:
+    // Constants identifying columns of column listobox data used
+    // when choice group is created and layouted
+    enum TColumnDataIndexes
+    {
+        ERadioButtonOrCheckBoxColumn,
+        EUserDefinedImagesColumn,
+        ETextColumn
+    };
+
+    CMIDChoiceGroupControl(
+        MMIDChoiceGroup::TChoiceType aType,
+        CMIDChoiceGroupItem* aItem);
+
+    virtual ~CMIDChoiceGroupControl();
+
+    // Constructs the ChoiceGroup control and the choicegroup model,
+    // but does not yet create the actual listbox. The listbox is created
+    // by a call to CreateActualControlL(), when the parent window
+    // is known (ie when the CMIDChoiceGroupItem is added to a CMIDForm
+    void ConstructL(
+        RArray<TPtrC>& aStringArray,
+        RArray<MMIDImage*>& aImageArray);
+
+    // Creates the listbox control according to choice type and
+    // fills it with elements, if the model already contains any
+    void CreateControlL(const CCoeControl* aParent, const TRect& aRect);
+
+    // Deletes the listbox control (when removed from a form). Does
+    // not empty the model, however
+    void DeleteControl();
+
+    // Set coitrol observer associated with this control
+    void SetObserver(MMIDChoiceGroupControlObserver* aObserver)
+    {
+        iObserver = aObserver;
+    }
+
+    // Get observer associated with this control
+    MMIDChoiceGroupControlObserver* Observer()
+    {
+        return iObserver;
+    }
+
+    void HiliteFirstElement(TBool aEnableHighlight);
+    void HiliteLastElement(TBool aEnableHighlight);
+    void EnableListHighlight(TBool aEnable);
+    TBool IsCurrentItemSelected();
+    void ToggleCurrentItemSelectionL();
+
+    // Nofication method to inform that the curent item has changed in the list
+    void CurrentItemChanged();
+
+    // Pops up the popup choice
+    void DoPopupL();
+
+    /**
+     * Returns the number of elements in the choice group
+     **/
+    TInt NumberOfElements() const;
+
+public: // delegated from MMIDChoiceGroup
+    void InsertElementL(TInt aIndex, const TDesC& aText, MMIDImage* aImage);
+    void DeleteElementL(TInt aIndex);
+    void DeleteAllL();
+    void SetElementL(TInt aIndex, const TDesC& aText, MMIDImage* aImage);
+    void SelectElementL(TInt aIndex, TBool aSelected);
+    TBool IsSelected(TInt aIndex);
+    void SetFontL(TInt aIndex, MMIDFont* aFont);
+    void SetFitPolicyL(TInt aFitPolicy);
+
+public: // from MMIDChoiceGroupModelObserver
+    virtual void HandleChoiceGroupModelEventL(
+        CMIDChoiceGroupModel* aModel,
+        TChoiceGroupModelEvent aEvent);
+
+public: // from MEikListBoxObserver
+    virtual void HandleListBoxEventL(CEikListBox* aControl, TListBoxEvent aEventType);
+
+public: // from CCoeControl
+    TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType);
+
+#ifdef RD_SCALABLE_UI_V2
+    void HandlePointerEventL(const TPointerEvent& aPointerEvent);
+#endif //RD_SCALABLE_UI_V2
+
+//    void SetContainerWindowL(const CCoeControl& aContainer);
+    TInt CountComponentControls() const;
+    CCoeControl* ComponentControl(TInt aIndex) const;
+
+    void SizeChanged();
+    void PositionChanged();
+    // Calculates and returns the minimum size required by the control
+    TSize MinimumSize() const;
+
+    // Draws the control (only used in popup mode)
+    virtual void Draw(const TRect& aRect) const;
+
+    // Responds to focus change.
+    void FocusChanged(TDrawNow aDrawNow);
+
+    // Handles a change to control's resources.
+    void HandleResourceChange(TInt aType);
+
+    TTypeUid::Ptr MopSupplyObject(TTypeUid aId);
+
+public:
+    inline MMIDChoiceGroup::TChoiceType ChoiceType() const;
+    void ClosePopup();
+
+    // Sets up the columndata columns
+    void SetupColumnsL(CColumnListBoxData* aColumnData);
+
+    /**
+     * Shows info popup for the current item if text does not fit and was ellipsed
+     */
+    void ShowInfoPopup();
+
+    /**
+     * Scrolls the form in order to get the focused sub-item on screen
+     */
+    void RestoreFocus();
+
+#ifdef RD_SCALABLE_UI_V2
+    /**
+     * In timed scrolling calculates the needed scroll amount and
+     * requests (via CMIDChoiceGroupItem) the form to scroll.
+     *
+     * @param aDirection    The direction of the scroll
+     */
+    void TimedScroll(CMIDForm::TDirection aDirection);
+#endif
+
+#ifdef RD_JAVA_S60_RELEASE_9_2
+    CMIDForm* Form() const;
+
+    /**
+     * Fuction sets ESingleClickDisabledHighlight - item drawer flags
+     * and reports current highlight element change event
+     */
+    void SingleClickDisableHighlightL(TBool aDisable);
+
+#endif // RD_JAVA_S60_RELEASE_9_2    
+
+#ifdef RD_TACTILE_FEEDBACK
+private:
+    MTouchFeedback* iFeedback;
+#endif
+
+
+
+protected:
+
+private:
+    void DrawIcon(CGulIcon* aIcon) const;
+    void DrawText(const TDesC& aText) const;
+
+    // Fill listbox model with items given at construct time
+    void PopulateModelL(RArray<TPtrC>& aStringArray,RArray<MMIDImage*>& aImageArray);
+
+    // Creates a new element with text and image
+    CMIDChoiceGroupElement* NewElementLC(const TDesC& aString, MMIDImage* aImage);
+
+    // Report control event to observer
+    void ReportEventL(MMIDChoiceGroupControlObserver::TChoiceGroupControlEvent aEvent,
+                      TAny* aParam = NULL);
+
+    // Calculates, whether the current item in the choice is visible,
+    // and requests a form scroll, if necessary
+    void RequestScrollIfNeededL();
+
+    // Functions for creating the choice listbox. Create() uses Allocate()
+    // and Construct(). Split to enable using LB pointer as parameter to
+    // AknPopup, and AknPopup in turn as parent to LB construction
+    CMIDChoiceGroupListBox* CreateListBoxL(const CCoeControl* aParent = NULL);
+    CMIDChoiceGroupListBox* AllocateListBoxL();
+    void ConstructListBoxL(
+        CMIDChoiceGroupListBox* aListBox,
+        const CCoeControl* aParent = NULL);
+
+    // Deletes the choice listbox (taking care not to destroy the icon array)
+    void DeleteListBox(CMIDChoiceGroupListBox* aListBox);
+
+    // Returns whether this is a popup
+    inline TBool IsPopup() const;
+
+    TRect ListBoxRect(const TRect& aRect) const;
+
+    /**
+     * Sets selection state of element at <aIndex> and posts a java event
+     * if needed
+     *
+     * @param   aIndex      The index of the element
+     * @param   aSelected   The new selection state of the element
+     * @param   aPostEvent  If true, itemStateChanged event is sent to the midlet
+     */
+    void SelectElementL(TInt aIndex, TBool aSelected, TBool aPostEvent);
+
+    void UpdateMargins();
+    void UpdatePopupListAppearanceL(TChoiceGroupModelEvent aEvent);
+
+#ifdef RD_SCALABLE_UI_V2
+    /**
+     * Finds the index of the first choicegroup element of which more than half is outside the
+     * visible form area. aScrollDirection indicates if the element is searched on the top or
+     * bottom of the form. The choicegroup listbox must be partially on visible form area in order
+     * this function to return a valid index. If the listbox is fully invisible, KErrNotFound is returned.
+     *
+     * @param aScrollDireection     The direction to which the form is being scrolled
+     * @return  Index of the element if element is found in wanted direction, KErrNotFound otherwise
+     */
+    TInt FirstInvisibleElement(CMIDForm::TDirection aScrollDirection) const;
+#endif
+
+private:
+    // Type of the choicegroup (list, popup)
+    MMIDChoiceGroup::TChoiceType iType;
+
+    // The parent item
+    CMIDChoiceGroupItem* iItem;
+
+    // Observer (usually the form item)
+    MMIDChoiceGroupControlObserver* iObserver;
+
+    // Element container model (owned outside of the listbox, because
+    // elements may be added before the control is added to a form, ie
+    // before the listbox has a parent window and can be created)
+    CMIDChoiceGroupModel* iModel;
+
+    // The actual listbox control
+    CMIDChoiceGroupListBox* iListBox;
+
+    /** The rect for placing the icon of the popup choice group, see SizeChanged() */
+    TRect iPopupIconRect;
+
+    /** The layout object for drawing the popup choice group text, see SizeChanged() */
+    TAknLayoutText iPopupTextLayout;
+
+    // Margins for choicegroup content. This includes also the margin between the label and listbox.
+    TMargins8 iContentMargins;
+
+    // Pointer to the popup list. This is needed in order that popup can be properly updated
+    // if the list box model is modified while the popup is open. No need to delete
+    // iPopupList in destructor because popup list is created and deleted in DoPopupL().
+    // iPopupList is valid only while popup list is open, otherwise it is NULL.
+    CMIDChoiceGroupPopupList* iPopupList;
+#ifdef RD_SCALABLE_UI_V2
+    TBool iPointerDragHasStarted; //True if drag has started
+
+    // True if focus has changed between TPointerEvent::EButton1Down and
+    // TPointerEvent::EButton1Up events.
+    TBool iFocusChangingWithPen;
+
+#endif //RD_SCALABLE_UI_V2
+};
+
+// --- Inlines
+
+// Return choice group type
+inline MMIDChoiceGroup::TChoiceType CMIDChoiceGroupControl::ChoiceType() const
+{
+    return iType;
+}
+
+// Returns whether this is a popup
+inline TBool CMIDChoiceGroupControl::IsPopup() const
+{
+    return (iType == MMIDChoiceGroup::EPopup);
+}
+
+#endif // CMIDCHOICEGROUPCONTROL_H