uidesigner/com.nokia.carbide.cpp.uiq.components/components/formLibrary.js
author tzelaw
Tue, 14 Apr 2009 15:03:19 -0500
changeset 94 d74b720418db
parent 2 d760517a8095
permissions -rw-r--r--
Test framework support: Ask debugger to remember DebugTarget so test framework can use it to setup test framework related utility. With this we can use the DebugUI way of launching while keeping test framework functionality

/*
* 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: 
*
*/



DRAW_BOUNDING_RECTS = false;

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

var FORM_ID = "com.nokia.sdt.series60.CAknForm";

function isForm(formInstance) {
	return formInstance.componentId == FORM_ID;
}

function isDoubleSpaced(formInstance) {
	return formInstance.properties.EEikFormUseDoubleSpacedFormat;
}

function isShowingBitmaps(formInstance) {
	return formInstance.properties.EEikFormShowBitmaps;
}
		
function getFormSingleDividerOffset(formInstance, laf) {
	return laf.getInteger("form.divider.offset.single", 20);
}

function getFormPromptDividerOffset(formInstance, laf) {
	if (isDoubleSpaced(formInstance)) {
		if (isShowingBitmaps(formInstance))
			return laf.getInteger("form.inset", 20);
		else
			return laf.getInteger("form.divider.offset.double", 6);
	}
	return getFormSingleDividerOffset(formInstance, laf);
}

function getFormLineGap(laf) {
	return laf.getInteger("form.padding", 5);
}

function getFormPadding(laf) {
	return laf.getInteger("form.padding", 5);
}

/**
 *	Get all the rectangles associated with an item in a form.
 *
 *	@param rect the item's rectangle (i.e. an entire row)
 * @returns an array with:
 *
 *	0) Rectangle prompt bounds, as a whole
 *	1) Rectangle content bounds, as a whole
 *	2) Rectangle prompt image bounds, or null
 *	3) Rectangle prompt label bounds
 *	4) int column where divider is drawn
 */
var FORM_PROMPT_RECT_INDEX = 0;
var FORM_CONTENT_RECT_INDEX = 1;
var FORM_PROMPT_IMAGE_RECT_INDEX = 2;
var FORM_PROMPT_LABEL_RECT_INDEX = 3;
var FORM_DIVIDER_OFFSET_INDEX = 4;

function getFormItemRectanglesInRect(instance, laf, rect) {
	var formInstance = instance.parent;
	var dividerOffset = getFormPromptDividerOffset(instance.parent, laf);

	var bmsize = laf.getDimension("form.image.size").x;
	
	var promptRect, contentRect, promptImageRect = null, promptLabelRect;
	
	// NOTE: S60 seems to NOT add padding for prompts, but we do it anyway
	if (isDoubleSpaced(formInstance)) {
		var promptExtent = getFontHeight(getFormPromptFont(laf));
	
		//		println("rect="+rect+", dividerOffset="+dividerOffset+", promptExtent="+promptExtent);
		promptRect = new Rectangle(rect.x + dividerOffset + getFormPadding(laf), rect.y + getFormPadding(laf), 
			rect.width - dividerOffset - getFormPadding(laf), promptExtent);
		promptLabelRect = new Rectangle(promptRect.x, promptRect.y,
			promptRect.width, promptRect.height);
			
		if (isShowingBitmaps(formInstance)) {
			// image is on left side of divider, flush right
			promptImageRect = new Rectangle(
				rect.x + dividerOffset - bmsize - getFormPadding(laf)/3, 
				rect.y,
				bmsize,
				bmsize);
				
		}
		
		var leftMargin = dividerOffset + getFormPadding(laf) * 2;
		contentRect = new Rectangle(rect.x + leftMargin, 
				rect.y + promptExtent + getFormLineGap(laf),
				rect.width - leftMargin, 
				rect.height - promptExtent);
		
	} else {
		promptRect = new Rectangle(rect.x, rect.y, 
						dividerOffset - getFormPadding(laf), rect.height);

		if (isShowingBitmaps(formInstance)) {
			// image is on left side of label, flush left
			promptImageRect = new Rectangle(
				promptRect.x, 
				promptRect.y + (promptRect.height - bmsize) / 2,
				bmsize,
				bmsize);

			promptLabelRect = new Rectangle(
				promptRect.x + bmsize + 2, promptRect.y, 
				promptRect.width - bmsize, promptRect.height);
		} else {
			promptLabelRect = new Rectangle(
				promptRect.x, promptRect.y, 
				promptRect.width, promptRect.height);
		}
		
		var leftMargin = dividerOffset + getFormPadding(laf);
		contentRect = new Rectangle(rect.x + leftMargin, rect.y, 
				rect.width - leftMargin, rect.height);
		
	}
		
	var rects = [ promptRect, contentRect, promptImageRect, promptLabelRect, dividerOffset ];
	//println( "rects = " + rects);
	return rects;
}

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

function getFormPromptFont(laf) {
	return laf.getFont("DenseFont");
}

function getFormPromptFlags(instance) {
	var flags = Font.OVERFLOW_ELLIPSIS;
	
	if (isDoubleSpaced(instance.parent) || isShowingBitmaps(instance.parent))
		flags |= Font.ALIGN_LEFT;
	else
		flags |= Font.ALIGN_RIGHT;
	
	return flags;
}

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

function drawFormPrompt(prototype, instance, laf, graphics, rects) {
	var formInstance = instance.parent;
	var properties = instance.properties;
	var prompt = properties.prompt;
	
	var font = getFormPromptFont(laf);
	graphics.setFont(font);

	var rect = rects[FORM_PROMPT_RECT_INDEX];	
	graphics.setBackground(laf.getColor("EEikColorWindowBackground"));
	graphics.fillRectangle(rect);

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

	// in single spaced only, draw line before prompt if separator before or after is specified
	// and this is not the first form field (2.x only)
	var version = getComponentVersions();
	if (!isDoubleSpaced(formInstance) && !isFirstField(instance) && properties.EEikDlgItemSeparatorBefore
		&& version.getMajor() < 3) {
		graphics.drawLine(rect.x, rect.y, rect.width + getFormPadding(laf) - 1, rect.y);
	}

	// draw bitmap on the left side of the divider
	if (isShowingBitmaps(formInstance)) {
		var imageRect = rects[FORM_PROMPT_IMAGE_RECT_INDEX];
		renderImage(prototype, instance, laf, graphics, 
			0, 0, "promptImage", false);
	}
	
	rect = rects[FORM_PROMPT_LABEL_RECT_INDEX];
	var height = getFontHeight(font);
	var textRect = new Rectangle(rect.x, rect.y + (rect.height - height)/2,
			rect.width, height);
	var promptText = chooseScalableText(prompt, font, textRect.width);
	graphics.drawFormattedString(promptText, textRect, getFormPromptFlags(instance), 0);	
}

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