diff -r 000000000000 -r fb279309251b uidesigner/com.nokia.carbide.cpp.uiq.components/components/implLibrary.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uidesigner/com.nokia.carbide.cpp.uiq.components/components/implLibrary.js Fri Apr 03 23:33:03 2009 +0100 @@ -0,0 +1,215 @@ +/* +* 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: +* +*/ + + +// This file has routines which initialize component implementations +// according to patterns. + +include ("messageLibrary.js") + +implLibraryStrings = getLocalizedStrings("implLibrary"); + +/** + * 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 an instance and laf, which returns the + * editable area of the label (or null). If null, the default behavior is + * to use the entire rendered area. + * @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 setupCommonDirectLabelEditing(prototype, property, areafunction, fontfunction) { + + prototype.getPropertyPaths = function(instance) { + return [ property ]; + } + + prototype.getLabelBounds = function(instance, propertyPath, laf) { + if (areafunction) + return areafunction(instance, laf); + var size = instance.properties.size; + return new Rectangle(0, 0, size.width, size.height); + } + + prototype.getLabelFont = function(instance, propertyPath, laf) { + if (fontfunction) + return fontfunction(instance, laf) + return null; + } + +} + +function areaWithParentWidth(instance, laf){ + var size = instance.properties.size; + if (instance.parent != null) { + var sizeParent = instance.parent.properties.size; + var x = instance.properties.location.x; + return new Rectangle(-x, 0, sizeParent.width, size.height); + } + return new Rectangle(0, 0, size.width, size.height); +} + +// Set up direct image editing implementation for a component +// with one image property. +// +// @param prototype the impl prototype to update +// @param property the name of the edited property +// @param areafunction a function, taking an instance, laf, and propertyPath, or null. +// If not null, the function which returns a rectangle for the clickable area +// of the rendered area of the component to respond to. +// If null, the default behavior is to use the entire rendered area. + +function setupCommonDirectImageEditing(prototype, property, areafunction, sizefunction, isScalingFunction) { + + // implementation for IDirectImageEdit + prototype.getImagePropertyPaths = function(instance) { + return [ property ]; + } + + // implementation for IDirectImageEdit + prototype.getImageBounds = function(instance, propertyPath, laf) { + //println( "image: " + instance.properties[propertyPath].bmpfile + "/" + // +instance.properties[propertyPath].bmpid + "/" + // +instance.properties[propertyPath].bmpmask ); + + if (areafunction) + return areafunction(instance, laf, property); + else { + var size = instance.properties.size; + return new Rectangle(0, 0, size.width, size.height); + } + } +} + +/** Create a simple IModelMessage that refers to an error on a property. */ +function createSimpleModelError(instance, propertyId, messageFormat, argList) { + var modelMessage = newModelMessage(IStatus.ERROR, + formatString(messageFormat, argList), + instance, propertyId, null); + return modelMessage; +} + +/** + * Set up common IComponentValidator script for an editor that has + * minimum, maximum, and current value properties. + * @param prototype to modify + * @param noun localized string for the unit being edited (i.e. "duration") + * @param nouns localized string for the plural unit being edited (i.e. "durations") + * @param minProperty, maxProperty, valueProperty, maxLengthProperty properties to check + * @param converter a function taking a property value used to convert a property to a comparable value; + * if null, the property is treated as an integer + */ +function setupCommonAndMaxLengthRangeCheckingValidation(prototype, noun, nouns, + minProperty, maxProperty, valueProperty, converter, maxLengthProperty) { + + if (converter == null) + converter = function(value) { return value; }; + + // note that laf will be null if a display model was not created + prototype.validate = function(instance, laf) { + + var properties = instance.properties; + var messages = new java.util.ArrayList(); + + var min = converter(properties[minProperty]); + var max = converter(properties[maxProperty]); + var value = converter(properties[valueProperty]); + + if (converter(properties[maxLengthProperty])!= null) { + var maxLength = converter(properties[maxLengthProperty]); + if ( maxLength < 3 || maxLength > 32 ){ + messages.add(createSimpleModelError(instance, maxLengthProperty, + implLibraryStrings.getString("maxLengthValueError"), + [ maxLength ])); + } else { + var textValue = value.toString(); + if (textValue.length > maxLength){ + messages.add(createSimpleModelError(instance, valueProperty, + implLibraryStrings.getString("maxLengthConstraint"), + [noun, maxLength ])); + } + } + } + + if (min > max) { + messages.add(createSimpleModelError(instance, + minProperty, + implLibraryStrings.getString("minMaxValueError"), + [ noun, nouns, instance.name, min, max ])); + } + if (value < min || value > max ) { + messages.add(createSimpleModelError(instance, + valueProperty, + implLibraryStrings.getString("valueRangeError"), + [ noun, nouns, instance.name, min, max, value ])); + } + return messages; + } + + // note that laf will be null if a display model was not created + prototype.queryPropertyChange = function(instance, propertyPath, + newVal, laf) { + var properties = instance.properties; + var message = null; + + newValue = converter(newVal); + if (propertyPath == minProperty) { + if (newValue > converter(properties[valueProperty]) || + newValue >= converter(properties[maxProperty])) { + message = formatString(implLibraryStrings.getString("minValueConstraint"), noun, nouns ); + } + } + else if (propertyPath == valueProperty) { + if (newValue < converter(properties[minProperty]) || + newValue > converter(properties[maxProperty])) { + message = formatString(implLibraryStrings.getString("valueConstraint"), noun, nouns ); + }else { + if (converter(properties[maxLengthProperty])!= null){ + if (newValue.toString().length() > converter(properties[maxLengthProperty])) { + message = formatString(implLibraryStrings.getString("maxLengthConstraint"), noun ); + } + } + } + } + else if (propertyPath == maxProperty) { + if (newValue <= converter(properties[minProperty]) || + newValue < converter(properties[valueProperty])) + message = formatString(implLibraryStrings.getString("maxValueConstraint"), noun, nouns ); + } + return message; + } + +} + +/** + * Set up common IComponentValidator script for an editor that has + * minimum, maximum, and current value properties. + * @param prototype to modify + * @param noun localized string for the unit being edited (i.e. "duration") + * @param nouns localized string for the plural unit being edited (i.e. "durations") + * @param minProperty, maxProperty, valueProperty properties to check + * @param converter a function taking a property value used to convert a property to a comparable value; + * if null, the property is treated as an integer + */ +function setupCommonRangeCheckingValidation(prototype, noun, nouns, + minProperty, maxProperty, valueProperty, converter) { + setupCommonAndMaxLengthRangeCheckingValidation(prototype, noun, nouns, + minProperty, maxProperty, valueProperty, converter, null); +} \ No newline at end of file