unit uEditorObra; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, uEditorDBItem, ToolWin, ComCtrls, JvExControls, JvComponent, uViewObra, uBizObras, JvNavigationPane, ActnList, uEditorBase, StdActns, TB2Dock, TB2Toolbar, TBX, ImgList, PngImageList, TB2Item, uEditorItem, DB, uDADataTable, uEditorDBBase, JvFormAutoSize, uDAScriptingProvider, uDACDSDataTable, StdCtrls, pngimage, ExtCtrls, TBXDkPanels, JvButton, AppEvnts, uCustomView, uViewBase, JvAppStorage, JvAppRegistryStorage, JvFormPlacement, JvComponentBase, uViewObras, uIEditorObra, uObrasController, JvExComCtrls, JvStatusBar, dxLayoutLookAndFeels, uDAInterfaces, dxGDIPlusClasses, cxControls, cxContainer, cxEdit, cxLabel, uViewDetallesGenerico, uViewListaEjecucionesObra, uViewEjecucionObra, Grids, DBGrids; type TfEditorObra = class(TfEditorDBItem, IEditorObra) dxLayoutLookAndFeelList1: TdxLayoutLookAndFeelList; dxLayoutOfficeLookAndFeel1: TdxLayoutOfficeLookAndFeel; pagEjecucionActual: TTabSheet; pagListaEjecuciones: TTabSheet; frViewListaEjecucionesObra1: TfrViewListaEjecucionesObra; actNuevaEjecucion: TAction; actFinalizarEjecucion: TAction; TBXSubmenuItem2: TTBXSubmenuItem; TBXItem7: TTBXItem; TBXItem33: TTBXItem; dsEjecucionActiva: TDADataSource; TBXItem34: TTBXItem; TBXItem35: TTBXItem; procedure FormShow(Sender: TObject); procedure CustomEditorClose(Sender: TObject; var Action: TCloseAction); procedure actNuevaEjecucionExecute(Sender: TObject); procedure actNuevaEjecucionUpdate(Sender: TObject); procedure actFinalizarEjecucionExecute(Sender: TObject); procedure actFinalizarEjecucionUpdate(Sender: TObject); procedure pgPaginasChange(Sender: TObject); protected FController : IObrasController; FObra: IBizObra; FViewObra : IViewObra; FViewEjecucionActual: IViewEjecucionObra; function GetController : IObrasController; procedure SetController (const Value : IObrasController); virtual; function GetObra: IBizObra; virtual; procedure SetObra(const Value: IBizObra); virtual; function GetViewObra: IViewObra; procedure SetViewObra(const Value: IViewObra); property ViewObra: IViewObra read GetViewObra write SetViewObra; procedure GuardarInterno; override; procedure EliminarInterno; override; procedure PonerTitulos(const ATitulo: string = ''); override; procedure ActualizarPestanas; //Si queremos crear otra vista para el editor heredado solo tendriamos que //sobreescribir este metodo procedure AsignarVista; virtual; procedure AsignarVistaEjecucion; procedure DestruirVistaEjecucion; public property Obra: IBizObra read GetObra write SetObra; constructor Create(AOwner: TComponent); override; destructor Destroy; override; end; implementation {$R *.dfm} uses uCustomEditor, uDataModuleObras, uDataModuleBase, uDialogUtils; function ShowEditorObra (ABizObject : TDADataTableRules): TModalResult; var AEditor: TfEditorObra; begin AEditor := TfEditorObra.Create(Application); try AEditor.Obra := (ABizObject as IBizObra); Result := AEditor.ShowModal; finally AEditor.Release; end; end; { ******************************* TfEditorObra ******************************* } function TfEditorObra.GetObra: IBizObra; begin Result := FObra; end; function TfEditorObra.GetController: IObrasController; begin Result := FController; end; function TfEditorObra.GetViewObra: IViewObra; begin Result := FViewObra; end; procedure TfEditorObra.GuardarInterno; {var FPresupuestos : IBizEjecucionPresupuestos;} begin inherited; { FPresupuestos := NIL; if Assigned(FViewEjecucionActual) then FPresupuestos := FViewEjecucionActual.Presupuestos;} FController.Guardar(FObra); Modified := False; end; procedure TfEditorObra.pgPaginasChange(Sender: TObject); begin inherited; if pgPaginas.ActivePage = pagEjecucionActual then begin if FObra.Ejecuciones.State in dsEditModes then FObra.Ejecuciones.Post; FController.LocalizarEjecucionActiva(FObra.Ejecuciones) end else if pgPaginas.ActivePage = pagListaEjecuciones then FObra.Ejecuciones.First; end; procedure TfEditorObra.PonerTitulos(const ATitulo: string); var FTitulo : String; begin if Assigned(Obra) then begin if Obra.EsNuevo then FTitulo := 'Nueva obra' else FTitulo := 'Obra' + ' - ' + Obra.NOMBRE; end; inherited PonerTitulos(FTitulo); end; procedure TfEditorObra.SetObra(const Value: IBizObra); begin FObra := Value; dsDataTable.DataTable := FObra.DataTable; if Assigned(FViewObra) and Assigned(FObra) then begin FViewObra.Obra := FObra; dsEjecucionActiva.DataTable := FObra.Ejecuciones.DataTable; frViewListaEjecucionesObra1.Obra := FObra; frViewListaEjecucionesObra1.Controller := FController; if FController.LocalizarEjecucionActiva(FObra.Ejecuciones) then AsignarVistaEjecucion end else begin FViewObra.Obra := NIL; dsEjecucionActiva.DataTable := NIL; frViewListaEjecucionesObra1.Obra := NIL; end; ActualizarPestanas; end; procedure TfEditorObra.SetController(const Value: IObrasController); begin FController := Value; if Assigned(FViewObra) and Assigned(FController) then FViewObra.Controller := FController; end; procedure TfEditorObra.SetViewObra(const Value: IViewObra); begin FViewObra := Value; if Assigned(FViewObra) and Assigned(Obra) then FViewObra.Obra := Obra; end; procedure TfEditorObra.FormShow(Sender: TObject); begin inherited; if not Assigned(FViewObra) then raise Exception.Create('No hay ninguna vista asignada'); if not Assigned(Obra) then raise Exception.Create('No hay ninguna obra asignada'); Obra.DataTable.Active := True; end; destructor TfEditorObra.Destroy; begin // Utilizar mejor OnClose; inherited; end; procedure TfEditorObra.DestruirVistaEjecucion; begin FViewEjecucionActual := NIL; end; procedure TfEditorObra.actFinalizarEjecucionExecute(Sender: TObject); begin if (ShowConfirmMessage('Finalizar la ejecución en curso', 'La ejecución actual pasará a ser histórica. ¿Desea cerrar la ejecución actual de la obra?') = IDYES) then begin ShowHourglassCursor; try FController.CerrarEjecucionActiva(FObra, Now); DestruirVistaEjecucion; ActualizarPestanas; pgPaginas.ActivePageIndex := pagListaEjecuciones.PageIndex; finally HideHourglassCursor; end; end; end; procedure TfEditorObra.actFinalizarEjecucionUpdate(Sender: TObject); begin inherited; (Sender as TAction).Enabled := not actNuevaEjecucion.Enabled; end; procedure TfEditorObra.actNuevaEjecucionExecute(Sender: TObject); begin inherited; ShowHourglassCursor; try FObra.Ejecuciones.Insert; AsignarVistaEjecucion; ActualizarPestanas; pgPaginas.ActivePageIndex := pagEjecucionActual.PageIndex; finally HideHourglassCursor; end; end; procedure TfEditorObra.actNuevaEjecucionUpdate(Sender: TObject); begin inherited; (Sender as TAction).Enabled := not pagEjecucionActual.TabVisible; end; procedure TfEditorObra.ActualizarPestanas; begin if Assigned(FViewEjecucionActual) then pagEjecucionActual.TabVisible := True else pagEjecucionActual.TabVisible := False; end; procedure TfEditorObra.AsignarVista; var AViewObra: TfrViewObra; begin AViewObra := TfrViewObra.Create(Self); with AViewObra do begin Parent := pagGeneral; Align := alClient; dxLayoutControlObra.LookAndFeel := dxLayoutOfficeLookAndFeel1; end; ViewObra := AViewObra; end; procedure TfEditorObra.AsignarVistaEjecucion; var AViewEjecucion: TfrViewEjecucionObra; begin AViewEjecucion := TfrViewEjecucionObra.Create(NIL); with AViewEjecucion do begin Parent := pagEjecucionActual; Align := alClient; dxLayoutControlEjecucionObra.LookAndFeel := dxLayoutOfficeLookAndFeel1; Controller := FController; Obra := FObra; end; FViewEjecucionActual := AViewEjecucion; end; constructor TfEditorObra.Create(AOwner: TComponent); begin inherited; pgPaginas.ActivePage := pagGeneral; FViewEjecucionActual := NIL; AsignarVista; end; procedure TfEditorObra.CustomEditorClose(Sender: TObject; var Action: TCloseAction); begin inherited; dsDataTable.DataTable := NIL; FViewObra := NIL; FObra := NIL; end; procedure TfEditorObra.EliminarInterno; begin if (ShowConfirmMessage('Eliminar la obra', '¿Desea eliminar esta obra?') = IDYES) then begin inherited; if not FController.Eliminar(FObra) then actRefrescar.Execute; end; end; end.