diff -r 000000000000 -r fb279309251b uidesigner/com.nokia.carbide.cpp.uiq.components/components/embeddedControlImplLibrary.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uidesigner/com.nokia.carbide.cpp.uiq.components/components/embeddedControlImplLibrary.js Fri Apr 03 23:33:03 2009 +0100 @@ -0,0 +1,359 @@ +/* +* 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: +* +*/ + + + /** Helpers for controls embedded in forms or setting item lists */ + +var DRAW_BOUNDING_RECTS = false; + +include("formLibrary.js") // for isForm function +include("settingsListLibrary.js")// for isSettingItemList +include("transient_dialog/popupDialogLibrary.js")//isDataQuery + +/** + * Implement IVisualAppearance routines with form/setting item support. + * This automatically handles reducing the content area for + * a component when it is displayed in a form/setting item list + * and returning a preferred size. + * + * @param prototype the prototype to modify

+ * This must provide these routines:
+ *

+ * drawContent(instance, laf, graphics, rect)
+ * Draw content into 'rect' (x, y are 0 and GC is shifted)
+ *

+ * getContentSize(instance, laf, size)
+ * Get the required size of the content, given the nominal constraints + * in 'size'. For instance, a text field may increase the height + * due to wrapping.

+ * The content bounds calculation is usually independent of whether the + * parent is a form, unless the rendering is significantly + * different. The calculation is different for a setting + * item list, which uses a different font. Returns a Point.
+ */ +function setupEmbeddedRendering(prototype) { + prototype.draw = function(instance, laf, graphics) { + var properties = instance.properties; + if (isForm(instance.parent)) { + var rects = getFormItemRectangles(instance, laf); + var promptRect = rects[FORM_PROMPT_RECT_INDEX]; + var contentRect = rects[FORM_CONTENT_RECT_INDEX]; + + drawFormPrompt(prototype, instance, laf, graphics, rects); + if (DRAW_BOUNDING_RECTS) { + graphics.setForeground(Colors.getColor(255, 0, 0)); + graphics.setXORMode(true); + graphics.drawRectangle(promptRect.x, promptRect.y, promptRect.width-1, promptRect.height-1 ); + graphics.setXORMode(false); + } + + var oldX = graphics.getOffX(); + var oldY = graphics.getOffY(); + graphics.setOffX(contentRect.x); + graphics.setOffY(contentRect.y); + contentRect.x = 0; + contentRect.y = 0; + this.drawContent(instance, laf, graphics, contentRect); + + if (DRAW_BOUNDING_RECTS) { + graphics.setForeground(Colors.getColor(255, 0, 0)); + graphics.setXORMode(true); + graphics.drawRectangle(contentRect.x, contentRect.y, contentRect.width-1, contentRect.height-1 ); + graphics.setXORMode(false); + } + + graphics.setOffX(oldX); + graphics.setOffY(oldY); + + } else if (isSettingItemList(instance.parent)) { + + var rects = getSettingItemRectangles(instance, laf); + var numberRect = rects[SIL_NUMBER_RECT_INDEX]; + var titleRect = rects[SIL_TITLE_RECT_INDEX]; + var contentRect = rects[SIL_CONTENT_RECT_INDEX]; + + drawSettingItemPrompt(prototype, instance, laf, graphics, rects); + if (DRAW_BOUNDING_RECTS) { + graphics.setForeground(Colors.getColor(255, 0, 0)); + graphics.setXORMode(true); + graphics.drawRectangle(numberRect.x, numberRect.y, numberRect.width-1, numberRect.height-1 ); + graphics.drawRectangle(titleRect.x, titleRect.y, titleRect.width-1, titleRect.height-1 ); + graphics.setXORMode(false); + } + + var oldX = graphics.getOffX(); + var oldY = graphics.getOffY(); + graphics.setOffX(contentRect.x); + graphics.setOffY(contentRect.y); + contentRect.x = 0; + contentRect.y = 0; + this.drawContent(instance, laf, graphics, contentRect); + + if (DRAW_BOUNDING_RECTS) { + graphics.setForeground(Colors.getColor(128, 0, 0)); + graphics.setXORMode(true); + graphics.drawRectangle(contentRect.x, contentRect.y, contentRect.width-1, contentRect.height-1 ); + graphics.setXORMode(false); + } + + graphics.setOffX(oldX); + graphics.setOffY(oldY); + + } else if (isDataQuery(instance.parent)) { + // draw inner shadows + var width = properties.size.width; + var height = properties.size.height; + graphics.setForeground(laf.getColor("control.shadow.inner")); + graphics.drawRectangle(0, 0, width - 1, height - 1); + + + graphics.setForeground(laf.getColor("control.shadow.outer")); + graphics.drawLine(1, 1, width - 1, 1); + graphics.drawLine(1, 1, 1, height - 1); + + // draw content + var rect = new Rectangle(3, 3, + properties.size.width - 6, properties.size.height - 6); + this.drawContent(instance, laf, graphics, rect); + } else { + var rect = new Rectangle(0, 0, + properties.size.width, properties.size.height); + this.drawContent(instance, laf, graphics, rect); + } + } + + prototype.getPreferredSize = function(instance, laf, wHint, hHint) { + var properties = instance.properties; + + // [[[ ordinary calculations + + // get current size + width = properties.size.width; + height = properties.size.height; + + // if either of these are empty, use the parent's bounds as starting point + if ((width == 0) || (height == 0)) { + width = instance.parent.properties.size.width; + height = instance.parent.properties.size.height; + } + + // use hints if provided + if (wHint >= 0) + width = wHint; + if (hHint >= 0) + height = hHint; + + // ]]] + + var rect = new Rectangle(0, 0, width, height); + + if (isForm(instance.parent)) { + var rects = getFormItemRectanglesInRect(instance, laf, rect); + var promptRect = rects[FORM_PROMPT_RECT_INDEX]; + var contentRect = rects[FORM_CONTENT_RECT_INDEX]; + + // ensure size is big enough for content + size = this.getContentSize(instance, laf, + new Point(contentRect.width, contentRect.height)); + + // for double-space mode, add height for the prompt + if (isDoubleSpaced(instance.parent)) { + size.y += promptRect.height + getFormLineGap(laf); + } else { + size.y += getFormLineGap(laf); + + } + } else if (isSettingItemList(instance.parent)) { + var rects = getSettingItemRectanglesInRect(instance, laf, rect); + var contentRect = rects[SIL_CONTENT_RECT_INDEX]; + + // ensure size is big enough for content + size = this.getContentSize(instance, laf, + new Point(contentRect.width, contentRect.height)); + + //size.y += getLineGap(laf); + } else { + size = this.getContentSize(instance, laf, new Point(width, height)); + } + + return size; + } + + // drawPrompt needs these routines + setupEmbeddedImagePropertyInfo(prototype); +} + + +/** + * Set up direct label editing implementation for a component with + * one editable label + * @param prototype the impl prototype to update + * @param property the name of the edited property + * @param areafunction a function, taking (instance, laf, rect), which returns the + * editable area of the label (or null). If null, the default behavior is + * to use the entire rendered area. Otherwise, the area should be a subset + * of rect (which is adjusted to the content area in a form if necessary). + * @param fontfunction a function, taking an instance and laf, which returns the + * IFont to edit with (or null). If null, the default behavior is to return + * null, indicating a default system font. + */ +function setupCommonEmbeddedDirectLabelEditing(prototype, property, + areafunction, fontfunction) { + + prototype.getPropertyPaths = function(instance) { + if (property) { + if (isForm(instance.parent)) + return [ "prompt", property ]; + else if (isSettingItemList(instance.parent)) + return [ "itemTitle", "compulsoryLabel", property ]; + else + return [ property ]; + } else { + if (isForm(instance.parent)) + return [ "prompt" ]; + else if (isSettingItemList(instance.parent)) + return [ "itemTitle", "compulsoryLabel" ]; + else + return [ ]; + } + } + + prototype.getLabelBounds = function(instance, propertyPath, laf) { + + if (isForm(instance.parent)) { + var rects = getFormItemRectangles(instance, laf); + var promptLabelRect = rects[FORM_PROMPT_LABEL_RECT_INDEX]; + var contentRect = rects[FORM_CONTENT_RECT_INDEX]; + + if (propertyPath == "prompt") { + return promptLabelRect; + } + else if (property && propertyPath == property) { + rect = contentRect; + if (areafunction) + rect = areafunction(instance, laf, rect); + return rect; + } + else /* fall through */ ; + } else if (isSettingItemList(instance.parent)) { + var rects = getSettingItemRectangles(instance, laf); + var titleLabelRect = rects[SIL_TITLE_RECT_INDEX]; + var contentRect = rects[SIL_CONTENT_RECT_INDEX]; + + if (propertyPath == "itemTitle") { + return titleLabelRect; + } + if (propertyPath == "compulsoryLabel") { + return rects[SIL_INDICATOR_RECT_INDEX]; + } + if (property && propertyPath == property) { + rect = contentRect; + if (areafunction) + rect = areafunction(instance, laf, rect); + return rect; + } + /* fall through */ + + } + + var rect = new Rectangle(0, 0, + instance.properties.size.width, instance.properties.size.height); + + if (property && propertyPath == property) { + if (areafunction) + rect = areafunction(instance, laf, rect); + + return rect; + } + + return null; + } + + prototype.getLabelFont = function(instance, propertyPath, laf) { + if (propertyPath == "prompt") + return getPromptFont(laf); + if (propertyPath == "itemTitle") + return getTitleFont(laf); + + if (property && propertyPath) { + if (fontfunction) + return fontfunction(instance, laf); + } + + return null; + } +} + +/** + * Support image validation for a form-provided promptImage property. + */ +function setupCommonEmbeddedDirectImageEditing(prototype) { + setupCommonDirectImageEditing(prototype, "promptImage", + + /* areafunction */ + function (instance, laf, propertyId) { + if (isForm(instance.parent) && + instance.parent.properties.EEikFormShowBitmaps) { + var rects = getFormItemRectangles(instance, laf); + return rects[FORM_PROMPT_IMAGE_RECT_INDEX]; + } else { + return null; + } + } + ); +} + +/** + * Support image property info support for form + */ +function setupEmbeddedImagePropertyInfo(prototype) { + // IImagePropertyInfo + prototype.getViewableSize = function(instance, propertyId, laf) { + if (propertyId == "promptImage") { + if (isForm(instance.parent)) { + // return rect even if prompt is invisible + var rects = getFormItemRectangles(instance, laf); + var rect = rects[FORM_PROMPT_IMAGE_RECT_INDEX]; + if (rect != null) + return new Point(rect.width, rect.height); + } + } + return null; + } + + prototype.isScaling = function(instance, propertyId, laf) { + if (propertyId == "promptImage") { + return isScalingIcons(); + } + return true; + } + + prototype.getAlignmentWeights = function(instance, propertyId, laf) { + if (propertyId == "promptImage") { + return new Point(ImageUtils.ALIGN_CENTER_OR_LEFT, ImageUtils.ALIGN_CENTER_OR_TOP); + } + return null; + } + + prototype.isPreservingAspectRatio = function(instance, propertyId, laf) { + if (propertyId == "promptImage") { + return true; + } + return true; + } + +}