blob: 009a55f9587dc82f59c4ba9060cd7797be07dc8b [file] [log] [blame]
<?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.
-->
<mx:DataGrid xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300" editable="true" itemFocusOut="commitModification(event)" dataProvider="{_textFlowDataView}">
<mx:Script>
<![CDATA[
import flashx.textLayout.edit.EditManager;
import flashx.textLayout.elements.FlowElement;
import flashx.textLayout.elements.FlowGroupElement;
import flashx.textLayout.elements.SpanElement;
import flashx.textLayout.elements.TextFlow;
import flashx.textLayout.formats.TextLayoutFormat;
import flashx.textLayout.operations.ApplyElementIDOperation;
import flashx.textLayout.operations.ApplyElementStyleNameOperation;
import flashx.textLayout.operations.ApplyFormatToElementOperation;
import flashx.textLayout.operations.FlowOperation;
import flashx.textLayout.tlf_internal;
import mx.controls.Alert;
import mx.controls.dataGridClasses.DataGridColumn;
import mx.events.DataGridEvent;
import mx.events.StyleEvent;
import textEditBar.StyleBar;
private var _activeFlow:TextFlow;
public function get activeFlow():TextFlow { return _activeFlow; }
private var _styleBar:StyleBar;
public function get styleBar():StyleBar { return _styleBar; }
public function set styleBar(value:StyleBar):void { _styleBar = value; }
// styles loaded - invalidate the activeFlow and force recompose
private function styleEventComplete(e:StyleEvent):void
{
_styleBar.loadCSS.enabled = false;
_styleBar.unloadCSS.enabled = true;
if (_activeFlow && _activeFlow.formatResolver)
{
_activeFlow.invalidateAllFormats();
_activeFlow.flowComposer.updateAllControllers();
}
}
private static const styleSheetToLoad:String = "flowCss.swf";
private function styleEventError(e:StyleEvent):void
{
Alert.show("Unable to load stylesheet:" + e.errorText);
}
public function loadStyle():void
{
// Next three lines load flowCss and set it as the style
var dispatcher:IEventDispatcher = styleManager.loadStyleDeclarations(styleSheetToLoad);
dispatcher.addEventListener(StyleEvent.COMPLETE,styleEventComplete,false,0,true);
dispatcher.addEventListener(StyleEvent.ERROR,styleEventError,false,0,true);
}
public function unloadStyle():void
{
_styleBar.loadCSS.enabled = true;
_styleBar.unloadCSS.enabled = false;
styleManager.unloadStyleDeclarations(styleSheetToLoad,true);
if (_activeFlow && _activeFlow.formatResolver)
{
_activeFlow.invalidateAllFormats();
_activeFlow.flowComposer.updateAllControllers();
}
}
/* Support for the dataGrid view */
static private function makeAColumn(name:String,editable:Boolean):DataGridColumn
{
var rslt:DataGridColumn = new DataGridColumn(name);
rslt.sortable = false;
rslt.editable = editable;
return rslt;
}
public function initDataGridView():void
{
var columns:Array = new Array();
columns.push(makeAColumn("Element",false));
columns.push(makeAColumn("Id",true));
columns.push(makeAColumn("StyleName",true));
columns.push(makeAColumn("UserStyles",true));
columns.push(makeAColumn("Content",false));
this.columns = columns;
}
[Bindable]
private var _textFlowDataView:Array;
public function commitModification(evt:DataGridEvent):void
{
var dataRow:Object = this.dataProvider[evt.rowIndex];
var dataCol:DataGridColumn = this.columns[evt.columnIndex];
//trace("commitModification: "+evt.type + " " + evt.reason+" " + evt.rowIndex + " " + evt.columnIndex);
var elem:FlowElement = _textFlowDataView[evt.rowIndex].rawElement;
var scratch:String;
var op:FlowOperation;
switch(evt.columnIndex)
{
case 1: // id
scratch = elem.id == null ? "" : elem.id;
if (scratch != dataRow.Id)
{
if (_activeFlow.interactionManager is EditManager)
{
// do a ChangeElementIdOperation
op = new ApplyElementIDOperation(_activeFlow.interactionManager.getSelectionState(),elem,dataRow.Id);
EditManager(_activeFlow.interactionManager).doOperation(op);
}
else
elem.id = dataRow.Id;
}
break;
case 2: // styleName
scratch = elem.styleName == null ? "" : elem.styleName;
if (scratch != dataRow.StyleName)
{
if (_activeFlow.interactionManager is EditManager)
{
// do a ApplyElementStyleNameOperation
op = new ApplyElementStyleNameOperation(_activeFlow.interactionManager.getSelectionState(),elem,dataRow.StyleName);
EditManager(_activeFlow.interactionManager).doOperation(op);
}
else
elem.styleName = dataRow.StyleName;
}
break;
case 3: // userStyles
// very simple parsing of userStyles
var d:Dictionary = new Dictionary();
var substrs:Array = dataRow.UserStyles.split(" ");
for each (var str:String in substrs)
{
var equalSign:int = str.indexOf("=");
if (equalSign != -1)
{
var key:String = str.substring(0,equalSign);
var value:String = str.substring(equalSign+1);
d[key] = value;
}
}
if (_activeFlow.interactionManager is EditManager)
{
// do a ApplyElementStyleNameOperation
var format:TextLayoutFormat = new TextLayoutFormat();
for (key in d)
format.setStyle(key,d[key]);
op = new ApplyFormatToElementOperation(_activeFlow.interactionManager.getSelectionState(),elem,format);
EditManager(_activeFlow.interactionManager).doOperation(op);
}
else
{
for (key in d)
elem.setStyle(key,d[key]);
}
break;
}
}
public function hideTextDataView():void
{
if (_activeFlow)
_activeFlow.flowComposer.updateAllControllers();
_activeFlow = null;
this.visible = false;
this._textFlowDataView = [];
}
static private function buildDataGrid(a:Array,elem:FlowElement,prefix:String = ""):void
{
var o:Object = new Object();
var s:String = flash.utils.getQualifiedClassName(elem);
o.Element = prefix + s.substr( s.lastIndexOf(":")+1);
o.Id = elem.id == null ? "" : elem.id;
o.StyleName = elem.styleName == null ? "" : elem.styleName;
o.Content = elem is SpanElement ? SpanElement(elem).text : "";
o.rawElement = elem;
s = null;
var userStyles:Object = elem.styles;
for (var val:String in userStyles)
{
if (TextLayoutFormat.tlf_internal::description[val] === undefined)
{
s = (s != null) ? s + " " : "";
s += val + "=" + userStyles[val];
}
}
o.UserStyles = s == null ? "" : s;
a.push(o);
var group:FlowGroupElement = elem as FlowGroupElement;
if (group)
{
for (var idx:int = 0; idx < group.numChildren; idx++)
buildDataGrid(a,group.getChildAt(idx),prefix+" ");
}
}
public function showTextDataView(newActiveFlow:TextFlow):void
{
_activeFlow = newActiveFlow;
this.visible = true;
updateTextDataView();
}
public function updateTextDataView():void
{
var dataGridArray:Array = new Array();
// recursive descent on the TextFlow adding array entries
if (_activeFlow)
buildDataGrid(dataGridArray,_activeFlow)
_textFlowDataView = dataGridArray;
}
// disable the flexstyleresolver for now
private var useFlexStyleResolver:Boolean = false;
public function updateStyleResolver(textFlow:TextFlow):void
{
if (textFlow)
textFlow.formatResolver = useFlexStyleResolver ? new FlexStyleResolver(this.styleManager): null;
}
public function changeStyling(textFlow:TextFlow):void
{
useFlexStyleResolver = _styleBar.stylingType.selectedIndex == 1;
if (textFlow)
{
updateStyleResolver(textFlow);
textFlow.invalidateAllFormats();
textFlow.flowComposer.updateAllControllers();
}
}
]]>
</mx:Script>
</mx:DataGrid>