uidesigner/com.nokia.carbide.cpp.uiq.components/components/containerLibrary.js
changeset 2 d760517a8095
equal deleted inserted replaced
-1:000000000000 2:d760517a8095
       
     1 /*
       
     2 * Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of the License "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: 
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 include("messageLibrary.js")
       
    20 
       
    21 var STATUS_PANE_ID = "com.nokia.sdt.series60.StatusPane";
       
    22 
       
    23 function setBounds(container, rect) {
       
    24 	if (container.properties.location.x != rect.x
       
    25 	|| container.properties.location.y != rect.y) {
       
    26 		//println("Setting location for " + container.instanceName + " to " + rect.x + "," + rect.y);
       
    27 		container.properties.location.x = rect.x;
       
    28 		container.properties.location.y = rect.y;
       
    29 	}
       
    30 	if (container.properties.size.width != rect.width
       
    31 	|| container.properties.size.height != rect.height) {
       
    32 		//println("Setting size for " + container.instanceName + " to " + rect.width + "," + rect.height);
       
    33 		container.properties.size.width = rect.width;
       
    34 		container.properties.size.height = rect.height;
       
    35 	}
       
    36 }
       
    37 
       
    38 function doScreenLayout(container, laf) {
       
    39 	var screenWidth = container.properties.size.width;
       
    40 	var screenHeight = container.properties.size.height;
       
    41 	var children = container.children;
       
    42 	
       
    43 	var statusArea = getStatusPane(children);
       
    44 	if (statusArea != null) {
       
    45 		setBounds(statusArea, laf.getRectangle("status.pane.bounds"));
       
    46 	}
       
    47 	
       
    48 	var cba = getControlPane(children);
       
    49 	if (cba != null) {
       
    50 		setBounds(cba, laf.getRectangle("control.pane.bounds"));
       
    51 	}
       
    52 
       
    53 	var contents = getContents(children);
       
    54 	if (contents != null) {
       
    55 		setBounds(contents, laf.getRectangle("content.pane.bounds"));
       
    56 	}
       
    57 }
       
    58 
       
    59 function getControlPane(children) {
       
    60     return findImmediateChildByComponentID(children, "com.nokia.sdt.series60.CBABase");
       
    61 }
       
    62 
       
    63 function getStatusPane(children) {
       
    64     return findImmediateChildByComponentID(children, "com.nokia.sdt.series60.StatusPane");
       
    65 }
       
    66 
       
    67 function getNaviPaneContent(children) {
       
    68 	return findImmediateChildByAttributeValue(children, "is-navipane-content", "true");
       
    69 }
       
    70 
       
    71 function getStatusPaneContent(children, componentIdArg) {
       
    72 	return findImmediateChildByComponentID(children, componentIdArg);
       
    73 }
       
    74 
       
    75 
       
    76 function getContents(children) {
       
    77 	return findImmediateChildByAttributeValue(children, "is-top-level-content-container", "true");
       
    78 }
       
    79 
       
    80 function findImmediateChildByAttributeValue(children, attrName, attrValue) {
       
    81 	var result = null;
       
    82 	if (children != null) {
       
    83 		for (var i in children) {
       
    84 			var child = children[i];
       
    85 			if (child.component != null && child.component.attributes != null && 
       
    86 			    child.component.attributes[attrName] == attrValue) {
       
    87 				result = child;
       
    88 				break;
       
    89 			}
       
    90 		}
       
    91 	}
       
    92 	return result;
       
    93 }
       
    94 
       
    95 function findImmediateChildByComponentID(children, componentID) {
       
    96     var result = null;
       
    97 	for (var i in children) {
       
    98 		var child = children[i];
       
    99 		if (child.component != null && child.component.isOfType(componentID)) {
       
   100 			result = child;
       
   101 			break;
       
   102 		}
       
   103 	}
       
   104 	return result;
       
   105 }
       
   106 
       
   107 function hasAttributeValue(attributesArg, attrName, attrValue) {
       
   108 	return attributesArg[attrName] == attrValue;
       
   109 }
       
   110 
       
   111 function hasTopLevelContentContainerAttribute(attributesArg) {
       
   112 	return hasAttributeValue(attributesArg, "is-top-level-content-container", "true");
       
   113 }
       
   114 
       
   115 function hasStatusPaneContentAttribute(attributesArg) {
       
   116 	return hasAttributeValue(attributesArg, "is-status-pane-content", "true");
       
   117 }
       
   118 
       
   119 function buildSimpleContainmentErrorStatus(errorString, params) {
       
   120 	return buildSimpleErrorStatus(errorString, params);
       
   121 }
       
   122 
       
   123 function buildMultipleContainmentErrorStatus(header, errorString, params, status) {
       
   124 	return buildMultipleErrorStatus(header, errorString, params, status);
       
   125 }
       
   126 
       
   127 function isControlPane(component) {
       
   128 	return component.isOfType("com.nokia.sdt.series60.CBABase");
       
   129 }
       
   130 
       
   131 function isStatusPaneId(componentIdArg) {
       
   132 	return componentIdArg == STATUS_PANE_ID;
       
   133 }
       
   134 
       
   135 function isDesignRef(component) {
       
   136 	return component.isOfType("com.nokia.sdt.series60.DesignReference");
       
   137 }
       
   138 
       
   139 function getLayoutChildren(children) {
       
   140 	var result = [];
       
   141 	var idx = 0;
       
   142 	if (children != null) {
       
   143 		for (var i in children) {
       
   144 			var child = children[i];
       
   145 			if (child.component != null && child.component.attributes != null 
       
   146 				&& child.component.attributes["is-non-layout-object"] != "true"
       
   147 				&& child.component.attributes["is-non-transient-object"] != "true") {
       
   148 				result[idx++] = child;
       
   149 			}
       
   150 		}
       
   151 	}
       
   152 	return result;
       
   153 }
       
   154 
       
   155 function allowsCBAInParent(instance) {
       
   156 	return instance.attributes["allow-cba-in-parent"] == "true";
       
   157 }
       
   158 
       
   159 function getInstanceFromChildName(children, name) {
       
   160 	if (children != null) {
       
   161 		for (i in children) {
       
   162 			if (children[i].name == name) {
       
   163 				return children[i];
       
   164 			}
       
   165 		}
       
   166 	}
       
   167 	
       
   168 	return null;
       
   169 }
       
   170 
       
   171 
       
   172 /**
       
   173  *	Find a child of type CAknForm
       
   174  */
       
   175 function findAknFormChild(children) {
       
   176     return findImmediateChildByComponentID(children, "com.nokia.sdt.series60.CAknForm");
       
   177 }
       
   178 
       
   179 /**
       
   180  *	Iterate children to find the one with exitsApp property and return property value
       
   181  */
       
   182 function childWantsExitBehavior(children) {
       
   183 	for (var i in children) {
       
   184 		if (children[i].isInstanceOf("com.nokia.sdt.series60.ContainerBase")) {
       
   185 			return children[i].properties.exitsApp;
       
   186 		}
       
   187 	}
       
   188 	
       
   189 	return false;
       
   190 }
       
   191 
       
   192 
       
   193 function findNaviTabs(appUiInstance) {
       
   194 	var statusPane = findImmediateChildByComponentID(appUiInstance.children, "com.nokia.sdt.series60.StatusPane");
       
   195 	if (statusPane != null) {
       
   196 		var naviTabs = findImmediateChildByComponentID(statusPane.children, "com.nokia.sdt.series60.NaviTabs");
       
   197 		return naviTabs;
       
   198 	}
       
   199 	
       
   200 	return null;
       
   201 }
       
   202 
       
   203 function hasNaviTabs(appUiInstance) {
       
   204 	return findNaviTabs(appUiInstance) != null;
       
   205 }
       
   206 
       
   207 /**
       
   208  *	Get the view UID enumerator, adding the generating #include if necessary (for use from views)
       
   209  */
       
   210 function getViewUidConstant(instance) {
       
   211 	// the algorithm can deal with either CAknView or AvkonViewReference
       
   212 	var name = Engine.queryEnumeratorForAlgorithm(instance, ".", 
       
   213 		"com.nokia.sdt.component.symbian.NAME_ALG_VIEW_UID");
       
   214 	return name;
       
   215 }
       
   216 
       
   217 /**
       
   218  *	Find or create the view UID enumerator (for use from appui)
       
   219  */
       
   220 function findOrCreateViewUidConstant(instance) {
       
   221 	// the algorithm can deal with either CAknView or AvkonViewReference
       
   222 	return Engine.findOrCreateEnumeratorForAlgorithm(instance, ".", 
       
   223 		"com.nokia.sdt.component.symbian.NAME_ALG_VIEW_UID");
       
   224 }
       
   225 
       
   226 /**
       
   227  *	Get the name of the project's HRH file (which contains view UID enums)
       
   228  */
       
   229 function getProjectHrhFile() {
       
   230 	return getProjectName() + ".hrh";
       
   231 }
       
   232 
       
   233 /**
       
   234  *	Get the name of the project's HRH file (which contains view UID enums)
       
   235  */
       
   236 function includeProjectHrhFile(contribs) {
       
   237 	var mycontrib = Engine.createContributionForPhase("MainUserIncludes")
       
   238 	mycontrib.setText("#include \"" + getProjectHrhFile() + "\"\n");
       
   239 	contribs.add(mycontrib);
       
   240 }
       
   241 
       
   242 /**
       
   243  *	Set up query containment based on an attribute in potential children.
       
   244  *
       
   245  *	@param prototype the prototype to add IQueryContainment to.
       
   246  *	The prototype must implement this functions:
       
   247  *	<p>
       
   248  *	<li>
       
   249  *		getAllowedAttribute(): return the attribute string for allowed children
       
   250  *
       
   251  *	The component must define a string with ID "generalContainmentError"
       
   252  * 	that takes a single argument for the type of component: e.g.,
       
   253  *	"A <container_type_name> can''t contain objects of type ''{0}''."
       
   254  */
       
   255 function setupAttributeBasedQueryContainment(prototype) {
       
   256 	var origCanContainComponent = null;
       
   257 	if ("canContainComponent" in prototype)
       
   258 		origCanContainComponent = prototype.canContainComponent;
       
   259 	prototype.canContainComponent = function(instance, otherComponent) {
       
   260 		var status = null;
       
   261 		if (origCanContainComponent != null) {
       
   262 			status = origCanContainComponent(instance, otherComponent);
       
   263 		}
       
   264 		var attrName = prototype.getAllowedAttribute();
       
   265 		if (!hasAttributeValue(otherComponent.attributes, attrName, "true"))
       
   266 			if (status != null)
       
   267 				return buildMultipleContainmentErrorStatus(
       
   268 					lookupString("containmentErrorHeader"),
       
   269 					lookupString("generalContainmentError"), 
       
   270 					new Array( otherComponent.friendlyName ), status);
       
   271 			else
       
   272 				return buildSimpleContainmentErrorStatus(
       
   273 					lookupString("generalContainmentError"), 
       
   274 					new Array( otherComponent.friendlyName ));
       
   275 			
       
   276 		return status;
       
   277 	}
       
   278 
       
   279 	var origCanContainChild = null;
       
   280 	if ("canContainChild" in prototype)
       
   281 		origCanContainChild = prototype.canContainChild;
       
   282 	prototype.canContainChild = function(instance, child) {
       
   283 		var status = null;
       
   284 		if (origCanContainChild != null) {
       
   285 			status = origCanContainChild(instance, child);
       
   286 		}
       
   287 		var attrName = prototype.getAllowedAttribute();
       
   288 		if (!hasAttributeValue(child.component.attributes, attrName, "true"))
       
   289 			if (status != null)
       
   290 				return buildMultipleContainmentErrorStatus(
       
   291 					lookupString("containmentErrorHeader"),
       
   292 					lookupString("generalContainmentError"), 
       
   293 					new Array( otherComponent.friendlyName ), status);
       
   294 			else
       
   295 				return buildSimpleContainmentErrorStatus(
       
   296 					lookupString("generalContainmentError"), 
       
   297 					new Array( child.component.friendlyName ));
       
   298 		
       
   299 		return status;
       
   300 	}
       
   301 
       
   302 	var origCanRemoveChild = null;
       
   303 	if ("canRemoveChild" in prototype)
       
   304 		origCanRemoveChild = prototype.canRemoveChild;
       
   305 	prototype.canRemoveChild = function(instance, child) {
       
   306 		if (origCanRemoveChild != null) {
       
   307 			return origCanRemoveChild(instance, child);
       
   308 		}
       
   309 		return true; // everything can be removed
       
   310 	}
       
   311 
       
   312 	var origIsValidComponentInPalette = null;
       
   313 	if ("isValidComponentInPalette" in prototype)
       
   314 		origIsValidComponentInPalette = prototype.isValidComponentInPalette;
       
   315 	prototype.isValidComponentInPalette = function(instance, otherComponent) {
       
   316 		if (origIsValidComponentInPalette != null) {
       
   317 			var result = origIsValidComponentInPalette(instance, otherComponent);
       
   318 			if (!result)
       
   319 				return result;
       
   320 		}
       
   321 		var attrName = prototype.getAllowedAttribute();
       
   322 		return hasAttributeValue(otherComponent.attributes, attrName, "true");
       
   323 	}
       
   324 }
       
   325 
       
   326 function countImmediateChildrenWithAttributeValue(children, attrName, attrValue) {
       
   327 	var result = 0;
       
   328 	if (children != null) {
       
   329 		for (var i in children) {
       
   330 			var child = children[i];
       
   331 			if (child.component != null && child.component.attributes != null && 
       
   332 			    child.component.attributes[attrName] == attrValue) {
       
   333 				result++;
       
   334 			}
       
   335 		}
       
   336 	}
       
   337 	return result;
       
   338 }
       
   339 
       
   340 function isAvkonView(instance) {
       
   341 	return (instance != null && instance.componentId == "com.nokia.sdt.series60.CAknView");
       
   342 }