diff -r 6385c4c93049 -r 8e6fa1719340 browserui/browser/FavouritesInc/BrowserFavouritesView.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browserui/browser/FavouritesInc/BrowserFavouritesView.h Wed Sep 01 12:31:04 2010 +0100 @@ -0,0 +1,579 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: +* Declaration of class CBrowserFavouritesView. +* +* +*/ + + +#ifndef BROWSER_FAVOURITES_VIEW_H +#define BROWSER_FAVOURITES_VIEW_H + +// INCLUDE FILES +#include + +#include "BrowserFavouritesModelObserver.h" +#include "BrowserAppViewBase.h" +#include "CommandVisibility.h" +#include "CommsModel.h" +#include "BrowserFavouritesModel.h" +#include + +// FORWARD DECLARATION +class CFavouritesItemList; +class CBrowserFavouritesContainer; +class CBrowserFavouritesModel; +class CBrowserFavouritesIncrementalOp; +class CBrowserFavouritesListboxState; + +// CLASS DECLARATION + +/** +* Base class for Bookmarks View and Saved Decks View of the WML Browser. +* The common behaviour of these views is collected here. This includes: +* Handling view activation / decativation; +* Interpreting (common) commands; +* Providing context-specific menus. +* Pure virtual; derived classes must provide model and control components +* and items to display. A number of methods can be overridden. +*/ +class CBrowserFavouritesView:public CBrowserViewBase, + public MEikListBoxObserver, + public MBrowserFavouritesModelObserver, + public MCommsModelObserver + { + public: // construction + + /** + * Destructor. + */ + virtual ~CBrowserFavouritesView(); + + public: // From MCbaSetter (CBrowserViewBase) + + /** + * Return command set id, to be displayed. + * @since 1.2 + * @return The command set's resource id. + */ + virtual TInt CommandSetResourceIdL(); + + /** + * Set command set lsk,rsk,msk dynamically via pointers. + * Derived classes should implement, though it can be empty. + * If it does nothing, empty softkeys will be assigned + * @since 5.0 + */ + void CommandSetResourceDynL(TSKPair& /*lsk*/, TSKPair& /*rsk*/, TSKPair& /*msk*/) {}; + + /** + * Return the resource ID of the seamless folder. + * @param aContextID Context ID of the seamless folder. + * @return The resource ID of the seamless folder or zero if it is not + * seamless. + */ + static TInt GetSeamlessFolderResourceID( TInt aContextID ); + + /** + * Return the resource ID of the seamless folder title. + * @param aContextID Context ID of the seamless folder. + * @return The resource ID of the seamless folder title or zero if it is not + * seamless. + */ + static TInt GetSeamlessFolderTitleResourceID( TInt aContextID ); + + /** + * Examines if the given ID is an ID of a seamless folder. + * @param aContextID Context ID of the folder. + * @return The ETrue if the given ID is a seamless ID otherwise EFalse. + * seamless. + */ + static TBool IsSeamlessFolder( TInt aContextID ); + + + /** + * Configure Context Menu Resource + * + * context-sensitive menu when item(s) marked + */ + void ConfigContextMenu(); + + static TInt RefeshFavoriteListBox( TAny* aFavouritesView ); + + public: // public methods from CAknView (CBrowserViewBase) + + /** + * Handle command. + * @since 1.2 + * @param aCommand Command id. + */ + virtual void HandleCommandL( TInt aCommand ); + + /** + * Get view id. Derived classes must provide this method. + * @return The view id for this view. + */ + virtual TUid Id() const = 0; + + void OpenFixedFolderL(TInt aUid); + + protected : + + // For Adaptive bookmarks folder navigation, used in Bookmarks View + + void SetRootFolderForAdaptiveBookmarks(); + + protected : // construction + + /** + * Constructor. + * @param aApiProvider The API provider. + */ + CBrowserFavouritesView( MApiProvider& aApiProvider, TInt aInitialFolderId = KFavouritesRootUid ); + + /** + * Second phase constructor. Leaves on failure. + * @param aViewResourceId Resource id for this view. + * Derived classes should call this first during construction. + */ + void ConstructL( TInt aViewResourceId ); + + protected: // menu initialization + + /** + * Initialize context-sensitive menu. + * @param aResourceId Resource id of the menu pane. + * @param aMenuPane Menu pane object being initialized. + * @param aIndex Index into the visibility map. + * @param aState Selection state. + */ + virtual void DynInitMenuPaneL + ( + TInt aResourceId, + CEikMenuPane* aMenuPane, + TCommandVisibility::TIndex aIndex, + const TBrowserFavouritesSelectionState& aState + ) = 0; + + protected: // new methods + + /** + * Get resource id of text to be displayed in navi pane when + * root folder is shown (TBUF). + * Derived classes must provide this method. + * @since 1.2 + * @return Resource id. + */ + virtual TInt RootTitleResourceId() const = 0; + + /** + * Get resource id of Options menu (RESOURCE MENU_BAR). + * Derived classes must provide this method. + * @since 1.2 + * @return Resource id. + */ + virtual TInt OptionsMenuResourceId() const = 0; + + /** + * Get resource id of OK-Options menu (RESOURCE MENU_BAR). + * Derived classes must provide this method. + * @since 1.2 + * @return Resource id. + */ + virtual TInt OkOptionsMenuResourceId() const = 0; + + protected: // component creation + + /** + * Create the model. Leave on failure. The model is owned by the + * caller (this view). + * Derived classes must provide this method. + * @return The constructed model. + */ + virtual CBrowserFavouritesModel* CreateModelL() = 0; + + /** + * Create the container (the main control of the view). The container + * is owned by the caller (this view). + * Leave on failure. + * Derived classes must provide this method. + * @return The constructed main control. + */ + virtual CBrowserFavouritesContainer* CreateContainerL() = 0; + + protected: // data retrieval + + /** + * Get items to be displayed in a folder. Expects the model's db be + * open. + * @param aFolder Folder which contains the items. + * @return List of items. Pushed on the cleanup stack. + */ + virtual CFavouritesItemList* GetItemsLC( TInt aFolder ); + + public: + + /** + * Get the model. + * @return The model. + */ + inline CBrowserFavouritesModel& Model() const; + + inline void ShowNextFolerL(TBool aNext) { OpenNextFolderL(aNext); } + + protected: // component retrieval + + /** + * Get the container (the view's main control). + * @return The container. Can be NULL (when view is not activated, + * container does not exist). + */ + inline CBrowserFavouritesContainer* Container() const; + + /** + * Get Uid of the folder shown. + * @return Current folder's Uid. + */ + inline TInt CurrentFolder() const; + + + protected: // new methods + + /** + * If there is a preferred highlight uid, attempt to highlight that. + * If succeeded, preferred highlight uid is cleared ("used up"). + * Otherwise do nothing. + */ + void HighlightPreferredL(); + + /** + * Some displayed data has changed (Favourites database, AP-s, etc). + * Update the view so changes become visible. Safe to call if the view + * is not active; in this case it does nothing. + * This method should not be called if the data change is due to direct + * user activity (opening folders etc.); only for notification + * processing. + * @param aDbErrorNote If ETrue, unsuccesful database access will bring + * up an error note. + */ + virtual void RefreshL( TBool aDbErrorNote = EFalse ); + + /** + * Redraw. + */ + void HandleClientRectChange(); + + protected: // from CAknView + + /** + * Activate the view. Open the database. If it was activated + * previously, try to restore the view as it was before deactivation. + * @param aPrevViewId Previous View Id. + * @param aCustomMessageId Custom Message Id. + * @param aCustomMessage Custom Message. + */ + void DoActivateL + ( + const TVwsViewId& aPrevViewId, + TUid aCustomMessageId, + const TDesC8& aCustomMessage + ); + + /** + * Deactivate the view. Close the database. Save the view state, + * so it can be restored on future activations. + */ + void DoDeactivate(); + + /** + * Initialize context-sensitive menu. Do not override this one; + * override the other. + * @param aResourceId Resource id of the menu pane. + * @param aMenuPane Menu pane object being initialized. + */ + void DynInitMenuPaneL + ( TInt aResourceId, CEikMenuPane* aMenuPane ); + + /** + * Handle foreground event. + * @param aForeground ETrue if foreground. + */ + virtual void HandleForegroundEventL( TBool aForeground ); + + protected: // from MEikListBoxObserver + + /** + * Handle listbox event. + * @param aListBox Listbox in which the event occurred. + * @param aEventType Event. + */ + virtual void HandleListBoxEventL + ( CEikListBox* aListBox, + MEikListBoxObserver::TListBoxEvent aEventType ); + + private: // command handling + + /** + * Command "Back", when showing a folder. Open the parent folder. + * of the currently shown folder. Highlight the folder just closed. + */ + void CloseCurrentFolderL(); + + /** + * Command "Open (folder)". Open the highlighted folder. + * Does nothing if no folder is highlighted. + */ + void OpenCurrentFolderL(); + + /** + * Command "Open (folder)" from OK-Options menu. Open the marked folder. + * Does nothing if no folder is marked or more is marked. + */ + void OpenMarkedFolderL(); + + /** + * Command "Remove" or "Erase". Delete marked item(s). + * Does nothing if no item is highlighted / marked. + */ + virtual void DeleteMarkedItemsL(); + + protected: + /** + * Command "New folder". New folders are alwas created in the root + * folder. + * @return The uid of the newly created folder, or KFavouritesNullUid + * (if not created). + */ + TInt AddNewFolderL(); + + private: + + /** + * Command "Move To Folder". Launch target folder selection dialog and + * move marked item(s). + */ + void MoveMarkedItemsL(); + + + /** + * Command "Rename". Rename current item. + * Does nothing if no item is highlighted. + */ + void RenameCurrentItemL(); + + protected: // implementation details. + + /** + * Open a folder by Uid and display its contents. Expects the + * model's db be open. + * @param aFolder Folder to open. + */ + void OpenFolderL( TInt aFolder ); + + /** + * Open next folder. + * @param aForward Open next folder if ETrue, previous if EFalse. + */ + virtual void OpenNextFolderL( TBool aForward ); + + private: + + /** + * Fill listbox with folder contents. Expects the model's db be open. + * @param aFolder Folder to display. + * @param aKeepState If ETrue, try to restore marks/highlight/top item + * position. + */ + void FillListboxL( TInt aFolder, TBool aKeepState ); + + /** + * Display confirmation dialog before deleting items. The dialog + * displayed is context-dependent (different dialog for one/more + * items, and for non-empty folders). + * @param aUids List of Uids (both item & folder) about to be deleted. + * @param aFolderUids List of folder uids about to be deleted. These + * uids are also in aUids, and are needed only to improve performance. + * (The non-empty folder checking, which is the only database query in + * this method, is performed only for folders. The effect of this is + * visible only if many items are selected.) + * @return ETrue if delete was confirmed; EFalse if not, or in case of + * any error (e.g. database error). + */ + TBool ConfirmDeleteL + ( CArrayFix& aUids, CArrayFix& aFolderUids ); + + /** + * After deleting items, display appropriate note about the outcome. + * @param aUids List of Uids that were selected for deletion. + * @param aNotDeletedUids List of Uids which are not deleted. + */ + void DisplayResultOfDeleteL + ( + const CArrayFix& aUids, + const CArrayFix& aNotDeletedUids + ); + + /** + * Launch target folder selection dialog and return uid of selected + * folder (or KFavouritesNullUid if cancelled or in case of any error). + * If no folders exist, user is prompted to create one. + * @param aExcludeFolder Exclude this folder from selection (current + * folder). + * @return Uid of selected folder, or KFavouritesNullUid. + */ + TInt SelectTargetFolderL( TInt aExcludeFolder ); + + /** + * "First pass" of moving is done; items that could be moved without + * user intervention, has been moved. Some of them may be still there, + * because it is unmovable (e.g. Homepage), or conflicts with a name in + * the target folder. For the latter ones, ask for each if replace the + * old ones, and act accordingly. + * Display appropriate note about what happened. + * @param aFolder The target folder. + * @param aUids List of Uids that were selected for moving. + * @param aUnmovableUids List of Uids which could never be moved. + * @param aConflictingNameUids List of conflicting name Uids. + */ + void HandleMoveResultL + ( + TInt aFolder, + const CArrayFix& aUids, + const CArrayFix& aUnmovableUids, + const CArrayFix& aConflictingNameUids + ); + + /** + * For each of the items in the list, display a rename dialog before + * moving them into the folder. + * @param aFolder The target folder. + * @param aUids List of Uids that were selected for moving. + */ + void RenameAndMoveItemsL + ( const CArrayFix& aUids, TInt aFolder ); + protected: // new methods + + /** + * Update and draw navi pane (show tabs for root, or "1/4" style text + * for subfolders). + * No sanity check; expects the model's table be open. + */ + virtual void UpdateNaviPaneL(); + + private: // new methods + + /** + * The container passes back key events to the view first, to + * allow moving between folders. (The container does not know + * anything about folders.) + */ + friend class CBrowserFavouritesContainer; + + protected: + /** + * Handle key event (called from the container, to allow moving between + * folders. + * @param aKeyEvent The key event. + * @param aType Key event type. + * @return Response (was the key event consumed?). + */ + virtual TKeyResponse OfferKeyEventL + ( const TKeyEvent& aKeyEvent, TEventCode aType ); + + /** + * Reset state with deactivation event + */ + void ResetStateInDeActivation(); + + /** + * Needed for updating tool bar buttons when there is a up/down arrow key events received. + **/ + virtual void UpdateToolbarButtonsState(); + + private: // from MWmlBrowserFavouritesModelObserver + + /** + * Handle model change. + */ + void HandleFavouritesModelChangeL(); + + private: // from MCommsModelObserver + + /** + * Handle Comms Model change (AP update). + */ + void HandleCommsModelChangeL(); + + private: // default item settings + + /** + * Set Prefered the current item + */ + void SetPreferedCurrentItemL(); + + /** + * Set Prefered the current item + */ + void SetUnPreferedCurrentItemL(); + + + protected: // data + + /// Preferred highlight uid. + TInt iPreferredHighlightUid; + + /// If ETrue, OK-Options menu is shown instead of normal Options menu. + TBool iShowOkOptions; + + /// Top-level control of the view. Owned + CBrowserFavouritesContainer* iContainer; + + /// Uid of the current folder. + TInt iCurrentFolder; + + /// ETrue between DoActivateL() and DoDeactivate(). + TBool iIsActivated; + + private: // data + + /// The model (data handling). Owned. + CBrowserFavouritesModel* iModel; + TInt iLastSelection; + /// Incremental operation, or NULL if no such. Owned. + CBrowserFavouritesIncrementalOp* iIncrementalOp; + /// ETrue if data update is missed due to incremental operation. + TBool iUpdatePending; + /// Asynchronously update the favourite item's List Box + CIdle* iFavViewRefresh; + protected: + + TBool iRefresh; // Flag to indicate that Bookmarks list should be refreshed. + // ETrue by default, turned off only in cases we want to avoid + // double refresh. Checked in HandleFavouritesModelChangeL. + + TInt iInitialFolder; //Folder to which browser is launched in embedded mode + + // Flag to indicate that we are about to open Preferences view, + // in order not to return to root folder afterwards. + TBool iSaveStateOnDeactivate; + + CBrowserFavouritesListboxState* iSavedListboxState; + }; + +#include "BrowserFavouritesView.inl" + +#endif + +// End of file