uidesigner/com.nokia.sdt.series60.componentlibrary/components/formLibrary.js
changeset 2 d760517a8095
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uidesigner/com.nokia.sdt.series60.componentlibrary/components/formLibrary.js	Tue Mar 24 22:20:21 2009 -0500
@@ -0,0 +1,222 @@
+/*
+* 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("listitem.text"));
+
+	// 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;		
+}
+
+
+