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 el Diagrama
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.
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 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
Publicar un comentario