1.12 La clase GanttToolTip

Si os preguntáis para que sirve esta clase, os diré que una imagen vale más que mil palabras.

Esta clase es la encargada de los mensajes que aparecen cuando nos situamos encima de un objeto; en la imagen se puede ver el cuadro amarillo que se muestra al situarnos encima de un nodo.



Para poder mostrar estos textos necesitaremos una clase del tipo GanttToolTip y sobrescribir los métodos que contiene ésta.



Para empezar me crearé unos mapas en los que guardaré la información que se mostrará. Se puede hacer de otras formas, pero yo he seguido los pasos de Ax.  Estos métodos los crearé en la clase GanttClient, más adelante en este post, veréis como muestro un tooltip en los nodos sin necesidad de mapas.


En el classDeclaration nos crearemos dos variables de tipo Map.

//XBB :: http://axlearn2012.blogspot.com.es/ :: XBB_Gantt :: 20141208
class XBB_GanttClient_SchedEmpl extends GanttClient
{
     DialogField dlgFromDate;
     DialogField dlgToDate;
       

     Map workerToolTipText;
     Map projectToolTipText;
}


Añadiremos dos métodos para insertar en los mapas el identificador para los tooltip.


public str getProjectToolTipText(ProjId _projId)
{
    str ret = _projId;

    if (projectToolTipText.exists(_projId)

    {
       ret = projectToolTipText.lookup(_projId);

    }

    return ret;
}


public str getWorkerToolTipText(HcmPersonnelNumberId _hcmPersonnelNumberId)
{
   str ret = _hcmPersonnelNumberId;

   if (workerToolTipText.exists(_hcmPersonnelNumberId))

   {
      ret = workerToolTipText.lookup(_hcmPersonnelNumberId);

   }
   return ret;
}



Posteriormente vamos a crearnos dos métodos para modificar los textos que se mostrarán.

public void modifyProjectToolTipText(ProjId _projId, Name _name)
{
    str toolTipText;

    if (!projectToolTipText.exists(_projId))

    {
       toolTipText = strfmt("%1-%2", _projId, _name);
       projectToolTipText.insert(_projId, toolTipText);

    }
}


protected void modifyWorkerToolTipText(HcmPersonnelNumberId _hcmPersonnelNumberId, DirPartyName _name)
{
    str toolTipText;

    if (!workerToolTipText.exists(_hcmPersonnelNumberId))

    {
        toolTipText = strfmt("%1-%2", _hcmPersonnelNumberId, _name);
        workerToolTipText.insert(_hcmPersonnelNumberId, toolTipText);

    }
}


Ahora deberemos modificar los métodos para a la vez que insertamos registros modifiquemos los tootTip.


public container loadPersonnelNumberIds()
{
   Query                q = new Query();
   QueryBuildDataSource qbds;
   QueryRun             qr;

   HcmWorker            worker;
   ProjParameters       parameters = ProjParameters::find();
   container ret;

   Worker.recordLevelSecurity(true);

   qbds = q.addDataSource(tableNum(HcmWorker));

   qr = new QueryRun(q);

   while (qr.next())
   {    
        if (qr.changed(tableNum(HcmWorker)))
        {       

           worker = qr.get(tableNum(HcmWorker));
        }
        if(parameters.ShowInactiveEmployees == NoYes::Yes ||    (parameters.ShowInactiveEmployees != NoYes::Yes && HcmWorkerLookup::newOnlyActiveEmployeesWithinCompany().validateWorker(worker.RecId)))
        {
          ret += [[worker.PersonnelNumber, worker.name()]];
        }
   }


   return ret;
}
 
 

 
 
 
 
 
 
 

public void loadWorkerIds()
{
    HcmPersonnelNumberId    hcmPersonnelNumberId;
    Name                    name;
 
    container               containerPersonnelNumberIds;
    int                     i;
 
    #define.personnelNumberIdx(1)
    #define.name(2)

    this.resetWorkerToolTipText();
    this.resetLoadIds();

    containerPersonnelNumberIds = this.loadPersonnelNumberIds();

    for (i = 1; i <= conlen(containerPersonnelNumberIds); i++)
    {
        hcmPersonnelNumberId    = conpeek(conpeek(containerPersonnelNumberIds, i), #personnelNumberIdx);
        name                    = conpeek(conpeek(containerPersonnelNumberIds, i), #name);

        this.addLoadIds(hcmPersonnelNumberId);
        this.modifyWorkerToolTipText(hcmPersonnelNumberId, name);
    }
}
Así mismo crearemos dos métodos para reiniciar los datos de los mapas y modificaremos la clase GanttData para que las modificaciones que realicemos funcionen.

 
protected void resetWorkerToolTipText()
{
    workerToolTipText = new Map(Types::String, Types::String);
}
public void resetProjectToolTipText()
{
    projectToolTipText = new Map(Types::String, Types::String);
}
 
 
 
 
 
 
 
 
XBB_GanttTable_SchedEmpl parmGanttTable_SchedEmpl(XBB_GanttTable_SchedEmpl _ganttTable_SchedEmpl = ganttTable_SchedEmpl)
{
    ganttTable_SchedEmpl = _ganttTable_SchedEmpl;
      

    return ganttTable_SchedEmpl;
}




Y por último, vamos a crearnos la clase GanttToolTip. Como veréis mientras sobrescribimos los métodos, cada uno de ellos afecta a una parte del Gantt.



//XBB :: http://axlearn2012.blogspot.com.es/ :: XBB_Gantt :: 20141208

class XBB_GanttToolTip_SchedEmpl extends GanttToolTip
{
}


public str onGroupInTable()

{      
    str strToolTip;

    GanttActiveXVarchart localGanttVisualization = this.parmGanttVisualization() as XBB_GanttActiveXVarchart_SchedEmpl;
    XBB_GanttClient_SchedEmpl localGanttClient = localGanttVisualization.parmGanttClient() as XBB_GanttClient_SchedEmpl;
    GanttVcGroup ganttVcGroup =   localGanttVisualization.parmCurrentGanttVcGroup();   


    if(!ganttVcGroup)   
    {             
        throw error(strfmt("@SYS27147", classId2Name(classidget(this))));   
    }
   
    switch (ganttVcGroup.groupingLevel())   
    {         
        // Worker      
        case 0 :
            strToolTip = localGanttClient.getWorkerToolTipText(ganttVcGroup.name());
                 

            break;

      // Project
     

      case 1 :
            strToolTip = localGanttClient.getProjectToolTipText(ganttVcGroup.name());
                

            break;   
     }      
    
     return strToolTip;
}

public str onNodeInDiagram()

{   
    GanttActiveXVarchart     localGanttVisualization = this.parmGanttVisualization() as GanttActiveXVarchart;   
    XBB_GanttData_SchedEmpl  localGanttData = localGanttVisualization.parmGanttClient().parmGanttData() as XBB_GanttData_SchedEmpl;

    XBB_GanttTmpSchedEmpl    localGanttTmpSchedEmpl;

    GanttVcNode              ganttVcNode = localGanttVisualization.parmCurrentGanttVcNode();

    XBB_GanttTable_SchedEmpl ganttTable = localGanttData.parmGanttTable_SchedEmpl();


    if(!ganttVcNode)   

    {             
        throw error(strfmt("@SYS27147", classId2Name(classidget(this))));   
    }

    ganttTable.findRecId(ganttVcNode.recId(localGanttVisualization.parmGanttVcGantt()), true);

    localGanttTmpSchedEMPL = ganttTable.parmTableBuffer();
   

    
    return "ProjectId: " + localGanttTmpSchedEMPL.ProjId + "\n" +
        "ActivitytNum: " + localGanttTmpSchedEMPL.ActivityNumber + "\n" +
          "Start time: " + time2StrHMS(localGanttTmpSchedEMPL.StartTime) + "\n" +
            "End time: " + time2StrHMS(localGanttTmpSchedEMPL.EndTime);

}

public str onNodeInTable()

{     
    return this.onNodeInDiagram();
}

public str onNumericScale()

{       
    GanttActiveXVarchart localGanttVisualization = this.parmGanttVisualization() as GanttActiveXVarchart;    GanttVcNumericScale  ganttVcNumericScale = localGanttVisualization.parmCurrentGanttVcNumericScale();       
   
    if(ganttVcNumericScale == null)   
    {             
        throw error(strfmt("@SYS27147", classId2Name(classidget(this))));   
    }
    
    return strfmt("@SYS75252", ganttVcNumericScale.parmUnitLabel());
}

public GanttVisualization parmGanttVisualization(GanttVisualization _ganttVisualization = ganttVisualization)

{      
    return super(_ganttVisualization);
}

public static XBB_GanttToolTip_SchedEmpl construct()

{      
    return new XBB_GanttToolTip_SchedEmpl();
}

public static XBB_GanttToolTip_SchedEmpl newGanttVisualizatio(XBB_GanttActiveXVarchart_SchedEmpl _ganttVisualization)
{
   XBB_GanttToolTip_SchedEmpl ganttToolTip =      XBB_GanttToolTip_SchedEmpl::construct();

  ganttToolTip.parmGanttVisualization(_ganttVisualization);
   

  return ganttToolTip;
}


En la clase GanttActiveXVarchar deberemos sobrescribir el método createGanttToolTip para indicarle que utilizará la nuestra.


protected GanttToolTip createGanttToolTip()
{     
    return XBB_GanttToolTip_SchedEmpl::newGanttVisualization(this);
}


En el formulario sobrescribiremos el método ToolTip.


void onEvent_OnToolTipText(COM _hitObject, int _hitObjectType, int _x, int _y, COMVariant /* bstr */ _toolTipText, COMVariant /* variant */ _returnStatus)
{
     XBB_GanttActiveXVarchart_SchedEmpl localGanttVisualization_SchedEmpl = ganttClient.parmGanttVisualization();

     localGanttVisualization_SchedEmpl.onEvent_OnToolTipText(_hitObject, _hitObjectType, _x, _y, _toolTipText, _returnStatus);
}



 



Ahora dependiendo del objeto en que nos situemos, se nos mostrará el texto que le hayamos indicado.










Como son muchas cosas las que he modificado os dejo como siempre el xpo del proyecto completo.
Descargar
XPO.
 

Comentarios