-
Notifications
You must be signed in to change notification settings - Fork 2
/
EventClass.cls
402 lines (306 loc) · 12.1 KB
/
EventClass.cls
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
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "EventClass"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
'@Folder("TableManager.Events")
Option Explicit
Private Const Module_Name As String = "EventClass."
Private WithEvents pSheetEvent As Worksheet
Attribute pSheetEvent.VB_VarHelpID = -1
Private pTableObj As TableClass
Private WithEvents pFormEvent As MSForms.UserForm
Attribute pFormEvent.VB_VarHelpID = -1
Private pFormObj As Object
Private WithEvents pButtonEvent As MSForms.CommandButton
Attribute pButtonEvent.VB_VarHelpID = -1
Private pButtonObj As MSForms.CommandButton
Private WithEvents pTextEvent As MSForms.TextBox
Attribute pTextEvent.VB_VarHelpID = -1
Private pTextObj As MSForms.TextBox
Private WithEvents pComboEvent As MSForms.ComboBox
Attribute pComboEvent.VB_VarHelpID = -1
Private pComboObj As MSForms.ComboBox
Private pName As String
Private pWkbk As Workbook
Private LastEvent As String
Public Property Set WorkbookEvent(ByVal WB As Workbook): Set pWkbk = WB: End Property
Public Property Set SheetEvent(ByVal WS As Worksheet): Set pSheetEvent = WS: End Property
Public Property Set FormEvent(ByVal UF As MSForms.UserForm): Set pFormEvent = UF: End Property
Public Property Set ButtonEvent(ByVal CB As MSForms.CommandButton): Set pButtonEvent = CB: End Property
Public Property Set TextEvent(ByVal TB As MSForms.TextBox): Set pTextEvent = TB: End Property
Public Property Set ComboEvent(ByVal CB As MSForms.ComboBox): Set pComboEvent = CB: End Property
Public Property Set TableObj(ByVal Tbl As TableClass)
Debug.Assert Initializing
Set pTableObj = Tbl
End Property
Public Property Set FormObj(ByVal FO As Object)
Set pFormObj = FO
Set pFormEvent = FO
End Property
Public Property Set ButtonObj(ByVal Btn As MSForms.CommandButton)
Set pButtonObj = Btn
Set pButtonEvent = Btn
End Property ' ButtonObj
Public Property Set TextObj(ByVal Txt As MSForms.TextBox)
Set pTextObj = Txt
Set pTextEvent = Txt
End Property ' TextObj
Public Property Set ComboObj(ByVal Cmb As MSForms.ComboBox)
Debug.Assert Initializing
Set pComboEvent = Cmb
Set pComboObj = Cmb
End Property ' ComboObj
Private Sub pFormEvent_MouseMove( _
ByVal Button As Integer, _
ByVal Shift As Integer, _
ByVal x As Single, _
ByVal y As Single)
Const RoutineName As String = Module_Name & "FormEvent_MouseMove"
On Error GoTo ErrorHandler
If LastEvent = "Form Event" Then Exit Sub
LastEvent = "Form Event"
LowLightControl GetLastControl, Module_Name
'@Ignore LineLabelNotUsed
Done:
Exit Sub
ErrorHandler:
Debug.Print "mousemove error number: " & Err.Number
RaiseError Err.Number, Err.Source, RoutineName, Err.Description
End Sub ' FormEvent_MouseMove
Private Sub pButtonEvent_MouseMove( _
ByVal Button As Integer, _
ByVal Shift As Integer, _
ByVal x As Single, _
ByVal y As Single)
Const RoutineName As String = Module_Name & "ButtonEvent_MouseMove"
On Error GoTo ErrorHandler
If pTableObj Is Nothing Then
' Processing the database form
' Debug.Print "db"
Else
' Processing a table form
If LastEvent = "Button Event" Then Exit Sub
LastEvent = "Button Event"
' Exit if button already properly set
' Reduces the flickering of the user form
If pButtonObj.BackColor = LightestColorValue Then Exit Sub
PaintButtons
End If
LowLightControl GetLastControl, Module_Name
SetLastControl pButtonObj
HighLightControl pButtonObj, Module_Name
'@Ignore LineLabelNotUsed
Done:
Exit Sub
ErrorHandler:
RaiseError Err.Number, Err.Source, RoutineName, Err.Description
End Sub ' ButtonEvent_MouseMove
Private Sub pTextEvent_MouseMove( _
ByVal Button As Integer, _
ByVal Shift As Integer, _
ByVal x As Single, _
ByVal y As Single)
Const RoutineName As String = Module_Name & "TextEvent_MouseMove"
On Error GoTo ErrorHandler
LowLightControl GetLastControl, Module_Name
SetLastControl pTextObj
' Highlight the selected Text Box
HighLightControl pTextObj, Module_Name
'@Ignore LineLabelNotUsed
Done:
Exit Sub
ErrorHandler:
RaiseError Err.Number, Err.Source, RoutineName, Err.Description
End Sub ' TextEvent_MouseMove
Private Sub pComboEvent_MouseMove( _
ByVal Combo As Integer, _
ByVal Shift As Integer, _
ByVal x As Single, _
ByVal y As Single)
Const RoutineName As String = Module_Name & "ComboEvent_MouseMove"
On Error GoTo ErrorHandler
LowLightControl GetLastControl, Module_Name
SetLastControl pComboObj
HighLightControl pComboObj, Module_Name
'@Ignore LineLabelNotUsed
Done:
Exit Sub
ErrorHandler:
RaiseError Err.Number, Err.Source, RoutineName, Err.Description
End Sub ' ComboEvent_MouseMove
Private Sub pSheetEvent_BeforeDoubleClick( _
ByVal Target As Range, _
Cancel As Boolean)
Const RoutineName As String = Module_Name & "SheetEvent_BeforeDoubleClick"
On Error GoTo ErrorHandler
Cancel = True
Dim TableName As String
TableName = ActiveCellTableName
If TableName = vbNullString Then
MsgBox "Please select a cell in the body of the table", _
vbOKOnly Or vbExclamation, "Select a Table Cell"
Exit Sub
End If
Dim Tbl As TableClass
Set Tbl = New TableClass
Set Tbl = TableItem(TableName, Module_Name)
Set Tbl.ActiveTarget = Target
If Tbl Is Nothing Then ' Means the table has no UserForm
MsgBox "The user cannot edit this table", vbOKOnly Or vbCritical, "Table Not User-Editable"
Exit Sub
End If
Set Tbl.Table = Tbl.ActiveTarget.ListObject
Dim Isect As Range
Set Isect = Application.Intersect(Target, Tbl.Table.HeaderRowRange)
If Not Isect Is Nothing Then
BuildDataBaseForm pWkbk, Tbl, Module_Name
ShowAnyForm Tbl.UserForms, DataBaseFormName
Exit Sub
End If
PopulateForm Tbl, Module_Name
ShowAnyForm Tbl.UserForms, Tbl.Form.Name
'@Ignore LineLabelNotUsed
Done:
Exit Sub
ErrorHandler:
DisplayError RoutineName
End Sub ' SheetEvent_BeforeDoubleClick
Private Sub pButtonEvent_Click()
Dim Target As Range
Dim TableName As String
Dim Tbl As TableClass
Const RoutineName As String = Module_Name & "ButtonEvent_Click"
On Error GoTo ErrorHandler
TableName = ActiveCellTableName
Set Tbl = New TableClass
Set Tbl = Table(TableName, Module_Name)
Select Case pButtonEvent.Caption
' Table Form Buttons
Case "Validate Form"
If ValidateForm(Tbl, Module_Name) Then
MsgBox "There are no validation errors", _
vbOKOnly, "Successful Copy"
Else
MsgBox "There is/are a validation error(s)", _
vbOKOnly Or vbExclamation, _
"Data Validation Error"
End If
Case "Copy To Table"
If ValidateForm(Tbl, Module_Name) Then
PopulateTable Tbl, Module_Name
MsgBox "Form data successfully copied to Table row", _
vbOKOnly, "Successful Copy"
Else
MsgBox "There is/are a validation error(s). " & _
"Correct the error then copy the Form to the Table row.", _
vbOKOnly Or vbExclamation, _
"Data Validation Error"
End If
Case "Next Row"
TurnOnCellDescriptions Tbl, Module_Name
pTableObj.NextRow
Set pTableObj.ActiveTarget = pTableObj.ActiveTarget.Offset(0, 0)
PopulateForm Tbl, Module_Name
Case "Previous Row"
TurnOnCellDescriptions Tbl, Module_Name
pTableObj.PreviousRow
Set pTableObj.ActiveTarget = pTableObj.ActiveTarget.Offset(0, 0)
PopulateForm Tbl, Module_Name
Case "Insert Above"
pTableObj.ActiveTarget.ListObject.ListRows.Add pTableObj.ActiveRow
Set pTableObj.ActiveTarget = pTableObj.ActiveTarget.Offset(-1, 0)
ClearForm Tbl, Module_Name
Case "Insert Below"
pTableObj.ActiveTarget.ListObject.ListRows.Add pTableObj.ActiveRow + 1
Set pTableObj.ActiveTarget = pTableObj.ActiveTarget.Offset(1, 0)
ClearForm Tbl, Module_Name
Case "Insert at Top"
pTableObj.ActiveTarget.ListObject.ListRows.Add 1
Set pTableObj.ActiveTarget = pTableObj.FirstCell
ClearForm Tbl, Module_Name
Case "Insert at Bottom"
pTableObj.ActiveTarget.ListObject.ListRows.Add
Set pTableObj.ActiveTarget = pTableObj.LastCell
ClearForm Tbl, Module_Name
Case "Delete This Row"
If pTableObj.LastRow = pTableObj.ActiveRow Then
Set Target = pTableObj.ActiveTarget.Offset(-1, 0)
Else
Set Target = pTableObj.ActiveTarget.Offset(1, 0)
End If
pTableObj.ActiveTarget.ListObject.ListRows(pTableObj.ActiveRow).Delete
Set pTableObj.ActiveTarget = Target
PopulateForm Tbl, Module_Name
Case "Go To Top"
TurnOnCellDescriptions pTableObj, Module_Name
Set pTableObj.ActiveTarget = pTableObj.FirstCell
TurnOffCellDescriptions pTableObj, Module_Name
PopulateForm Tbl, Module_Name
Case "Go To Bottom"
TurnOnCellDescriptions pTableObj, Module_Name
Set pTableObj.ActiveTarget = pTableObj.LastCell
TurnOffCellDescriptions pTableObj, Module_Name
PopulateForm Tbl, Module_Name
Case Is = "Cancel"
TurnOnCellDescriptions pTableObj, Module_Name
pFormObj.Hide
Exit Sub
' Start of DataBase Form Buttons
Case Is = "Copy to File"
OutputTable pWkbk, Module_Name
Exit Sub
Case Is = "Fetch From File"
InputTable pWkbk, Module_Name
Exit Sub
Case Is = "Change File"
ChangeFile Module_Name
Exit Sub
Case Is = "Cancel File Processing"
pFormObj.Hide
Exit Sub
' End of DataBase Form Buttons
Case Else
MsgBox "This button does not exist: " & _
pButtonEvent.Caption & ". Select another.", _
vbOKOnly Or vbExclamation, "Button Does Not Exist"
End Select
PaintButtons
'@Ignore LineLabelNotUsed
Done:
Exit Sub
ErrorHandler:
DisplayError RoutineName
' RaiseError Err.Number, Err.Source, RoutineName, Err.Description
End Sub ' ButtonEvent_Click
Private Sub PaintButtons()
' Sets all the button colors to reflect the current state of the form
' Assumes that Next and Previous buttons are named properly
Const RoutineName As String = Module_Name & "PaintButtons"
On Error GoTo ErrorHandler
Debug.Assert Not Initializing
Dim Ctl As Variant
For Each Ctl In pFormObj.Controls
If Left$(Ctl.Name, 7) = "Command" Then ' All buttons names start with "CommandButton"
EnableButton Ctl, Module_Name
LowLightControl Ctl, Module_Name
If Ctl.Caption = "Previous Row" And pTableObj.ActiveRow = 1 Then
DisableButton Ctl, Module_Name
End If
If Ctl.Caption = "Next Row" And pTableObj.ActiveRow = pTableObj.LastRow Then
DisableButton Ctl, Module_Name
End If
End If
Next Ctl
'@Ignore LineLabelNotUsed
Done:
Exit Sub
ErrorHandler:
RaiseError Err.Number, Err.Source, RoutineName, Err.Description
End Sub ' PaintButtons
Public Property Get Name() As String: Name = pName: End Property
Public Property Let Name(ByVal vbl As String): pName = vbl: End Property