1.13 La clase GanttPopupMenu y la GanttDialog

Hoy explicaremos estas dos clases ya que van ligadas entre si.

La clase popup es la encargada de mostrar menus emergentes en el Gantt de la misma manera que la tooltip mostraba textos.


Tenemos menus emergentes en todo el formulario:

En los nodos de la tabla.




En las tablas





En el Diagrama

En los nodos.


En la escala de tiempos




y tenemos más posibilidades.  Aquí podéis ver los posibles métodos a sobrescribir:



En este post posteriormente a la explicación de cada clase os encontraréis el xpo con la clase actualizada y al final del post el proyecto completo.

Empezaremos creando la clase Dialog que la utilizaremos para crear diálogos para que el usuario visualice información y los llamaremos des de los métodos que se utilizan en la Popup.


//XBB :: http://axlearn2012.blogspot.com.es/ :: XBB_Gantt :: 20141208
class XBB_GanttDialog_SchedEmpl extends GanttDialog
{
}




Nos crearemos métodos con los que recuperar las otras clases que participan en el Gantt.

public GanttClient ganttClient()
{     

    return this.parmGanttVisualization().parmGanttClient();
}


public XBB_GanttSetup_SchedEmpl ganttSetup()
{    return this.parmGanttVisualization().parmGanttClient().parmGanttSetup();
}



Este método llamado info nos creará un diálogo con el que el usuario podrá ver la información del registro/nodo seleccionado.

public void info(RecId _recId)
{
   XBB_GanttTmpSchedEmpl ganttTmpSchedEmpl;
   Dialog                dialog;
   HcmWorker             worker;
   ProjTable             projTable;
   smmActivities         smmActivities;


   if (!_recId)
   {
      return;
   }


   ganttTmpSchedEmpl = this.parmGanttVisualization().parmGanttClient().parmGanttData().getRecordByRecId(tablestr(XBB_GanttTmpSchedEmpl), _recId);

   if(!ganttTmpSchedEmpl.RecId)
   {
      throw error(strfmt("@SYS27147", classId2Name(classidget(this))));
   }

   projTable     = projTable::find(ganttTmpSchedEmpl.ProjId);

   smmActivities = smmActivities::find(ganttTmpSchedEmpl.ActivityNumber);
   worker        = HcmWorker::findByPersonnelNumber(ganttTmpSchedEmpl.PersonnelNumberId);
   dialog = this.createDialog(strFmt("%1", smmActivities.ActivityNumber));
   dialog.form().design().control('CancelButton').visible(0);
   dialog.addGroup("@SYS35583");

   this.addField(dialog, extendedtypestr(ProjId), fieldpname(ProjTable, ProjId), projTable.ProjId);
   this.addField(dialog, extendedtypestr(Name), fieldpname(ProjTable, Name), projTable.Name);
   this.addField(dialog, extendedtypestr(smmActivityNumber), fieldpname(smmActivities, ActivityNumber), smmActivities.ActivityNumber);
   this.addField(dialog, extendedtypestr(Purpose), fieldpname(smmActivities, Purpose), smmActivities.Purpose);

   dialog.addGroup("@SYS8758");
     

   this.addField(dialog, extendedtypestr(smmActivityDate), fieldpname(XBB_GanttTmpSchedEmpl, StartDate), ganttTmpSchedEmpl.StartDate);
   this.addField(dialog, extendedtypestr(smmActivityStartTime), fieldpname(XBB_GanttTmpSchedEmpl, StartTime), ganttTmpSchedEmpl.StartTime);
   this.addField(dialog, extendedtypestr(smmActivityDate), fieldpname(XBB_GanttTmpSchedEmpl, EndDate), ganttTmpSchedEmpl.EndDate);
   this.addField(dialog, extendedtypestr(smmActivityEndTime), fieldpname(XBB_GanttTmpSchedEmpl, EndTime), ganttTmpSchedEmpl.EndTime);

   dialog.addGroup("@SYS40777");

   this.addField(dialog, extendedtypestr(HcmPersonnelNumberId), fieldpname(XBB_GanttTmpSchedEmpl, PersonnelNumberId), ganttTmpSchedEmpl.PersonnelNumberId);
   this.addField(dialog, extendedtypestr(Name), fieldpname(DirPerson, Name), worker.name());

   dialog.addGroup("@SYS102596");
   dialog.run(true);
}

public static XBB_GanttDialog_SchedEmpl construct()
{
   return new XBB_GanttDialog_SchedEmpl();
}


public static XBB_GanttDialog_SchedEmpl newGanttVisualization(GanttVisualization _ganttVisualization)
{
   XBB_GanttDialog_SchedEmpl ganttDialog = XBB_GanttDialog_SchedEmpl::construct();

   ganttDialog.parmGanttVisualization(_ganttVisualization);


   return ganttDialog;
}


Descargar la clase GanttDialog.


El siguiente paso será crearnos la clase Popup que es la encargada de mostrar los menús emergentes..

//XBB :: http://axlearn2012.blogspot.com.es/ :: XBB_Gantt :: 20141208
class XBB_GanttPopupMenu_SchedEmpl extends GanttPopupMenu
{
  #XGantt
  #define.ZoomFactor25(25)
  #define.ZoomFactor50(50)
  #define.ZoomFactor75(75)
  #define.ZoomFactor100(100)
  #define.ZoomFactor125(125)
  #define.ZoomFactor150(150)
  #define.ZoomFactor175(175)
  #define.ZoomFactor200(200)
}

public XBB_GanttDialog_SchedEmpl ganttDialog()
{
  return this.parmGanttVisualization().parmGanttDialog();
}

public XBB_GanttSetup_SchedEmpl ganttSetup()
{
  return this.parmGanttVisualization().parmGanttClient().parmGanttSetup();
}




Sobrescribiremos los métodos que utiliza el Gantt para los eventos Popup.
Como veréis en el método se crea las opciones del popup y luego dependiendo de la opción elegida por el usuario, realizará una acción o otra.

public void onDiagramRClick()
{
   GanttActiveXVarchart localGanttVisualization = this.parmGanttVisualization() as GanttActiveXVarchart;

   PopupMenu popupMenu;

   int       menu3DLayoutDiagram;
   int       menuZoomFactor25;
   int       menuZoomFactor50;
   int       menuZoomFactor75;
   int       menuZoomFactor100;
   int       menuZoomFactor125;
   int       menuZoomFactor150;
   int       menuZoomFactor175;
   int       menuZoomFactor200;
   int       menuZoomFactorDisabled;
   int       selectedMenu;

 
 #define.zoomFactor25(25)
   #define.zoomFactor50(50)
   #define.zoomFactor75(75)
   #define.zoomFactor100(100)
   #define.zoomFactor125(125)
   #define.zoomFactor150(150)
   #define.zoomFactor175(175)
   #define.zoomFactor200(200)

   PopupMenu createDiagramPopupMenu()
   {
       PopupMenu diagramPopupMenu = this.createPopupMenu();
       PopupMenu zoomMenu = this.createPopupMenu(diagramPopupMenu);

       int       diagramZoomFactor;

       // 3D layout
       menu3DLayoutDiagram = diagramPopupMenu.insertItem("@SYS26304", this.ganttSetup().parmDiagramLayout3D());

      // Zoom menu
      diagramPopupMenu.insertPopupMenu("@SYS6918", zoomMenu);
       

      diagramZoomFactor = this.ganttSetup().parmDiagramZoomFactor();

      menuZoomFactor25  = zoomMenu.insertItem(strfmt("@SYS76498", #ZoomFactor25, "@SYS77046"), diagramZoomFactor == #ZoomFactor25);
      menuZoomFactor50 = zoomMenu.insertItem(strfmt("@SYS76498", #ZoomFactor50, "@SYS77046"), diagramZoomFactor == #ZoomFactor50);
      menuZoomFactor75 = zoomMenu.insertItem(strfmt("@SYS76498", #ZoomFactor75, "@SYS77046"), diagramZoomFactor == #ZoomFactor75);
      menuZoomFactor100 = zoomMenu.insertItem(strfmt("@SYS76498", #ZoomFactor100, "@SYS77046"), diagramZoomFactor == #ZoomFactor100);
      menuZoomFactor125 = zoomMenu.insertItem(strfmt("@SYS76498", #ZoomFactor125, "@SYS77046"), diagramZoomFactor == #ZoomFactor125);
      menuZoomFactor150 = zoomMenu.insertItem(strfmt("@SYS76498", #ZoomFactor150, "@SYS77046"), diagramZoomFactor == #ZoomFactor150);
      menuZoomFactor175 = zoomMenu.insertItem(strfmt("@SYS76498", #ZoomFactor175, "@SYS77046"), diagramZoomFactor == #ZoomFactor175);
      menuZoomFactor200 = zoomMenu.insertItem(strfmt("@SYS76498", #ZoomFactor200, "@SYS77046"), diagramZoomFactor == #ZoomFactor200);

      if(diagramZoomFactor != #ZoomFactor25 &&
         diagramZoomFactor != #ZoomFactor50 &&
         diagramZoomFactor != #ZoomFactor75 &&
         diagramZoomFactor != #ZoomFactor100 &&
         diagramZoomFactor != #ZoomFactor125 &&
         diagramZoomFactor != #ZoomFactor150 &&
         diagramZoomFactor != #ZoomFactor175 &&
         diagramZoomFactor != #ZoomFactor200)
     {
         menuZoomFactorDisabled = zoomMenu.insertItem(strfmt("@SYS76498", diagramZoomFactor, "@SYS77046"), true, true);      

     }
     return diagramPopupMenu;   

   };
   // create popup menu
   popupMenu = createDiagramPopupMenu();
   // show popup menu
   selectedMenu = popupMenu.draw();
   switch(selectedMenu)
   {
      // 3D layout
     case menu3DLayoutDiagram:
         this.ganttSetup().parmDiagramLayout3D(!this.ganttSetup().parmDiagramLayout3D());
         this.ganttSetup().applyChanges();
         break;

     // Zoom menu
     case menuZoomFactor25:
           
         this.ganttSetup().parmDiagramZoomFactor(#zoomFactor25);
         this.ganttSetup().applyChanges();
         break;
     case menuZoomFactor50:
         this.ganttSetup().parmDiagramZoomFactor(#zoomFactor50);
         this.ganttSetup().applyChanges();
         break;
     case menuZoomFactor75:
         this.ganttSetup().parmDiagramZoomFactor(#zoomFactor75);
         this.ganttSetup().applyChanges();
         break;
     case menuZoomFactor100:

         this.ganttSetup().parmDiagramZoomFactor(#zoomFactor100);
         this.ganttSetup().applyChanges();
         break;
     case menuZoomFactor125:
         this.ganttSetup().parmDiagramZoomFactor(#zoomFactor125);
         this.ganttSetup().applyChanges();
         break;
     case menuZoomFactor150:
         this.ganttSetup().parmDiagramZoomFactor(#zoomFactor150);
         this.ganttSetup().applyChanges();
         break;
     case menuZoomFactor175:

         this.ganttSetup().parmDiagramZoomFactor(#zoomFactor175);
         this.ganttSetup().applyChanges();
         break;
     case menuZoomFactor200:
         this.ganttSetup().parmDiagramZoomFactor(#zoomFactor200);
         this.ganttSetup().applyChanges();
         break;
     case menuZoomFactorDisabled:
         throw error("@SYS6144");
    } 
}



Con este método nuestro diagrama tendrá el siguiente menu.



El siguiente método es para cuando presionemos con el botón derecho del ratón sobre el diagrama.

public void onNodeRClickInDiagram()
{
     GanttActiveXVarchart localGanttVisualization = this.parmGanttVisualization() as GanttActiveXVarchart;
     XBB_GanttClient_SchedEmpl localGanttClient = localGanttVisualization.parmGanttClient() as XBB_GanttClient_SchedEmpl;
     XBB_GanttData_SchedEmpl localGanttData = localGanttVisualization.parmGanttClient().parmGanttData()
as  XBB_GanttData_SchedEmpl;

     PopupMenu                popupMenu = this.createPopupMenu();


     GanttVcNodeCollection    ganttVcNodeCollection = localGanttVisualization.parmGanttVcGantt().ganttVcNodeCollection();
     GanttVcNode              ganttVcNode = localGanttVisualization.parmCurrentGanttVcNode();


     XBB_GanttTable_SchedEmpl ganttTable;


     RecId                    currentNodeRecId;
    
     int                      selectedMenu;
     int                      selectedInformation;
     int                      selectedGoToProj;
     int                      selectedGoToProjJob;
     int                      selectedDeleteNode;
     int                      selectedDialogue;
     int                      selectedGoToActivity;
     int                      selectedGoToProject;

     XBB_GanttTmpSchedEmpl    ganttTmp;
     PSASchedEmplReservation  PSASchedEmplReservation;

     GanttVcGantt             ganttVcGantt = localGanttVisualization.parmGanttVcGantt();

     if(!ganttVcNode || !ganttVcNodeCollection)
     {
        throw error(strfmt("@SYS27147", classId2Name(classidget(this))));
     }

     currentNodeRecId = ganttVcNodeCurrent.recId(ganttVcGantt);
   

     if(!currentNodeRecId)
     {
        return;
     }

     ganttTable = localGanttData.parmGanttTable_SchedEmpl();
     ganttTable.findRecId(currentNodeRecId, true);

     ganttTmp = ganttTable.parmTableBuffer();
     PSASchedEmplReservation = PSASchedEmplReservation::findRecId(ganttTmp.PSASchedEmplReservationRecId);
       

     selectedInformation = popupMenu.insertItem("@SYS53922", false);
     popupMenu.insertBreak();


     selectedGoToProject = popupMenu.insertItem("@SYS50121", false);
     selectedGoToActivity = popupMenu.insertItem("@SYS115424", false);
     popupMenu.insertBreak();


     selectedDeleteNode = popupMenu.insertItem("@SYS115538", false);
     popupMenu.insertBreak();


     // add selected nodes
     ganttVcNodeCollection.selectNodes(#vcSelected);

     selectedMenu = popupMenu.draw();


     switch(selectedMenu)
     {
        // Information
        case selectedInformation :
             this.ganttDialog().info(currentNodeRecId);

             break;

        // Delete node
        case selectedDeleteNode :
             ganttTable.parmGanttActiveXVarchart(localGanttVisualization);
             ganttTable.deleteNode();
             break;

        // Go to activity
        case selectedGoToActivity :
             ganttTable.goToActivity();
             break;

       // Go to project
       case selectedGoToProject :
            ganttTable.goToProject();
            break;
     }
}


Ahora en los nodos se nos presentará el siguiente menú.



En este menú emergente es para la escala de tiempo.

public void onTimeScaleRClick()
{
    PopupMenu popupMenu;
    int       menuTimescaleInterval;
    int       menuTimescaleMinutes;
    int       menuTimescaleHours;
    int       menuTimescaleDays;
    int       menuTimescaleWeeks;
    int       menuTimescaleMonths;
    int       menuShowDateGrids;
    int       menu3DLayoutTimescale;
    int       selectedMenu;

    PopupMenu createTimescalePopupMenu()
    {
        PopupMenu popupMainMenu;
        PopupMenu scaleSubMenu;
              

        popupMainMenu = this.createPopupMenu();
        scaleSubMenu  = this.createPopupMenu(popupMainMenu);
        menuTimescaleInterval = popupMainMenu.insertItem("@SYS74822");

        popupMainMenu.insertPopupMenu("@SYS112940", scaleSubMenu);
        menuShowDateGrids = popupMainMenu.insertItem("@SYS26263", this.ganttSetup ().parmShowDateGrids());

        menu3DLayoutTimescale = popupMainMenu.insertItem("@SYS26304", this.ganttSetup().parmTimeScaleLayout3D());

        // Timescale menu
        menuTimescaleMinutes = scaleSubMenu.insertItem(enum2str(GanttTimescale::Minutes), this.ganttSetup().parmTimeScaleName() == GanttTimescale::Minutes);
        menuTimescaleHours = scaleSubMenu.insertItem(enum2str(GanttTimescale::Hours), this.ganttSetup().parmTimeScaleName() == GanttTimescale::Hours);
        menuTimescaleDays = scaleSubMenu.insertItem(enum2str(GanttTimescale::Days), this.ganttSetup().parmTimeScaleName() == GanttTimescale::Days);
        menuTimescaleWeeks = scaleSubMenu.insertItem(enum2str(GanttTimescale::Weeks), this.ganttSetup().parmTimeScaleName() == GanttTimescale::Weeks);
        menuTimescaleMonths = scaleSubMenu.insertItem(enum2str(GanttTimescale::Months), this.ganttSetup().parmTimeScaleName() == GanttTimescale::Months);

        return popupMainMenu;
    };


    // create popup menu
    popupMenu = createTimescalePopupMenu();


    // show popup menu
    selectedMenu = popupMenu.draw();


    switch (selectedMenu)
    {
        case menuTimescaleInterval:
             this.ganttDialog().timeScaleInterval();
             break;
        case menuTimescaleMinutes:
             this.ganttSetup().parmTimeScaleName(GanttTimescale::Minutes);
             this.ganttSetup().applyChanges();
             break;
        case menuTimescaleHours:
             this.ganttSetup().parmTimeScaleName(GanttTimescale::Hours);
             this.ganttSetup().applyChanges();
             break;
        case menuTimescaleDays:
             this.ganttSetup().parmTimeScaleName(GanttTimescale::Days);
             this.ganttSetup().applyChanges();
             break;
        case menuTimescaleWeeks:
             this.ganttSetup().parmTimeScaleName(GanttTimescale::Weeks);
             this.ganttSetup().applyChanges();
             break;
        case menuTimescaleMonths:
             this.ganttSetup().parmTimeScaleName(GanttTimescale::Months);
             this.ganttSetup().applyChanges();
             break;
        case menuShowDateGrids:

             this.ganttSetup().parmShowDateGrids(!this.ganttSetup().parmShowDateGrids());
             this.ganttSetup().applyChanges();
             break;
        case menu3DLayoutTimescale:
             this.ganttSetup().parmTimeScaleLayout3D(!this.ganttSetup().parmTimeScaleLayout3D());
             this.ganttSetup().applyChanges();
             break;

       }
}


La escala de tiempos quedará así.




public static XBB_GanttPopupMenu_SchedEmpl construct()
{
    return new XBB_GanttPopupMenu_SchedEmpl();
}


public static XBB_GanttPopupMenu_SchedEmpl newGanttVisualization(GanttVisualization _ganttVisualization)
{
     XBB_GanttPopupMenu_SchedEmpl ganttPopupMenu = XBB_GanttPopupMenu_SchedEmpl::construct();
       

     ganttPopupMenu.parmGanttVisualization(_ganttVisualization);
       

     return ganttPopupMenu;
}

Descargar la clase GanttPopupMenu.



Para finalizar modificaremos las clases existentes para añadir las nuevas funcionalidades.


La clase GanttactiveXvarchart


//XBB :: http://axlearn2012.blogspot.com.es/ :: XBB_Gantt :: 20141208
class XBB_GanttActiveXVarchart_SchedEmpl extends GanttActiveXVarchart
{
    //Diagram layer
    #define.startEnd('Start-End')
}

protected Set getSetLayerNames3D()
{
   Set setLayerNames = new Set(Types::String);

   setLayerNames.add(#startEnd);


   return setLayerNames;
}


protected GanttDialog createGanttDialog()
{
   return XBB_GanttDialog_SchedEmpl::newGanttVisualization(this);
}

protected GanttPopupMenu createGanttPopupMenu()

{
   return XBB_GanttPopupMenu_SchedEmpl::newGanttVisualization(this);

}

Descargar la clase GanttActiveXVarchart.
.

La clase Ganttsetup


//XBB :: http://axlearn2012.blogspot.com.es/ :: XBB_Gantt :: 20141208
class XBB_GanttSetup_SchedEmpl extends GanttSetup
{
   GanttActiveXVarchart ganttVisualization;

   NoYes                mustReloadData;


   // General
   NoYes                showNonWorkInterval;
   NoYes                showNonWorkIntervalChanged;


   // Time scale
   NoYes                showDateGrids;
   NoYes                showDateGridsChanged;

   GanttTimescale       timeScaleName;
   NoYes                timeScaleNameChanged;


   NoYes                timeScaleLayout3D;
   NoYes                timeScaleLayout3DChanged;
   

   // Diagram
   int                  timeUnitsPerStep;

   NoYes                timeUnitsPerStepChanged;

   NoYes                diagramLayout3D;
   NoYes                diagramLayout3DChanged;


   int                  diagramZoomFactor;
   NoYes                diagramZoomFactorChanged;


   #define.InitialDiagramZoomFactor(150)
   #define.CurrentVersion(5)
   #localmacro.CurrentList

        // Time scale settings
        showDateGrids,

        timeScaleName,
        timeScaleLayout3D,


        //Diagram
        timeUnitsPerStep,
        diagramLayout3D,
        diagramZoomFactor
   #endmacro
}


public static XBB_GanttSetup_SchedEmpl construct()
{
    return new XBB_GanttSetup_SchedEmpl();
}

public static XBB_GanttSetup_SchedEmpl newGanttClient(XBB_GanttClient_SchedEmpl _ganttClient)
{
    XBB_GanttSetup_SchedEmpl ganttSetup = XBB_GanttSetup_SchedEmpl::construct();

    ganttSetup.parmGanttClient(_ganttClient);


    return ganttSetup;

}

protected int defaultTimeUnitsPerStep()
{
    #define.defaultTimeUnitsPerStepValue(30)

    return #defaultTimeUnitsPerStepValue;
}


Vamos a crearnos métodos para cargar de nuevo el gantt cuando se realizan cambios.

protected boolean applyChangedValues()
{
    if(!super())
    {
       return false;
    }


    if(mustReloadData)
    {
       ganttClient.reload();


       return false;
    }

    this.applyChangesTimeScale();

    this.applyChangesDiagram();
   

    return true;
}


protected void applyChangesDiagram()
{
    GanttActiveXVarchart localGanttVisualization = this.ganttVisualization() as GanttActiveXVarchart;

    if(timeUnitsPerStepChanged)

    {
       localGanttVisualization.setTimeUnitsPerStep(timeUnitsPerStep);
    }

    if(diagramLayout3DChanged)

    {
       localGanttVisualization.setDiagramLayout3D(diagramLayout3D);
    }
    if(diagramZoomFactorChanged)
    {
       localGanttVisualization.setZoomFactor(diagramZoomFactor);
       localGanttVisualization.adjustXGanttWidth();
    }
}


protected void applyChangesTimeScale()
{
    GanttActiveXVarchart localGanttVisualization = this.ganttVisualization() as GanttActiveXVarchart;

    if(showDateGridsChanged)
    {
       localGanttVisualization.showDateGrids(showDateGrids);
    }
    if(timeScaleNameChanged)
    {
       localGanttVisualization.setActiveTimeScale(enum2Symbol(enumnum(GanttTimescale), timeScaleName));
    }

    if(timeScaleLayout3DChanged)
    {
       localGanttVisualization.setTimeScaleLayout3D(timeScaleLayout3D);
    }
}


public GanttVisualization ganttVisualization()
{
   return super();
}



A continuación crearemos unos métodos para iniciar por defecto los valores.

public void initParmDefault()
{
   super();
      
   // Setup dialog settings
   this.initParmDefaultGeneral();


   // Other settings
   this.initParmDefaultTimeScale();
   this.initParmDefaultDiagram();
}


protected void initParmDefaultDiagram()
{
   #define.defaultZoomFactorValue(150)

   timeUnitsPerStep = this.defaultTimeUnitsPerStep();

   diagramLayout3D   = NoYes::Yes;
   diagramZoomFactor = #defaultZoomFactorValue;
}


protected void initParmDefaultGeneral()
{
   showNonWorkInterval = NoYes::Yes;
}


protected void initParmDefaultTimeScale()
{
   showDateGrids     = NoYes::Yes;
   timeScaleName     = GanttTimescale::Days;
   timeScaleLayout3D = NoYes::Yes;
}


public int parmTimeUnitsPerStep(int _timeUnitsPerStep = timeUnitsPerStep)
{
   if(timeUnitsPerStep != _timeUnitsPerStep)
   {
      timeUnitsPerStepChanged = NoYes::Yes;
      timeUnitsPerStep        = _timeUnitsPerStep;
   }


   return timeUnitsPerStep;
}

protected void resetChangedValues()
{
    super();

    mustReloadData = NoYes::No;


    // Time scale
    showDateGridsChanged     = NoYes::No;
    timeScaleNameChanged     = NoYes::No;
    timeScaleLayout3DChanged = NoYes::No;


    //Diagram
    timeUnitsPerStepChanged = NoYes::No;
    diagramLayout3DChanged = NoYes::No;
    diagramZoomFactorChanged = NoYes::No;
}


public GanttTimescale parmTimeScaleName(GanttTimescale _timeScaleName = timeScaleName)
{
   if(timeScaleName != _timeScaleName)
   {
       timeScaleNameChanged = NoYes::Yes;
       timeScaleName = _timeScaleName;
   }


   return timeScaleName;
}

public NoYes parmTimeScaleLayout3D(NoYes _timeScaleLayout3D = timeScaleLayout3D)
{
   if(timeScaleLayout3D != _timeScaleLayout3D)
   {
       timeScaleLayout3DChanged = NoYes::Yes;
       timeScaleLayout3D = _timeScaleLayout3D;
   }


   return timeScaleLayout3D;
}

public NoYes parmShowDateGrids(NoYes _showDateGrids = showDateGrids)
{
   if(showDateGrids != _showDateGrids)
   {
      showDateGridsChanged = NoYes::Yes;
      showDateGrids = _showDateGrids;
   }


   return showDateGrids;
}

public GanttActiveXVarchart parmGanttActiveXVarchart(GanttActiveXVarchart _ganttVisualization = ganttVisualization)
{
    ganttVisualization = _ganttVisualization;
   

    return ganttVisualization;
}

public int parmDiagramZoomFactor(int _diagramZoomFactor = diagramZoomFactor)
{
    if(diagramZoomFactor != _diagramZoomFactor)
    {

       diagramZoomFactorChanged = NoYes::Yes;
       diagramZoomFactor = _diagramZoomFactor;
    }


    return diagramZoomFactor;
}

public NoYes parmDiagramLayout3D(NoYes _diagramLayout3D = diagramLayout3D)
{
     if(diagramLayout3D != _diagramLayout3D)
     {
        diagramLayout3DChanged = NoYes::Yes;
        diagramLayout3D = _diagramLayout3D;
     }


     return diagramLayout3D;
}


public container pack()
{
   return [#CurrentVersion, #CurrentList] + [super()];
}

public boolean unpack(container packedClass)
{
   container base;
   boolean   ret;
   Integer   version = conpeek(packedClass,1);

   switch (version)
   {
       case #CurrentVersion:
           [version, #CurrentList, base] = packedClass;
           ret = super(base);
           break;
       default:
           ret = false;
   }
   return ret; 
}


Descargar la clase GanttSetup.



En la clase Ganttable


//XBB :: http://axlearn2012.blogspot.com.es/ :: XBB_Gantt :: 20141208
class XBB_GanttTable_SchedEmpl extends GanttTableBase
{
    XBB_GanttActiveXVarchart_SchedEmpl ganttVisualization;
    XBB_GanttClient_SchedEmpl          ganttClient;
    GanttVcGantt                       ganttVcGantt;
    XBB_GanttTmpSchedEmpl              ganttTmpSchedEmpl;
}




Nos creamos unos métodos que llamarán a formularios estandar.

//Go to activity from popupmenu
public void goToActivity()
{
   Args          args = new Args();
   MenuFunction  menuFunction;
   smmActivities activity;


   if(!ganttTmpSchedEmpl.RecId)
   {
      throw error(strfmt("@SYS27147", classId2Name(classidget(this))));
   }

   activity = smmActivities::find(ganttTmpSchedEmpl.ActivityNumber);


   if (activity.RecId)
   {
      args.record(activity);
      menuFunction = new MenuFunction(menuitemdisplaystr(smmActivities), MenuItemType::Display);
      menuFunction.run(args);
   }
}



En mi caso tengo modificaciones en la projtable y por eso me abre el proyecto correcto.

//Go to project from popupmenu
public void goToProject()
{
    Args         args = new Args();

    MenuFunction menuFunction;

    ProjTable    projTable;


    if(!ganttTmpSchedEmpl.RecId)
    {
       throw error(strfmt("@SYS27147", classId2Name(classidget(this))));
    }

    projTable = ProjTable::find(ganttTmpSchedEmpl.ProjId);


    if (projTable.RecId)
    {

        args.record(projTable);

        menuFunction = new MenuFunction(menuitemdisplaystr(ProjTable), MenuItemType::Display);
        menuFunction.run(args);
    }
}


//Delete a node from popupmenu
public void deleteNode()
{
    PSASchedEmplReservation PSASchedEmplReservation;


    if(!ganttTmpSchedEmpl.RecId)
    {
       throw error(strfmt("@SYS27147", classId2Name(classidget(this))));
    }


    if (ganttTmpSchedEmpl.PSASchedEmplReservationRecId)
    {
        if (Box::okCancel("Delete node?", DialogButton::Cancel) == DialogButton::Ok)
        {
            delete_from PSASchedEmplReservation
                   where PSASchedEmplReservation.RecId == ganttTmpSchedEmpl.PSASchedEmplReservationRecId;
                      

            GanttVisualization.parmGanttClient().reload();
            ganttVisualization.parmGanttVcGantt().sortNodes();
        }
    }
}


public XBB_GanttActiveXVarchart_SchedEmpl parmGanttActiveXVarchart(XBB_GanttActiveXVarchart_SchedEmpl _ganttVisualization = ganttVisualization)
{
    ganttVisualization = _ganttVisualization;
    return ganttVisualization;

}


Descargar la clase GanttTable.
.

En nuestro formulario en el control ActiveX sobrescribiremos los siguientes métodos.


void onEvent_OnDiagramRClick(int _x, int _y, COMVariant /* variant */ _returnStatus)
{
    XBB_GanttActiveXVarchart_SchedEmpl localGanttVisualization = ganttClient.parmGanttVisualization();
    localGanttVisualization.onEvent_OnDiagramRClick(_x, _y, _returnStatus);
}


void onEvent_OnNodeRClick(COM _node, int _location, int _x, int _y, COMVariant /* variant */ _returnStatus)

{
    XBB_GanttActiveXVarchart_SchedEmpl localGanttVisualization = ganttClient.parmGanttVisualization();
    localGanttVisualization.onEvent_OnNodeRClick(_node, _location, _x, _y, _returnStatus);
}

void onEvent_OnNumericScaleRClick(COM _numericScale, int _x, int _y, COMVariant /* variant */ _returnStatus)
{
   XBB_GanttActiveXVarchart_SchedEmpl localGanttVisualization = ganttClient.parmGanttVisualization();
   localGanttVisualization.onEvent_OnNumericScaleRClick(_numericScale, _x, _y, _returnStatus);
}


void onEvent_OnTimeScaleRClick(COM _timeScale, int _x, int _y, COMVariant /* variant */ _returnStatus)
{
     XBB_GanttActiveXVarchart_SchedEmpl localGanttVisualization = ganttClient.parmGanttVisualization();
     localGanttVisualization.onEvent_OnTimeScaleRClick(_timeScale, _x, _y, _returnStatus);
}


void onEvent_OnTimeScaleSectionRescale(COM _timeScale, int _sectionIndex, int _newBasicUnitWidth, COMVariant /* variant */ _returnStatus)
{
     XBB_GanttActiveXVarchart_SchedEmpl localGanttVisualization = ganttClient.parmGanttVisualization();
     localGanttVisualization.onEvent_OnTimeScaleSectionRescale(_timeScale, _sectionIndex, _newBasicUnitWidth, _returnStatus);
}


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);
}


Descargar xpo con el proyecto completo.

Nota: Es posible que falte alguna clase al proyecto así que lo agrego de nuevo.


Descargar xpo.

 

Comentarios