notepad/notepad1/LibSrc/NpdEdwinLines.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:32:31 +0100
branchRCL_3
changeset 30 bd7edf625bdd
parent 0 f979ecb2b13e
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* 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 "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:  Implementation of paper lines of Notepad/Template Editor.
*
*/


// INCLUDE FILES
#include <AknUtils.h>
#include <barsread.h>
#include <applayout.cdl.h>
#include <eikrted.h>    // for CRichTextEditor
#include <aknlayoutscalable_apps.cdl.h>
#include <aknappui.h>
#include <eikdialg.h>
#include <AknsFrameBackgroundControlContext.h>
#include <skinlayout.cdl.h>

#include "NpdEdwinLines.h"
#include "NpdEdwin.h"
#include "NpdLibPanic.h"


// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CNotepadEdwinLines::CNotepadEdwinLines
// public Constructor
// -----------------------------------------------------------------------------
//
CNotepadEdwinLines::CNotepadEdwinLines(CEikDialog* aParent)
    : CCoeControl(),iParent(aParent),iBgContext(NULL)
    	{
    	
    	}

// -----------------------------------------------------------------------------
// CNotepadEdwinLines::~CNotepadEdwinLines
// Destructor
// -----------------------------------------------------------------------------
//
CNotepadEdwinLines::~CNotepadEdwinLines()
	{
    	iRects.Close();
    	if(iBgContext != NULL)
    		{
    		delete iBgContext;
    		iBgContext = NULL;	
		}
	}

// -----------------------------------------------------------------------------
// CNotepadEdwinLines::AddRectsAndLayout
// from CNotepadEdwinLines (called from SizeChanged)
// -----------------------------------------------------------------------------
//
void CNotepadEdwinLines::AddRectsAndLayout(RRegion& aRegion)
	{
	TAknLayoutRect mainNotesPane;
	TAknLayoutRect lineLayout;
	TAknLayoutRect line;
	TAknLayoutScalableParameterLimits textLimits ;
	
	TRect tempMainPane;
	TRect statusPane;
	AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane,tempMainPane);
	AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane,statusPane);
	TRect mainPane(TPoint(0, 0), tempMainPane.Size());
	mainNotesPane.LayoutRect(mainPane, AknLayoutScalable_Apps::main_notes_pane().LayoutLine());
	lineLayout.LayoutRect(mainNotesPane.Rect(),AknLayoutScalable_Apps::list_notes_pane().LayoutLine());
	textLimits = AknLayoutScalable_Apps::list_notes_text_pane_ParamLimits();

	TInt lineCount = textLimits.LastRow() - textLimits.FirstRow() + 1;
	
	// The array iRects should be reset, when there is a change 
	// in the no of lines after a layout switch
	
	if ( iRects.Count() != lineCount )
		{
		iRects.Reset();
   		for (TInt j(textLimits.FirstRow()); j <= textLimits.LastRow(); j++)
			{
    		iRects.Append( TAknLayoutRect() );
			}
		}
	
	for ( TInt i(textLimits.FirstRow()); i <= textLimits.LastRow(); i++ )
		{
		line.LayoutRect(lineLayout.Rect(),AknLayoutScalable_Apps::list_notes_text_pane(i).LayoutLine());
		iRects[i].LayoutRect(line.Rect() ,AknLayoutScalable_Apps::list_notes_text_pane_g1().LayoutLine());
		aRegion.AddRect(iRects[i].Rect());
		}
	}

// -----------------------------------------------------------------------------
// CNotepadEdwinLines::ConstructFromResourceL
// from CCoeControl
// -----------------------------------------------------------------------------
//
void CNotepadEdwinLines::ConstructFromResourceL(TResourceReader& /*aReader*/)
	{
	TAknLayoutScalableParameterLimits textLimits ;  
    	
    	TInt ignor;
	TRAP(ignor,
    		iBgContext = CAknsFrameBackgroundControlContext::NewL( 
    			KAknsIIDQsnFrNotepad, 
    			TRect(0,0,0,0), 
    			TRect(0,0,0,0), 
    			EFalse );
        		);
        ignor = KErrNone;		
    	textLimits = AknLayoutScalable_Apps::list_notes_text_pane_ParamLimits();
	for (TInt i(textLimits.FirstRow()); i <= textLimits.LastRow(); i++)
		{
	 	User::LeaveIfError(iRects.Append(TAknLayoutRect()));
		}
	}

// -----------------------------------------------------------------------------
// CNotepadEdwinLines::Draw
// from CCoeControl
// -----------------------------------------------------------------------------
//
void CNotepadEdwinLines::Draw(const TRect& /*aRect*/) const
	{
    	CWindowGc& gc = SystemGc();
    	for(TInt i(iRects.Count() - 1); i >= 0; i--)
        		{
        		iRects[i].DrawRect(gc);
        		}
    	}

// ---------------------------------------------------------
// CNotepadEdwinLines::MopSupplyObject(TTypeUid aId)
// Handles a change to the control's resources.
// ---------------------------------------------------------
//
TTypeUid::Ptr CNotepadEdwinLines::MopSupplyObject(TTypeUid aId)
	{
	if((aId.iUid == MAknsControlContext::ETypeId) && (iBgContext != NULL))
		{
		return MAknsControlContext::SupplyMopObject(aId, iBgContext);
		}
	return CCoeControl::MopSupplyObject(aId);
	}

// ---------------------------------------------------------
// CNotepadEdwinLines::HandleResourceChange(TInt aType)
// Handles a change to the control's resources.
// ---------------------------------------------------------
//
void CNotepadEdwinLines::HandleResourceChange(TInt aType)
	{
	if(aType == KAknsMessageSkinChange)
		{
		if(iBgContext)
			{
			delete iBgContext;
			iBgContext = NULL;
			}
		
		TInt ignor;
		TRAP(ignor,
			iBgContext = CAknsFrameBackgroundControlContext::NewL( 
				KAknsIIDQsnFrNotepad, 
				TRect(0,0,0,0), 
				TRect(0,0,0,0), 
				EFalse );
			);
		ignor = KErrNone;
		SizeChanged();
		DrawDeferred();
		}
	}

void CNotepadEdwinLines::SizeChanged()
	{
    	TRect rect( iParent->Rect() );
    	RRegion region;
    	AddRectsAndLayout(region);
    	Window().SetShape(region);
    	region.Close();
	}

// -----------------------------------------------------------------------------
// CNotepadEdwinLines::SetContainerWindowL
// cf. CEikEdwin::SetContainerWindowL.
// -----------------------------------------------------------------------------
//
void CNotepadEdwinLines::SetContainerWindowL(const CCoeControl& aContainer)
	{
    	if ( !OwnsWindow() )
        		{
        		CreateWindowL(&aContainer); // include SetMopParent
        		}
    	else
        		{
        		CCoeControl::SetContainerWindowL(aContainer);
        		}
	}
// End of File