1.15. La clase GanttColor
Para colorear los nodos necesitamos un campo en nuestra tabla que tenga asignado el color para el nodo (registro).
Lo podemos hacer mediante la clase GanttColor, pero no es necesaria, ya que lo único necesario es asignarle un color al nodo.
Para mi ejemplo lo que he hecho es asignar un color a cada tipo de proyecto de Ax, esto lo realizo mediante un formulario.
Posteriormente cuando se van insertando los registros a mi tabla, le asigno al campo color el que tengo configurado para el proyecto.
Empecemos a realizar lo que acabo de explicar.
Lo primero que haremos será agregar un campo de color a nuestra tabla; yo le he llamado NodeColor.
En la imagen podéis ver las propiedades del campo.
En mi caso quiero colorear los nodos dependiendo del tipo del proyecto; por eso he creado esta tabla a la que le asignaré un color a cada grupo de proyectos.
//XBB :: http://axlearn2012.blogspot.com.es/ :: XBB_Gantt :: 20141208
class XBB_GanttColor_SchedEmpl extends GanttColor
{}
protected boolean applyChangedValues()
boolean ret = true;
if(!super())
return ret;
}
public int defaultNodeColor()
{ return this.rgb2int(192, 226, 192);
}
public OLE_Color getNodeColor(tableName _tableName,
RecId _recId, Common _record = null)
{
XBB_GanttTmpSchedEmpl tmp;
ProjTable projTable;
XBB_GanttProjGroupColors ganttProjGroupColors;
OLE_Color color;
if(prmisdefault(_record))
{ _record = this.parmGanttClient().parmGanttData().getRecordByRecId(_tableName, _recId);
}
tmp = _record;
projTable = ProjTable::find(tmp.ProjId);
ganttProjGroupColors = XBB_GanttProjGroupColors::find(projTable.ProjGroupId);
color = ganttProjGroupColors.RecId ? ganttProjGroupColors.color : this.defaultNodeColor();
return color;
}
public static XBB_GanttColor_SchedEmpl construct()
{ return new XBB_GanttColor_SchedEmpl();
}
public static XBB_GanttColor_SchedEmpl newGanttClient(XBB_GanttClient_SchedEmpl _ganttClient)
{
return ganttColor;}
return fieldStr(XBB_GanttTmpSchedEmpl, NodeColor);
}
Modificaremos el siguiente método para actualizar el mapa de los nodos para asignar el color.
public void setPostLoadingParameters()
{
XBB_GanttSetup_SchedEmpl ganttSetup = this.parmGanttClient().parmGanttSetup();
super();
this.showNonWorkInterval(ganttSetup.parmLoadCalendar());
this.setZoomFactor(ganttSetup.parmDiagramZoomFactor());
this.updateMapEntriesFromNodes();
}
Este será el encargado de actualizar el color del nodo.
protected void updateColorOnNode(TableName _tableName,
recId _recId,
GanttVcNode _ganttVcNode)
{
XBB_GanttColor_SchedEmpl localGanttColor = this.parmGanttClient().parmGanttColor() as XBB_GanttColor_SchedEmpl;
XBB_GanttTmpSchedEmpl ganttTmpSchedEmpl;
OLE_Color nodeColor;
TableName tableName = _tableName;
RecId recId = _recId;
if(_ganttVcNode == null)
{
throw error(strfmt("@SYS27147", classId2Name(classidget(this))));
}
if(!tableName)
{
tableName = _ganttVcNode.tableName();
}
if(!recId)
{
recId = _ganttVcNode.recId(ganttVcGantt);
}
ganttTmpSchedEmpl = this.parmGanttClient().parmGanttData().getRecordByRecId(tableName, recId);
nodeColor = localGanttColor.getNodeColor(tableName, recId, ganttTmpSchedEmpl);
_ganttVcNode.setFieldValueStr(this.fieldNameNodeColor(),
int2str(nodeColor),
this.parmGanttVcGantt());
this.createOrUpdateMapEntry(this.mapNodeColor(), int2str(nodeColor), nodeColor);
}
protected void updateMapEntriesFromNode(GanttVcNode _ganttVcNode)
{
str strColorValue;
if(_ganttVcNode == null)
{
throw error(strfmt("@SYS27147", classId2Name(classidget(this))));
}
strColorValue = _ganttVcNode.getFieldValueStr(this.fieldNameNodeColor(),
this.parmGanttVcGantt());
//Si no existe color posiblemente porque se ha creado un registro vacío
if (strColorValue)
{
this.createOrUpdateMapEntry(this.mapNodeColor(), strColorValue, str2int(strColorValue));
}
}
En nuestra clase client añadiremos lo que sigue:
protected GanttColor createGanttColor()
{
return XBB_GanttColor_SchedEmpl::newGanttClient(this);
}
public GanttColor parmGanttColor(GanttColor _ganttColor = ganttColor)
{
return super(_ganttColor);
}
En nuestra GanttData añadiremos la siguiente línea para asignar el valor a nuestro campo color.
protected void insertDataActivities(PSASchedEmplReservation _schedEmplReservation)
{
ganttTable_SchedEmpl.cleanTableBuffer();
ganttTable_SchedEmpl.initFromPSASchedEmplReservation(_schedEmplReservation);
ganttTable_SchedEmpl.initFromGanttColor(this.parmGanttClient().parmGanttColor());
ganttTable_SchedEmpl.insert(_schedEmplReservation.recId, _schedEmplReservation.recVersion);
}
En nuestra clase XBB_GanttTable_SchedEmpl añadiremos el método initFromGanttColor.
public void initFromGanttColor(XBB_GanttColor_SchedEmpl _ganttColor)
{
ganttTmpSchedEmpl.NodeColor = _ganttColor.getNodeColor(tablestr(XBB_GanttTmpSchedEmpl),
ganttTmpSchedEmpl.RecId,
ganttTmpSchedEmpl);
}
y nos aseguraremos de tener creado el mapa.
Lo podemos hacer mediante la clase GanttColor, pero no es necesaria, ya que lo único necesario es asignarle un color al nodo.
Para mi ejemplo lo que he hecho es asignar un color a cada tipo de proyecto de Ax, esto lo realizo mediante un formulario.
Posteriormente cuando se van insertando los registros a mi tabla, le asigno al campo color el que tengo configurado para el proyecto.
Empecemos a realizar lo que acabo de explicar.
Lo primero que haremos será agregar un campo de color a nuestra tabla; yo le he llamado NodeColor.
En la imagen podéis ver las propiedades del campo.
En mi caso quiero colorear los nodos dependiendo del tipo del proyecto; por eso he creado esta tabla a la que le asignaré un color a cada grupo de proyectos.
Y este es el formulario para esta tabla.
Todo el proyecto incluida esta tabla y formulario los tenéis en el proyecto al final del post.
El siguiente paso es crearnos una clase GanttColor y modificar las que ya tenemos para habilitar esta nueva funcionalidad.
Nos crearemos una clase que extienda de la GanttColor.
class XBB_GanttColor_SchedEmpl extends GanttColor
{}
El próximo método lo crearemos por si queremos modificar los colores del nodo, si cambiamos por el ejemplo, el proyecto del nodo en el Gantt.
{ XBB_GanttActiveXVarchart_SchedEmpl localGanttVisualization = this.parmGanttClient().parmGanttVisualization() as XBB_GanttActiveXVarchart_SchedEmpl;
boolean ret = true;
{
return false;
return false;
}
localGanttVisualization.updateColorOnNodes();return ret;
}
Anularemos el siguiente método de la clase para asignarle al nodo un color por defecto; en el caso de que no hayamos configurado un color para el grupo de proyecto.
{ return this.rgb2int(192, 226, 192);
}
Este método nos devolverá el color dependiendo de lo que tengamos parametizados, como veréis en el código en caso que no tenga color le asignará el que tenemos asignado por defecto en el método defaultnodeColor.
RecId _recId, Common _record = null)
{
XBB_GanttTmpSchedEmpl tmp;
ProjTable projTable;
XBB_GanttProjGroupColors ganttProjGroupColors;
OLE_Color color;
if(prmisdefault(_record))
{ _record = this.parmGanttClient().parmGanttData().getRecordByRecId(_tableName, _recId);
}
tmp = _record;
projTable = ProjTable::find(tmp.ProjId);
ganttProjGroupColors = XBB_GanttProjGroupColors::find(projTable.ProjGroupId);
color = ganttProjGroupColors.RecId ? ganttProjGroupColors.color : this.defaultNodeColor();
return color;
}
{ return new XBB_GanttColor_SchedEmpl();
}
{
XBB_GanttColor_SchedEmpl ganttColor = XBB_GanttColor_SchedEmpl::construct();
ganttColor.parmGanttClient(_ganttClient);
El siguiente paso será crearnos los siguientes métodos en nuestra clase XBB_GanttActiveXVarchart_SchedEmpl.
Este será el método que devolverá el campo de nuestra tabla al que se le asignará el color.
protected FieldName fieldNameNodeColor()
{return fieldStr(XBB_GanttTmpSchedEmpl, NodeColor);
}
Modificaremos el siguiente método para actualizar el mapa de los nodos para asignar el color.
public void setPostLoadingParameters()
{
XBB_GanttSetup_SchedEmpl ganttSetup = this.parmGanttClient().parmGanttSetup();
super();
this.showNonWorkInterval(ganttSetup.parmLoadCalendar());
this.setZoomFactor(ganttSetup.parmDiagramZoomFactor());
this.updateMapEntriesFromNodes();
}
Este será el encargado de actualizar el color del nodo.
protected void updateColorOnNode(TableName _tableName,
recId _recId,
GanttVcNode _ganttVcNode)
{
XBB_GanttColor_SchedEmpl localGanttColor = this.parmGanttClient().parmGanttColor() as XBB_GanttColor_SchedEmpl;
XBB_GanttTmpSchedEmpl ganttTmpSchedEmpl;
OLE_Color nodeColor;
TableName tableName = _tableName;
RecId recId = _recId;
if(_ganttVcNode == null)
{
throw error(strfmt("@SYS27147", classId2Name(classidget(this))));
}
if(!tableName)
{
tableName = _ganttVcNode.tableName();
}
if(!recId)
{
recId = _ganttVcNode.recId(ganttVcGantt);
}
ganttTmpSchedEmpl = this.parmGanttClient().parmGanttData().getRecordByRecId(tableName, recId);
nodeColor = localGanttColor.getNodeColor(tableName, recId, ganttTmpSchedEmpl);
_ganttVcNode.setFieldValueStr(this.fieldNameNodeColor(),
int2str(nodeColor),
this.parmGanttVcGantt());
this.createOrUpdateMapEntry(this.mapNodeColor(), int2str(nodeColor), nodeColor);
}
protected void updateMapEntriesFromNode(GanttVcNode _ganttVcNode)
{
str strColorValue;
if(_ganttVcNode == null)
{
throw error(strfmt("@SYS27147", classId2Name(classidget(this))));
}
strColorValue = _ganttVcNode.getFieldValueStr(this.fieldNameNodeColor(),
this.parmGanttVcGantt());
//Si no existe color posiblemente porque se ha creado un registro vacío
if (strColorValue)
{
this.createOrUpdateMapEntry(this.mapNodeColor(), strColorValue, str2int(strColorValue));
}
}
En nuestra clase client añadiremos lo que sigue:
protected GanttColor createGanttColor()
{
return XBB_GanttColor_SchedEmpl::newGanttClient(this);
}
public GanttColor parmGanttColor(GanttColor _ganttColor = ganttColor)
{
return super(_ganttColor);
}
En nuestra GanttData añadiremos la siguiente línea para asignar el valor a nuestro campo color.
protected void insertDataActivities(PSASchedEmplReservation _schedEmplReservation)
{
ganttTable_SchedEmpl.cleanTableBuffer();
ganttTable_SchedEmpl.initFromPSASchedEmplReservation(_schedEmplReservation);
ganttTable_SchedEmpl.initFromGanttColor(this.parmGanttClient().parmGanttColor());
ganttTable_SchedEmpl.insert(_schedEmplReservation.recId, _schedEmplReservation.recVersion);
}
En nuestra clase XBB_GanttTable_SchedEmpl añadiremos el método initFromGanttColor.
public void initFromGanttColor(XBB_GanttColor_SchedEmpl _ganttColor)
{
ganttTmpSchedEmpl.NodeColor = _ganttColor.getNodeColor(tablestr(XBB_GanttTmpSchedEmpl),
ganttTmpSchedEmpl.RecId,
ganttTmpSchedEmpl);
}
Ya tenemos lo necesario en nuestras clases; ahora es el momento de modificar nuestro formulario.
Añadiremos el nuevo campo a las tablas.
y nos aseguraremos de tener creado el mapa.
Éste resultado será el que veis en la imagen.
Tal vez en esta imagen se vea mejor, cada proyecto tiene un grupo de proyectos distintos y por eso los nodos tiene un color diferente dependiendo de este.
Con esto es suficiente para colorear los nodos incluso más de lo necesario.
En caso de que no tengáis licencias es muy probable que no podáis modificar los colores del nodo.
Descargar xpo con el proyecto completo.
Comentarios
Publicar un comentario