uidesigner/com.nokia.carbide.cpp.uiq.components/components/settingsListLibrary.js
author timkelly
Tue, 04 May 2010 09:39:10 -0500
branchRCL_2_4
changeset 1325 98aebbb322f3
parent 0 fb279309251b
permissions -rw-r--r--
Fix bug 11210. NPEs when editing SBSv2 config tab data on old SBSv2 build configs. Now allows saving SBSv2 variant data for old SBSv2 configs (i.e. before we display the build alias in the config name)

/*
* Copyright (c) 2006 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: 
*
*/


function isSettingItemList(instance) {
	return instance.isInstanceOf("com.nokia.sdt.series60.CAknSettingItemList");
}



DRAW_BOUNDING_RECTS = false;

include("renderLibrary.js")
include("implLibrary.js")
include("srcgenLibrary.js")


function fontForType(silProperties, laf) {
	return laf.getFont("NormalFont");
}

function getLineBounds(silProperties, laf) {
	var font = fontForType(silProperties, laf);
	// * 2 accounts for label and content
	var p = new Point(0, getFontHeight(font) * 2 + laf.getInteger("list.padding", 8));
	p.y += laf.getInteger("extra.padding", 0) * 2;
	//println("getLineBounds="+p);
	return p;
}

function maxDisplayableItems(silProperties, laf) {
	var header = 0;
	var bounds = getLineBounds(silProperties, laf);
	var max = Math.floor((silProperties.size.height - laf.getInteger("list.padding", 8) / 2) / bounds.y)
	//println("maxDisplayableItems="+max+" bounds="+bounds+" silProperties.size.height="+silProperties.size.height);
	return max;
}

function verticalContentMargin(silProperties, laf) {
	var maxItems = maxDisplayableItems(silProperties, laf);
	var lineBounds = getLineBounds(silProperties, laf);
	return maxItems * lineBounds.y + laf.getInteger("list.padding", 8) / 2;
}


function isShowingNumbers(silInstance) {
	return silInstance.properties.EAknSettingItemNumberedStyle;
}
		
function getPromptDividerOffset(silInstance, laf) {
	var column;
	if (silInstance.properties.EAknSettingItemNumberedStyle)
		column = laf.getInteger("settingitemlist.numbered.padding", 20);
	else
		column = laf.getInteger("settingitemlist.padding", 6);
	return column;
}

function getSILPaddingY(laf) {
	return laf.getInteger("settingitemlist.padding.y", 6);
}

function getSILPaddingX(laf) {
	return laf.getInteger("settingitemlist.padding.x", 6);
}

/**
 *	Get all the rectangles associated with an item in a setting item list.
 *
 *	@param rect the item's rectangle (i.e. an entire row)
 * @returns an array with:
 *
 *	0) Rectangle numeric prompt bounds, as a whole
 *	1) Rectangle title bounds, as a whole
 *	2) Rectangle compulsory indicator bounds, as a whole
 *	3) Rectangle content bounds, as a whole
 *	4) int column where divider is drawn
 */
var SIL_ITEM_RECT_INDEX = 0;
var SIL_NUMBER_RECT_INDEX = 1;
var SIL_TITLE_RECT_INDEX = 2;
var SIL_INDICATOR_RECT_INDEX = 3;
var SIL_CONTENT_RECT_INDEX = 4;
var SIL_DIVIDER_OFFSET_INDEX = 5;

function getSettingItemRectanglesInRect(instance, laf, rect) {
	var silInstance = instance.parent;
	var dividerOffset = getPromptDividerOffset(instance.parent, laf);

	var promptRect, contentRect, titleRect, indiRect;
	
	var contentHeight = laf.getInteger("settingitemlist.content.height", 16);
	var vertPadding = getSILPaddingY(laf);	
	var horizPadding = getSILPaddingX(laf);
	
	promptRect = new Rectangle(rect.x, rect.y + vertPadding, 
					dividerOffset - horizPadding, rect.height - vertPadding);
	
	var leftMargin = dividerOffset + horizPadding;
	titleRect = new Rectangle(leftMargin, rect.y + vertPadding, 
		rect.width - leftMargin, contentHeight);

	var contentX = laf.getInteger("settingitemlist.content.x", 32);
	contentRect = new Rectangle(rect.x + contentX,
			rect.y + rect.height / 2 + vertPadding, 
			rect.width - contentX - horizPadding/2,
			contentHeight);

	indiRect = new Rectangle(leftMargin, contentRect.y,
			contentRect.x - leftMargin, contentRect.height);
			
	var rects = [ rect, promptRect, titleRect, indiRect, contentRect, dividerOffset ];
	//pr("Rects = " +rects);
	return rects;
}

function getSettingItemRectangles(instance, laf) {
	var rect = new Rectangle(0, 0, 
		instance.properties.size.width, instance.properties.size.height);
	return getSettingItemRectanglesInRect(instance, laf, rect);
}

function getPromptFont(laf) {
	return laf.getFont("AnnotationFont");
}
function getTitleFont(laf) {
	return laf.getFont("NormalFont");
}
function getIndiFont(laf) {
	return laf.getFont("NormalFont");
}

function getPromptFlags(instance) {
	var flags = Font.OVERFLOW_ELLIPSIS;
	
	flags |= Font.ALIGN_CENTER;
	
	return flags;
}

function isFirstField(instance) {
	var siblings = instance.parent.children;
	if (siblings != null)
		return instance == siblings[0];
		
	return false;
}

function calcSettingItemNumber(silInstance, self) {
	var number = silInstance.properties.initialNumber;
	var numberHidden = silInstance.properties.EAknSettingItemIncludeHiddenInOrdinal;
	for (var c in silInstance.children) {
		var sib = silInstance.children[c];
		if (sib == self)
			break;
		if (numberHidden || !sib.properties.itemHidden)
			number++;
	}
	return number;
}

function setSettingsListLineStyle(laf, graphics) {
	var version = getComponentVersions();
	if ((version.getMajor() >= 3 || (version.getMajor() == 2 && version.getMinor() >= 8))
			&& laf.getDimension("screen.size").x > 208) {
		// use dashed line
		graphics.setLineWidth(2);
		graphics.setLineDash([ 2 ]);
	} else {
		// use solid line
		graphics.setLineWidth(1);
	}

}

function drawSettingItemPrompt(prototype, instance, laf, graphics, rects) {
	var formInstance = instance.parent;
	var properties = instance.properties;

	var number = calcSettingItemNumber(instance.parent, instance);

	var rect = rects[SIL_NUMBER_RECT_INDEX];	
	graphics.setBackground(laf.getColor("EEikColorControlBackground"));
	//graphics.setBackground(getBackgroundColor(instance, laf));
	
	graphics.fillRectangle(rect);

	graphics.setForeground(laf.getColor("EEikColorControlText"));

	var itemRect = rects[SIL_ITEM_RECT_INDEX];
	
	// no decorations on 3.1+
	if (laf.getBoolean("decorations", true)) {
		setSettingsListLineStyle(laf, graphics);
		graphics.drawLine(rects[SIL_DIVIDER_OFFSET_INDEX], 
			itemRect.y + itemRect.height - 1,  
			itemRect.width, itemRect.y + itemRect.height - 1);
	
		//graphics.drawLine(rects[SIL_DIVIDER_OFFSET_INDEX], itemRect.y, rects[SIL_DIVIDER_OFFSET_INDEX], itemRect.height);
	}
	
	// draw number
	var font = getPromptFont(laf);
	graphics.setFont(font);
	if (isShowingNumbers(formInstance)) {
		var numberRect = rects[SIL_NUMBER_RECT_INDEX];
		graphics.drawFormattedString(number, numberRect, 
			Font.ALIGN_RIGHT,
			0);	
	}
	
	// draw item title
	var font = getTitleFont(laf);
	graphics.setFont(font);
	rect = rects[SIL_TITLE_RECT_INDEX];
	var height = getFontHeight(font);
	var textRect = new Rectangle(rect.x, rect.y + (rect.height - height)/2,
			rect.width, height);
	var titleText = chooseScalableText(properties.itemTitle, font, textRect.width);
	graphics.drawFormattedString(titleText, textRect, 0, 0);	
	
	// draw compulsory indicator
	var font = getIndiFont(laf);
	graphics.setFont(font);	
	rect = rects[SIL_INDICATOR_RECT_INDEX];
	graphics.setForeground(laf.getColor("CAknSettingItemList.CompulsoryIndicator"));
	graphics.drawFormattedString(properties.compulsoryLabel, rect, 0, 0);
	
	// draw content rect
	rect = rects[SIL_CONTENT_RECT_INDEX];
	graphics.setBackground(laf.getColor("CAknSettingItemList.ContentBackground"));
	graphics.fillRectangle(rect);
	graphics.setForeground(laf.getColor("CAknSettingItemList.ContentForeground"));
}

function getSettingItemContentBounds(instance, laf) {
	var rect = new Rectangle(0, 0, 
		instance.properties.size.width, instance.properties.size.height);
	if (isForm(instance.parent)) {
		return getSettingItemRectanglesInRect(instance, laf, rect)[SIL_CONTENT_RECT_INDEX];
	}
	return rect;		
}