<?xml version="1.0" encoding="utf-8"?>
<!--

  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.

-->
<s:GridItemEditor xmlns:fx="http://ns.adobe.com/mxml/2009" 
				  xmlns:s="library://ns.adobe.com/flex/spark" 
				  xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300">
	<fx:Script>
		<![CDATA[
			
			import flashx.textLayout.edit.SelectionFormat;
			import spark.components.RichEditableText;
			import flashx.textLayout.elements.TextFlow;
			override public function prepare():void
			{
				super.prepare();
				
				var cellBounds:Rectangle = column.grid.getCellBounds(rowIndex, columnIndex);
				
				textGIE.width = cellBounds.width;
				textGIE.minWidth = cellBounds.width;
				textGIE.minHeight = cellBounds.width;
				textGIE.height = cellBounds.height;


				const focusedFormat:SelectionFormat = 
					textGIE.textFlow.interactionManager.focusedSelectionFormat;

				const noBlinkFormat:SelectionFormat = 
				new SelectionFormat(focusedFormat.rangeColor, 
					focusedFormat.rangeAlpha, 
					focusedFormat.rangeBlendMode, 
					focusedFormat.pointColor, 
					focusedFormat.pointAlpha, // 0 = no insertion point
					focusedFormat.pointBlendMode, 
					0);  // blink rate - 0 = no blink

				textGIE.textFlow.interactionManager.focusedSelectionFormat = 
					noBlinkFormat;
  			  }

			
			override public function discard():void
			{
				super.discard();
			}
			
			override public function setFocus():void
			{
				textGIE.setFocus();
			}
			
			
			
		]]>
	</fx:Script>
	
	<s:TextArea id="textGIE" text="@{value}" /> 
</s:GridItemEditor>