суббота, 19 июля 2008 г.

Фотоэкскурсии

Сегодня появилась на свет первая моя фотоэкскурсия по Главной улице северо-восточной части херсонесского городища. Расчитываю, что со временем материала прибавится. Планов много, времени нет :).

вторник, 1 июля 2008 г.

DataGrid html CellRenderer

На днях возникла необходимость в одной из задач заставить табличный компонент Flex-а (DataGrid) заставить отображать html-форматированный текст.
Табличка имела заранее неизвестное число столбцов, которое определялось из подгружаемого XML.

Соответственно, для каждой требуемой колонки назначался CellRenderer (в моем случае, для всех):


for (var i:Number=0;i<colxml.children().length();i++)
{
var newcol:DataGridColumn=new DataGridColumn(colxml.children()[i].@title);
newcol.width=colxml.children()[i].@width;
newcol.resizable=false;
newcol.dataField=colxml.children()[i].@attr;
if (colxml.children()[i].@sortby!=null)
{
newcol.sortCompareFunction=mySort;
}
newcol.wordWrap=true;
newcol.itemRenderer=new MultilineHTMLRenderer();
if (colArr[i]!=null) colArr[i]=newcol
else
colArr.push(newcol);
}
DG.columns=colArr;

Вот так формировался мой DataGrid. При этом каждой колонке можно назначить свой рендерер. Но этот рендерер необходимо предварительно создать.
Представляет собой он отдельный as-файл MultilineHTMLRenderer.as, в котором введен следующий код:
package
{
import mx.controls.DataGrid;
import mx.controls.dataGridClasses.DataGridItemRenderer;
import mx.controls.dataGridClasses.DataGridColumn;
import mx.controls.listClasses.*
import mx.styles.StyleManager;
import mx.core.IFactory;

public class MultilineHTMLRenderer extends DataGridItemRenderer implements IFactory
{

public function MultilineHTMLRenderer()
{
super();
}
public function newInstance():*
{
return new MultilineHTMLRenderer();
}

override public function validateProperties():void
{
super.validateProperties();
if (listData)
{
var dg:DataGrid = DataGrid(listData.owner);
var column:DataGridColumn = dg.columns[listData.columnIndex];
styleSheet=InterfaceManager.myStyleSheet;
multiline=true;
htmlText = data[column.dataField];

}
}

}

}

Переопределяется метод validateProperties(), в котором задаются:

  • styleSheet - заранее сформированный в проекте набор стилей (каким шрифтом, какого цвета выводятся ссылки и пр.). Его можно не указывать, если нет требований. Можно управлять внешним видом через html-тэги, а стили игнорировать.
  • multiline - нужно обязательно указать в true, иначе тэги переноса строки не будут работать. Например,
    .
  • htmlText - свойство, в которое записывается сам текст, содержащий разметку. Он берется из data[column.dataField].