-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclsApplication.cls
More file actions
260 lines (206 loc) · 8.94 KB
/
Copy pathclsApplication.cls
File metadata and controls
260 lines (206 loc) · 8.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "clsApplication"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
' gestion de la aplicacion 'gestor de oportunidades ABC'
'@Folder "1-Aplicacion"
Option Explicit
Private Const MODULE_NAME As String = "clsApplication"
Private mCtxMgr As clsExecutionContextMgr
Private mEventDispatcher As clsEventDispatcher
Private mEvMediatorInfrastructure As clsEventsMediatorInfrastructure
Private mFileMgr As clsFileManager
Private mOpportunityProvider As FileSystemOpportunityProvider
Private mCalcProvider As FileSystemTechnicalCalcProvider
Private mQuoteProvider As FileSystemEconomicQuoteProvider
Private mTemplateProvider As FileSystemTemplateProvider
Private mOpportunities As clsOpportunitiesMgr
Private mFSMonitoringCoord As clsFSMonitoringCoord
Private mConfiguration As clsConfiguration
Private mRibbon As clsRibbon
' Estado centralizado de la aplicación
Private mApplicationState As clsApplicationState
Public Property Get ChartManager() As clsChartMgr
If Not mCtxMgr Is Nothing Then Set ChartManager = mCtxMgr.ChartMgr
End Property
Public Property Get ExecutionContextMgr() As clsExecutionContextMgr
Set ExecutionContextMgr = mCtxMgr
End Property
Public Static Property Get ribbon() As clsRibbon
Set ribbon = mRibbon
End Property
Public Property Get Dispatcher() As clsEventDispatcher
Set Dispatcher = mEventDispatcher
End Property
Public Property Get FileMgr() As clsFileManager
Set FileMgr = mFileMgr
End Property
Public Property Get FSMonitoringCoord() As clsFSMonitoringCoord
Set FSMonitoringCoord = mFSMonitoringCoord
End Property
Public Property Get OpportunitiesMgr() As clsOpportunitiesMgr
Set OpportunitiesMgr = mOpportunities
End Property
Public Property Get CalcProvider() As ITechnicalCalcProvider
Set CalcProvider = mCalcProvider
End Property
'@Description: Obtiene el proveedor de valoraciones económicas
Public Property Get QuoteProvider() As IEconomicQuoteProvider
Set QuoteProvider = mQuoteProvider
End Property
'@Description: Obtiene la configuracion de la aplicacion
Public Property Get Configuration() As clsConfiguration
Set Configuration = mConfiguration
End Property
'@Description: Obtiene el gestor de estado centralizado de la aplicación
Public Property Get State() As clsApplicationState
Set State = mApplicationState
End Property
' -------------------------------------------------------------
' Class_Initialize: SOLO inicialización mínima (ligera y segura)
' NO debe hacer trabajo pesado ni depender de App
' -------------------------------------------------------------
Private Sub Class_Initialize()
On Error GoTo ErrHandler
LogInfo MODULE_NAME, "[Class_Initialize] Iniciando aplicacion"
' fixme: revisar que el orden de instanciación de cada componente es EL CORRECTO!!
' (se ha intentado respetar el orden Infraestructura -> dominio -> UI -> Aplicación;
' y dentro de cada capa, primero los managers (que crean ellos mismos los State), luego
' los servicios y la configuracion de la capa; y finalmente mediadores de eventos, y coordinadores
Set mApplicationState = New clsApplicationState
InitializeInfrastructure
InitializeDomain
InitializeUI
LogInfo MODULE_NAME, "[Class_Initialize] inicialización completada"
Exit Sub
ErrHandler:
LogCurrentError MODULE_NAME, "[Class_Initialize]"
Err.Raise Err.Number, MODULE_NAME & "[Class_Initialize]", _
"Error inicializando aplicación: " & Err.Description
End Sub
Private Sub InitializeInfrastructure()
On Error GoTo ErrHandler
' --- CORE ---
Set mCtxMgr = New clsExecutionContextMgr
' ESTADO CENTRALIZADO - Inyectar referencias a subestados (Dependency Injection)
' clsChartMgr nace como composicion interna de clsExecutionContextMgr
mApplicationState.Initialize CtxState:=mCtxMgr.State, ChartState:=mCtxMgr.ChartMgr.State
Set mFileMgr = New clsFileManager
mFileMgr.Init mCtxMgr.Application.Workbooks
mApplicationState.Initialize FileState:=mFileMgr.State
' GESTOR DE EVENTOS DE INFRAESTRUCTURA (adapter pattern)
Set mEvMediatorInfrastructure = New clsEventsMediatorInfrastructure
Call mEvMediatorInfrastructure.Initialize(mFileMgr, mCtxMgr)
' --- CONFIGURACIÓN ---
Set mConfiguration = New clsConfiguration
' --- MONITOREO ---
Set mFSMonitoringCoord = New clsFSMonitoringCoord
mFSMonitoringCoord.IniciarMonitoreo mConfiguration.oDicFoldersToWatch
' --- PROVIDERS (implementaciones de interfaces de dominio) ---
Set mOpportunityProvider = New FileSystemOpportunityProvider
mOpportunityProvider.Initialize mFileMgr, mConfiguration, mFSMonitoringCoord
Set mCalcProvider = New FileSystemTechnicalCalcProvider
mCalcProvider.Initialize mFileMgr, mFSMonitoringCoord
Set mQuoteProvider = New FileSystemEconomicQuoteProvider
mQuoteProvider.Initialize mFileMgr
Set mTemplateProvider = New FileSystemTemplateProvider
mTemplateProvider.Initialize mFileMgr, mConfiguration, mFSMonitoringCoord
Exit Sub
ErrHandler:
LogCurrentError MODULE_NAME, "[InitializeInfrastructure]"
Err.Raise Err.Number, MODULE_NAME & "[InitializeInfrastructure]", _
Err.Description
End Sub
Private Sub InitializeDomain()
On Error GoTo ErrHandler
' DOMINIO - Crear manager de oportunidades (crea su estado internamente)
' Recibe la clase concreta (WithEvents no funciona con interfaces en VBA)
Set mOpportunities = New clsOpportunitiesMgr
mOpportunities.Initialize mOpportunityProvider
' ESTADO CENTRALIZADO - Inyectar referencias a subestados (Dependency Injection)
mApplicationState.Initialize OpportunityState:=mOpportunities.State
Exit Sub
ErrHandler:
LogCurrentError MODULE_NAME, "[InitializeDomain]"
Err.Raise Err.Number, MODULE_NAME & "[InitializeDomain]", _
Err.Description
End Sub
Private Sub InitializeUI()
On Error GoTo ErrHandler
' INTERFAZ - Crear Ribbon (crea RibbonState internamente)
Set mEventDispatcher = New clsEventDispatcher
Set mRibbon = New clsRibbon
mRibbon.Initialize mOpportunities, mFileMgr, mCtxMgr.ChartMgr, mCtxMgr
' Recuperacion automatica tras reset de VBA: si el IRibbonUI sigue vivo en Excel4, reutilizarlo
Dim recoveredRibbon As IRibbonUI
Set recoveredRibbon = RecoverRibbonFromExcelNames()
If Not recoveredRibbon Is Nothing Then
mRibbon.Init recoveredRibbon
LogInfo MODULE_NAME, "[InitializeUI] Ribbon recuperado automaticamente de sesion anterior"
End If
Set recoveredRibbon = Nothing
' ESTADO CENTRALIZADO - Inyectar referencias a subestados (Dependency Injection)
mApplicationState.Initialize RibbonState:=mRibbon.State
Exit Sub
ErrHandler:
LogCurrentError MODULE_NAME, "[InitializeUI]"
Err.Raise Err.Number, MODULE_NAME & "[InitializeUI]", _
Err.Description
End Sub
' -------------------------------------------------------------
' Class_Terminate: limpieza
' -------------------------------------------------------------
Private Sub Class_Terminate()
LogInfo MODULE_NAME, "[Terminate] Iniciando limpieza de la aplicacion"
On Error Resume Next ' Asegurar que la limpieza continúa aunque haya errores
' ORDEN INVERSO A LA INSTANCIACIÓN:
' Infraestructura: CtxMgr -> FileMgr -> EvMediatorInfra -> Configuración -> FSMonitoringCoord
' -> OpportunityProvider -> CalcProvider -> QuoteProvider -> TemplateProvider
' Dominio: Opportunities
' UI: Ribbon -> EventDispatcher
DisposeUI
DisposeDomain
DisposeInfrastructure
' 12. Liberar estado centralizado de aplicacion
Set mApplicationState = Nothing
LogInfo MODULE_NAME, "[Terminate] Limpieza completada"
End Sub
Private Sub DisposeInfrastructure()
' Liberar proveedores (orden inverso a instanciación)
Set mTemplateProvider = Nothing
Set mQuoteProvider = Nothing
Set mCalcProvider = Nothing
Set mOpportunityProvider = Nothing
' Apagado explícito del monitor de archivos
If Not mFSMonitoringCoord Is Nothing Then
mFSMonitoringCoord.Shutdown
Set mFSMonitoringCoord = Nothing
End If
' Liberar configuración
Set mConfiguration = Nothing
' Liberar mediador de eventos de infraestructura
Set mEvMediatorInfrastructure = Nothing
' Liberar gestor de archivos
Set mFileMgr = Nothing
' clsChartMgr liberado internamente por clsExecutionContextMgr (composición)
' Liberar contexto de ejecución (primero en instanciarse, último en liberarse)
Set mCtxMgr = Nothing
End Sub
Private Sub DisposeDomain()
' Liberar gestor de oportunidades
Set mOpportunities = Nothing
End Sub
Private Sub DisposeUI()
' Liberar Ribbon (con apagado explicito de eventos)
If Not mRibbon Is Nothing Then
mRibbon.StopEvents
Set mRibbon = Nothing
End If
' Liberar dispatcher de eventos
Set mEventDispatcher = Nothing
End Sub