1////////////////////////////////////////////////////////////////////////////////
2//
3// ADOBE SYSTEMS INCORPORATED
4// Copyright 2007-2010 Adobe Systems Incorporated
5// All Rights Reserved.
6//
7// NOTICE:  Adobe permits you to use, modify, and distribute this file
8// in accordance with the terms of the license agreement accompanying it.
9//
10////////////////////////////////////////////////////////////////////////////////
11package flashx.textLayout.edit
12{
13	import flashx.textLayout.debug.Debugging;
14	import flashx.textLayout.debug.assert;
15	import flashx.textLayout.elements.TextFlow;
16	import flashx.textLayout.elements.FlowElement;
17	import flashx.textLayout.elements.FlowGroupElement;
18
19	import flashx.textLayout.tlf_internal;
20	use namespace tlf_internal;
21
22	[ExcludeClass]
23	/** @private - Marks an element by its position in the hierarchy. */
24	public class ElementMark
25	{
26		/** @private */
27		tlf_internal var _elemStart:int;
28		/** @private */
29		tlf_internal var _indexChain:Array;
30		CONFIG::debug { private var _originalElement:String; }
31
32		public function ElementMark(elem:FlowElement,relativeStartPosition:int)
33		{
34			_elemStart =  relativeStartPosition;
35			_indexChain = [];
36
37			CONFIG::debug { var origElem:FlowElement = elem; }
38			CONFIG::debug { _originalElement = Debugging.getIdentity(origElem); }
39
40			var p:FlowGroupElement = elem.parent;
41			while (p != null)
42			{
43				_indexChain.splice(0,0,p.getChildIndex(elem));
44				elem = p;
45				p = p.parent;
46			}
47
48			CONFIG::debug {
49				var foundElem:FlowElement = findElement(origElem.getTextFlow());
50				assert(origElem == findElement(origElem.getTextFlow()),"Bad ElementMarker");
51			}
52		}
53
54		public function get elemStart():int
55		{ return _elemStart; }
56
57		public function findElement(textFlow:TextFlow):FlowElement
58		{
59			var element:FlowElement = textFlow;
60			for each (var idx:int in _indexChain)
61				element = (element as FlowGroupElement).getChildAt(idx);
62
63			CONFIG::debug { assert(element != null,"ElementMarker:findElement No element found"); }
64
65			return element;
66		}
67	}
68}