-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfoxrefstart.prg
180 lines (155 loc) · 4.65 KB
/
foxrefstart.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
* Program....: FOXREFSTART.PRG
* Version....: 1.0
* Date.......: February 26, 2002
* Abstract...: Entry point for Visual FoxPro References (foxref)
* Changes....:
* Parameters.:
* [oAction] = symbol information to lookup, as passed by VFP
*
#include "foxref.h"
#include "foxpro.h"
LPARAMETERS oAction
=CREATEOBJECT("CFoxRefStart", m.oAction)
RETURN
DEFINE CLASS CFoxRefStart AS Session
PROCEDURE Init(oAction)
LOCAL oFoxRef AS FoxRef OF foxref.prg
LOCAL lOverwrite
LOCAL lShowResults
LOCAL cSymbol
LOCAL nMode
LOCAL cFilename
LOCAL nLineNo
LOCAL cClassName
LOCAL cProcName
LOCAL cSelectedText
LOCAL nHWND
LOCAL nMousePointer
LOCAL i
LOCAL lLibraryOpen
LOCAL cFoxToolsLibrary
LOCAL oError
LOCAL lSuccess
LOCAL cTalk
LOCAL ARRAY aEdEnv[25]
SET TALK OFF
IF VARTYPE(m.oAction) == 'O'
m.nMode = m.oAction.Mode
m.cSymbol = m.oAction.Word && word under the cursor
m.cFilename = m.oAction.Filename
m.nLineNo = m.oAction.LineNo
m.cClassName = m.oAction.Class
m.cProcName = m.oAction.Proc
m.nHWND = m.oAction.HWND
ELSE
m.nMode = MODE_REFERENCES
m.cSymbol = ''
m.cFilename = ''
m.nLineNo = 0
m.cClassName = ''
m.cProcName = ''
m.nHWND = -1
ENDIF
m.nMousePointer = _SCREEN.MousePointer
_SCREEN.MousePointer = MOUSE_HOURGLASS
* -- see if we have an open window
m.oFoxRef = .NULL.
FOR m.i = 1 TO _SCREEN.FormCount
IF _SCREEN.Forms(m.i).Name == "frmFoxRefResults" AND TYPE("_SCREEN.Forms(m.i).oFoxRef") == 'O' AND !ISNULL(_SCREEN.Forms(m.i).oFoxRef)
m.oFoxRef = _SCREEN.Forms(m.i).oFoxRef
EXIT
ENDIF
ENDFOR
*ZAP@241119
PRIVATE m.pcSymbol, m.pcFilename
m.pcSymbol = UPPER(LTRIM(m.cSymbol,0,CHR(32),CHR(9))) && ZAP@241120 add UPPER
m.pcFilename = m.cFilename
m.pnLineNo = m.nLineNo
IF VARTYPE(m.oFoxRef) <> 'O'
m.oFoxRef = NEWOBJECT("FoxRef", "FoxRefEngine.prg", .NULL., .T.)
ENDIF
IF !m.oFoxRef.lInitError
m.oFoxRef.WindowHandle = m.nHWND
m.oFoxRef.WindowFilename = m.cFilename
m.oFoxRef.WindowLineNo = m.nLineNo
* grab the selected line
m.cSelectedText = m.cSymbol
IF m.nHWND >= 0 AND m.nLineNo > 0
TRY
IF ATCC("FOXTOOLS.FLL", SET("LIBRARY")) == 0
m.lLibraryOpen = .F.
m.cFoxtoolsLibrary = SYS(2004) + "FOXTOOLS.FLL"
IF FILE(m.cFoxtoolsLibrary)
SET LIBRARY TO (m.cFoxToolsLibrary) ADDITIVE
ENDIF
ELSE
m.lLibraryOpen = .T.
ENDIF
IF _edgetenv(m.nHWND, @aEdEnv) == 1
IF aEdEnv[EDENV_LENGTH] > 0 && AND aEdEnv[EDENV_SELSTART] > -1 AND aEdEnv[EDENV_SELEND] > 0
m.cSelectedText = _edgetstr(m.nHWND, aEdEnv[EDENV_SELSTART], aEdEnv[EDENV_SELEND] - 1)
* make sure we get a single line
DO CASE
CASE CHR(10)$m.cSelectedText AND CHR(13)$m.cSelectedText
m.cSelectedText = LEFT(m.cSelectedText, MIN(AT(CHR(10), m.cSelectedText), AT(CHR(13), m.cSelectedText)) - 1)
CASE CHR(10)$m.cSelectedText
m.cSelectedText = LEFT(m.cSelectedText, AT(CHR(10), m.cSelectedText) - 1)
CASE CHR(13)$m.cSelectedText
m.cSelectedText = LEFT(m.cSelectedText, AT(CHR(13), m.cSelectedText) - 1)
ENDCASE
ENDIF
ENDIF
IF !m.lLibraryOpen AND ATCC(m.cFoxToolsLibrary, SET("LIBRARY")) > 0
RELEASE LIBRARY (m.cFoxToolsLibrary)
ENDIF
CATCH
ENDTRY
ENDIF
* m.oFoxRef.RestorePrefs()
DO CASE
CASE m.nMode == MODE_REFERENCES
m.oFoxRef.WindowHandle = -1
m.oFoxRef.SetProject()
IF m.oFoxRef.SearchCount() > 0
m.oFoxRef.ShowResults()
ELSE
m.oFoxRef.Search(m.cSelectedText, .T.)
ENDIF
CASE m.nMode == MODE_LOOKUP
m.oFoxRef.SetProject()
IF m.oFoxRef.SearchCount() > 0 AND VARTYPE(m.oAction) <> 'O'
m.oFoxRef.ShowResults()
ELSE
m.oFoxRef.Search(m.cSelectedText, .T.)
ENDIF
CASE m.nMode == MODE_GOTODEF
IF !EMPTY(m.cSelectedText)
*ZAP@241120
IF EMPTY(m.pcSymbol)
m.pcSymbol = UPPER(LTRIM(m.cSelectedText,0,CHR(32),CHR(9)))
ENDIF
m.cSymbol = m.cSelectedText
ENDIF
IF !EMPTY(m.cSymbol)
IF m.oFoxRef.WindowHandle >= 0
m.oFoxRef.CollectDefinitions(.T.) && grab locals only first from current window
m.lSuccess = m.oFoxRef.GotoSymbol(m.cSymbol, m.cFilename, m.cClassName, m.cProcName, m.nLineNo, .T.)
ELSE
m.lSuccess = .F.
ENDIF
IF !m.lSuccess
m.oFoxRef.CollectDefinitions()
m.oFoxRef.GotoSymbol(m.cSymbol, m.cFilename, m.cClassName, m.cProcName, m.nLineNo)
ENDIF
ENDIF
ENDCASE
ENDIF
_SCREEN.MousePointer = m.nMousePointer
RETURN
ENDPROC
PROCEDURE Destroy()
ENDPROC
ENDDEFINE
PROCEDURE _edgetstr
PROCEDURE _edgetenv
PROCEDURE _edgetlpos