source: dev/trunk/ab5.0/abdev/abdev/abdev.cpp@ 697

Last change on this file since 697 was 697, checked in by イグトランス (egtra), 16 years ago

エディタの2重オープンチェックの厳密化。abdevからコンパイラへのHWNDの受け渡しを64ビット対応へ。

File size: 50.1 KB
Line 
1#include "stdafx.h"
2
3#include "abdev.h"
4
5#ifdef _DEBUG
6#include <crtdbg.h>
7#endif
8
9#if defined HeapAlloc
10#define MEM_MAX 65536
11LPVOID pCheckMem[MEM_MAX];
12int now;
13#undef HeapAlloc
14#undef HeapReAlloc
15LPVOID CheckHeapAlloc(HANDLE hf,DWORD dwFlags,DWORD dwBytes){
16 LPVOID ret;
17 ret=HeapAlloc(hf,dwFlags,dwBytes);
18 pCheckMem[now]=ret;
19
20 //この部分にnowのチェックを挿入
21
22
23 now++;
24 if(now>=MEM_MAX){
25 MessageBox(0,"pCheckMemの最大値を超えました","Check",0);
26 }
27 return ret;
28}
29LPVOID CheckHeapReAlloc(HANDLE hf,DWORD dwFlags,LPVOID lpMem,DWORD dwBytes){
30 int i;
31 LPVOID ret;
32 for(i=0;;i++){
33 if(lpMem==pCheckMem[i]) break;
34 if(i>=MEM_MAX){
35 MessageBox(0,"エラー","CheckHeapReAlloc",0);
36 break;
37 }
38 }
39 ret=HeapReAlloc(hf,dwFlags,lpMem,dwBytes);
40 pCheckMem[i]=ret;
41 return ret;
42}
43void HeapDefaultFree(LPVOID lpMem){
44 int i;
45 for(i=0;;i++){
46 if(lpMem==pCheckMem[i]) break;
47 if(i>=MEM_MAX){
48 MessageBox(0,"エラー","HeapDefaultFree",0);
49 break;
50 }
51 }
52 pCheckMem[i]=0;
53 HeapFree(hHeap,0,lpMem);
54}
55void CheckHeapCheck(){
56 int i,i2;
57 char temp[100];
58 temp[0]=0;
59 for(i=0,i2=0;i<MEM_MAX;i++){
60 if(pCheckMem[i]){
61 sprintf(temp+lstrlen(temp),"%d\r\n",i);
62 i2++;
63 if(i2==10){
64 lstrcat(temp,"これ以上の未解放が確認されています");
65 break;
66 }
67 }
68 }
69 if(temp[0]) MessageBox(0,temp,"Check - BasicCompiler.exe",0);
70}
71#define HeapAlloc CheckHeapAlloc
72#define HeapReAlloc CheckHeapReAlloc
73#else
74void HeapDefaultFree(LPVOID lpMem){
75 HeapFree(hHeap,0,lpMem);
76}
77#endif
78
79#ifdef DeleteObject
80#undef DeleteObject
81BOOL CheckDeleteObject(HGDIOBJ hObject){
82 BOOL bRet;
83 bRet=DeleteObject(hObject);
84
85 if(bRet==0){
86 MessageBox(0,"DeleteObject Error","Check",0);
87 }
88 return bRet;
89}
90#define DeleteObject CheckDeleteObject
91#endif
92
93
94void ToBigChar(char str[]){
95 int i;
96 for(i=0;TRUE;i++){
97 str[i]=(char)toupper((int)str[i]);
98 if(str[i]=='\0') break;
99 }
100}
101int GetWndNum(HWND hChild){
102 int i;
103 if(!IsWindow(hChild)) return -1;
104 for(i=0;i<MdiInfo.size();i++){
105 if(hChild==MdiInfo[i]->hwnd) break;
106 }
107 if(i==MdiInfo.size()) i=-1;
108 return i;
109}
110int GetNowWndNum(void){
111 return GetWndNum(GetWindow(hClient,GW_CHILD));
112}
113int GetFileNum(int WndNum){
114 if( !projectInfo.IsOpened() ){
115 return -1;
116 }
117
118 for(int i=0;i<projectInfo.fileSystem.root.files.size();i++)
119 {
120 if(lstrcmpi(MdiInfo[WndNum]->path.c_str(),projectInfo.fileSystem.root.files[i].GetFullPath().c_str())==0) return i;
121 }
122 return -1;
123}
124
125void SendTextEditResizeEvent(HWND hwnd){
126 RECT rect;
127 GetClientRect(hwnd,&rect);
128 ResizeTextEditWnd(hwnd,rect.right,rect.bottom);
129}
130
131void RedrawAllWindow(void){
132 HWND hChild;
133 hChild=GetWindow(hClient,GW_CHILD);
134 if(hChild) ResetTextEditFont(GetWindow(hChild,GW_CHILD));
135 while(hChild){
136 int WndNum;
137 WndNum=GetWndNum(hChild);
138 if(WndNum==-1) break;
139
140 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
141 //コントロールタブスペースの幅と行番号の文字数を更新
142 MdiInfo[WndNum]->pMdiTextEdit->iWidth_ControlTabSpace=
143 GetControlTabSpace(WndNum,&MdiInfo[WndNum]->pMdiTextEdit->iLineNumberTextCount);
144
145 InvalidateRect(MdiInfo[WndNum]->pMdiTextEdit->hEdit,NULL,0);
146 InvalidateRect(MdiInfo[WndNum]->pMdiTextEdit->pobj_Ruler->hRulerWnd,NULL,0);
147
148 SendTextEditResizeEvent(MdiInfo[WndNum]->hwnd);
149 }
150 else{
151 HWND hEdit;
152 hEdit=GetWindow(hChild,GW_CHILD);
153 InvalidateRect(hEdit,NULL,0);
154 }
155
156 hChild=GetWindow(hChild,GW_HWNDNEXT);
157 }
158}
159
160int DocumentModifyCheck(HWND hChild){ //終了保存確認
161 int BoxID,WndNum,sw;
162 char str[MAX_PATH],temporary[MAX_PATH];
163
164 WndNum=GetWndNum(hChild);
165 sw=0;
166 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
167 if( MdiInfo[WndNum]->pMdiTextEdit->IsModified() ) sw=1;
168 }
169 else if(MdiInfo[WndNum]->DocType==WNDTYPE_ICONEDIT){
170 if(MdiInfo[WndNum]->MdiIconEditInfo->bModify) sw=1;
171 }
172
173 if(sw){
174 GetWindowText(hChild,temporary,MAX_PATH);
175
176 //"\"%s\" ファイルは変更されています。保存しますか?"
177 sprintf(str,STRING_MODIFYCHECK_FILE,temporary);
178 BoxID=MessageBox(hOwner,str,APPLICATION_NAME,MB_YESNOCANCEL|MB_ICONINFORMATION);
179
180 if(BoxID==IDYES){
181 if(!SaveDocument(hChild,NULL)) return 0;
182 }
183 else if(BoxID==IDCANCEL) return 0;
184 }
185 return 1;
186}
187void SetStatusText(char *MenuText){
188 //////////////////////////
189 // ステータスバーの更新
190 //////////////////////////
191
192 int WndNum;
193 double BufSize;
194 char temporary[255];
195 HWND hChild;
196
197 if(MenuText){
198 SendMessage(hStatusBar,SB_SETTEXT,0,(long)MenuText);
199 if((char *)MenuText!=(char *)CmdMsg) CmdMsg[0]=0;
200 }
201
202 hChild=GetWindow(hClient,GW_CHILD);
203 WndNum=GetWndNum(hChild);
204 if(WndNum==-1) return;
205 hChild=GetWindow(hChild,GW_CHILD);
206 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
207 //////////////////////
208 // テキストエディタ
209 //////////////////////
210
211 //サイズ
212 BufSize=(double)lstrlen(MdiInfo[WndNum]->pMdiTextEdit->buffer);
213 if(IsWindow(hChild)){
214 if(BufSize<1024) sprintf(temporary,"%s: %.0fByte",STRING_SIZE,BufSize);
215 else if(BufSize<1024*1024){
216 BufSize/=1024;
217 sprintf(temporary,"%s: %.2fKB",STRING_SIZE,BufSize);
218 }
219 else{
220 BufSize/=1024*1024;
221 sprintf(temporary,"%s: %.2fMB",STRING_SIZE,BufSize);
222 }
223 }
224 else temporary[0]=0;
225 SendMessage(hStatusBar,SB_SETTEXT,1,(LPARAM)temporary);
226
227 //行と桁
228 if(IsWindow(hChild)){
229#if defined(JPN)
230 //日本語
231 sprintf(temporary,"%d 行、%d 列",
232 MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y+1,
233 MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x+1);
234#else
235 //英語
236 sprintf(temporary,"%d : %d",
237 MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y+1,
238 MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x+1);
239#endif
240 }
241 else temporary[0]=0;
242 SendMessage(hStatusBar,SB_SETTEXT,2,(LPARAM)temporary);
243
244 //文字コード
245 nkf.GetCharCodeName(MdiInfo[WndNum]->pMdiTextEdit->iCharCode,temporary);
246 SendMessage(hStatusBar,SB_SETTEXT,3,(LPARAM)temporary);
247
248 //文字コード
249 nkf.GetLfCodeName(MdiInfo[WndNum]->pMdiTextEdit->iLfCode,temporary);
250 SendMessage(hStatusBar,SB_SETTEXT,4,(LPARAM)temporary);
251 }
252 else if(MdiInfo[WndNum]->DocType==WNDTYPE_RAD){
253 ////////////////
254 // RADツール
255 ////////////////
256
257 ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[WndNum]->path);
258 if(RadInfo.NowDragging>=FRAME_CHANGEPOS_START&&RadInfo.NowDragging<=FRAME_CHANGEPOS_END){
259 sprintf(temporary,"pos %d, %d",
260 RadInfo.DraggingRect[0].left-MdiInfo[WndNum]->MdiRadInfo->ClientPos.x,
261 RadInfo.DraggingRect[0].top-MdiInfo[WndNum]->MdiRadInfo->ClientPos.y);
262 SendMessage(hStatusBar,SB_SETTEXT,1,(LPARAM)temporary);
263 sprintf(temporary,"size %d * %d",
264 RadInfo.DraggingRect[0].right-RadInfo.DraggingRect[0].left,
265 RadInfo.DraggingRect[0].bottom-RadInfo.DraggingRect[0].top);
266 SendMessage(hStatusBar,SB_SETTEXT,2,(LPARAM)temporary);
267 }
268 else if(MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]==SELECT_WINDOW){
269 SendMessage(hStatusBar,SB_SETTEXT,1,(LPARAM)"pos 0, 0");
270 sprintf(temporary,"size %d * %d",pWindowInfo->size.cx,pWindowInfo->size.cy);
271 SendMessage(hStatusBar,SB_SETTEXT,2,(LPARAM)temporary);
272 }
273 else{
274 sprintf(temporary,"pos %d, %d",
275 pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->pos.x,
276 pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->pos.y);
277 SendMessage(hStatusBar,SB_SETTEXT,1,(LPARAM)temporary);
278 sprintf(temporary,"size %d * %d",
279 pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->size.cx,
280 pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->size.cy);
281 SendMessage(hStatusBar,SB_SETTEXT,2,(LPARAM)temporary);
282 }
283 }
284 else if(MdiInfo[WndNum]->DocType==WNDTYPE_MENU){
285 //////////////////
286 // MENU エディタ
287 //////////////////
288
289 SendMessage(hStatusBar,SB_SETTEXT,1,(LPARAM)"");
290 SendMessage(hStatusBar,SB_SETTEXT,2,(LPARAM)"");
291 }
292 else if(MdiInfo[WndNum]->DocType==WNDTYPE_ICONEDIT){
293 //////////////////
294 // ICON エディタ
295 //////////////////
296
297 SendMessage(hStatusBar,SB_SETTEXT,1,(LPARAM)"");
298 SendMessage(hStatusBar,SB_SETTEXT,2,(LPARAM)"");
299 }
300}
301void ResetState_UndoMenu(void){ //「元に戻す、やり直し」のメニュー表示制御
302 int i,i2;
303 HWND hChild;
304
305 hChild=GetWindow(hClient,GW_CHILD);
306 i=GetWndNum(hChild);
307 if(i==-1){
308 pobj_MainMenu->EnableItem(IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
309 EnableMenuItem(hEditMenu,IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
310 pobj_StandardToolbar->EnableItem(IDM_UNDO,0);
311 pobj_MainMenu->EnableItem(IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
312 EnableMenuItem(hEditMenu,IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
313 pobj_StandardToolbar->EnableItem(IDM_REDO,0);
314 }
315 else if(IS_DOCUMENT_TEXT(MdiInfo[i]->DocType)){
316 i2=MdiInfo[i]->pMdiTextEdit->pTextEditUndoState->NowPos-1;
317 if(i2==-1) i2=MAX_UNDONUM-1;
318 if(!MdiInfo[i]->pMdiTextEdit->pTextEditUndoState->Command[i2]){
319 pobj_MainMenu->EnableItem(IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
320 EnableMenuItem(hEditMenu,IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
321 pobj_StandardToolbar->EnableItem(IDM_UNDO,0);
322 }
323 else{
324 pobj_MainMenu->EnableItem(IDM_UNDO,MF_BYCOMMAND|MF_ENABLED);
325 EnableMenuItem(hEditMenu,IDM_UNDO,MF_BYCOMMAND|MF_ENABLED);
326 pobj_StandardToolbar->EnableItem(IDM_UNDO,1);
327 }
328 if(!MdiInfo[i]->pMdiTextEdit->pTextEditUndoState->Command[MdiInfo[i]->pMdiTextEdit->pTextEditUndoState->NowPos]){
329 pobj_MainMenu->EnableItem(IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
330 EnableMenuItem(hEditMenu,IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
331 pobj_StandardToolbar->EnableItem(IDM_REDO,0);
332 }
333 else{
334 pobj_MainMenu->EnableItem(IDM_REDO,MF_BYCOMMAND|MF_ENABLED);
335 EnableMenuItem(hEditMenu,IDM_REDO,MF_BYCOMMAND|MF_ENABLED);
336 pobj_StandardToolbar->EnableItem(IDM_REDO,1);
337 }
338 }
339 else if(MdiInfo[i]->DocType==WNDTYPE_RAD){
340 i2=MdiInfo[i]->MdiRadInfo->undo.NowPos-1;
341 if(i2==-1) i2=MAX_UNDONUM-1;
342 if(!MdiInfo[i]->MdiRadInfo->undo.Command[i2]){
343 pobj_MainMenu->EnableItem(IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
344 EnableMenuItem(hEditMenu,IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
345 pobj_StandardToolbar->EnableItem(IDM_UNDO,0);
346 }
347 else{
348 pobj_MainMenu->EnableItem(IDM_UNDO,MF_BYCOMMAND|MF_ENABLED);
349 EnableMenuItem(hEditMenu,IDM_UNDO,MF_BYCOMMAND|MF_ENABLED);
350 pobj_StandardToolbar->EnableItem(IDM_UNDO,1);
351 }
352 if(!MdiInfo[i]->MdiRadInfo->undo.Command[MdiInfo[i]->MdiRadInfo->undo.NowPos]){
353 pobj_MainMenu->EnableItem(IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
354 EnableMenuItem(hEditMenu,IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
355 pobj_StandardToolbar->EnableItem(IDM_REDO,0);
356 }
357 else{
358 pobj_MainMenu->EnableItem(IDM_REDO,MF_BYCOMMAND|MF_ENABLED);
359 EnableMenuItem(hEditMenu,IDM_REDO,MF_BYCOMMAND|MF_ENABLED);
360 pobj_StandardToolbar->EnableItem(IDM_REDO,1);
361 }
362 }
363 else if(MdiInfo[i]->DocType==WNDTYPE_MENU){
364 pobj_MainMenu->EnableItem(IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
365 EnableMenuItem(hEditMenu,IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
366 pobj_StandardToolbar->EnableItem(IDM_UNDO,0);
367
368 pobj_MainMenu->EnableItem(IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
369 EnableMenuItem(hEditMenu,IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
370 pobj_StandardToolbar->EnableItem(IDM_REDO,0);
371 }
372 else if(MdiInfo[i]->DocType==WNDTYPE_ICONEDIT){
373 i2=MdiInfo[i]->MdiIconEditInfo->undo[MdiInfo[i]->MdiIconEditInfo->SelectIconNum].NowPos-1;
374 if(i2==-1) i2=MAX_ICONEDIT_UNDONUM-1;
375 if(!MdiInfo[i]->MdiIconEditInfo->undo[MdiInfo[i]->MdiIconEditInfo->SelectIconNum].lpData[i2]){
376 pobj_MainMenu->EnableItem(IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
377 EnableMenuItem(hEditMenu,IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
378 pobj_StandardToolbar->EnableItem(IDM_UNDO,0);
379 }
380 else{
381 pobj_MainMenu->EnableItem(IDM_UNDO,MF_BYCOMMAND|MF_ENABLED);
382 EnableMenuItem(hEditMenu,IDM_UNDO,MF_BYCOMMAND|MF_ENABLED);
383 pobj_StandardToolbar->EnableItem(IDM_UNDO,1);
384 }
385 if(!MdiInfo[i]->MdiIconEditInfo->undo[MdiInfo[i]->MdiIconEditInfo->SelectIconNum].lpData[MdiInfo[i]->MdiIconEditInfo->undo[MdiInfo[i]->MdiIconEditInfo->SelectIconNum].NowPos]){
386 pobj_MainMenu->EnableItem(IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
387 EnableMenuItem(hEditMenu,IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
388 pobj_StandardToolbar->EnableItem(IDM_REDO,0);
389 }
390 else{
391 pobj_MainMenu->EnableItem(IDM_REDO,MF_BYCOMMAND|MF_ENABLED);
392 EnableMenuItem(hEditMenu,IDM_REDO,MF_BYCOMMAND|MF_ENABLED);
393 pobj_StandardToolbar->EnableItem(IDM_REDO,1);
394 }
395 }
396}
397void ResetState_ConvMenu(BOOL bEnable){
398 int MenuMsg;
399 if(bEnable)
400 MenuMsg=MF_BYCOMMAND|MF_ENABLED;
401 else MenuMsg=MF_BYCOMMAND|MF_GRAYED;
402
403 pobj_MainMenu->EnableItem(IDM_CONV_ALPHA_SMALL,MenuMsg);
404 pobj_MainMenu->EnableItem(IDM_CONV_ALPHA_BIG,MenuMsg);
405 pobj_MainMenu->EnableItem(IDM_CONV_HALF,MenuMsg);
406 pobj_MainMenu->EnableItem(IDM_CONV_MULTI,MenuMsg);
407 pobj_MainMenu->EnableItem(IDM_CONV_KATAKANA,MenuMsg);
408 pobj_MainMenu->EnableItem(IDM_CONV_HIRAGANA,MenuMsg);
409 pobj_MainMenu->EnableItem(IDM_CONV_SPACE,MenuMsg);
410 pobj_MainMenu->EnableItem(IDM_CONV_TAB,MenuMsg);
411#ifdef THETEXT
412 pobj_MainMenu->EnableItem(IDM_CONV_HASRETURN,MenuMsg);
413 pobj_MainMenu->EnableItem(IDM_CONV_QUOTE,MenuMsg);
414#else
415 pobj_MainMenu->EnableItem(IDM_CODEFORMAT,MenuMsg);
416#endif
417}
418void ResetState_PrintMenu(void);
419void ResetState_EditMenu(void){ //編集メニューの表示制御
420 HWND hChild;
421 int WndNum;
422 long MenuMsg,ToolbarMsg;
423
424 //印刷メニューの状態を設定
425 ResetState_PrintMenu();
426
427 hChild=GetWindow(hClient,GW_CHILD);
428 if(!IsWindow(hChild)){
429 pobj_MainMenu->EnableItem(IDM_FIND,MF_BYCOMMAND|MF_GRAYED);
430 pobj_MainMenu->EnableItem(IDM_PERMUTATION,MF_BYCOMMAND|MF_GRAYED);
431#ifdef THETEXT
432 pobj_MainMenu->EnableItem(IDM_STRING_COUNT,MF_BYCOMMAND|MF_GRAYED);
433#endif
434 pobj_StandardToolbar->EnableItem(IDM_FIND,0);
435
436 pobj_MainMenu->EnableItem(IDM_CUT,MF_BYCOMMAND|MF_GRAYED);
437 pobj_MainMenu->EnableItem(IDM_COPY,MF_BYCOMMAND|MF_GRAYED);
438 pobj_MainMenu->EnableItem(IDM_DELETE,MF_BYCOMMAND|MF_GRAYED);
439 EnableMenuItem(hEditMenu,IDM_CUT,MF_BYCOMMAND|MF_GRAYED);
440 EnableMenuItem(hEditMenu,IDM_COPY,MF_BYCOMMAND|MF_GRAYED);
441 EnableMenuItem(hEditMenu,IDM_DELETE,MF_BYCOMMAND|MF_GRAYED);
442 pobj_MainMenu->EnableItem(IDM_PASTE,MF_BYCOMMAND|MF_GRAYED);
443 pobj_MainMenu->EnableItem(IDM_ALLSELECT,MF_BYCOMMAND|MF_GRAYED);
444 pobj_StandardToolbar->EnableItem(IDM_CUT,0);
445 pobj_StandardToolbar->EnableItem(IDM_COPY,0);
446 pobj_StandardToolbar->EnableItem(IDM_PASTE,0);
447
448 ResetState_ConvMenu(0);
449
450 ResetState_UndoMenu();
451 return;
452 }
453 WndNum=GetWndNum(hChild);
454 if(WndNum==-1) return;
455 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
456 pobj_MainMenu->EnableItem(IDM_ALLSELECT,MF_BYCOMMAND|MF_ENABLED);
457 pobj_MainMenu->EnableItem(IDM_FIND,MF_BYCOMMAND|MF_ENABLED);
458 pobj_MainMenu->EnableItem(IDM_PERMUTATION,MF_BYCOMMAND|MF_ENABLED);
459#ifdef THETEXT
460 pobj_MainMenu->EnableItem(IDM_STRING_COUNT,MF_BYCOMMAND|MF_ENABLED);
461#endif
462 pobj_StandardToolbar->EnableItem(IDM_FIND,1);
463
464 BOOL bConvEnable;
465 hChild=GetWindow(hChild,GW_CHILD);
466 if(!(
467 MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.x&&
468 MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y
469 )){
470 MenuMsg=MF_BYCOMMAND|MF_ENABLED;
471 ToolbarMsg=1;
472
473 bConvEnable=1;
474 }
475 else{
476 MenuMsg=MF_BYCOMMAND|MF_GRAYED;
477 ToolbarMsg=0;
478
479 bConvEnable=0;
480 }
481 pobj_MainMenu->EnableItem(IDM_CUT,MenuMsg);
482 pobj_MainMenu->EnableItem(IDM_COPY,MenuMsg);
483 pobj_MainMenu->EnableItem(IDM_DELETE,MenuMsg);
484 EnableMenuItem(hEditMenu,IDM_CUT,MenuMsg);
485 EnableMenuItem(hEditMenu,IDM_COPY,MenuMsg);
486 EnableMenuItem(hEditMenu,IDM_DELETE,MenuMsg);
487 pobj_StandardToolbar->EnableItem(IDM_CUT,ToolbarMsg);
488 pobj_StandardToolbar->EnableItem(IDM_COPY,ToolbarMsg);
489
490 if(IsClipboardFormatAvailable(CF_TEXT)){
491 pobj_MainMenu->EnableItem(IDM_PASTE,MF_BYCOMMAND|MF_ENABLED);
492 pobj_StandardToolbar->EnableItem(IDM_PASTE,1);
493 }
494 else{
495 pobj_MainMenu->EnableItem(IDM_PASTE,MF_BYCOMMAND|MF_GRAYED);
496 pobj_StandardToolbar->EnableItem(IDM_PASTE,0);
497 }
498
499
500 //変換コマンド
501 ResetState_ConvMenu(bConvEnable);
502 }
503 else if(MdiInfo[WndNum]->DocType==WNDTYPE_RAD){
504 //検索、置換、文字カウントを無効化
505 pobj_MainMenu->EnableItem(IDM_FIND,MF_BYCOMMAND|MF_GRAYED);
506 pobj_MainMenu->EnableItem(IDM_PERMUTATION,MF_BYCOMMAND|MF_GRAYED);
507#ifdef THETEXT
508 pobj_MainMenu->EnableItem(IDM_STRING_COUNT,MF_BYCOMMAND|MF_GRAYED);
509#endif
510 pobj_StandardToolbar->EnableItem(IDM_FIND,0);
511
512 if(MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]==SELECT_WINDOW){
513 //切り取り、コピー、削除を有効化
514 pobj_MainMenu->EnableItem(IDM_CUT,MF_BYCOMMAND|MF_GRAYED);
515 pobj_MainMenu->EnableItem(IDM_COPY,MF_BYCOMMAND|MF_GRAYED);
516 pobj_MainMenu->EnableItem(IDM_DELETE,MF_BYCOMMAND|MF_GRAYED);
517 EnableMenuItem(hEditMenu,IDM_CUT,MF_BYCOMMAND|MF_GRAYED);
518 EnableMenuItem(hEditMenu,IDM_COPY,MF_BYCOMMAND|MF_GRAYED);
519 EnableMenuItem(hEditMenu,IDM_DELETE,MF_BYCOMMAND|MF_GRAYED);
520 pobj_StandardToolbar->EnableItem(IDM_CUT,0);
521 pobj_StandardToolbar->EnableItem(IDM_COPY,0);
522 }
523 else{
524 //切り取り、コピー、削除を無効化
525 pobj_MainMenu->EnableItem(IDM_CUT,MF_BYCOMMAND|MF_ENABLED);
526 pobj_MainMenu->EnableItem(IDM_COPY,MF_BYCOMMAND|MF_ENABLED);
527 pobj_MainMenu->EnableItem(IDM_DELETE,MF_BYCOMMAND|MF_ENABLED);
528 EnableMenuItem(hEditMenu,IDM_CUT,MF_BYCOMMAND|MF_ENABLED);
529 EnableMenuItem(hEditMenu,IDM_COPY,MF_BYCOMMAND|MF_ENABLED);
530 EnableMenuItem(hEditMenu,IDM_DELETE,MF_BYCOMMAND|MF_ENABLED);
531 pobj_StandardToolbar->EnableItem(IDM_CUT,1);
532 pobj_StandardToolbar->EnableItem(IDM_COPY,1);
533 }
534
535 //すべて選択を有効化
536 pobj_MainMenu->EnableItem(IDM_ALLSELECT,MF_BYCOMMAND|MF_ENABLED);
537
538 if(IsClipboardFormatAvailable(dwRadClipboardID)){
539 pobj_MainMenu->EnableItem(IDM_PASTE,MF_BYCOMMAND|MF_ENABLED);
540 pobj_StandardToolbar->EnableItem(IDM_PASTE,1);
541 }
542 else{
543 pobj_MainMenu->EnableItem(IDM_PASTE,MF_BYCOMMAND|MF_GRAYED);
544 pobj_StandardToolbar->EnableItem(IDM_PASTE,0);
545 }
546
547 ResetState_ConvMenu(0);
548 }
549 else if(MdiInfo[WndNum]->DocType==WNDTYPE_MENU){
550 //検索、置換、文字カウントを無効化
551 pobj_MainMenu->EnableItem(IDM_FIND,MF_BYCOMMAND|MF_GRAYED);
552 pobj_MainMenu->EnableItem(IDM_PERMUTATION,MF_BYCOMMAND|MF_GRAYED);
553#ifdef THETEXT
554 pobj_MainMenu->EnableItem(IDM_STRING_COUNT,MF_BYCOMMAND|MF_GRAYED);
555#endif
556 pobj_StandardToolbar->EnableItem(IDM_FIND,0);
557
558 pobj_MainMenu->EnableItem(IDM_CUT,MF_BYCOMMAND|MF_GRAYED);
559 pobj_MainMenu->EnableItem(IDM_COPY,MF_BYCOMMAND|MF_GRAYED);
560 pobj_MainMenu->EnableItem(IDM_DELETE,MF_BYCOMMAND|MF_GRAYED);
561 EnableMenuItem(hEditMenu,IDM_CUT,MF_BYCOMMAND|MF_GRAYED);
562 EnableMenuItem(hEditMenu,IDM_COPY,MF_BYCOMMAND|MF_GRAYED);
563 EnableMenuItem(hEditMenu,IDM_DELETE,MF_BYCOMMAND|MF_GRAYED);
564 pobj_MainMenu->EnableItem(IDM_PASTE,MF_BYCOMMAND|MF_GRAYED);
565 pobj_MainMenu->EnableItem(IDM_ALLSELECT,MF_BYCOMMAND|MF_GRAYED);
566 pobj_StandardToolbar->EnableItem(IDM_CUT,0);
567 pobj_StandardToolbar->EnableItem(IDM_COPY,0);
568 pobj_StandardToolbar->EnableItem(IDM_PASTE,0);
569
570 ResetState_ConvMenu(0);
571 }
572 else if(MdiInfo[WndNum]->DocType==WNDTYPE_ICONEDIT){
573 //検索、置換、文字カウントを無効化
574 pobj_MainMenu->EnableItem(IDM_FIND,MF_BYCOMMAND|MF_GRAYED);
575 pobj_MainMenu->EnableItem(IDM_PERMUTATION,MF_BYCOMMAND|MF_GRAYED);
576#ifdef THETEXT
577 pobj_MainMenu->EnableItem(IDM_STRING_COUNT,MF_BYCOMMAND|MF_GRAYED);
578#endif
579 pobj_StandardToolbar->EnableItem(IDM_FIND,0);
580
581 if(MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel==0){
582 //切り取り、コピー、削除を無効化
583 pobj_MainMenu->EnableItem(IDM_CUT,MF_BYCOMMAND|MF_GRAYED);
584 pobj_MainMenu->EnableItem(IDM_COPY,MF_BYCOMMAND|MF_GRAYED);
585 pobj_MainMenu->EnableItem(IDM_DELETE,MF_BYCOMMAND|MF_GRAYED);
586 EnableMenuItem(hEditMenu,IDM_CUT,MF_BYCOMMAND|MF_GRAYED);
587 EnableMenuItem(hEditMenu,IDM_COPY,MF_BYCOMMAND|MF_GRAYED);
588 EnableMenuItem(hEditMenu,IDM_DELETE,MF_BYCOMMAND|MF_GRAYED);
589 pobj_StandardToolbar->EnableItem(IDM_CUT,0);
590 pobj_StandardToolbar->EnableItem(IDM_COPY,0);
591 }
592 else{
593 //切り取り、コピー、削除を有効化
594 pobj_MainMenu->EnableItem(IDM_CUT,MF_BYCOMMAND|MF_ENABLED);
595 pobj_MainMenu->EnableItem(IDM_COPY,MF_BYCOMMAND|MF_ENABLED);
596 pobj_MainMenu->EnableItem(IDM_DELETE,MF_BYCOMMAND|MF_ENABLED);
597 EnableMenuItem(hEditMenu,IDM_CUT,MF_BYCOMMAND|MF_ENABLED);
598 EnableMenuItem(hEditMenu,IDM_COPY,MF_BYCOMMAND|MF_ENABLED);
599 EnableMenuItem(hEditMenu,IDM_DELETE,MF_BYCOMMAND|MF_ENABLED);
600 pobj_StandardToolbar->EnableItem(IDM_CUT,1);
601 pobj_StandardToolbar->EnableItem(IDM_COPY,1);
602 }
603
604 //すべて選択を有効化
605 pobj_MainMenu->EnableItem(IDM_ALLSELECT,MF_BYCOMMAND|MF_ENABLED);
606
607 if(IsClipboardFormatAvailable(CF_BITMAP)){
608 //貼り付けを有効化
609 pobj_MainMenu->EnableItem(IDM_PASTE,MF_BYCOMMAND|MF_ENABLED);
610 pobj_StandardToolbar->EnableItem(IDM_PASTE,1);
611 }
612 else{
613 //貼り付けを無効化
614 pobj_MainMenu->EnableItem(IDM_PASTE,MF_BYCOMMAND|MF_GRAYED);
615 pobj_StandardToolbar->EnableItem(IDM_PASTE,0);
616 }
617
618 ResetState_ConvMenu(0);
619 }
620
621 ResetState_UndoMenu();
622}
623void ResetState_ViewMenu(void){
624 // 表示 メニューの状態を設定
625
626
627#ifdef THETEXT
628 pobj_MainMenu->CheckMenu(IDM_RIGHT_TURN,pobj_nv->bRightTurn);
629#endif
630}
631void ResetState_PrintMenu(void){ //編集メニューの表示制御
632 HWND hChild;
633 int WndNum;
634 hChild=GetWindow(hClient,GW_CHILD);
635 if(!IsWindow(hChild)){
636 pobj_MainMenu->EnableItem(IDM_PAGESET,MF_BYCOMMAND|MF_GRAYED);
637
638 pobj_MainMenu->EnableItem(IDM_PREVIEW,MF_BYCOMMAND|MF_GRAYED);
639
640 pobj_MainMenu->EnableItem(IDM_PRINTOUT,MF_BYCOMMAND|MF_GRAYED);
641 return;
642 }
643 WndNum=GetWndNum(hChild);
644 if( WndNum != -1 )
645 {
646 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
647 pobj_MainMenu->EnableItem(IDM_PAGESET,MF_BYCOMMAND|MF_ENABLED);
648
649 pobj_MainMenu->EnableItem(IDM_PREVIEW,MF_BYCOMMAND|MF_ENABLED);
650
651 pobj_MainMenu->EnableItem(IDM_PRINTOUT,MF_BYCOMMAND|MF_ENABLED);
652 }
653 else{
654 pobj_MainMenu->EnableItem(IDM_PAGESET,MF_BYCOMMAND|MF_GRAYED);
655
656 pobj_MainMenu->EnableItem(IDM_PREVIEW,MF_BYCOMMAND|MF_GRAYED);
657
658 pobj_MainMenu->EnableItem(IDM_PRINTOUT,MF_BYCOMMAND|MF_GRAYED);
659 }
660 }
661}
662void ResetState_DocMenu(void){
663 long MenuMsg,ToolbarMsg;
664 HWND hChild;
665
666 hChild=GetWindow(hClient,GW_CHILD);
667
668
669 /////////////////////////////////////////
670 // 共通ドキュメント メニューの状態を設定
671 /////////////////////////////////////////
672
673 if(!IsWindow(hChild)){
674 MenuMsg=MF_GRAYED;
675 ToolbarMsg=0;
676 }
677 else{
678 MenuMsg=MF_ENABLED;
679 ToolbarMsg=1;
680 }
681 pobj_MainMenu->EnableItem(IDM_CLOSE,MenuMsg);
682 pobj_MainMenu->EnableItem(IDM_SAVE,MenuMsg);
683 pobj_MainMenu->EnableItem(IDM_NEWSAVE,MenuMsg);
684 pobj_MainMenu->EnableItem(IDM_CODE_SAVE,MenuMsg);
685 pobj_MainMenu->EnableItem(IDM_ALLSAVE,MenuMsg);
686
687 pobj_StandardToolbar->EnableItem(IDM_CLOSE,ToolbarMsg);
688 pobj_StandardToolbar->EnableItem(IDM_SAVE,ToolbarMsg);
689 pobj_StandardToolbar->EnableItem(IDM_ALLSAVE,ToolbarMsg);
690
691
692#ifndef THETEXT
693 /////////////////////////////////////////////////
694 // プロジェクトドキュメント メニューの状態を設定
695 /////////////////////////////////////////////////
696
697 if( projectInfo.IsOpened() ){
698 pobj_MainMenu->EnableItem(IDM_ALLSAVE,MF_ENABLED);
699 pobj_StandardToolbar->EnableItem(IDM_ALLSAVE,1);
700
701 MenuMsg=MF_ENABLED;
702 ToolbarMsg=TBSTATE_ENABLED;
703 }
704 else{
705 MenuMsg=MF_GRAYED;
706 ToolbarMsg=TBSTATE_INDETERMINATE;
707 }
708 pobj_MainMenu->EnableItem(IDM_PROJECT_SAVE,MenuMsg);
709 pobj_MainMenu->EnableItem(IDM_PROJECT_CLOSE,MenuMsg);
710 pobj_MainMenu->EnableItem(IDM_PROJECT_FOLDER_OPEN,MenuMsg);
711 pobj_MainMenu->EnableItem(IDM_PROJECT_OPTION,MenuMsg);
712
713 //デバッガ メニューの状態を設定
714 pobj_Debugger->ResetCommandEnabled();
715#endif
716
717
718 //編集メニューの状態を設定
719 ResetState_EditMenu();
720
721 //表示メニューの状態を設定
722 ResetState_ViewMenu();
723}
724void DuplicateTitleCheck(char *lpszTitle){
725 int i;
726 for(i=0;i<MdiInfo.size();i++){
727 if(MdiInfo[i]->hwnd){
728 if(lstrcmpi(MdiInfo[i]->title.c_str(),lpszTitle)==0){
729 lstrcat(lpszTitle,"_");
730 DuplicateTitleCheck(lpszTitle);
731 return;
732 }
733 }
734 }
735}
736
737//たぶんこれでは全然足りない
738inline void PathNormalize(char *buf, size_t bufSize, const char *path)
739{
740 DWORD shortFilepathLen = GetShortPathName(path, buf, bufSize);
741 std::replace(buf, buf + shortFilepathLen, '/', '\\');
742}
743
744HWND NewTextEditWindow(const char *filepath,_int8 DocumentType,COLORREF TabColor)
745{
746 int i;
747 char str[MAX_PATH],str2[32],*buffer;
748 HWND hChild,hEdit;
749 RECT rect;
750 int iCharCode=NKF_SHIFT_JIS;
751 int iLfCode=LFCODE_CRLF;
752 FILEIDENTITY fileIdentity = {0};
753
754 if(filepath){
755 HANDLE hFile=CreateFile(filepath,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
756 if(hFile==INVALID_HANDLE_VALUE){
757 sprintf(str,STRING_ERROR_CANT_FILEOPEN,filepath);
758 ::MessageBox(hOwner,str,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
759 return 0;
760 }
761 DWORD length;
762
763 typedef BOOL WINAPI GFIBH(HANDLE, LPBY_HANDLE_FILE_INFORMATION);
764 BY_HANDLE_FILE_INFORMATION fi;
765 GFIBH *const pgfibh = reinterpret_cast<GFIBH*>(
766 GetProcAddress(GetModuleHandle("kernel32"), "GetFileInformationByHandle"));
767 if(pgfibh && pgfibh(hFile, &fi)){
768 fileIdentity.VolumeSerialNumber = fi.dwVolumeSerialNumber;
769 fileIdentity.FileIndexHigh = fi.nFileIndexHigh;
770 fileIdentity.FileIndexLow = fi.nFileIndexLow;
771 length=fi.nFileSizeLow;
772 }
773 else{
774 length=GetFileSize(hFile,NULL);
775 }
776
777 //すでに指定されたファイルが開かれている場合
778 hChild=::GetWindow(hClient,GW_CHILD);
779 char shortFilepath[MAX_PATH];
780 PathNormalize(shortFilepath, MAX_PATH, filepath);
781 while(hChild){
782 i=GetWndNum(hChild);
783 if(IS_DOCUMENT_TEXT(MdiInfo[i]->DocType)){
784 if(IsFileIdentityValid(fileIdentity)&&IsFileIdentityValid(MdiInfo[i]->FileIdentity)
785 && fileIdentity==MdiInfo[i]->FileIdentity)
786 {
787 break;
788 }
789 else{
790 char shortPathnameDoc[MAX_PATH];
791 PathNormalize(shortPathnameDoc, MAX_PATH, MdiInfo[i]->path.c_str());
792 if(_strcmpi(shortFilepath,shortPathnameDoc)==0)
793 break;
794 }
795 }
796 hChild=::GetNextWindow(hChild,GW_HWNDNEXT);
797 }
798 if(hChild){
799 //前面に表示して終了
800 ::BringWindowToTop(hChild);
801 return hChild;
802 }
803
804
805 //////////////////////////////////////////////////////
806 //ファイル読み込み(正常に読み込めるかの確認も含む)
807 //////////////////////////////////////////////////////
808
809 char *temp;
810 temp=(char *)HeapAlloc(hHeap,0,length+1);
811 DWORD dw;
812 ReadFile(hFile,temp,length,&dw,NULL);
813 CloseHandle(hFile);
814 for(i=0;i<length;i++){
815 if(temp[i]=='\0') temp[i]=' ';
816 }
817 temp[length]=0;
818
819
820 ///////////////////////
821 // 改行コードを判別
822 ///////////////////////
823
824 char *temp2;
825 for(i=0;i<length;i++){
826 if(temp[i]=='\r'){
827 if(temp[i+1]=='\n')
828 iLfCode=LFCODE_CRLF;
829 else
830 iLfCode=LFCODE_CR;
831 break;
832 }
833 if(temp[i]=='\n'){
834 iLfCode=LFCODE_LF;
835 break;
836 }
837 }
838
839 //改行コードを変換
840 if(iLfCode==LFCODE_CR||iLfCode==LFCODE_LF){
841 temp2=nkf.ToCRLF(iLfCode,temp);
842 HeapDefaultFree(temp);
843 temp=temp2;
844
845 length=lstrlen(temp);
846 }
847
848
849 /////////////////////
850 // Shift-JISに変換
851 /////////////////////
852
853 buffer=(char *)HeapAlloc(hHeap,0,length*2+1);
854 nkf.pSetNkfOption("-sx"); //Shift-JISに変換(xは半角カタカナを全角に変換しないオプション)
855 nkf.pNkfConvert(buffer,temp);
856 buffer=(char *)HeapReAlloc(hHeap,0,buffer,lstrlen(buffer)+1);
857 HeapDefaultFree(temp);
858
859 //変換前の文字コードを判別
860 iCharCode=nkf.pNkfGetKanjiCode();
861 if(iCharCode<NKF_CODE_MIN||NKF_CODE_MAX<iCharCode){
862 //判別不能な場合は、Shift-JISにする
863 iCharCode=NKF_SHIFT_JIS;
864 }
865 else if(iCharCode==NKF_EUC||iCharCode==NKF_ISO_2022_JP){
866 //EUC、JISの場合で、判別不能な場合は、Shift-JISを優先
867 for(i=0;;i++){
868 if(buffer[i]=='\0'){
869 //半角コードのみ
870 iCharCode=NKF_SHIFT_JIS;
871 break;
872 }
873 if(IsDBCSLeadByte(buffer[i])) break;
874 }
875 }
876
877
878 //////////////////////////
879 // ファイルパスをセット
880 //////////////////////////
881
882 _splitpath(filepath,NULL,NULL,str,str2);
883 lstrcat(str,str2);
884 }
885 else{
886 buffer=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1);
887 extern int DocumentCounter;
888 DocumentCounter++;
889 sprintf(str,"Document[%d]",DocumentCounter);
890 }
891
892 MDICREATESTRUCT mdic;
893 mdic.szClass="MDIClientWindow_TextEdit";
894 mdic.hOwner=hInst;
895 mdic.x=CW_USEDEFAULT;
896 mdic.y=CW_USEDEFAULT;
897 mdic.cx=CW_USEDEFAULT;
898 mdic.cy=CW_USEDEFAULT;
899 mdic.szTitle=str;
900
901 hChild=::GetWindow(hClient,GW_CHILD);
902 if(::IsWindow(hChild)){
903 if(::IsZoomed(hChild)) mdic.style=WS_MAXIMIZE;
904 else mdic.style=0;
905 }
906 else{
907 if(pobj_nv->bMDIZoomed) mdic.style=WS_MAXIMIZE;
908 else mdic.style=0;
909 }
910
911 //ファイルアイコンをセット
912 SHFILEINFO shfi;
913 if(filepath)
914 SHGetFileInfo(filepath, FILE_ATTRIBUTE_ARCHIVE, &shfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_SMALLICON );
915 else shfi.hIcon=(HICON)LoadImage(hResInst,MAKEINTRESOURCE(IDI_TEXTDOCUMENT),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);;
916 mdic.lParam=(LPARAM)shfi.hIcon;
917
918 mdic.style |= WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;
919 hChild=(HWND)SendMessage(hClient,WM_MDICREATE,0,reinterpret_cast<LPARAM>(&mdic)); //ウィンドウ作成
920
921 //TextEditorコントロールを設置
922 ::GetClientRect(hChild,&rect);
923 hEdit=CreateWindow("TextEditor",NULL,
924 WS_CHILD|WS_HSCROLL|WS_VSCROLL|WS_VISIBLE,
925 0,0,0,0,
926 hChild,NULL,hInst,NULL);
927
928
929 //ウィンドウのID登録
930 MDIINFO *pmi = new MDIINFO();
931 MdiInfo.push_back( pmi );
932 i = MdiInfo.size()-1;
933 pmi->hwnd=hChild;
934 pmi->DocType=DocumentType;
935 DuplicateTitleCheck(str);
936 pmi->title = str;
937 pmi->FileIdentity = fileIdentity;
938 if(filepath)
939 {
940 pmi->path = filepath;
941 }
942 else
943 {
944 pmi->path = "";
945 }
946
947 pmi->pMdiTextEdit = new CMdiTextEdit( MdiInfo[i] );
948
949 pmi->pMdiTextEdit->hEdit=hEdit;
950 pmi->pMdiTextEdit->pobj_WebResult=new CWebResult(hChild);
951 pmi->pMdiTextEdit->pobj_Ruler=new CRuler(hChild,pmi);
952 pmi->pMdiTextEdit->hIcon=shfi.hIcon;
953 pmi->pMdiTextEdit->buffer=buffer;
954 pmi->pMdiTextEdit->pColorRef=(COLORREF *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(COLORREF)*lstrlen(buffer));
955 pmi->pMdiTextEdit->iUnderStart=-1;
956 pmi->pMdiTextEdit->iUnderEnd=-1;
957 pmi->pMdiTextEdit->StartCaretPos.x=0;
958 pmi->pMdiTextEdit->StartCaretPos.y=0;
959 pmi->pMdiTextEdit->EndCaretPos.x=0;
960 pmi->pMdiTextEdit->EndCaretPos.y=0;
961 pmi->pMdiTextEdit->Temp_UpDown_CaretXPos=-1;
962 pmi->pMdiTextEdit->bAutoScroll=0;
963 pmi->pMdiTextEdit->iWidth_ControlTabSpace=
964 GetControlTabSpace(i,&pmi->pMdiTextEdit->iLineNumberTextCount);
965 pmi->pMdiTextEdit->iCharCode=iCharCode;
966 pmi->pMdiTextEdit->iLfCode=iLfCode;
967 pmi->IndentStr=0;
968
969
970 int flag;
971 if(mdic.style&WS_MAXIMIZE) flag=SIZE_MAXIMIZED;
972 else flag=0;
973 SendTextEditResizeEvent(hChild);
974
975
976 //ワードカラーをセット
977 if(IS_DOCUMENT_TEXT(DocumentType)) SetTextEditWordColor(MdiInfo.size()-1);
978
979 //Docコンボボックスに追加
980 extern HWND hDocCombo;
981 if( hDocCombo )
982 {
983 i=SendMessage(hDocCombo,CB_ADDSTRING,0,(long)str);
984 SendMessage(hDocCombo,CB_SETCURSEL,i,0);
985 }
986
987 //タブに追加
988 pobj_MainTab->InsertItem( str, true, TabColor );
989
990 ::SetFocus(hEdit);
991 SetStatusText(NULL);
992
993 //メニュー状態を設定
994 ResetState_DocMenu();
995
996 if( DocumentType == WNDTYPE_BASIC && !projectInfo.IsOpened() ){
997 // 単体ソースコードを開いたとき
998 extern HWND hProjectView;
999 if( !::IsWindowVisible( hProjectView ) ){
1000 // クラスビューを表示する
1001 SendMessage(hOwner,WM_COMMAND,IDM_PROJECTVIEW,0);
1002 ShowClassView();
1003
1004 // クラスビューを更新
1005 ResetClassTree((HTREEITEM)-1);
1006 }
1007 }
1008
1009 return hChild;
1010}
1011void CloseDocWindow(int WndNum){
1012 int i2,i3;
1013
1014 MdiInfo[WndNum]->hwnd=0;
1015
1016 //ドキュメントコンボボックスから文字列を消去
1017 extern HWND hDocCombo;
1018 i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(long)MdiInfo[WndNum]->title.c_str());
1019 SendMessage(hDocCombo,CB_DELETESTRING,i2,0);
1020
1021 //タブコントロールからアイテムを消去
1022 if(pobj_MainTab) pobj_MainTab->DeleteItem( MdiInfo[WndNum]->title.c_str(), true );
1023
1024
1025 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
1026 ////////////////////////////
1027 // テキストエディタを閉じる
1028 ////////////////////////////
1029
1030 extern COMPLEMENT_WINDOW_INFO ComplementWndInfo;
1031 if(ComplementWndInfo.hWnd){
1032 //コード補完リストを破棄する
1033 DestroyWindow(ComplementWndInfo.hWnd);
1034 ComplementWndInfo.hWnd=0;
1035 }
1036
1037 HeapDefaultFree(MdiInfo[WndNum]->pMdiTextEdit->buffer);
1038 HeapDefaultFree(MdiInfo[WndNum]->pMdiTextEdit->pColorRef);
1039
1040 if(MdiInfo[WndNum]->IndentStr) HeapDefaultFree(MdiInfo[WndNum]->IndentStr);
1041
1042 //エディットコントロールを破棄
1043 DestroyWindow(MdiInfo[WndNum]->pMdiTextEdit->hEdit);
1044
1045 //Web検索ウィンドウを破棄
1046 delete MdiInfo[WndNum]->pMdiTextEdit->pobj_WebResult;
1047 MdiInfo[WndNum]->pMdiTextEdit->pobj_WebResult=0;
1048
1049 //ルーラーウィンドウを破棄
1050 delete MdiInfo[WndNum]->pMdiTextEdit->pobj_Ruler;
1051 MdiInfo[WndNum]->pMdiTextEdit->pobj_Ruler=0;
1052
1053 //アイコンを破棄
1054 if(MdiInfo[WndNum]->pMdiTextEdit->hIcon) DestroyIcon(MdiInfo[WndNum]->pMdiTextEdit->hIcon);
1055
1056 delete MdiInfo[WndNum]->pMdiTextEdit;
1057 MdiInfo[WndNum]->pMdiTextEdit=0;
1058 }
1059 else if(MdiInfo[WndNum]->DocType==WNDTYPE_RAD){
1060 /////////////////////
1061 // RADツールを閉じる
1062 /////////////////////
1063
1064 for(i2=0;i2<MAX_UNDONUM;i2++){
1065 if(MdiInfo[WndNum]->MdiRadInfo->undo.Command[i2])
1066 Rad_DeleteUndoData(WndNum,i2);
1067 }
1068 DestroyWindow(MdiInfo[WndNum]->MdiRadInfo->hTools);
1069 DestroyWindow(MdiInfo[WndNum]->MdiRadInfo->hRad);
1070 SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,MdiInfo[WndNum]->MdiRadInfo->hOldBitmap);
1071 DeleteDC(MdiInfo[WndNum]->MdiRadInfo->hMemDC);
1072 DeleteObject(MdiInfo[WndNum]->MdiRadInfo->hBitmap);
1073 GlobalFree(MdiInfo[WndNum]->MdiRadInfo);
1074 }
1075 else if(MdiInfo[WndNum]->DocType==WNDTYPE_MENU){
1076 ////////////////////////////
1077 // メニューエディタを閉じる
1078 ////////////////////////////
1079
1080 DestroyWindow(MdiInfo[WndNum]->MdiMenuInfo->hList);
1081 GlobalFree(MdiInfo[WndNum]->MdiMenuInfo);
1082 }
1083 else if(MdiInfo[WndNum]->DocType==WNDTYPE_ICONEDIT){
1084 ////////////////////////////
1085 // アイコンエディタを閉じる
1086 ////////////////////////////
1087
1088 for(i2=0;i2<MdiInfo[WndNum]->MdiIconEditInfo->num;i2++){
1089 for(i3=0;i3<MAX_ICONEDIT_UNDONUM;i3++){
1090 if(MdiInfo[WndNum]->MdiIconEditInfo->undo[i2].lpData[i3])
1091 HeapDefaultFree(MdiInfo[WndNum]->MdiIconEditInfo->undo[i2].lpData[i3]);
1092 }
1093 }
1094
1095 DeleteDC(MdiInfo[WndNum]->MdiIconEditInfo->memdc);
1096 DeleteObject(MdiInfo[WndNum]->MdiIconEditInfo->hMemBmp);
1097 DestroyWindow(MdiInfo[WndNum]->MdiIconEditInfo->hMain);
1098 for(i2=0;i2<MdiInfo[WndNum]->MdiIconEditInfo->num;i2++){
1099 HeapDefaultFree(MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[i2]);
1100 }
1101 HeapDefaultFree(MdiInfo[WndNum]->MdiIconEditInfo);
1102 }
1103 else
1104 {
1105 throw;
1106 }
1107
1108 delete MdiInfo[WndNum];
1109 Jenga::Common::EraseVectorItem<std::vector<MDIINFO *>>( MdiInfo, WndNum );
1110}
1111void ResizeTextEditWnd(HWND hwnd,int cx,int cy){
1112 int WndNum;
1113 WndNum=GetWndNum(hwnd);
1114 if(WndNum==-1) return;
1115
1116 int WebResultWndHeight;
1117 WebResultWndHeight=LINK_ITEM_HEIGHT;
1118 //未完成
1119 WebResultWndHeight=0;
1120
1121 int iHeightRuler;
1122 if(pobj_nv->bEditor_Ruler){
1123 //ルーラー
1124 MdiInfo[WndNum]->pMdiTextEdit->pobj_Ruler->resize(
1125 0,
1126 0,
1127 cx,
1128 HEIGHT_RULER);
1129
1130 iHeightRuler=HEIGHT_RULER;
1131
1132 ShowWindow(MdiInfo[WndNum]->pMdiTextEdit->pobj_Ruler->hRulerWnd,SW_SHOW);
1133 }
1134 else{
1135 iHeightRuler=0;
1136
1137 ShowWindow(MdiInfo[WndNum]->pMdiTextEdit->pobj_Ruler->hRulerWnd,SW_HIDE);
1138 }
1139
1140 //エディットウィンドウ
1141 MoveWindow(MdiInfo[WndNum]->pMdiTextEdit->hEdit,
1142 0,
1143 iHeightRuler,
1144 cx,
1145 cy-WebResultWndHeight-iHeightRuler,
1146 1);
1147
1148 //Web検索ウィンドウ
1149 MdiInfo[WndNum]->pMdiTextEdit->pobj_WebResult->resize(
1150 0,
1151 cy-WebResultWndHeight,
1152 cx,
1153 WebResultWndHeight);
1154}
1155LRESULT CALLBACK MDIClientWindow_TextEdit(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
1156 int i,i2;
1157 HWND hEdit;
1158
1159 switch(message){
1160 case WM_CREATE:
1161 CREATESTRUCT *lpcs;
1162 lpcs=(CREATESTRUCT *)lParam;
1163 MDICREATESTRUCT *lpmcs;
1164 lpmcs=(MDICREATESTRUCT *)lpcs->lpCreateParams;
1165 SendMessage(hwnd,WM_SETICON,ICON_SMALL,(LPARAM)lpmcs->lParam);
1166 break;
1167 case WM_MDIACTIVATE:
1168 //以前のMDIウィンドウのパラメータ ヒントを破棄する
1169 if(MethodCheckInfo.hWnd){
1170 DestroyWindow(MethodCheckInfo.hWnd);
1171 MethodCheckInfo.hWnd=0;
1172 }
1173
1174 //以前のコード補完リストを破棄する
1175 if(ComplementWndInfo.hWnd){
1176 DestroyWindow(ComplementWndInfo.hWnd);
1177 ComplementWndInfo.hWnd=0;
1178 }
1179
1180 if(!lParam) return 0;
1181 i=GetWndNum((HWND)lParam);
1182 if(i==-1) return 0; //ウィンドウが初期状態の場合
1183
1184#ifndef THETEXT
1185 //デバッガ メニューの状態を設定
1186 pobj_Debugger->ResetCommandEnabled();
1187#endif
1188
1189 //ドキュメント セレクト コンボボックス
1190 extern HWND hDocCombo;
1191 i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(long)MdiInfo[i]->title.c_str());
1192 SendMessage(hDocCombo,CB_SETCURSEL,i2,0);
1193
1194 //タブコントロール
1195 pobj_MainTab->MdiActiveEvent(MdiInfo[i]->title.c_str());
1196
1197 if( !projectInfo.IsOpened() ){
1198 ResetClassTree((HTREEITEM)-1);
1199 }
1200
1201 return 0;
1202 case WM_SETFOCUS:
1203 hEdit=GetWindow(hwnd,GW_CHILD);
1204 SetFocus(hEdit);
1205 SetStatusText(CmdMsg);
1206 ResetState_EditMenu();
1207 ResetState_ViewMenu();
1208 break;
1209 case WM_SIZE:
1210 ResizeTextEditWnd(hwnd,LOWORD(lParam),HIWORD(lParam));
1211 break;
1212 case WM_CLOSE:
1213 if(!DocumentModifyCheck(hwnd)) return 0;
1214 CloseDocWindow(GetWndNum(hwnd));
1215 pobj_nv->bMDIZoomed=IsZoomed(hwnd);
1216 i=DefMDIChildProc(hwnd,message,wParam,lParam);
1217
1218 //メニュー状態を設定
1219 ResetState_DocMenu();
1220
1221 return i;
1222 }
1223 return DefMDIChildProc(hwnd,message,wParam,lParam);
1224}
1225
1226WNDPROC oldMainFrameWndProc;
1227LRESULT CALLBACK WindowFunc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
1228 char str[MAX_PATH];
1229 RECT rect;
1230 POINT pos;
1231
1232 if(message==WM_COMMAND&&IS_FILEHISTORY_COMMAND(LOWORD(wParam))){
1233 //「最近使ったファイル」メニューコマンド
1234 lstrcpy(str,pobj_nv->pobj_History->lpszPath[LOWORD(wParam)-100]);
1235 OpenFileWithExtension(str);
1236 return 0;
1237 }
1238
1239 if(message==WM_COMMAND&&200<=LOWORD(wParam)&&LOWORD(wParam)<=299){
1240 //「最近使ったプロジェクト」メニューコマンド
1241 lstrcpy(str,pobj_nv->pobj_ProjectHistory->lpszPath[LOWORD(wParam)-200]);
1242 OpenFileWithExtension(str);
1243 return 0;
1244 }
1245
1246 switch(message)
1247 {
1248
1249#ifndef THETEXT
1250 case WM_SETCOMPILEVIEW:
1251 //コンパイラウィンドウ(埋め込み型)が表示されたとき
1252 hCompileView=(HWND)lParam;
1253 ActiveBasic::IDE::Program::mainFrame.Resized();
1254 return 0;
1255 case WM_DESTROYCOMPILEVIEW:
1256 //コンパイラウィンドウ(埋め込み型)が破棄されたとき
1257 if((int)hCompileView==-1){
1258 //すぐに次のコンパイラウィンドウが起動するとき
1259 hCompileView=0;
1260 }
1261 else{
1262 //完全にコンパイラウィンドウを閉じたときはリサイズ
1263 hCompileView=0;
1264
1265 ActiveBasic::IDE::Program::mainFrame.Resized();
1266 }
1267 return 0;
1268
1269 case WM_SETDEBUGGERBASE:
1270 //デバッガベースウィンドウ(埋め込み型)が表示されたとき
1271 pobj_Debugger->begin();
1272
1273 //BasicCompiler.exeの強制終了を考慮
1274 SetTimer(hOwner,ID_DEBUGSAFTY,1000,NULL);
1275
1276 return 0;
1277 case WM_DESTROYDEBUGGERBASE:
1278 //BasicCompiler.exeの強制終了を考慮
1279 KillTimer(hOwner,ID_DEBUGSAFTY);
1280
1281 //デバッガベースウィンドウ(埋め込み型)が破棄されたとき
1282 pobj_Debugger->end();
1283
1284 return 0;
1285
1286 case WM_SETDEBUGGERVIEW:
1287 //デバッガウィンドウ(埋め込み型)が表示されたとき
1288 pobj_Debugger->watch_start((HWND)lParam);
1289 ActiveBasic::IDE::Program::mainFrame.Resized();
1290 return 0;
1291 case WM_DESTROYDEBUGGERVIEW:
1292 //デバッガウィンドウ(埋め込み型)が破棄されたとき
1293 pobj_Debugger->watch_quit();
1294 ActiveBasic::IDE::Program::mainFrame.Resized();
1295 return 0;
1296#endif
1297
1298
1299 case WM_MOUSEMOVE:
1300 static DWORD dwDragLever;
1301 static POINT PrevMousePos;
1302 static int start;
1303
1304 pos.x=(long)(short)LOWORD(lParam);
1305 pos.y=(long)(short)HIWORD(lParam);
1306 ClientToScreen(hwnd,&pos);
1307
1308 if(dwDragLever){
1309 GetClientRect(hwnd,&rect);
1310
1311 if(dwDragLever==1){
1312 //プロジェクトビューをリサイズ中
1313 pobj_nv->width_ClipProjectView=start+pos.x-PrevMousePos.x;
1314 if(pobj_nv->width_ClipProjectView<100) pobj_nv->width_ClipProjectView=100;
1315 if(rect.right-100<pobj_nv->width_ClipProjectView) pobj_nv->width_ClipProjectView=rect.right-100;
1316 }
1317 else if(dwDragLever==2){
1318 //デバッガビューをリサイズ中
1319 pobj_nv->height_ClipDebuggerView=start+PrevMousePos.y-pos.y;
1320 if(pobj_nv->height_ClipDebuggerView<60) pobj_nv->height_ClipDebuggerView=60;
1321 if(rect.bottom-100<pobj_nv->height_ClipCompileView+pobj_nv->height_ClipDebuggerView)
1322 pobj_nv->height_ClipDebuggerView=rect.bottom-100-pobj_nv->height_ClipCompileView;
1323 }
1324 else if(dwDragLever==3){
1325 //コンパイラビューをリサイズ中
1326 pobj_nv->height_ClipCompileView=start+PrevMousePos.y-pos.y;
1327 if(pobj_nv->height_ClipCompileView<60) pobj_nv->height_ClipCompileView=60;
1328 if(rect.bottom-100<pobj_nv->height_ClipCompileView)
1329 pobj_nv->height_ClipCompileView=rect.bottom-100;
1330 }
1331 else if(dwDragLever==4){
1332 //SideWebをリサイズ中
1333 pobj_nv->width_WebSearchView=start+PrevMousePos.x-pos.x;
1334 if(pobj_nv->width_WebSearchView<100) pobj_nv->width_WebSearchView=100;
1335 if(rect.right-100<pobj_nv->width_WebSearchView) pobj_nv->width_WebSearchView=rect.right-100;
1336 }
1337
1338 ActiveBasic::IDE::Program::mainFrame.Resized();
1339 UpdateWindow(hwnd);
1340 }
1341 if(pobj_nv->bClipProjectView&&IsWindowVisible(hProjectView)){
1342 //プロジェクトビューとMDIクライアントの境目のサイズ変更ライン
1343 GetWindowRect(hProjectView,&rect);
1344 if(rect.top<=pos.y&&pos.y<=rect.bottom&&
1345 rect.right<=pos.x&&pos.x<=rect.right+LEVER_THICK){
1346 SetCursor(LoadCursor(0,IDC_SIZEWE));
1347 }
1348 }
1349#ifndef THETEXT
1350 if(bClipCompileView&&pobj_Debugger->IsDebuggerView()){
1351 //デバッガビューとMDIクライアントの境目のサイズ変更ライン
1352 GetWindowRect(pobj_Debugger->hwnd,&rect);
1353 if(rect.left<=pos.x&&pos.x<=rect.right&&
1354 rect.top-LEVER_THICK<=pos.y&&pos.y<=rect.top){
1355 SetCursor(LoadCursor(0,IDC_SIZENS));
1356 }
1357 }
1358 if(bClipCompileView&&IsWindowVisible(hCompileView)){
1359 //コンパイラビューとMDIクライアントの境目のサイズ変更ライン
1360 GetWindowRect(hCompileView,&rect);
1361 if(rect.left<=pos.x&&pos.x<=rect.right&&
1362 rect.top-LEVER_THICK<=pos.y&&pos.y<=rect.top){
1363 SetCursor(LoadCursor(0,IDC_SIZENS));
1364 }
1365 }
1366#endif
1367 if( pobj_SideWeb )
1368 {
1369 if(pobj_SideWeb->bShow){
1370 //SideWebとMDIクライアントの境目のサイズ変更ライン
1371 pobj_SideWeb->GetRect(&rect);
1372 ClientToScreen(hwnd,&rect);
1373 if(rect.top<=pos.y&&pos.y<=rect.bottom&&
1374 rect.left-LEVER_THICK<=pos.x&&pos.x<=rect.left){
1375 SetCursor(LoadCursor(0,IDC_SIZEWE));
1376 }
1377 }
1378 }
1379 return 0;
1380 case WM_LBUTTONDOWN:
1381 pos.x=LOWORD(lParam);
1382 pos.y=HIWORD(lParam);
1383 ClientToScreen(hwnd,&pos);
1384
1385 if(pobj_nv->bClipProjectView&&IsWindowVisible(hProjectView)){
1386 //プロジェクトビューとMDIクライアントの境目のサイズ変更ライン
1387 GetWindowRect(hProjectView,&rect);
1388 if(rect.top<=pos.y&&pos.y<=rect.bottom&&
1389 rect.right<=pos.x&&pos.x<=rect.right+LEVER_THICK){
1390 SetCursor(LoadCursor(0,IDC_SIZEWE));
1391
1392 dwDragLever=1;
1393 SetCapture(hwnd);
1394
1395 PrevMousePos=pos;
1396 start=pobj_nv->width_ClipProjectView;
1397 }
1398 }
1399#ifndef THETEXT
1400 if(bClipCompileView&&pobj_Debugger->IsDebuggerView()){
1401 //デバッガビューとMDIクライアントの境目のサイズ変更ライン
1402 GetWindowRect(pobj_Debugger->hwnd,&rect);
1403 if(rect.left<=pos.x&&pos.x<=rect.right&&
1404 rect.top-LEVER_THICK<=pos.y&&pos.y<=rect.top){
1405 SetCursor(LoadCursor(0,IDC_SIZENS));
1406
1407 dwDragLever=2;
1408 SetCapture(hwnd);
1409
1410 PrevMousePos=pos;
1411 start=pobj_nv->height_ClipDebuggerView;
1412 }
1413 }
1414 if(bClipCompileView&&IsWindowVisible(hCompileView)){
1415 //コンパイラビューとMDIクライアントの境目のサイズ変更ライン
1416 GetWindowRect(hCompileView,&rect);
1417 if(rect.left<=pos.x&&pos.x<=rect.right&&
1418 rect.top-LEVER_THICK<=pos.y&&pos.y<=rect.top){
1419 SetCursor(LoadCursor(0,IDC_SIZENS));
1420
1421 dwDragLever=3;
1422 SetCapture(hwnd);
1423
1424 PrevMousePos=pos;
1425 start=pobj_nv->height_ClipCompileView;
1426 }
1427 }
1428#endif
1429 if( pobj_SideWeb && pobj_SideWeb->bShow){
1430 //SideWebとMDIクライアントの境目のサイズ変更ライン
1431 pobj_SideWeb->GetRect(&rect);
1432 ClientToScreen(hwnd,&rect);
1433 if(rect.top<=pos.y&&pos.y<=rect.bottom&&
1434 rect.left-LEVER_THICK<=pos.x&&pos.x<=rect.left){
1435 SetCursor(LoadCursor(0,IDC_SIZENS));
1436
1437 dwDragLever=4;
1438 SetCapture(hwnd);
1439
1440 PrevMousePos=pos;
1441 start=pobj_nv->width_WebSearchView;
1442 }
1443 }
1444 return 0;
1445 case WM_LBUTTONUP:
1446 if(dwDragLever){
1447 dwDragLever=0;
1448 ReleaseCapture();
1449 }
1450 return 0;
1451
1452
1453 case WM_SYSCOMMAND:
1454 //ウィンドウの最小化前にウィンドウ位置を保存
1455 if(wParam==SC_MINIMIZE){
1456 if(IsZoomed(hwnd)) pobj_nv->bWindowMax=1;
1457 else if(!IsIconic(hwnd)){
1458 pobj_nv->bWindowMax=0;
1459 GetWindowRect(hwnd,&pobj_nv->StartupWindowRect);
1460 }
1461 }
1462 break; //処理をDefFrameProcへ
1463 }
1464
1465 return CallWindowProc( oldMainFrameWndProc, hwnd, message, wParam, lParam );
1466}
1467
1468int RegWndClass(WNDPROC WndProc,char *lpClassName,HBRUSH hBackBrush,DWORD dwFlag){
1469 WNDCLASSEX wcl;
1470
1471 wcl.cbSize=sizeof(WNDCLASSEX);
1472 wcl.hInstance=hInst;
1473 wcl.lpszClassName=lpClassName;
1474 wcl.lpfnWndProc=WndProc;
1475
1476 if(dwFlag&FLAG_DBLCLK) wcl.style=CS_DBLCLKS;
1477 else wcl.style=0;
1478
1479 wcl.hIcon=LoadIcon(NULL,IDI_APPLICATION);
1480 wcl.hIconSm=LoadIcon(NULL,IDI_WINLOGO);
1481
1482 if(dwFlag&FLAG_BEAMCURSOR) wcl.hCursor=LoadCursor(NULL,IDC_IBEAM);
1483 else wcl.hCursor=LoadCursor(NULL,IDC_ARROW);
1484
1485 wcl.lpszMenuName=NULL;
1486 wcl.cbClsExtra=0;
1487 wcl.cbWndExtra=0;
1488 wcl.hbrBackground=hBackBrush;
1489
1490 return RegisterClassEx(&wcl);
1491}
1492int PASCAL WinMain(HINSTANCE hThisInst,HINSTANCE,LPSTR lpCmdLine,int ShowCmd){
1493#ifdef _DEBUG
1494 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_DELAY_FREE_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
1495#endif
1496 int i,i2,IsStr;
1497 char str[MAX_PATH],str2[MAX_PATH],dummy[1024];
1498 MSG msg;
1499 HACCEL hAccel;
1500
1501 hInst=hThisInst;
1502 if(!SetupProjectEditor()) return 0;
1503
1504 HBRUSH hGrayBrush_LineNumber;
1505 hGrayBrush_LineNumber=CreateSolidBrush(RGB(220,220,220));
1506
1507 //if(!RegWndClass(WindowFunc,"ProjectEditorClass",(HBRUSH)COLOR_APPWORKSPACE+1,FLAG_DBLCLK)) return 0;
1508 if(!RegWndClass(MDIClientWindow_TextEdit,"MDIClientWindow_TextEdit",(HBRUSH)GetStockObject(WHITE_BRUSH),FLAG_DBLCLK)) return 0;
1509 if(!RegWndClass(MethodCheckWindow,"MethodCheckWindow",(HBRUSH)GetStockObject(WHITE_BRUSH),FLAG_DBLCLK)) return 0;
1510 if(!RegWndClass(MDIClientWindow_Rad,"MDIClientWindow_Rad",(HBRUSH)GetStockObject(WHITE_BRUSH),FLAG_DBLCLK)) return 0;
1511 if(!RegWndClass(RadToolsWindow,"RadToolsWindow",h3DFaceBackBrush,FLAG_DBLCLK)) return 0;
1512 if(!RegWndClass(RadPropertyWindow,"RadPropertyWindow",h3DFaceBackBrush,FLAG_DBLCLK)) return 0;
1513 if(!RegWndClass(RadWindow,"RadWindow",(HBRUSH)GetStockObject(NULL_BRUSH),FLAG_DBLCLK)) return 0;
1514 if(!RegWndClass(TestWindowProc,"TestWindow",h3DFaceBackBrush,FLAG_DBLCLK)) return 0;
1515 if(!RegWndClass(MDIClientWindow_Menu,"MDIClientWindow_Menu",(HBRUSH)GetStockObject(WHITE_BRUSH),FLAG_DBLCLK)) return 0;
1516 if(!RegWndClass(MenuEditWindow,"MenuEditWindow",h3DFaceBackBrush,FLAG_DBLCLK)) return 0;
1517 if(!RegWndClass(MDIClientWindow_IconEdit,"MDIClientWindow_IconEdit",h3DFaceBackBrush,FLAG_DBLCLK)) return 0;
1518 if(!RegWndClass(IconEditWindowProc,"IconEditWindowProc",(HBRUSH)GetStockObject(WHITE_BRUSH),0)) return 0;
1519 if(!RegWndClass(ProjectViewProc,"ProjectView",h3DFaceBackBrush,FLAG_DBLCLK)) return 0;
1520 if(!RegWndClass(ProjectView_ToolWindowProc,"ProjectView_ToolWindow",h3DFaceBackBrush,FLAG_DBLCLK)) return 0;
1521 if(!RegWndClass(TextEditProc,"TextEditor",(HBRUSH)GetStockObject(NULL_BRUSH),FLAG_DBLCLK|FLAG_BEAMCURSOR)) return 0;
1522 if(!RegWndClass(ComplementWindow,"ComplementWindow",(HBRUSH)GetStockObject(BLACK_BRUSH),FLAG_DBLCLK)) return 0;
1523 if(!RegWndClass(PreviewWndProc,"PreviewWindow",(HBRUSH)GetStockObject(GRAY_BRUSH),FLAG_DBLCLK)) return 0;
1524
1525 //Web検索用のウィンドウクラス
1526 if(!RegWndClass(WebResultWndProc,"WebResult",(HBRUSH)COLOR_APPWORKSPACE+1,FLAG_DBLCLK)) return 0;
1527 if(!RegWndClass(OneTabProc,"OneTab",(HBRUSH)COLOR_APPWORKSPACE+1,FLAG_DBLCLK)) return 0;
1528 if(!RegWndClass(ResultListProc,"ResultList",(HBRUSH)COLOR_APPWORKSPACE+1,FLAG_DBLCLK)) return 0;
1529
1530 //ルーラーのウィンドウクラス
1531 if(!RegWndClass(RulerProc,"Ruler",(HBRUSH)COLOR_APPWORKSPACE+1,FLAG_DBLCLK)) return 0;
1532
1533 //SideWebのウィンドウクラス
1534 if(!RegWndClass(SideWebProc,"SideWeb",(HBRUSH)COLOR_APPWORKSPACE+1,FLAG_DBLCLK)) return 0;
1535
1536 ActiveBasic::IDE::Program::Main();
1537
1538 //return 0;
1539
1540
1541 hAccel=LoadAccelerators(hResInst,MAKEINTRESOURCE(IDR_ACCELERATOR1));
1542
1543 //メインウィンドウ
1544 RECT *prc;
1545 prc=&pobj_nv->StartupWindowRect;
1546 /*
1547 hOwner=CreateWindowEx(WS_EX_ACCEPTFILES,"ProjectEditorClass",APPLICATION_NAME,
1548 WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN,
1549 prc->left, prc->top,
1550 prc->right-prc->left, prc->bottom-prc->top,
1551 HWND_DESKTOP,pobj_MainMenu->hMenu,hInst,NULL);
1552 */
1553
1554 //バックアップ用タイマーを設定(10秒に一回)
1555 SetTimer(hOwner,ID_TIMER_BACKUP,10000,NULL);
1556
1557 SendMessage(hOwner,WM_SETICON,ICON_SMALL,(long)hOwnerIcon);
1558 SetClipboardViewer(hOwner);
1559
1560 if(pobj_nv->bWindowMax) ShowWindow(hOwner,SW_MAXIMIZE);
1561 else ShowWindow(hOwner,ShowCmd);
1562 UpdateWindow(hOwner);
1563
1564 int open_sw=0;
1565 if(lstrlen(lpCmdLine)>0){
1566 lstrcpy(dummy,lpCmdLine);
1567 for(i=0,i2=0,IsStr=0;;i++,i2++){
1568 if(dummy[i]=='\"'){
1569 if(IsStr==0) IsStr=1;
1570 else IsStr=0;
1571 i++;
1572 }
1573 if((dummy[i]==' '&&IsStr==0)||dummy[i]=='\0'){
1574 str[i2]=0;
1575 if(!(strstr(str,":")||strstr(str,"\\\\"))){
1576 lstrcpy(str2,str);
1577 GetCurrentDirectory(MAX_PATH,str);
1578 lstrcat(str,"\\");
1579 lstrcat(str,str2);
1580 }
1581 ShortPathToLongPath(str,str2);
1582 OpenFileWithExtension(str2);
1583 open_sw=1;
1584 if(dummy[i]=='\0') break;
1585 i2=-1;
1586 continue;
1587 }
1588 str[i2]=dummy[i];
1589 }
1590 }
1591
1592 BOOL bRestore=0;
1593
1594
1595 {
1596 //自動バックアップ及び復元機能
1597
1598 //必要であれば復元
1599 bRestore=restore();
1600 }
1601
1602
1603#ifdef THETEXT
1604 if(open_sw==0&&bRestore==0){
1605 //ファイルが開かれなかったとき
1606 NewTextEditWindow(NULL,WNDTYPE_TEXT);
1607 }
1608#endif
1609
1610
1611 while(GetMessage(&msg,NULL,0,0)){
1612
1613 if(!TranslateAccelerator(hOwner,hAccel,&msg)){
1614 if( projectInfo.IsOpened() ){
1615 for(i=0,i2=0;i<MdiInfo.size();i++){
1616 if(MdiInfo[i]->hwnd&&MdiInfo[i]->DocType==WNDTYPE_RAD){
1617 if(IsDialogMessage(MdiInfo[i]->MdiRadInfo->hProp_Dlg,&msg)) i2=1;
1618 }
1619 }
1620 if(i2==0){
1621 if(!TranslateMDISysAccel(hClient,&msg)){
1622 TranslateMessage(&msg);
1623 DispatchMessage(&msg);
1624 }
1625 }
1626 }
1627 else{
1628 if(!TranslateMDISysAccel(hClient,&msg)){
1629 TranslateMessage(&msg);
1630 DispatchMessage(&msg);
1631 }
1632 }
1633 }
1634 }
1635
1636 DeleteObject(hGrayBrush_LineNumber);
1637
1638#if defined HeapAlloc
1639 CheckHeapCheck();
1640#endif
1641
1642 return msg.wParam;
1643}
Note: See TracBrowser for help on using the repository browser.