diff -r 000000000000 -r d760517a8095 uidesigner/com.nokia.sdt.series60.componentlibrary/components/containers/containerLibrary.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uidesigner/com.nokia.sdt.series60.componentlibrary/components/containers/containerLibrary.js Tue Mar 24 22:20:21 2009 -0500 @@ -0,0 +1,355 @@ +/* +* 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("../messageLibrary.js") + +var STATUS_PANE_ID = "com.nokia.sdt.series60.StatusPane"; + +function setBounds(container, rect) { + if (container.properties.location.x != rect.x + || container.properties.location.y != rect.y) { + //println("Setting location for " + container.instanceName + " to " + rect.x + "," + rect.y); + container.properties.location.x = rect.x; + container.properties.location.y = rect.y; + } + if (container.properties.size.width != rect.width + || container.properties.size.height != rect.height) { + //println("Setting size for " + container.instanceName + " to " + rect.width + "," + rect.height); + container.properties.size.width = rect.width; + container.properties.size.height = rect.height; + } +} + +function doScreenLayout(container, laf) { + var screenWidth = container.properties.size.width; + var screenHeight = container.properties.size.height; + var children = container.children; + + var statusArea = getStatusPane(children); + if (statusArea != null) { + setBounds(statusArea, laf.getRectangle("status.pane.bounds")); + } + + var cba = getControlPane(children); + if (cba != null) { + setBounds(cba, laf.getRectangle("control.pane.bounds")); + } + + var contents = getContents(children); + if (contents != null) { + setBounds(contents, laf.getRectangle("content.pane.bounds")); + } +} + +function getControlPane(children) { + return findImmediateChildByComponentID(children, "com.nokia.sdt.series60.CBABase"); +} + +function getToolbar(children) { + return findImmediateChildByComponentID(children, "com.nokia.sdt.series60.Toolbar"); +} + +function getStatusPane(children) { + return findImmediateChildByComponentID(children, "com.nokia.sdt.series60.StatusPane"); +} + +function getNaviPaneContent(children) { + return findImmediateChildByAttributeValue(children, "is-navipane-content", "true"); +} + +function getStatusPaneContent(children, componentIdArg) { + return findImmediateChildByComponentID(children, componentIdArg); +} + + +function getContents(children) { + return findImmediateChildByAttributeValue(children, "is-top-level-content-container", "true"); +} + +function findImmediateChildByAttributeValue(children, attrName, attrValue) { + var result = null; + if (children != null) { + for (var i in children) { + var child = children[i]; + if (child.component != null && child.component.attributes != null && + child.component.attributes[attrName] == attrValue) { + result = child; + break; + } + } + } + return result; +} + +function findImmediateChildByComponentID(children, componentID) { + var result = null; + for (var i in children) { + var child = children[i]; + if (child.component != null && child.component.isOfType(componentID)) { + result = child; + break; + } + } + return result; +} + +function hasAttributeValue(attributesArg, attrName, attrValue) { + return attributesArg[attrName] == attrValue; +} + +function hasTopLevelContentContainerAttribute(attributesArg) { + return hasAttributeValue(attributesArg, "is-top-level-content-container", "true"); +} + +function hasStatusPaneContentAttribute(attributesArg) { + return hasAttributeValue(attributesArg, "is-status-pane-content", "true"); +} + +function buildSimpleContainmentErrorStatus(errorString, params) { + return buildSimpleErrorStatus(errorString, params); +} + +function buildMultipleContainmentErrorStatus(header, errorString, params, status) { + return buildMultipleErrorStatus(header, errorString, params, status); +} + +function isControlPane(component) { + return component.isOfType("com.nokia.sdt.series60.CBABase"); +} + +function isToolbar(component) { + return component.isOfType("com.nokia.sdt.series60.Toolbar"); +} + +function isStatusPaneId(componentIdArg) { + return componentIdArg == STATUS_PANE_ID; +} + +function isDesignRef(component) { + return component.isOfType("com.nokia.sdt.series60.DesignReference"); +} + +function getLayoutChildren(children) { + var result = []; + var idx = 0; + if (children != null) { + for (var i in children) { + var child = children[i]; + if (child.component != null && child.component.attributes != null + && child.component.attributes["is-non-layout-object"] != "true" + && child.component.attributes["is-non-transient-object"] != "true") { + result[idx++] = child; + } + } + } + return result; +} + +function allowsCBAInParent(instance) { + return instance.attributes["allow-cba-in-parent"] == "true"; +} + +function getInstanceFromChildName(children, name) { + if (children != null) { + for (i in children) { + if (children[i].name == name) { + return children[i]; + } + } + } + + return null; +} + + +/** + * Find a child of type CAknForm + */ +function findAknFormChild(children) { + return findImmediateChildByComponentID(children, "com.nokia.sdt.series60.CAknForm"); +} + +/** + * Iterate children to find the one with exitsApp property and return property value + */ +function childWantsExitBehavior(children) { + for (var i in children) { + if (children[i].isInstanceOf("com.nokia.sdt.series60.ContainerBase")) { + return children[i].properties.exitsApp; + } + } + + return false; +} + + +function findNaviTabs(appUiInstance) { + var statusPane = findImmediateChildByComponentID(appUiInstance.children, "com.nokia.sdt.series60.StatusPane"); + if (statusPane != null) { + var naviTabs = findImmediateChildByComponentID(statusPane.children, "com.nokia.sdt.series60.NaviTabs"); + return naviTabs; + } + + return null; +} + +function hasNaviTabs(appUiInstance) { + return findNaviTabs(appUiInstance) != null; +} + +/** + * Get the view UID enumerator, adding the generating #include if necessary (for use from views) + */ +function getViewUidConstant(instance) { + // the algorithm can deal with either CAknView or AvkonViewReference + var name = Engine.queryEnumeratorForAlgorithm(instance, ".", + "com.nokia.sdt.component.symbian.NAME_ALG_VIEW_UID"); + return name; +} + +/** + * Find or create the view UID enumerator (for use from appui) + */ +function findOrCreateViewUidConstant(instance) { + // the algorithm can deal with either CAknView or AvkonViewReference + return Engine.findOrCreateEnumeratorForAlgorithm(instance, ".", + "com.nokia.sdt.component.symbian.NAME_ALG_VIEW_UID"); +} + +/** + * Get the name of the project's HRH file (which contains view UID enums) + */ +function getProjectHrhFile() { + return getProjectName() + ".hrh"; +} + +/** + * Get the name of the project's HRH file (which contains view UID enums) + */ +function includeProjectHrhFile(contribs) { + var mycontrib = Engine.createContributionForPhase("MainUserIncludes") + mycontrib.setText("#include \"" + getProjectHrhFile() + "\"\n"); + contribs.add(mycontrib); +} + +/** + * Set up query containment based on an attribute in potential children. + * + * @param prototype the prototype to add IQueryContainment to. + * The prototype must implement this functions: + *

+ *

  • + * getAllowedAttribute(): return the attribute string for allowed children + * + * The component must define a string with ID "generalContainmentError" + * that takes a single argument for the type of component: e.g., + * "A can''t contain objects of type ''{0}''." + */ +function setupAttributeBasedQueryContainment(prototype) { + var origCanContainComponent = null; + if ("canContainComponent" in prototype) + origCanContainComponent = prototype.canContainComponent; + prototype.canContainComponent = function(instance, otherComponent) { + var status = null; + if (origCanContainComponent != null) { + status = origCanContainComponent(instance, otherComponent); + } + var attrName = prototype.getAllowedAttribute(); + if (!hasAttributeValue(otherComponent.attributes, attrName, "true")) + if (status != null) + return buildMultipleContainmentErrorStatus( + lookupString("containmentErrorHeader"), + lookupString("generalContainmentError"), + new Array( otherComponent.friendlyName ), status); + else + return buildSimpleContainmentErrorStatus( + lookupString("generalContainmentError"), + new Array( otherComponent.friendlyName )); + + return status; + } + + var origCanContainChild = null; + if ("canContainChild" in prototype) + origCanContainChild = prototype.canContainChild; + prototype.canContainChild = function(instance, child) { + var status = null; + if (origCanContainChild != null) { + status = origCanContainChild(instance, child); + } + var attrName = prototype.getAllowedAttribute(); + if (!hasAttributeValue(child.component.attributes, attrName, "true")) + if (status != null) + return buildMultipleContainmentErrorStatus( + lookupString("containmentErrorHeader"), + lookupString("generalContainmentError"), + new Array( otherComponent.friendlyName ), status); + else + return buildSimpleContainmentErrorStatus( + lookupString("generalContainmentError"), + new Array( child.component.friendlyName )); + + return status; + } + + var origCanRemoveChild = null; + if ("canRemoveChild" in prototype) + origCanRemoveChild = prototype.canRemoveChild; + prototype.canRemoveChild = function(instance, child) { + if (origCanRemoveChild != null) { + return origCanRemoveChild(instance, child); + } + return true; // everything can be removed + } + + var origIsValidComponentInPalette = null; + if ("isValidComponentInPalette" in prototype) + origIsValidComponentInPalette = prototype.isValidComponentInPalette; + prototype.isValidComponentInPalette = function(instance, otherComponent) { + if (origIsValidComponentInPalette != null) { + var result = origIsValidComponentInPalette(instance, otherComponent); + if (!result) + return result; + } + var attrName = prototype.getAllowedAttribute(); + return hasAttributeValue(otherComponent.attributes, attrName, "true"); + } +} + +function countImmediateChildrenWithAttributeValue(children, attrName, attrValue) { + var result = 0; + if (children != null) { + for (var i in children) { + var child = children[i]; + if (child.component != null && child.component.attributes != null && + child.component.attributes[attrName] == attrValue) { + result++; + } + } + } + return result; +} + +function isAvkonView(instance) { + return (instance != null && instance.componentId == "com.nokia.sdt.series60.CAknView"); +} + +function isPreviewPopUp(instance) { + return (instance != null && instance.componentId == "com.nokia.sdt.series60.CAknPreviewPopUp"); +} +