//////////////////////////////////////////////////////////////////////////////// // // 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.managers.layoutClasses { import flash.display.Sprite; import flash.events.Event; import flash.utils.Dictionary; import flash.utils.getTimer; import flash.geom.Point; import flash.geom.Rectangle; import mx.core.ILayoutElement; [ExcludeClass] /** * @private * The LayoutDebugHelper class renders the layout bounds for the most * recently validated visual items. */ public class LayoutDebugHelper extends Sprite { include "../../core/Version.as"; //-------------------------------------------------------------------------- // // Constructor // //-------------------------------------------------------------------------- /** * Constructor. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function LayoutDebugHelper() { super(); activeInvalidations = new Dictionary(); addEventListener("enterFrame", onEnterFrame); } //-------------------------------------------------------------------------- // // Variables // //-------------------------------------------------------------------------- /** * @private */ private static const highlightDelay:Number = 2500; /** * @private */ private static const highlightColor:Number = 0xFF00; /** * @private */ private var activeInvalidations:Dictionary; /** * @private */ private var lastUpdate:Number = 0; //-------------------------------------------------------------------------- // // Methods // //-------------------------------------------------------------------------- /** * @private */ public function addElement(item:ILayoutElement):void { activeInvalidations[item] = getTimer(); } /** * @private */ public function removeElement(item:ILayoutElement):void { activeInvalidations[item] = null; delete activeInvalidations[item]; } /** * @private */ import flash.display.DisplayObject; private function render():void { graphics.clear(); for (var item:* in activeInvalidations) { var lifespan:Number = getTimer() - activeInvalidations[item]; if (lifespan > highlightDelay) { removeElement(item); } else { var alpha:Number = 1.0 - (lifespan / highlightDelay); if (item.parent) { var w:Number = item.getLayoutBoundsWidth(true); var h:Number = item.getLayoutBoundsHeight(true); var position:Point = new Point(); position.x = item.getLayoutBoundsX(true); position.y = item.getLayoutBoundsY(true); position = item.parent.localToGlobal(position); graphics.lineStyle(2, highlightColor, alpha); graphics.drawRect(position.x, position.y, w, h); graphics.endFill(); } } } } /** * @private */ public function onEnterFrame(e:Event):void { if (getTimer() - lastUpdate >= 100) { render(); lastUpdate = getTimer(); } } } }