/*
* 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:
*
*/
// INCLUDE FILES
#include "loadgen_maincontainer.h"
#include "loadgen.hrh"
#include "loadgen_document.h"
#include "loadgen_appui.h"
#include "loadgen_model.h"
#include <loadgen_extraicons.mbg>
#include <aknlists.h>
#include <eikclb.h>
#include <eikclbd.h>
#include <aknconsts.h>
#include <AknUtils.h>
#include <aknnotewrappers.h>
#include <AknIconArray.h>
#include <f32file.h>
#include <AknIconUtils.h>
#include <AknDef.h>
#include <akntitle.h>
#include <eikspane.h>
_LIT(KExtraIconsPath, "\\resource\\apps\\loadgen_extraicons.mif");
// ===================================== MEMBER FUNCTIONS =====================================
void CLoadGenMainContainer::ConstructL(const TRect& aRect)
{
iModel = static_cast<CLoadGenDocument*>(reinterpret_cast<CEikAppUi*>(iEikonEnv->AppUi())->Document())->Model();
iModel->SetMainContainer(this);
CreateWindowL();
SetRect(aRect);
SetBlank();
// init listbox
iListBox = new(ELeave) CLoadGenCAknSingleGraphicStyleListBox;
iListBox->SetContainerWindowL(*this);
iListBox->ConstructL(this, EAknListBoxMarkableList);
iListBox->View()->SetListEmptyTextL(_L("No loads activated\n(Select new load from Options to generate new load)"));
// create icon array and add marking indicator to it
CAknIconArray* iconArray = new(ELeave) CAknIconArray(1);
CleanupStack::PushL(iconArray);
CFbsBitmap* markBitmap = NULL;
CFbsBitmap* markBitmapMask = NULL;
TRgb defaultColor;
defaultColor = iEikonEnv->Color(EColorControlText);
AknsUtils::CreateColorIconL(AknsUtils::SkinInstance(),
KAknsIIDQgnIndiMarkedAdd,
KAknsIIDQsnIconColors,
EAknsCIQsnIconColorsCG13,
markBitmap,
markBitmapMask,
AknIconUtils::AvkonIconFileName(),
EMbmAvkonQgn_indi_marked_add,
EMbmAvkonQgn_indi_marked_add_mask,
defaultColor
);
CGulIcon* markIcon = CGulIcon::NewL(markBitmap, markBitmapMask);
iconArray->AppendL(markIcon);
// append icons from loadgen_extraicons.mif
TFileName extraIconsPath;
extraIconsPath.Copy(KExtraIconsPath);
TParsePtrC parse((CEikonEnv::Static()->EikAppUi()->Application())->AppFullName()); // get path where this app is installed
extraIconsPath.Insert(0, parse.Drive()); // drive letter
CFbsBitmap* redBitmap = NULL;
CFbsBitmap* redBitmapMask = NULL;
CFbsBitmap* greenBitmap = NULL;
CFbsBitmap* greenBitmapMask = NULL;
AknIconUtils::CreateIconL(redBitmap, redBitmapMask, extraIconsPath, EMbmLoadgen_extraiconsQgn_prob_status_red, EMbmLoadgen_extraiconsQgn_prob_status_red_mask);
AknIconUtils::CreateIconL(greenBitmap, greenBitmapMask, extraIconsPath, EMbmLoadgen_extraiconsQgn_prob_status_green, EMbmLoadgen_extraiconsQgn_prob_status_green_mask);
CGulIcon* redIcon = CGulIcon::NewL(redBitmap, redBitmapMask);
iconArray->AppendL(redIcon);
CGulIcon* greenIcon = CGulIcon::NewL(greenBitmap, greenBitmapMask);
iconArray->AppendL(greenIcon);
// set icon array
CleanupStack::Pop(); // iconArray
iListBox->ItemDrawer()->ColumnData()->SetIconArray(iconArray);
iListBox->CreateScrollBarFrameL(ETrue);
iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
iListBox->SetListBoxObserver(this);
// set size of the listbox
TSize outputRectSize;
AknLayoutUtils::LayoutMetricsSize(AknLayoutUtils::EMainPane, outputRectSize);
TRect outputRect(outputRectSize);
iListBox->SetRect(outputRect);
iListBox->ActivateL();
ActivateL();
}
// --------------------------------------------------------------------------------------------
CLoadGenMainContainer::~CLoadGenMainContainer()
{
if (iListBox)
delete iListBox;
}
// --------------------------------------------------------------------------------------------
void CLoadGenMainContainer::SizeChanged()
{
TSize outputRectSize;
AknLayoutUtils::LayoutMetricsSize(AknLayoutUtils::EMainPane, outputRectSize);
TRect outputRect(outputRectSize);
if (iListBox)
iListBox->SetRect(outputRect);
}
// --------------------------------------------------------------------------------------------
TInt CLoadGenMainContainer::CountComponentControls() const
{
if (iListBox)
return 1;
else
return 0;
}
// --------------------------------------------------------------------------------------------
CCoeControl* CLoadGenMainContainer::ComponentControl(TInt /*aIndex*/) const
{
if (iListBox)
return iListBox;
else
return NULL;
}
// --------------------------------------------------------------------------------------------
TInt CLoadGenMainContainer::CurrentListBoxItemIndex()
{
if (iListBox)
{
return iListBox->CurrentItemIndex();
}
else
return KErrNotFound;
}
// --------------------------------------------------------------------------------------------
void CLoadGenMainContainer::SetListBoxTextArrayL(CDesCArray* aTextArray)
{
if (iListBox)
{
iListBox->Model()->SetItemTextArray(aTextArray);
iListBox->Model()->SetOwnershipType(ELbmOwnsItemArray);
iListBox->HandleItemAdditionL();
iListBox->UpdateScrollBarsL();
}
}
// --------------------------------------------------------------------------------------------
const CArrayFix<TInt>* CLoadGenMainContainer::ListBoxSelectionIndexes()
{
if (iListBox)
{
const CListBoxView::CSelectionIndexArray* indices = iListBox->SelectionIndexes();
return static_cast<const CArrayFix<TInt>*>(indices);
}
else
return NULL;
}
// --------------------------------------------------------------------------------------------
TInt CLoadGenMainContainer::ListBoxSelectionIndexesCount()
{
if (iListBox)
{
return iListBox->SelectionIndexes()->Count();
}
else
return KErrNotFound;
}
// --------------------------------------------------------------------------------------------
void CLoadGenMainContainer::Draw(const TRect& aRect) const
{
CWindowGc& gc = SystemGc();
gc.Clear(aRect);
}
// --------------------------------------------------------------------------------------------
void CLoadGenMainContainer::HandleControlEventL(CCoeControl* /*aControl*/,TCoeEvent /*aEventType*/)
{
}
// --------------------------------------------------------------------------------------------
void CLoadGenMainContainer::SetDefaultTitlePaneTextL()
{
_LIT(KTitleText, "Load Gener.");
CEikStatusPane* sp = iEikonEnv->AppUiFactory()->StatusPane();
CAknTitlePane* tp = static_cast<CAknTitlePane*>( sp->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) );
tp->SetTextL( KTitleText );
}
// --------------------------------------------------------------------------------------------
TKeyResponse CLoadGenMainContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType)
{
if(aType != EEventKey)
return EKeyWasNotConsumed;
if (iListBox && iListBox->Model()->NumberOfItems() > 0)
{
/*
if (aKeyEvent.iCode == EKeyBackspace || aKeyEvent.iCode == EKeyDelete)
{
iModel->StopSelectedOrHighlightedItemsL();
return EKeyWasConsumed;
}
else
{
return iListBox->OfferKeyEventL(aKeyEvent, aType);
}
*/
TBool shiftKeyPressed = (aKeyEvent.iModifiers & EModifierShift) ||
(aKeyEvent.iModifiers & EModifierLeftShift) ||
(aKeyEvent.iModifiers & EModifierRightShift);
TBool controlKeyPressed = (aKeyEvent.iModifiers & EModifierCtrl) ||
(aKeyEvent.iModifiers & EModifierRightCtrl);
// handle OK/Enter keys
if ((aKeyEvent.iCode == EKeyOK || aKeyEvent.iCode == EKeyEnter) && (shiftKeyPressed || controlKeyPressed))
{
return iListBox->OfferKeyEventL(aKeyEvent, aType); //send to listbox if modifiers
}
// handle OK/Enter keys
else if (aKeyEvent.iCode == EKeyOK || aKeyEvent.iCode == EKeyEnter)
{
iModel->ShowItemActionMenuL();
}
// handle delete key
else if (aKeyEvent.iCode == EKeyBackspace || aKeyEvent.iCode == EKeyDelete)
{
iModel->StopSelectedOrHighlightedItemsL();
}
else
return iListBox->OfferKeyEventL(aKeyEvent, aType);
}
return EKeyWasNotConsumed;
}
// --------------------------------------------------------------------------------------------
void CLoadGenMainContainer::HandleListBoxEventL(CEikListBox* /*aListBox*/, TListBoxEvent aEventType)
{
switch (aEventType)
{
case EEventEnterKeyPressed:
case EEventItemDoubleClicked:
{
iModel->ShowItemActionMenuL();
}
break;
default:
break;
}
}
// --------------------------------------------------------------------------------------------
void CLoadGenMainContainer::HandleResourceChange(TInt aType)
{
if ( aType == KEikDynamicLayoutVariantSwitch )
{
TRect mainPaneRect;
AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
SetRect(mainPaneRect);
TSize outputRectSize;
AknLayoutUtils::LayoutMetricsSize(AknLayoutUtils::EMainPane, outputRectSize);
TRect outputRect(outputRectSize);
iListBox->SetRect(outputRect);
}
else
{
CCoeControl::HandleResourceChange(aType);
}
}
// --------------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------------
void CLoadGenCAknSingleGraphicStyleListBox::SizeChanged()
{
// call the base class function first
CAknSingleGraphicStyleListBox::SizeChanged();
// customize the list box
TRAP_IGNORE(SizeChangedL());
}
// --------------------------------------------------------------------------------------------
void CLoadGenCAknSingleGraphicStyleListBox::SizeChangedL()
{
const TInt KEmptySize = 2;
// disable separator line
ItemDrawer()->ColumnData()->SetSeparatorLinePosition(ENoLine);
// enable marquee
ItemDrawer()->ColumnData()->EnableMarqueeL(ETrue);
// set fonts
const CFont* font = AknLayoutUtils::FontFromId(EAknLogicalFontPrimarySmallFont);
ItemDrawer()->ColumnData()->SetColumnFontL(0, font);
ItemDrawer()->ColumnData()->SetColumnFontL(1, font);
ItemDrawer()->ColumnData()->SetColumnFontL(2, font);
ItemDrawer()->ColumnData()->SetColumnFontL(3, font);
// set row height
TInt rowHeight = font->HeightInPixels()+5;
TSize itemCellSize = View()->ItemDrawer()->ItemCellSize();
itemCellSize.iHeight = rowHeight;
SetItemHeightL(rowHeight);
View()->ItemDrawer()->SetItemCellSize(itemCellSize);
// set icon sizes
TInt normalIconSize = rowHeight * 0.7;
TInt markingIconSize = rowHeight * 0.8;
ItemDrawer()->ColumnData()->SetSubCellIconSize(0, TSize(normalIconSize,normalIconSize));
ItemDrawer()->ColumnData()->SetSubCellIconSize(2, TSize(markingIconSize,markingIconSize));
ItemDrawer()->ColumnData()->SetSubCellIconSize(3, TSize(KEmptySize,KEmptySize));
// set column widths
ItemDrawer()->ColumnData()->SetColumnWidthPixelL(0, normalIconSize + 2*normalIconSize * 0.15);
ItemDrawer()->ColumnData()->SetColumnWidthPixelL(1, itemCellSize.iWidth-KEmptySize-markingIconSize);
ItemDrawer()->ColumnData()->SetColumnWidthPixelL(2, markingIconSize);
ItemDrawer()->ColumnData()->SetColumnWidthPixelL(3, KEmptySize);
// set baseline for the text
ItemDrawer()->ColumnData()->SetColumnBaselinePosL(1, font->HeightInPixels()-font->BaselineOffsetInPixels());
// set margins
TMargins iconMargins;
iconMargins.iBottom = 0;
iconMargins.iLeft = normalIconSize * 0.15;
iconMargins.iRight = normalIconSize * 0.15;
iconMargins.iTop = 0;
TMargins textMargins;
textMargins.iBottom = 0;
textMargins.iLeft = markingIconSize * 0.15;
textMargins.iRight = markingIconSize * 0.15;
textMargins.iTop = 0;
ItemDrawer()->ColumnData()->SetColumnMarginsL(0, iconMargins);
ItemDrawer()->ColumnData()->SetColumnMarginsL(1, textMargins);
ItemDrawer()->ColumnData()->SetColumnMarginsL(2, iconMargins);
ItemDrawer()->ColumnData()->SetColumnMarginsL(3, iconMargins);
/*
const TInt KEmptySize = 2;
// enable marquee
ItemDrawer()->ColumnData()->EnableMarqueeL(ETrue);
// set fonts
const CFont* font = AknLayoutUtils::FontFromId(EAknLogicalFontPrimarySmallFont);
ItemDrawer()->ColumnData()->SetColumnFontL(0, font);
ItemDrawer()->ColumnData()->SetColumnFontL(1, font);
ItemDrawer()->ColumnData()->SetColumnFontL(2, font);
ItemDrawer()->ColumnData()->SetColumnFontL(3, font);
// set row height
TInt rowHeight = font->HeightInPixels()+7;
TSize itemCellSize = View()->ItemDrawer()->ItemCellSize();
itemCellSize.iHeight = rowHeight;
SetItemHeightL(rowHeight);
View()->ItemDrawer()->SetItemCellSize(itemCellSize);
// set icon sizes
TInt normalIconSize = rowHeight * 0.6;
TInt markingIconSize = rowHeight * 0.8;
ItemDrawer()->ColumnData()->SetSubCellIconSize(0, TSize(normalIconSize,normalIconSize));
ItemDrawer()->ColumnData()->SetSubCellIconSize(2, TSize(markingIconSize,markingIconSize));
ItemDrawer()->ColumnData()->SetSubCellIconSize(3, TSize(KEmptySize,KEmptySize));
// set column widths
ItemDrawer()->ColumnData()->SetColumnWidthPixelL(0, normalIconSize);
ItemDrawer()->ColumnData()->SetColumnWidthPixelL(1, itemCellSize.iWidth-KEmptySize-markingIconSize);
ItemDrawer()->ColumnData()->SetColumnWidthPixelL(2, markingIconSize);
ItemDrawer()->ColumnData()->SetColumnWidthPixelL(3, KEmptySize);
// set baseline for the text
ItemDrawer()->ColumnData()->SetColumnBaselinePosL(1, font->HeightInPixels()-font->BaselineOffsetInPixels());
// set margins
TMargins iconMargins;
iconMargins.iBottom = 0;
iconMargins.iLeft = 0;
iconMargins.iRight = 0;
iconMargins.iTop = 0;
TMargins textMargins;
textMargins.iBottom = 0;
textMargins.iLeft = markingIconSize * 0.15;
textMargins.iRight = markingIconSize * 0.15;
textMargins.iTop = 0;
ItemDrawer()->ColumnData()->SetColumnMarginsL(0, iconMargins);
ItemDrawer()->ColumnData()->SetColumnMarginsL(1, textMargins);
ItemDrawer()->ColumnData()->SetColumnMarginsL(2, iconMargins);
ItemDrawer()->ColumnData()->SetColumnMarginsL(3, iconMargins);
*/
}
// --------------------------------------------------------------------------------------------
// End of File