source: dev/trunk/abdev/BasicCompiler_Common/VarList.cpp @ 393

Last change on this file since 393 was 393, checked in by dai_9181, 16 years ago

デバッガ変数リストのローカル変数のスコープ判定が間違っていたため、修正。

File size: 39.5 KB
Line 
1#include "stdafx.h"
2
3#include <jenga/include/smoothie/Smoothie.h>
4
5#include <Compiler.h>
6
7#include "../BasicCompiler_Common/common.h"
8
9//デバッグ用
10#include "../BasicCompiler_Common/debug.h"
11
12//変数リストのツリーハンドル
13HWND hVarTree_Global,hVarTree_Local,hVarTree_This;
14
15int VarList_Array(HWND hVarTree,HTREEITEM hParent,LONG_PTR offset,const Type &type,const Subscripts &subscripts);
16void VarList_Member(HWND hVarTree,HTREEITEM hParent,LONG_PTR pTopOffset,const CClass &objClass,BOOL bPtr);
17void VarList_Insert(HWND hVarTree,TV_INSERTSTRUCT *lptv,const char *VarName,const Type &type,LONG_PTR offset){
18    extern HANDLE hDebugProcess;
19    int i2;
20    char temporary[255],temp2[255];
21    LONG_PTR pData;
22    SIZE_T accessBytes;
23    double dbl;
24    float flt;
25    WORD wData;
26    BYTE byteData;
27    HTREEITEM hParent;
28    _int64 i64data;
29
30    if( type.IsObject() || type.IsStruct() ){
31        i2=1;
32        if( type.IsObject() ){
33            // 参照型ということを考慮する
34            i2=ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&accessBytes);
35            offset = pData;
36        }
37
38        sprintf(lptv->item.pszText,"%s %s(&H%X)",VarName,STRING_OBJECT,(ULONG_PTR)offset);
39        lptv->item.iImage=1;
40        lptv->item.iSelectedImage=1;
41        hParent=TreeView_InsertItem(hVarTree,lptv);
42
43        if(i2 && offset) VarList_Member(hVarTree,hParent,offset,type.GetClass(),0);
44        return;
45    }
46    else if( type.IsObjectPtr() || type.IsStructPtr() ){
47        i2=ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&accessBytes);
48
49        sprintf(lptv->item.pszText,"%s %s(&H%X)",VarName,STRING_POINTEROFOBJECT,(ULONG_PTR)pData);
50        lptv->item.iImage=4;
51        lptv->item.iSelectedImage=4;
52        hParent=TreeView_InsertItem(hVarTree,lptv);
53
54        if(i2) VarList_Member(hVarTree,hParent,pData,type.GetClass(),1);
55        return;
56    }
57    else{
58        if(type.GetBasicType()==MAKE_PTR_TYPE(DEF_SBYTE,1)||type.GetBasicType()==MAKE_PTR_TYPE(DEF_BYTE,1)){
59            if(ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&accessBytes)){
60                for(i2=0;;i2++){
61                    if(!ReadProcessMemory(hDebugProcess,(void *)(pData+i2),&temporary[i2],1,&accessBytes)){
62                        i2=-1;
63                        break;
64                    }
65                    if(temporary[i2]=='\0') break;
66                    if(i2==64){
67                        lstrcpy(temporary+i2,"...");
68                        break;
69                    }
70                }
71                if(i2==-1) sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,(ULONG_PTR)pData,(ULONG_PTR)pData);
72                else sprintf(lptv->item.pszText,"%s %d(&H%X) \"%s\"",VarName,(ULONG_PTR)pData,(ULONG_PTR)pData,temporary);
73            }
74            else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
75        }
76        else if(type.IsDouble()){
77            if(ReadProcessMemory(hDebugProcess,(void *)offset,&dbl,sizeof(double),&accessBytes)){
78                sprintf(lptv->item.pszText,"%s %.15g",VarName,dbl);
79            }
80            else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
81        }
82        else if(type.IsSingle()){
83            if(ReadProcessMemory(hDebugProcess,(void *)offset,&flt,sizeof(float),&accessBytes)){
84                sprintf(lptv->item.pszText,"%s %.6g",VarName,flt);
85            }
86            else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
87        }
88        else if(type.IsInt64()){
89            _int64 i64data;
90            if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&accessBytes)){
91                _i64toa(i64data,temporary,10);
92                _i64toa(i64data,temp2,16);
93                CharUpper(temp2);
94                sprintf(lptv->item.pszText,"%s %s(&H%s)",VarName,temporary,temp2);
95            }
96            else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
97        }
98        else if(type.IsQWord()||(type.IsPointer()&&PTR_SIZE==sizeof(_int64))){
99            if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&accessBytes)){
100                _ui64toa(i64data,temporary,10);
101                _ui64toa(i64data,temp2,16);
102                CharUpper(temp2);
103                sprintf(lptv->item.pszText,"%s %s(&H%s)",VarName,temporary,temp2);
104            }
105            else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
106        }
107        else if(type.IsLong()){
108            long l;
109            if(ReadProcessMemory(hDebugProcess,(void *)offset,&l,sizeof(long),&accessBytes)){
110                sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,l,l);
111            }
112            else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
113        }
114        else if(type.IsDWord()||(type.IsPointer()&&PTR_SIZE==sizeof(long))){
115            if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&accessBytes)){
116                sprintf(lptv->item.pszText,"%s %u(&H%X)",VarName,(int)i64data,(int)i64data);
117            }
118            else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
119        }
120        else if(type.IsInteger()){
121            if(ReadProcessMemory(hDebugProcess,(void *)offset,&wData,sizeof(WORD),&accessBytes)){
122                sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,(short)wData,(short)wData);
123            }
124            else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
125        }
126        else if(type.IsWord()){
127            if(ReadProcessMemory(hDebugProcess,(void *)offset,&wData,sizeof(WORD),&accessBytes)){
128                sprintf(lptv->item.pszText,"%s %u(&H%X)",VarName,wData,wData);
129            }
130            else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
131        }
132        else if(type.IsSByte()){
133            if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&accessBytes)){
134                temporary[0]=byteData;
135                temporary[1]=0;
136                sprintf(lptv->item.pszText,"%s %d(&H%X)'%s'",VarName,(char)byteData,byteData,temporary);
137            }
138            else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
139        }
140        else if(type.IsByte()){
141            if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&accessBytes)){
142                temporary[0]=byteData;
143                temporary[1]=0;
144                sprintf(lptv->item.pszText,"%s %d(&H%X)'%s'",VarName,byteData,byteData,temporary);
145            }
146            else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
147        }
148        else if(type.IsBoolean()){
149            if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&accessBytes)){
150                if( byteData ) lstrcpy( temporary, "True" );
151                else lstrcpy( temporary, "False" );
152
153                wsprintf(lptv->item.pszText,"%s %s",VarName,temporary);
154            }
155            else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
156        }
157        lptv->item.iImage=2;
158        lptv->item.iSelectedImage=2;
159    }
160    TreeView_InsertItem(hVarTree,lptv);
161}
162void VarList_Member(HWND hVarTree,HTREEITEM hParent,LONG_PTR pTopOffset,const CClass &objClass,BOOL bPtr){
163    char VarData[VN_SIZE],VarName[VN_SIZE];
164    TV_INSERTSTRUCT tv;
165
166    memset(&tv,0,sizeof(TV_INSERTSTRUCT));
167    tv.hInsertAfter=TVI_LAST;
168    tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
169    tv.hParent=hParent;
170    tv.item.pszText=VarData;
171
172    BOOST_FOREACH( CMember *pMember, objClass.GetDynamicMembers() ){
173        if(bPtr){
174            lstrcpy(VarName,"->");
175            lstrcat(VarName,pMember->GetName().c_str());
176        }
177        else{
178            lstrcpy(VarName,".");
179            lstrcat(VarName,pMember->GetName().c_str());
180        }
181
182        LONG_PTR offset;
183        int i2;
184        offset=objClass.GetMemberOffset( pMember->GetName().c_str(), &i2 );
185
186        if( pMember->GetSubscripts().size() > 0 ){
187            //構造体内の配列
188            sprintf(VarData,"%s %s(&H%X)",VarName,STRING_ARRAY,pTopOffset+offset);
189            tv.item.iImage=0;
190            tv.item.iSelectedImage=0;
191            hParent=TreeView_InsertItem(hVarTree,&tv);
192
193            VarList_Array(
194                hVarTree,
195                hParent,
196                pTopOffset + offset,
197                pMember->GetType(),
198                pMember->GetSubscripts()
199            );
200        }
201        else{
202            //メンバ変数
203            VarList_Insert(hVarTree,
204                &tv,
205                VarName,
206                pMember->GetType(),
207                pTopOffset+offset);
208        }
209    }
210}
211int VarList_Array(HWND hVarTree,HTREEITEM hParent,LONG_PTR offset,const Type &type, const Subscripts &subscripts ){
212    int i,i2,i3,ElementNum,MemCounter,UseCount[255];
213    char temporary[VN_SIZE],temp2[DIGIT_SIZE];
214
215    TV_INSERTSTRUCT tv;
216    memset(&tv,0,sizeof(TV_INSERTSTRUCT));
217    tv.hInsertAfter=TVI_LAST;
218    tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
219    tv.hParent=hParent;
220    tv.item.pszText=temporary;
221
222    for(i=0;i<(int)subscripts.size();i++){
223        UseCount[i]=0;
224    }
225    UseCount[i]=-2;
226    MemCounter=0;
227    i--;
228    while(1){
229        UseCount[i]++;
230        for(ElementNum=0;subscripts[i-ElementNum]<UseCount[i-ElementNum];ElementNum++){
231            UseCount[i-ElementNum]=0;
232            if(i-ElementNum-1<0) return MemCounter;
233            UseCount[i-ElementNum-1]++;
234        }
235
236        if(MemCounter<50){
237            temporary[0]='[';
238            temporary[1]=0;
239            for(i2=0;i2<i;i2++){
240                sprintf(temp2,"%d",UseCount[i2]);
241                lstrcat(temporary,temp2);
242                lstrcat(temporary,",");
243            }
244            i3=lstrlen(temporary);
245            temporary[i3-1]=']';
246            temporary[i3]=0;
247
248            VarList_Insert(hVarTree,&tv,temporary,type,
249                offset+MemCounter*type.GetSize());
250        }
251
252        MemCounter++;
253        if(MemCounter==50){
254            lstrcpy(tv.item.pszText,"...");
255            TreeView_InsertItem(hVarTree,&tv);
256        }
257    }
258    return 0;
259}
260void RefreshGlobalVar(void){
261    extern DWORD ImageBase;
262    char temporary[VN_SIZE];
263    TV_INSERTSTRUCT tv;
264    HTREEITEM hParent;
265
266    TreeView_DeleteAllItems(hVarTree_Global);
267
268    memset(&tv,0,sizeof(TV_INSERTSTRUCT));
269    tv.hInsertAfter=TVI_LAST;
270    tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
271    tv.hParent=TVI_ROOT;
272    tv.item.pszText=temporary;
273
274    extern HANDLE hDebugProcess;
275    extern int MemPos_RWSection;
276
277    BOOST_FOREACH( Variable *pVar, compiler.GetObjectModule().meta.GetGlobalVars() ){
278
279        //スコープ外の場合は無視
280        if(pVar->GetScopeLevel()!=0){
281            if(rva_to_real(pVar->GetScopeStartAddress()) <= pobj_dti->lplpObp[0]  &&
282                pobj_dti->lplpObp[0] < rva_to_real(pVar->GetScopeEndAddress())){
283                //範囲内
284            }
285            else{
286                //範囲外
287                continue;
288            }
289        }
290
291
292        if(!pobj_nv->bShow_DefaultSystem_Var){
293            if(memcmp(pVar->GetName().c_str(),"_System_",8)==0||
294                memcmp(pVar->GetName().c_str(),"_DebugSys_",10)==0||
295                memcmp(pVar->GetName().c_str(),"_PromptSys_",11)==0) continue;
296        }
297        if(!pobj_nv->bShow_Rad_Var){
298            if(memcmp(pVar->GetName().c_str(),"_RadSys_",8)==0) continue;
299        }
300        if(!pobj_nv->bShow_GUID_Var){
301            if(memcmp(pVar->GetName().c_str(),"GUID_",5)==0||
302                memcmp(pVar->GetName().c_str(),"IID_",4)==0||
303                memcmp(pVar->GetName().c_str(),"CLSID_",6)==0) continue;
304        }
305
306        //静的メンバ
307        if(strstr(pVar->GetName().c_str(),".")) continue;
308
309        if(pVar->IsArray()){
310            sprintf(temporary,"%s %s(&H%X)",
311                pVar->GetName().c_str(),
312                STRING_ARRAY,
313                ImageBase+MemPos_RWSection+pVar->GetOffsetAddress());
314            tv.item.iImage=0;
315            tv.item.iSelectedImage=0;
316            hParent=TreeView_InsertItem(hVarTree_Global,&tv);
317
318            VarList_Array(
319                hVarTree_Global,
320                hParent,
321                (LONG_PTR)(ImageBase+MemPos_RWSection + pVar->GetOffsetAddress()),
322                pVar->GetType(),
323                pVar->GetSubscripts()
324            );
325        }
326        else{
327            VarList_Insert(hVarTree_Global,
328                &tv,
329                pVar->GetName().c_str(),
330                pVar->GetType(),
331                (LONG_PTR)(ImageBase+MemPos_RWSection+pVar->GetOffsetAddress()));
332        }
333    }
334}
335void RefreshLocalVar(void){
336    int i2;
337    char temporary[VN_SIZE];
338    TV_INSERTSTRUCT tv;
339    HTREEITEM hParent;
340    LONG_PTR offset;
341    SIZE_T accessBytes;
342    LONG_PTR lpData;
343
344    TreeView_DeleteAllItems(hVarTree_Local);
345
346    memset(&tv,0,sizeof(TV_INSERTSTRUCT));
347    tv.hInsertAfter=TVI_LAST;
348    tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
349    tv.hParent=TVI_ROOT;
350    tv.item.pszText=temporary;
351
352    extern HANDLE hDebugProcess;
353    extern HWND hDebugWnd;
354    i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
355    i2=pobj_dti->iProcLevel-i2;
356
357    if(pobj_dti->lplpSpBase[i2]==0) return;
358
359    UserProc *pUserProc = NULL;
360    compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset();
361    while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() )
362    {
363        pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext();
364        if(rva_to_real(pUserProc->GetBeginOpAddress()) <= pobj_dti->lplpObp[i2]  &&
365            pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->GetEndOpAddress())){
366            break;
367        }
368    }
369    if(!pUserProc) return;
370
371    BOOST_FOREACH( Variable *pVar, pUserProc->GetLocalVars() ){
372
373        //スコープ外の場合は無視
374        int scopeBeginAddressRva = pUserProc->GetBeginOpAddress() + pVar->GetScopeStartAddress();
375        int scopeEndAddressRva = pUserProc->GetBeginOpAddress() + pVar->GetScopeEndAddress();
376        if(pVar->GetScopeLevel()!=0)
377        {
378            if( rva_to_real( scopeBeginAddressRva ) <= pobj_dti->lplpObp[i2]
379                && pobj_dti->lplpObp[i2] < rva_to_real( scopeEndAddressRva ) )
380            {
381                //範囲内
382            }
383            else{
384                //範囲外
385                continue;
386            }
387        }
388
389        if(pVar->IsArray()){
390            sprintf(temporary,"%s %s(&H%X)",
391                pVar->GetName().c_str(),
392                STRING_ARRAY,
393                pobj_dti->lplpSpBase[i2]+pVar->GetOffsetAddress());
394            tv.item.iImage=0;
395            tv.item.iSelectedImage=0;
396            hParent=TreeView_InsertItem(hVarTree_Local,&tv);
397
398            VarList_Array(
399                hVarTree_Local,
400                hParent,
401                pobj_dti->lplpSpBase[i2] + pVar->GetOffsetAddress(),
402                pVar->GetType(),
403                pVar->GetSubscripts()
404            );
405        }
406        else{
407            offset=pobj_dti->lplpSpBase[i2]+pVar->GetOffsetAddress();
408            if(pVar->IsRef()){
409                ReadProcessMemory(hDebugProcess,(void *)offset,&lpData,sizeof(LONG_PTR),&accessBytes);
410                offset=lpData;
411            }
412            VarList_Insert(hVarTree_Local,&tv,
413                pVar->GetName().c_str(),
414                pVar->GetType(),
415                offset);
416        }
417    }
418
419
420
421    /////////////////////////////
422    // Thisオブジェクトのリスト
423    /////////////////////////////
424
425    TreeView_DeleteAllItems(hVarTree_This);
426    if( pUserProc->IsGlobalProcedure() ) return;
427
428    //Thisポインタを取得
429    LONG_PTR pThis;
430    const Variable *pVar = pUserProc->GetLocalVars().Find( Symbol( "_System_LocalThis" ) );
431    if( !pVar ){
432        return;
433    }
434    lpData=pobj_dti->lplpSpBase[i2]+pVar->GetOffsetAddress();
435    ReadProcessMemory(hDebugProcess,(void *)lpData,&pThis,sizeof(LONG_PTR),&accessBytes);
436
437    BOOST_FOREACH( CMember *pMember, pUserProc->GetParentClassPtr()->GetDynamicMembers() ){
438        offset=pUserProc->GetParentClassPtr()->GetMemberOffset( pMember->GetName().c_str(),&i2);
439
440        if( pMember->GetSubscripts().size() > 0 ){
441            //配列
442            sprintf(temporary,"%s %s(&H%X)",
443                pMember->GetName().c_str(),
444                STRING_ARRAY,
445                (ULONG_PTR)offset);
446            tv.item.iImage=0;
447            tv.item.iSelectedImage=0;
448            hParent=TreeView_InsertItem(hVarTree_This,&tv);
449
450            VarList_Array(
451                hVarTree_This,
452                hParent,
453                pThis + offset,
454                pMember->GetType(),
455                pMember->GetSubscripts()
456            );
457        }
458        else{
459            VarList_Insert(hVarTree_This,&tv,
460                pMember->GetName().c_str(),
461                pMember->GetType(),
462                pThis+offset);
463        }
464    }
465}
466void RefreshGlobalVar_with_WindowLock(void){
467    extern HWND hDebugWnd;
468
469    //処理時間を短くするため、一時的に非表示にする
470    LockWindowUpdate(hDebugWnd);
471    ShowWindow(GetParent(hVarTree_Global),SW_HIDE);
472
473    //リフレッシュ
474    RefreshGlobalVar();
475
476    LockWindowUpdate(NULL);
477    ShowWindow(GetParent(hVarTree_Global),SW_SHOW);
478}
479void RefreshLocalVar_with_WindowLock(void){
480    extern HWND hDebugWnd;
481
482    //処理時間を短くするため、一時的に非表示にする
483    LockWindowUpdate(hDebugWnd);
484    ShowWindow(GetParent(hVarTree_Local),SW_HIDE);
485
486    //リフレッシュ
487    RefreshLocalVar();
488
489    LockWindowUpdate(NULL);
490    ShowWindow(GetParent(hVarTree_Local),SW_SHOW);
491}
492
493void SetCalcToWatchList(HWND hListView,int iItem,char *buffer){
494    char temporary[255],temp2[255];
495
496    //エスケープシーケンスをセット
497    SetEscapeSequenceFormat(buffer);
498
499    KillStringSpaces(buffer);
500
501    //カッコを相互チェック
502    if(!CheckParenthesis2(buffer)){
503       
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521        ListView_SetItemText(hListView,iItem,1,"式の解析に失敗");
522        return;
523    }
524
525    double dbl;
526    _int64 i64data;
527    Type resultType;
528    bool isMemoryAccessError;
529    if( !StaticCalculation(true, buffer,0,&i64data,resultType,1,&isMemoryAccessError) ){
530        ListView_SetItemText(hListView,iItem,1,"式の解析に失敗");
531    }
532    else if(isMemoryAccessError){
533        ListView_SetItemText(hListView,iItem,1,"アクセスできません");
534    }
535    else{
536        if(resultType.IsReal()){
537            memcpy(&dbl,&i64data,sizeof(double));
538            sprintf(temporary,"%.15g (&H%08X)",dbl,(int)dbl);
539        }
540        else if(resultType.Is64()){
541            _i64toa(i64data,temporary,10);
542            _i64toa(i64data,temp2,16);
543            CharUpper(temp2);
544            sprintf(temporary+lstrlen(temporary)," (&H%s)",temp2);
545        }
546        else sprintf(temporary,"%d (&H%08X)",(long)i64data,(long)i64data);
547
548        ListView_SetItemText(hListView,iItem,1,temporary);
549    }
550}
551void RefreshWatchList(void){
552    extern HWND hDebugWnd;
553    HWND hListView;
554    int i,i2;
555    char temporary[VN_SIZE];
556
557    hListView=GetDlgItem(hDebugWnd,IDC_WATCHLIST);
558    i2=ListView_GetItemCount(hListView);
559    for(i=0;i<i2-1;i++){
560        ListView_GetItemText(hListView,i,0,temporary,VN_SIZE);
561
562        //演算結果を表示
563        SetCalcToWatchList(hListView,i,temporary);
564    }
565}
566
567BOOL SetDebugProcCombo(HWND hProcCombo){
568    int i2,i3;
569    char temporary[255];
570
571    extern DWORD ImageBase;
572    extern int MemPos_CodeSection;
573
574    //行番号情報
575    extern SourceLines oldSourceLines;
576    for(i3=0;i3<(int)pobj_dti->iProcLevel+1;i3++){
577        for(i2=0;i2<(int)oldSourceLines.size()-2;i2++){
578            if((ULONG_PTR)(oldSourceLines[i2].GetNativeCodePos()+ImageBase+MemPos_CodeSection)<=pobj_dti->lplpObp[i3]&&
579                pobj_dti->lplpObp[i3]<=(ULONG_PTR)(oldSourceLines[i2+1].GetNativeCodePos()+ImageBase+MemPos_CodeSection)) break;
580        }
581        if(i2==oldSourceLines.size()-1) pobj_dti->lpdwCp[i3]=-1;
582        else
583        {
584            pobj_dti->lpdwCp[i3]=oldSourceLines[i2].GetSourceCodePos();
585            pobj_dti->lpdwSourceIndex[i3]=oldSourceLines[i2].GetSourceIndex();
586        }
587    }
588    for(i3=0;i3<(int)pobj_dti->iProcLevel+1;i3++){
589        if(pobj_dti->lpdwCp[i3]==-1){
590            pobj_dti->iProcLevel--;
591            for(i2=i3;i2<(int)pobj_dti->iProcLevel+1;i2++){
592                pobj_dti->lplpObp[i2]=pobj_dti->lplpObp[i2+1];
593                pobj_dti->lplpSpBase[i2]=pobj_dti->lplpSpBase[i2+1];
594                pobj_dti->lpdwCp[i2]=pobj_dti->lpdwCp[i2+1];
595                pobj_dti->lpdwSourceIndex[i2]=pobj_dti->lpdwSourceIndex[i2+1];
596            }
597            i3--;
598            continue;
599        }
600    }
601
602    std::string dummyStr;
603    if(!compiler.GetObjectModule().GetSource( pobj_dti->lpdwSourceIndex[pobj_dti->iProcLevel] ).GetLineInfo( pobj_dti->lpdwCp[pobj_dti->iProcLevel], i2, dummyStr )){
604        extern HWND hMainDlg;
605        //"デバッグ情報の取得に失敗"
606        MessageBox(hMainDlg,STRING_DEBUG_FAILED,"ActiveBasic error",MB_OK);
607        return 0;
608    }
609    ShowErrorLine(i2,dummyStr.c_str());
610
611    //プロシージャ コンボボックス
612    SendMessage(hProcCombo,CB_RESETCONTENT,0,0);
613    for(i2=pobj_dti->iProcLevel;i2>=0;i2--){
614
615        UserProc *pUserProc = NULL;
616        compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset();
617        while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() )
618        {
619            pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext();
620
621            if(rva_to_real(pUserProc->GetBeginOpAddress()) <= pobj_dti->lplpObp[i2]  &&
622                pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->GetEndOpAddress()))
623            {
624                lstrcpy(temporary,pUserProc->GetName().c_str());
625                break;
626            }
627        }
628        if(!pUserProc){
629            if(i2==0){
630                lstrcpy(temporary,"Global");
631                pobj_dti->lplpSpBase[i2]=0;
632            }
633            else lstrcpy(temporary,"error");
634        }
635        SendMessage(hProcCombo,CB_ADDSTRING,0,(LPARAM)temporary);
636    }
637    SendMessage(hProcCombo,CB_SETCURSEL,0,0);
638
639    return pobj_dti->iProcLevel;
640}
641
642//IDC_THREADCOMBOプロシージャ
643LRESULT CALLBACK ThreadComboProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
644    extern WNDPROC OldThreadComboProc;
645    int i2;
646    DWORD dwThreadID;
647    char temporary[255];
648
649    switch(message){
650        case WM_COMMAND:
651            if(HIWORD(wParam)==CBN_SELCHANGE){
652                SendMessage(hwnd,CB_GETLBTEXT,SendMessage(hwnd,CB_GETCURSEL,0,0),(LPARAM)temporary);
653                sscanf(temporary+2,"%X",&dwThreadID);
654
655                extern DWORD _DebugSys_dwThreadID[256];
656                i2=0;
657                while(_DebugSys_dwThreadID[i2]!=dwThreadID) i2++;
658
659                //次回のステップ実行対象を指定
660                extern int NextStepThreadNum;
661                NextStepThreadNum=i2;
662
663                //スレッド情報をリフレッシュ
664                pobj_dti->Reflesh(i2);
665
666                SetDebugProcCombo(GetDlgItem(GetParent(hwnd),IDC_PROCCOMBO));
667
668                SendDlgItemMessage(GetParent(hwnd),IDC_PROCCOMBO,WM_COMMAND,MAKELONG(0,CBN_SELCHANGE),0);
669            }
670            break;
671    }
672    return CallWindowProc(OldThreadComboProc,hwnd,message,wParam,lParam);
673}
674//IDC_PROCCOMBOプロシージャ
675LRESULT CALLBACK ProcComboProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
676    extern WNDPROC OldProcComboProc;
677    int i2,i3;
678
679    switch(message){
680        case WM_COMMAND:
681            if(HIWORD(wParam)==CBN_SELCHANGE){
682                i2=(int)SendMessage(hwnd,CB_GETCURSEL,0,0);
683
684                std::string dummyStr;
685                compiler.GetObjectModule().GetSource( pobj_dti->lpdwSourceIndex[pobj_dti->iProcLevel] ).GetLineInfo( pobj_dti->lpdwCp[pobj_dti->iProcLevel-i2], i3, dummyStr );
686                ShowErrorLine(i3,dummyStr.c_str());
687
688                RefreshLocalVar_with_WindowLock();
689            }
690            break;
691    }
692    return CallWindowProc(OldProcComboProc,hwnd,message,wParam,lParam);
693}
694void InitVarList(DWORD dwThreadId){
695    extern HWND hDebugWnd;
696    int i2,i5;
697    char temporary[255];
698
699
700    //スレッド
701    SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_RESETCONTENT,0,0);
702    extern DWORD _DebugSys_dwThreadID[256];
703    for(i2=0;i2<256;i2++){
704        if(_DebugSys_dwThreadID[i2]){
705            sprintf(temporary,"&H%08X",_DebugSys_dwThreadID[i2]);
706            SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_ADDSTRING,0,(LPARAM)temporary);
707            if(_DebugSys_dwThreadID[i2]==dwThreadId){
708                extern int NextStepThreadNum;
709                NextStepThreadNum=i2;
710            }
711        }
712    }
713    sprintf(temporary,"&H%08X",dwThreadId);
714    i5=(int)SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_FINDSTRING,0,(LPARAM)temporary);
715    SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_SETCURSEL,i5,0);
716
717    i2=SetDebugProcCombo(GetDlgItem(hDebugWnd,IDC_PROCCOMBO));
718
719
720    ///////////////////////////////////////////////
721    // 実行中のプロシージャのローカル変数をセット
722    ///////////////////////////////////////////////
723
724    i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
725    i2=pobj_dti->iProcLevel-i2;
726
727    if(pobj_dti->lplpSpBase[i2]){
728
729        UserProc *pUserProc = NULL;
730        compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset();
731        while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() )
732        {
733            pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext();
734
735            if(rva_to_real(pUserProc->GetBeginOpAddress()) <= pobj_dti->lplpObp[i2]  &&
736                pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->GetEndOpAddress())){
737                break;
738            }
739        }
740
741        if(pUserProc){
742            compiler.pCompilingClass = pUserProc->GetParentClassPtr();
743            UserProc::CompileStartForUserProc( pUserProc );
744        }
745    }
746
747
748    ////////////////////////
749    // 変数リストを再表示
750    ////////////////////////
751
752    //処理時間を短くするため、一時的に非表示にする
753    LockWindowUpdate(hDebugWnd);
754    ShowWindow(GetParent(hVarTree_Global),SW_HIDE);
755    ShowWindow(GetDlgItem(hDebugWnd,IDC_WATCHLIST),SW_HIDE);
756
757    //リフレッシュ
758    RefreshLocalVar();
759    RefreshGlobalVar();
760    RefreshWatchList();
761
762    LockWindowUpdate(NULL);
763    ShowWindow(GetParent(hVarTree_Global),SW_SHOW);
764    ShowWindow(GetDlgItem(hDebugWnd,IDC_WATCHLIST),SW_SHOW);
765}
766
767
768
769
770//////////////////////////////////////
771// エディタに埋め込み表示のデバッガ
772//////////////////////////////////////
773
774BOOL CALLBACK DebuggerButtonsProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
775    extern HINSTANCE hInst;
776    extern DWORD dwStepRun;
777
778    //デバッガ用ツールバー
779#define BMPNUM_DEBUGGERTOOLBAR 3
780#define BTNNUM_DEBUGGERTOOLBAR 4
781    TBBUTTON DebuggerToolBar[]={
782        {0,IDC_DEBUG_START,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
783        {0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0},
784        {1,IDC_DEBUG_STEPOVER,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
785        {2,IDC_DEBUG_STEPIN,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
786    };
787    TOOLTIPTEXT *pTipText;
788
789    static HIMAGELIST hImageList,hImageList_Disabled;
790
791    switch(message){
792        case WM_INITDIALOG:
793            //ツールバーを生成
794            extern HWND hDebuggerToolbar;
795            hDebuggerToolbar=CreateToolbarEx(hwnd,WS_CHILD|WS_VISIBLE|CCS_NODIVIDER|TBSTYLE_FLAT|TBSTYLE_TOOLTIPS|WS_CLIPSIBLINGS,
796                NULL,
797                0,0,0,
798                DebuggerToolBar,
799                BTNNUM_DEBUGGERTOOLBAR, /*アイテムの個数*/
800                0,0,16,15,sizeof(TBBUTTON));
801
802            hImageList = ImageList_LoadImage(hInst, MAKEINTRESOURCE(IDR_DEBUGGERTOOLBAR),
803                16, 0, RGB(192,192,192),IMAGE_BITMAP, LR_CREATEDIBSECTION);
804            SendMessage(hDebuggerToolbar, TB_SETIMAGELIST, 0, (LPARAM)hImageList);
805            hImageList_Disabled = ImageList_LoadImage(hInst, MAKEINTRESOURCE(IDR_DEBUGGERTOOLBAR_DISABLED),
806                16, 0, RGB(192,192,192),IMAGE_BITMAP, LR_CREATEDIBSECTION);
807            SendMessage(hDebuggerToolbar, TB_SETDISABLEDIMAGELIST, 0, (LPARAM)hImageList_Disabled);
808
809            break;
810        case WM_COMMAND:
811            switch(LOWORD(wParam)){
812                case IDC_DEBUG_START:
813                    DestroyWindow(GetParent(hwnd));
814                    return 1;
815                case IDC_DEBUG_STEPIN:
816                    dwStepRun=1;
817                    return 1;
818                case IDC_DEBUG_STEPOVER:
819                    dwStepRun=2;
820                    return 1;
821            }
822            break;
823        case WM_NOTIFY:
824            pTipText=(TOOLTIPTEXT *)lParam;
825            if(pTipText->hdr.code==TTN_NEEDTEXT){
826                //ツールチップを表示
827                switch(pTipText->hdr.idFrom){
828                    case IDC_DEBUG_START:
829                        pTipText->lpszText="実行";
830                        break;
831                    case IDC_DEBUG_STEPOVER:
832                        pTipText->lpszText="ステップ アウト";
833                        break;
834                    case IDC_DEBUG_STEPIN:
835                        pTipText->lpszText="ステップ イン";
836                        break;
837                }
838            }
839            break;
840        case WM_SIZE:
841            MoveWindow(hDebuggerToolbar,0,0,LOWORD(lParam),HIWORD(lParam),1);
842            return 1;
843
844        case WM_DESTROY:
845            ImageList_Destroy(hImageList);
846            ImageList_Destroy(hImageList_Disabled);
847            return 1;
848    }
849    return 0;
850}
851
852WNDPROC OldTabProc;
853LRESULT CALLBACK TabProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
854    extern HINSTANCE hInst;
855
856    static HMENU hDummyMenu,hMenu=0;
857
858    switch(message){
859        case WM_CONTEXTMENU:
860            if(hMenu==0){
861                hDummyMenu=LoadMenu(hInst,MAKEINTRESOURCE(IDR_DEBUGGER_VARLIST_MENU));
862                hMenu=GetSubMenu(hDummyMenu,0);
863            }
864
865            MENUITEMINFO mi;
866            mi.cbSize=sizeof(MENUITEMINFO);
867            mi.fMask=MIIM_STATE;
868            mi.fState=MFS_CHECKED;
869
870            if(pobj_nv->bShow_DefaultSystem_Var)
871                SetMenuItemInfo(hMenu,IDM_SHOW_DEFAULTSYSTEM_VAR,0,&mi);
872            if(pobj_nv->bShow_Rad_Var)
873                SetMenuItemInfo(hMenu,IDM_SHOW_RAD_VAR,0,&mi);
874            if(pobj_nv->bShow_GUID_Var)
875                SetMenuItemInfo(hMenu,IDM_SHOW_GUID_VAR,0,&mi);
876
877            TrackPopupMenu(hMenu,TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
878
879            break;
880        case WM_COMMAND:
881            mi.cbSize=sizeof(MENUITEMINFO);
882            mi.fMask=MIIM_STATE;
883            switch(LOWORD(wParam)){
884                case IDM_SHOW_DEFAULTSYSTEM_VAR:
885                    if(pobj_nv->bShow_DefaultSystem_Var){
886                        pobj_nv->bShow_DefaultSystem_Var=0;
887                        mi.fState=MFS_UNCHECKED;
888                    }
889                    else{
890                        pobj_nv->bShow_DefaultSystem_Var=1;
891                        mi.fState=MFS_CHECKED;
892                    }
893                    SetMenuItemInfo(hMenu,IDM_SHOW_DEFAULTSYSTEM_VAR,0,&mi);
894                    RefreshGlobalVar_with_WindowLock();
895                    break;
896                case IDM_SHOW_RAD_VAR:
897                    if(pobj_nv->bShow_Rad_Var){
898                        pobj_nv->bShow_Rad_Var=0;
899                        mi.fState=MFS_UNCHECKED;
900                    }
901                    else{
902                        pobj_nv->bShow_Rad_Var=1;
903                        mi.fState=MFS_CHECKED;
904                    }
905                    SetMenuItemInfo(hMenu,IDM_SHOW_RAD_VAR,0,&mi);
906                    RefreshGlobalVar_with_WindowLock();
907                    break;
908                case IDM_SHOW_GUID_VAR:
909                    if(pobj_nv->bShow_GUID_Var){
910                        pobj_nv->bShow_GUID_Var=0;
911                        mi.fState=MFS_UNCHECKED;
912                    }
913                    else{
914                        pobj_nv->bShow_GUID_Var=1;
915                        mi.fState=MFS_CHECKED;
916                    }
917                    SetMenuItemInfo(hMenu,IDM_SHOW_GUID_VAR,0,&mi);
918                    RefreshGlobalVar_with_WindowLock();
919                    break;
920            }
921            break;
922        case WM_DESTROY:
923            DestroyMenu(hMenu);
924            hMenu=0;
925            break;
926    }
927    return CallWindowProc(OldTabProc,hwnd,message,wParam,lParam);
928}
929
930BOOL CALLBACK DlgDebugger(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
931    extern HANDLE hHeap;
932    extern HINSTANCE hInst;
933    extern DWORD dwStepRun;
934    extern double width_ratio_VarList;
935    RECT rect;
936    int i,i2,i3;
937    char temporary[VN_SIZE];
938    LV_DISPINFO *lvinfo;
939    LVITEM ListView_Item;
940
941    static POINT pos_VarList;
942    static POINT pos_WatchList;
943
944    switch(message){
945        case WM_INITDIALOG:
946            extern HWND hDebugWnd;
947            hDebugWnd=hwnd;
948
949            //変数リストの初期位置を取得
950            GetWindowRect(GetDlgItem(hwnd,IDC_VARPOS),&rect);
951            pos_VarList.x=rect.left;
952            pos_VarList.y=rect.top;
953            ScreenToClient(hwnd,&pos_VarList);
954
955            //ウォッチリストの初期位置を取得
956            pos_WatchList.x=pos_VarList.x+(rect.right-rect.left)+LEVER_THICK;
957            pos_WatchList.y=0;
958
959            //ツールバーのベースウィンドウを生成
960            static HWND hBase_ToolBar;
961            hBase_ToolBar=CreateDialog(hInst,MAKEINTRESOURCE(IDD_DEBUGGER_TOOLBARBASE),hwnd,(DLGPROC)DebuggerButtonsProc);
962            MoveWindow(hBase_ToolBar,50,0,20*BTNNUM_DEBUGGERTOOLBAR,22,1);
963
964            extern WNDPROC OldThreadComboProc;
965            OldThreadComboProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hwnd,IDC_THREADCOMBO),GWLP_WNDPROC);
966            SetWindowLongPtr(GetDlgItem(hwnd,IDC_THREADCOMBO),GWLP_WNDPROC,(LONG_PTR)ThreadComboProc);
967
968            extern WNDPROC OldProcComboProc;
969            OldProcComboProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hwnd,IDC_PROCCOMBO),GWLP_WNDPROC);
970            SetWindowLongPtr(GetDlgItem(hwnd,IDC_PROCCOMBO),GWLP_WNDPROC,(LONG_PTR)ProcComboProc);
971
972
973            ///////////////////////////
974            // タブコントロールを生成
975            ///////////////////////////
976
977            static HWND hTab;
978            HFONT hFont;
979            hFont=(HFONT)SendMessage(hwnd,WM_GETFONT,0,0);
980            hTab=CreateWindow(WC_TABCONTROL,NULL,
981                WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
982                0,0,0,0,hwnd,0,hInst,0);
983            SendMessage(hTab,WM_SETFONT,(WPARAM)hFont,0);
984            OldTabProc=(WNDPROC)GetWindowLongPtr(hTab,GWLP_WNDPROC);
985            SetWindowLongPtr(hTab,GWLP_WNDPROC,(LONG_PTR)TabProc);
986
987            //タブを設定
988            TC_ITEM tcItem;
989            tcItem.mask=TCIF_TEXT;
990            tcItem.pszText="グローバル";
991            SendMessage(hTab,TCM_INSERTITEM,0,(LPARAM)&tcItem);
992            tcItem.mask=TCIF_TEXT;
993            tcItem.pszText="ローカル";
994            SendMessage(hTab,TCM_INSERTITEM,1,(LPARAM)&tcItem);
995            tcItem.mask=TCIF_TEXT;
996            tcItem.pszText="This";
997            SendMessage(hTab,TCM_INSERTITEM,2,(LPARAM)&tcItem);
998
999            //グローバル変数リストのツリーを作成
1000            hVarTree_Global=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
1001                WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
1002                0,0,0,0,
1003                hTab,0,hInst,0);
1004
1005            //ローカル変数リストのツリーを作成
1006            hVarTree_Local=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
1007                WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
1008                0,0,0,0,
1009                hTab,0,hInst,0);
1010
1011            //This変数リストのツリーを作成
1012            hVarTree_This=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
1013                WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
1014                0,0,0,0,
1015                hTab,0,hInst,0);
1016
1017            ShowWindow(hVarTree_Global,SW_SHOW);
1018
1019
1020            //イメージリスト読み込み、設定
1021            static HIMAGELIST hVariOrderImageList;
1022            hVariOrderImageList=ImageList_Create(16,16,ILC_COLOR4|ILC_MASK,4,0);
1023            ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARARRAY)));
1024            ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTRUCT)));
1025            ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARDATA)));
1026            ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTR)));
1027            ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARPTRSTRUCT)));
1028            TreeView_SetImageList(hVarTree_Global,hVariOrderImageList,TVSIL_NORMAL);
1029            TreeView_SetImageList(hVarTree_Local,hVariOrderImageList,TVSIL_NORMAL);
1030            TreeView_SetImageList(hVarTree_This,hVariOrderImageList,TVSIL_NORMAL);
1031
1032
1033            /////////////////////////
1034            // ウォッチリスト
1035            /////////////////////////
1036
1037            //コラムの設定
1038            static HWND hListView;
1039            LV_COLUMN ListView_Column;
1040            DWORD dwStyle;
1041
1042            hListView=GetDlgItem(hwnd,IDC_WATCHLIST);
1043            GetClientRect(hListView,&rect);
1044            dwStyle=ListView_GetExtendedListViewStyle(hListView);
1045            dwStyle|=LVS_EX_FULLROWSELECT;
1046            ListView_SetExtendedListViewStyle(hListView,dwStyle);
1047
1048            ListView_Column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
1049            ListView_Column.fmt=LVCFMT_LEFT;
1050
1051            extern int width_WatchColumn_Expression;
1052            ListView_Column.cx=width_WatchColumn_Expression;
1053            ListView_Column.pszText="ウォッチ式";
1054            ListView_Column.iSubItem=0;
1055            ListView_InsertColumn(hListView,0,&ListView_Column);
1056
1057            extern int width_WatchColumn_Value;
1058            ListView_Column.cx=width_WatchColumn_Value;
1059            ListView_Column.pszText="値";
1060            ListView_Column.iSubItem=1;
1061            ListView_InsertColumn(hListView,1,&ListView_Column);
1062
1063            //アイテムの設定
1064            ListView_Item.mask=LVIF_TEXT;
1065            ListView_Item.iSubItem=0;
1066            for(i=0;i<pobj_nv->WatchNum;i++){
1067                ListView_Item.pszText=pobj_nv->ppWatchStr[i];
1068                ListView_Item.iItem=i;
1069                ListView_InsertItem(hListView,&ListView_Item);
1070            }
1071            ListView_Item.pszText="...";
1072            ListView_Item.iItem=i;
1073            ListView_InsertItem(hListView,&ListView_Item);
1074
1075
1076            ///////////////////////
1077            // 変数リストの初期化
1078            ///////////////////////
1079            InitVarList((DWORD)lParam);
1080
1081            break;
1082        case WM_NOTIFY:
1083            NMHDR *hdr;
1084            hdr=(NMHDR *)lParam;
1085            if(hdr->hwndFrom==hTab&&hdr->code==TCN_SELCHANGE){
1086                i=TabCtrl_GetCurSel(hTab);
1087
1088                if(i==0){
1089                    //グローバル変数を表示
1090                    ShowWindow(hVarTree_Global,SW_SHOW);
1091                    ShowWindow(hVarTree_Local,SW_HIDE);
1092                    ShowWindow(hVarTree_This,SW_HIDE);
1093                }
1094                else if(i==1){
1095                    //ローカル変数を表示
1096                    ShowWindow(hVarTree_Global,SW_HIDE);
1097                    ShowWindow(hVarTree_Local,SW_SHOW);
1098                    ShowWindow(hVarTree_This,SW_HIDE);
1099                }
1100                else if(i==2){
1101                    //This変数を表示
1102                    ShowWindow(hVarTree_Global,SW_HIDE);
1103                    ShowWindow(hVarTree_Local,SW_HIDE);
1104                    ShowWindow(hVarTree_This,SW_SHOW);
1105                }
1106            }
1107
1108            if(hdr->hwndFrom==hListView){
1109                lvinfo=(LV_DISPINFO *)hdr;
1110                if(hdr->code==NM_DBLCLK){
1111                    i2=ListView_GetItemCount(hListView);
1112                    for(i=0;i<i2;i++){
1113                        if(ListView_GetItemState(hListView,i,LVIS_SELECTED)) break;
1114                    }
1115                    if(i==i2) break;
1116
1117                    ListView_EditLabel(hListView,i);
1118                }
1119
1120                static HWND hEdit;
1121                if(hdr->code==LVN_BEGINLABELEDIT){
1122                    hEdit=ListView_GetEditControl(hListView);
1123
1124                    GetWindowText(hEdit,temporary,VN_SIZE);
1125                    if(lstrcmp(temporary,"...")==0) SetWindowText(hEdit,"");
1126                }
1127                if(hdr->code==LVN_ENDLABELEDIT){
1128                    GetWindowText(hEdit,temporary,VN_SIZE);
1129                    if(temporary[0]=='\0'){
1130                        if(ListView_GetItemCount(hListView)-1==lvinfo->item.iItem) break;
1131
1132                        //空白入力の場合はそのアイテムを削除する
1133                        ListView_DeleteItem(hListView,lvinfo->item.iItem);
1134                        break;
1135                    }
1136                    ListView_SetItemText(hListView,lvinfo->item.iItem,0,temporary);
1137
1138                    //演算結果を表示
1139                    SetCalcToWatchList(hListView,lvinfo->item.iItem,temporary);
1140
1141                    if(lvinfo->item.iItem==ListView_GetItemCount(hListView)-1){
1142                        //リストアイテムを追加
1143                        ListView_Item.mask=LVIF_TEXT;
1144                        ListView_Item.pszText="...";
1145                        ListView_Item.iItem=lvinfo->item.iItem+1;
1146                        ListView_Item.iSubItem=0;
1147                        ListView_InsertItem(hListView,&ListView_Item);
1148                    }
1149                }
1150
1151                if(hdr->code==LVN_KEYDOWN){
1152                    LV_KEYDOWN *plvKeydown;
1153                    plvKeydown=(LV_KEYDOWN *)hdr;
1154                    if(plvKeydown->wVKey==VK_DELETE){
1155                        i2=ListView_GetItemCount(hListView);
1156                        for(i=i2-2;i>=0;i--){
1157                            if(ListView_GetItemState(hListView,i,LVIS_SELECTED)){
1158                                ListView_DeleteItem(hListView,i);
1159                                i3=i;
1160                            }
1161                        }
1162
1163                        ListView_SetItemState(hListView,i3,LVIS_SELECTED,LVIS_SELECTED);
1164                    }
1165                }
1166            }
1167            break;
1168
1169        case WM_SIZE:
1170            //変数リストの位置
1171            int width_VarList;
1172            width_VarList=
1173                (int)((double)(LOWORD(lParam)-pos_VarList.x)*width_ratio_VarList);
1174
1175            MoveWindow(hTab,
1176                pos_VarList.x,
1177                pos_VarList.y,
1178                width_VarList,
1179                HIWORD(lParam)-pos_VarList.y,
1180                1);
1181
1182            GetClientRect(hTab,&rect);
1183            TabCtrl_AdjustRect(hTab,FALSE,&rect);
1184            rect.left-=2;
1185            rect.right++;
1186            rect.bottom++;
1187
1188            MoveWindow(hVarTree_Global,
1189                rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
1190            MoveWindow(hVarTree_Local,
1191                rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
1192            MoveWindow(hVarTree_This,
1193                rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
1194
1195            pos_WatchList.x=pos_VarList.x+width_VarList+LEVER_THICK;
1196            pos_WatchList.y=0;
1197
1198            //ウォッチリストの位置
1199            MoveWindow(GetDlgItem(hwnd,IDC_WATCHLIST),
1200                pos_WatchList.x,
1201                pos_WatchList.y,
1202                LOWORD(lParam)-pos_WatchList.x,
1203                HIWORD(lParam)-pos_WatchList.y,
1204                1);
1205
1206            return 1;
1207
1208        case WM_VARLIST_CLOSE:
1209            DestroyWindow(hwnd);
1210            return 1;
1211        case WM_DESTROY:
1212            ImageList_Destroy(hVariOrderImageList);
1213
1214
1215            //////////////////////////////////////////////////////////////
1216            // ウォッチリストの以前の内容を破棄し、新しい内容に書き換える
1217            //////////////////////////////////////////////////////////////
1218
1219            for(i=0;i<pobj_nv->WatchNum;i++){
1220                HeapDefaultFree(pobj_nv->ppWatchStr[i]);
1221            }
1222            HeapDefaultFree(pobj_nv->ppWatchStr);
1223
1224            pobj_nv->WatchNum=ListView_GetItemCount(hListView)-1;
1225            pobj_nv->ppWatchStr=(char **)HeapAlloc(hHeap,0,pobj_nv->WatchNum*sizeof(char *)+1);
1226            for(i=0;i<pobj_nv->WatchNum;i++){
1227                ListView_GetItemText(hListView,i,0,temporary,VN_SIZE);
1228                pobj_nv->ppWatchStr[i]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
1229                lstrcpy(pobj_nv->ppWatchStr[i],temporary);
1230            }
1231
1232
1233            //////////////////////////////
1234            // デバッグダイアログを破棄
1235            //////////////////////////////
1236
1237            hDebugWnd=0;
1238
1239            extern BOOL bClipCompileView;
1240            if(bClipCompileView){
1241                extern HWND hOwnerEditor;
1242                SendMessage(hOwnerEditor,WM_DESTROYDEBUGGERVIEW,0,0);
1243            }
1244
1245            return 1;
1246
1247
1248
1249        ///////////////////////
1250        // デバッグコマンド
1251        ///////////////////////
1252
1253        case WM_DEBUG_CONTINUE:
1254            DestroyWindow(hwnd);
1255            return 1;
1256        case WM_STEP_IN:
1257            Debugger_StepIn();
1258            return 1;
1259        case WM_STEP_OVER:
1260            Debugger_StepOver();
1261            return 1;
1262        case WM_STEP_CURSOR:
1263            Debugger_StepCursor();
1264            return 1;
1265    }
1266    return 0;
1267}
1268
1269
1270
1271
1272//////////////////////////////////
1273// ポップアップ表示の変数リスト
1274//////////////////////////////////
1275
1276BOOL CALLBACK DlgVarList(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
1277    extern HANDLE hHeap;
1278    extern HINSTANCE hInst;
1279    extern DWORD dwStepRun;
1280    RECT rect;
1281    POINT pos;
1282    SIZE size;
1283
1284    switch(message){
1285        case WM_INITDIALOG:
1286            extern HWND hDebugWnd;
1287            hDebugWnd=hwnd;
1288
1289            pos.x=pobj_nv->VarDlgRect.left;
1290            pos.y=pobj_nv->VarDlgRect.top;
1291            size.cx=pobj_nv->VarDlgRect.right-pobj_nv->VarDlgRect.left;
1292            size.cy=pobj_nv->VarDlgRect.bottom-pobj_nv->VarDlgRect.top;
1293            MoveWindow(hwnd,pos.x,pos.y,size.cx,size.cy,1);
1294
1295            extern WNDPROC OldThreadComboProc;
1296            OldThreadComboProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hwnd,IDC_THREADCOMBO),GWLP_WNDPROC);
1297            SetWindowLongPtr(GetDlgItem(hwnd,IDC_THREADCOMBO),GWLP_WNDPROC,(LONG_PTR)ThreadComboProc);
1298
1299            extern WNDPROC OldProcComboProc;
1300            OldProcComboProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hwnd,IDC_PROCCOMBO),GWLP_WNDPROC);
1301            SetWindowLongPtr(GetDlgItem(hwnd,IDC_PROCCOMBO),GWLP_WNDPROC,(LONG_PTR)ProcComboProc);
1302
1303            //イメージリスト読み込み、設定
1304            static HIMAGELIST hVariOrderImageList;
1305            hVariOrderImageList=ImageList_Create(16,16,ILC_COLOR4|ILC_MASK,4,0);
1306            ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARARRAY)));
1307            ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTRUCT)));
1308            ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARDATA)));
1309            ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTR)));
1310            ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARPTRSTRUCT)));
1311            TreeView_SetImageList(GetDlgItem(hwnd,IDC_VARTREE),hVariOrderImageList,TVSIL_NORMAL);
1312
1313            InitVarList((DWORD)lParam);
1314            break;
1315        case WM_COMMAND:
1316            switch(LOWORD(wParam)){
1317                case IDCANCEL:
1318                    DestroyWindow(hwnd);
1319                    return 1;
1320                case IDC_STEPIN:
1321                    dwStepRun=1;
1322                    return 1;
1323                case IDC_STEPOVER:
1324                    dwStepRun=2;
1325                    return 1;
1326            }
1327            break;
1328        case WM_SIZE:
1329            GetWindowRect(GetDlgItem(hwnd,IDC_VARTREE),&rect);
1330            pos.x=rect.left;
1331            pos.y=rect.top;
1332            ScreenToClient(hwnd,&pos);
1333            MoveWindow(GetDlgItem(hwnd,IDC_VARTREE),0,pos.y,LOWORD(lParam),HIWORD(lParam)-pos.y,TRUE);
1334            SetWindowPos(GetDlgItem(hwnd,IDCANCEL),0,LOWORD(lParam)-91,9,0,0,SWP_NOSIZE);
1335            return 1;
1336        case WM_VARLIST_CLOSE:
1337            DestroyWindow(hwnd);
1338            return 1;
1339        case WM_DESTROY:
1340            ImageList_Destroy(hVariOrderImageList);
1341
1342            GetWindowRect(hwnd,&pobj_nv->VarDlgRect);
1343
1344            hDebugWnd=0;
1345
1346            return 1;
1347    }
1348    return 0;
1349}
Note: See TracBrowser for help on using the repository browser.