Project

General

Profile

Statistics
| Revision:

vdfsplat / AppSrc / cSplatCodeMax.pkg @ 67

History | View | Annotate | Download (18.2 KB)

1 7 wil
//TH-Header
2
//*****************************************************************************************
3
// Copyright (c)  2013 Antwise Solutions
4
// All rights reserved.
5
//
6
// $FileName    : cSplatCodemax.pkg
7
// $ProjectName : Vdf Debugger
8
// $Authors     : Wil van Antwerpen
9
// $Created     : 12.14.2013  23:50
10 8 wil
// $Type        : GPLv2
11 7 wil
//
12
// Contents:
13
//
14
//*****************************************************************************************
15
//TH-RevisionStart
16
//TH-RevisionEnd
17
18
19
Use cComCodeMax.pkg
20 14 wil
Use cImageList32.pkg
21
Use RGB.pkg
22
Use cOSVersionInfo.pkg
23
//Use cComCDACTreeListCtl.pkg
24 7 wil
25 14 wil
Define CS_LNG_VDF for "Visual DataFlex"
26
Define CS_DAW_KEY for "Data Access Worldwide"
27
Define CS_DAW_VDF for "Visual DataFlex"
28
Define CS_DAW_DF  for "DataFlex"
29 42 wil
Define CS_TAB     for (Character(9))
30 7 wil
31 12 wil
32 14 wil
Define ICO_Brkp_obj     for $CI01 // breakpoint object icon
33
Define ICO_Inst_ptr     for $CI02 // instruction pointer icon
34
Define ICO_Inst_ptr_top for $CI04 // instruction pointer top icon
35
36
Class cCodeMaxImageList is a cImageList32
37
38
  Procedure Construct_Object
39
    Forward Send Construct_Object
40
41
    Set piMaxImages To 5
42
    Set piImageHeight To 16
43
    Set piImageWidth  To 16
44
  End_Procedure // Construct_Object
45
46
  Procedure OnCreate
47
    Integer iVoid
48
49
    Get AddImage "brkp_obj.ico"     To iVoid // bit 1 // seems the first image is ignored as a margin image
50 64 wil
    Get AddImage "inst_ptr_top.ico" To iVoid // bit 2
51 24 wil
    Get AddImage "brkp_obj.ico"     To iVoid // bit 3
52 64 wil
    Get AddImage "inst_ptr.ico"     To iVoid // bit 4
53 14 wil
  End_Procedure
54
End_Class
55
56
57 7 wil
Class cSplatCodeMax is a cComCodeMax
58
  Procedure Construct_Object
59
    Forward Send Construct_Object
60
    Property String  psFileName     ""
61
    Property Integer piCurrentLine  0
62 14 wil
63
    Object oCodeMaxImages is a cCodeMaxImageList
64
    End_Object
65
  End_Procedure
66
67
  Function HostOSis64Bits Returns Boolean
68
    Handle  hoVersionInfo
69
    Boolean bIs64Bits
70
71
    Move false to bIs64Bits
72
    Get Create U_cOSVersionInfo To hoVersionInfo
73
    If (hoVersionInfo) Begin
74
      Get pbX64  Of hoVersionInfo To bIs64Bits
75
    End
76
77
    Function_Return bIs64Bits
78
  End_Function // HostOSis64Bits
79 8 wil
80 14 wil
  // Returns compiled runtime version as DataFlex version * 10
81
  Function CompiledRuntimeVersion Returns Integer
82
    String  sVersion
83
    Integer iVersion
84
    Move (Replace(".",gsRuntimeVersion,"")) To sVersion
85
    Move (Cast(sVersion,integer)) To iVersion
86
    Function_Return iVersion
87
  End_Function
88
89
  //
90 12 wil
  // Runtime folder that is used for compiling the current version of Splat.
91
  // This helps us in getting the required parameters
92
  //
93
  Function CurrentRuntimeFolder Returns String
94 14 wil
    Boolean bOpened
95 12 wil
    Boolean bExists
96
    Handle  hoRegistry
97
    String  sKey
98
    String  sPath
99 14 wil
    Integer iVersion
100 12 wil
101 14 wil
    Move "" To sPath
102 12 wil
    Get Create U_cRegistry to hoRegistry
103
104
    If (hoRegistry) Begin
105
      Set phRootKey of hoRegistry to HKEY_LOCAL_MACHINE
106
      Set pfAccessRights of hoRegistry to Key_Read
107 8 wil
108 12 wil
      // check if this is a 64 bit machine
109 14 wil
      // if so, the Wow6432Node key will exist <- unreliable test as it turns out
110
      //Get KeyExists of hoRegistry "SOFTWARE\Wow6432Node" to bExists
111
      Get HostOSis64Bits To bExists
112 12 wil
      If bExists Begin
113
          Move (Append("SOFTWARE\Wow6432Node\", CS_DAW_KEY)) to sKey
114
      End
115
      Else Begin
116
          Move (Append("SOFTWARE\", CS_DAW_KEY)) to sKey
117
      End
118
119
      Get KeyExists of hoRegistry sKey to bExists
120 14 wil
      If bExists Begin
121
          Get CompiledRuntimeVersion To iVersion
122
          If (iVersion<180) Begin
123
            Move (sKey+"\"+CS_DAW_VDF+"\"+gsRuntimeVersion+"\Defaults\") To sKey
124
          End
125
          Else Begin
126
            Move (sKey+"\"+ CS_DAW_DF+"\"+gsRuntimeVersion+"\Defaults\") To sKey
127
          End
128 12 wil
          Get OpenKey of hoRegistry sKey to bOpened
129
          If bOpened Begin
130
            Get ReadString of hoRegistry "VDFRootDir" To sPath
131
132
            Send CloseKey of hoRegistry
133
          End
134
      End
135
136
      Send Destroy of hoRegistry
137 14 wil
    End
138 12 wil
139
140
    Function_Return sPath
141 14 wil
  End_Function // CurrentRuntimeFolder
142 12 wil
143
  Procedure LoadVDFLanguageDefinition
144
    Boolean bCreated
145
    Boolean bExists
146
    String  sRootDir
147
    String  sLibDir
148
    String  sLanguageFile
149 14 wil
    Integer iVersion
150
    Handle  hoLanguage
151 12 wil
    Variant vLanguage
152
153
    Get Create U_cComlanguage To hoLanguage
154
    If (hoLanguage) Begin
155 14 wil
      Send CreateComObject of hoLanguage
156 12 wil
      Get IsComObjectCreated Of hoLanguage To bCreated
157 14 wil
      If (bCreated) Begin
158 12 wil
        Get CurrentRuntimeFolder to sRootDir
159
        If (sRootDir<>"") Begin
160
          Get vFolderFormat sRootDir To sRootDir
161
          Move (sRootDir+"Lib\") To sLibDir
162 14 wil
163
          Get CompiledRuntimeVersion to iVersion
164
          If (iVersion<180) Begin
165
            Move (sLibDir+"VisualDataFlex.lng") To sLanguageFile
166
          End
167
          Else Begin
168
            Move (sLibDir+"DataFlex.lng") To sLanguageFile
169
          End
170 12 wil
          Get vFilePathExists sLanguageFile to bExists
171
          If (bExists) Begin
172 14 wil
            Send ComLoadXmlDefinition of hoLanguage sLanguageFile
173 12 wil
            Set ComName of hoLanguage To CS_LNG_VDF
174 14 wil
            Send ComRegister of hoLanguage
175 12 wil
176
            Get pvComObject of hoLanguage To vLanguage
177
            Set ComLanguage To vLanguage
178
179
            Send Destroy of hoLanguage
180
          End
181
          Else Begin
182
            Send Info_Box ("Can't load language for runtime"*gsRuntimeVersion*"Couldn't find language file\n"*sLanguageFile)
183 14 wil
          End
184 12 wil
        End
185
        Else Begin
186
          Send Info_Box ("Can't load language as unable to determine runtime folder for VDF"*gsRuntimeVersion)
187 14 wil
        End
188 12 wil
      End
189 14 wil
    End
190 12 wil
  End_Procedure // LoadVDFLanguageDefinition
191 20 wil
192 46 wil
  //
193
  // Returns line numbers starting from line 0 (not line 1)
194
  // Columns numbers are also zero based
195
  //
196 20 wil
  Function CurrentPosition Variant vPos Integer Byref iLine Integer Byref iColumn Returns Boolean
197
    Boolean bOK
198
    Handle  hoPos
199
200
    Move false To bOK
201
    Get Create (RefClass(cComPosition)) To hoPos
202
    If (hoPos) Begin
203
      Set pvComObject of hoPos to vPos
204
      Get ComLineNo of hoPos To iLine
205
      Get ComColNo  of hoPos To iColumn
206
      Send Destroy of hoPos
207
      Move True To bOk
208
    End
209
    Function_Return bOK
210
  End_Function
211
212
  Function CurrentLine Returns Integer
213
    Boolean bOK
214
    Integer iOffset
215
    Integer llLine
216
    Integer llColumn
217
    Integer iLine
218
    Variant vPos
219
220
    Move 0 To iLine
221
    Get ComSelStart to iOffset
222
    //Get ComSelEnd to llColumn
223
    Get ComOffsetToPos iOffset to vPos
224
    //Get ComGetSel False to vSel
225
    Get CurrentPosition vPos (&llLine) (&llColumn) To bOK
226
    If (bOK) Begin
227 46 wil
      Move (llLine+1) To iLine  // +1 because line number returned is zero based.
228 20 wil
    End
229 49 wil
    If (llLine=0 and piCurrentLine(Self)<>0) Begin
230 27 wil
      // .. not great ..
231
      // if file was opened via stack and this window does not yet have the focus by clicking
232
      // into the file, it will return line 0, as a result setting a breakpoint isn't reliable
233
      // so... we use this ugly workaround.
234
      Get piCurrentLine To iLine
235
    End
236 20 wil
    Function_Return iLine
237
  End_Function
238 27 wil
239 42 wil
  Function WordAtPositionDoesNotWork Integer iLine Integer iColumn Returns String
240 27 wil
    String  sWord
241
    String  sLeadingChar
242
    String  sTrailingChar
243 42 wil
    Handle  hoPos
244
    Variant vPos
245
246
    Get Create (RefClass(cComPosition)) to hoPos
247
    If (hoPos) Begin
248
      Send CreateComObject to hoPos
249
      Set ComLineNo   of hoPos to iLine
250
      Set ComColNo    of hoPos to iColumn
251
      Get pvComObject of hoPos to vPos
252
      Move " (=+-*"  to sLeadingChar
253
      Move " ()=+-*" to sTrailingChar
254
      // Won't work ComGetWordEx does not stop on any of the above characters
255
      Get ComGetWordEx vPos sLeadingChar sTrailingChar to sWord
256
      Send Destroy of hoPos
257
    End
258
    Function_Return sWord
259
  End_Function
260
261
  Function WordAtLinePosition String sLine Integer iColumn Returns String
262
    String  sWord
263
    String  sLeadingChar
264
    String  sTrailingChar
265 27 wil
    String  sChar
266
    Integer iChar
267
    Integer iStart
268
    Integer iEnd
269
    Integer iLength
270
    Boolean bStop
271
272 42 wil
    Move (CS_TAB+" (=+-*")   To sLeadingChar
273
    Move (CS_TAB+" ()=+-*")  to sTrailingChar
274
275
    Move False to bStop
276
    Move iColumn to iChar
277 27 wil
    if (iColumn>0) begin
278
      While not bStop
279
        Move (Mid(sLine,1,iChar)) To sChar
280
        If (iChar<=0 or sLeadingChar contains sChar) begin
281
          Move True To bStop
282
          Move (iChar+1) To iStart
283
        End
284
        Decrement iChar
285
      Loop
286
    End
287
    Move (length(sLine)) To iLength
288
    For iChar from iColumn To iLength
289
      Move (Mid(sLine,1,iChar)) To sChar
290
      If (sTrailingChar contains sChar) begin
291
        Move (iChar-1) to iEnd
292
        Move iLength To iChar
293
      End
294
    Loop
295
    If (iEnd=0) Move iLength To iEnd
296
    Move (Mid(sLine,iEnd-iStart+1,iStart)) To sWord
297
    Function_Return sWord
298
  End_Function
299
300 46 wil
  // Returns the word under the specified location.
301
  // iLine and iColumn are zero based
302
  //
303 42 wil
  Function WordAtPosition Integer iLine Integer iColumn Returns String
304
    String  sWord
305
    String  sComment
306
    String  sLeadingChar
307
    String  sTrailingChar
308
    String  sChar
309
    String  sLine
310
    Integer iCommentPos
311
    Integer iChar
312
    Boolean bBeforeLine
313
314
    Get ComGetLine iLine To sLine
315
    Move "//" to sComment
316
    Move (Pos(sComment,sLine)) To iCommentPos
317
    If (iCommentPos>0 and iCommentPos<iColumn and iColumn>0) Begin
318
      Function_Return "" // caret is in a comment block
319
    End
320
    Move " (=+-*"   to sLeadingChar
321
    Move " ()=+-*"  to sTrailingChar
322
    Move True to bBeforeLine // test if caret is before any words on the line
323
    For iChar from 1 to iColumn
324
      Move (Mid(sLine,1,iChar)) to sChar
325
      If not ( (sLeadingChar+sTrailingChar) contains sChar ) Begin
326
        Move False to bBeforeLine
327
        Move iColumn to iChar
328
      End
329
    Loop
330
    If (bBeforeLine) Begin
331
      Function_Return "" // before any words
332
    End
333
    Get WordAtLinePosition sLine iColumn To sWord
334
    Function_Return sWord
335
  End_Function
336
337
  //
338
  // A bunch of parsing problems happen because we don't know how many
339
  // white space characters exist. This replaces multiple WS characters to just
340
  // one space character.
341
  //
342
  Function SingleWhiteSpaceLine String sLine Returns String
343
    Integer iLength
344
    Integer iChar
345
    Boolean bPrevWSChar
346
    String  sChar
347
    String  sSWSLine
348
    String  sWSChars
349
350
    Move "" To sSWSLine
351
    Move (CS_TAB+" ") To sWSChars
352
    Move (length(sLine)) To iLength
353
    Move False To bPrevWSChar
354
    For iChar From 1 To iLength
355
      Move (Mid(sLine,1,iChar)) to sChar
356
      If (sWSChars contains sChar) begin
357
        If (bPrevWSChar=false) Begin
358
          Move True To bPrevWSChar
359
          Move (sSWSLine+" ") To sSWSLine
360
        End
361
      End
362
      Else Begin
363
        Move False To bPrevWSChar
364
        Move (sSWSLine+sChar) To sSWSLine
365
      End
366
    Loop
367
    Function_Return sSWSLine
368
  End_Function
369
370
  //
371
  // Tries to locate the object (or variable) in a notation like
372
  // Get Property Of oObject To
373
  // which should return oObject
374
  //
375
  Function IsPropertyOf String sProperty Integer iline Integer iColumn Returns String
376
    Integer iPos
377
    Integer iLength
378
    Integer iObj
379
    String  sObject
380
    String  sLine
381
    String  sXLine
382
    String  slLine
383
384
    Move "" To sObject
385
    Get ComGetLine iLine To sLine
386
    If (sLine<>"") Begin
387
      Get SingleWhiteSpaceLine sLine To sXLine
388
      Move (lowercase(sXLine)) To slLine
389
      Move (Pos(lowercase(sProperty)+" of ",slLine)) To iPos
390
      If (iPos) Begin
391
        Move (Length(sProperty+" of ")) To iLength
392
        Move (iPos+iLength+1) To iObj
393
        Get WordAtLinePosition sXline iObj To sObject
394
      End
395
396
    End
397
    Function_Return sObject
398
  End_Function
399
400
  //
401
  // Properties that are queried which are not local to the focused object will need to
402
  // be referenced in order to get the correct data back.
403
  // This code will try to parse out the object.
404
  //
405 27 wil
  Function ObjectForProperty String sProperty Integer iLine Integer iColumn Returns String
406
    String sObject
407 42 wil
    String sOfObject
408 27 wil
    String sLine
409
410
    Move "Self" To sObject  // the default target object is self
411 42 wil
    Get IsPropertyOf sProperty iLine iColumn To sOfObject
412
    If (sOfObject<>"") Begin
413
      Move sOfObject To sObject
414
    End
415 27 wil
    Function_Return sObject
416
  End_Function
417 12 wil
418 27 wil
  Procedure OnComQuickInfo Integer llLine Integer llColumn String ByRef llTipText
419
    Handle  hoDebugger
420
    String  sWord
421
    String  sResult
422
    String  sObjectID
423
    String  sObjectName
424
    String  sType
425
    String  sTargetObject
426
    Boolean bIsProperty
427 42 wil
    Boolean bIsProcedure
428 27 wil
    Boolean bIsObject
429 64 wil
    Boolean bIsKeyword
430
    Boolean bPaused
431 27 wil
    Boolean bOK
432
433
    // Does not always return what we need
434
    //Get ComCurrentWord To sWord  // gets word under cursor
435 42 wil
    Move False To bOk
436 27 wil
    Get WordAtPosition llLine llColumn To sWord
437
    If (sWord<>"") Begin
438
      Get phoDebugger To hoDebugger
439
      If (hoDebugger) Begin
440
        Move ""    To sResult
441
        Move ""    To sType
442
        Move False To bIsObject
443 64 wil
        Get pbProgramPaused    Of hoDebugger To bPaused
444
        If (bPaused) Begin
445
          Get IsLanguageKeyword of hoDebugger sWord To bIsKeyword //
446
          If (bIsKeyword=false) Begin
447
            Get IsVariableProperty of hoDebugger sWord To bIsProperty
448
            If (bIsProperty) Begin
449
              Get ObjectForProperty sWord llLine llColumn to sTargetObject
450
              Move (sWord+"("+sTargetObject+")") To sWord
451
              Move "Property " To sType
452 42 wil
            End
453 64 wil
            Else Begin
454
              Get IsVariableProcedure Of hoDebugger sWord To bIsProcedure
455
              If (bIsProcedure) Begin
456
                Move "Procedure " To sType
457
              End
458
              Else Begin
459
                If (lowercase(sWord)="self") Begin
460
                  Move "Object " To sType
461
                  Move True     To bIsObject
462
                End
463
              End
464
            End
465
            Move ("Evaluating "+sType+"'"+sWord+"' results in"+character(10)) To llTipText
466
            If (bIsProcedure) Begin
467
              Move "Not evaluating methods." To sResult
468
            End
469
            Else Begin
470
              Get ComEval of hoDebugger sWord (&sResult) to bOK
471
            End
472 27 wil
            If (bOK) Begin
473 64 wil
              If (bIsObject) Begin
474
                Move sResult To sObjectID
475
                Move ""      To sObjectName
476
                Get ComEval of hoDebugger ("name("+sObjectID+")") (&sObjectName) to bOK
477
                If (bOK) Begin
478
                  Move (sResult+" ("+sObjectName+") ") To sResult
479
                End
480
              End
481
              Move (sResult+character(10)+character(10)+"Eval OK") To sResult
482 27 wil
            End
483 64 wil
            Else Begin
484
              Move (sResult+character(10)+character(10)+"Eval Failed") To sResult
485
            End
486 27 wil
          End
487 64 wil
          Else Begin
488
            Move ("Keyword "+sWord) To sResult
489
          End
490 27 wil
        End
491
        Else Begin
492 64 wil
          Move sWord To sResult
493 27 wil
        End
494 46 wil
        Move (sResult+", line="+trim(llLine+1)*", column="+Trim(llColumn+1)) To sResult
495 27 wil
      End
496
      Else Begin
497
        Move "Unable to attach to debugger core" To sResult
498
      End
499
    End
500
    Move (llTipText+sResult) To llTipText
501
  End_Procedure
502 12 wil
503 27 wil
504 12 wil
  Procedure OnCreate
505 20 wil
    Handle  hWnd
506
    Handle  hWndImg
507
    Handle  hoImgList
508 12 wil
    Variant vImageList
509
//    Boolean bCreated
510
511
    Forward Send OnCreate
512
513
    // ToDo: Set the ActiveX properties here...
514 20 wil
    // ComImageListRef
515
    // ComHImageList // line margin images
516
    //Set ComHImageList  To (oEditImages(Self))//vImageList
517
518 12 wil
    Send LoadVDFLanguageDefinition
519 20 wil
    //
520
    Set ComDisplayLeftMargin To True
521
    Send ComSetColor OLEcmClrLeftMargin clLtGray
522
    Set ComBorderStyle To OLEcmBorderClient
523
524
    //Get Window_Handle of oCodeMaxImages To hWnd
525
    Get phImageList Of oCodeMaxImages To hWndImg
526
    //Move (oCodeMaxImages(Self)) To hoImgList
527
    Set ComHImageList  To hWndImg  //vImageList
528
    //Set ComImageListRef To hWndImg
529 12 wil
  End_Procedure
530 8 wil
531 24 wil
  Procedure UpdateStatusHelp
532
    Integer Fg
533
    Move 1 To Fg
534
    Send Request_Status_Help Fg
535
  End_Procedure
536 12 wil
537 24 wil
  // update status bar when cursor is moving
538
  Procedure onCaretPosChanged
539
    Send UpdateStatusHelp
540
  End_Procedure
541
542
  // The caret position changed
543
  Procedure OnComSelChange
544
    Send onCaretPosChanged
545
    Forward Send OnComSelChange
546
  End_Procedure
547
548
549
550 8 wil
  Procedure doOpenSourceFile String sFileName
551
    String sLanguage
552
    Variant vLanguage
553
554 38 wil
    Send ComOpenFile  sFileName
555 14 wil
556 8 wil
    Set psFilename    To sFileName
557 14 wil
558 8 wil
    Set ComReadOnly To True // NO changes allowed
559
    Set ComColorSyntax To True
560
561
    // Update view hosting our control
562 38 wil
    //Send doSetCaptionLabel sFileName
563
  End_Procedure // doOpenSourceFile
564 8 wil
565
  Procedure doOpenSourceFileAtLine String sFileName Integer iLine
566 20 wil
    Integer eBkLineColor
567 64 wil
    Integer iTopMostLine
568 8 wil
    Boolean bVisible
569
    Boolean bScrollup
570
571
    Move false to bScrollup
572 20 wil
    Send doOpenSourceFile sFileName
573 64 wil
    Set piCurrentLine to iLine
574
    Move iLine to iTopMostLine
575
    If (iLine>5) Begin
576
      Move (iLine-4) to iTopMostLine // scroll up a bit so we can see context
577 8 wil
      Move true to bScrollup
578 20 wil
    End
579 64 wil
    Send ComSetTopIndex 0 iTopMostLine
580
    If (iLine>=0) Begin
581
        Send ComSetMarginImages (iLine-1) ICO_Inst_ptr //ICO_Brkp_obj// 2
582
        //Set psFilename     of oCodeMax To sFileName
583
        // Make it visible to the user where we are
584
        //Move True to bVisible
585
        //Send ComSelectLine of oCodeMax iLine bVisible
586
        Move (RGB(223,253,193)) to eBkLineColor
587
        Send ComSetLineColor (iLine-1) eBkLineColor //clYellow
588
    End
589 8 wil
590 24 wil
    Send UpdateStatusHelp
591
592 20 wil
//    Send ComSetLineColor iLine clRed
593 38 wil
  End_Procedure // doOpenSourceFileAtLine
594 8 wil
595 38 wil
End_Class