source: dev/BasicCompiler_Common/VarList.cpp@ 114

Last change on this file since 114 was 114, checked in by dai_9181, 17 years ago

CClassクラスのインスタンスを全面的にconstにした。
TypeDefされたクラスの静的メソッドを呼び出せるようにした。(静的メンバへの対応はまだ)

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