diff -r 12af337248b1 -r bd7edf625bdd calendarui/controller/src/calentoolbarimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/controller/src/calentoolbarimpl.cpp Wed Sep 01 12:32:31 2010 +0100 @@ -0,0 +1,583 @@ +/* +* Copyright (c) 2009 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: Calendar Toolbar Implementation + * +*/ + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // Calendar commands +#include + +#include "calendarui_debug.h" +#include "calentoolbarimpl.h" +#include "calencontroller.h" +#include "calendar.hrh" +#include "calenviewmanager.h" +#include "CalenUid.h" +#include "calenviewinfo.h" + +const TInt KPositionZero( 0 ); + + +// --------------------------------------------------------------------------- +// CCalenToolbarImpl::NewL +// 1st phase of construction +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +CCalenToolbarImpl* CCalenToolbarImpl::NewL( CCalenController& aController ) + { + TRACE_ENTRY_POINT; + + CCalenToolbarImpl* self = new( ELeave ) CCalenToolbarImpl( aController ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + TRACE_EXIT_POINT; + return self; + } + +// --------------------------------------------------------------------------- +// CCalenToolbarImpl::CCalenToolbarImpl +// C++ constructor +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +CCalenToolbarImpl::CCalenToolbarImpl( CCalenController& aController ) + : iController( aController ) + { + TRACE_ENTRY_POINT; + TRACE_EXIT_POINT; + } + +// --------------------------------------------------------------------------- +// CCalenToolbarImpl::ConstructL +// 2nd phase of construction +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CCalenToolbarImpl::ConstructL() + { + TRACE_ENTRY_POINT; + + iAppUi = static_cast( CEikonEnv::Static()->EikAppUi() ); + iAppToolbar = iAppUi->CurrentFixedToolbar(); + + if(!AknLayoutUtils::LayoutMirrored()) + { + iCalenToolbar = CAknToolbar::NewL(R_CALEN_TOOLBAR_EXTENSION); + } + else + { + iCalenToolbar = CAknToolbar::NewL(R_CALEN_TOOLBAR_EXTENSION_MIRRORED); + } + iCalenToolbar->SetToolbarObserver( static_cast(this) ); + iCalenToolbar->SetWithSliding(ETrue); + iCalenToolbar->SetCloseOnAllCommands(EFalse); + iStartUpToolbar = ETrue; + + TRACE_EXIT_POINT; + } + +// --------------------------------------------------------------------------- +// CCalenToolbarImpl::SetNextViewIcon +// When view is changed, update button icon for the next view +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CCalenToolbarImpl::SetNextViewIcon( CGulIcon *aIcon ) + { + TRACE_ENTRY_POINT; + CAknButton* button = static_cast( + iCalenToolbar->ControlOrNull( ECalenNextView ) ); + if( button ) + { + CAknButtonState* state = button->State(); // get current button state, not own + state->SetIcon( aIcon ); + } + else + { + delete aIcon; + } + iCalenToolbar->DrawDeferred(); + TRACE_EXIT_POINT; + } + +// --------------------------------------------------------------------------- +// CCalenToolbarImpl::~CCalenToolbarImpl +// Destructor +// --------------------------------------------------------------------------- +// +CCalenToolbarImpl::~CCalenToolbarImpl() + { + TRACE_ENTRY_POINT; + if(iCalenToolbar) + { + delete iCalenToolbar; + iCalenToolbar = NULL; + } + if(iExtensionToolbarCommands.Count()) + { + iExtensionToolbarCommands.Close(); + } + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenToolbarImpl::IsVisible +// Check if the toolbar is currently visible +// ---------------------------------------------------------------------------- +TBool CCalenToolbarImpl::IsVisible() + { + TRACE_ENTRY_POINT; + TRACE_EXIT_POINT; + return iCalenToolbar->IsShown(); + } + +// ---------------------------------------------------------------------------- +// CCalenToolbarImpl::SetToolbarVisibility +// Show or hide the toolbar. Has no effect if the toolbar is disabled +// ---------------------------------------------------------------------------- +void CCalenToolbarImpl::SetToolbarVisibilityL( TBool aMakeVisible ) + { + TRACE_ENTRY_POINT; + + // Hides/Unhides toolbar items temporarily. + // EFalse :: drawing the items normally in portrait and landscape + // ETrue :: toolbar draws just background in landscape and is hidden in portrait + iAppToolbar->HideItemsAndDrawOnlyBackground(!aMakeVisible); + iCalenToolbar->HideItemsAndDrawOnlyBackground(!aMakeVisible); + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenToolbarImpl::UpdateToolbar +// Update the toolbar using Calendar layout information +// ---------------------------------------------------------------------------- +void CCalenToolbarImpl::UpdateToolbar() + { + TRACE_ENTRY_POINT; + + if( AknLayoutUtils::PenEnabled() ) + { + TRect mainPaneRect; + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, + mainPaneRect ); + + TAknLayoutRect popup_toolbar_window_cp01; + popup_toolbar_window_cp01.LayoutRect( + mainPaneRect, + AknLayoutScalable_Apps::popup_toolbar_window_cp01().LayoutLine() ); + TRect toolbar_rect( popup_toolbar_window_cp01.Rect() ); + + iCalenToolbar->SetPosition( toolbar_rect.iTl ); + } + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenToolbarImpl::Toolbar +// Returns a reference to the CAknToolbar +// ---------------------------------------------------------------------------- +CAknToolbar& CCalenToolbarImpl::Toolbar() + { + TRACE_ENTRY_POINT; + TRACE_EXIT_POINT; + return *iCalenToolbar; + } + +// --------------------------------------------------------------------------- +// CCalenToolbarImpl::CalenToolbarExtensionL +// Dummy implementation. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TAny* CCalenToolbarImpl::CalenToolbarExtensionL( TUid /*aExtensionUid*/ ) + { + TRACE_ENTRY_POINT; + TRACE_EXIT_POINT; + return NULL; + } + +// ---------------------------------------------------------------------------- +// CCalenToolbarImpl::DynInitToolbarL +// Called before toolbar is drawn. Allows modification of toolbar components +// based on current context +// ---------------------------------------------------------------------------- +void CCalenToolbarImpl::DynInitToolbarL( TInt aResourceId, CAknToolbar* aToolbar ) + { + TRACE_ENTRY_POINT; + + if( aResourceId == R_CALEN_TOOLBAR && + aToolbar == iCalenToolbar ) + { + UpdateToolbar(); + + iCalenToolbar->SetFocusing( EFalse ); + } + // for handling switchview command to populate the toolbar extension + if(aResourceId == ECalenSwitchView) + { + PopulateChangeViewToolbarExtensionL(); + } + + if(iStartUpToolbar) + { + CAknToolbarExtension* extension = iCalenToolbar->ToolbarExtension(); + extension->RemoveItemL(ECalenLastCommand); + iStartUpToolbar = EFalse; + } + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenToolbarImpl::OfferToolbarEventL +// Handles toolbar events for a toolbar item +// ---------------------------------------------------------------------------- +void CCalenToolbarImpl::OfferToolbarEventL( TInt aCommand ) + { + TRACE_ENTRY_POINT; + + if (iCalenToolbar) + { + iCalenToolbar->ToolbarExtension()->SetShown( EFalse ); + } + + // For handling toolbar extension commands + TInt position = iExtensionToolbarCommands.Find(aCommand); + if(position!=KErrNotFound) + { + TUid viewUid; + TVwsViewId targetViewId( KUidCalendar, viewUid.Uid(aCommand)); + iController.ViewManager().SetRepopulation(EFalse); + iController.ViewManager().RequestActivationL(targetViewId); + } + else + { + // Send all the other toolbar events to the controller. + // This allows customisations + // to handle commands from custom toolbar buttons. + iController.IssueCommandL( aCommand ); + } + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenToolbarImpl::HandleControlEvent +// Handles an event from an observed control +// ---------------------------------------------------------------------------- +void CCalenToolbarImpl::HandleControlEventL( CCoeControl* aControl, + TCoeEvent aEventType ) + { + TRACE_ENTRY_POINT; + + if( AknLayoutUtils::PenEnabled() ) + { + // forward control event to touch pane + if( iAppUi->TouchPane() ) + { + iAppUi->TouchPane()->HandleControlEventL( aControl, aEventType ); + } + } + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenToolbarImpl::CreateButtonL +// Create calendar toolbar buttons +// ---------------------------------------------------------------------------- +CAknButton* CCalenToolbarImpl::CreateButtonL( CGulIcon* aIcon, + TInt aIconTextId, + TInt aToolTipId ) + { + TRACE_ENTRY_POINT; + + CAknButton* button = NULL; + HBufC* iconText = StringLoader::LoadLC(aIconTextId); + HBufC* toolTipText = StringLoader::LoadLC(aToolTipId); + + button = CAknButton::NewL( aIcon, NULL, NULL, NULL, iconText->Des(), + toolTipText->Des(), KAknButtonTextInsideFrame, 0 ); + + CleanupStack::PopAndDestroy(toolTipText); + CleanupStack::PopAndDestroy(iconText); + + button->SetIconScaleMode( EAspectRatioNotPreserved ); + button->SetFocusing( EFalse ); + button->SetTextAndIconAlignment(CAknButton::EIconOverText ); + + TRACE_EXIT_POINT; + return button; + } + +// ---------------------------------------------------------------------------- +// CCalenToolbarImpl::CreateButtonForCustomViewsL +// Create calendar toolbar buttons +// ---------------------------------------------------------------------------- +CAknButton* CCalenToolbarImpl::CreateButtonForCustomViewsL( CGulIcon* aIcon, + TInt aIconTextId, + const TDesC &aIconText ) + { + TRACE_ENTRY_POINT; + + CAknButton* button = NULL; + HBufC* iconText = StringLoader::LoadLC(aIconTextId); + HBufC* toolTipText = HBufC::NewLC(aIconText.Length()+ iconText->Length()+1); + toolTipText->Des().Append(iconText->Des()); + toolTipText->Des().Append(_L(" ")); + toolTipText->Des().Append(aIconText); + + button = CAknButton::NewL( aIcon, NULL, NULL, NULL, aIconText, + toolTipText->Des(), KAknButtonTextInsideFrame, 0 ); + + CleanupStack::PopAndDestroy(toolTipText); + CleanupStack::PopAndDestroy(iconText); + + button->SetIconScaleMode( EAspectRatioNotPreserved ); + button->SetFocusing( EFalse ); + button->SetTextAndIconAlignment(CAknButton::EIconOverText ); + + TRACE_EXIT_POINT; + return button; + } + +// ---------------------------------------------------------------------------- +// CCalenToolbarImpl::PopulateChangeViewToolbarExtensionL +// Populate the change view toolbar extension with available cycling views +// read from viewinfoaray from view manager +// ---------------------------------------------------------------------------- +void CCalenToolbarImpl::PopulateChangeViewToolbarExtensionL() + { + TRACE_ENTRY_POINT; + + TInt viewPosition(KErrNotFound); + // get the view info array from viewmanager + RPointerArray& viewInfoArray = iController.ViewManager().ViewInfoArray(); + // get the current view id + TUid currentViewUid = iController.ViewManager().CurrentView(); + + // get view cycle position list + RArray viewPositionArray; + GetViewPositionList( currentViewUid , viewPositionArray, viewInfoArray); + TInt position(KPositionZero); + + ResetToolbarExtensionCommandsL(); + // add toolbar items for native views + for(TInt index = KPositionZero ;index < viewPositionArray.Count() ;index++) + { + viewPosition = viewInfoArray.Find( viewPositionArray[index], + CCalenViewInfo::ViewInfoIdentifier ); + if( viewPosition != KErrNotFound ) + { + // add view toolbar items to the extendable toolbar + AddItemsToExtendableToolbarL( position, + *(viewInfoArray[viewPosition]) ); + position++; + } + } + viewPositionArray.Reset(); + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenToolbarImpl::ResetCalenToolbar +// Delete calendar toolbar +// ---------------------------------------------------------------------------- +void CCalenToolbarImpl::ResetCalendarToolbar() + { + TRACE_ENTRY_POINT; + + if(iCalenToolbar) + { + delete iCalenToolbar; + iCalenToolbar = NULL; + } + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenToolbarImpl::SetToolbarExtensionFocus +// For handling focus in toolbar extension +// ---------------------------------------------------------------------------- +void CCalenToolbarImpl::SetToolbarExtensionFocus(TBool aFocus) + { + TRACE_ENTRY_POINT; + + iCalenToolbar->ToolbarExtension()->SetShown(aFocus); + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenToolbarImpl::GetViewPositionList +// Get view position list based on the cycling positions +// ---------------------------------------------------------------------------- +void CCalenToolbarImpl::GetViewPositionList( TUid aCurrentViewUid, + RArray& aViewPositionArray, + RPointerArray& aViewInfoArray) + { + TRACE_ENTRY_POINT; + TInt currViewInfoPos = aViewInfoArray.Find( aCurrentViewUid , + CCalenViewInfo::ViewInfoIdentifier ); + + TInt index = aViewInfoArray.Find( KUidCalenMonthView , CCalenViewInfo::ViewInfoIdentifier ); + + while( index!= aViewInfoArray.Count() ) + { + if( index == currViewInfoPos) // If last item, + { + index ++; + continue; + } + if(( aViewInfoArray[index]->CyclePosition() != CCalenView::ENoCyclePosition ) ) + { + aViewPositionArray.Append(aViewInfoArray[index]->ViewUid()); + } + index++; + } + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenToolbarImpl::AddItemsToExtendableToolbarL +// Add view toolbar items to the extendable toolbar as per view cycle positions +// ---------------------------------------------------------------------------- +void CCalenToolbarImpl::AddItemsToExtendableToolbarL( TInt aIndex, + CCalenViewInfo& aViewInformation ) + { + TRACE_ENTRY_POINT; + CGulIcon* icon = NULL; + CAknButton* button = NULL; + + CCalenView* viewIcon = static_cast( + iController.AppUi().View( aViewInformation.ViewUid()) ); + // get view icon + icon = viewIcon->ViewIconL(); + + TInt iconTextId(KErrNotFound); + TInt toolTipTextId(KErrNotFound); + + if( ( iController.ViewManager().IsNativeView(aViewInformation.ViewUid() ) ) ) + { + + GetResourceIdForToolTip( aViewInformation.ViewUid(), iconTextId, + toolTipTextId ); + // create toolbar button + button = CreateButtonL( icon,iconTextId, toolTipTextId ); + } + + else + { + const TDesC& iconText = aViewInformation.MenuName(); + iconTextId = R_QTN_CALE_TB_CUSTOM_VIEW; + + button = CreateButtonForCustomViewsL( icon, iconTextId, iconText ); + } + + // assign viewId as command + TInt command = viewIcon->ViewId().iViewUid.iUid; + + CAknToolbarExtension* extension = iCalenToolbar->ToolbarExtension(); + // Append the toolbar button to the calendar toolbar + extension->AddItemL( button, EAknCtButton, command , KAknButtonSizeFitText, aIndex ); + + iExtensionToolbarCommands.Append(command); + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenToolbarImpl::ResetToolbarExtensionCommandsL +// Reset toolbar extension commands +// ---------------------------------------------------------------------------- +void CCalenToolbarImpl::ResetToolbarExtensionCommandsL() + { + TRACE_ENTRY_POINT; + if(iExtensionToolbarCommands.Count()) + { + for(TInt index = 0; index < iExtensionToolbarCommands.Count();index++) + { + CAknToolbarExtension* extension = iCalenToolbar->ToolbarExtension(); + extension->RemoveItemL(iExtensionToolbarCommands[index]); + } + iExtensionToolbarCommands.Close(); + } + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// Get IconText and tooltip text resource ids for extendable toolbar items +// ---------------------------------------------------------------------------- +void CCalenToolbarImpl::GetResourceIdForToolTip( TUid aViewUid, TInt& aIconTextId, + TInt& aToolTipTextId ) + { + TRACE_ENTRY_POINT; + + switch(aViewUid.iUid) + { + case KCalenMonthViewUidValue: + { + aIconTextId = R_QTN_CALE_TB_MONTH_VIEW; + aToolTipTextId = R_QTN_CALE_TB_MONTH_VIEW_TOOLTIP; + } + break; + case KCalenWeekViewUidValue: + { + aIconTextId = R_QTN_CALE_TB_WEEK_VIEW; + aToolTipTextId = R_QTN_CALE_TB_WEEK_VIEW_TOOLTIP; + } + break; + case KCalenDayViewUidValue: + { + aIconTextId = R_QTN_CALE_TB_DAY_VIEW; + aToolTipTextId = R_QTN_CALE_TB_DAY_VIEW_TOOLTIP; + } + break; + case KCalenTodoViewUidValue: + { + aIconTextId = R_QTN_CALE_TB_TODO_VIEW; + aToolTipTextId = R_QTN_CALE_TB_TODO_VIEW_TOOLTIP; + } + break; + default: + break; + } + + TRACE_EXIT_POINT; + } + +// End of file