/*______________ | ______ | U I Z E J A V A S C R I P T F R A M E W O R K | / / | --------------------------------------------------- | / O / | MODULE : Uize.Widget.ImagePort Class | / / / | | / / / /| | ONLINE : http://uize.com | /____/ /__/_| | COPYRIGHT : (c)2005-2014 UIZE | /___ | LICENSE : Available under MIT License or GNU General Public License |_______________| http://uize.com/license.html */ /* Module Meta Data type: Class importance: 2 codeCompleteness: 100 docCompleteness: 2 */ /*? Introduction The =Uize.Widget.ImagePort= class manages sizing and positioning an image in a view port, using logical (rather than explicit) size and position values. *DEVELOPERS:* `Chris van Rensburg` The =Uize.Widget.ImagePort= class supports logical sizing behaviors such as fit and fill, and logical positioning behaviors such as left, center, and right aligned, or top, center, and bottom aligned, among others. */ Uize.module ({ name:'Uize.Widget.ImagePort', required:[ 'Uize.Dom.Basics', 'Uize.Dom.Pos', 'Uize.Math.LogicalPos' ], builder:function (_superclass) { 'use strict'; var /*** Variables for Scruncher Optimization ***/ _Uize_Dom_Basics = Uize.Dom.Basics, _Uize_Dom_Pos = Uize.Dom.Pos, _Uize_Math_LogicalPos = Uize.Math.LogicalPos, /*** General Variables ***/ _isIe = Uize.Dom.Basics.isIe, _paramsToDefaultForGetScaledRect = [ 'coordConverter','sizingLowerBound','sizingUpperBound','sizingValue','maxScaling','alignX','alignY' ], _paramsToDefaultForGetSizingAndAlign = ['sizingLowerBound','sizingUpperBound'] ; /*** Private Instance Methods ***/ function _updateUiPosition (m) { if (m.isWired) { var _paramsForGetScaledRect = m._paramsForGetScaledRect, _scaledImageCoords = m.getScaledRect (_paramsForGetScaledRect) ; m.setNodeStyle ('image',_scaledImageCoords); m.set ({ _alignApplicableX: !!(m.portVsScaledDelta [0] = _paramsForGetScaledRect.portWidth - _scaledImageCoords.width), _alignApplicableY: !!(m.portVsScaledDelta [1] = _paramsForGetScaledRect.portHeight - _scaledImageCoords.height) }); } }; function _updateAfterPositionChanged () { _updateUiPosition (this); this.fire ('Position Changed'); } return _superclass.subclass ({ instanceMethods:{ updateUi:function () { var m = this; if (m.isWired) { var _shellDims = _Uize_Dom_Pos.getDimensions (m.getNode ()); if (!m._imageNaturalWidth) { var _imageDims = _Uize_Dom_Pos.getDimensions (m.getNode ('image')); m._imageNaturalWidth = _imageDims.width; m._imageNaturalHeight = _imageDims.height; } m._paramsForGetScaledRect = { portWidth:_shellDims.width, portHeight:_shellDims.height, rectWidth:m._imageNaturalWidth, rectHeight:m._imageNaturalHeight }; _isIe && m.setNodeStyle ('image',{msInterpolationMode:'bicubic'}); _updateUiPosition (m); } }, wireUi:function () { var m = this; if (!m.isWired) { m.setNodeStyle ('',{overflow:'hidden'}); m.setNodeStyle ('image',{position:'absolute'}); m.portVsScaledDelta = []; _superclass.doMy (m,'wireUi'); } } }, dualContextMethods:{ getScaledRect:function (_params) { return _Uize_Math_LogicalPos.getScaledRect (_params,this.get (_paramsToDefaultForGetScaledRect)); }, getSizingAndAlign:function (_params) { return _Uize_Math_LogicalPos.getSizingAndAlign (_params,this.get (_paramsToDefaultForGetSizingAndAlign)); } }, stateProperties:{ _alignApplicableX:'alignApplicableX', // read only _alignApplicableY:'alignApplicableY', // read only _alignX:{ name:'alignX', onChange:_updateAfterPositionChanged, value:.5 }, _alignY:{ name:'alignY', onChange:_updateAfterPositionChanged, value:.5 }, _coordConverter:{ name:'coordConverter', value:Uize.returnX }, _maxScaling:{ name:'maxScaling', onChange:_updateAfterPositionChanged, value:Infinity }, _sizingLowerBound:{ name:'sizingLowerBound', onChange:_updateAfterPositionChanged, value:'fit' }, _sizingUpperBound:{ name:'sizingUpperBound', onChange:_updateAfterPositionChanged, value:'fill' }, _sizingValue:{ name:'sizingValue', onChange:_updateAfterPositionChanged, value:1 } } }); } });