uidesigner/com.nokia.carbide.cpp.uiq.components/components/editorLibrary.js
changeset 0 fb279309251b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uidesigner/com.nokia.carbide.cpp.uiq.components/components/editorLibrary.js	Fri Apr 03 23:33:03 2009 +0100
@@ -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:
+ *	<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;
+}
+