-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfoxrefsearch_form.prg
356 lines (291 loc) · 8.92 KB
/
foxrefsearch_form.prg
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
* Abstract...:
* Search / Replace functionality for a Form or Class Libary (SCX, VCX).
*
* Changes....:
*
#include "foxref.h"
#include "foxpro.h"
DEFINE CLASS RefSearchForm AS RefSearch OF FoxRefSearch.prg
Name = "RefSearchForm"
NoRefresh = .F.
BackupExtensions = "SCX,SCT"
FUNCTION OpenFile(lReadWrite)
LOCAL oError
m.oError = .NULL.
IF USED(TABLEFIND_ALIAS)
USE IN (TABLEFIND_ALIAS)
ENDIF
TRY
IF m.lReadWrite
USE (THIS.Filename) ALIAS TABLEFIND_ALIAS IN 0 SHARED AGAIN
ELSE
USE (THIS.Filename) ALIAS TABLEFIND_ALIAS IN 0 SHARED AGAIN NOUPDATE
ENDIF
CATCH TO oError
ENDTRY
IF ISNULL(m.oError) AND USED(TABLEFIND_ALIAS)
TRY
IF ;
TYPE(TABLEFIND_ALIAS + ".Methods") == 'M' AND ;
TYPE(TABLEFIND_ALIAS + ".Platform") == 'C' AND ;
TYPE(TABLEFIND_ALIAS + ".UniqueID") == 'C'
SELECT TABLEFIND_ALIAS
ELSE
USE IN (TABLEFIND_ALIAS)
THROW ERROR_NOTFORM_LOC
ENDIF
CATCH TO oError WHEN oError.ErrorNo == 2071
CATCH TO oError
ENDTRY
ENDIF
RETURN m.oError
ENDFUNC
FUNCTION CloseFile()
IF USED(TABLEFIND_ALIAS)
USE IN (TABLEFIND_ALIAS)
ENDIF
RETURN .T.
ENDFUNC
FUNCTION DoDefinitions()
LOCAL nSelect
LOCAL cObjName
LOCAL cClassName
LOCAL cRootClass
nSelect = SELECT()
cRootClass = .NULL.
SELECT TABLEFIND_ALIAS
SCAN ALL FOR PlatForm = "WINDOWS" AND !EMPTY(Methods)
IF Reserved1 == "Class"
cRootClass = ObjName
ENDIF
IF EMPTY(Parent)
IF BaseClass == "dataenvironment"
cObjName = ObjName
ELSE
cObjName = ''
ENDIF
cClassName = Class
ELSE
IF AT_C('.', Parent) == 0
cClassName = Parent
cObjName = ObjName
ELSE
cClassName = LEFTC(Parent, AT_C('.', Parent) - 1)
cObjName = SUBSTRC(Parent, AT_C('.', Parent) + 1) + '.' + ObjName
ENDIF
ENDIF
THIS.FindDefinitions(Methods, NVL(cRootClass, cClassName), cObjName, SEARCHTYPE_NORMAL)
ENDSCAN
SELECT (nSelect)
ENDFUNC
FUNCTION DoSearch()
LOCAL nSelect
LOCAL cObjName
LOCAL cClassName
LOCAL cRootClass
LOCAL lSuccess
nSelect = SELECT()
cRootClass = .NULL.
m.lSuccess = .T.
SELECT TABLEFIND_ALIAS
IF RECCOUNT() > 0 AND !EMPTY(Reserved8)
&& this is where global include file is stored for a form
THIS.AddFileToProcess( ;
DEFTYPE_INCLUDEFILE, ;
Reserved8, ;
'', ;
'', ;
1, ;
1, ;
Reserved8 ;
)
m.lSuccess = THIS.FindInText(Reserved8, FINDTYPE_TEXT, '', '', SEARCHTYPE_NORMAL, UniqueID, "RESERVED8")
ENDIF
SCAN ALL FOR PlatForm = "WINDOWS"
IF Reserved1 == "Class"
cRootClass = ObjName
IF !EMPTY(Reserved8) && this is where global include file is stored for a class
THIS.AddFileToProcess( ;
DEFTYPE_INCLUDEFILE, ;
Reserved8, ;
NVL(cRootClass, cClassName), ;
'', ;
1, ;
1, ;
Reserved8 ;
)
m.lSuccess = THIS.FindInText(Reserved8, FINDTYPE_TEXT, NVL(cRootClass, cClassName), cObjName, SEARCHTYPE_NORMAL, UniqueID, "RESERVED8")
ENDIF
ENDIF
IF EMPTY(Parent)
IF BaseClass == "dataenvironment"
cObjName = ObjName
ELSE
cObjName = ''
ENDIF
cClassName = Class
ELSE
IF AT_C('.', Parent) == 0
cClassName = Parent
cObjName = ObjName
ELSE
cClassName = LEFTC(Parent, AT_C('.', Parent) - 1)
cObjName = SUBSTRC(Parent, AT_C('.', Parent) + 1) + '.' + ObjName
ENDIF
ENDIF
* defined properties and methods
*!* IF !EMPTY(Reserved3)
*!* m.lSuccess = THIS.FindDefinedPEMS(Reserved3, NVL(cRootClass, cClassName), cObjName, SEARCHTYPE_EXPR, UniqueID)
*!* ENDIF
IF !EMPTY(Reserved3)
m.lSuccess = THIS.FindDefinedMethods(Reserved3, NVL(cRootClass, cClassName), cObjName, SEARCHTYPE_EXPR, UniqueID)
ENDIF
IF !EMPTY(Methods)
m.lSuccess = THIS.FindInCode(Methods, FINDTYPE_CODE, NVL(cRootClass, cClassName), cObjName, SEARCHTYPE_METHOD, UniqueID, "METHODS")
ENDIF
IF !THIS.CodeOnly
IF !EMPTY(ObjName)
m.lSuccess = THIS.FindInText(ObjName, FINDTYPE_NAME, NVL(cRootClass, cClassName), cObjName, SEARCHTYPE_EXPR, UniqueID, "OBJNAME", .T.)
ENDIF
ENDIF
IF THIS.FormProperties AND !EMPTY(Properties)
m.lSuccess = THIS.FindInProperties(Properties, Reserved3, NVL(cRootClass, cClassName), cObjName, SEARCHTYPE_EXPR, UniqueID)
ENDIF
ENDSCAN
SELECT (nSelect)
RETURN m.lSuccess
ENDFUNC
FUNCTION DoReplace(cReplaceText AS String, oReplaceCollection)
LOCAL nSelect
LOCAL cObjCode
LOCAL oFoxRefRecord
LOCAL cRefCode
LOCAL cColumn
LOCAL cTable
LOCAL cUpdField
LOCAL cRecordID
LOCAL cNewText
LOCAL oError
LOCAL i
LOCAL oMethodCollection
m.oError = .NULL.
nSelect = SELECT()
oFoxRefRecord = oReplaceCollection.Item(1)
cRefCode = oFoxRefRecord.Abstract
cColumn = RTRIM(oFoxRefRecord.ClassName)
cTable = JUSTSTEM(THIS.Filename)
cUpdField = RTRIM(oFoxRefRecord.UpdField)
cRecordID = oFoxRefRecord.RecordID
cNewText = cRefCode
SELECT TABLEFIND_ALIAS
LOCATE FOR UniqueID == cRecordID
IF FOUND()
TRY
DO CASE
CASE cUpdField = "METHODS"
cNewText = Methods
FOR m.i = oReplaceCollection.Count TO 1 STEP -1
oFoxRefRecord = oReplaceCollection.Item(m.i)
m.cNewText = THIS.ReplaceText(m.cNewText, oFoxRefRecord.LineNo, oFoxRefRecord.ColPos, oFoxRefRecord.MatchLen, m.cReplaceText, oFoxRefRecord.Abstract)
ENDFOR
*!* FOR EACH oFoxRefRecord IN oReplaceCollection
*!* cNewText = THIS.ReplaceText(cNewText, oFoxRefRecord.LineNo, oFoxRefRecord.ColPos, oFoxRefRecord.MatchLen, cReplaceText, oFoxRefRecord.Abstract)
*!* ENDFOR
IF ISNULL(cNewText)
THROW ERROR_REPLACE_LOC
ELSE
cObjCode = THIS.CompileCode(cNewText)
IF !ISNULL(cObjCode)
* update reserved3 and protected field which correspeonds to our list of properties and methods
REPLACE ;
Methods WITH cNewText, ;
ObjCode WITH cObjCode ;
IN TABLEFIND_ALIAS
IF !EMPTY(TimeStamp)
REPLACE TimeStamp WITH THIS.RowTimeStamp() IN TABLEFIND_ALIAS
ENDIF
ENDIF
ENDIF
CASE cUpdField = "RESERVED8"
cNewText = Reserved8
FOR m.i = oReplaceCollection.Count TO 1 STEP -1
oFoxRefRecord = oReplaceCollection.Item(m.i)
m.cNewText = THIS.ReplaceText(m.cNewText, oFoxRefRecord.LineNo, oFoxRefRecord.ColPos, oFoxRefRecord.MatchLen, m.cReplaceText, oFoxRefRecord.Abstract)
ENDFOR
*!* FOR EACH oFoxRefRecord IN oReplaceCollection
*!* m.cNewText = THIS.ReplaceText(m.cNewText, oFoxRefRecord.LineNo, oFoxRefRecord.ColPos, oFoxRefRecord.MatchLen, m.cReplaceText, m.oFoxRefRecord.Abstract)
*!* ENDFOR
IF ISNULL(cNewText)
THROW ERROR_REPLACE_LOC
ELSE
REPLACE ;
Reserved8 WITH cNewText ;
IN TABLEFIND_ALIAS
IF !EMPTY(TimeStamp)
REPLACE TimeStamp WITH THIS.RowTimeStamp() IN TABLEFIND_ALIAS
ENDIF
ENDIF
CASE cUpdField = "METHODNAME"
* replacement not supported
CASE cUpdField = "PROPERTYNAME"
* replacement not supported
*!* cNewText = Properties
*!* FOR EACH oFoxRefRecord IN oReplaceCollection
*!* cNewText = THIS.ReplaceText(cNewText, oFoxRefRecord.LineNo, oFoxRefRecord.ColPos, oFoxRefRecord.MatchLen, cReplaceText, oFoxRefRecord.Abstract)
*!* ENDFOR
CASE cUpdField = "PROPERTYVALUE"
* replacement not supported
*!* cNewText = Properties
*!* FOR EACH oFoxRefRecord IN oReplaceCollection
*!* cNewText = THIS.ReplaceText(cNewText, oFoxRefRecord.LineNo, oFoxRefRecord.ColPos, oFoxRefRecord.MatchLen, cReplaceText, oFoxRefRecord.Abstract)
*!* ENDFOR
CASE cUpdField = "OBJNAME"
ENDCASE
CATCH TO oError WHEN oError.ErrorNo == 2071
CATCH TO oError WHEN oError.ErrorNo == 111 && read-only
THROW REPLACE_READONLY_LOC
CATCH TO oError
THROW oError.Message
ENDTRY
ENDIF
SELECT (nSelect)
RETURN m.oError
ENDFUNC
FUNCTION DoReplaceLog(cReplaceText, oReplaceCollection AS Collection)
LOCAL cRefCode
LOCAL cNewText
LOCAL cColumn
LOCAL cTable
LOCAL cRuleExpr
LOCAL cUpdField
LOCAL cLog
LOCAL oError
LOCAL oFoxRefRecord
LOCAL cDatabase
m.cLog = ''
m.oError = .NULL.
oFoxRefRecord = oReplaceCollection.Item(1)
cRefCode = oFoxRefRecord.Abstract
cColumn = RTRIM(oFoxRefRecord.ClassName)
cTable = JUSTSTEM(THIS.Filename)
cUpdField = RTRIM(oFoxRefRecord.UpdField)
cNewText = cRefCode
FOR EACH oFoxRefRecord IN oReplaceCollection
cNewText = LEFTC(cNewText, oFoxRefRecord.ColPos - 1) + cReplaceText + SUBSTRC(cNewText, oFoxRefRecord.ColPos + oFoxRefRecord.MatchLen)
ENDFOR
TRY
DO CASE
CASE cUpdField = "PROPERTYNAME"
m.cLog = LOG_PREFIX + REPLACE_NOTSUPPORTED_LOC
CASE cUpdField = "PROPERTYVALUE"
m.cLog = LOG_PREFIX + REPLACE_NOTSUPPORTED_LOC
CASE cUpdField = "OBJNAME"
m.cLog = LOG_PREFIX + REPLACE_NOTSUPPORTED_LOC
CASE cUpdField = "METHODNAME"
m.cLog = LOG_PREFIX + REPLACE_NOTSUPPORTED_LOC
ENDCASE
CATCH TO oError
ENDTRY
RETURN m.cLog
ENDFUNC
ENDDEFINE