source: dev/BasicCompiler64/varlist.cpp@ 75

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

TYPEINFO→Typeへのリファクタリングを実施。64bitはほぼ完了。32bitが全般的に未完成。

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