source: dev/ProjectEditor/ProjectEditor.cpp @ 24

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

保存されていないドキュメントのタブに(*)をつける機能に対応。
MDITEXTEDITINFOをCMdiTextEditに変更。今後、オブジェクト指向化を進める。

File size: 89.4 KB
Line 
1#include "ProjectEditor.h"
2
3
4#if defined HeapAlloc
5#define MEM_MAX 65536
6LPVOID pCheckMem[MEM_MAX];
7int now;
8#undef HeapAlloc
9#undef HeapReAlloc
10LPVOID CheckHeapAlloc(HANDLE hf,DWORD dwFlags,DWORD dwBytes){
11    LPVOID ret;
12    ret=HeapAlloc(hf,dwFlags,dwBytes);
13    pCheckMem[now]=ret;
14
15    //この部分にnowのチェックを挿入
16
17
18    now++;
19    if(now>=MEM_MAX){
20        MessageBox(0,"pCheckMemの最大値を超えました","Check",0);
21    }
22    return ret;
23}
24LPVOID CheckHeapReAlloc(HANDLE hf,DWORD dwFlags,LPVOID lpMem,DWORD dwBytes){
25    int i;
26    LPVOID ret;
27    for(i=0;;i++){
28        if(lpMem==pCheckMem[i]) break;
29        if(i>=MEM_MAX){
30            MessageBox(0,"エラー","CheckHeapReAlloc",0);
31            break;
32        }
33    }
34    ret=HeapReAlloc(hf,dwFlags,lpMem,dwBytes);
35    pCheckMem[i]=ret;
36    return ret;
37}
38void HeapDefaultFree(LPVOID lpMem){
39    int i;
40    for(i=0;;i++){
41        if(lpMem==pCheckMem[i]) break;
42        if(i>=MEM_MAX){
43            MessageBox(0,"エラー","HeapDefaultFree",0);
44            break;
45        }
46    }
47    pCheckMem[i]=0;
48    HeapFree(hHeap,0,lpMem);
49}
50void CheckHeapCheck(){
51    int i,i2;
52    char temp[100];
53    temp[0]=0;
54    for(i=0,i2=0;i<MEM_MAX;i++){
55        if(pCheckMem[i]){
56            sprintf(temp+lstrlen(temp),"%d\r\n",i);
57            i2++;
58            if(i2==10){
59                lstrcat(temp,"これ以上の未解放が確認されています");
60                break;
61            }
62        }
63    }
64    if(temp[0]) MessageBox(0,temp,"Check - BasicCompiler.exe",0);
65}
66#define HeapAlloc CheckHeapAlloc
67#define HeapReAlloc CheckHeapReAlloc
68#else
69void HeapDefaultFree(LPVOID lpMem){
70    HeapFree(hHeap,0,lpMem);
71}
72#endif
73
74#ifdef DeleteObject
75#undef DeleteObject
76BOOL CheckDeleteObject(HGDIOBJ hObject){
77    BOOL bRet;
78    bRet=DeleteObject(hObject);
79
80    if(bRet==0){
81        MessageBox(0,"DeleteObject Error","Check",0);
82    }
83    return bRet;
84}
85#define DeleteObject CheckDeleteObject
86#endif
87
88
89void ToBigChar(char str[]){
90    int i;
91    for(i=0;TRUE;i++){
92        str[i]=(char)toupper((int)str[i]);
93        if(str[i]=='\0') break;
94    }
95}
96int GetWndNum(HWND hChild){
97    int i;
98    if(!IsWindow(hChild)) return -1;
99    for(i=0;i<MAX_WNDNUM;i++){
100        if(hChild==MdiInfo[i].hwnd) break;
101    }
102    if(i==MAX_WNDNUM) i=-1;
103    return i;
104}
105int GetNowWndNum(void){
106    return GetWndNum(GetWindow(hClient,GW_CHILD));
107}
108int GetFileNum(int WndNum){
109    int i;
110    char temporary[MAX_PATH];
111    for(i=0;i<ProjectInfo.pobj_DBFileInfo->iNum;i++){
112
113        ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->GetFullPath(temporary);
114
115        if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0) return i;
116    }
117    return -1;
118}
119
120void SendTextEditResizeEvent(HWND hwnd){
121    RECT rect;
122    GetClientRect(hwnd,&rect);
123    ResizeTextEditWnd(hwnd,rect.right,rect.bottom);
124}
125
126void RedrawAllWindow(void){
127    HWND hChild;
128    hChild=GetWindow(hClient,GW_CHILD);
129    if(hChild) ResetTextEditFont(GetWindow(hChild,GW_CHILD));
130    while(hChild){
131        int WndNum;
132        WndNum=GetWndNum(hChild);
133        if(WndNum==-1) break;
134
135        if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
136            //コントロールタブスペースの幅と行番号の文字数を更新
137            MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace=
138                GetControlTabSpace(WndNum,&MdiInfo[WndNum].pMdiTextEdit->iLineNumberTextCount);
139
140            InvalidateRect(MdiInfo[WndNum].pMdiTextEdit->hEdit,NULL,0);
141            InvalidateRect(MdiInfo[WndNum].pMdiTextEdit->pobj_Ruler->hRulerWnd,NULL,0);
142
143            SendTextEditResizeEvent(MdiInfo[WndNum].hwnd);
144        }
145        else{
146            HWND hEdit;
147            hEdit=GetWindow(hChild,GW_CHILD);
148            InvalidateRect(hEdit,NULL,0);
149        }
150
151        hChild=GetWindow(hChild,GW_HWNDNEXT);
152    }
153}
154
155int DocumentModifyCheck(HWND hChild){   //終了保存確認
156    int BoxID,WndNum,sw;
157    char str[MAX_PATH],temporary[MAX_PATH];
158
159    WndNum=GetWndNum(hChild);
160    sw=0;
161    if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
162        if( MdiInfo[WndNum].pMdiTextEdit->IsModified() ) sw=1;
163    }
164    else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
165        if(MdiInfo[WndNum].MdiIconEditInfo->bModify) sw=1;
166    }
167
168    if(sw){
169        GetWindowText(hChild,temporary,MAX_PATH);
170
171        //"\"%s\" ファイルは変更されています。保存しますか?"
172        sprintf(str,STRING_MODIFYCHECK_FILE,temporary);
173        BoxID=MessageBox(hOwner,str,APPLICATION_NAME,MB_YESNOCANCEL|MB_ICONINFORMATION);
174
175        if(BoxID==IDYES){
176            if(!SaveDocument(hChild,NULL)) return 0;
177        }
178        else if(BoxID==IDCANCEL) return 0;
179    }
180    return 1;
181}
182void SetStatusText(char *MenuText){
183    //////////////////////////
184    // ステータスバーの更新
185    //////////////////////////
186
187    int WndNum;
188    double BufSize;
189    char temporary[255];
190    HWND hChild;
191
192    if(MenuText){
193        SendMessage(hStatusBar,SB_SETTEXT,0,(long)MenuText);
194        if((char *)MenuText!=(char *)CmdMsg) CmdMsg[0]=0;
195    }
196
197    hChild=GetWindow(hClient,GW_CHILD);
198    WndNum=GetWndNum(hChild);
199    if(WndNum==-1) return;
200    hChild=GetWindow(hChild,GW_CHILD);
201    if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
202        //////////////////////
203        // テキストエディタ
204        //////////////////////
205
206        //サイズ
207        BufSize=(double)lstrlen(MdiInfo[WndNum].pMdiTextEdit->buffer);
208        if(IsWindow(hChild)){
209            if(BufSize<1024) sprintf(temporary,"%s: %.0fByte",STRING_SIZE,BufSize);
210            else if(BufSize<1024*1024){
211                BufSize/=1024;
212                sprintf(temporary,"%s: %.2fKB",STRING_SIZE,BufSize);
213            }
214            else{
215                BufSize/=1024*1024;
216                sprintf(temporary,"%s: %.2fMB",STRING_SIZE,BufSize);
217            }
218        }
219        else temporary[0]=0;
220        SendMessage(hStatusBar,SB_SETTEXT,1,(LPARAM)temporary);
221
222        //行と桁
223        if(IsWindow(hChild)){
224#if defined(JPN)
225            //日本語
226            sprintf(temporary,"%d 行、%d 列",
227                MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y+1,
228                MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x+1);
229#else
230            //英語
231            sprintf(temporary,"%d : %d",
232                MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y+1,
233                MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x+1);
234#endif
235        }
236        else temporary[0]=0;
237        SendMessage(hStatusBar,SB_SETTEXT,2,(LPARAM)temporary);
238
239        //文字コード
240        nkf.GetCharCodeName(MdiInfo[WndNum].pMdiTextEdit->iCharCode,temporary);
241        SendMessage(hStatusBar,SB_SETTEXT,3,(LPARAM)temporary);
242
243        //文字コード
244        nkf.GetLfCodeName(MdiInfo[WndNum].pMdiTextEdit->iLfCode,temporary);
245        SendMessage(hStatusBar,SB_SETTEXT,4,(LPARAM)temporary);
246    }
247    else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){
248        ////////////////
249        // RADツール
250        ////////////////
251
252        int WndInfoNum;
253        WndInfoNum=GetWndInfoNum(MdiInfo[WndNum].path);
254        if(RadInfo.NowDragging>=FRAME_CHANGEPOS_START&&RadInfo.NowDragging<=FRAME_CHANGEPOS_END){
255            sprintf(temporary,"pos %d, %d",
256                RadInfo.DraggingRect[0].left-MdiInfo[WndNum].MdiRadInfo->ClientPos.x,
257                RadInfo.DraggingRect[0].top-MdiInfo[WndNum].MdiRadInfo->ClientPos.y);
258            SendMessage(hStatusBar,SB_SETTEXT,1,(LPARAM)temporary);
259            sprintf(temporary,"size %d * %d",
260                RadInfo.DraggingRect[0].right-RadInfo.DraggingRect[0].left,
261                RadInfo.DraggingRect[0].bottom-RadInfo.DraggingRect[0].top);
262            SendMessage(hStatusBar,SB_SETTEXT,2,(LPARAM)temporary);
263        }
264        else if(MdiInfo[WndNum].MdiRadInfo->SelectingItem[0]==SELECT_WINDOW){
265            SendMessage(hStatusBar,SB_SETTEXT,1,(LPARAM)"pos 0, 0");
266            sprintf(temporary,"size %d * %d",ProjectInfo.pWindowInfo[WndInfoNum].size.cx,ProjectInfo.pWindowInfo[WndInfoNum].size.cy);
267            SendMessage(hStatusBar,SB_SETTEXT,2,(LPARAM)temporary);
268        }
269        else{
270            sprintf(temporary,"pos %d, %d",
271                ProjectInfo.pWindowInfo[WndInfoNum].pChildInfo[MdiInfo[WndNum].MdiRadInfo->SelectingItem[0]].pos.x,
272                ProjectInfo.pWindowInfo[WndInfoNum].pChildInfo[MdiInfo[WndNum].MdiRadInfo->SelectingItem[0]].pos.y);
273            SendMessage(hStatusBar,SB_SETTEXT,1,(LPARAM)temporary);
274            sprintf(temporary,"size %d * %d",
275                ProjectInfo.pWindowInfo[WndInfoNum].pChildInfo[MdiInfo[WndNum].MdiRadInfo->SelectingItem[0]].size.cx,
276                ProjectInfo.pWindowInfo[WndInfoNum].pChildInfo[MdiInfo[WndNum].MdiRadInfo->SelectingItem[0]].size.cy);
277            SendMessage(hStatusBar,SB_SETTEXT,2,(LPARAM)temporary);
278        }
279    }
280    else if(MdiInfo[WndNum].DocType==WNDTYPE_MENU){
281        //////////////////
282        // MENU エディタ
283        //////////////////
284
285        SendMessage(hStatusBar,SB_SETTEXT,1,(LPARAM)"");
286        SendMessage(hStatusBar,SB_SETTEXT,2,(LPARAM)"");
287    }
288    else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
289        //////////////////
290        // ICON エディタ
291        //////////////////
292
293        SendMessage(hStatusBar,SB_SETTEXT,1,(LPARAM)"");
294        SendMessage(hStatusBar,SB_SETTEXT,2,(LPARAM)"");
295    }
296}
297void ResetState_UndoMenu(void){             //「元に戻す、やり直し」のメニュー表示制御
298    int i,i2;
299    HWND hChild;
300
301    hChild=GetWindow(hClient,GW_CHILD);
302    i=GetWndNum(hChild);
303    if(i==-1){
304        pobj_MainMenu->EnableItem(IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
305        EnableMenuItem(hEditMenu,IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
306        pobj_StandardToolbar->EnableItem(IDM_UNDO,0);
307        pobj_MainMenu->EnableItem(IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
308        EnableMenuItem(hEditMenu,IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
309        pobj_StandardToolbar->EnableItem(IDM_REDO,0);
310    }
311    else if(IS_DOCUMENT_TEXT(MdiInfo[i].DocType)){
312        i2=MdiInfo[i].pMdiTextEdit->pTextEditUndoState->NowPos-1;
313        if(i2==-1) i2=MAX_UNDONUM-1;
314        if(!MdiInfo[i].pMdiTextEdit->pTextEditUndoState->Command[i2]){
315            pobj_MainMenu->EnableItem(IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
316            EnableMenuItem(hEditMenu,IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
317            pobj_StandardToolbar->EnableItem(IDM_UNDO,0);
318        }
319        else{
320            pobj_MainMenu->EnableItem(IDM_UNDO,MF_BYCOMMAND|MF_ENABLED);
321            EnableMenuItem(hEditMenu,IDM_UNDO,MF_BYCOMMAND|MF_ENABLED);
322            pobj_StandardToolbar->EnableItem(IDM_UNDO,1);
323        }
324        if(!MdiInfo[i].pMdiTextEdit->pTextEditUndoState->Command[MdiInfo[i].pMdiTextEdit->pTextEditUndoState->NowPos]){
325            pobj_MainMenu->EnableItem(IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
326            EnableMenuItem(hEditMenu,IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
327            pobj_StandardToolbar->EnableItem(IDM_REDO,0);
328        }
329        else{
330            pobj_MainMenu->EnableItem(IDM_REDO,MF_BYCOMMAND|MF_ENABLED);
331            EnableMenuItem(hEditMenu,IDM_REDO,MF_BYCOMMAND|MF_ENABLED);
332            pobj_StandardToolbar->EnableItem(IDM_REDO,1);
333        }
334    }
335    else if(MdiInfo[i].DocType==WNDTYPE_RAD){
336        i2=MdiInfo[i].MdiRadInfo->undo.NowPos-1;
337        if(i2==-1) i2=MAX_UNDONUM-1;
338        if(!MdiInfo[i].MdiRadInfo->undo.Command[i2]){
339            pobj_MainMenu->EnableItem(IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
340            EnableMenuItem(hEditMenu,IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
341            pobj_StandardToolbar->EnableItem(IDM_UNDO,0);
342        }
343        else{
344            pobj_MainMenu->EnableItem(IDM_UNDO,MF_BYCOMMAND|MF_ENABLED);
345            EnableMenuItem(hEditMenu,IDM_UNDO,MF_BYCOMMAND|MF_ENABLED);
346            pobj_StandardToolbar->EnableItem(IDM_UNDO,1);
347        }
348        if(!MdiInfo[i].MdiRadInfo->undo.Command[MdiInfo[i].MdiRadInfo->undo.NowPos]){
349            pobj_MainMenu->EnableItem(IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
350            EnableMenuItem(hEditMenu,IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
351            pobj_StandardToolbar->EnableItem(IDM_REDO,0);
352        }
353        else{
354            pobj_MainMenu->EnableItem(IDM_REDO,MF_BYCOMMAND|MF_ENABLED);
355            EnableMenuItem(hEditMenu,IDM_REDO,MF_BYCOMMAND|MF_ENABLED);
356            pobj_StandardToolbar->EnableItem(IDM_REDO,1);
357        }
358    }
359    else if(MdiInfo[i].DocType==WNDTYPE_MENU){
360        pobj_MainMenu->EnableItem(IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
361        EnableMenuItem(hEditMenu,IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
362        pobj_StandardToolbar->EnableItem(IDM_UNDO,0);
363
364        pobj_MainMenu->EnableItem(IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
365        EnableMenuItem(hEditMenu,IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
366        pobj_StandardToolbar->EnableItem(IDM_REDO,0);
367    }
368    else if(MdiInfo[i].DocType==WNDTYPE_ICONEDIT){
369        i2=MdiInfo[i].MdiIconEditInfo->undo[MdiInfo[i].MdiIconEditInfo->SelectIconNum].NowPos-1;
370        if(i2==-1) i2=MAX_ICONEDIT_UNDONUM-1;
371        if(!MdiInfo[i].MdiIconEditInfo->undo[MdiInfo[i].MdiIconEditInfo->SelectIconNum].lpData[i2]){
372            pobj_MainMenu->EnableItem(IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
373            EnableMenuItem(hEditMenu,IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
374            pobj_StandardToolbar->EnableItem(IDM_UNDO,0);
375        }
376        else{
377            pobj_MainMenu->EnableItem(IDM_UNDO,MF_BYCOMMAND|MF_ENABLED);
378            EnableMenuItem(hEditMenu,IDM_UNDO,MF_BYCOMMAND|MF_ENABLED);
379            pobj_StandardToolbar->EnableItem(IDM_UNDO,1);
380        }
381        if(!MdiInfo[i].MdiIconEditInfo->undo[MdiInfo[i].MdiIconEditInfo->SelectIconNum].lpData[MdiInfo[i].MdiIconEditInfo->undo[MdiInfo[i].MdiIconEditInfo->SelectIconNum].NowPos]){
382            pobj_MainMenu->EnableItem(IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
383            EnableMenuItem(hEditMenu,IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
384            pobj_StandardToolbar->EnableItem(IDM_REDO,0);
385        }
386        else{
387            pobj_MainMenu->EnableItem(IDM_REDO,MF_BYCOMMAND|MF_ENABLED);
388            EnableMenuItem(hEditMenu,IDM_REDO,MF_BYCOMMAND|MF_ENABLED);
389            pobj_StandardToolbar->EnableItem(IDM_REDO,1);
390        }
391    }
392}
393void ResetState_ConvMenu(BOOL bEnable){
394    int MenuMsg;
395    if(bEnable)
396        MenuMsg=MF_BYCOMMAND|MF_ENABLED;
397    else MenuMsg=MF_BYCOMMAND|MF_GRAYED;
398
399    pobj_MainMenu->EnableItem(IDM_CONV_ALPHA_SMALL,MenuMsg);
400    pobj_MainMenu->EnableItem(IDM_CONV_ALPHA_BIG,MenuMsg);
401    pobj_MainMenu->EnableItem(IDM_CONV_HALF,MenuMsg);
402    pobj_MainMenu->EnableItem(IDM_CONV_MULTI,MenuMsg);
403    pobj_MainMenu->EnableItem(IDM_CONV_KATAKANA,MenuMsg);
404    pobj_MainMenu->EnableItem(IDM_CONV_HIRAGANA,MenuMsg);
405    pobj_MainMenu->EnableItem(IDM_CONV_SPACE,MenuMsg);
406    pobj_MainMenu->EnableItem(IDM_CONV_TAB,MenuMsg);
407#ifdef THETEXT
408    pobj_MainMenu->EnableItem(IDM_CONV_HASRETURN,MenuMsg);
409    pobj_MainMenu->EnableItem(IDM_CONV_QUOTE,MenuMsg);
410#else
411    pobj_MainMenu->EnableItem(IDM_CODEFORMAT,MenuMsg);
412#endif
413}
414void ResetState_PrintMenu(void);
415void ResetState_EditMenu(void){             //編集メニューの表示制御
416    HWND hChild;
417    int WndNum;
418    long MenuMsg,ToolbarMsg;
419
420    //印刷メニューの状態を設定
421    ResetState_PrintMenu();
422
423    hChild=GetWindow(hClient,GW_CHILD);
424    if(!IsWindow(hChild)){
425        pobj_MainMenu->EnableItem(IDM_FIND,MF_BYCOMMAND|MF_GRAYED);
426        pobj_MainMenu->EnableItem(IDM_PERMUTATION,MF_BYCOMMAND|MF_GRAYED);
427#ifdef THETEXT
428        pobj_MainMenu->EnableItem(IDM_STRING_COUNT,MF_BYCOMMAND|MF_GRAYED);
429#endif
430        pobj_StandardToolbar->EnableItem(IDM_FIND,0);
431
432        pobj_MainMenu->EnableItem(IDM_CUT,MF_BYCOMMAND|MF_GRAYED);
433        pobj_MainMenu->EnableItem(IDM_COPY,MF_BYCOMMAND|MF_GRAYED);
434        pobj_MainMenu->EnableItem(IDM_DELETE,MF_BYCOMMAND|MF_GRAYED);
435        EnableMenuItem(hEditMenu,IDM_CUT,MF_BYCOMMAND|MF_GRAYED);
436        EnableMenuItem(hEditMenu,IDM_COPY,MF_BYCOMMAND|MF_GRAYED);
437        EnableMenuItem(hEditMenu,IDM_DELETE,MF_BYCOMMAND|MF_GRAYED);
438        pobj_MainMenu->EnableItem(IDM_PASTE,MF_BYCOMMAND|MF_GRAYED);
439        pobj_MainMenu->EnableItem(IDM_ALLSELECT,MF_BYCOMMAND|MF_GRAYED);
440        pobj_StandardToolbar->EnableItem(IDM_CUT,0);
441        pobj_StandardToolbar->EnableItem(IDM_COPY,0);
442        pobj_StandardToolbar->EnableItem(IDM_PASTE,0);
443
444        ResetState_ConvMenu(0);
445
446        ResetState_UndoMenu();
447        return;
448    }
449    WndNum=GetWndNum(hChild);
450    if(WndNum==-1) return;
451    if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
452        pobj_MainMenu->EnableItem(IDM_ALLSELECT,MF_BYCOMMAND|MF_ENABLED);
453        pobj_MainMenu->EnableItem(IDM_FIND,MF_BYCOMMAND|MF_ENABLED);
454        pobj_MainMenu->EnableItem(IDM_PERMUTATION,MF_BYCOMMAND|MF_ENABLED);
455#ifdef THETEXT
456        pobj_MainMenu->EnableItem(IDM_STRING_COUNT,MF_BYCOMMAND|MF_ENABLED);
457#endif
458        pobj_StandardToolbar->EnableItem(IDM_FIND,1);
459
460        BOOL bConvEnable;
461        hChild=GetWindow(hChild,GW_CHILD);
462        if(!(
463            MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x==MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.x&&
464            MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y==MdiInfo[WndNum].pMdiTextEdit->EndCaretPos.y
465            )){
466            MenuMsg=MF_BYCOMMAND|MF_ENABLED;
467            ToolbarMsg=1;
468
469            bConvEnable=1;
470        }
471        else{
472            MenuMsg=MF_BYCOMMAND|MF_GRAYED;
473            ToolbarMsg=0;
474
475            bConvEnable=0;
476        }
477        pobj_MainMenu->EnableItem(IDM_CUT,MenuMsg);
478        pobj_MainMenu->EnableItem(IDM_COPY,MenuMsg);
479        pobj_MainMenu->EnableItem(IDM_DELETE,MenuMsg);
480        EnableMenuItem(hEditMenu,IDM_CUT,MenuMsg);
481        EnableMenuItem(hEditMenu,IDM_COPY,MenuMsg);
482        EnableMenuItem(hEditMenu,IDM_DELETE,MenuMsg);
483        pobj_StandardToolbar->EnableItem(IDM_CUT,ToolbarMsg);
484        pobj_StandardToolbar->EnableItem(IDM_COPY,ToolbarMsg);
485
486        if(IsClipboardFormatAvailable(CF_TEXT)){
487            pobj_MainMenu->EnableItem(IDM_PASTE,MF_BYCOMMAND|MF_ENABLED);
488            pobj_StandardToolbar->EnableItem(IDM_PASTE,1);
489        }
490        else{
491            pobj_MainMenu->EnableItem(IDM_PASTE,MF_BYCOMMAND|MF_GRAYED);
492            pobj_StandardToolbar->EnableItem(IDM_PASTE,0);
493        }
494
495
496        //変換コマンド
497        ResetState_ConvMenu(bConvEnable);
498    }
499    else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){
500        //検索、置換、文字カウントを無効化
501        pobj_MainMenu->EnableItem(IDM_FIND,MF_BYCOMMAND|MF_GRAYED);
502        pobj_MainMenu->EnableItem(IDM_PERMUTATION,MF_BYCOMMAND|MF_GRAYED);
503#ifdef THETEXT
504        pobj_MainMenu->EnableItem(IDM_STRING_COUNT,MF_BYCOMMAND|MF_GRAYED);
505#endif
506        pobj_StandardToolbar->EnableItem(IDM_FIND,0);
507
508        if(MdiInfo[WndNum].MdiRadInfo->SelectingItem[0]==SELECT_WINDOW){
509            //切り取り、コピー、削除を有効化
510            pobj_MainMenu->EnableItem(IDM_CUT,MF_BYCOMMAND|MF_GRAYED);
511            pobj_MainMenu->EnableItem(IDM_COPY,MF_BYCOMMAND|MF_GRAYED);
512            pobj_MainMenu->EnableItem(IDM_DELETE,MF_BYCOMMAND|MF_GRAYED);
513            EnableMenuItem(hEditMenu,IDM_CUT,MF_BYCOMMAND|MF_GRAYED);
514            EnableMenuItem(hEditMenu,IDM_COPY,MF_BYCOMMAND|MF_GRAYED);
515            EnableMenuItem(hEditMenu,IDM_DELETE,MF_BYCOMMAND|MF_GRAYED);
516            pobj_StandardToolbar->EnableItem(IDM_CUT,0);
517            pobj_StandardToolbar->EnableItem(IDM_COPY,0);
518        }
519        else{
520            //切り取り、コピー、削除を無効化
521            pobj_MainMenu->EnableItem(IDM_CUT,MF_BYCOMMAND|MF_ENABLED);
522            pobj_MainMenu->EnableItem(IDM_COPY,MF_BYCOMMAND|MF_ENABLED);
523            pobj_MainMenu->EnableItem(IDM_DELETE,MF_BYCOMMAND|MF_ENABLED);
524            EnableMenuItem(hEditMenu,IDM_CUT,MF_BYCOMMAND|MF_ENABLED);
525            EnableMenuItem(hEditMenu,IDM_COPY,MF_BYCOMMAND|MF_ENABLED);
526            EnableMenuItem(hEditMenu,IDM_DELETE,MF_BYCOMMAND|MF_ENABLED);
527            pobj_StandardToolbar->EnableItem(IDM_CUT,1);
528            pobj_StandardToolbar->EnableItem(IDM_COPY,1);
529        }
530
531        //すべて選択を有効化
532        pobj_MainMenu->EnableItem(IDM_ALLSELECT,MF_BYCOMMAND|MF_ENABLED);
533
534        if(IsClipboardFormatAvailable(dwRadClipboardID)){
535            pobj_MainMenu->EnableItem(IDM_PASTE,MF_BYCOMMAND|MF_ENABLED);
536            pobj_StandardToolbar->EnableItem(IDM_PASTE,1);
537        }
538        else{
539            pobj_MainMenu->EnableItem(IDM_PASTE,MF_BYCOMMAND|MF_GRAYED);
540            pobj_StandardToolbar->EnableItem(IDM_PASTE,0);
541        }
542
543        ResetState_ConvMenu(0);
544    }
545    else if(MdiInfo[WndNum].DocType==WNDTYPE_MENU){
546        //検索、置換、文字カウントを無効化
547        pobj_MainMenu->EnableItem(IDM_FIND,MF_BYCOMMAND|MF_GRAYED);
548        pobj_MainMenu->EnableItem(IDM_PERMUTATION,MF_BYCOMMAND|MF_GRAYED);
549#ifdef THETEXT
550        pobj_MainMenu->EnableItem(IDM_STRING_COUNT,MF_BYCOMMAND|MF_GRAYED);
551#endif
552        pobj_StandardToolbar->EnableItem(IDM_FIND,0);
553
554        pobj_MainMenu->EnableItem(IDM_CUT,MF_BYCOMMAND|MF_GRAYED);
555        pobj_MainMenu->EnableItem(IDM_COPY,MF_BYCOMMAND|MF_GRAYED);
556        pobj_MainMenu->EnableItem(IDM_DELETE,MF_BYCOMMAND|MF_GRAYED);
557        EnableMenuItem(hEditMenu,IDM_CUT,MF_BYCOMMAND|MF_GRAYED);
558        EnableMenuItem(hEditMenu,IDM_COPY,MF_BYCOMMAND|MF_GRAYED);
559        EnableMenuItem(hEditMenu,IDM_DELETE,MF_BYCOMMAND|MF_GRAYED);
560        pobj_MainMenu->EnableItem(IDM_PASTE,MF_BYCOMMAND|MF_GRAYED);
561        pobj_MainMenu->EnableItem(IDM_ALLSELECT,MF_BYCOMMAND|MF_GRAYED);
562        pobj_StandardToolbar->EnableItem(IDM_CUT,0);
563        pobj_StandardToolbar->EnableItem(IDM_COPY,0);
564        pobj_StandardToolbar->EnableItem(IDM_PASTE,0);
565
566        ResetState_ConvMenu(0);
567    }
568    else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
569        //検索、置換、文字カウントを無効化
570        pobj_MainMenu->EnableItem(IDM_FIND,MF_BYCOMMAND|MF_GRAYED);
571        pobj_MainMenu->EnableItem(IDM_PERMUTATION,MF_BYCOMMAND|MF_GRAYED);
572#ifdef THETEXT
573        pobj_MainMenu->EnableItem(IDM_STRING_COUNT,MF_BYCOMMAND|MF_GRAYED);
574#endif
575        pobj_StandardToolbar->EnableItem(IDM_FIND,0);
576
577        if(MdiInfo[WndNum].MdiIconEditInfo->SelectLevel==0){
578            //切り取り、コピー、削除を無効化
579            pobj_MainMenu->EnableItem(IDM_CUT,MF_BYCOMMAND|MF_GRAYED);
580            pobj_MainMenu->EnableItem(IDM_COPY,MF_BYCOMMAND|MF_GRAYED);
581            pobj_MainMenu->EnableItem(IDM_DELETE,MF_BYCOMMAND|MF_GRAYED);
582            EnableMenuItem(hEditMenu,IDM_CUT,MF_BYCOMMAND|MF_GRAYED);
583            EnableMenuItem(hEditMenu,IDM_COPY,MF_BYCOMMAND|MF_GRAYED);
584            EnableMenuItem(hEditMenu,IDM_DELETE,MF_BYCOMMAND|MF_GRAYED);
585            pobj_StandardToolbar->EnableItem(IDM_CUT,0);
586            pobj_StandardToolbar->EnableItem(IDM_COPY,0);
587        }
588        else{
589            //切り取り、コピー、削除を有効化
590            pobj_MainMenu->EnableItem(IDM_CUT,MF_BYCOMMAND|MF_ENABLED);
591            pobj_MainMenu->EnableItem(IDM_COPY,MF_BYCOMMAND|MF_ENABLED);
592            pobj_MainMenu->EnableItem(IDM_DELETE,MF_BYCOMMAND|MF_ENABLED);
593            EnableMenuItem(hEditMenu,IDM_CUT,MF_BYCOMMAND|MF_ENABLED);
594            EnableMenuItem(hEditMenu,IDM_COPY,MF_BYCOMMAND|MF_ENABLED);
595            EnableMenuItem(hEditMenu,IDM_DELETE,MF_BYCOMMAND|MF_ENABLED);
596            pobj_StandardToolbar->EnableItem(IDM_CUT,1);
597            pobj_StandardToolbar->EnableItem(IDM_COPY,1);
598        }
599
600        //すべて選択を有効化
601        pobj_MainMenu->EnableItem(IDM_ALLSELECT,MF_BYCOMMAND|MF_ENABLED);
602
603        if(IsClipboardFormatAvailable(CF_BITMAP)){
604            //貼り付けを有効化
605            pobj_MainMenu->EnableItem(IDM_PASTE,MF_BYCOMMAND|MF_ENABLED);
606            pobj_StandardToolbar->EnableItem(IDM_PASTE,1);
607        }
608        else{
609            //貼り付けを無効化
610            pobj_MainMenu->EnableItem(IDM_PASTE,MF_BYCOMMAND|MF_GRAYED);
611            pobj_StandardToolbar->EnableItem(IDM_PASTE,0);
612        }
613
614        ResetState_ConvMenu(0);
615    }
616
617    ResetState_UndoMenu();
618}
619void ResetState_ViewMenu(void){
620    // 表示 メニューの状態を設定
621
622
623#ifdef THETEXT
624    pobj_MainMenu->CheckMenu(IDM_RIGHT_TURN,pobj_nv->bRightTurn);
625#endif
626}
627void ResetState_PrintMenu(void){                //編集メニューの表示制御
628    HWND hChild;
629    int WndNum;
630    hChild=GetWindow(hClient,GW_CHILD);
631    if(!IsWindow(hChild)){
632        pobj_MainMenu->EnableItem(IDM_PAGESET,MF_BYCOMMAND|MF_GRAYED);
633
634        pobj_MainMenu->EnableItem(IDM_PREVIEW,MF_BYCOMMAND|MF_GRAYED);
635
636        pobj_MainMenu->EnableItem(IDM_PRINTOUT,MF_BYCOMMAND|MF_GRAYED);
637        return;
638    }
639    WndNum=GetWndNum(hChild);
640    if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
641        pobj_MainMenu->EnableItem(IDM_PAGESET,MF_BYCOMMAND|MF_ENABLED);
642
643        pobj_MainMenu->EnableItem(IDM_PREVIEW,MF_BYCOMMAND|MF_ENABLED);
644
645        pobj_MainMenu->EnableItem(IDM_PRINTOUT,MF_BYCOMMAND|MF_ENABLED);
646    }
647    else{
648        pobj_MainMenu->EnableItem(IDM_PAGESET,MF_BYCOMMAND|MF_GRAYED);
649
650        pobj_MainMenu->EnableItem(IDM_PREVIEW,MF_BYCOMMAND|MF_GRAYED);
651
652        pobj_MainMenu->EnableItem(IDM_PRINTOUT,MF_BYCOMMAND|MF_GRAYED);
653    }
654}
655void ResetState_DocMenu(void){
656    long MenuMsg,ToolbarMsg;
657    HWND hChild;
658
659    hChild=GetWindow(hClient,GW_CHILD);
660
661
662    /////////////////////////////////////////
663    // 共通ドキュメント メニューの状態を設定
664    /////////////////////////////////////////
665
666    if(!IsWindow(hChild)){
667        MenuMsg=MF_GRAYED;
668        ToolbarMsg=0;
669    }
670    else{
671        MenuMsg=MF_ENABLED;
672        ToolbarMsg=1;
673    }
674    pobj_MainMenu->EnableItem(IDM_CLOSE,MenuMsg);
675    pobj_MainMenu->EnableItem(IDM_SAVE,MenuMsg);
676    pobj_MainMenu->EnableItem(IDM_NEWSAVE,MenuMsg);
677    pobj_MainMenu->EnableItem(IDM_CODE_SAVE,MenuMsg);
678    pobj_MainMenu->EnableItem(IDM_ALLSAVE,MenuMsg);
679
680    pobj_StandardToolbar->EnableItem(IDM_CLOSE,ToolbarMsg);
681    pobj_StandardToolbar->EnableItem(IDM_SAVE,ToolbarMsg);
682    pobj_StandardToolbar->EnableItem(IDM_ALLSAVE,ToolbarMsg);
683
684
685#ifndef THETEXT
686    /////////////////////////////////////////////////
687    // プロジェクトドキュメント メニューの状態を設定
688    /////////////////////////////////////////////////
689
690    if(ProjectInfo.name[0]){
691        pobj_MainMenu->EnableItem(IDM_ALLSAVE,MF_ENABLED);
692        pobj_StandardToolbar->EnableItem(IDM_ALLSAVE,1);
693
694        MenuMsg=MF_ENABLED;
695        ToolbarMsg=TBSTATE_ENABLED;
696    }
697    else{
698        MenuMsg=MF_GRAYED;
699        ToolbarMsg=TBSTATE_INDETERMINATE;
700    }
701    pobj_MainMenu->EnableItem(IDM_PROJECT_SAVE,MenuMsg);
702    pobj_MainMenu->EnableItem(IDM_PROJECT_CLOSE,MenuMsg);
703    pobj_MainMenu->EnableItem(IDM_PROJECT_FOLDER_OPEN,MenuMsg);
704    pobj_MainMenu->EnableItem(IDM_PROJECT_OPTION,MenuMsg);
705
706    //デバッガ メニューの状態を設定
707    pobj_Debugger->ResetCommandEnabled();
708#endif
709
710
711    //編集メニューの状態を設定
712    ResetState_EditMenu();
713
714    //表示メニューの状態を設定
715    ResetState_ViewMenu();
716}
717void DuplicateTitleCheck(char *lpszTitle){
718    int i;
719    for(i=0;i<MAX_WNDNUM;i++){
720        if(MdiInfo[i].hwnd){
721            if(lstrcmpi(MdiInfo[i].title,lpszTitle)==0){
722                lstrcat(lpszTitle,"_");
723                DuplicateTitleCheck(lpszTitle);
724                return;
725            }
726        }
727    }
728}
729HWND NewTextEditWindow(char *filepath,_int8 DocumentType,COLORREF TabColor){
730    int i;
731    char str[MAX_PATH],str2[32],*buffer;
732    HWND hChild,hEdit;
733    RECT rect;
734    int iCharCode=NKF_SHIFT_JIS;
735    int iLfCode=LFCODE_CRLF;
736
737    if(filepath){
738
739        //すでに指定されたファイルが開かれている場合
740        hChild=GetWindow(hClient,GW_CHILD);
741        while(hChild){
742            i=GetWndNum(hChild);
743            if(IS_DOCUMENT_TEXT(MdiInfo[i].DocType)){
744                if(lstrcmpi(MdiInfo[i].path,filepath)==0) break;
745            }
746            hChild=GetNextWindow(hChild,GW_HWNDNEXT);
747        }
748        if(hChild){
749            //前面に表示して終了
750            BringWindowToTop(hChild);
751            return hChild;
752        }
753
754
755        //////////////////////////////////////////////////////
756        //ファイル読み込み(正常に読み込めるかの確認も含む)
757        //////////////////////////////////////////////////////
758
759        HANDLE hFile;
760        hFile=CreateFile(filepath,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
761        if(hFile==INVALID_HANDLE_VALUE){
762            sprintf(str,STRING_ERROR_CANT_FILEOPEN,filepath);
763            MessageBox(hOwner,str,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
764            return 0;
765        }
766        int length;
767        length=GetFileSize(hFile,NULL);
768
769        char *temp;
770        temp=(char *)HeapAlloc(hHeap,0,length+1);
771        DWORD dw;
772        ReadFile(hFile,temp,length,&dw,NULL);
773        CloseHandle(hFile);
774        for(i=0;i<length;i++){
775            if(temp[i]=='\0') temp[i]=' ';
776        }
777        temp[length]=0;
778
779
780        ///////////////////////
781        // 改行コードを判別
782        ///////////////////////
783
784        char *temp2;
785        for(i=0;i<length;i++){
786            if(temp[i]=='\r'){
787                if(temp[i+1]=='\n')
788                    iLfCode=LFCODE_CRLF;
789                else
790                    iLfCode=LFCODE_CR;
791                break;
792            }
793            if(temp[i]=='\n'){
794                iLfCode=LFCODE_LF;
795                break;
796            }
797        }
798
799        //改行コードを変換
800        if(iLfCode==LFCODE_CR||iLfCode==LFCODE_LF){
801            temp2=nkf.ToCRLF(iLfCode,temp);
802            HeapDefaultFree(temp);
803            temp=temp2;
804
805            length=lstrlen(temp);
806        }
807
808
809        /////////////////////
810        // Shift-JISに変換
811        /////////////////////
812
813        buffer=(char *)HeapAlloc(hHeap,0,length*2+1);
814        nkf.pSetNkfOption("-sx");   //Shift-JISに変換(xは半角カタカナを全角に変換しないオプション)
815        nkf.pNkfConvert(buffer,temp);
816        buffer=(char *)HeapReAlloc(hHeap,0,buffer,lstrlen(buffer)+1);
817        HeapDefaultFree(temp);
818
819        //変換前の文字コードを判別
820        iCharCode=nkf.pNkfGetKanjiCode();
821        if(iCharCode<NKF_CODE_MIN||NKF_CODE_MAX<iCharCode){
822            //判別不能な場合は、Shift-JISにする
823            iCharCode=NKF_SHIFT_JIS;
824        }
825        else if(iCharCode==NKF_EUC||iCharCode==NKF_ISO_2022_JP){
826            //EUC、JISの場合で、判別不能な場合は、Shift-JISを優先
827            for(i=0;;i++){
828                if(buffer[i]=='\0'){
829                    //半角コードのみ
830                    iCharCode=NKF_SHIFT_JIS;
831                    break;
832                }
833                if(IsDBCSLeadByte(buffer[i])) break;
834            }
835        }
836
837
838        //////////////////////////
839        // ファイルパスをセット
840        //////////////////////////
841
842        _splitpath(filepath,NULL,NULL,str,str2);
843        lstrcat(str,str2);
844    }
845    else{
846        buffer=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1);
847        DocumentCounter++;
848        sprintf(str,"Document[%d]",DocumentCounter);
849    }
850
851    MDICREATESTRUCT mdic;
852    mdic.szClass="MDIClientWindow_TextEdit";
853    mdic.hOwner=hInst;
854    mdic.x=CW_USEDEFAULT;
855    mdic.y=CW_USEDEFAULT;
856    mdic.cx=CW_USEDEFAULT;
857    mdic.cy=CW_USEDEFAULT;
858    mdic.szTitle=str;
859
860    hChild=GetWindow(hClient,GW_CHILD);
861    if(IsWindow(hChild)){
862        if(IsZoomed(hChild)) mdic.style=WS_MAXIMIZE;
863        else mdic.style=0;
864    }
865    else{
866        if(pobj_nv->bMDIZoomed) mdic.style=WS_MAXIMIZE;
867        else mdic.style=0;
868    }
869
870    //ファイルアイコンをセット
871    SHFILEINFO shfi;
872    if(filepath)
873        SHGetFileInfo(filepath, FILE_ATTRIBUTE_ARCHIVE, &shfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_SMALLICON );
874    else shfi.hIcon=(HICON)LoadImage(hResInst,MAKEINTRESOURCE(IDI_TEXTDOCUMENT),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);;
875    mdic.lParam=(LPARAM)shfi.hIcon;
876
877    mdic.style|=WS_CLIPCHILDREN;
878    hChild=(HWND)SendMessage(hClient,WM_MDICREATE,0,(long)&mdic);   //ウィンドウ作成
879
880    //TextEditorコントロールを設置
881    GetClientRect(hChild,&rect);
882    hEdit=CreateWindow("TextEditor",NULL,
883        WS_CHILD|WS_HSCROLL|WS_VSCROLL|WS_VISIBLE,
884        0,0,0,0,
885        hChild,NULL,hInst,NULL);
886
887    //ウィンドウのID登録
888    for(i=0;i<MAX_WNDNUM;i++){
889        if(MdiInfo[i].hwnd==0){
890            MdiInfo[i].hwnd=hChild;
891            MdiInfo[i].DocType=DocumentType;
892            DuplicateTitleCheck(str);
893            MdiInfo[i].title=(char *)GlobalAlloc(GMEM_FIXED,lstrlen(str)+1);
894            lstrcpy(MdiInfo[i].title,str);
895            if(filepath){
896                MdiInfo[i].path=(char *)GlobalAlloc(GMEM_FIXED,lstrlen(filepath)+1);
897                lstrcpy(MdiInfo[i].path,filepath);
898            }
899            else{
900                MdiInfo[i].path=(char *)GlobalAlloc(GPTR,1);
901            }
902
903            MdiInfo[i].pMdiTextEdit = new CMdiTextEdit( &MdiInfo[i] );
904
905            MdiInfo[i].pMdiTextEdit->hEdit=hEdit;
906            MdiInfo[i].pMdiTextEdit->pobj_WebResult=new CWebResult(hChild);
907            MdiInfo[i].pMdiTextEdit->pobj_Ruler=new CRuler(hChild,i);
908            MdiInfo[i].pMdiTextEdit->hIcon=shfi.hIcon;
909            MdiInfo[i].pMdiTextEdit->buffer=buffer;
910            MdiInfo[i].pMdiTextEdit->pColorRef=(COLORREF *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(COLORREF)*lstrlen(buffer));
911            MdiInfo[i].pMdiTextEdit->iUnderStart=-1;
912            MdiInfo[i].pMdiTextEdit->iUnderEnd=-1;
913            MdiInfo[i].pMdiTextEdit->StartCaretPos.x=0;
914            MdiInfo[i].pMdiTextEdit->StartCaretPos.y=0;
915            MdiInfo[i].pMdiTextEdit->EndCaretPos.x=0;
916            MdiInfo[i].pMdiTextEdit->EndCaretPos.y=0;
917            MdiInfo[i].pMdiTextEdit->Temp_UpDown_CaretXPos=-1;
918            MdiInfo[i].pMdiTextEdit->bAutoScroll=0;
919            MdiInfo[i].pMdiTextEdit->iWidth_ControlTabSpace=
920                GetControlTabSpace(i,&MdiInfo[i].pMdiTextEdit->iLineNumberTextCount);
921            MdiInfo[i].pMdiTextEdit->iCharCode=iCharCode;
922            MdiInfo[i].pMdiTextEdit->iLfCode=iLfCode;
923
924            MdiInfo[i].IndentStr=0;
925
926            int flag;
927            if(mdic.style&WS_MAXIMIZE) flag=SIZE_MAXIMIZED;
928            else flag=0;
929            SendTextEditResizeEvent(hChild);
930            break;
931        }
932    }
933
934    //ワードカラーをセット
935    if(IS_DOCUMENT_TEXT(DocumentType)) SetTextEditWordColor(i);
936
937    //Docコンボボックスに追加
938    extern HWND hDocCombo;
939    i=SendMessage(hDocCombo,CB_ADDSTRING,0,(long)str);
940    SendMessage(hDocCombo,CB_SETCURSEL,i,0);
941
942    //タブに追加
943    pobj_MainTab->InsertItem( str, true, TabColor );
944
945    SetFocus(hEdit);
946    SetStatusText(NULL);
947
948    //メニュー状態を設定
949    ResetState_DocMenu();
950
951    return hChild;
952}
953void CreateNewFile(void){
954
955#ifdef THETEXT
956    NewTextEditWindow(NULL,WNDTYPE_TEXT);
957    return;
958#else
959    int FileType;
960    BOOL bAddToProject;
961    char temporary[MAX_PATH];
962
963    FileType=DialogBox(hResInst,MAKEINTRESOURCE(IDD_NEWFILE),hOwner,DlgNewFile);
964    if(FileType==-1) return;
965
966    if(FileType&0x00008000){
967        bAddToProject=1;
968        FileType&=0x0FFF;
969        lstrcpy(temporary,NewFileName);
970        if(!strstr(temporary,".")) lstrcat(temporary,".ab");
971        GetFullPath(temporary,ProjectInfo.dir);
972    }
973    else bAddToProject=0;
974
975    switch(FileType){
976        case FT_BASICPROGRAM:       //Basicプログラム
977        case FT_SUBPROGRAM:
978            if(bAddToProject){
979                WriteBuffer(temporary,0,0);
980                NewTextEditWindow(temporary,WNDTYPE_BASIC);
981                Project_File_Insert(temporary);
982            }
983            else NewTextEditWindow(NULL,WNDTYPE_BASIC);
984            break;
985
986        case FT_PROJECT:
987            DlgNewProjectWizard(hOwner);
988            break;
989
990        case FT_TEXT:
991            NewTextEditWindow(NULL,WNDTYPE_TEXT);
992            break;
993
994        case FT_HTML:
995            NewTextEditWindow(NULL,WNDTYPE_HTML);
996            break;
997
998        case FT_ICON:
999            NewIconEditWindow(NULL);
1000            break;
1001    }
1002#endif
1003}
1004void CloseDocWindow(int WndNum){
1005    int i2,i3;
1006
1007    MdiInfo[WndNum].hwnd=0;
1008
1009    //ドキュメントコンボボックスから文字列を消去
1010    extern HWND hDocCombo;
1011    i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(long)MdiInfo[WndNum].title);
1012    SendMessage(hDocCombo,CB_DELETESTRING,i2,0);
1013    InvalidateRect(hDocCombo,NULL,1);
1014
1015    //タブコントロールからアイテムを消去
1016    if(pobj_MainTab) pobj_MainTab->DeleteItem( MdiInfo[WndNum].title, true );
1017
1018
1019    GlobalFree(MdiInfo[WndNum].title);
1020    GlobalFree(MdiInfo[WndNum].path);
1021
1022    if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
1023        ////////////////////////////
1024        // テキストエディタを閉じる
1025        ////////////////////////////
1026
1027        extern COMPLEMENT_WINDOW_INFO ComplementWndInfo;
1028        if(ComplementWndInfo.hWnd){
1029            //コード補完リストを破棄する
1030            DestroyWindow(ComplementWndInfo.hWnd);
1031            ComplementWndInfo.hWnd=0;
1032        }
1033
1034        HeapDefaultFree(MdiInfo[WndNum].pMdiTextEdit->buffer);
1035        HeapDefaultFree(MdiInfo[WndNum].pMdiTextEdit->pColorRef);
1036
1037        if(MdiInfo[WndNum].IndentStr) HeapDefaultFree(MdiInfo[WndNum].IndentStr);
1038
1039        //エディットコントロールを破棄
1040        DestroyWindow(MdiInfo[WndNum].pMdiTextEdit->hEdit);
1041
1042        //Web検索ウィンドウを破棄
1043        delete MdiInfo[WndNum].pMdiTextEdit->pobj_WebResult;
1044        MdiInfo[WndNum].pMdiTextEdit->pobj_WebResult=0;
1045
1046        //ルーラーウィンドウを破棄
1047        delete MdiInfo[WndNum].pMdiTextEdit->pobj_Ruler;
1048        MdiInfo[WndNum].pMdiTextEdit->pobj_Ruler=0;
1049
1050        //アイコンを破棄
1051        if(MdiInfo[WndNum].pMdiTextEdit->hIcon) DestroyIcon(MdiInfo[WndNum].pMdiTextEdit->hIcon);
1052
1053        delete MdiInfo[WndNum].pMdiTextEdit;
1054        MdiInfo[WndNum].pMdiTextEdit=0;
1055    }
1056    else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){
1057        /////////////////////
1058        // RADツールを閉じる
1059        /////////////////////
1060
1061        for(i2=0;i2<MAX_UNDONUM;i2++){
1062            if(MdiInfo[WndNum].MdiRadInfo->undo.Command[i2])
1063                Rad_DeleteUndoData(WndNum,i2);
1064        }
1065        DestroyWindow(MdiInfo[WndNum].MdiRadInfo->hTools);
1066        DestroyWindow(MdiInfo[WndNum].MdiRadInfo->hRad);
1067        SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,MdiInfo[WndNum].MdiRadInfo->hOldBitmap);
1068        DeleteDC(MdiInfo[WndNum].MdiRadInfo->hMemDC);
1069        DeleteObject(MdiInfo[WndNum].MdiRadInfo->hBitmap);
1070        GlobalFree(MdiInfo[WndNum].MdiRadInfo);
1071    }
1072    else if(MdiInfo[WndNum].DocType==WNDTYPE_MENU){
1073        ////////////////////////////
1074        // メニューエディタを閉じる
1075        ////////////////////////////
1076
1077        DestroyWindow(MdiInfo[WndNum].MdiMenuInfo->hList);
1078        GlobalFree(MdiInfo[WndNum].MdiMenuInfo);
1079    }
1080    else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
1081        ////////////////////////////
1082        // アイコンエディタを閉じる
1083        ////////////////////////////
1084
1085        for(i2=0;i2<MdiInfo[WndNum].MdiIconEditInfo->num;i2++){
1086            for(i3=0;i3<MAX_ICONEDIT_UNDONUM;i3++){
1087                if(MdiInfo[WndNum].MdiIconEditInfo->undo[i2].lpData[i3])
1088                    HeapDefaultFree(MdiInfo[WndNum].MdiIconEditInfo->undo[i2].lpData[i3]);
1089            }
1090        }
1091
1092        DeleteDC(MdiInfo[WndNum].MdiIconEditInfo->memdc);
1093        DeleteObject(MdiInfo[WndNum].MdiIconEditInfo->hMemBmp);
1094        DestroyWindow(MdiInfo[WndNum].MdiIconEditInfo->hMain);
1095        for(i2=0;i2<MdiInfo[WndNum].MdiIconEditInfo->num;i2++){
1096            HeapDefaultFree(MdiInfo[WndNum].MdiIconEditInfo->pIconImage[i2]);
1097        }
1098        HeapDefaultFree(MdiInfo[WndNum].MdiIconEditInfo);
1099    }
1100}
1101void ResizeTextEditWnd(HWND hwnd,int cx,int cy){
1102    int WndNum;
1103    WndNum=GetWndNum(hwnd);
1104    if(WndNum==-1) return;
1105
1106    int WebResultWndHeight;
1107    WebResultWndHeight=LINK_ITEM_HEIGHT;
1108    //未完成
1109    WebResultWndHeight=0;
1110
1111    int iHeightRuler;
1112    if(pobj_nv->bEditor_Ruler){
1113        //ルーラー
1114        MdiInfo[WndNum].pMdiTextEdit->pobj_Ruler->resize(
1115            0,
1116            0,
1117            cx,
1118            HEIGHT_RULER);
1119
1120        iHeightRuler=HEIGHT_RULER;
1121
1122        ShowWindow(MdiInfo[WndNum].pMdiTextEdit->pobj_Ruler->hRulerWnd,SW_SHOW);
1123    }
1124    else{
1125        iHeightRuler=0;
1126
1127        ShowWindow(MdiInfo[WndNum].pMdiTextEdit->pobj_Ruler->hRulerWnd,SW_HIDE);
1128    }
1129
1130    //エディットウィンドウ
1131    MoveWindow(MdiInfo[WndNum].pMdiTextEdit->hEdit,
1132        0,
1133        iHeightRuler,
1134        cx,
1135        cy-WebResultWndHeight-iHeightRuler,
1136        1);
1137
1138    //Web検索ウィンドウ
1139    MdiInfo[WndNum].pMdiTextEdit->pobj_WebResult->resize(
1140        0,
1141        cy-WebResultWndHeight,
1142        cx,
1143        WebResultWndHeight);
1144}
1145LRESULT CALLBACK MDIClientWindow_TextEdit(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
1146    int i,i2;
1147    HWND hEdit;
1148
1149    switch(message){
1150        case WM_CREATE:
1151            CREATESTRUCT *lpcs;
1152            lpcs=(CREATESTRUCT *)lParam;
1153            MDICREATESTRUCT *lpmcs;
1154            lpmcs=(MDICREATESTRUCT *)lpcs->lpCreateParams;
1155            SendMessage(hwnd,WM_SETICON,ICON_SMALL,(LPARAM)lpmcs->lParam);
1156            break;
1157        case WM_MDIACTIVATE:
1158            //以前のMDIウィンドウのパラメータ ヒントを破棄する
1159            if(MethodCheckInfo.hWnd){
1160                DestroyWindow(MethodCheckInfo.hWnd);
1161                MethodCheckInfo.hWnd=0;
1162            }
1163
1164            //以前のコード補完リストを破棄する
1165            if(ComplementWndInfo.hWnd){
1166                DestroyWindow(ComplementWndInfo.hWnd);
1167                ComplementWndInfo.hWnd=0;
1168            }
1169
1170            if(!lParam) return 0;
1171            i=GetWndNum((HWND)lParam);
1172            if(i==-1) return 0; //ウィンドウが初期状態の場合
1173
1174#ifndef THETEXT
1175            //デバッガ メニューの状態を設定
1176            pobj_Debugger->ResetCommandEnabled();
1177#endif
1178
1179            //ドキュメント セレクト コンボボックス
1180            extern HWND hDocCombo;
1181            i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(long)MdiInfo[i].title);
1182            SendMessage(hDocCombo,CB_SETCURSEL,i2,0);
1183
1184            //タブコントロール
1185            pobj_MainTab->MdiActiveEvent(MdiInfo[i].title);
1186
1187            return 0;
1188        case WM_SETFOCUS:
1189            hEdit=GetWindow(hwnd,GW_CHILD);
1190            SetFocus(hEdit);
1191            SetStatusText(CmdMsg);
1192            ResetState_EditMenu();
1193            ResetState_ViewMenu();
1194            break;
1195        case WM_SIZE:
1196            ResizeTextEditWnd(hwnd,LOWORD(lParam),HIWORD(lParam));
1197            break;
1198        case WM_CLOSE:
1199            if(!DocumentModifyCheck(hwnd)) return 0;
1200            CloseDocWindow(GetWndNum(hwnd));
1201            pobj_nv->bMDIZoomed=IsZoomed(hwnd);
1202            i=DefMDIChildProc(hwnd,message,wParam,lParam);
1203
1204            //メニュー状態を設定
1205            ResetState_DocMenu();
1206
1207            return i;
1208    }
1209    return DefMDIChildProc(hwnd,message,wParam,lParam);
1210}
1211void ResizeOwnerWnd(void){
1212    int width_owner,height_owner;
1213    int height_Rebar;
1214    int height_MdiClient;
1215    RECT rect,StatusRect,RebarRect;
1216
1217    GetClientRect(hOwner,&rect);
1218    width_owner=rect.right;
1219    height_owner=rect.bottom;
1220
1221    //Rebar
1222    SendMessage(pobj_Rebar->hRebar,WM_SIZE,0,MAKELONG(width_owner,height_owner));
1223    UpdateWindow(pobj_Rebar->hRebar);
1224
1225    //Status bar
1226#define STATUSBAR_PARTS_NUM 5
1227    int sb_size[STATUSBAR_PARTS_NUM];
1228    sb_size[0]=width_owner-340;
1229    sb_size[1]=width_owner-220;
1230    sb_size[2]=width_owner-120;
1231    sb_size[3]=width_owner-50;
1232    sb_size[4]=width_owner;
1233    SendMessage(hStatusBar,SB_SETPARTS,STATUSBAR_PARTS_NUM,(LPARAM)sb_size);
1234    SendMessage(hStatusBar,WM_SIZE,0,MAKELONG(width_owner,height_owner));
1235    UpdateWindow(hStatusBar);
1236
1237    //Status bar
1238    int height_Statusbar;
1239    SendMessage(hStatusBar,SB_GETRECT,0,(long)&StatusRect);
1240    height_Statusbar=StatusRect.bottom;
1241
1242    GetWindowRect(pobj_Rebar->hRebar,&RebarRect);
1243    height_Rebar=RebarRect.bottom-RebarRect.top+2;
1244
1245    int height_dv;  //Width of Debugger View
1246    int height_cv;  //Width of Compiler View
1247    height_dv=0;
1248    height_cv=0;
1249#ifndef THETEXT
1250    if(bClipCompileView){
1251        if(pobj_Debugger->IsDebuggerView()){
1252            //デバッガビューが表示されているとき
1253            height_dv=pobj_nv->height_ClipDebuggerView+LEVER_THICK;
1254        }
1255        if(hCompileView){
1256            //コンパイラビューが表示されているとき
1257            height_cv=pobj_nv->height_ClipCompileView+LEVER_THICK;
1258        }
1259    }
1260#endif
1261
1262    int width_pjv=0;    //Width of Project View
1263    if(pobj_nv->bClipProjectView){
1264        if(IsWindowVisible(hProjectView)){
1265            //プロジェクトビューが表示されているとき
1266            width_pjv=pobj_nv->width_ClipProjectView+LEVER_THICK;
1267        }
1268    }
1269
1270    int width_SideWeb=0;
1271    if(pobj_SideWeb->bShow){
1272        width_SideWeb=pobj_nv->width_WebSearchView+LEVER_THICK;
1273    }
1274
1275    //MDIクライアントの高さ
1276    height_MdiClient=height_owner-(
1277        height_Rebar+
1278        height_dv+
1279        height_cv+
1280        height_Statusbar
1281        );
1282
1283    //タブコントロール
1284    int tab_height;
1285    if(TabCtrl_GetItemCount(pobj_MainTab->hTab)==0) tab_height=0;
1286    else{
1287        RECT rc;
1288        TabCtrl_GetItemRect(pobj_MainTab->hTab,0,&rc);
1289        tab_height=rc.bottom-rc.top;
1290    }
1291    MoveWindow(pobj_MainTab->hTab,
1292        width_pjv,
1293        height_Rebar,
1294        width_owner-width_pjv-width_SideWeb,
1295        tab_height,
1296        1);
1297
1298    //MDIクライアント
1299    MoveWindow(hClient,
1300        width_pjv,
1301        height_Rebar+tab_height,
1302        width_owner-width_pjv-width_SideWeb,
1303        height_MdiClient-tab_height,
1304        1);
1305
1306    if(pobj_SideWeb->bShow){
1307        //SideWeb
1308        pobj_SideWeb->resize(
1309            width_owner - pobj_nv->width_WebSearchView,
1310            height_Rebar,
1311            pobj_nv->width_WebSearchView,
1312            height_MdiClient);
1313    }
1314    else pobj_SideWeb->resize(0,0,0,0);
1315
1316    if(width_pjv){
1317        //プロジェクトビュー
1318        MoveWindow(hProjectView,
1319            0,
1320            height_Rebar,
1321            pobj_nv->width_ClipProjectView,
1322            height_MdiClient,
1323            1);
1324        InvalidateRect(hProjectView,NULL,0);
1325    }
1326
1327    if(height_dv){
1328#ifndef THETEXT
1329        //デバッガビュー
1330        pobj_Debugger->resize(
1331            0,
1332            height_Rebar+height_MdiClient+LEVER_THICK,
1333            width_owner,
1334            pobj_nv->height_ClipDebuggerView);
1335#endif
1336    }
1337    if(height_cv){
1338        //コンパイラビュー
1339        MoveWindow(hCompileView,
1340            0,
1341            height_Rebar+height_MdiClient+height_dv+LEVER_THICK,
1342            width_owner,
1343            pobj_nv->height_ClipCompileView,
1344            1);
1345    }
1346}
1347LRESULT CALLBACK WindowFunc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
1348    int i,i2,i3,WndNum;
1349    char str[MAX_PATH],temporary[1024],temp2[MAX_PATH],temp3[MAX_PATH],*pTemp;
1350    HWND hChild,hEdit;
1351    RECT rect;
1352    POINT pos;
1353    LPTOOLTIPTEXT TipText;
1354    LPNMHDR lpnmhdr;
1355    NMPGCALCSIZE *lpCalcSize;
1356    NMPGSCROLL *lpScroll;
1357    HDROP hDrop;
1358    HGLOBAL hGlobal;
1359    CHARRANGE CharRange;
1360    HANDLE hFile;
1361    BOOL bChecked;
1362
1363    static COLORREF colorUser=RGB(255,255,255);
1364
1365    if(message==WM_COMMAND&&IS_FILEHISTORY_COMMAND(LOWORD(wParam))){
1366        //「最近使ったファイル」メニューコマンド
1367        lstrcpy(str,pobj_nv->pobj_History->lpszPath[LOWORD(wParam)-100]);
1368        OpenFileWithExtension(str);
1369        return 0;
1370    }
1371
1372    if(message==WM_COMMAND&&200<=LOWORD(wParam)&&LOWORD(wParam)<=299){
1373        //「最近使ったプロジェクト」メニューコマンド
1374        lstrcpy(str,pobj_nv->pobj_ProjectHistory->lpszPath[LOWORD(wParam)-200]);
1375        OpenFileWithExtension(str);
1376        return 0;
1377    }
1378
1379    switch(message){
1380        case WM_CREATE:
1381            SetupWindow(hwnd);
1382
1383            //テキストエディタフォント設定
1384            ResetTextEditFont(hwnd);
1385
1386            //バックアップ用タイマーを設定(10秒に一回)
1387            SetTimer(hwnd,ID_TIMER_BACKUP,10000,NULL);
1388
1389            return 0;
1390
1391
1392        case WM_TIMER:
1393            //Pro版は自動バックアップ及び復元機能を有効にする
1394            _beginthread(backup,0,0);
1395
1396#ifndef THETEXT
1397            if(wParam==ID_DEBUGSAFTY){
1398                //BasicCompiler.exeが強制終了しているかどうかを検証
1399                pobj_Debugger->SaftyCheck();
1400            }
1401#endif
1402
1403            return 0;
1404
1405
1406        case WM_DRAWCLIPBOARD:
1407            ResetState_EditMenu();
1408            return 0;
1409
1410        case WM_MENUSELECT:
1411            MenuAdvice(wParam);
1412            return 0;
1413        case WM_INITMENU:
1414            pobj_nv->pobj_History->ResetFileMenu(pobj_FileHistoryMenu,1);
1415#ifndef THETEXT
1416            pobj_nv->pobj_ProjectHistory->ResetFileMenu(pobj_ProjectHistoryMenu,0);
1417#endif
1418            return 0;
1419        case WM_MEASUREITEM:
1420            LPMEASUREITEMSTRUCT lpMI;
1421            lpMI = (LPMEASUREITEMSTRUCT)lParam;
1422            if(lpMI->CtlType==ODT_MENU){
1423                SIZE size;
1424                CMenuItemData *pobj_MenuItemData;
1425                pobj_MenuItemData=(CMenuItemData *)lpMI->itemData;
1426                if(pobj_MenuItemData->pobj_ThisMenu->hMenu==pobj_MainMenu->hMenu){
1427                    //メインメニューの親アイテム
1428                    pobj_MainMenu->GetItemSize(pobj_MenuItemData->item_index,&size);
1429                    lpMI->itemWidth = size.cx;
1430                    lpMI->itemHeight = size.cy;
1431                }
1432                else{
1433                    //メインメニューにぶらさがるサブメニュー
1434                    pobj_MenuItemData->pobj_ThisMenu->GetItemSize(pobj_MenuItemData->item_index,&size);
1435                    lpMI->itemWidth = size.cx;
1436                    lpMI->itemHeight = size.cy;
1437                }
1438            }
1439            return 0;
1440
1441        case WM_DRAWITEM:
1442            DRAWITEMSTRUCT *pdis;
1443            pdis=(DRAWITEMSTRUCT *)lParam;
1444
1445            if(pdis->CtlType==ODT_MENU){
1446                if(!pobj_MainMenu) return 0;
1447
1448                CMenuItemData *pobj_MenuItemData;
1449                pobj_MenuItemData=(CMenuItemData *)pdis->itemData;
1450                if(pobj_MainMenu->hMenu==pobj_MenuItemData->pobj_ThisMenu->hMenu){
1451                    //メインメニューの親アイテム
1452                    pobj_MainMenu->OwnerDrawMenu(pdis->hDC,
1453                        &pdis->rcItem,
1454                        (pdis->itemState&ODS_SELECTED)!=0,
1455                        pobj_MenuItemData->item_index);
1456                }
1457                else{
1458                    //メインメニューにぶらさがるサブメニュー
1459                    pobj_MainMenu->OwnerDrawSubMenu(pobj_MenuItemData->pobj_ThisMenu->hMenu,
1460                        pdis->hDC,
1461                        &pdis->rcItem,
1462                        (pdis->itemState&ODS_SELECTED)!=0,
1463                        pobj_MenuItemData->item_index);
1464                }
1465            }
1466            return 0;
1467
1468        case WM_NOTIFY:
1469            if(!lParam) return 0;
1470            TipText=(LPTOOLTIPTEXT)lParam;
1471            if(TipText->hdr.code==TTN_NEEDTEXT) ShowToolTipText(TipText);
1472            lpnmhdr=(LPNMHDR)lParam;
1473
1474            extern HWND hStandardToolbarPager;
1475            extern HWND hDebuggerToolbarPager;
1476            if(pobj_Rebar){
1477                //レバーオブジェクトが存在するとき
1478                if(lpnmhdr->hwndFrom==pobj_Rebar->hRebar&&lpnmhdr->code==RBN_HEIGHTCHANGE){
1479                    ResizeOwnerWnd();
1480                    return 0;
1481                }
1482            }
1483            if(lpnmhdr->hwndFrom==hStandardToolbarPager){
1484                if(lpnmhdr->code==PGN_CALCSIZE){
1485                    lpCalcSize=(LPNMPGCALCSIZE)lParam;
1486                    if(lpCalcSize->dwFlag==PGF_CALCWIDTH)
1487                        lpCalcSize->iWidth=BMPNUM_STANDARDTOOLBAR*23+SEPNUM_STANDARDTOOLBAR*8;
1488                }
1489                else if(lpnmhdr->code==PGN_SCROLL){
1490                    lpScroll=(LPNMPGSCROLL)lParam;
1491                    lpScroll->iScroll=20;
1492                }
1493            }
1494            else if(lpnmhdr->hwndFrom==hDebuggerToolbarPager){
1495                if(lpnmhdr->code==PGN_CALCSIZE){
1496                    lpCalcSize=(LPNMPGCALCSIZE)lParam;
1497                    if(lpCalcSize->dwFlag==PGF_CALCWIDTH)
1498                        lpCalcSize->iWidth=BMPNUM_DEBUGGERTOOLBAR*23+SEPNUM_DEBUGGERTOOLBAR*8;
1499                }
1500                else if(lpnmhdr->code==PGN_SCROLL){
1501                    lpScroll=(LPNMPGSCROLL)lParam;
1502                    lpScroll->iScroll=20;
1503                }
1504            }
1505
1506            NMHDR *hdr;
1507            hdr=(NMHDR *)lParam;
1508            if(pobj_MainTab){
1509                if(hdr->hwndFrom==pobj_MainTab->hTab){
1510                    if(hdr->code==TCN_SELCHANGE)
1511                        pobj_MainTab->SelChangeEvent();
1512
1513                    if(hdr->code==NM_RCLICK){
1514
1515                        TCHITTESTINFO tcHitTest;
1516                        GetCursorPos(&tcHitTest.pt);
1517                        ScreenToClient(pobj_MainTab->hTab,&tcHitTest.pt);
1518                        i=TabCtrl_HitTest(pobj_MainTab->hTab,&tcHitTest);
1519                        if(i==-1) return 0;
1520
1521                        TabCtrl_SetCurSel(pobj_MainTab->hTab,i);
1522
1523                        pobj_MainTab->SelChangeEvent();
1524
1525
1526                        /////////////////////
1527                        // メニューを表示
1528                        /////////////////////
1529
1530                        hChild=GetWindow(hClient,GW_CHILD);
1531                        WndNum=GetWndNum(hChild);
1532
1533                        //保存コマンドの文字列をセット
1534                        MENUITEMINFO mii;
1535                        mii.cbSize=sizeof(MENUITEMINFO);
1536                        mii.fMask=MIIM_TYPE;
1537                        mii.dwTypeData=temporary;
1538                        mii.fType=MFT_STRING;
1539                        if(MdiInfo[WndNum].path[0]){
1540                            _splitpath(MdiInfo[WndNum].path,NULL,NULL,temporary,temp2);
1541                            lstrcat(temporary,temp2);
1542                            lstrcat(temporary," を保存(&S)");
1543                        }
1544                        else{
1545                            lstrcpy(temporary,"保存(&S)");
1546                        }
1547                        SetMenuItemInfo(hTabMenu,IDM_SAVE,FALSE,&mii);
1548
1549                        /*「絶対パスをコピー」「フォルダを開く」「ファイルを削除」
1550                                                        コマンドを場合によって無効化にする */
1551                        if(MdiInfo[WndNum].path[0]){
1552                            EnableMenuItem(hTabMenu,IDM_PATH_COPY,MF_BYCOMMAND|MF_ENABLED);
1553                            EnableMenuItem(hTabMenu,IDM_FOLDER_OPEN,MF_BYCOMMAND|MF_ENABLED);
1554                            EnableMenuItem(hTabMenu,IDM_DELETE_FILE,MF_BYCOMMAND|MF_ENABLED);
1555                        }
1556                        else{
1557                            EnableMenuItem(hTabMenu,IDM_PATH_COPY,MF_BYCOMMAND|MF_GRAYED);
1558                            EnableMenuItem(hTabMenu,IDM_FOLDER_OPEN,MF_BYCOMMAND|MF_GRAYED);
1559                            EnableMenuItem(hTabMenu,IDM_DELETE_FILE,MF_BYCOMMAND|MF_GRAYED);
1560                        }
1561
1562                        POINT MousePos;
1563                        GetCursorPos(&MousePos);
1564                        TrackPopupMenu(hTabMenu,TPM_LEFTALIGN|TPM_RIGHTBUTTON,MousePos.x,MousePos.y,0,hOwner,NULL);
1565                    }
1566                }
1567            }
1568            if(pobj_SideWeb){
1569                if(hdr->hwndFrom==pobj_SideWeb->hTab&&hdr->code==TCN_SELCHANGE){
1570                    pobj_SideWeb->SelChangeEvent();
1571                }
1572            }
1573
1574            return 0;
1575        case WM_COMMAND:
1576            switch(LOWORD(wParam)){
1577                case IDM_NEW:
1578                    CreateNewFile();
1579                    return 0;
1580                case IDM_OPEN:
1581                    //"ファイルを指定してください"
1582                    if(!GetFilePathDialog(hwnd,str,DefFileFilter,STRING_FILEOPENTITLE_DEFAULT,TRUE)) return 0;
1583
1584                    OpenFileWithExtension(str);
1585                    return 0;
1586                case IDM_CLOSE:
1587                    hChild=GetWindow(hClient,GW_CHILD);
1588                    if(IsWindow(hChild)) SendMessage(hChild,WM_CLOSE,0,0);
1589                    return 0;
1590#ifndef THETEXT
1591                case IDM_PROJECT_OPEN:
1592                    //"プロジェクト ファイルを指定して下さい"
1593                    if(!GetFilePathDialog(hwnd,str,ProjectFileFilter,STRING_FILEOPENTITLE_PROJECT,TRUE)) return 0;
1594
1595                    OpenProject(str);
1596                    return 0;
1597                case IDM_PROJECT_SAVE:
1598                    SaveProject();
1599                    return 0;
1600                case IDM_PROJECT_CLOSE:
1601                    CloseProject();
1602                    return 0;
1603                case IDM_PROJECT_FOLDER_OPEN:
1604                    ShellExecute(hwnd,"explore",ProjectInfo.dir,NULL,NULL,SW_SHOWNORMAL);
1605                    return 0;
1606#endif
1607                case IDM_SAVE:
1608                    SaveDocument(GetWindow(hClient,GW_CHILD),NULL);
1609                    return 0;
1610                case IDM_NEWSAVE:
1611                    //"保存先のファイルを指定してください"
1612                    if(!GetFilePathDialog(hwnd,str,DefFileFilter,STRING_FILESAVETITLE_DEFAULT,FALSE)) return 0;
1613
1614                    SaveDocument(GetWindow(hClient,GW_CHILD),str);
1615                    return 0;
1616                case IDM_CODE_SAVE:
1617                    //文字コードを指定して保存
1618                    DialogBox(hResInst,MAKEINTRESOURCE(IDD_CODE_SAVE),hOwner,nkfDlgCodeSave);
1619                    return 0;
1620                case IDM_ALLSAVE:
1621                    for(i=0;i<MAX_WNDNUM;i++){
1622                        if(MdiInfo[i].hwnd) SaveDocument(MdiInfo[i].hwnd,NULL);
1623                    }
1624                    if(ProjectInfo.name[0]) SaveProject();
1625                    return 0;
1626
1627                case IDM_PAGESET:
1628                    //ページ設定
1629                    obj_Page.SetupDlg();
1630                    return 0;
1631
1632                case IDM_PREVIEW:
1633                    //プレビュー(Pro版のみ)
1634                    Preview();
1635                    return 0;
1636
1637                case IDM_PRINTOUT:
1638                    //印刷
1639                    Printout();
1640                    return 0;
1641
1642                case IDM_EXIT:
1643                    SendMessage(hwnd,WM_CLOSE,0,0);
1644                    return 0;
1645                case IDM_UNDO:
1646                case (WORD)IDM_ACCEL_UNDO:
1647                    hChild=GetWindow(hClient,GW_CHILD);
1648                    if(!hChild) return 0;
1649                    WndNum=GetWndNum(hChild);
1650                    if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType))
1651                        TextEdit_UndoCommand(WndNum);
1652                    else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD)
1653                        Rad_UndoCommand(WndNum);
1654                    else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT)
1655                        IconEdit_UndoCommand(WndNum);
1656                    return 0;
1657                case IDM_REDO:
1658                case (WORD)IDM_ACCEL_REDO:
1659                    hChild=GetWindow(hClient,GW_CHILD);
1660                    if(!hChild) return 0;
1661                    WndNum=GetWndNum(hChild);
1662                    if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType))
1663                        TextEdit_RedoCommand(WndNum);
1664                    else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD)
1665                        Rad_RedoCommand(WndNum);
1666                    else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT)
1667                        IconEdit_RedoCommand(WndNum);
1668                    return 0;
1669                case IDM_CUT:
1670                    hChild=GetWindow(hClient,GW_CHILD);
1671                    WndNum=GetWndNum(hChild);
1672                    if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
1673                        hEdit=GetWindow(hChild,GW_CHILD);
1674
1675                        TextEdit_GetSel(WndNum,&CharRange);
1676
1677                        hGlobal=(char *)GlobalAlloc(GMEM_MOVEABLE,CharRange.cpMax-CharRange.cpMin+1);
1678                        pTemp=(char *)GlobalLock(hGlobal);
1679                        memcpy(pTemp,MdiInfo[WndNum].pMdiTextEdit->buffer+CharRange.cpMin,CharRange.cpMax-CharRange.cpMin);
1680                        pTemp[CharRange.cpMax-CharRange.cpMin]=0;
1681                        GlobalUnlock(hGlobal);
1682
1683                        //クリップボードに保存
1684                        OpenClipboard(hwnd);
1685                        EmptyClipboard();
1686                        SetClipboardData(CF_TEXT,hGlobal);
1687                        CloseClipboard();
1688
1689                        //選択文字列を消去
1690                        SendMessage(hEdit,WM_KEYDOWN,VK_DELETE,0);
1691                    }
1692                    else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){
1693                        i2=GetWndInfoNum(MdiInfo[WndNum].path);
1694
1695                        //クリップボードに格納するためのデータを用意する
1696                        ProjectInfo.pWindowInfo[i2].pChildInfo[MdiInfo[WndNum].MdiRadInfo->SelectingItem[0]].pos.x-=17;
1697                        ProjectInfo.pWindowInfo[i2].pChildInfo[MdiInfo[WndNum].MdiRadInfo->SelectingItem[0]].pos.y-=10;
1698                        hGlobal=Rad_GetChildInfoClipboardData(WndNum,i2);
1699                        ProjectInfo.pWindowInfo[i2].pChildInfo[MdiInfo[WndNum].MdiRadInfo->SelectingItem[0]].pos.x+=17;
1700                        ProjectInfo.pWindowInfo[i2].pChildInfo[MdiInfo[WndNum].MdiRadInfo->SelectingItem[0]].pos.y+=10;
1701
1702                        OpenClipboard(hwnd);
1703                        EmptyClipboard();
1704                        SetClipboardData(dwRadClipboardID,hGlobal);
1705                        CloseClipboard();
1706
1707                        SendMessage(MdiInfo[WndNum].MdiRadInfo->hRad,WM_COMMAND,IDM_RAD_ITEM_DELETE,0);
1708                    }
1709                    else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
1710                        //クリップボードに格納するためのデータを用意する
1711                        hGlobal=IconEdit_GetChildInfoClipboardData(WndNum);
1712                        if(hGlobal==0) return 0;
1713
1714                        OpenClipboard(hwnd);
1715                        EmptyClipboard();
1716                        SetClipboardData(CF_BITMAP,hGlobal);
1717                        CloseClipboard();
1718
1719                        DeleteObject(MdiInfo[WndNum].MdiIconEditInfo->hSelectingBmp);
1720                        MdiInfo[WndNum].MdiIconEditInfo->SelectLevel=0;
1721
1722                        IconEdit_EraseRect(WndNum,&MdiInfo[WndNum].MdiIconEditInfo->DraggingRect);
1723                    }
1724                    return 0;
1725                case IDM_COPY:
1726                    hChild=GetWindow(hClient,GW_CHILD);
1727                    WndNum=GetWndNum(hChild);
1728                    if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
1729                        hEdit=GetWindow(hChild,GW_CHILD);
1730
1731                        TextEdit_GetSel(WndNum,&CharRange);
1732
1733                        hGlobal=(char *)GlobalAlloc(GMEM_MOVEABLE,CharRange.cpMax-CharRange.cpMin+1);
1734                        pTemp=(char *)GlobalLock(hGlobal);
1735                        memcpy(pTemp,MdiInfo[WndNum].pMdiTextEdit->buffer+CharRange.cpMin,CharRange.cpMax-CharRange.cpMin);
1736                        pTemp[CharRange.cpMax-CharRange.cpMin]=0;
1737                        GlobalUnlock(hGlobal);
1738
1739                        //クリップボードに保存
1740                        OpenClipboard(hwnd);
1741                        EmptyClipboard();
1742                        SetClipboardData(CF_TEXT,hGlobal);
1743                        CloseClipboard();
1744                    }
1745                    else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){
1746                        i2=GetWndInfoNum(MdiInfo[WndNum].path);
1747
1748                        //クリップボードに格納するためのデータを用意する
1749                        hGlobal=Rad_GetChildInfoClipboardData(WndNum,i2);
1750
1751                        OpenClipboard(hwnd);
1752                        EmptyClipboard();
1753                        SetClipboardData(dwRadClipboardID,hGlobal);
1754                        CloseClipboard();
1755                    }
1756                    else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
1757                        //クリップボードに格納するためのデータを用意する
1758                        hGlobal=IconEdit_GetChildInfoClipboardData(WndNum);
1759
1760                        OpenClipboard(hwnd);
1761                        EmptyClipboard();
1762                        SetClipboardData(CF_BITMAP,hGlobal);
1763                        CloseClipboard();
1764                    }
1765                    return 0;
1766                case IDM_PASTE:
1767                    hChild=GetWindow(hClient,GW_CHILD);
1768                    WndNum=GetWndNum(hChild);
1769                    if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
1770                        hEdit=GetWindow(hChild,GW_CHILD);
1771
1772                        //クリップボードを開く
1773                        OpenClipboard(hwnd);
1774                        hGlobal=GetClipboardData(CF_TEXT);
1775                        if(!hGlobal){
1776                            CloseClipboard();
1777                            return 0;
1778                        }
1779
1780
1781                        if(pobj_nv->bPasteIndent){
1782                            //インデント整形
1783                            pTemp=CodeFormatter((char *)GlobalLock(hGlobal));
1784                            GlobalUnlock(hGlobal);
1785                        }
1786                        else pTemp=(char *)GlobalLock(hGlobal);
1787
1788
1789                        //テキストエディタの文字列をリプレイス
1790                        TextEdit_ReplaceUpdateUndoData(WndNum,
1791                            pTemp,
1792                            1,
1793                            1);
1794
1795                        if(pobj_nv->bPasteIndent)
1796                            HeapDefaultFree(pTemp);
1797                        else
1798                            GlobalUnlock(hGlobal);
1799
1800                        //クリップボードを閉じる
1801                        CloseClipboard();
1802
1803
1804                        //キャレット位置までスクロールする
1805                        TextEdit_ScrollCaret(WndNum,0);
1806                        ResetCaretPos(WndNum);
1807                    }
1808                    else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){
1809                        OpenClipboard(hwnd);
1810                        hGlobal=GetClipboardData(dwRadClipboardID);
1811                        if(!hGlobal){
1812                            CloseClipboard();
1813                            return 0;
1814                        }
1815                        Rad_PasteChildInfoClipboardData(WndNum,hGlobal);
1816                        CloseClipboard();
1817                    }
1818                    else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
1819                        OpenClipboard(hwnd);
1820                        hGlobal=GetClipboardData(CF_BITMAP);
1821                        if(!hGlobal){
1822                            CloseClipboard();
1823                            return 0;
1824                        }
1825                        IconEdit_PasteChildInfoClipboardData(WndNum,(HBITMAP)hGlobal);
1826                        CloseClipboard();
1827                    }
1828                    return 0;
1829                case IDM_DELETE:
1830                    hChild=GetWindow(hClient,GW_CHILD);
1831                    WndNum=GetWndNum(hChild);
1832                    if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
1833                        hEdit=GetWindow(hChild,GW_CHILD);
1834                        TextEdit_ReplaceUpdateUndoData(WndNum,"",0,1);
1835                    }
1836                    else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD)
1837                        SendMessage(MdiInfo[WndNum].MdiRadInfo->hRad,WM_COMMAND,IDM_RAD_ITEM_DELETE,0);
1838                    return 0;
1839                case IDM_ALLSELECT:
1840                    hChild=GetWindow(hClient,GW_CHILD);
1841                    WndNum=GetWndNum(hChild);
1842                    if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
1843                        hEdit=GetWindow(hChild,GW_CHILD);
1844
1845                        MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x=0;
1846                        MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y=0;
1847
1848                        GetCaretPosFromBufferIndex(
1849                            MdiInfo[WndNum].pMdiTextEdit->buffer,
1850                            lstrlen(MdiInfo[WndNum].pMdiTextEdit->buffer),
1851                            &MdiInfo[WndNum].pMdiTextEdit->EndCaretPos);
1852
1853                        InvalidateRect(hEdit,NULL,0);
1854
1855                        ResetState_EditMenu();
1856                    }
1857                    else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){
1858                        i2=GetWndInfoNum(MdiInfo[WndNum].path);
1859                        for(i3=0;i3<ProjectInfo.pWindowInfo[i2].NumberOfChildWindows;i3++){
1860                            MdiInfo[WndNum].MdiRadInfo->SelectingItem[i3]=i3;
1861                        }
1862                        DrawRadWindow(WndNum,&ProjectInfo.pWindowInfo[i2]);
1863                    }
1864                    return 0;
1865                case IDM_FIND:
1866                    DialogBox(hResInst,MAKEINTRESOURCE(IDD_FIND),hOwner,DlgFind);
1867                    return 0;
1868                case IDM_PERMUTATION:
1869                    DialogBox(hResInst,MAKEINTRESOURCE(IDD_PERMUTATION),hOwner,DlgPermutation);
1870                    return 0;
1871
1872
1873                ///////////////////////
1874                // 変換メニュー
1875                ///////////////////////
1876                case IDM_CONV_ALPHA_SMALL:
1877                case IDM_CONV_ALPHA_BIG:
1878                case IDM_CONV_HALF:
1879                case IDM_CONV_MULTI:
1880                case IDM_CONV_KATAKANA:
1881                case IDM_CONV_HIRAGANA:
1882                case IDM_CONV_SPACE:
1883                case IDM_CONV_TAB:
1884#ifdef THETEXT
1885                case IDM_CONV_HASRETURN:
1886                case IDM_CONV_QUOTE:
1887#else
1888                case IDM_CODEFORMAT:
1889#endif
1890                    TextEdit_Convert(LOWORD(wParam));
1891                    return 0;
1892
1893#ifdef THETEXT
1894                ///////////////////////
1895                // ツールメニュー
1896                ///////////////////////
1897                case IDM_STRING_COUNT:
1898                    DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_STRING_COUNT),hOwner,DlgStringCount,0);
1899                    return 0;
1900                case IDM_SEL_STRING_COUNT:
1901                    DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_STRING_COUNT),hOwner,DlgStringCount,1);
1902                    return 0;
1903#endif //THETEXT
1904
1905                case IDM_PROJECTVIEW:
1906                    if(pobj_nv->bClipProjectView){
1907                        if(IsWindowVisible(hProjectView)){
1908                            ShowWindow(hProjectView,SW_HIDE);
1909                            bChecked=0;
1910                        }
1911                        else{
1912                            ShowWindow(hProjectView,SW_SHOW);
1913                            bChecked=1;
1914                        }
1915                    }
1916                    else{
1917                        if(IsWindowVisible(hProjectView_ToolWindow)){
1918                            ShowWindow(hProjectView_ToolWindow,SW_HIDE);
1919                            bChecked=0;
1920                        }
1921                        else{
1922                            ShowWindow(hProjectView_ToolWindow,SW_SHOW);
1923                            ShowWindow(hProjectView,SW_SHOW);
1924                            bChecked=1;
1925                        }
1926                    }
1927                    pobj_MainMenu->CheckMenu(IDM_PROJECTVIEW,bChecked);
1928
1929                    //再配置
1930                    ResizeOwnerWnd();
1931
1932                    ShowWindow(hClient,SW_SHOW);
1933                    return 0;
1934                case IDM_PROJECT_OPTION:
1935                    DlgProjectOptionSetting(hwnd);
1936                    return 0;
1937                case IDM_TOPMOST:
1938                    if(pobj_MainMenu->IsCheck(IDM_TOPMOST)){
1939                        SetWindowPos(hwnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
1940                        pobj_MainMenu->CheckMenu(IDM_TOPMOST,0);
1941                    }
1942                    else{
1943                        SetWindowPos(hwnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
1944                        pobj_MainMenu->CheckMenu(IDM_TOPMOST,1);
1945                    }
1946                    return 0;
1947
1948#ifdef THETEXT
1949                case IDM_RIGHT_TURN:
1950                    pobj_nv->bRightTurn^=1;
1951                    ResetState_ViewMenu();
1952
1953                    //トップのウィンドウを再描画
1954                    RedrawAllWindow();
1955
1956                    return 0;
1957#endif
1958
1959                case IDM_SET:
1960                    DlgOptionSetting(hwnd);
1961                    return 0;
1962
1963#ifndef THETEXT
1964                case IDM_DEBUG:
1965                    if(pobj_Debugger->IsDebugging()){
1966                        pobj_Debugger->DebugContinue();
1967                        return 0;
1968                    }
1969
1970                    hChild=GetWindow(hClient,GW_CHILD);
1971                    if(ProjectInfo.name[0]){
1972                        //プロジェクトが開かれている場合
1973                        if(!SetProjectToRun()) return 0;
1974
1975                        //デバッグ用のコマンドライン及び実行可能ファイル(DLLのみ)
1976                        sprintf(temporary,"%s\r\n%s",ProjectInfo.szExePath,ProjectInfo.szCmdLine);
1977                        sprintf(temp2,"%spgm.tmp",pj_editor_Dir);
1978                        hFile=CreateFile(temp2,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_TEMPORARY,NULL);
1979                        DWORD dwAccessBytes;
1980                        WriteFile(hFile,temporary,lstrlen(temporary),&dwAccessBytes,NULL);
1981                        CloseHandle(hFile);
1982
1983                        //ソースファイル名をtemp2へ
1984                        ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[0]->GetFullPath(temp2);
1985
1986                        //出力ファイル名をtemp3へ
1987                        lstrcpy(temp3,ProjectInfo.lpszOutput_Debug);
1988                        GetFullPath(temp3,ProjectInfo.dir);
1989
1990                        if(IsNeedCompileForProject(1))
1991                            sprintf(temporary,"\"%s\" \"%s\" /debug /run /wnd:%08x",temp2,temp3,hwnd);
1992                        else
1993                            sprintf(temporary,"\"%s\" \"%s\" /run /wnd:%08x",temp2,temp3,hwnd);
1994
1995                        //DLLオプション
1996                        if(ProjectInfo.dwModuleType==MT_DLL) lstrcat(temporary," /dll");
1997
1998                        //ブレークポイントをセーブ
1999                        ProjectInfo.pobj_DBBreakPoint->SaveToTempFile();
2000                    }
2001                    else{
2002                        //単独ソースコード
2003                        if(!SetRunning(hChild)) return 0;
2004                        if(IsNeedCompile(MdiInfo[GetWndNum(hChild)].path,1))
2005                            sprintf(temporary,"\"%s\" /debug /run /wnd:%08x",MdiInfo[GetWndNum(hChild)].path,hwnd);
2006                        else
2007                            sprintf(temporary,"\"%s\" /run /wnd:%08x",MdiInfo[GetWndNum(hChild)].path,hwnd);
2008
2009                        //ブレークポイントをセーブ
2010                        pobj_DBBreakPoint->SaveToTempFile();
2011                    }
2012
2013                    //コンパイルビューをクリップするかどうか
2014                    if(bClipCompileView){
2015                        lstrcat(temporary," /clip_compile_view");
2016
2017                        //コンパイラビューを閉じる
2018                        if(hCompileView==(HWND)-1) return 0;
2019                        if(hCompileView){
2020                            hChild=hCompileView;
2021                            hCompileView=(HWND)-1;
2022                            SendMessage(hChild,WM_COMMAND,IDCANCEL,0);
2023                        }
2024
2025                        //重複起動防止のため
2026                        hCompileView=(HWND)-1;
2027                    }
2028
2029                    sprintf(str,"%s%s",pj_editor_Dir,lpszCompilerName);
2030                    ShellExecute(hwnd,"open",str,temporary,NULL,SW_SHOWNORMAL);
2031                    return 0;
2032                case IDM_DEBUGCOMPILE:
2033                    hChild=GetWindow(hClient,GW_CHILD);
2034                    if(ProjectInfo.name[0]){
2035                        //プロジェクトが開かれている場合
2036                        if(!SetProjectToRun()) return 0;
2037
2038                        //ソースファイル名をtemp2へ
2039                        ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[0]->GetFullPath(temp2);
2040
2041                        //出力ファイル名をtemp3へ
2042                        lstrcpy(temp3,ProjectInfo.lpszOutput_Debug);
2043                        GetFullPath(temp3,ProjectInfo.dir);
2044
2045                        sprintf(temporary,"\"%s\" \"%s\" /debug /wnd:%08x",temp2,temp3,hwnd);
2046
2047                        //DLLオプション
2048                        if(ProjectInfo.dwModuleType==MT_DLL) lstrcat(temporary," /dll");
2049                    }
2050                    else{
2051                        //単独ソースコード
2052                        if(!SetRunning(hChild)) return 0;
2053                        sprintf(temporary,"\"%s\" /debug /wnd:%08x",MdiInfo[GetWndNum(hChild)].path,hwnd);
2054                    }
2055
2056                    //コンパイルビューをクリップするかどうか
2057                    if(bClipCompileView){
2058                        lstrcat(temporary," /clip_compile_view");
2059
2060                        //コンパイラビューを閉じる
2061                        if(hCompileView==(HWND)-1) return 0;
2062                        if(hCompileView){
2063                            hChild=hCompileView;
2064                            hCompileView=(HWND)-1;
2065                            SendMessage(hChild,WM_COMMAND,IDCANCEL,0);
2066                        }
2067
2068                        //重複起動防止のため
2069                        hCompileView=(HWND)-1; 
2070                    }
2071
2072                    //インクルードディレクトリ
2073                    sprintf(temp2," /include_dir:\"%s\"",pobj_nv->szIncludeDir);
2074                    lstrcat(temporary,temp2);
2075
2076                    sprintf(str,"%s%s",pj_editor_Dir,lpszCompilerName);
2077                    ShellExecute(hwnd,"open",str,temporary,NULL,SW_SHOWNORMAL);
2078
2079                    return 0;
2080                case IDM_ATTACH:
2081                    int idProcess;
2082                    DWORD dwPlatform;
2083                    idProcess=DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_ATTACH),hwnd,DlgAttach,(LPARAM)&dwPlatform);
2084                    if(idProcess==0) return 0;
2085
2086                    sprintf(temporary,"/attach:%08x /wnd:%08x",idProcess,hwnd);
2087
2088                    //コンパイルビューをクリップするかどうか
2089                    if(bClipCompileView){
2090                        lstrcat(temporary," /clip_compile_view");
2091
2092                        //コンパイラビューを閉じる
2093                        if(hCompileView==(HWND)-1) return 0;
2094                        if(hCompileView){
2095                            hChild=hCompileView;
2096                            hCompileView=(HWND)-1;
2097                            SendMessage(hChild,WM_COMMAND,IDCANCEL,0);
2098                        }
2099
2100                        //重複起動防止のため
2101                        hCompileView=(HWND)-1;
2102                    }
2103
2104                    //インクルードディレクトリ
2105                    sprintf(temp2," /include_dir:\"%s\"",pobj_nv->szIncludeDir);
2106                    lstrcat(temporary,temp2);
2107
2108                    if(dwPlatform==IMAGE_FILE_MACHINE_I386)
2109                        sprintf(str,"%s%s",pj_editor_Dir,WIN32_COMPILER_NAME);
2110                    else if(dwPlatform==IMAGE_FILE_MACHINE_AMD64)
2111                        sprintf(str,"%s%s",pj_editor_Dir,WIN64_COMPILER_NAME);
2112
2113                    ShellExecute(hwnd,"open",str,temporary,NULL,SW_SHOWNORMAL);
2114                    return 0;
2115                case IDM_RELEASECOMPILE:
2116                    hChild=GetWindow(hClient,GW_CHILD);
2117                    if(ProjectInfo.name[0]){
2118                        //プロジェクトが開かれている場合
2119                        if(!SetProjectToRun()) return 0;
2120
2121                        //ソースファイル名をtemp2へ
2122                        ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[0]->GetFullPath(temp2);
2123
2124                        //出力ファイル名をtemp3へ
2125                        lstrcpy(temp3,ProjectInfo.lpszOutput_Release);
2126                        GetFullPath(temp3,ProjectInfo.dir);
2127
2128                        sprintf(temporary,"\"%s\" \"%s\" /wnd:%08x",temp2,temp3,hwnd);
2129
2130                        //DLLオプション
2131                        if(ProjectInfo.dwModuleType==MT_DLL) lstrcat(temporary," /dll");
2132                    }
2133                    else{
2134                        //単独ソースコード
2135                        if(!SetRunning(hChild)) return 0;
2136                        sprintf(temporary,"\"%s\" /wnd:%08x",MdiInfo[GetWndNum(hChild)].path,hwnd);
2137                    }
2138
2139                    //コンパイルビューをクリップするかどうか
2140                    if(bClipCompileView){
2141                        lstrcat(temporary," /clip_compile_view");
2142
2143                        //コンパイラビューを閉じる
2144                        if(hCompileView==(HWND)-1) return 0;
2145                        if(hCompileView){
2146                            hChild=hCompileView;
2147                            hCompileView=(HWND)-1;
2148                            SendMessage(hChild,WM_COMMAND,IDCANCEL,0);
2149                        }
2150
2151                        //重複起動防止のため
2152                        hCompileView=(HWND)-1;
2153                    }
2154
2155                    //インクルードディレクトリ
2156                    sprintf(temp2," /include_dir:\"%s\"",pobj_nv->szIncludeDir);
2157                    lstrcat(temporary,temp2);
2158
2159                    sprintf(str,"%s%s",pj_editor_Dir,lpszCompilerName);
2160                    ShellExecute(hwnd,"open",str,temporary,NULL,SW_SHOWNORMAL);
2161                    return 0;
2162                case IDM_RELEASERUN:
2163                    hChild=GetWindow(hClient,GW_CHILD);
2164                    if(ProjectInfo.name[0]){
2165/*                      //プロジェクトが開かれている場合
2166                        if(!SetProjectToRun()) return 0;
2167
2168                        //必要であればリリースコンパイル
2169                        if(IsNeedCompileForProject(0))
2170                            SendMessage(hwnd,WM_COMMAND,IDM_RELEASECOMPILE,0);*/
2171
2172                        if(ProjectInfo.dwModuleType==MT_DLL){
2173                            lstrcpy(temporary,ProjectInfo.szExePath);
2174                        }
2175                        else{
2176                            lstrcpy(temporary,ProjectInfo.lpszOutput_Debug);
2177                            GetFullPath(temporary,ProjectInfo.dir);
2178                        }
2179                    }
2180                    else{
2181/*                      //必要であればリリースコンパイル
2182                        if(!SetRunning(hChild)) return 0;
2183
2184                        if(IsNeedCompile(MdiInfo[GetWndNum(hChild)].path,0))
2185                            SendMessage(hwnd,WM_COMMAND,IDM_RELEASECOMPILE,0);*/
2186
2187                        //単独ソースコード
2188                        _splitpath(MdiInfo[GetWndNum(hChild)].path,temporary,temp2,temp3,NULL);
2189                        lstrcat(temporary,temp2);
2190                        lstrcat(temporary,temp3);
2191                        lstrcat(temporary,".exe");
2192                    }
2193
2194                    //インクルードディレクトリ
2195                    sprintf(temp2," /include_dir:\"%s\"",pobj_nv->szIncludeDir);
2196                    lstrcat(temporary,temp2);
2197
2198                    ShellExecute(hwnd,"open",temporary,NULL,NULL,SW_SHOWNORMAL);
2199                    return 0;
2200
2201
2202                ////////////////////////
2203                // デバッグ コマンド
2204                ////////////////////////
2205
2206                case IDM_STEP_IN:
2207                    pobj_Debugger->StepIn();
2208                    break;
2209                case IDM_STEP_OVER:
2210                    pobj_Debugger->StepOver();
2211                    break;
2212                case IDM_STEP_CURSOR:
2213                    pobj_Debugger->StepToCursor();
2214                    break;
2215                case IDM_BREAKPOINT:
2216                    if(ProjectInfo.name[0]){
2217                        ProjectInfo.pobj_DBBreakPoint->Event_BreakPoint();
2218                    }
2219                    else{
2220                        pobj_DBBreakPoint->Event_BreakPoint();
2221                    }
2222                    break;
2223                case IDM_DEBUG_STOP:
2224                    pobj_Debugger->DebugStop();
2225                    break;
2226                case IDM_DEBUG_PAUSE:
2227                    pobj_Debugger->DebugPause();
2228                    break;
2229
2230
2231                case IDM_COMMUNITY:
2232                    ShellExecute(hwnd,"open","iexplore.exe",
2233                        "http://www.activebasic.com/forum/",
2234                        NULL,SW_SHOWNORMAL);
2235                    return 0;
2236                case IDM_COMMU_SEARCH:
2237                    ShellExecute(hwnd,"open","iexplore.exe",
2238                        "http://www.activebasic.com/forum/search.php",
2239                        NULL,SW_SHOWNORMAL);
2240                    return 0;
2241                case IDM_COMMU_PM:
2242                    ShellExecute(hwnd,"open","iexplore.exe",
2243                        "http://www.activebasic.com/forum/privmsg.php?folder=inbox",
2244                        NULL,SW_SHOWNORMAL);
2245                    return 0;
2246                case ID_COMMU_FORUM1:
2247                    ShellExecute(hwnd,"open","iexplore.exe",
2248                        "http://www.activebasic.com/forum/viewforum.php?f=1",
2249                        NULL,SW_SHOWNORMAL);
2250                    return 0;
2251                case ID_COMMU_FORUM2:
2252                    ShellExecute(hwnd,"open","iexplore.exe",
2253                        "http://www.activebasic.com/forum/viewforum.php?f=2",
2254                        NULL,SW_SHOWNORMAL);
2255                    return 0;
2256                case ID_COMMU_FORUM3:
2257                    ShellExecute(hwnd,"open","iexplore.exe",
2258                        "http://www.activebasic.com/forum/viewforum.php?f=5",
2259                        NULL,SW_SHOWNORMAL);
2260                    return 0;
2261                case ID_COMMU_FORUM4:
2262                    ShellExecute(hwnd,"open","iexplore.exe",
2263                        "http://www.activebasic.com/forum/viewforum.php?f=3",
2264                        NULL,SW_SHOWNORMAL);
2265                    return 0;
2266                case ID_COMMU_FORUM5:
2267                    ShellExecute(hwnd,"open","iexplore.exe",
2268                        "http://www.activebasic.com/forum/viewforum.php?f=6",
2269                        NULL,SW_SHOWNORMAL);
2270                    return 0;
2271                case ID_COMMU_FORUM6:
2272                    ShellExecute(hwnd,"open","iexplore.exe",
2273                        "http://www.activebasic.com/forum/viewforum.php?f=8",
2274                        NULL,SW_SHOWNORMAL);
2275                    return 0;
2276                case ID_COMMU_FORUM7:
2277                    ShellExecute(hwnd,"open","iexplore.exe",
2278                        "http://www.activebasic.com/forum/viewforum.php?f=4",
2279                        NULL,SW_SHOWNORMAL);
2280                    return 0;
2281                case ID_COMMU_FORUM8:
2282                    ShellExecute(hwnd,"open","iexplore.exe",
2283                        "http://www.activebasic.com/forum/viewforum.php?f=7",
2284                        NULL,SW_SHOWNORMAL);
2285                    return 0;
2286#endif //THETEXT
2287
2288
2289                case IDM_TOPIC:
2290#ifdef THETEXT
2291                    sprintf(str,"%sTopics\\index.html",pj_editor_Dir);
2292                    ShellExecute(hwnd,"open",str,NULL,NULL,SW_SHOWNORMAL);
2293#else
2294                    sprintf(str,"%sBasicHelp.chm",pj_editor_Dir);
2295                    HtmlHelp(NULL,str,HH_DISPLAY_TOPIC,0);
2296#endif
2297                    return 0;
2298
2299#ifdef THETEXT
2300                case IDM_DSHOMEPAGE:
2301                    ShellExecute(hwnd,"open","http://www.discoversoft.net/",NULL,NULL,SW_SHOWNORMAL);
2302                    return 0;
2303#else
2304                case IDM_AB_WEBSITE:
2305                    ShellExecute(hwnd,"open","http://www.activebasic.com/",NULL,NULL,SW_SHOWNORMAL);
2306                    return 0;
2307                case IDM_ACTBDL:
2308                    ShellExecute(hwnd,"open","http://www.activebasic.com/activebasic5/download.htm",NULL,NULL,SW_SHOWNORMAL);
2309                    return 0;
2310#endif
2311
2312                case IDM_ABOUT:
2313                    DialogBox(hResInst,MAKEINTRESOURCE(IDD_ABOUT),hwnd,DialogAbout);
2314                    return 0;
2315
2316                case IDM_WEB_SEARCH:
2317                    hChild=GetWindow(hClient,GW_CHILD);
2318                    WndNum=GetWndNum(hChild);
2319                    if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
2320                        extern HWND hWebSearchCombo;
2321                        SendMessage(GetWindow(hWebSearchCombo,GW_CHILD),WM_CHAR,VK_RETURN,0);
2322                    }
2323                    return 0;
2324
2325
2326
2327                //////////////////////////////////////////////////////
2328                // レバーコントロールのサブメニューコマンド(レバー追加)
2329                //////////////////////////////////////////////////////
2330
2331                case IDM_DOCSELECTBAND:
2332                    pobj_Rebar->ChangeRebarBand(ID_DOCCOMBO);
2333                    return 0;
2334                case IDM_STANDARDBAND:
2335                    pobj_Rebar->ChangeRebarBand(ID_STANDARDTOOLBAR);
2336                    return 0;
2337#ifndef THETEXT
2338                case IDM_RELEASEBAND:
2339                    pobj_Rebar->ChangeRebarBand(ID_RELEASETOOLBAR);
2340                    return 0;
2341                case IDM_DEBUGBAND:
2342                    pobj_Rebar->ChangeRebarBand(ID_DEBUGGERTOOLBAR);
2343                    return 0;
2344                case IDM_SELECTCOMPILERBAND:
2345                    pobj_Rebar->ChangeRebarBand(ID_SELECTCOMPILERCOMBO);
2346                    return 0;
2347#endif
2348                case IDM_BANDMENU_WEB_SEARCH:
2349                    pobj_Rebar->ChangeRebarBand(ID_WEB_SEARCH);
2350                    return 0;
2351                case IDM_NOGRIPPER:
2352                    if(pobj_nv->bNoGripper) pobj_nv->bNoGripper=0;
2353                    else pobj_nv->bNoGripper=1;
2354
2355                    //レバーコントロールを再生成
2356                    pobj_Rebar->ResetRebar();
2357
2358                    //メニュー状態を設定
2359                    ResetState_DocMenu();
2360                    return 0;
2361                case IDM_RESET_REBAR:
2362                    //"ツールバーの配置をすべて初期状態に戻します。\nよろしいですか?"
2363                    if(IDCANCEL==MessageBox(hwnd,STRING_TOOLBAR_RESET,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
2364
2365                    //レバーコントロールを再生成
2366                    pobj_Rebar->ResetInitRebar();
2367
2368                    //メニュー状態を設定
2369                    ResetState_DocMenu();
2370                    return 0;
2371
2372
2373
2374                ////////////////////////////////////////////////////
2375                // メイン タブ コントロールのサブメニューコマンド
2376                ////////////////////////////////////////////////////
2377
2378                case IDM_ALLCLOSE_OMIT_MYSELF:
2379                    //このウィンドウ以外をすべて閉じる(&A)
2380                    hChild=GetWindow(hClient,GW_CHILD);
2381                    WndNum=GetWndNum(hChild);
2382                    for(i=0;i<MAX_WNDNUM;i++){
2383                        if(i==WndNum) continue;
2384                        if(MdiInfo[i].hwnd) SendMessage(MdiInfo[i].hwnd,WM_CLOSE,0,0);
2385                    }
2386                    return 0;
2387
2388                case IDM_PATH_COPY:
2389                    hChild=GetWindow(hClient,GW_CHILD);
2390                    WndNum=GetWndNum(hChild);
2391
2392                    //絶対パスをコピー
2393                    hGlobal=(char *)GlobalAlloc(GMEM_MOVEABLE,lstrlen(MdiInfo[WndNum].path)+1);
2394                    pTemp=(char *)GlobalLock(hGlobal);
2395                    lstrcpy(pTemp,MdiInfo[WndNum].path);
2396                    GlobalUnlock(hGlobal);
2397
2398                    //クリップボードに保存
2399                    OpenClipboard(hwnd);
2400                    EmptyClipboard();
2401                    SetClipboardData(CF_TEXT,hGlobal);
2402                    CloseClipboard();
2403                    return 0;
2404
2405                case IDM_FOLDER_OPEN:
2406                    hChild=GetWindow(hClient,GW_CHILD);
2407                    WndNum=GetWndNum(hChild);
2408
2409                    _splitpath(MdiInfo[WndNum].path,temporary,temp2,NULL,NULL);
2410                    lstrcat(temporary,temp2);
2411
2412                    ShellExecute(hwnd,"explore",temporary,NULL,NULL,SW_SHOWNORMAL);
2413                    return 0;
2414
2415                case IDM_DELETE_FILE:
2416                    hChild=GetWindow(hClient,GW_CHILD);
2417                    WndNum=GetWndNum(hChild);
2418
2419                    _splitpath(MdiInfo[WndNum].path,NULL,NULL,temporary,temp2);
2420                    lstrcat(temporary,temp2);
2421
2422                    lstrcat(temporary," をごみ箱に移動して閉じます。よろしいですか?");
2423                    if(MessageBox(hwnd,temporary,APPLICATION_NAME,MB_OKCANCEL|MB_ICONQUESTION)==IDCANCEL) return 0;
2424
2425                    //ゴミ箱へ
2426                    SHFILEOPSTRUCT fo;
2427                    fo.hwnd=hwnd;
2428                    fo.wFunc=FO_DELETE;
2429                    fo.pFrom =MdiInfo[WndNum].path;
2430                    fo.pTo="\0";
2431                    fo.fFlags =FOF_ALLOWUNDO|FOF_NOCONFIRMATION;
2432                    SHFileOperation(&fo);
2433
2434                    //閉じる
2435                    MdiInfo[WndNum].pMdiTextEdit->UnModify();
2436                    SendMessage(MdiInfo[WndNum].hwnd,WM_CLOSE,0,0);
2437
2438                    return 0;
2439
2440                case IDM_USER_COLOR:
2441                    {
2442                        CHOOSECOLOR cc;
2443                        COLORREF CusColors[16]={
2444                            RGB(255,255,255),
2445                            RGB(0,0,0),
2446                            RGB(128,128,128),
2447                            RGB(192,192,192),
2448                            RGB(128,0,0),
2449                            RGB(255,0,0),
2450                            RGB(128,128,0),
2451                            RGB(255,255,0),
2452                            RGB(0,128,0),
2453                            RGB(0,255,0),
2454                            RGB(0,128,128),
2455                            RGB(0,255,255),
2456                            RGB(0,0,128),
2457                            RGB(0,0,255),
2458                            RGB(128,0,128),
2459                            RGB(255,0,255)};
2460                        cc.lStructSize=sizeof(CHOOSECOLOR);
2461                        cc.hwndOwner=hwnd;
2462                        cc.rgbResult=colorUser;
2463                        cc.lpCustColors=CusColors;
2464                        cc.Flags=CC_RGBINIT|CC_FULLOPEN;
2465                        if(!ChooseColor(&cc)){
2466                            return 0;
2467                        }
2468                        colorUser=cc.rgbResult;
2469                    }
2470                case IDM_GRAY:
2471                case IDM_WHITE:
2472                case IDM_RED:
2473                case IDM_GREEN:
2474                case IDM_BLUE:
2475                case IDM_YELLOW:
2476                    hChild=GetWindow(hClient,GW_CHILD);
2477                    WndNum=GetWndNum(hChild);
2478
2479                    TC_ITEM tcItem;
2480                    tcItem.mask=TCIF_PARAM;
2481                    if(LOWORD(wParam)==IDM_GRAY)    tcItem.lParam=TABCOLOR_GRAY;
2482                    if(LOWORD(wParam)==IDM_WHITE)   tcItem.lParam=TABCOLOR_WHITE;
2483                    if(LOWORD(wParam)==IDM_RED)     tcItem.lParam=TABCOLOR_RED;
2484                    if(LOWORD(wParam)==IDM_GREEN)   tcItem.lParam=TABCOLOR_GREEN;
2485                    if(LOWORD(wParam)==IDM_BLUE)    tcItem.lParam=TABCOLOR_BLUE;
2486                    if(LOWORD(wParam)==IDM_YELLOW)  tcItem.lParam=TABCOLOR_YELLOW;
2487                    if(LOWORD(wParam)==IDM_USER_COLOR) tcItem.lParam=colorUser;
2488                    TabCtrl_SetItem(pobj_MainTab->hTab,
2489                        TabCtrl_GetCurSel(pobj_MainTab->hTab),
2490                        &tcItem);
2491                    InvalidateRect(pobj_MainTab->hTab,NULL,0);
2492                    return 0;
2493
2494
2495
2496                //////////////////////////////////
2497                // SideWeb
2498                //////////////////////////////////
2499
2500                case IDC_CLIP:
2501                    pobj_SideWeb->bShow=0;
2502                    ResizeOwnerWnd();
2503                    return 0;
2504            }
2505            break;
2506        case WM_DROPFILES:
2507            hDrop=(HDROP)wParam;
2508
2509            i2=DragQueryFile(hDrop,-1,0,0);
2510            for(i=0;i<i2;i++){
2511                DragQueryFile(hDrop,i,str,MAX_PATH);
2512                OpenFileWithExtension(str);
2513            }
2514            DragFinish(hDrop);
2515            return 0;
2516        case WM_SHOWERROR:
2517            //エラー部分を反転表示
2518            DWORD AccBytes;
2519            HANDLE fh;
2520            sprintf(temporary,"%spgm.tmp",pj_editor_Dir);
2521            fh=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
2522            ReadFile(fh,temporary,MAX_PATH,&AccBytes,NULL);
2523            CloseHandle(fh);
2524            temporary[AccBytes]=0;
2525            hChild=GetWindow(hClient,GW_CHILD);
2526            while(hChild){
2527                WndNum=GetWndNum(hChild);
2528                if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
2529                    if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0) break;
2530                }
2531                hChild=GetNextWindow(hChild,GW_HWNDNEXT);
2532            }
2533            if(!hChild){
2534                hChild=OpenFileWithExtension(temporary);
2535                WndNum=GetWndNum(hChild);
2536            }
2537
2538            if(WndNum==-1) return 0;
2539
2540            //ウィンドウを最前面に表示
2541            BringWindowToTop(hChild);
2542            UpdateWindow(hChild);
2543
2544            pTemp=MdiInfo[WndNum].pMdiTextEdit->buffer;
2545
2546            //行の先頭インデックスを取得(取得する行の番号はwParamで渡される)
2547            for(i=0,i2=0;;i++){
2548                if(i2>=(int)wParam) break;
2549                if(pTemp[i]=='\0') break;
2550                if(pTemp[i]=='\r'&&pTemp[i+1]=='\n'){
2551                    i++;
2552                    i2++;
2553                }
2554            }
2555            pos.x=i;
2556
2557            //行の終端インデックスを取得
2558            for(;;i++){
2559                if(pTemp[i]=='\0') break;
2560                if(pTemp[i]=='\r'&&pTemp[i+1]=='\n') break;
2561            }
2562            pos.y=i;
2563
2564            //行を選択する
2565            TextEdit_SetSel(WndNum,pos.x,pos.y,TRUE);
2566
2567            return 0;
2568
2569#ifndef THETEXT
2570        case WM_SETCOMPILEVIEW:
2571            //コンパイラウィンドウ(埋め込み型)が表示されたとき
2572            hCompileView=(HWND)lParam;
2573            ResizeOwnerWnd();
2574            return 0;
2575        case WM_DESTROYCOMPILEVIEW:
2576            //コンパイラウィンドウ(埋め込み型)が破棄されたとき
2577            if((int)hCompileView==-1){
2578                //すぐに次のコンパイラウィンドウが起動するとき
2579                hCompileView=0;
2580            }
2581            else{
2582                //完全にコンパイラウィンドウを閉じたときはリサイズ
2583                hCompileView=0;
2584               
2585                ResizeOwnerWnd();
2586            }
2587            return 0;
2588
2589        case WM_SETDEBUGGERBASE:
2590            //デバッガベースウィンドウ(埋め込み型)が表示されたとき
2591            pobj_Debugger->begin();
2592
2593            //BasicCompiler.exeの強制終了を考慮
2594            SetTimer(hOwner,ID_DEBUGSAFTY,1000,NULL);
2595
2596            return 0;
2597        case WM_DESTROYDEBUGGERBASE:
2598            //BasicCompiler.exeの強制終了を考慮
2599            KillTimer(hOwner,ID_DEBUGSAFTY);
2600
2601            //デバッガベースウィンドウ(埋め込み型)が破棄されたとき
2602            pobj_Debugger->end();
2603
2604            return 0;
2605
2606        case WM_SETDEBUGGERVIEW:
2607            //デバッガウィンドウ(埋め込み型)が表示されたとき
2608            pobj_Debugger->watch_start((HWND)lParam);
2609            ResizeOwnerWnd();
2610            return 0;
2611        case WM_DESTROYDEBUGGERVIEW:
2612            //デバッガウィンドウ(埋め込み型)が破棄されたとき
2613            pobj_Debugger->watch_quit();
2614            ResizeOwnerWnd();
2615            return 0;
2616#endif
2617
2618        case WM_SIZE:
2619            ResizeOwnerWnd();
2620            return 0;
2621
2622
2623        case WM_MOUSEMOVE:
2624            static DWORD dwDragLever;
2625            static POINT PrevMousePos;
2626            static int start;
2627
2628            pos.x=(long)(short)LOWORD(lParam);
2629            pos.y=(long)(short)HIWORD(lParam);
2630            ClientToScreen(hwnd,&pos);
2631
2632            if(dwDragLever){
2633                GetClientRect(hwnd,&rect);
2634
2635                if(dwDragLever==1){
2636                    //プロジェクトビューをリサイズ中
2637                    pobj_nv->width_ClipProjectView=start+pos.x-PrevMousePos.x;
2638                    if(pobj_nv->width_ClipProjectView<100) pobj_nv->width_ClipProjectView=100;
2639                    if(rect.right-100<pobj_nv->width_ClipProjectView) pobj_nv->width_ClipProjectView=rect.right-100;
2640                }
2641                else if(dwDragLever==2){
2642                    //デバッガビューをリサイズ中
2643                    pobj_nv->height_ClipDebuggerView=start+PrevMousePos.y-pos.y;
2644                    if(pobj_nv->height_ClipDebuggerView<60) pobj_nv->height_ClipDebuggerView=60;
2645                    if(rect.bottom-100<pobj_nv->height_ClipCompileView+pobj_nv->height_ClipDebuggerView)
2646                        pobj_nv->height_ClipDebuggerView=rect.bottom-100-pobj_nv->height_ClipCompileView;
2647                }
2648                else if(dwDragLever==3){
2649                    //コンパイラビューをリサイズ中
2650                    pobj_nv->height_ClipCompileView=start+PrevMousePos.y-pos.y;
2651                    if(pobj_nv->height_ClipCompileView<60) pobj_nv->height_ClipCompileView=60;
2652                    if(rect.bottom-100<pobj_nv->height_ClipCompileView)
2653                        pobj_nv->height_ClipCompileView=rect.bottom-100;
2654                }
2655                else if(dwDragLever==4){
2656                    //SideWebをリサイズ中
2657                    pobj_nv->width_WebSearchView=start+PrevMousePos.x-pos.x;
2658                    if(pobj_nv->width_WebSearchView<100) pobj_nv->width_WebSearchView=100;
2659                    if(rect.right-100<pobj_nv->width_WebSearchView) pobj_nv->width_WebSearchView=rect.right-100;
2660                }
2661
2662                ResizeOwnerWnd();
2663                UpdateWindow(hwnd);
2664            }
2665            if(pobj_nv->bClipProjectView&&IsWindowVisible(hProjectView)){
2666                //プロジェクトビューとMDIクライアントの境目のサイズ変更ライン
2667                GetWindowRect(hProjectView,&rect);
2668                if(rect.top<=pos.y&&pos.y<=rect.bottom&&
2669                    rect.right<=pos.x&&pos.x<=rect.right+LEVER_THICK){
2670                    SetCursor(LoadCursor(0,IDC_SIZEWE));
2671                }
2672            }
2673#ifndef THETEXT
2674            if(bClipCompileView&&pobj_Debugger->IsDebuggerView()){
2675                //デバッガビューとMDIクライアントの境目のサイズ変更ライン
2676                GetWindowRect(pobj_Debugger->hwnd,&rect);
2677                if(rect.left<=pos.x&&pos.x<=rect.right&&
2678                    rect.top-LEVER_THICK<=pos.y&&pos.y<=rect.top){
2679                    SetCursor(LoadCursor(0,IDC_SIZENS));
2680                }
2681            }
2682            if(bClipCompileView&&IsWindowVisible(hCompileView)){
2683                //コンパイラビューとMDIクライアントの境目のサイズ変更ライン
2684                GetWindowRect(hCompileView,&rect);
2685                if(rect.left<=pos.x&&pos.x<=rect.right&&
2686                    rect.top-LEVER_THICK<=pos.y&&pos.y<=rect.top){
2687                    SetCursor(LoadCursor(0,IDC_SIZENS));
2688                }
2689            }
2690#endif
2691            if(pobj_SideWeb->bShow){
2692                //SideWebとMDIクライアントの境目のサイズ変更ライン
2693                pobj_SideWeb->GetRect(&rect);
2694                ClientToScreen(hwnd,&rect);
2695                if(rect.top<=pos.y&&pos.y<=rect.bottom&&
2696                    rect.left-LEVER_THICK<=pos.x&&pos.x<=rect.left){
2697                    SetCursor(LoadCursor(0,IDC_SIZEWE));
2698                }
2699            }
2700            return 0;
2701        case WM_LBUTTONDOWN:
2702            pos.x=LOWORD(lParam);
2703            pos.y=HIWORD(lParam);
2704            ClientToScreen(hwnd,&pos);
2705
2706            if(pobj_nv->bClipProjectView&&IsWindowVisible(hProjectView)){
2707                //プロジェクトビューとMDIクライアントの境目のサイズ変更ライン
2708                GetWindowRect(hProjectView,&rect);
2709                if(rect.top<=pos.y&&pos.y<=rect.bottom&&
2710                    rect.right<=pos.x&&pos.x<=rect.right+LEVER_THICK){
2711                    SetCursor(LoadCursor(0,IDC_SIZEWE));
2712
2713                    dwDragLever=1;
2714                    SetCapture(hwnd);
2715
2716                    PrevMousePos=pos;
2717                    start=pobj_nv->width_ClipProjectView;
2718                }
2719            }
2720#ifndef THETEXT
2721            if(bClipCompileView&&pobj_Debugger->IsDebuggerView()){
2722                //デバッガビューとMDIクライアントの境目のサイズ変更ライン
2723                GetWindowRect(pobj_Debugger->hwnd,&rect);
2724                if(rect.left<=pos.x&&pos.x<=rect.right&&
2725                    rect.top-LEVER_THICK<=pos.y&&pos.y<=rect.top){
2726                    SetCursor(LoadCursor(0,IDC_SIZENS));
2727
2728                    dwDragLever=2;
2729                    SetCapture(hwnd);
2730
2731                    PrevMousePos=pos;
2732                    start=pobj_nv->height_ClipDebuggerView;
2733                }
2734            }
2735            if(bClipCompileView&&IsWindowVisible(hCompileView)){
2736                //コンパイラビューとMDIクライアントの境目のサイズ変更ライン
2737                GetWindowRect(hCompileView,&rect);
2738                if(rect.left<=pos.x&&pos.x<=rect.right&&
2739                    rect.top-LEVER_THICK<=pos.y&&pos.y<=rect.top){
2740                    SetCursor(LoadCursor(0,IDC_SIZENS));
2741
2742                    dwDragLever=3;
2743                    SetCapture(hwnd);
2744
2745                    PrevMousePos=pos;
2746                    start=pobj_nv->height_ClipCompileView;
2747                }
2748            }
2749#endif
2750            if(pobj_SideWeb->bShow){
2751                //SideWebとMDIクライアントの境目のサイズ変更ライン
2752                pobj_SideWeb->GetRect(&rect);
2753                ClientToScreen(hwnd,&rect);
2754                if(rect.top<=pos.y&&pos.y<=rect.bottom&&
2755                    rect.left-LEVER_THICK<=pos.x&&pos.x<=rect.left){
2756                    SetCursor(LoadCursor(0,IDC_SIZENS));
2757
2758                    dwDragLever=4;
2759                    SetCapture(hwnd);
2760
2761                    PrevMousePos=pos;
2762                    start=pobj_nv->width_WebSearchView;
2763                }
2764            }
2765            return 0;
2766        case WM_LBUTTONUP:
2767            if(dwDragLever){
2768                dwDragLever=0;
2769                ReleaseCapture();
2770            }
2771            return 0;
2772
2773
2774        case WM_SYSCOMMAND:
2775            //ウィンドウの最小化前にウィンドウ位置を保存
2776            if(wParam==SC_MINIMIZE){
2777                if(IsZoomed(hwnd)) pobj_nv->bWindowMax=1;
2778                else if(!IsIconic(hwnd)){
2779                    pobj_nv->bWindowMax=0;
2780                    GetWindowRect(hwnd,&pobj_nv->StartupWindowRect);
2781                }
2782            }
2783            break;  //処理をDefFrameProcへ
2784        case WM_QUERYENDSESSION:
2785        case WM_CLOSE:
2786            extern BOOL bSearchingClasses;
2787            if(bSearchingClasses){
2788                pobj_ClassTreeView->bCloseSwitch=1;
2789                return 0;
2790            }
2791
2792            //コンパイラビューを閉じる
2793            if(hCompileView)
2794                SendMessage(hCompileView,WM_COMMAND,IDCANCEL,0);
2795
2796            //次回起動時にMDIウィンドウを最大化させるかを判定
2797            hChild=GetWindow(hClient,GW_CHILD);
2798            pobj_nv->bMDIZoomed=IsZoomed(hChild);
2799
2800            //プロジェクトを閉じる
2801            if(ProjectInfo.name[0]){
2802                if(!CloseProject()) return 0;
2803            }
2804
2805            //MDIウィンドウの保存確認
2806            hChild=GetWindow(hClient,GW_CHILD);
2807            while(hChild){
2808                i=GetWndNum(hChild);
2809                if(!DocumentModifyCheck(hChild)) return 0;
2810                hChild=GetNextWindow(hChild,GW_HWNDNEXT);
2811            }
2812
2813
2814            KillTimer(hwnd,ID_TIMER_BACKUP);
2815
2816
2817            //ProjectViewの位置を保存、ProjectViewを破棄
2818            GetWindowRect(hProjectView_ToolWindow,&pobj_nv->rectProjectView);
2819            DestroyWindow(hProjectView);
2820            DestroyWindow(hProjectView_ToolWindow);
2821
2822            //Rebarの位置を保存、Rebarを破棄
2823            delete pobj_Rebar;
2824            pobj_Rebar=0;
2825
2826            //タブコントロールを破棄
2827            delete pobj_MainTab;
2828            pobj_MainTab=0;
2829
2830            //SideWebを破棄
2831            delete pobj_SideWeb;
2832            pobj_SideWeb=0;
2833
2834            //メインウィンドウの最大化有無、座標を保存
2835            if(IsZoomed(hwnd)) pobj_nv->bWindowMax=1;
2836            else if(!IsIconic(hwnd)){
2837                pobj_nv->bWindowMax=0;
2838                GetWindowRect(hwnd,&pobj_nv->StartupWindowRect);
2839            }
2840
2841            hChild=GetWindow(hClient,GW_CHILD);
2842            while(hChild){
2843                CloseDocWindow(GetWndNum(hChild));
2844                DestroyWindow(hChild);
2845                hChild=GetWindow(hClient,GW_CHILD);
2846            }
2847
2848            EndProjectEditor();     //ProjectEditorの情報を保存
2849
2850            //エディタ用フォントを破棄
2851            extern HFONT hFont_TextEdit,hFont_HyperLink_TextEdit;
2852            if(hFont_TextEdit) DeleteObject(hFont_TextEdit);
2853            if(hFont_HyperLink_TextEdit) DeleteObject(hFont_HyperLink_TextEdit);
2854
2855            DestroyWindow(hwnd);
2856            return 0;
2857
2858        case WM_DESTROY:
2859            PostQuitMessage(0);
2860            return 0;
2861    }
2862    return DefFrameProc(hwnd,hClient,message,wParam,lParam);
2863}
2864
2865int RegWndClass(WNDPROC WndProc,char *lpClassName,HBRUSH hBackBrush,DWORD dwFlag){
2866    WNDCLASSEX wcl;
2867
2868    wcl.cbSize=sizeof(WNDCLASSEX);
2869    wcl.hInstance=hInst;
2870    wcl.lpszClassName=lpClassName;
2871    wcl.lpfnWndProc=WndProc;
2872
2873    if(dwFlag&FLAG_DBLCLK) wcl.style=CS_DBLCLKS;
2874    else wcl.style=0;
2875
2876    wcl.hIcon=LoadIcon(NULL,IDI_APPLICATION);
2877    wcl.hIconSm=LoadIcon(NULL,IDI_WINLOGO);
2878
2879    if(dwFlag&FLAG_BEAMCURSOR) wcl.hCursor=LoadCursor(NULL,IDC_IBEAM);
2880    else wcl.hCursor=LoadCursor(NULL,IDC_ARROW);
2881
2882    wcl.lpszMenuName=NULL;
2883    wcl.cbClsExtra=0;
2884    wcl.cbWndExtra=0;
2885    wcl.hbrBackground=hBackBrush;
2886
2887    return RegisterClassEx(&wcl);
2888}
2889int PASCAL WinMain(HINSTANCE hThisInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int ShowCmd){
2890    int i,i2,IsStr;
2891    char str[MAX_PATH],str2[MAX_PATH],dummy[1024];
2892    MSG msg;
2893    HACCEL hAccel;
2894
2895    hInst=hThisInst;
2896    if(!SetupProjectEditor()) return 0;
2897
2898    HBRUSH hGrayBrush_LineNumber;
2899    hGrayBrush_LineNumber=CreateSolidBrush(RGB(220,220,220));
2900
2901    if(!RegWndClass(WindowFunc,"ProjectEditor",(HBRUSH)COLOR_APPWORKSPACE+1,FLAG_DBLCLK)) return 0;
2902    if(!RegWndClass(MDIClientWindow_TextEdit,"MDIClientWindow_TextEdit",(HBRUSH)GetStockObject(WHITE_BRUSH),FLAG_DBLCLK)) return 0;
2903    if(!RegWndClass(MethodCheckWindow,"MethodCheckWindow",(HBRUSH)GetStockObject(WHITE_BRUSH),FLAG_DBLCLK)) return 0;
2904    if(!RegWndClass(MDIClientWindow_Rad,"MDIClientWindow_Rad",(HBRUSH)GetStockObject(WHITE_BRUSH),FLAG_DBLCLK)) return 0;
2905    if(!RegWndClass(RadToolsWindow,"RadToolsWindow",h3DFaceBackBrush,FLAG_DBLCLK)) return 0;
2906    if(!RegWndClass(RadPropertyWindow,"RadPropertyWindow",h3DFaceBackBrush,FLAG_DBLCLK)) return 0;
2907    if(!RegWndClass(RadWindow,"RadWindow",(HBRUSH)GetStockObject(NULL_BRUSH),FLAG_DBLCLK)) return 0;
2908    if(!RegWndClass(TestWindowProc,"TestWindow",h3DFaceBackBrush,FLAG_DBLCLK)) return 0;
2909    if(!RegWndClass(MDIClientWindow_Menu,"MDIClientWindow_Menu",(HBRUSH)GetStockObject(WHITE_BRUSH),FLAG_DBLCLK)) return 0;
2910    if(!RegWndClass(MenuEditWindow,"MenuEditWindow",h3DFaceBackBrush,FLAG_DBLCLK)) return 0;
2911    if(!RegWndClass(MDIClientWindow_IconEdit,"MDIClientWindow_IconEdit",h3DFaceBackBrush,FLAG_DBLCLK)) return 0;
2912    if(!RegWndClass(IconEditWindowProc,"IconEditWindowProc",(HBRUSH)GetStockObject(WHITE_BRUSH),0)) return 0;
2913    if(!RegWndClass(ProjectViewProc,"ProjectView",h3DFaceBackBrush,FLAG_DBLCLK)) return 0;
2914    if(!RegWndClass(ProjectView_ToolWindowProc,"ProjectView_ToolWindow",h3DFaceBackBrush,FLAG_DBLCLK)) return 0;
2915    if(!RegWndClass(TextEditProc,"TextEditor",(HBRUSH)GetStockObject(NULL_BRUSH),FLAG_DBLCLK|FLAG_BEAMCURSOR)) return 0;
2916    if(!RegWndClass(ComplementWindow,"ComplementWindow",(HBRUSH)GetStockObject(BLACK_BRUSH),FLAG_DBLCLK)) return 0;
2917    if(!RegWndClass(PreviewWndProc,"PreviewWindow",(HBRUSH)GetStockObject(GRAY_BRUSH),FLAG_DBLCLK)) return 0;
2918
2919    //Web検索用のウィンドウクラス
2920    if(!RegWndClass(WebResultWndProc,"WebResult",(HBRUSH)COLOR_APPWORKSPACE+1,FLAG_DBLCLK)) return 0;
2921    if(!RegWndClass(OneTabProc,"OneTab",(HBRUSH)COLOR_APPWORKSPACE+1,FLAG_DBLCLK)) return 0;
2922    if(!RegWndClass(ResultListProc,"ResultList",(HBRUSH)COLOR_APPWORKSPACE+1,FLAG_DBLCLK)) return 0;
2923
2924    //ルーラーのウィンドウクラス
2925    if(!RegWndClass(RulerProc,"Ruler",(HBRUSH)COLOR_APPWORKSPACE+1,FLAG_DBLCLK)) return 0;
2926
2927    //SideWebのウィンドウクラス
2928    if(!RegWndClass(SideWebProc,"SideWeb",(HBRUSH)COLOR_APPWORKSPACE+1,FLAG_DBLCLK)) return 0;
2929
2930
2931
2932    hAccel=LoadAccelerators(hResInst,MAKEINTRESOURCE(IDR_ACCELERATOR1));
2933
2934    //メインウィンドウ
2935    RECT *prc;
2936    prc=&pobj_nv->StartupWindowRect;
2937    hOwner=CreateWindowEx(WS_EX_ACCEPTFILES,"ProjectEditor",APPLICATION_NAME,
2938        WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN,
2939        prc->left, prc->top,
2940        prc->right-prc->left, prc->bottom-prc->top,
2941        HWND_DESKTOP,pobj_MainMenu->hMenu,hInst,NULL);
2942
2943    SendMessage(hOwner,WM_SETICON,ICON_SMALL,(long)hOwnerIcon);
2944    SetClipboardViewer(hOwner);
2945
2946    if(pobj_nv->bWindowMax) ShowWindow(hOwner,SW_MAXIMIZE);
2947    else ShowWindow(hOwner,ShowCmd);
2948    UpdateWindow(hOwner);
2949
2950    int open_sw=0;
2951    if(lstrlen(lpCmdLine)>0){
2952        lstrcpy(dummy,lpCmdLine);
2953        for(i=0,i2=0,IsStr=0;;i++,i2++){
2954            if(dummy[i]=='\"'){
2955                if(IsStr==0) IsStr=1;
2956                else IsStr=0;
2957                i++;
2958            }
2959            if((dummy[i]==' '&&IsStr==0)||dummy[i]=='\0'){
2960                str[i2]=0;
2961                if(!(strstr(str,":")||strstr(str,"\\\\"))){
2962                    lstrcpy(str2,str);
2963                    GetCurrentDirectory(MAX_PATH,str);
2964                    lstrcat(str,"\\");
2965                    lstrcat(str,str2);
2966                }
2967                ShortPathToLongPath(str,str2);
2968                OpenFileWithExtension(str2);
2969                open_sw=1;
2970                if(dummy[i]=='\0') break;
2971                i2=-1;
2972                continue;
2973            }
2974            str[i2]=dummy[i];
2975        }
2976    }
2977
2978    BOOL bRestore=0;
2979
2980
2981    {
2982        //自動バックアップ及び復元機能
2983
2984        //必要であれば復元
2985        bRestore=restore();
2986    }
2987
2988
2989#ifdef THETEXT
2990    if(open_sw==0&&bRestore==0){
2991        //ファイルが開かれなかったとき
2992        NewTextEditWindow(NULL,WNDTYPE_TEXT);
2993    }
2994#endif
2995
2996
2997    while(GetMessage(&msg,NULL,0,0)){
2998
2999        if(!TranslateAccelerator(hOwner,hAccel,&msg)){
3000            if(ProjectInfo.name[0]){
3001                for(i=0,i2=0;i<MAX_WNDNUM;i++){
3002                    if(MdiInfo[i].hwnd&&MdiInfo[i].DocType==WNDTYPE_RAD){
3003                        if(IsDialogMessage(MdiInfo[i].MdiRadInfo->hProp_Dlg,&msg)) i2=1;
3004                    }
3005                }
3006                if(i2==0){
3007                    if(!TranslateMDISysAccel(hClient,&msg)){
3008                        TranslateMessage(&msg);
3009                        DispatchMessage(&msg);
3010                    }
3011                }
3012            }
3013            else{
3014                if(!TranslateMDISysAccel(hClient,&msg)){
3015                    TranslateMessage(&msg);
3016                    DispatchMessage(&msg);
3017                }
3018            }
3019        }
3020    }
3021
3022    DeleteObject(hGrayBrush_LineNumber);
3023
3024#if defined HeapAlloc
3025    CheckHeapCheck();
3026#endif
3027
3028    return msg.wParam;
3029}
Note: See TracBrowser for help on using the repository browser.