He creado un AdvancedDataGrid con estructura de herencia, donde cada padre tiene un hijo.
Ahora lo que quiero es que si selecciono o paso por encima del padre se seleccione o se sombree tb el hijo.
Es decir que se comporte como si padre e hijo fueran una unica fila.
He probado creando una clase que extienda de AdvancedDataGrid y sobreescibiendo la funcion DrawCellItem, pero no pasa por ahi al indicarle al datagrid que trabaje con filas.
Tambien he probado con selectItem, pero no consigo localizar el método por encima, ya que asi solo me selecciona el contrario al que seleccionaria normalamente.
Tamebién en probado con los eventos click y change, pero no consigo que funcione correcto ya que cuando llega a ellos el elemento ya ha desaparecido de la selección o a sido añadido, por lo que no puedo diferenciar bien entre borrado y nueva seleccion.
Alquién tiene laguna idea.
Este es mi datagrid:
Código ActionScript :
<dgm:AdvancedDataGridMultilineEx id="myADG"
horizontalGridLines="false"
disclosureClosedIcon="{null}"
disclosureOpenIcon="{null}"
treeColumn="{fila0col0}"
verticalGridLines = "false"
alternatingItemColors="{arrayColoresFila}"
columnWidth="100"
rowHeight="30"
iconFunction="myIconFunction"
selectionColor="#ffebcd"
rollOverColor="#ffebcd"
selectionMode="multipleRows"
>
<dgm:dataProvider>
<mx:HierarchicalData source="{dpHierarchy}"/>
</dgm:dataProvider>
<dgm:columns>
<util:DataGridColumnEx id="fila0col0" headerText="" width="100"/>
<util:DataGridColumnEx id="fila0col1" dataField="estado" headerText="Estado" width="100" alternatingItemColors="{arrayColoresCol}" itemRenderer="milcomponents.dataGridMuestra.ImagenEstado"/>
<util:DataGridColumnEx id="fila0col2" dataField="fecha" headerText="Fecha" width="100" alternatingItemColors="{arrayColoresCol}" itemRenderer="util.DataGridItemRendererEx"/>
<util:DataGridColumnEx id="fila0col3" dataField="titulo" headerText="Titulo" width="100" alternatingItemColors="{arrayColoresCol}" itemRenderer="util.DataGridItemRendererEx"/>
<util:DataGridColumnEx id="fila0col4" dataField="agencia" headerText="Agencia" width="100" alternatingItemColors="{arrayColoresCol}" itemRenderer="util.DataGridItemRendererEx"/>
<util:DataGridColumnEx id="fila0col5" dataField="autor" headerText="Autor" width="100" alternatingItemColors="{arrayColoresCol}" itemRenderer="util.DataGridItemRendererEx"/>
<util:DataGridColumnEx id="fila0col6" dataField="modAdelanto" headerText="Modelo de Adelanto" width="100" alternatingItemColors="{arrayColoresCol}" itemRenderer="util.DataGridItemRendererEx"/>
</dgm:columns>
<dgm:rendererProviders>
<!-- Col 0:Columna de imagenes -->
<mx:AdvancedDataGridRendererProvider
dataField="detail"
renderer="milcomponents.dataGridMuestra.Imagen"
depth="2"
columnIndex="0"
id="fila1col0"
/>
<!-- Fila 2:Columna de texto -->
<mx:AdvancedDataGridRendererProvider
dataField="detail"
renderer="milcomponents.dataGridMuestra.Texto"
columnIndex="1"
depth="2"
columnSpan="6"
id="fila1col1"
/>
</dgm:rendererProviders>
</dgm:AdvancedDataGridMultilineEx>
Esta es la clase que cree:
Código ActionScript :
package milcomponents.dataGridMuestra
{
import flash.display.Graphics;
import flash.display.Sprite;
import flash.geom.Point;
import mx.controls.AdvancedDataGrid;
import mx.controls.listClasses.BaseListData;
import mx.controls.listClasses.IListItemRenderer;
import mx.core.IFlexDisplayObject;
import mx.core.IInvalidating;
import mx.core.IUITextField;
import mx.core.SpriteAsset;
import mx.core.mx_internal;
use namespace mx_internal;
public class AdvancedDataGridMultilineEx extends AdvancedDataGrid
{
public function AdvancedDataGridMultilineEx()
{
super();
}
override protected function drawCellItem(item:IListItemRenderer,
selected:Boolean = false,
highlighted:Boolean = false,
caret:Boolean = false,
transition:Boolean = false):void
{
//SI es par --> el padre
var index:int = pt.y;
if( (index%2)==0){
if (!item || isHeaderItemRenderer(item))
return;
var pt:Point = itemRendererToIndices(item);
if (!pt)
return;
var index:int = pt.y;
var columnIndex:int = displayToAbsoluteColumnIndex(pt.x);
var rowData:BaseListData = rowMap[item.name];
var o:Sprite;
var g:Graphics;
var itemXPos:Number = item.x;
// if (columnIndex > lockedColumnCount)
// itemXPos = getAdjustedXPos(itemXPos);
//Si esta iluminado lo marcamos como tal
if (highlighted
&& (!highlightItemRenderer
|| (highlightUID != rowData.uid && columnIndex != highlightColumnIndex)))
{
if (!highlightIndicator)
{
o = new SpriteAsset();
highlightIndicator = o;
}
o = highlightIndicator;
addIndicatorToSelectionLayer(o, pt.x);
drawHighlightIndicator(
o, // sprite
itemXPos, // x
rowInfo[rowData.rowIndex].y, // y
item.width, // width
rowInfo[rowData.rowIndex].height, // height
getStyle("rollOverColor"), // color
item); // IListItemRenderer
highlightItemRenderer = item;
highlightUID = rowData.uid;
highlightColumnIndex = columnIndex;
//El segundo elemento
var implicado:IListItemRenderer;
//Seleccionamos su hijo o su padre
var fila:int = super.itemRendererToIndices(item).y;
var filaImplicada:int;
//miramos si es padre o hijo mirando si su fila es par
var isPar:Boolean = ((fila%2) == 0) ? true : false;
//Es la primera fila (0,2,4...) -> Hallamos el hijo
if (isPar){
filaImplicada = fila + 1;
implicado = listItems[filaImplicada][0];//indicesToItemRenderer(fila + 1, 0);
}
//Es la segunda linea (1,3,5..) -> Hallamos el padre
else{
filaImplicada = fila - 1;
implicado = listItems[filaImplicada][0];//indicesToItemRenderer(fila - 1, 0);
}
var ptImplicado:Point = itemRendererToIndices(implicado);
var indexImplicado:int = ptImplicado.y;
var columnIndexImplicado:int = displayToAbsoluteColumnIndex(ptImplicado.x);
var rowDataImplicado:BaseListData = rowMap[implicado.name];
var itemXPosImplicado:Number = implicado.x;
if (!highlightIndicator)
{
o = new SpriteAsset();
highlightIndicator = o;
}
o = highlightIndicator;
addIndicatorToSelectionLayer(o, ptImplicado.x);
drawHighlightIndicator(
o, // sprite
itemXPosImplicado, // x
rowInfo[rowDataImplicado.rowIndex].y, // y
implicado.width, // width
rowInfo[rowDataImplicado.rowIndex].height, // height
getStyle("rollOverColor"), // color
implicado); // IListItemRenderer
highlightItemRenderer = implicado;
highlightUID = rowDataImplicado.uid;
highlightColumnIndex = columnIndexImplicado;
}
else if (!highlighted
&& highlightItemRenderer
&& (rowData && highlightUID == rowData.uid && highlightColumnIndex == columnIndex))
{
if (highlightIndicator)
Sprite(highlightIndicator).graphics.clear();
lastHighlightItemRenderer = highlightItemRenderer;
highlightItemRenderer = null;
highlightUID = null;
highlightColumnIndex = -1;
}
if (selected)
{
if (!super.cellSelectionIndicators[rowData.uid])
cellSelectionIndicators[rowData.uid] = {};
var newIndicator:Boolean = false;
if (!cellSelectionIndicators[rowData.uid][columnIndex.toString()])
{
o = new SpriteAsset();
o.mouseEnabled = false;
cellSelectionIndicators[rowData.uid][columnIndex.toString()] = o;
newIndicator = true;
}
o = cellSelectionIndicators[rowData.uid][columnIndex.toString()];
addIndicatorToSelectionLayer(o, pt.x);
drawSelectionIndicator(
o, // sprite
itemXPos, // x
rowInfo[rowData.rowIndex].y, // y
item.width, // width
rowInfo[rowData.rowIndex].height, // height
enabled ? // color
getStyle("selectionColor") :
getStyle("selectionDisabledColor"),
item); // IListItemRenderer
if (newIndicator)
if (transition)
applyCellSelectionEffect(o, rowData.uid, columnIndex, item);
}
else if (!selected)
{
if (rowData && cellSelectionIndicators[rowData.uid]
&& cellSelectionIndicators[rowData.uid][columnIndex.toString()])
{
o = cellSelectionIndicators[rowData.uid][columnIndex.toString()];
if (o.parent)
o.parent.removeChild(o);
delete cellSelectionIndicators[rowData.uid][columnIndex.toString()];
if (!atLeastOneProperty(cellSelectionIndicators[rowData.uid]))
delete cellSelectionIndicators[rowData.uid];
}
}
if (caret)
{
// Only draw the caret if there has been keyboard navigation.
if (showCaret)
{
if (!caretIndicator)
{
o = new SpriteAsset();
o.mouseEnabled = false;
caretIndicator = o;
}
o = caretIndicator;
addIndicatorToSelectionLayer(o, pt.x);
drawCaretIndicator(
o, // sprite
itemXPos, // x
rowInfo[rowData.rowIndex].y, // y
item.width, // width
rowInfo[rowData.rowIndex].height, // height
getStyle("selectionColor"), // color
item); // IListItemRenderer
caretItemRenderer = item;
caretUID = rowData.uid;
caretColumnIndex = columnIndex;
}
}
else if (!caret && caretItemRenderer
&& caretUID == rowData.uid
&& caretColumnIndex == columnIndex)
{
if (caretIndicator)
Sprite(caretIndicator).graphics.clear();
caretItemRenderer = null;
caretUID = null;
}
if (item is IFlexDisplayObject)
{
if (item is IInvalidating)
{
IInvalidating(item).invalidateDisplayList();
IInvalidating(item).validateNow();
}
}
else if (item is IUITextField)
{
IUITextField(item).validateNow();
}
var rowIndex:int = rowMap[item.name].rowIndex;
var optimumColumns:Array = getOptimumColumns();
for (var i:int = 0; i < optimumColumns.length; i++)
{
var r:IListItemRenderer = listItems[rowIndex][i];
updateDisplayOfItemRenderer(r);
}
}
}
override protected function selectItem(item:IListItemRenderer,
shiftKey:Boolean, ctrlKey:Boolean,
transition:Boolean = true):Boolean
{
//Seleccionamos la fila en la que cliqueamos
var estadoPrimero:Boolean = super.selectItem(item, shiftKey, ctrlKey, transition);
var estadoImplicado:Boolean;
var implicado:IListItemRenderer;
//Seleccionamos su hijo o su padre
//Miramos si tiene padre
var fila:int = super.itemRendererToIndices(item).y;
//miramos si es padre o hijo mirando si su fila es par
var isPar:Boolean = ((fila%2) == 0) ? true : false;
//Es la primera fila (0,2,4...) -> Hallamos el hijo
if (isPar){
implicado = listItems[fila + 1][0];//indicesToItemRenderer(fila + 1, 0);
}
//Es la segunda linea (1,3,5..) -> Hallamos el padre
else{
implicado = listItems[fila - 1][0];//indicesToItemRenderer(fila - 1, 0);
}
//Añadimos el implicado
estadoImplicado = super.selectItem(implicado, shiftKey, ctrlKey, transition);
return (estadoPrimero && estadoImplicado);
}
}
} Muchas gracias, por cualquier ayuda!
