| author | John Dean <john.3.dean@nokia.com> |
| Wed, 17 Feb 2010 12:57:24 -0800 | |
| changeset 979 | 1dc37cfc99cd |
| parent 0 | fb279309251b |
| permissions | -rw-r--r-- |
/* * 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: * <p> * <li> * getDisplayText(instance): return the text formatted for display * (may be empty or null). Return the entire * string, even if longer than getMaxLength() * <li> * getMaxLength(instance): return the character limit on the text * <li> * 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; }