﻿Version 3.0
Build 33
   *Fix 3174671, [UBS] Create a paragraph, then a bullet above the paragraph. Set cursor at the start of the paragraph and hit Backspace, the bullet is then removed. Instead, the paragraph is expected to be bulleted
Build 32
   *Fix 3024299, [UBS] Delete key does not delete a bullet level other than the last one
   *Extends maximum of lineHeight to 8000, then 3045948 will be fixed , [UBS] Pasting in images overlaps text above the cursor.  The larger the image, the greater the overlap.
Build 31
   *Fix 2798034, Muse requirement, IFormatResolves does not allow proper implementation of CSS
    - Add a new interface "IExplicitFormatResolver", in which there is a new function resolveExplicitFormat() returns formats that can override local computed format. 
Build 29
   *Fix 3021986, regression caused by link performance enhancement, links cannot be treated as interactive objects when composing does not start from the beginning
Build 27
   *Fix 3012943, two columns ordered list - when 2nd column scrolls the first column disappears.
Build 26
   *Fix 2988852, Scrolling in the application causes all text to disappear.
   *Fix 2990689, [SDK-31396] Hover over links doesn't work correctly for RTL text.
   *Fix 2988783, Some part of text that flows through new added containers cannot be selected after layout changes.
   *Fix 2988817, Type Error when scrolling with the image selected.
   *Fix 2907691, When composition starts in middle of the container, paddingBottom for the previous paragraph is ignored.
Build 23
   * Fix 2931406, [SDK-30948] Add a configuration option to the text container manager so that it maintains the selection when text is set in the same way that TextField does 
     - in TextContainerManager, add an attribute 'preserveSelectionOnSetText'. If it's true, the selection is maintained after setText().
Build 19
   * Fix 2931005 TLF cannot show Flex SWF after loading it as an ILG
Build 18
   * Fix 2800975 ListMarkerFormat.paragraphStartIndent not applied properly in Inside lists.	
Build 15
   * Bug 2930383, [Null Pointer Exception] Clicking enter at the beginning of a sentence after adding an ILG causes NPE
Build 12
   * Fix 2676298, Ideographic spaces are being treated as roman whitespace at line ends
   * Fix 2826905, TLF Text Pasted loses last line of Formatting [SelectionContainer]
Build 2
   * Fix 2783052, TLF: Vertical text: The mouse cursor doesn�t change to the text insertion point in Editable TLF text field in test movie.
   * Fix 2808701, RTE removing TCY from a span in a link at the beginning of a flow
   * Fix 2758977, <s:p color="red"/> throws out of range error - can you do color lookup like Flex SDK?
   * Fix 2898924, TLF reports incorrect content height after composition when floats are used with padding
   * Fix 2821844, Text controls make bad assumptions with Ctrl Backspace
   * Fix 2835316, Getting Error #2160: The TextLine is INVALID and cannot be used to access the current state of the TextBlock. double-clicking to select-all text in a TextArea
   * Fix 2841799, When lineBreak="toFit" the contentBounds width does not include the trailing whitespace
        - note: Add one global setting alwaysCalculateWhitespaceBounds to enable/disable calculate whitespace.
   * Fix 2819924, Error #1009 in flashx.textLayout.container::ContainerController::updateGraphics() 
   * Add columnBreak and containerBreak feature. That feature is add four properties in TextLayoutFormat, they are columnBreakBefore, columnBreakAfter, containerBreakBefore, containerBreakAfter, and their value could be "auto", "always".
   * Caching Edge objects so they are reused for each composition instead of being gc'ed and reallocated.
   * Fix 2800124, HTMLTextFieldImporter RTE on XML <p>Some Text</p>
   * Fix n**2 behavior on long document scrolling in ContainerController.gatherVisibleLines
	- note: ContainerController.isLineVisible replaced with ContainerController.testLineVisible; returns -1, TextLine or 1
	- note: TextFlowLine.isLineVisible replaced with TextFlowLine.testLineVisible; returns -1, 0 or 1
	* Fix unreported crash that happens when composeToController is followed by updateToController.
	* Fix 2819924, a crash using floats. Also fixed a bug where an inline graphic was stopped, but not removed from the display list.
Build 1
   * Fix 2796531, "Paste multiple paragraphs into empty paragraph loses paragraph attributes on last paragraph". Regression happened when empty 
   paragraph preserves formatting from scrap was added. The fix reverses the order and applies the scrap paragraph format after the paste instead of before.
   
   
Version 2.0
Build 232
   * Fix 2793943, "RTE with delayUpdates on, and no controllers". Null pointer exception when delayUpdates flag is on, and the TextFlow has no controllers.
Build 231
   * Fix for 2792266, "RTE on mouse down & drag from one column to another, or on shift-arrow-up/down to extend selection across columns". 
   Add better checks for null to workaround the bug.
Build 230
   * Fix for 2791491, "Setting the font in an empty RichEditableText fails for all but the first attempt (SDK-29143)". Clear the pointFormat
   when applying a leaf format to a caret selection in an empty paragraph.
   * Fix 2790764, "NeedsSoftKeyboard not set if containers are added after interactionManager".
Build 229
   * Fix 2785924 and 2785919, bugs in the delayUpdate feature. Make sure there is one per EditManager and check for null flowComposer in the redraw handler.
Build 228
   * Fix for 2783360, "Inlines are positioned incorrectly in vertical text when using the factory". There is a positioning adjustment applied to 
   TextLines and floats in the factory, to transform them since they assume the right hand edge (the top of the text) is at 0. This positioning 
   adjustment was incorrectly being applied to inlines, which are children of the TextLine, and the net effect was that the inlines were appearing 
   offset to the right by the size of the container. 
Build 225
   * Fix 2775253, "Error returns when copying and pasting a text flow with Floats repeatedly." This turned out to be a number of separate problems. 
   First, the error should have been an assert. Second, if the float was not loaded the first time through composition, and we had to remove it 
   from the line and retry, and if there was a following float that had already loaded, then it was throwing. Third, when it got to the redraw phase, 
   it was sometimes trying to add the float to the container at an illegal z-order position (past the last child location). Fourth, if the float 
   appeared within the range of visible text, but was not itself visible, and it was after a partial compose, then all floats disappeared 
   (were removed from the display list). Fifth, sometimes during composition the backout was failing if the line was the first line in the container, 
   and we were composing from the start.
Build 223
   * Fix 2774250, "If a skew &  rotate matrix is applied to the container, the cursor scales."
Build 220
   * Fix 2759026, "Remove Deprecated method EditManager/IEditManager.delayedOperations". The latest version of Flex Hero no longer calls the old API, 
   so it can be removed. If you have any problems, please pick up the latest Flex SDK.
   * Fix for 2772554, "Inlines (not just floats) turn off vertical justification". Now checks to see if graphics are floats before disabling vertical 
   justification. 
Build 219
   * Fix 2769562, "RTE adding text before stacked floats". Problem happens because the line (including the floats) isn't big enough to fit any text, 
   but the line sits above the floats, and so when it just has floats in it with 0 height it doesn't intersect the floats. Solution is to extend the 
   knockout for the floats to include the space from the previous line's descenders to the previous line baseline. Then the top of the knockout 
   coincides with the top of the line of text.
Build 216
    * Fix 2769670, "Content bounds includes only columns that were composed". Error in content bounds generating when starting composition 
    from the middle of the container -- the content bounds was including only the parcels (columns) that were in composed area, 
    not all the parcels in the container. Now assume that previous parcels/columns must be full. Not an ideal solution, since it will be
    wrong if previous columns weren't full, but should be much much cheaper computationally.
Build 215
    * Fix 2762393, "reported contentWidth doesn't seem correct with embedded image and float attribute". This turned into a set of issues with floats larger than the column width. 
    It was generating incorrect content bounds, and also sometimes not displaying floats when it should.
Build 214
    * Fix 2768598 AutoSized ILGs with padding are incorrectly positioned on first compose
Build 212
    * Fix 2761685 "MouseWheelEnabled is broken for TLF TCM Text."
    * Fix 2766823 "RTE: Inserting text next to floated inline on first line when link is applied"
Build 211
   * Fix 2765114, "[SDK-28671] Changing textFlow's interaction manager can result in RTE if there is a delayedUpdates redrawHandler active".
   * Fix 2765464, Compose With no ContainerControllers loses track of pending InlineGraphicElements
   - note: manipulating TextFlow.flowComposer and removing/adding ContainerControllers can create situations in which inlinegraphics are loaded when its not intended or not loaded when it is intended.  TLF errs on the side of keeping loaded graphics loaded but that may not always be the desired result.  For example a call to textFlow.flowComposer.removeAllControllers is ambiguous about the disposition of the ILGs.  Two tlf_internal methods can be used to resolve these situations.  TextFlow.unloadGraphics unloads all loaded graphics.  TextFlow.prepareGraphicsForLoad queues graphics so that on the next call to updateAllControllers they will be loaded.
   * Fix 2765462 Docs only: The FlowElementMouseEvent docs and examples refers to MouseEvent strings not FlowElementMouseEvent strings
   * tlf_internal method getEventMirror now returns an IEventDispatcher instead of an EventDispatcher.
Build 210
   * Fix new SpanElement().deepCopy RTE
Build 206
   * Fix 2761051, "Pasted plain text not picking up attributes of paragraph in flow." Flow is now automatically assuming plain text if the format 
   imported from the clipboard is PLAIN_TEXT_FORMAT, and automatically assuming formatted text if the format is TEXT_LAYOUT_FORMAT. All other 
   formats are considered "unknown" and we will inspect the text, as before, for attributes to determine if it is plain. Flows with ListElements, 
   LinkElements, GroupElements, or DivElements are also considered to be formatted.
   * Fix null pointer RTE caused by inline that has not loaded correctly.
   * Fix 2738009 Hitting return in nested list content proliferates list elements
   * Fix 2662563, "Can't delete nested lists from UI." Now if you select all and delete, it will delete the final terminator of a list at the end of a flow. 
   * Fix 2761816 ReadOnly TextContainerManager Ignores Scroll Wheel
Build 205
   * Fix 2760281 InlineGraphicElements in Vertical Chinese Text Are Incorrectly Positioned
   * Doc fix:  add class name before default value in TextLayoutFormat and TabStopFormat formats.
Build 204
   * Fix 2758147, "When inputting text to a tlf container with overflow and small leading, the container doesn't scroll smoothly as text is input." 
   * Resolve issue: TLF 2.0 is not working with the Flex Hero 17689 and 17855 - added IEditManager.delayedOperations back in - will remove it when hero posts a new build without that API
   * Fix 2758434, "Undo/Redo multiple levels of delete & insert not returning to correct state".
   * Fix 2759135 (SDK-28559), turn delayUpdates on and hold down the backspace key generates an RTE. Force updates to be handled before processing key events.
   * Fix RTE in TextLayoutFormat.removeClashing and removeMatching when userstyles where used.
   * Fix 2758274 "SelectionManager::getCommonCharacterFormat() can return 'null' or 'undefined' value in an attribute for an insertion point where the attribute 
   is different on either side of the insertion point". Now if you make an ElementRange for a point (absoluteStart == absoluteEnd) the startLeaf and endLeaf will 
   always be the same. 
    * Fix 2758165 TextContainerManager.setTextFlow when textFlow has elements with eventListeners attached uses Factory when it should switch to flowcomposer
    - FlowLeafElements, SubParagraphGroupElements, TCYElements and LinkElements have a tlf_internal getEventMirror call.  This can be used to attach event handlers to any of these elements.  This changelist fixes various bugs with that mechanism.  Note that adding or removing an event listener is a model change and requires a call to updateAllControllers to instantiate the change.
   * Fix 2759997, "Attributes applied to insertion point are not applied to pasted unformatted text". Added test case to OperationTest.copyPasteUndoRedo.
   * Add a "delist" button to the ListProperty panel.  Add the ListProperty panel to TextLayoutEditor.
Build 203
    * Fix 2758185 Unhandled securityerror in InlineGraphicElement Loader.load call
Build 202
    * Fix 2732785 backgroundColor on list marker not shown
    - to use specify the backgroundColor in the listMarkerFormat property
    - when computing the background color rectangle height the list marker is not considered part of the text line.
Build 201
    * Fix unreported issue.  Changing TextFlow.flowComposer to null wasn't stopping or unloading inlinegraphicelements
    - improve performance TextFlow now tracks how many interctiveObjects and InlineGraphicElements it has
    - enables switching flowComposer logic to no longer scan for ILGs to shutdown or startup unless they are present
    - enables TextContainerManager to more efficiently determine if a TextFlow can use the factory
    - improves fix to 2754799 Textflow link element doesn't work after append to an existed textflow
    * Made InlineGraphicElement.stop(okToUnloadGraphics:Boolean) a tlf_internal methods.  Clients can use this to stop a graphic specified by class or URI from loading and/or to drereference the graphic.  Next compose will reload it. 
    * Added tlf_internal method FlowElement.applyFunctionToElements(func:Function).  Recursively descends calling  func on each element until func returns true.  Example calling stop on every InlineGraphicElement:
	textFlow.applyFunctionToElements(function (elem:FlowElement):Boolean{ if (elem is InlineGraphicElement) (elem as InlineGraphicElement).stop(true); return false; });
Build 200
    * Fix 2754698, "Exception in Cursor Navigation". We were getting an exception when the selection was in overset text, 
    where the overset couldn't be composed because a large image earlier in the flow could not be placed in a narrow column. 
    previousLine and nextLine expect composed text. Instead, now we back the cursor up to the last composed position.
    * Fixed unreported bug in treatment of inline graphics, where they were getting directly attached to the GraphicElement.
    * Fix 2754799 Textflow link element doesn't work after append to an existed textflow
Build 199
    * Fix 2603455 applyLink can't remove selected text's link if selected text begins with no linkElement
    * Enable ListItemElements to have a DivElement as the first child.  
    - The first Paragraph in the ListItemElement can have a chain of DivElement parents before the ListItemElement.  If there is a ListElement in the chain then a Paragraph will be inserted as the first child of the ListItemElement by normalize.
Build 198
    * Rename static method TextConverter.initialize to TextConverter.setFormatsTodefault and make it tlf_internal
    * Make static array TextConverter._descriptors tlf_internal
    * getCommonParagraphFormat API now returns common locale and padding settings on paragraphs
    - underlying change is to enable internal Property metadata objects to include multiple categories for the property.
    * Fixes for soft keyboard.
Build 197
    * Fix 2714716 [Flex TLF Ingeration] - missing metadata for float attribute causing minor issues
    * Fix 2683832 TextFlow isnt code hinting any enums in Builder
Build 196 
    * Fix Additional issues with 2559275 "TextFieldHTMLImporter: <textformat> tag inside <p> tag ignores leading property; TextField doesn't"
    - The explicit paragraph and implicit paragraph cases are now inconsistent.
    - A TextFormat as the first XML element in a paragraph formats the containing paragraph
    * Fix 2751036 TextFieldHTMLImporter Should Set typeName when creating an element of a different type
    - when a span is converted to <g> it is now set with typeName="span"
    - for consistency convert all typeName strings to lower case in the TextFieldHTMLImporter
    * Fix 2620719 SelectionManager.getCommonContainerFormat() returns only first container's format - now uses range like other getCommon APIs
    * Fix 2750420 Fully specified legal values in ASDocs for format properties should include class name and property name only (doc changes only)
    * ClearFormatOperation now clears user styles.
    * Fix "CCJK IMEs: Duplicate characters is input into spark TextInput component after call setStyle method to change the font size.". IME text
    from previous edits wasn't removed after a direct model change, and text was left underlined as if IME session still active.
Build 195
    * API Changes: imageSourceResolver in IHTMLImporter and ITextLayoutImporter renamed to imageSourceResolveFunction. 
    importBodyElement in IHTMLImporter renamed to preserveBodyElement and importHTMLElement renamed to preserveHTMLElement. 
    IHTMLImporter, ITextLayoutImporter interfaces now extend ITextImporter. IPlainTextExporter now extends ITextExporter. 
    TextConverter decorateForClipboard renamed to useClipboardAnnotations. textFlow is now accessible as a new public property on TextScrap.
    * API Changes: 
    CreateListElement - remove listMarkerFormat parameter (use listFormat.listMarkerFormat), rename listparent to parent, rename listElement to newListElement
    CreateSubParagraphGroupOperation - rename listParent to parent, reorder constructor, rename listElement to newListElement
    CreateDivOperation - rename newparent to parent, reorder constructor, rename divElement to newDivElement
    MoveChildrenOperation - fix documentation, add getters and setters for constructor parameters
    SplitElementOperation - rename constructor parameter target to targetElement
    ApplyElementTypeNameOperation - rename constructor parameter newTypeName to typeName, rename newTypeName getter/setter to typeName
    TCYOperation - rename tcyElement to newTCYElement
    ApplyLinkOperation - rename linkElement to newLinkElement
    InsertInlineGraphicOperation - rename inlineGraphicElement to newInlineGraphicElement
    IEditManager/EditManager changes
      createDiv - reorder parameters
      createList - reorder parameters; remove markerFormat use format.listMarkerFormat
      createSubParagraphGroup - reorder parameters
      applyFormatToElement - add new parameters relativeStart, relativeEnd to apply format to split the element and apply the format to a sub-range
    * Fix 2746688, "The color of the text is incorrect, which is pasted from clipboard with PlainTextImporter". When plain text was pasted 
    into an empty paragraph it wasn't picking up the attributes of the context it was being pasted into.
    * Fix 2751088 bullets get incorrectly positioned after scrolling
Build 194
    * Fix 2748900 [SDK-19063] TCM that contains hyperlinks out of scroll view don't work when scrolled to
Build 193
    * Deprecate classes ApplyElementStyleNameOperation and ApplyElementUserStyleOperation - use ApplyFormatToElementOperation
    * Deprecate IEditManager/EditManager changeStyleName - use applyFormatToElement
Build 192
    * Cleanup pass on Fix 2742951 Merge UserStyles into TextLayoutFormat
	- add linkNormalFormat, linkHoverFormat, linkActiveFormat and listMarkerFormat as explicit style properties on TextLayoutFormat.
	- add properties styles, coreStyles and userStyles to TextlayoutFormat
	- add getStyle to ITabStopFormat and TabStopFormat.  add setStyle to TabStopFormat
Build 191
    * Fix for unreported recent injection in custom clipboard copy/paste, failed to continue to try importers after the first one returned null.
    * Fix 2742951 Merge UserStyles into TextLayoutFormat
      User styles and the styleName property are now stored in the TextLayoutFormat object attached to the FlowElement.  Previously they were assigned
      in a separate object and not copied with the format property.  Several API changes go along with this.
	TextLayoutFormt class - add getStyle/setStyle; add styleName as a property
	ITextLayoutFormat interface - add getStyle and styleName property
	FlowElement/ContainerController - get styles API added to return an object containing all styles as properties.
    * Consolidated tlf_internal BuildInfo class into TextLayoutVersion. BuildInfo.kBuildNumber renamed TextLayoutVersion.BUILD_NUMBER, and BuildInfo.kBranch 
	renamed to BRANCH. Client code that needs VERSION changed to call TextLayoutVersion.getVersionString(TextLayoutVersion.CURRENT_VERSION).
Build 190
    * Another attempt at fixing the regression that causes inlines to disappear when converted to floats. 
    Previous fix fixed some cases, but there were still ways to trigger the bug.
Build 189
    * Fix regression that caused inlines that are changed from Float.NONE to another value of Float to disappear. 
    Problem was that they would be added as a child of the container, and then immediately removed.
Build 188
    * Fix 2740300 AIR Only: Lines of text with underline or strikethrough style disappear when the text is scrolled.
    * Fix 2742233, "RTE adding text after link if link is at end of textflow". Second try at this -- there were multiple 
    ways of getting to this RTE. Normalization code updated so that a terminator in its own span at the end of a paragraph 
    is merged with the previous span even if the previous span is a descendant of a sibling, and not an actual sibling. 
    This latter fix was necessary because otherwise we register failure on undo of insert at the end of a paragraph after 
    a link because the trailing span was left. However, this is equivalent to leaving the span off, and letting the terminator 
    go in the link. With this change there is a single representation for this situation.
    * Adjustments to how unformatted pasted text picks up the format from the surrounding text. Previous, it would always 
    pick up the format from the previous or next sibling. Now its adjusted slightly so that a leaf element (e.g., a span) 
    always picks up the accumulated format of the previous sibling down to the span level. This allows a span pasted next 
    to a link to pick up the fontFamily applied to the link's last leaf. Fixes the problem where the link's span overrides 
    the fontFamily, but this is not picked up by the span pasted next to it.
    * API CHANGE: Renamed TLFVersion to TextLayoutVersion. getVersionString is now tlf_internal. Added constants for VERSION_1_0
    and VERSION_1_1.
    * 	API CHANGES: ConverterDescriptor class renamed to FormatDescriptor. TextConverter.getConverterDescriptorAt renamed 
    to getFormatDescriptorAt. TextConverter properties moved out into new filter-specific interfaces: IPlainTextExporter, 
    IHTMLImporter, and ITLFImporter. TextConverter.PASTE_MERGE_TO_PREVIOUS and PASTE_MERGE_TO_NEXT moved to ConverterBase 
    class and renamed to MERGE_TO_PREVIOUS_ON_PASTE and MERGE_TO_NEXT_ON_PASTE. Removed ITextImporter and ITextExporter 
    getProperty/setProperty functions (they're replaced by new interfaces).
    * Fix for 2651039, "Pasting into an empty paragraph should override paragraph properties". Now TLF explicitly checks for 
    empty paragraphs in the PasteOperation class. 
Build 185
    * Fix 2741297, "InsertTextOperation.doInternal changed so if the text to insert is "" there is an RTE in applyPointFormat because span=null". Now check for null span in InsertTextOperation.
    * Fix 2600932, "Cursoring from a long line to a short line can sometimes not scroll to show cursor context". The automatic scroll to keep a range of text in view now changed so that it 
    attempts to center the range in the logical horizontal direction.
    * Fix 2617150 Allow user-defined tags to remain in the HTML so they can be used by the IFormatResolver
    - This feature addition has has several pieces.
    - FlowElement now has a public typeName get/set API.  Normally this returns the same value as the tlf_internal API defaultTypeName.  This can be set to any string.
    - typeName (when different from defaultTypeName) is exported by TEXT_LAYOUT_FORMAT TextConverter.  It is also handled by the importer.
    - TextFlow has a new API getElementsByTypeName.
    - TEXT_FIELD_HTML_FORMAT will now tag elements with typeName when an unknown tag is used.  The importer pushes the typeName down to the lowest level possible and avoids 
        creating extra elements while preserving information for roundtripping.  For example:
        HTML --> TLFMarkup
        <foo><p>my text</p></foo> --> <p typeName="FOO"><span>my text</span></p>
        <foo><p>p1</p><p>p2</p></foo> --> <div typeName="FOO"><p><span>p1</span><p><p><span>p2</span><p></div>
    - The TEXT_FIELD_HTML_FORMAT importer always convert user-defined tags to upper case
    - The TEXT_FIELD_HTML_FORMAT importer has two new boolean properties (accessed by the IFormatImporter setProperty API).  These both default to false
        IMPORT_HTML_TAG - sets the typeName of the imported TextFlow to HTML and imports any nested HTML elements as a user defined type
        IMPORT_HTML_BODY_TAG - imports the body element as a user defined tag.  Otherwise it is skipped
    * Add ApplyElementTypeNameOperation and changeTypeName to IEditmanager and EditManager
    * Padding properties (paddingLeft, paddingTop, paddingRight, paddingBottom) categories changed from Container to Paragraph, since these can now be applied to paragraph.
    * Fix 2742233, "RTE adding text after link if link is at end of textflow".
    * Fix 2741416 Select-All ENTER Doesn't Create new Paragraph
    * Fix 2546631, "Plain text does not take on selection formatting when pasted". Detect when a text scrap is unformatted, and have each element when it is 
    pasted get the format of its (new) preceding sibling, or if there is no preceding sibling, the following sibling. I don't know yet whether this is the best 
    approach; one alternative would be to code it specifically for leaf elements and paragraphs, and ignore other elements.
Build 184
    * Fix 2739866, "ContainerManager::removeInlineGrahicElement() doesn't seem to get called.". 
    * Fix [SDK-28210] "SpanElement.normalizeRange() should not combine spans if the span is bindable". 
    * Fix 2739996, "Flow scrolls incorrectly right after an inline moves off the end of the container".
    * Performance improvement.  FlowLeafElement now always holds text in _text.  Removes some overrides and other tests
    * Fix 2700108, "Changing font color shifts characters noticeably within the last linked container if it has overset text." 
    ScrollToRange was scrolling inconsistently when the range extended both above and below the visible area. Now it no longer 
    scrolls in that case. since the visible area is already showing the range.
Build 183
    * Fix 2559275 TextFieldHTMLImporter: <textformat> tag inside <p> tag ignores leading property; TextField doesn't
    * Fix 2617284 Request: StrikeThrough Support in HTML importer, support <s> tag
    * Fix 2730934, "Editing of Measured Container with Floats can double up lines". Bug happens when composing from the middle of the container
    when we are measuring text that contains floats. 
    * Fix 2562965 Preserve id and class attributes through import and export
    - preserved on p,span,a,img,ul,ol,li elements on import.  Not for user defined tags - will be done as part of that bug fix.
    * Fix 2733620, "Padding on intermediate elements computes incorrect bounds when measuring with the factory." Added checks to 
    finalParcelAdjust to take padding on parent chain into consideration when generated bounds.
Build 182
    * Call disposeXML everywhere where XML objects are explicitly allocated, and we don't them back to the client. This should help with garbage collection. 
    Client code that receives XML from TLF is advised to also call flash.system.System.disposeXML when it is completely done with the XML object.
    * Behavior change when editing links. If you select and type, (thus replacing what was selected with what you typed) the inserted text will now pick up 
    the link attributes from the start of the range being deleted if it contains a link. As you continue typing, the link will be extended to include the 
    new characters. In order to type plain text (drop the link attributes) you have to change the selection. This can be done in any way (e.g., click somewhere 
    else, use the arrow key, programmatically). Note that if you "change" the selection to the value it already has, it will have no effect (i.e., link 
    attributes won't be dropped). Therefore clicking back on the same caret location won't drop the link attributes. If you select, delete, and then type, 
    although the other attributes from the deleted text are applied to the newly inserted text, link attributes are not.
    * Fixing bugs in the custom clipboard code to enable same clipboard format, multiple TextConverter formats. This enables multiple filters to all try and 
    handle air:text, for example. API CHANGE for new TextConverter addFormatAt function, which now takes a String clipboardFormat in place of the previous Boolean.
    * Normalize the flow when the interactionManager is set to non-null. This reduces the chance that users will get errors due to executing operations on 
    un-normalized TextFlows. Fix for 2589714, "EditManager functions assert if called on a flow with no controllers". Does not fix all possible cases of this, 
    but should address many.
    * Fix [SDK-26295] losing fontStyle and fontWeight with TLF when importing XML into TextFlow
    - in some cases the formatting was ignored.
Build 181
    * Fix 2736125, "Undo in nested list/list item situation doesn't get you back to initial state". 
    Undo was being skipped if the textFlow was the same length after the delete as it was before, but 
    this is wrong because it can happen even if the textFlow has changed.
    * Fix 2630565 TLF cursor is transformed with container instead of maintaining a pixel's width
    cursor size calculation now takes scaling of Sprite into account
    * Rename HtmlImporter to TextFieldHtmlImporter and HtmlExporter to TextFieldHtmlExporter.  These are internal classes not exposed outside of the textLayout swc
Build 180
    * Fix 2699246, "Cut isn't consistent with delete when typing afterwards". Delete was setting the pointFormat differently from Cut; now they use the same code for that.
    * Fix for 2716695, "Apply format changes immediately to empty paragraphs". When applying a leaf format to an empty paragraph (contains only a terminator) 
    apply the leaf format to the terminator immediately. Retains previous behavior of delaying the format change to apply to next insert if the paragraph has any content.
    * Fix 2693210 Movies as inlines continue playing (sound) after they are deleted
    * Fix 2696786 Document the event: syntax for LinkElement
    * Fix 2724144, "Inline graphic disappears when it would be partially obscured by the edge of the container". Inlines were disappearing if the text of the line they were 
    in was not visible. This is obvious when you have a line with a tall graphic that is scrolled so the text of the line is scrolled off, but you should be able to see the graphic.
    * Fix 2523634 [SDK-24957] TextContainerManager doesnt show blinky text insertion cursor or highlighted text correctly when z-index is specified
    - second go round on this.  Revert original fix.  Issue is don't use DIFFERENCE blendMode on the SelectionFormat when setting z on the sprite.  Player acts as if the sprite has no background.
    * Fix unreported bug Model Changes (e.g. replaceChildren) that make the selection go beyond the end of the TextFlow causes assertions when the selection is highlighted
    * Fix unreported bug SelectionFormat with blinkRate of zero for the point selection would never draw
Build 179
    * Fix 2730683 SplitElement and undo errors caught in OpHammer with end-of-list (or div?) selection
    * Fix 2721916, "A text flow that has no interactionManager doesn't support scrolling with the scroll wheel." Scrolling with the mouse wheel 
    should now work in a TextFlow that is read-only (has a null interactionManager).
    * User styles are now propagated through insertion and deletion. Created a new tlf_internal class for the SelectionManager pointFormat, 
    that can (optionally) hold more information than just a TextLayoutFormat. You can set the userStyles on this new PointFormat object, and 
    they will applied as part of the next insertion, same as if you applied bold and then inserted text. Also, if you are replacing a range of
    text that has userStyles applied to it, the userStyles in the deleted text will be applied to the inserted text, unless the insertion overrides
    the point format. Added same capabilities for TCY and links; this part is still under construction.
    * Fix 2735762 Links do not work with Vertical text.
    * Fix for Watson 2512062, styleName attribute from left-side span not propagated to inline graphic elements inserted right after the span. 
Build 177
    * Fix 2563434 Importers resolve relative image paths from the swf, not the HTML file
    - add new importer property IMG_SOURCE_FILTER_FUNCTION
    * move HtmlImporter property string defintions from HtmlImporter to TextConverter
    - moved PARAGRAPH_SEPARATOR_PROPERTY 
    - and  STRIP_DISCRETIONARY_HYPHENS_PROPERTY 
    * Fix 2734227 listStylePosition of 'inside' causes RTE if listStyleType='none'
Build 176
   * Fix issues with "inside" list markers; positioning in measured content, content Bounds calculations.
   * Fix 2732842 Bad line heights after turning on measure height with list content
   - marker TextLine was recording a TextLayoutFormat that was later modified
Build 175
   * Fix a number of paste problems involving lists. Also fixed a bug that was causing paste attributes to leak into the TextFlow 
   after a paste of a partial link element.
   * Fix 2683918 [SDK-27255] Spark RichEditableText not measuring text properly when using TLF 2.0 lists
   - list markers now included in contentbounds 
   * Fix 2694381 TextContainerManager doesn't draw text using the initial format
   -  the initial format from TCM configuration was ignored when drawing after a setText call
   * Fix 2732785 backgroundColor on list marker causes RTE
   - but backgroundColor on list marker does not display
   * Fix 2730723, "Text insert not undone when replacing selection in list item containing more structure". 
   * Fix 2730028, "Links added to sub-elements inside another link should throw". 
Build 172
   * Fix paste of plain text copied in external application and pasted into TLF.
Build 171
   * List markers now line up independent of the paragraph's textAlign property
   * Fix issues vertical text and measurement
   - containercontroller would not add lines after the first one
   - tcm would set the clip incorrectly when not measuring in the non bp direction
   * Raising maximum & lowering minumum limits for padding size, also updated min/max of paragraphSpaceBefore, 
   paragraphSpaceAfter,paragraphStartIndent, paragraphEndIndent to match. 
   * API and MARKUP change: Updating the new minimum, optimum, and maximum word spacing properties to be a single 
   compound "wordSpacing" property. This was necessary so that checks for correctness of values can be done 
   atomically, since the values are interdepedent. Added a new SpacingLimit property handler for new compound 
   value.
   * TextContainerManager.  Make _composedLines tlf_internal.  Add tlf_internal API factoryUpdateContainerChildren
   * Fix measured text (NaN for composition dim in bp direction) and restart of editing issues with gaps on left and right and alignment
   - floats were not accounted for,  now when measuring and there are floats recompose starts from the beginnig
   - padding on divs/paragraphs/list/listitems is now accounted for
   - fix mismatch between restart and normal compose on handling of the textIndent property
   - fix issues with restart and placement of the list markers
Build 170
   * ITextImporter & ITextExporter getProperty and setProperty functions added back into the public API (necessary for custom clipboard formats). 
   Also added back in PlainTextExporter string constants for stripDiscretionaryHyphens and paragraphSeparator properties.
   * Revert selection at end of line change made earlier in this release to original behavior
   * Add a new leading model (LeadingModel.BOX) based on the CSS inline formatting model. 
Build 169
   * Support for installable clipboard formats. It's now possible to programmatically install a new text conversion format that is used
   by clipboard on copy and paste, such that the new format is posted to the clipboard on copy, and used on paste when fetching data
   back from the clipboard. See new APIs in TextConverter class. Also now possible for a flow operation event listener to examine the
   text being pasted -- textFlow is exposed in TextScrap class.
   * Added new formatting properties -- minimumSpacing, optimumSpacing and maximumSpacing. minimumSpacing and maximumSpacing control how 
   the extra space is spread out when justifying text. When textJustify is "distribute", justification space is apportioned to the spaces
   in the line up to the maximum amount allowed by maximumSpacing, and any further spacing is distributed via letterspacing (letters are
   spaced apart). If text is being compressed to fit into the justified space, the same principle applies; spaces will be compressed first,
   until the minimumSpacing value is reach, and any additional compression will appear as letterspacing. optimumSpacing applies to all text
   regardless of the textJustify value, and effectively resizes the space character by the percentage supplied. This feature requires the
   10.1 (Argo) player or later.
Build 168
   * Cleanup CreateDivOperation
   * Fix 2716535 RTE scrolling a list in a spark TextArea
   * Fix 2622500 Can't import multi-column list with no column gap
   - issue was with handling of situations in which composer created no parcels
Build 167
   * Fix 2685268 lose list items when crossing containers (list markers not appearing in some multi container cases)
   * Fix unreported bug - "inside" list markers disappear during scrolling
   * Fix 2676298 (again!) "Deleting a float causes another float to disappear". Improved the validation code in the deelteAtStart test to check that the 
   deleted float is *not* in the display list, and that the other float *is* in the display list.
Build 166
   * Fix bug 2719488, "RTE in Float Selection Code". Block selection that contains an inline graphic with float = none that hasn't loaded yet was crashing. 
   * Fix 2679666 list with <img> can't be displayed correctly after scroll down or up
   * Fix 2717620, "Got 'null reference..' RTE when running importTest in VellumUnit for this particular html file". Problem was with link elements that 
   start in the composed area and extend beyond it, it was crashing trying to generate the bounding boxes of elements that weren't fully composed. 
   Now it generates bounding boxes only for that portion of the element that has been composed.
   * Fix 2719286 Missing List Marker When afterContent has tabs In Player 10.0
   - tabs set in listMarkerFormat were being ignored
   - originally reported on forum: http://forums.adobe.com/message/3135638#3135638
   * Fix 2629705 Documentation for ContainerController.setCompositionSize should reference NaN and describe its autosize behavior.
Build 165
   * Fix bug 2720860 Adornment display is lost after scrolling away and back
   * Fix bugs in undoing applyLink and applyTCY.
   * API Changes: TextConverter.addConverter and removeConverter renamed to addFormat and removeFormat and are now tlf_internal. 
   Removed getProperty and setProperty functions from ITextExport claer and ITextImporter, and made them tlf_internal in ConverterBase. 
   clear and reportError functions in ConverterBase are now tlf_internal as well.
   * Fix 2720514 "inside" listItems incorrectly positioned next to floats
   * API Change: Renamed IEditManager.delayedOperations to allowDelayedOperations. Renamed IEditManager.delayedUpdate to delayUpdates. 
   Renamed IEditManager.createSPGE to createSubParagraphGroup, and reordered parameters. Renamed CreateSPGEOperation to CreateSubParagraphGroupOperation, 
   and reordered parameters. Reordered parameters to IEditManager.createList.
   * API Change: ISelectionManager functions getCommonCharacterFormat, getCommonParagraphFormat and getCommonContainerFormat now return a 
   TextLayoutFormat instead of an ITextLayoutFormat. This change is backwards compatible with current code because TextLayoutFormat 
   implements ITextLayoutFormat.
   * API Update:  new overridable TCM methods added in 164 are now all tlf_internal.
   * API Change: IEditManager.splitParagraph now returns the new ParagraphElement that was created. 
   * Fix bug 2719547 where inline graphics either disappear or appear in the wrong place if you scroll away and then back.
   * Fix unreported bug - using TextContainerManager with a TextFlow and all images already loaded and floats (it goes through the factory) would not display all the content
   * Fix 2724129 Vertical text which has a Inline graphic with Tate Chu Yoko applied throws an RTE
Build 164
   * Add overridable TextContainerManager methods to override for adding objects to Container.  These are the same as the ContainerController mehods
   - add new ContainerController method removeBackgroundShape - also in TCM
   - these methods aren't yet connected when TCM is using the factory
   * Flex request: Remove Configuration.listAutoPadding and add it to TextLayoutFormat.listAutoPadding.
   * Fix a number of problems in undo of delete text range, mostly related to incorrect undo results with hierarchal text (including divs or lists).
   * Fixed a problem where the textLength of a ContainerController was not updated correctly in response to a model change if there are more than 
   one linked containers, and the second and subsequent containers are empty due to a previous text deletion.
   * SpanElement.getText now handles the default parameter of relativeEnd correctly -- it was returning an empty string instead of the entire contents of the span.
Build 162
   * Fix 2720504 [Flex TLF 2.0 Integration] - List enter key adds new item but remains on current line
Build 161
   * Make TextContainerManager functions clearComposedLines and clearContainerChildren tlf_internal
Build 160
  * Adding new values for ClearFloats: "start" and "end". These are relative to the element's own direction setting.
  * Initial implementation of CreateDivOperation
Build 159
  * API CHANGE: rename [I]Configuration.autoListElementStartPadding to listAutoPadding
  * API CHANGE: change markup for SubPargraphGroupElement from <spge> to <g>
Build 158
  * API CHANGE: ContainerController addFloat/removeFloat renamed to addInlineGraphicElement/removeInlineGraphicElement, 
  which takes a new parameter for the DisplayObject parent, and is now called for both floats and non-float graphics. Non-float
  (regular inlines) are always parented to a TextLine. This allows the client to control when the inline graphics are added and removed.
Build 157
  * Fix 2695659 FlowGroupElement.replaceChildren can insert unexpected terminator
  * Add IEditManager.createSPGE and CreateSPGEOperation for creating SubParagraphGroupElements (still in progress)
Build 156
  * Cleanup/debug SplitElementOperation.  This operation is the base class for SplitPargraphOperation and is also publicly available.  It has some limitations.
    - only usable on FlowGroupElements but not on SubParagraphElements.  Issue is that they merge during normalize
    - will delete a specified range - if the the range includes the element it will be deleted and not split.
  * API and MARKUP CHANGE: Rename "clear" property of ITextLayoutFormat to "clearFloats". This also changes the XML "clear" property in TLF markup format to "clearFloats".
Build 154
  * Fix 2636875 [SDK-26472] RTE in TLF (RTE was gone - minor cleanup for containers with no lines)
Build 153
  * API CHANGE: BaseSubParagraphGroupElement renamed to SubParagraphGroupElementBase. Added  more comments to ListElement 
  and ListItemElement, and added @private to tlf_internal members of ListElement.
  * API CHANGE: Renamed protected function addFloatChild/removeFloatChild to addFloat/removeFloat.
  * Fix 2679603 A marker should ignore the link formatting when the first span in the paragraph is in a link
Build 152
  * Fix 2709600 Stack overflow composing a line with two spans with backgroundColor and backgroundAlpha set
  - fix general problem with recursive calls to getTextLine
  * Fix 2563165 BackgroundColor should be supported by the StringTextLineFactory
  * Fix 2689668 TLF list with decimalLeadingZero listStyleType shouldnt prefix things outside of the -9 to +9 range
Build 144
  * Fix a number of bugs relating to copy & paste.
Build 142
 * Implement SubParagraphGroupElement (<spge> tag in markup) as a valid FlowElement for grouping of elements that are children of Paragraphs.  The base class of LinkElement, TCYElement and SubParagraphGroupElement is a new class BaseSubParagraphGroupElement.  This allows grouping of FlowLeafElements and BaseSubParagraphGroupElements into a parent in the model.  For example: <p>before<spge>text<a>link</a>text</spge>after</p>. The naming of this class and the <spge> name in markup are tentative and likely to change.
Build 140
 * remove marginLeft, marginRight, marginTop and marginBottom properties - not implemented in 2.0
 * add "auto" as a legal value for paddingLeft, paddingRight, paddingTop and paddingBottom
 * add new IConfiguration/Configuration property autoListElementStartPadding.  This property is the padding used for ListElement on a lists's start side when the start side padding value is "auto".
  * Fix unreported bug in ApplyFormatOperation.  new formats weren't applied to any containers when the selection was a point selection at position 0.
  * Update the UI to allow setting "auto" the padding propertiesremove the margin properties.
  * Minor performance cleanup in LocaleUtil
  * Minor formatting fixes in TabStopFormat/TextLayoutFormat as generated by the script
Build 139
  * Remove TextContainerManager.delayedOperations property added earlier.  Instead clients will override createEditManager and supply their own values as needed.
  * API CHANGE -- Fix 2449209, "EditManager creation methods should return FlowElements". IEditManager applyLink, applyTCY. createList, insertInlineGraphic now 
  all return the FlowElement that was created. These functions were void before. In addition, the operations now each have a public getter method to return the 
  FlowElement created.
Build 136
  * Fix 2610219, "TextFlow paddingLeft not working when using RTL and dynamic width".
  * Fix unreported bug in floats where with measurement on floats should default to inlines, 
  but were disappearing instead. Added test to FloatTest, measureWidth, to catch this error in future.
Build 134
  * Fix 2683689, "Need ability to override setting the mouse cursor". Added new protected function to SelectionManager that 
  bottlenecks where the mouse cursor is set in the SelectionManager.
  * Fix SDK-27234, RTE in empty controller (compositionWidth & height 0). 
Build 133
  * Fix for SDK-27304, RTE when a TextFlow that was set into one TextContainerManager is applied to another. Now make sure the new TextFlow is 
  removed from its previous textContainerManager before applying it to the new one.
  * Fix 2661625, "Can't scroll to show floats nearly column-width that have been pushed to a scrollable column". Two separate problems. In the first, the content bounds 
  was not taking into account the leading float where the text is pushed below the float. In the second, the text below the float goes overset, sending the float with 
  it, and the result is the float and the text disappear even though the container is scrollable. Added tests for both these cases.
  * TextContainerManager.updateContainer now returns a boolean.  true if anything changed.
  * add TextContainerManager.delayedOperations property.  This sets the value into the EditManager when TCM is editing.
  * Fix 2647149, "Drag-selecting past the end on the last line of a paragraph should select the terminator". Hit test at the end of the line now returns the 
  position *after* the paragraph terminator, or (if it's not the last line) including the space at the end of the line. 
Build 132
  * Return selection behavior back to what it was for 1.1 -- now no longer possible to select the last character. Fix 2676318.
  * Fix bug that causes links not to click events.
  * Fix 2679595, deleting float causes another float to disappear
Build 129
  * Fix 2523634 [SDK-24957] TextContainerManager doesnt show blinky text insertion cursor or highlighted text correctly when z-index is specified
  - note: selection must be updated via refreshSelection when z-index is changed.
  * Fix 2661617, "Text indent lost for paragraph pushed below float that is almost column width". Text indent was being treated same as left/right 
  margin, so text was not indented from the float if the float was bigger than the indent. Now indent is from the edge of the wrapped text, 
  not from the edge of the container.
  * Fix bug in Configuration.clone(), where it wasn't cloning the compatibilityVersion.
Build 128
  * Fix 2676352 Links aren't working except in the first paragraph
Build 127
  * Partial Fix 2545628 RTE on selection click with certain combination of text properties (SDK-24988)
  - FTE is returning odd values when unicode ligature code points are used.  TLF was using atomIndexes when it should have used characterIndexes.
  - Final fix will be based on what player does to fix 2676467.  Current fix prevents the crash
  * Fix 2607156 TCM can overwrite changes to container's contextMenu
  - if TCM.createContextMenu override returns null TCM assumes client is managing the menu and doesn't clear it.  TCM will still attach event listener for MENU_SELECT events and handle cut/copy/paste/select all
  * Fix 2654126 Leaks caused by TCM Globals
  - TCM in normal operation does a better job of releasing references
  - added new static tlf_internal API TextContainerManager.releaseReferences to release static reusable objects TCM holds on to for performance purposes.
Build 126
  * Fix 2632249, "Redoing inserting a paragraph return puts the cursor in the wrong paragraph". Redo of SplitParagraph was returning the original selection state, 
  now leaves it unchanged since it is left in the correct state by notifyInsertAndDelete. Added new case to undoSplitParagraph to test for this, and added new checks 
  to undoHelper in OperationTest to find other selection problems with undo/redo.
  Also started changes to make copy/paste of hierarchy above paragraphs (e.g. lists & divs) work correctly.
  * Fix 2606414 TextContainerManager doesn't initially draw text if given a configuration
Build 125
  * Fix unreported crashes with displaying TextFlow containing floating graphics and backgroundColor in TextContainerManager and the TextFlowTextLineFactory
  * Fix unreported bug in estimated contentHeight when scrolling enabled and multiple columns.  Results weren't properly scaled when there were multiple columns.
  - One column case returns the same contentBounds - >1 will return a larger value scaled by ratio of the uncomposed content length amount and the content in length the last column
  * Minor perf. improvement in TCM - when in flowComposer state updateContainer would call compose and then updateAllControllers.  The first compose was redundant.
  - Side effect is that fewer events are generated
Build 124
  * Fix unreported bug in undo of delete, apply links, and apply tcy where undo doesn't restore the format of the second paragraph in the range correctly. 
  Added two mementos, one for deleteText, and one for operations that just want to save & restore a text range. DeleteTextOperation, ApplyLinkOperation, 
  and ApplyTCYOperation rewritten to use the mementos. 
  * Fix 2647227 TextContainerManager API to return total number of lines - numLines just returns composed lines.
  - added as tlf_internal function TextContainerManager.getActualNumLines
  * Another fix for undo of delete, to remove extra paragraph that appears on undo at the end of the TextFlow.
  * Fix 2486027 Version of SelectionManager.getCommon*Format methods that don't require an interaction manager.  (See new methods in ElementRange class)
  * Fix 2661645, 2655061, 2665047, all of them are the same bug that undo doesn't restore correctly to the previous state. Paste now is more careful about 
  how it works with respect to paragraph ends, so that undo/redo and cut/paste will work better. Many cases fixed, some still remain.
Build 122
  * Fix 2522343 [SDK-24814] RTE in TLF FlowTextOperation constructor debug assertion
  * Fix 2663346 Markup import fails when there is space before <listStyleType> in content = "counters(ordered,"String",<listStyleType>)"
  * Fix 2665403 "Delete" doesn't regenerate Marker number correctly when deleting listitems
  * Fix 2665820 Setting BackgroundColor causes an empty Shape to be added into TextLines
Build 121
  * Implemented "enter twice" to exit list editing mode, made list editing operations do undo/redo properly using mementos.
  * Add import/export of lists and listitems to HTMLImporter/HTMLExporter - <ol> maps to decimal; <ul> maps to bullet
  * Rework HTMLExporter to be a recursive descent 
  * Change private members of HTMLExporter/HTMLImporter to be public/protected/tlf_internal
  * Performance work in all importers/exporters to remove linear searches and replace with object lookups
  * Cleanup all exporters so that export to string and export to XML use the same global XML settings and have the same throw behaviors
  * Initial support for backspacing to move a paragraph higher in the model.  Canonical example is to backspace at the beginning of a list to move the first list item outside the list.
  The feature also allows moving a paragraph out of a div by backspacing at the beginning of the div.
  * Fix 2634350 Duplicate "find the atom" code should be refactored in NavigationUtils.as
  * Fix 2650129, "FlowElementMouseEventManager continues to dispatch events to TextFlow no longer in container". This happens when a container is 
  reusued across two TextFlows that have links. Fix is to stop links hittesting when the container is removed. Note: clients must call 
  flowComposer.removeAllController to force this to happen. Also did a performance improvement on update to make the FlowElementMouseEventManager 
  take the text range that is being updated from the ContainerController so it doesn't have to figure it out. Should help scrolling on flows with lots of links.
  * Fix unreported bug - factory composer would recycle lines that were passed back to the callback when they weren't visible.  Factory composer now never recycles lines that it has passed back to the callback.
Build 120
  * Fix 2652021, "Lines are not added to a container resized from a no-line state". ContainerController.invalidateContents now always invalidates at least one character, even if the container is empty. 
Build 119
  * Fix unreported bug in FlowElement.compareUserStyles - wasn't comparing a TextLayoutFormat used as a userStyle.  This would give incorrect results with linkNormalFormat, linActiveFormat, linkHoverFormat settings and listMarkerFormat properties.
  * Fix unreported bug in FlowGroupElement.replaceChildren - fixes possible exception when already parented elements were being added to the receiver 
  * Fix unreported bug in ListItemElement optimization to rememeber current list number.  -1 was used as don't know the number but now that's a valid number.
  * Fix unreported bug when recomposing and the "none" list type was in use.
  * CreateListOperation - complete rewrite using a memento based strategy to capture all the sub-operations for undo and redo.  There are still some bugs to work out.  Possibly use the new memento strategy for other operations - for now its internal to CreateListOperation.
Build 116
  * Fixing unreported selection highlight bug with floats. If the float comes as a URL, so it is loaded on a delay, and is selected in the initial redraw 
  before the float has been loaded, then although the float is included in the selected range it was not being highlighted. To fix this, I changed the 
  highlight algorithm to use the (x,y) composed float position and the element width and height from the InlineGraphicElement to figure out the rectangle 
  to highlight instead of looking directly at the DisplayObject and getting the bounds, as was done previously. This means that it will highlight correctly 
  even before it is loaded.
  * Fix unreported bug that cause floatrs to redraw incorrectly when a controller was removed and then added back into the IFlowComposer. It now clears the 
  float composition data when that happens. 
  * Fix 2651156, "preventDefault for EditHandler". EditHandler now sets preventDefault on the event after handling it. Also check isDefaultPrevented() before 
  handling it.
Build 115
  * Fix 2493174 Separate BaseCompose from StandardFlowComposer
  * Fix 2651926 listStyleTyle cjkEarthlyStem should be changed to cjkHeavenlyStem to match CSS3 names
  * Big generalization of TextFlowEdit.deleteRange() and paragraph merge logic.  Should fix deletion across div boundaries, deletion across list items, and generally any delete across non-sibling paragraphs
Build 114
  * Fix 2606243 [SDK-26244] LinkElement throws TypeError when mouse hovers over changed textflow
Build 113
  * Fix a number of different floats bugs. A float that is wider than the container or column, and is on a line by itself, will be composed into the container 
  instead of going overset. A float that is in scrollable container, should fit for height (was going overset as it would in a non-scrollable container if the 
  height didn't fit). 
  * Fix a hang in composition with floats.
  * Fix an assert on recycling a line in use by the BackgrounMgr. Now release lines from the BackgrounMgr before recycling.
  * HTML import for floats. align="left" on an <img> element is now interpreted as float = "left" and align="right" is interpreted as float right. All other 
  values ignored. Note that TextField implemented HTML float, which always go below, and TLF implemented CSS floats which go at the same level if possible. 
  Therefore it will not look the same. 
  * Added comment to documentation of ITextLayoutFormat properties marginTop, marginLeft, marginRight, and marginBottom to reflect the fact that at the moment
  these properties are merely placeholders and should not be used (and may be removed in future).
  * Fixed bug in ContainerController.mouseUpHandler. Now it checks for null event before dereferencing.
Build 109
   * Add more list functionality by subsetting html counter functionality.  New properties in listMarkerFormat
   - counterReset "none"|"ordered"|"ordered <integer>". Default is none
   - counterIncrement "none"|"ordered"|"ordered <integer>". Default is "ordered 1"
   - content "none"|"counter(ordered)"|"counter(ordered,ListStyleType)"|"counters(ordered)"|"counters(ordered,"suffix")"|"counters(ordered,"suffix",ListStyleType)". Default is "counter(ordered)"
   * Fix Fix 2642078, red box behind IME when editing on the debug build. Byproduct of some debug code, now commented out.
Build 108
   * Fix 2639982, "Assert changing a float to an inline". 
   * Added delayedOperation flag to IEditManager so clients can turn off the delayed execution of insertText.
   * Fix 2609350, "Cursoring up to a float anchor position moves the cursor to the float graphic". Cursor is now positioned next to the anchor point. If it is a block selection, we still highlight the float. 
Build 107
   * Fix 2636066 where an inline earlier in the line with a float following results in assertions and missing floats. 
   * Fix a bug where text goes overset because of padding settings, which forces text at the end to be invalid (its overset) which crashes when you nextLine to it.
   * Fix bug in incremental composition where the top padding was added in for elements that are composed from the middle, so the space is added in twice (once on original compose, again on incremental compose).
   * Fix 2636894 -- a number of bugs relating to use floats of in TextLineFactories.
   * Fix 2637162, Mouse cursor not updated on switch to read-only mode. Relates to forum discussion at http://forums.adobe.com/thread/652908?tstart=0.
   * Fix 2636122, "Text isn't aligned correctly if you change vertical alignment on text that contains a float". 
Build 106
   * Fix 2635111, "Floats with absolute lineHeight affect leading for the line containing them". Also fixed unreported bug with multiple containers and floats, where the float is hoisted and it is smaller than the text, so the float fits in the container but the text does not.
Build 105
   * fix issues with downcasting NativeMenu to ContextMenu
Build 104
   * Modify selection limits.  Previously block selections could not extend beyond TextFlow.textLength-1.  The cap on block selections is now TextFlow.textLength.  point selections are unchanged.
   * Disable undo in CreateListOperation in release builds.  Still in development and prevents crashes if you do try it out.
Build 103
   * Change how linkNormalFormat, linkHoverFormat and linkActiveFormat are stored in the model.  They are now converted to TextLayoutFormat by setStyle
   - fixes bugs in which setStyle will accept formats for these but not find error settings till much later.
   - simplify getStyle of these properties so they can assume its a ITextLayoutFormat
   * Change how listMarkerFormat is stored in model.  It is now converted to ListMarkerFormat by setStyle
   - simplify getStyle of listMarkerFormat so callers can assume its a IListMarkerFormat
   * fix bug in which importing <linkActiveFormat><TextLayoutFormat/></linkActiveFormat> would incorrectly throw an exception
   * fix list marker formatting bug - the line with the number didn't take the marker lines ascent into account
   * add static function TextLayoutFormat.createTextLayoutFormat to create a new TextLayoutFormat from an ITextLayoutFormat or a Object/Dictionary used as key-value pairs.
   * override methods in TextLayoutFormat in ListMarkerFormat
   * add static function ListMarkerFormat.createListMarkerFormat to create a new ListMarkerFormat from an IListMarkerFormat or a Object/Dictionary used as key-value pairs.
   * fixes to the List UI controls
Build 100
   * Initial version of CreateListOperation
   * Loosen rules so that ListElement can have children other than ListItemElement
   * Fix 2632358. Allow mid-line floats to be "hoisted" so they appear at the same level as the line. Floats whose anchor would otherwise go out of the line are not hoisted. 
   * redo() broadcasts a FLOW_OPERATION_COMPLETE with a pseudo event for redo, not the event about to be redone. Also skips the broadcast if we're in an IME session.
Build 99
   * Fix 2606420, "Vertical text does not scroll when adding empty paragraphs". ScrollToRange is now a little more aggressive about composing ahead.
   * Add customized ScrollEvent so client code can tell how much was scrolled. The new event inherits from TextLayoutEvent, so it should be compatible for client code currently listening for scroll events as TextLayoutEvents.
Build 98
   * Enter key now splits the current ListItem (and not the paragraph) if in a listitem.  shift-enter splits the paragraph
   * Write a new operation SplitElementOperation that given an element splits it
   * SplitParagraphOperation now subclasses SplitElementOperation
   * Fix 2629735, "Formatting not removed on undo after adding paragraph formatting to an empty paragraph". 
Build 97
   * create new property Category LIST and put listStyleType and listStylePosition in that category
Build 96
   * Roman numerals in lists now more closely match the CSS3 lists spec.  See comments for differences
   * Fix roman numerals - suffix was being drawn twice
   * Fix 2629730 Mouse Events Generate Two "selectionChange" events.
   * Fix 2629731, "Display does not update deleting empty paragraphs through container boundary". Problem was that the flowComposer was not damaging back far enough to pull the text into the previous container.
Build 93
   * Fix for various floats bugs, especially what happens when a float gets pushed to the next container or column. 
   * Fix for redraw bug, where consecutive incremental composes without intervening updates would result in incorrect update when it finally gets called at the end.
   * Implement support for the remaining listStyleType values.
   * Add a suffix property to ListMarkerFormat.  It can be "none" or "auto".  Auto gives the default html behavior of adding a ".".
Build 91
   * Removed whole-line optimization for selection.  The main effect of this is that the spaces at the end of each line are now generally included in the selection.  This breaks 20+ snapshots as well.
Build 89
   * Fix for RTE in ContainerController.validateLines() importing text in a two-container setup. Problem was that updating the first container was recycling lines that had been in the first container and were being pushed to the next. Fix is to make update never recycle lines that aren't still in the container.
   * Extended padding attributes to work on all block level elements, and on images (either inline or as floats). Padding may now be negative. Also, as part of this, 
   inlines are now attached to the TextLine in ContainerController.updateCompositionShapes, instead of this happening in composition inside the Player in calls to createTextLine.
   * Changed setFocus in SelectionManager so it is possible to set the focus without having an active selection. Previously, there was an ordering dependency between calls to 
   setFocus() and selectRange() -- calling setFocus first didn't work, and resulted in bugs that were hard to find. There is still the issue that setFocus will do nothing if the 
   container's stage variable is not already set up; nothing we can do about that. Best workaround when using Flex is to do callLater(setFocus());
Build 82
    * Add first version of floats. Floats can be start, end, left or right, and there is also the clear property, which can be both, none, left, or right.
Build 78
    * Version 0.1 of lists.  TLF markup supports ul, ol, li tags.  Nested lists supported.  Simple formatting and numbering.
Build 65
    * Fix 2476646 "FormField scrolling jumps at times it does not need to", scrolling up/down between different sized lines was scrolling unnecessarily in the horizontal direction.
    * Fix 2594609 Poor text delete performance when pasting large blocks of code, selecting all, and deleting
Build 62
    * Fix for 2583969. The problem is that lines are incorrectly removed from the display list when a scroll happens in updateCompositionShapes() as a result of an edit that came during a partial composition. 
    * Fix for 2545307, "ContainerController.mouseWheelHandler() should be checking if the default behavior is prevented before it acts on the event." Now most event handlers check isDefaultPrevented() before handling the event.
Build 61
    * Fix SDK-25999 Specifying tabStops on a RichText component does not look correct after integration of TLF 1.1
    * Added a delayedUpdate setting to the EditManager to allow clients to defer recomposition and redraw until the next enterFrame event. You can force immediate 
    recomposition and container update by calling updateAllControllers().
Build 58
    * Eliminated use of WeakRef in TextFlowLine to reduce per-line memory allocations.
Build 55
    * Fix 2568628 assigned SWFContext not used on Argo in all scenarios
    * Fix 2568438 [SDK-25693] TextLineRecycler change for Build543 increased size of Flex's Hello World app using FTE and TextLineRecycler by 250k
    * Fix 2571205 [SDK-25734] TLF: src attribute in <img> tag converts to lower case when using TextConverter.importToFlow with TEXT_FIELD_HTML_FORMAT format
    * Fix 2582917 Security sandbox violation in LinkElement.stageMouseMoveHandler
    * Fix 2565658 Security sandbox violation in ContainerController.getContainerController
    * Fix 2565639 Security sandbox violation in SelectionManager.checkForDisplayed()
Build 54
    * Allow removal of link either by passing the empty string, "", or by passing null. Previously the link element would be removed by passing the empty string,
    but null would be set as the link value if you passed null. However, the document stated that null should remove the link. Fixed the code to match the 
    documentation.
    * More optimizations. Recycling of line is more aggressive now. While composing, recycle lines in paragraphs that are not currently in view, and not going to be in view 
    on next update (i.e., when updating with the results of this compose). When updating the container in ContainerController.updateCompositionShapes, recycle lines in
    paragraphs that are removed from view. In both cases, when lines are recycled, the corresponding TextBlocks are also released to allow memory to be reclaimed. 
    Increases speed of composing and scrolling through long documents.
Build 51
    * Optimizations for long flows. Composition can start from the middle of a container, so it doesn't have to look at undamaged text at the start of the container. Also 
    composition now gathers up the visible lines, and hands them off to the ContainerController. This will help in later optimizations.
Build 38
    * Fix 2559210, content bounds generated incorrectly (too large) via the TextLineFactory with textIndent applied.
Build 3
    * Fix 2525017 - added range checking to IMEClient getTextBounds to avoid exceptions caused by invalid ranges.  Returns empty rectangle in bad range case.
Build 2
    * Fix 2508070 Underline/strikethru cause unnecessary TextLines and 2509326 Underline/strikethru apply alpha twice.
