diff -r 000000000000 -r d760517a8095 uidesigner/com.nokia.carbide.cpp.uiq.components/components/editorLibrary.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uidesigner/com.nokia.carbide.cpp.uiq.components/components/editorLibrary.js Tue Mar 24 22:20:21 2009 -0500 @@ -0,0 +1,271 @@ +/* +* 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: +* +*/ + + +include("containerLibrary.js") +include("embeddedControlImplLibrary.js")// for isSettingItemList + +editorLibraryStrings = getLocalizedStrings("editorLibrary"); + +/** + * Set up rendering support for editor components. This clears out + * a rectangle of the component's size and draws text inside it + * according to a component-specific formatter and MFNE layout. + * This sets up a component to appear in a form. + * + * @param prototype the prototype to add IVisualAppearance to. + * The prototype must implement these functions: + *

+ *

  • + * getDisplayText(instance): return the text formatted for display + * (may be empty or null). Return the entire + * string, even if longer than getMaxLength() + *
  • + * getMaxLength(instance): return the character limit on the text + *
  • + * getFlags(instance, laf): return an IFont#xxx mask desribing + * parameters to font.drawFormattedString() + * + */ +function setupEditorRendering(prototype) { + prototype.drawContent = function(instance, laf, graphics, rect) { + var properties = instance.properties; + + if( properties.isVisible != null && properties.isVisible == false) + return; + + var flags = this.getFlags(instance, laf); + if (isSettingItemList(instance.parent)) { + flags = (flags & ~Font.ALIGN_MASK) | Font.ALIGN_CENTER; + + // white on blue doesn't look good antialiased + flags = (flags & ~Font.ANTIALIAS_MASK) | Font.ANTIALIAS_OFF; + } + + var font = this.getFont(instance, laf); + if (font == null) + font = laf.getFont("NormalFont"); + + graphics.setFont(font); + + //graphics.setBackground(laf.getColor("CAknSettingItemList.ContentBackground")); + graphics.setBackground(getBackgroundColor(instance, laf)); + graphics.fillRectangle(rect); + + var color = null; + if (prototype.getDisplayColor) { + color = prototype.getDisplayColor(instance, laf); + } + if (color == null && isSettingItemList(instance.parent)) + color = laf.getColor("CAknSettingItemList.ContentForeground"); + + if (color == null) + color = laf.getColor("EEikColorControlText"); + graphics.setForeground(color); + + var text = "" + this.getDisplayText(instance); + if (instance.isInstanceOf("com.nokia.carbide.uiq.CEikEdwinBase")) + text = text.replace(/\n/,""); + else + text = chooseScalableText(text, font, rect.width); + var maxLength = this.getMaxLength(instance); + if (maxLength == 0 || text.length <= maxLength) { + // in settings list, blank text is replaced + if ((!text || text == "") && isSettingItemList(instance.parent)) { + text = instance.properties.itemEmptyText; + if (!text || text == "") + text = editorLibraryStrings.getString("EmptyText"); + } + + graphics.drawFormattedString(text, rect, flags, 0); + } else { + var visibleText = text.substring(0, maxLength); + var truncatedText = text.substring(maxLength); + + var visibleSize = font.formattedStringExtent(visibleText, new Point(rect.width, rect.height), flags, 0); + var truncatedSize = font.formattedStringExtent(truncatedText, new Point(rect.width, rect.height), flags, 0); + + // indicate truncated text + if (false) { + // dim background of truncated part + graphics.setBackground(laf.getColor("EEikColorControlHighlightBackground")); + graphics.fillRectangle(rect.x + visibleSize.x, rect.y, truncatedSize.x, rect.height); + graphics.drawFormattedString(text, rect, flags, 0); + } else { + // dim letters of truncated part + graphics.drawFormattedString(visibleText, rect, flags, 0); + graphics.setForeground(Colors.getColor(200, 200, 200)); + rect.x += visibleSize.x; + graphics.drawFormattedString(truncatedText, rect, flags, 0); + } + } + + } + + prototype.getContentSize = function(instance, laf, size) { + var properties = instance.properties; + var isInForm = isForm(instance.parent); + + var font = this.getFont(instance, laf); + if (font == null) + font = laf.getFont("NormalFont"); + + var flags = this.getFlags(instance, laf); + var text = this.getDisplayText(instance); + if (text == null || text == "") + text = "Temporary"; // provide enough space so click-added + // editor has some perceivable width + + // use wrapping width to get adjusted height + var size = font.formattedStringExtent(text, size, flags, 0); + + // this property is not necessarily present, in which case only one line is used + var lines = properties.lines; + if (isNaN(lines) || lines < 1) + lines = 1; + + var linesHeight = getFontHeight(font) * lines; + var textHeight = size.y; + + // this property flag is not necessarily present, in which case this code falls through + var isResizable = 'flags' in properties + && 'EEikEdwinResizable' in properties.flags + && properties.flags.EEikEdwinResizable; + + //println("lines("+lines+"), linesHeight(" + linesHeight + "), textHeight(" + textHeight + "), resizable(" + isResizable + ")"); + + if (isResizable && (textHeight > linesHeight)) + size.y = textHeight; + else if (!isInForm) + size.y = linesHeight; // don't resize if in container + + return size; + } + + // now make this form-able + setupEmbeddedRendering(prototype); + +} + + + +/** + * Format the number to have zeroes on the left. + */ +function padWithZeroes(number, count) { + var str = "" + number; + if (str.length >= count) + return str; + var zeroes = "0000000000000000000".substring(0, count); + return zeroes.substring(0, count - str.length) + str; +} + +/** + * Format the number to have spaces on the left. + */ +function padWithSpaces(number, count) { + var str = "" + number; + if (str.length >= count) + return str; + var zeroes = " ".substring(0, count); + return zeroes.substring(0, count - str.length) + str; +} + +/** + * Format a time the way S60 would. This is piggishly restricted + * to the American format, since S60 has some weirdness with formatting + * (hiding hours -- but not AM/PM!, and hiding seconds) which would make + * our task of mirroring these in a locale-dependent way too difficult. + * + * Likely it would be better to use a format string in the future. + */ + +function formatTime(h, m, s, showHours, showMinutes, showSeconds, showAmPm) { + var str = ""; + var suffix = ""; + + if (showAmPm) { + if (h >= 12) { + h -= 12; + suffix = " PM"; + } else { + suffix = " AM"; + } + if (h == 0) + h = 12; + } + + if (showHours) { + str += padWithZeroes(h, 2) + ":"; + } + + if (showMinutes) { + str += padWithZeroes(m, 2); + } + + if (showSeconds) { + str += ":" + padWithZeroes(s, 2); + } + + str += suffix; + + return str; + +} + +/** + * Format a date the way S60 would. + */ + +function formatDate(d) { + return formatDateDMY(d.day, d.month, d.year); +} + +function formatDateDMY(day, month, year) { + var str = ""; + str = padWithZeroes(day - 0 + 1, 2) + "/" + + padWithZeroes(month - 0 + 1, 2) + "/" + + padWithZeroes(year, 4); + return str; + +} + +function commonEditorGetFlags(instance, laf) { + var properties = instance.properties; + var flags = 0; + + if (properties.alignment == undefined) + return flags; + + switch (properties.alignment) { + case "EAknEditorAlignCenter": + flags = Font.ALIGN_CENTER; break; + case "EAknEditorAlignLeft": + flags = Font.ALIGN_LEFT; break; + case "EAknEditorAlignRight": + flags = Font.ALIGN_RIGHT; break; + } + + return flags; +} + +var CONTROL_ID = "com.nokia.sdt.series60.CCoeControl"; + +function isControl(instance) { + return instance.componentId == CONTROL_ID; +} +