source: dev/BasicCompiler32/VarList.cpp@ 63

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

CClass::GetSize、CClass::GetMemberOffsetを追加

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