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.



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.
 
//XBB :: http://axlearn2012.blogspot.com.es/ :: XBB_Gantt :: 20141208
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.
 
protected boolean applyChangedValues()
{       XBB_GanttActiveXVarchart_SchedEmpl localGanttVisualization = this.parmGanttClient().parmGanttVisualization() as XBB_GanttActiveXVarchart_SchedEmpl;
   
          boolean ret = true;
          if(!super())
         {
               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.
 
public int defaultNodeColor()
{     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.
 
 
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)
{

XBB_GanttColor_SchedEmpl ganttColor = XBB_GanttColor_SchedEmpl::construct();
           ganttColor.parmGanttClient(_ganttClient);
 
          return ganttColor;}

 
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