uidesigner/com.nokia.sdt.series60.componentlibrary/components/toolbar/Toolbar.js
author cawthron
Thu, 08 Jul 2010 11:27:06 -0500
branchRCL_2_4
changeset 1595 2c13daed43da
parent 0 fb279309251b
permissions -rw-r--r--
change version from 2.6 to 2.7

/*
* Copyright (c) 2007 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("../containers/containerLibrary.js")
include("../renderLibrary.js")

function CAknToolbar() {
	this.lafInfo = null;

	// the bounds of the dialog, rel. to instance
	this.dialogBounds = null;	
	// the bounds of the prompt part, rel. to dialogBounds
	this.promptBounds = null;
	// the bounds of the list box part, rel. to dialogBounds
	this.listBounds = null;
}

///////////////////////////////////
// IQueryContainment
///////////////////////////////////
function canContainComponent(instance, component) {
	
	if (isSupportedToolbarComponent(component))
		return null;
	
	return buildSimpleContainmentErrorStatus(
			lookupString("unsupportedComponentErr"), new Array( component.friendlyName ));			
}

CAknToolbar.prototype.canContainComponent = function(instance, otherComponent) {
	return canContainComponent(instance, otherComponent);
}

CAknToolbar.prototype.canContainChild = function(instance, child) {
	return canContainComponent(instance, child.component);
}

CAknToolbar.prototype.canRemoveChild = function(instance) {
	return true;
}

CAknToolbar.prototype.isValidComponentInPalette = function(instance, otherComponent) {
	return canContainComponent(instance, otherComponent) == null;
}

function isSupportedToolbarComponent(component) {
	if (component.id == "com.nokia.sdt.series60.CAknChoiceList"){
		return true;
	} else if (component.id == "com.nokia.sdt.series60.CAknButton"){
		return true;
	} else {
		return false;
	}
}

///////////////////////////////////
// IVisualAppearance
///////////////////////////////////
CAknToolbar.prototype.draw = function(instance, laf, graphics) {

	var width = instance.properties.size.width - 3;
	var height = instance.properties.size.height - 3;
	var x = 0;
	var y = 0;
	
	// fill 
	graphics.setBackground(laf.getColor("control.button.fill"));
	graphics.setForeground(laf.getColor("screen.background"));
	graphics.setBackground(laf.getColor("control.button.fill")); 
	graphics.fillGradientRectangle(x, y, width, height, true)
	
	// edge
	graphics.setForeground(Colors.getColor(0, 0, 0))
	graphics.drawRectangle(new Rectangle(0, 0, width, height))
	
	// shadows
	graphics.setForeground(laf.getColor("control.shadow.inner"))
	graphics.drawLine(x + 1, y + height + 1, x + width + 1, y + height + 1)
	graphics.drawLine(x + width + 1, y + 1, x + width + 1, y + height + 1)
	
	graphics.setForeground(laf.getColor("control.shadow.outer"))
	graphics.drawLine(x + 2, y + height + 2, x + width + 2, y + height + 2)
	graphics.drawLine(x + width + 2, y + 2, x + width + 2, y + height + 2)

	graphics.setForeground(laf.getColor("EEikColorDialogText"));
	
	if (instance.children.length == 0) {
			//drawTextItem(" No data ", new Point(0, 0), new Point(width + 5, height + 2), laf, graphics);
	}
}

CAknToolbar.prototype.getPreferredSize = function(instance, laf, wHint, hHint) {
	return null;
}

////////////////////////////////////////
// IComponentInstancePropertyListener
////////////////////////////////////////
CAknToolbar.prototype.propertyChanged = function(instance, property) {

	var messages = null;
	// insure that there isn't choice list in the small bar
	var properties = instance.properties; 
	if (properties.smallToolbar == true)
	{
		for (var i in instance.children) {
			var child = instance.children[i];
			if (child.component.isOfType("com.nokia.sdt.series60.CAknChoiceList")){
				// TODO: We're setting a property back but should create a status message
				// Not sure how to do that...
				properties.smallToolbar = false;
				instance.forceRedraw();  // refreshes the properties
			}
		}
	}

	if (property == "orientation" || property == "smallToolbar"){
		instance.forceLayout();
	}
	
	return messages;
}


///////////////////////////////////
// IComponentValidator
///////////////////////////////////
CAknToolbar.prototype.validate = function(instance) { 
	
	// Find out if there's a small toolbar
	// If a small toolbar has a choice list, emit error and set back to regular toolbar
	
	var properties = instance.properties;
	var messages = null;
	
	if (properties.smallToolbar == true)
	{
		for (var i in instance.children) {
			var child = instance.children[i];
		}
	}

	return messages;
}

CAknToolbar.prototype.queryPropertyChange = function(instance, propertyPath,
					newValue, laf) {
	return null;
}

////////////////////////////////////
// IComponentInstanceChildListener
////////////////////////////////////

CAknToolbar.prototype.childAdded = function(parent, child){
	parent.parent.forceLayout();
}

CAknToolbar.prototype.childRemoved = function(parent, child){
	parent.parent.forceLayout();
}

CAknToolbar.prototype.childrenReordered = function(parent){
	parent.parent.forceLayout();
}
	
////////////////////////////////////
// ILayout
////////////////////////////////////	
CAknToolbar.prototype.layout = function(instance, laf) {
	
	var isPortrait = laf.getBoolean("is.portrait", true);
	var properties = instance.properties;
	var isHorizontal = properties.orientation == "Horizontal" ? true : false;
	var toolBarMarginPadding = laf.getInteger("control.toolbar.margin", 0);
	var isSmallBar =   properties.smallToolbar == true ? true : false;
	var toolBarWidth = laf.getInteger("control.toolbar.height", 0);
	var toolBarButtonWidth = toolBarWidth - toolBarMarginPadding*2;
	var toolBarButtonHeight = toolBarButtonWidth;
	var toolBarHeight = toolBarWidth;
	
	var numChillens = instance.children.length;
	
	if (isSmallBar){
		// init defaults for small bar, half size of regular toolbar
		toolBarHeight /= 2;
		toolBarWidth /= 2;
		toolBarButtonWidth = toolBarHeight;
		toolBarButtonHeight = toolBarWidth;
		toolBarMarginPadding = 0;
	}
	
	///////////////////////////
	// layout children
	///////////////////////////
	if (isHorizontal){
		// horizontal toolbar grows in width only
		var childX = toolBarMarginPadding; 
		var childY = toolBarMarginPadding;
		if (numChillens > 0) {
			toolBarWidth = toolBarMarginPadding*2 - toolBarMarginPadding; // remove padding for last item added
		}
		for (var i in instance.children) {
			var child = instance.children[i];
			var childProperties = child.properties;
			if (child.component.isOfType("com.nokia.sdt.series60.CAknButton")){
				// button is fixed width

				if (childProperties.size.width != toolBarButtonWidth){
					childProperties.size.width = toolBarButtonWidth;
				}
			} else {
				// other components can be variable width, minimum width preserved
				if (childProperties.size.width < toolBarButtonWidth){
					childProperties.size.width = toolBarButtonWidth;
				}
			}
			
			if (childProperties.size.height != toolBarButtonHeight){
				childProperties.size.height = toolBarButtonHeight; // fixed height
			}
			toolBarWidth += child.properties.size.width + toolBarMarginPadding;	
			childProperties.location.x = childX;
			childProperties.location.y = childY;
			childX += childProperties.size.width + toolBarMarginPadding;
		}

	} else {
		// Vertical orientation, all items are the same size
		var temp = toolBarWidth;
		toolBarWidth = toolBarHeight;
		toolBarHeight = temp;
		var childX = toolBarMarginPadding; 
		var childY = toolBarMarginPadding;
		
		if (numChillens > 0) {
			toolBarHeight = toolBarMarginPadding;
		}
		for (var i in instance.children) {
			var child = instance.children[i];
			var childProperties = child.properties;
			toolBarHeight += child.properties.size.height + toolBarMarginPadding;
			childProperties.size.width = toolBarWidth - toolBarMarginPadding*2;
			childProperties.size.height = toolBarButtonHeight;
			childProperties.location.x = childX;
			childProperties.location.y = childY;
			childY += toolBarButtonHeight + toolBarMarginPadding;	
		}
	}
	
}