uidesigner/com.nokia.carbide.cpp.uiq.components/components/embeddedControlImplLibrary.js
changeset 0 fb279309251b
--- /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<p>
+ * 	This must provide these routines:	<br>
+ * <p>
+ *		drawContent(instance, laf, graphics, rect)	<br>
+ *			Draw content into 'rect' (x, y are 0 and GC is shifted)	<br>
+ *<p>
+ *		getContentSize(instance, laf, size)	<br>
+ *			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.<p>
+ *			The content bounds calculation is usually independent of whether the
+ *			parent is a form, unless the rendering is significantly
+ *			different.  The calculation <i>is</i> different for a setting
+ *			item list, which uses a different font.  Returns a Point.	<br>
+ */
+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;
+	}
+
+}