diff -r 000000000000 -r d760517a8095 uidesigner/com.nokia.sdt.series60.componentlibrary/components/formLibrary.js --- /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; +} + + +