//////////////////////////////////////////////////////////////////////////////// // // Licensed to the Apache Software Foundation (ASF) under one or more // contributor license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright ownership. // The ASF licenses this file to You under the Apache License, Version 2.0 // (the "License"); you may not use this file except in compliance with // the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // //////////////////////////////////////////////////////////////////////////////// package mx.controls.olapDataGridClasses { import flash.display.DisplayObject; import flash.display.Graphics; import mx.controls.OLAPDataGrid; import mx.controls.advancedDataGridClasses.AdvancedDataGridColumn; import mx.controls.advancedDataGridClasses.AdvancedDataGridListData; import mx.controls.listClasses.BaseListData; import mx.controls.listClasses.IDropInListItemRenderer; import mx.controls.listClasses.IListItemRenderer; import mx.core.Container; import mx.core.IDataRenderer; import mx.core.IFactory; import mx.core.IUIComponent; import mx.events.FlexEvent; import mx.olap.IOLAPElement; import mx.styles.ISimpleStyleClient; /** * The OLAPDataGridHeaderRenderer is a container which contains * one header for each row of on the column axis. This header describes * the name of the hierarchy to which a particular member belongs. * * Because of the limitation that a valid column grouping should be in a tree * form, a fake top level column is created to give the required functionality of * column axis headers to OLAPDataGrid * * @see mx.controls.OLAPDataGrid * @see mx.controls.olapDataGridClasses.OLAPDataGridHeaderRendererProvider * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ /** * @private */ public class OLAPDataGridHeaderRenderer extends Container implements IDataRenderer, IDropInListItemRenderer, IListItemRenderer { include "../../core/Version.as"; //-------------------------------------------------------------------------- // // Constructor // //-------------------------------------------------------------------------- /** * Constructor * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function OLAPDataGridHeaderRenderer() { super(); } //-------------------------------------------------------------------------- // // Variables // //-------------------------------------------------------------------------- /** * @private */ private var listOwner:OLAPDataGrid; private var factoriesChanged:Boolean = false; private var dataProviderChanged:Boolean = false; //-------------------------------------------------------------------------- // // Overriden Properties // //-------------------------------------------------------------------------- //---------------------------------- // data //---------------------------------- /** * @private * Storage for the data property. */ private var _data:Object; [Bindable("dataChange")] /** * The implementation of the data property as * defined by the IDataRenderer interface. * * @see mx.core.IDataRenderer * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ override public function get data():Object { return _data; } /** * @private */ override public function set data(value:Object):void { _data = value; invalidateProperties(); dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE)); } //---------------------------------- // horizontalScrollPolicy //---------------------------------- /** * @private */ override public function set horizontalScrollPolicy(value:String):void { super.horizontalScrollPolicy = "off"; } //---------------------------------- // verticalScrollPolicy //---------------------------------- /** * @private */ override public function set verticalScrollPolicy(value:String):void { super.verticalScrollPolicy = "off"; } //-------------------------------------------------------------------------- // // Properties // //-------------------------------------------------------------------------- //---------------------------------- // listData //---------------------------------- /** * @private * Storage for the listData property. */ private var _listData:AdvancedDataGridListData; [Bindable("dataChange")] /** * The implementation of the listData property as * defined by the IDropInListItemRenderer interface. * * @see mx.controls.listClasses.IDropInListItemRenderer * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function get listData():BaseListData { return _listData; } /** * @private */ public function set listData(value:BaseListData):void { _listData = AdvancedDataGridListData(value); invalidateProperties(); } //---------------------------------- // factories //---------------------------------- private var _factories:Array /* of IFactory */; /** * @private */ public function get factories():Array /* of IFactory */ { return _factories; } /** * @private */ public function set factories(value:Array /* of IFactory */):void { if(checkIfChanged(_factories, value)) { _factories = value; factoriesChanged = true; invalidateProperties(); } } //---------------------------------- // dataProvider //---------------------------------- private var _dataProvider:Array /* of IOLAPHierarchy */; /** * @private */ public function get dataProvider():Array /* of IOLAPHierarchy */ { return _dataProvider; } /** * @private */ public function set dataProvider(value:Array /* of IOLAPHierarchy */):void { if(checkIfChanged(_dataProvider, value)) { _dataProvider = value; dataProviderChanged = true; invalidateProperties(); } } //-------------------------------------------------------------------------- // // Overriden Methods // //-------------------------------------------------------------------------- /** * @inheritDoc * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ override protected function commitProperties():void { super.commitProperties(); if ((factoriesChanged || dataProviderChanged) && factories && dataProvider) { factoriesChanged = dataProviderChanged = false; //Remove the children if there are any already added while(this.numChildren) this.removeChildAt(0); var n:int = factories.length; for (var i:int = 0; i < n; i++) { var factory:IFactory = factories[i]; var r:IListItemRenderer = factory.newInstance(); if (r is IDropInListItemRenderer) { var c:AdvancedDataGridColumn; if(data is AdvancedDataGridColumn) c = AdvancedDataGridColumn(data); else c = null; IDropInListItemRenderer(r).listData = makeListData(this.dataProvider[i], _listData.uid, _listData.rowIndex, _listData.columnIndex, c); } r.data = this.data; this.addChild(DisplayObject(r)); } } } /** * @inheritDoc * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ override public function setStyle(styleProp:String, newValue:*):void { super.setStyle(styleProp, newValue); if (styleProp == "axisHeaderStyleName") { //Need to propagate the style value to all the child headers for ( var i:int = 0; i < this.numChildren; i++) { var child:DisplayObject = DisplayObject(this.getChildAt(i)); if(child is ISimpleStyleClient) ISimpleStyleClient(child).styleName = newValue; } } } /** * @inheritDoc * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ override protected function measure():void { super.measure(); var w:Number = 0; var h:Number = 0; for ( var i:int = 0; i < factories.length; i++) { var child:IUIComponent = IUIComponent(this.getChildAt(i)); h = Math.max(h, child.getExplicitOrMeasuredHeight()); w += child.getExplicitOrMeasuredWidth()+5; } if (!isNaN(explicitWidth)) w = explicitWidth; measuredWidth = w; measuredHeight = h; } /** * @inheritDoc * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void { super.updateDisplayList(unscaledWidth, unscaledHeight); var startx:Number = 0; var g:Graphics = this.graphics; g.clear(); var color:uint = getStyle("verticalGridLineColor"); g.lineStyle(1, color, 100); var n:int = factories.length; for ( var i:int = 0; i < n; i++) { var child:IUIComponent = IUIComponent(this.getChildAt(i)); child.move(startx, 0); var w:Number = (child.getExplicitOrMeasuredWidth()); child.setActualSize(w, child.getExplicitOrMeasuredHeight()); startx += w; g.moveTo(startx, -5); g.lineTo(startx, unscaledHeight); } } //-------------------------------------------------------------------------- // // Methods // //-------------------------------------------------------------------------- /** * Creates a new AdvancedDataGridListData instance and populates the fields based on * the input data provider item (In case of OLAPDataGrid it is an IOLAPHierarhcy). * * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ protected function makeListData(data:Object, uid:String, rowNum:int, columnNum:int, column:AdvancedDataGridColumn):BaseListData { var text:String = ""; //data here is an IOLAPAttribute if (data is IOLAPElement) text = data.name return new AdvancedDataGridListData(text, column ? column.dataField : "", columnNum, uid, _listData.owner, rowNum); } /** * @private */ private function checkIfChanged(a:Array /* of Object */, b:Array /* of Object */):Boolean { var mismatch:Boolean = false; if(!a) { mismatch = true; } else if(b && b.length) { if(b.length != a.length) { mismatch = true; } else { for (var i:int = 0; i < b.length && i < a.length; i++) { if(a[i] != b[i]) mismatch = true; } } } return mismatch; } } }