source: dev/trunk/ab5.0/abdev/abdev/ProjectControl.cpp @ 612

Last change on this file since 612 was 612, checked in by dai_9181, 15 years ago

WndInfoNum利用コード周りをリファクタリング中

File size: 79.2 KB
Line 
1#include "stdafx.h"
2
3#include "Common.h"
4
5using namespace ActiveBasic::IDE;
6
7#if defined(JPN)
8//日本語
9#include "pj_msg_jpn.h"
10#else
11//英語
12#include "pj_msg_eng.h"
13#endif
14
15HWND hProjectViewTab;
16HWND hProcedureTreeView,hMaterialTreeView;
17HIMAGELIST hProcedureTreeViewImageList,hMaterialTreeViewImageList;
18WNDPROC OldProcedureTreeViewProc,OldMaterialTreeViewProc;
19WNDPROC OldTabProc;
20
21LRESULT CALLBACK ProcedureTreeViewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
22    if(message==WM_CHAR&&wParam==VK_RETURN){
23        SendMessage(hProjectViewTab,WM_COMMAND,IDM_PROCEDURETREE_SHOW,0);
24        //デフォルトのメッセージ処理をするとビープ音がしてしまうので避ける
25        return 0;
26    }
27    else if(message==WM_LBUTTONDBLCLK){
28        SendMessage(hProjectViewTab,WM_COMMAND,IDM_PROCEDURETREE_SHOW,0);
29        return 0;
30    }
31    return CallWindowProc(OldProcedureTreeViewProc,hwnd,message,wParam,lParam);
32}
33LRESULT CALLBACK MaterialTreeViewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
34    if(message==WM_CHAR&&wParam==VK_RETURN){
35        SendMessage(hProjectViewTab,WM_COMMAND,IDM_MATERIALTREE_OPEN,0);
36        //デフォルトのメッセージ処理をするとビープ音がしてしまうので避ける
37        return 0;
38    }
39    if(message==WM_KEYDOWN&&wParam==VK_DELETE) SendMessage(hProjectViewTab,WM_COMMAND,IDM_MATERIALTREE_DELETE,0);
40    return CallWindowProc(OldMaterialTreeViewProc,hwnd,message,wParam,lParam);
41}
42LRESULT CALLBACK TabProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
43    extern HANDLE hHeap;
44    extern MDIINFO MdiInfo[MAX_WNDNUM];
45    extern LPSTR DefFileFilter;
46    extern PROJECTINFO ProjectInfo;
47    int i,i2,WndNum;
48    char str[MAX_PATH],temporary[MAX_PATH];
49    HWND hTree,hChild;
50    HTREEITEM hTreeItem,hTreeItem2;
51    TV_HITTESTINFO tvHitTestInfo;
52    TVITEM tvItem;
53
54    switch(message){
55        case WM_CONTEXTMENU:
56            i=TabCtrl_GetCurSel(hwnd);
57            if(i==0){
58                //ファイルツリー
59                POINT pos;
60                pos.x=LOWORD(lParam);
61                pos.y=HIWORD(lParam);
62                pobj_FileTree->ContextMenu(&pos);
63                return 0;
64            }
65            else if(i==1) hTree=hProcedureTreeView;
66            else if(i==2) hTree=hMaterialTreeView;
67            tvHitTestInfo.pt.x=LOWORD(lParam);
68            tvHitTestInfo.pt.y=HIWORD(lParam);
69            ScreenToClient(hTree,&tvHitTestInfo.pt);
70            hTreeItem=TreeView_HitTest(hTree,&tvHitTestInfo);
71            if(hTreeItem){
72                TreeView_SelectItem(hTree,hTreeItem);
73                if(i==1){
74                    extern HMENU hProcedureTreeMenuBase;
75                    if(TreeView_GetRoot(hTree)!=hTreeItem)
76                        TrackPopupMenu(GetSubMenu(hProcedureTreeMenuBase,1),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
77                }
78                else if(i==2){
79                    extern HMENU hMaterialTreeMenuBase;
80                    hTreeItem2=TreeView_GetRoot(hTree);
81                    for(i2=0;;i2++){
82                        if(hTreeItem2==hTreeItem) break;
83                        hTreeItem2=TreeView_GetNextSibling(hTree,hTreeItem2);
84                        if(!hTreeItem2) break;
85                    }
86                    if(hTreeItem2){
87                        if(i2==0)
88                            TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,0),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
89                        else if(i2==1)
90                            TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,2),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
91                        else if(i2==2)
92                            TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,4),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
93                        else if(i2==3)
94                            TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,6),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
95                        else if(i2==4)
96                            TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,8),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
97                    }
98                    else{
99                        hTreeItem=TreeView_GetNextItem(hTree,hTreeItem,TVGN_PARENT);
100                        hTreeItem2=TreeView_GetRoot(hTree);
101                        for(i2=0;;i2++){
102                            if(hTreeItem2==hTreeItem) break;
103                            hTreeItem2=TreeView_GetNextSibling(hTree,hTreeItem2);
104                            if(!hTreeItem2) break;
105                        }
106                        if(hTreeItem2){
107                            if(i2==0)
108                                TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,1),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
109                            else if(i2==1)
110                                TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,3),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
111                            else if(i2==2)
112                                TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,5),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
113                            else if(i2==3)
114                                TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,7),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
115                            else if(i2==4)
116                                TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,9),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
117                        }
118                    }
119                }
120            }
121            break;
122        case WM_COMMAND:
123            switch(LOWORD(wParam)){
124
125                case IDM_PROCEDURETREE_SHOW:
126                    extern BOOL bSearchingClasses;
127                    if(bSearchingClasses){
128                        pobj_ClassTreeView->bShowSwitch=1;
129                        break;
130                    }
131
132                    hTreeItem=TreeView_GetSelection(hProcedureTreeView);
133                    for(i=0;i<pobj_ClassTreeView->NumberOfProcedures;i++){
134                        if(pobj_ClassTreeView->pProcInfo[i].hTreeItem==hTreeItem){
135
136                            if( ProjectInfo.name[0] ){
137                                // 対象ファイルを開く
138                                lstrcpy(temporary,
139                                    ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[pobj_ClassTreeView->pProcInfo[i].FileNum]->m_path);
140                                GetFullPath(temporary,ProjectInfo.dir);
141                                hChild=OpenFileWithExtension(temporary);
142                            }
143                            else{
144                                hChild = GetWindow(hClient,GW_CHILD);
145                            }
146
147                            //プロシージャの行を選択する
148                            //ResetScrollbarが再描画時に呼び出されるので、再描画する
149                            WndNum=GetWndNum(hChild);
150                            InvalidateRect(MdiInfo[WndNum].pMdiTextEdit->hEdit,NULL,0);
151                            UpdateWindow(MdiInfo[WndNum].pMdiTextEdit->hEdit);
152                            TextEdit_SelectOneLine(WndNum,pobj_ClassTreeView->pProcInfo[i].code_pos,TRUE);
153
154                            //タイマーをセット
155                            // ※フォーカスをエディタにセットするため
156                            // ※タイミングを遅らせてSetFocusを実行する必要あり
157                            SetTimer(hwnd,100,10,NULL);
158
159                            break;
160                        }
161                    }
162
163                    break;
164
165                case IDM_MATERIALTREE_INSERTCURSOR:
166                    Project_CursorResInsert();
167                    break;
168                case IDM_MATERIALTREE_INSERTBITMAP:
169                    Project_BitmapResInsert();
170                    break;
171                case IDM_MATERIALTREE_INSERTICON:
172                    Project_IconResInsert();
173                    break;
174                case IDM_MATERIALTREE_INSERTMENU:
175                    Project_Menu_Insert();
176                    break;
177                case IDM_MATERIALTREE_INSERTWINDOW:
178                    Project_Window_Insert();
179                    break;
180                case IDM_MATERIALTREE_OPEN:
181                    hTreeItem=TreeView_GetSelection(hMaterialTreeView);
182                    for(i=0;i<static_cast<int>(ProjectInfo.windowInfos.size());i++){
183                        if(ProjectInfo.windowInfos[i].hTreeItem==hTreeItem){
184                            NewRadWindow( ProjectInfo.windowInfos[i] );
185                            break;
186                        }
187                    }
188                    for(i=0;i<ProjectInfo.NumberOfMenu;i++){
189                        if(ProjectInfo.pMenuInfo[i].hTreeItem==hTreeItem){
190                            NewMenuWindow(&ProjectInfo.pMenuInfo[i]);
191                            break;
192                        }
193                    }
194                    for(i=0;i<ProjectInfo.res.NumberOfIconRes;i++){
195                        if(ProjectInfo.res.pIconResInfo[i].hTreeItem==hTreeItem){
196                            lstrcpy(temporary,ProjectInfo.res.pIconResInfo[i].path);
197                            GetFullPath(temporary,ProjectInfo.dir);
198                            NewIconEditWindow(temporary);
199                            break;
200                        }
201                    }
202                    break;
203                case IDM_MATERIALTREE_DELETE:
204                    hTreeItem=TreeView_GetSelection(hMaterialTreeView);
205                    for(i=0;i<ProjectInfo.res.NumberOfCursorRes;i++){
206                        if(ProjectInfo.res.pCursorResInfo[i].hTreeItem==hTreeItem){
207
208                            //"%s カーソルをプロジェクトから削除します。よろしいですか?"
209                            sprintf(str,STRING_PJ_CHECK_DELETECURSOR,ProjectInfo.res.pCursorResInfo[i].IdName);
210                            if(IDCANCEL==MessageBox(hOwner,str,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
211
212                            Project_Cursor_Delete(i);
213                            break;
214                        }
215                    }
216                    for(i=0;i<ProjectInfo.res.NumberOfBitmapRes;i++){
217                        if(ProjectInfo.res.pBitmapResInfo[i].hTreeItem==hTreeItem){
218
219                            //"%s ビットマップをプロジェクトから削除します。よろしいですか?"
220                            sprintf(str,STRING_PJ_CHECK_DELETEBITMAP,ProjectInfo.res.pBitmapResInfo[i].IdName);
221                            if(IDCANCEL==MessageBox(hOwner,str,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
222
223                            Project_Bitmap_Delete(i);
224                            break;
225                        }
226                    }
227                    for(i=0;i<ProjectInfo.res.NumberOfIconRes;i++){
228                        if(ProjectInfo.res.pIconResInfo[i].hTreeItem==hTreeItem){
229
230                            //"%s アイコンをプロジェクトから削除します。よろしいですか?"
231                            sprintf(str,STRING_PJ_CHECK_DELETEICON,ProjectInfo.res.pIconResInfo[i].IdName);
232                            if(IDCANCEL==MessageBox(hOwner,str,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
233
234                            Project_Icon_Delete(i);
235                            break;
236                        }
237                    }
238                    for(i=0;i<ProjectInfo.NumberOfMenu;i++){
239                        if(ProjectInfo.pMenuInfo[i].hTreeItem==hTreeItem){
240
241                            //"%s メニューをプロジェクトから削除します。よろしいですか?"
242                            sprintf(str,STRING_PJ_CHECK_DELETEMENU,ProjectInfo.pMenuInfo[i].IdName);
243                            if(IDCANCEL==MessageBox(hOwner,str,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
244
245                            Project_Menu_Delete(i);
246                            break;
247                        }
248                    }
249                    for(i=0;i<static_cast<int>(ProjectInfo.windowInfos.size());i++){
250                        if(ProjectInfo.windowInfos[i].hTreeItem==hTreeItem){
251
252                            //"%s ウィンドウをプロジェクトから削除します。よろしいですか?"
253                            sprintf(str,STRING_PJ_CHECK_DELETEWINDOW,ProjectInfo.windowInfos[i].name);
254                            if(IDCANCEL==MessageBox(hOwner,str,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
255
256                            Project_Window_Delete(i);
257                            break;
258                        }
259                    }
260                    break;
261                case IDM_MENUTREE_RENAMEID:
262                    extern char NewIdName[MAX_PATH];
263                    hTreeItem=TreeView_GetSelection(hMaterialTreeView);
264                    for(i=0;i<ProjectInfo.res.NumberOfCursorRes;i++){
265                        if(ProjectInfo.res.pCursorResInfo[i].hTreeItem==hTreeItem){
266                            Project_Cursor_RenameID(i);
267                            break;
268                        }
269                    }
270                    for(i=0;i<ProjectInfo.res.NumberOfBitmapRes;i++){
271                        if(ProjectInfo.res.pBitmapResInfo[i].hTreeItem==hTreeItem){
272                            Project_Bitmap_RenameID(i);
273                            break;
274                        }
275                    }
276                    for(i=0;i<ProjectInfo.res.NumberOfIconRes;i++){
277                        if(ProjectInfo.res.pIconResInfo[i].hTreeItem==hTreeItem){
278                            Project_Icon_RenameID(i);
279                        }
280                    }
281                    for(i=0;i<ProjectInfo.NumberOfMenu;i++){
282                        if(ProjectInfo.pMenuInfo[i].hTreeItem==hTreeItem){
283                            if(!DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_INPUTID),hOwner,(DLGPROC)DlgProject_MenuID_Input,(long)ProjectInfo.pMenuInfo[i].IdName)) break;
284
285                            //重複チェック
286                            for(i2=0;i2<ProjectInfo.NumberOfMenu;i2++){
287                                if(i2==i) continue;
288                                if(lstrcmp(NewIdName,ProjectInfo.pMenuInfo[i2].IdName)==0){
289                                    //"ID \"%s\" は既にプロジェクト内に存在します。"
290                                    sprintf(temporary,STRING_DUPLICATIONERROR_ID_IN_PROJECT,NewIdName);
291                                    MessageBox(hOwner,temporary,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
292                                    return 0;
293                                }
294                            }
295
296                            HeapDefaultFree(ProjectInfo.pMenuInfo[i].IdName);
297                            ProjectInfo.pMenuInfo[i].IdName=(char *)HeapAlloc(hHeap,0,lstrlen(NewIdName)+1);
298                            lstrcpy(ProjectInfo.pMenuInfo[i].IdName,NewIdName);
299
300                            tvItem.hItem=hTreeItem;
301                            tvItem.mask=TVIF_TEXT;
302                            tvItem.pszText=ProjectInfo.pMenuInfo[i].IdName;
303                            tvItem.cchTextMax=lstrlen(ProjectInfo.pMenuInfo[i].IdName)+1;
304                            TreeView_SetItem(hMaterialTreeView,&tvItem);
305
306                            ProjectInfo.ModifyOfMaterial=1;
307
308                            TreeView_SortChildren(hMaterialTreeView,
309                                TreeView_GetParent(hMaterialTreeView,hTreeItem),
310                                0);
311                            break;
312                        }
313                    }
314                    break;
315                case IDM_MATERIALTREE_ICON_SETMAIN:
316                    RESITEMINFO TempIconResInfo;
317                    hTreeItem=TreeView_GetSelection(hMaterialTreeView);
318                    for(i=0;i<ProjectInfo.res.NumberOfIconRes;i++){
319                        if(ProjectInfo.res.pIconResInfo[i].hTreeItem==hTreeItem){
320                            if(i==0) break;
321
322                            TempIconResInfo=ProjectInfo.res.pIconResInfo[i];
323                            for(;i>0;i--)
324                                ProjectInfo.res.pIconResInfo[i]=ProjectInfo.res.pIconResInfo[i-1];
325                            ProjectInfo.res.pIconResInfo[0]=TempIconResInfo;
326
327                            tvItem.hItem=ProjectInfo.res.pIconResInfo[1].hTreeItem;
328                            tvItem.mask=TVIF_TEXT;
329                            tvItem.pszText=ProjectInfo.res.pIconResInfo[1].IdName;
330                            tvItem.cchTextMax=lstrlen(ProjectInfo.res.pIconResInfo[1].IdName)+1;
331                            TreeView_SetItem(hMaterialTreeView,&tvItem);
332
333                            tvItem.hItem=ProjectInfo.res.pIconResInfo[0].hTreeItem;
334                            tvItem.mask=TVIF_TEXT;
335                            sprintf(temporary,"%s (Main)",ProjectInfo.res.pIconResInfo[0].IdName);
336                            tvItem.pszText=temporary;
337                            tvItem.cchTextMax=lstrlen(temporary)+1;
338                            TreeView_SetItem(hMaterialTreeView,&tvItem);
339
340                            ProjectInfo.ModifuOfResource=1;
341                            break;
342                        }
343                    }
344                    break;
345            }
346            break;
347        case WM_TIMER:
348            KillTimer(hwnd,wParam);
349
350            //フォーカスをエディタにセット
351            SetFocus(GetWindow(GetWindow(hClient,GW_CHILD),GW_CHILD));
352            break;
353        case WM_NOTIFY:
354            NMHDR *hdr;
355            hdr=(NMHDR *)lParam;
356            if(hdr->code==NM_DBLCLK){
357                if(hdr->hwndFrom==hProcedureTreeView) SendMessage(hwnd,WM_COMMAND,IDM_PROCEDURETREE_SHOW,0);
358                else if(hdr->hwndFrom==hMaterialTreeView) SendMessage(hwnd,WM_COMMAND,IDM_MATERIALTREE_OPEN,0);
359            }
360            if(hdr->code==TVN_ITEMEXPANDEDW||hdr->code==TVN_ITEMEXPANDED){
361                NMTREEVIEW *nmTreeView;
362                TVITEM tvItem;
363                nmTreeView=(NMTREEVIEW *)lParam;
364                tvItem.mask=TVIF_HANDLE|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
365                tvItem.hItem=nmTreeView->itemNew.hItem;
366                TreeView_GetItem(nmTreeView->hdr.hwndFrom,&tvItem);
367                if(tvItem.iImage==0||tvItem.iImage==1){
368                    if(nmTreeView->action==TVE_EXPAND){
369                        tvItem.iImage=1;
370                        tvItem.iSelectedImage=1;
371                    }
372                    else if(nmTreeView->action==TVE_COLLAPSE){
373                        tvItem.iImage=0;
374                        tvItem.iSelectedImage=0;
375                    }
376                    tvItem.hItem=nmTreeView->itemNew.hItem;
377                    TreeView_SetItem(nmTreeView->hdr.hwndFrom,&tvItem);
378                }
379            }
380            break;
381    }
382    return CallWindowProc(OldTabProc,hwnd,message,wParam,lParam);
383}
384void ResizeProjectView_ToolWindow(void){
385    extern HWND hProjectView_ToolWindow;
386    RECT rect;
387    GetClientRect(hProjectView_ToolWindow,&rect);
388    SendMessage(hProjectView_ToolWindow,WM_SIZE,0,MAKELONG(rect.right,rect.bottom));
389}
390LRESULT CALLBACK ProjectView_ToolWindowProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
391    extern HWND hProjectView;
392    switch(message){
393        case WM_SIZE:
394            MoveWindow(hProjectView,0,0,
395                LOWORD(lParam),
396                HIWORD(lParam),1);
397            return 0;
398        case WM_CLOSE:
399            SendMessage(hOwner,WM_COMMAND,IDM_PROJECTVIEW,0);
400            return 0;
401    }
402    return DefWindowProc(hwnd,message,wParam,lParam);
403}
404void ShowFileView(){
405    TabCtrl_SetCurSel(hProjectViewTab,0);
406    ShowWindow(pobj_FileTree->hTree,SW_SHOW);
407    ShowWindow(hProcedureTreeView,SW_HIDE);
408    ShowWindow(hMaterialTreeView,SW_HIDE);
409}
410void ShowClassView(){
411    TabCtrl_SetCurSel(hProjectViewTab,1);
412    ShowWindow(pobj_FileTree->hTree,SW_HIDE);
413    ShowWindow(hMaterialTreeView,SW_HIDE);
414    ShowWindow(hProcedureTreeView,SW_SHOW);
415}
416void ShowMaterialView(){
417    TabCtrl_SetCurSel(hProjectViewTab,2);
418    ShowWindow(pobj_FileTree->hTree,SW_HIDE);
419    ShowWindow(hProcedureTreeView,SW_HIDE);
420    ShowWindow(hMaterialTreeView,SW_SHOW);
421}
422LRESULT CALLBACK ProjectViewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
423    extern HINSTANCE hInst,hResInst;
424    extern PROJECTINFO ProjectInfo;
425    extern HWND hTabOfProjectView;
426    extern HFONT hStatusFont;
427    extern HWND hProjectView_ToolWindow;
428    RECT rect;
429    HWND hButton;
430
431    switch(message){
432        case WM_CREATE:
433            hProjectViewTab=CreateWindow(WC_TABCONTROL,NULL,
434                WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
435                0,0,0,0,hwnd,0,hInst,0);
436            SendMessage(hProjectViewTab,WM_SETFONT,(long)hStatusFont,0);
437
438            hButton=CreateWindow("BUTTON","↓",WS_CHILD|WS_VISIBLE,
439                0,0,30,13,
440                hwnd,(HMENU)IDC_CLIP,hInst,0);
441            SendMessage(hButton,WM_SETFONT,(long)hStatusFont,0);
442
443            OldTabProc=(WNDPROC)GetWindowLongPtr(hProjectViewTab,GWLP_WNDPROC);
444            SetWindowLongPtr(hProjectViewTab,GWLP_WNDPROC,(long)TabProc);
445
446            //タブを設定
447            TC_ITEM tcItem;
448            tcItem.mask=TCIF_TEXT;
449            tcItem.pszText="File";
450            TabCtrl_InsertItem(hProjectViewTab,0,&tcItem);
451            tcItem.mask=TCIF_TEXT;
452            tcItem.pszText="Class";
453            TabCtrl_InsertItem(hProjectViewTab,1,&tcItem);
454            tcItem.mask=TCIF_TEXT;
455            tcItem.pszText="Material";
456            TabCtrl_InsertItem(hProjectViewTab,2,&tcItem);
457
458            //ファイルツリービューを作成
459            pobj_FileTree=new CFileTree(hProjectViewTab);
460
461            //クラスツリービューを作成
462            hProcedureTreeView=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
463                WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
464                0,0,0,0,
465                hProjectViewTab,0,hInst,0);
466            OldProcedureTreeViewProc=(WNDPROC)GetWindowLongPtr(hProcedureTreeView,GWLP_WNDPROC);
467            SetWindowLongPtr(hProcedureTreeView,GWLP_WNDPROC,(long)ProcedureTreeViewProc);
468            //イメージリスト読み込み、設定
469            hProcedureTreeViewImageList=ImageList_Create(16,16,ILC_COLOR24|ILC_MASK,8,0);
470            ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FOLDER_CLOSE)));
471            ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FOLDER_OPEN)));
472            ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_PROCEDURE)));
473            ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_PROGRAM_FOLDER)));
474            ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_MEMBER_PUBLIC_VARIABLE)));
475            ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_MEMBER_PUBLIC_FUNCTION)));
476            ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_MEMBER_PRIVATE_VARIABLE)));
477            ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_MEMBER_PRIVATE_FUNCTION)));
478            TreeView_SetImageList(hProcedureTreeView,hProcedureTreeViewImageList,TVSIL_NORMAL);
479
480            //マテリアルツリービューを作成
481            hMaterialTreeView=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
482                WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
483                0,0,0,0,
484                hProjectViewTab,0,hInst,0);
485            OldMaterialTreeViewProc=(WNDPROC)GetWindowLongPtr(hMaterialTreeView,GWLP_WNDPROC);
486            SetWindowLongPtr(hMaterialTreeView,GWLP_WNDPROC,(long)MaterialTreeViewProc);
487            //イメージリスト読み込み、設定
488            hMaterialTreeViewImageList=ImageList_Create(16,16,ILC_COLOR24|ILC_MASK,3,0);
489            ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FOLDER_CLOSE)));
490            ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FOLDER_OPEN)));
491            ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_WINDOW)));
492            ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_MENU)));
493            ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FILE_ICON)));
494            ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FILE_BMP)));
495            ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FILE_CURSOR)));
496            TreeView_SetImageList(hMaterialTreeView,hMaterialTreeViewImageList,TVSIL_NORMAL);
497
498            ShowWindow(pobj_FileTree->hTree,SW_SHOW);
499            GetClientRect(hwnd,&rect);
500            SendMessage(hwnd,WM_SIZE,0,MAKELONG(rect.right,rect.bottom));
501            return 0;
502        case WM_COMMAND:
503            switch(LOWORD(wParam)){
504                case IDC_CLIP:
505                    if(pobj_nv->bClipProjectView==0){
506                        pobj_nv->bClipProjectView=1;
507
508                        SetWindowLongPtr(hwnd,GWL_EXSTYLE,WS_EX_STATICEDGE);
509                        SetParent(hwnd,hOwner);
510                        ResizeOwnerWnd();
511
512                        ShowWindow(hProjectView_ToolWindow,SW_HIDE);
513                    }
514                    else{
515                        pobj_nv->bClipProjectView=0;
516
517                        SetWindowLongPtr(hwnd,GWL_EXSTYLE,0);
518
519                        SetParent(hwnd,hProjectView_ToolWindow);
520
521                        ResizeOwnerWnd();
522                        ResizeProjectView_ToolWindow();
523
524                        ShowWindow(hProjectView_ToolWindow,SW_SHOW);
525                    }
526                    return 0;
527            }
528            break;
529        case WM_NOTIFY:
530            NMHDR *hdr;
531            hdr=(NMHDR *)lParam;
532            if(hdr->hwndFrom==hProjectViewTab&&hdr->code==TCN_SELCHANGE){
533                switch( TabCtrl_GetCurSel(hProjectViewTab) ){
534                    case 0:
535                        ShowFileView();
536                        break;
537                    case 1:
538                        ShowClassView();
539                        break;
540                    case 2:
541                        ShowMaterialView();
542                        break;
543                }
544            }
545            return 0;
546        case WM_PAINT:
547            PAINTSTRUCT ps;
548            HDC hdc;
549            HFONT hOldFont;
550            SIZE size;
551            HBRUSH hBrush,hOldBrush;
552            HPEN hPen,hOldPen;
553            char temporary[MAX_PATH];
554
555            if(pobj_nv->bClipProjectView==0) break;
556
557            hBrush=CreateSolidBrush(GetSysColor(COLOR_3DSHADOW));
558            hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DSHADOW));
559
560            hdc=BeginPaint(hwnd,&ps);
561
562            hOldFont=(HFONT)SelectObject(hdc,hStatusFont);
563            if( ProjectInfo.name[0] ){
564                sprintf(temporary,"%s \'%s\'",STRING_PROJECT,ProjectInfo.name);
565            }
566            else{
567                lstrcpy( temporary, "現在のドキュメント" );
568            }
569
570            GetTextExtentPoint32(hdc,temporary,lstrlen(temporary),&size);
571            GetClientRect(hwnd,&rect);
572            rect.left++;
573            rect.top++;
574            rect.right--;
575            rect.bottom=size.cy+2;
576
577            hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
578            hOldPen=(HPEN)SelectObject(hdc,hPen);
579            Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom);
580            SelectObject(hdc,hOldBrush);
581            SelectObject(hdc,hPen);
582
583            rect.top++;
584            rect.bottom--;
585            SetBkMode(hdc,OPAQUE);
586            SetBkColor(hdc,GetSysColor(COLOR_3DSHADOW));
587            SetTextColor(hdc,GetSysColor(COLOR_3DHILIGHT));
588            DrawText(hdc,temporary,lstrlen(temporary),&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
589
590            EndPaint(hwnd,&ps);
591
592            DeleteObject(hBrush);
593            DeleteObject(hPen);
594            return 0;
595        case WM_SIZE:
596            if(pobj_nv->bClipProjectView){
597                MoveWindow(hProjectViewTab,
598                    LEVER_THICK,
599                    LEVER_THICK+11,
600                    LOWORD(lParam)-LEVER_THICK*2,
601                    HIWORD(lParam)-LEVER_THICK*2-21,1);
602
603                GetClientRect(hProjectViewTab,&rect);
604                TabCtrl_AdjustRect(hProjectViewTab,FALSE,&rect);
605                rect.left-=2;
606                rect.right++;
607                rect.bottom++;
608
609                pobj_FileTree->resize(rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top);
610                MoveWindow(hProcedureTreeView,
611                    rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
612                MoveWindow(hMaterialTreeView,
613                    rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
614
615                GetClientRect(GetDlgItem(hwnd,IDC_CLIP),&rect);
616                MoveWindow(GetDlgItem(hwnd,IDC_CLIP),LOWORD(lParam)-rect.right,HIWORD(lParam)-rect.bottom,rect.right,rect.bottom,1);
617                InvalidateRect(GetDlgItem(hwnd,IDC_CLIP),NULL,0);
618            }
619            else{
620                MoveWindow(hProjectViewTab,0,0,
621                    LOWORD(lParam),
622                    HIWORD(lParam)-15,1);
623
624                GetClientRect(hProjectViewTab,&rect);
625                TabCtrl_AdjustRect(hProjectViewTab,FALSE,&rect);
626
627                pobj_FileTree->resize(rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top);
628                MoveWindow(hProcedureTreeView,
629                    rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
630                MoveWindow(hMaterialTreeView,
631                    rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
632
633                GetClientRect(GetDlgItem(hwnd,IDC_CLIP),&rect);
634                MoveWindow(GetDlgItem(hwnd,IDC_CLIP),LOWORD(lParam)-rect.right,HIWORD(lParam)-rect.bottom,rect.right,rect.bottom,1);
635            }
636            return 0;
637        case WM_CLOSE:
638            SendMessage(hOwner,WM_COMMAND,IDM_PROJECTVIEW,0);
639            return 0;
640        case WM_DESTROY:
641            delete pobj_FileTree;
642            ImageList_Destroy(hProcedureTreeViewImageList);
643            ImageList_Destroy(hMaterialTreeViewImageList);
644            return 0;
645    }
646    return DefWindowProc(hwnd,message,wParam,lParam);
647}
648
649void Project_File_Insert(char *path){
650    extern HANDLE hHeap;
651    extern PROJECTINFO ProjectInfo;
652    char temporary[MAX_PATH],temp2[MAX_PATH];
653
654    GetRelationalPath(path,ProjectInfo.dir);
655
656    //重複チェック
657    if(ProjectInfo.pobj_DBFileInfo->dupli_check(path)){
658        //"\"%s\" ファイルは既にプロジェクト内に存在します。"
659        sprintf(temporary,STRING_DUPLICATIONERROR_FILE_IN_PROJECT,path);
660        MessageBox(hOwner,temporary,APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
661        return;
662    }
663
664
665    //////////////////////
666    //ツリービューに追加
667    HTREEITEM hTreeItem;
668    _splitpath(path,0,0,temporary,temp2);
669    lstrcat(temporary,temp2);
670    hTreeItem=pobj_FileTree->insert(temporary);
671
672
673    //ProjectInfo.ppobj_DBFileInfoオブジェクトに追加
674    ProjectInfo.pobj_DBFileInfo->add(path,hTreeItem);
675
676
677    ProjectInfo.modify=1;
678
679    //ファイル操作によるクラスビューの再表示
680    ResetClassTree(-1);
681}
682void Project_File_Delete(HTREEITEM hTreeItem){
683    extern HANDLE hHeap;
684    extern PROJECTINFO ProjectInfo;
685
686    if(ProjectInfo.pobj_DBFileInfo->IsMainFile(hTreeItem)){
687        //"このファイルはプロジェクトのメイン ファイルです。プロジェクト内から削除することはできません。"
688        MessageBox(hOwner,STRING_ERROR_CANT_MAINFILE,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
689        return;
690    }
691
692    //ツリービューから削除
693    TreeView_DeleteItem(pobj_FileTree->hTree,hTreeItem);
694
695    //ProjectInfo.pobj_DBFileInfoオブジェクトから削除
696    ProjectInfo.pobj_DBFileInfo->del(hTreeItem);
697
698    ProjectInfo.modify=1;
699
700    //ファイル操作によるクラスビューの再表示
701    ResetClassTree(-1);
702}
703
704void MakeNewProject(){
705    extern HANDLE hHeap;
706    extern NEWPROJECTINFO NewProjectInfo;
707    int i;
708    char buffer[GENERAL_SIZE],dir[MAX_PATH],temporary[MAX_PATH],*pTemp;
709    HANDLE hFind;
710    WIN32_FIND_DATA wfd;
711
712    //既にプロジェクトが開かれている場合は閉じる
713    extern PROJECTINFO ProjectInfo;
714    if(ProjectInfo.name[0]){
715        if(!CloseProject()) return;
716    }
717
718    //ワークディレクトリを作成
719    i=lstrlen(pobj_nv->ProjectSaveDir);
720    if(pobj_nv->ProjectSaveDir[i-1]=='\\'&&pobj_nv->ProjectSaveDir[i-2]!=':') pobj_nv->ProjectSaveDir[i-1]=0;
721    sprintf(dir,"%s\\%s\\",pobj_nv->ProjectSaveDir,NewProjectInfo.name);
722    i=0;
723    while(!(dir[i]==':'||(dir[i-1]=='\\'&&dir[i]=='\\'))) i++;
724    if(dir[i]==':') i++;
725    else{
726        i++;
727        while(dir[i]!='\\') i++;
728    }
729    for(i++;;i++){
730        if(dir[i]=='\\'){
731            lstrcpy(temporary,dir);
732            temporary[i]=0;
733            hFind=FindFirstFile(temporary,&wfd);
734            if(hFind==INVALID_HANDLE_VALUE){
735                if(!CreateDirectory(temporary,NULL)){
736                    MessageBox(hOwner,"ディレクトリを作成できませんでした",APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
737                    return;
738                }
739            }
740            else FindClose(hFind);
741        }
742        if(dir[i]=='\0') break;
743    }
744
745
746    //////////////////////////////////////
747    // プロジェクトファイル(*.pj)を作成
748    //////////////////////////////////////
749
750    // 出力先拡張子
751    const std::string outputFileExt
752        = ( NewProjectInfo.dwTypeID == IDC_DLL ) ? ".dll"
753        : ( NewProjectInfo.dwTypeID == IDC_SLL ) ? ".lib"
754        : ".exe";
755
756    //先頭の注釈
757    lstrcpy(buffer,"\' ActiveBasic Project file.\r\n\r\n");
758    i=lstrlen(buffer);
759
760    //プロジェクトのフォーマットバージョン
761    sprintf(buffer+i,"#VERSION=%d\r\n\r\n",PROJECT_VERSION);
762    i+=lstrlen(buffer+i);
763
764    //モジュールタイプ(EXEならば0、DLLならば1)
765    ActiveBasic::Common::TargetModuleType::EnumType moduleType
766        = ( NewProjectInfo.dwTypeID == IDC_DLL ) ? ActiveBasic::Common::TargetModuleType::Dll
767        : ( NewProjectInfo.dwTypeID == IDC_SLL ) ? ActiveBasic::Common::TargetModuleType::Sll
768        : ActiveBasic::Common::TargetModuleType::Exe;
769    lstrcpy(buffer+i,( (std::string)"#MODULETYPE=" + Jenga::Common::ToString( static_cast<int>(moduleType) ) + "\r\n\r\n" ).c_str());
770    i+=lstrlen(buffer+i);
771
772    //プロジェクト名
773    sprintf(buffer+i,"#NAME=%s\r\n\r\n",NewProjectInfo.name);
774    i+=lstrlen(buffer+i);
775
776    lstrcpy(buffer+i,"#PLATFORM=32\r\n\r\n");
777    i+=lstrlen(buffer+i);
778
779    //RADウィンドウの数
780    if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE||
781        NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX)
782        lstrcpy(buffer+i,"#USEWINDOW=1\r\n\r\n");
783    else lstrcpy(buffer+i,"#USEWINDOW=0\r\n\r\n");
784    i+=lstrlen(buffer+i);
785
786    //プロジェクトオプション
787    sprintf(buffer+i,"#OPTION=&H%08x\r\n\r\n",NewProjectInfo.dwOption);
788    i+=lstrlen(buffer+i);
789
790    //出力先(Release)
791    sprintf(buffer+i,"#OUTPUT_RELEASE=.\\%s%s\r\n\r\n",NewProjectInfo.name, outputFileExt.c_str());
792    i+=lstrlen(buffer+i);
793
794    //出力先(Debug)
795    sprintf(buffer+i,"#OUTPUT_DEBUG=.\\%s_debug%s\r\n\r\n",NewProjectInfo.name, outputFileExt.c_str());
796    i+=lstrlen(buffer+i);
797
798    //マニフェスト
799    sprintf(buffer+i,"#MANIFEST=%s.manifest.xml\r\n\r\n",NewProjectInfo.name);
800    i+=lstrlen(buffer+i);
801
802    //デバッグ用(コマンドライン)
803    lstrcpy(buffer+i,"#DEBUG_CMD_LINE=\r\n\r\n");
804    i+=lstrlen(buffer+i);
805
806    //デバッグ用(DLL用の実行ファイル)
807    lstrcpy(buffer+i,"#DEBUG_EXE_PATH=\r\n\r\n");
808    i+=lstrlen(buffer+i);
809
810    //リソースファイル
811    lstrcpy(buffer+i,"#RESOURCE=0\r\n\r\n");
812    i+=lstrlen(buffer+i);
813
814    //ソースファイル
815    sprintf(buffer+i,"#SOURCE\r\n%s.ab\r\n",NewProjectInfo.name);
816    i+=lstrlen(buffer+i);
817    if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE||
818        NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
819        lstrcpy(buffer+i,"MainWnd.ab\r\n");
820        i+=lstrlen(buffer+i);
821    }
822    if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
823        lstrcpy(buffer+i,"dx_graphics.sbp\r\n");
824        i+=lstrlen(buffer+i);
825        lstrcpy(buffer+i,"dx_input.sbp\r\n");
826        i+=lstrlen(buffer+i);
827        lstrcpy(buffer+i,"dx_music.sbp\r\n");
828        i+=lstrlen(buffer+i);
829    }
830
831    //保存
832    sprintf(temporary,"%s%s.pj",dir,NewProjectInfo.name);
833    if(hFind=FindFirstFile(temporary,&wfd)){
834        if(hFind!=INVALID_HANDLE_VALUE){
835            FindClose(hFind);
836
837            //"指定したディレクトリにはすでにプロジェクトが存在します。上書きしますか?"
838            if(MessageBox(hOwner,STRING_ERROR_PROJECT_OVERWRITE,APPLICATION_NAME,MB_YESNO|MB_ICONEXCLAMATION)==IDNO) return;
839        }
840    }
841    if(!WriteBuffer(temporary,buffer,i)) return;
842
843
844    ///////////////////////////////////////////
845    //メインプログラムファイル(*.ab)を作成
846    if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE){
847        sprintf(buffer,"#include \"%s.idx\"\r\n\r\n",NewProjectInfo.name);
848        i=lstrlen(buffer);
849        lstrcpy(buffer+i,"'---------------------------\r\n");
850        i+=lstrlen(buffer+i);
851        lstrcpy(buffer+i,"'  Window Message Loop\r\n");
852        i+=lstrlen(buffer+i);
853        lstrcpy(buffer+i,"'---------------------------\r\n");
854        i+=lstrlen(buffer+i);
855        lstrcpy(buffer+i,"Dim msgMain As MSG, iResult As Long\r\n");
856        i+=lstrlen(buffer+i);
857        lstrcpy(buffer+i,"Do\r\n");
858        i+=lstrlen(buffer+i);
859        lstrcpy(buffer+i,"\tiResult=GetMessage(msgMain,0,0,0)\r\n");
860        i+=lstrlen(buffer+i);
861        lstrcpy(buffer+i,"\tIf iResult=0 or iResult=-1 Then Exit Do\r\n");
862        i+=lstrlen(buffer+i);
863        lstrcpy(buffer+i,"\tTranslateMessage(msgMain)\r\n");
864        i+=lstrlen(buffer+i);
865        lstrcpy(buffer+i,"\tDispatchMessage(msgMain)\r\n");
866        i+=lstrlen(buffer+i);
867        lstrcpy(buffer+i,"Loop\r\n\r\n");
868        i+=lstrlen(buffer+i);
869        lstrcpy(buffer+i,"' Call destructores and exit process\r\n");
870        i+=lstrlen(buffer+i);
871        lstrcpy(buffer+i,"End\r\n");
872        i+=lstrlen(buffer+i);
873    }
874    else if(NewProjectInfo.dwTypeID==IDC_EXE_PROMPTBASE){
875        sprintf(buffer,"#include \"%s.idx\"\r\n\r\n",NewProjectInfo.name);
876        i=lstrlen(buffer);
877        lstrcpy(buffer+i,"#N88BASIC\r\n\r\n");
878        i+=lstrlen(buffer+i);
879        lstrcpy(buffer+i,"' ↓ ここからプログラムが実行されます\r\n\r\n");
880        i+=lstrlen(buffer+i);
881        if(NewProjectInfo.ShowHelloWorld){
882            lstrcpy(buffer+i,"Print \"Hello World!\"\r\n");
883            i+=lstrlen(buffer+i);
884        }
885    }
886    else if(NewProjectInfo.dwTypeID==IDC_EXE_DOSPROMPTBASE){
887        sprintf(buffer,"#include \"%s.idx\"\r\n\r\n",NewProjectInfo.name);
888        i=lstrlen(buffer);
889        lstrcpy(buffer+i,"#console\r\n\r\n");
890        i+=lstrlen(buffer+i);
891        lstrcpy(buffer+i,"' ↓ ここからプログラムが実行されます\r\n\r\n");
892        i+=lstrlen(buffer+i);
893        if(NewProjectInfo.ShowHelloWorld){
894            lstrcpy(buffer+i,"Print \"Hello World!\"\r\n");
895            i+=lstrlen(buffer+i);
896        }
897    }
898    else if(NewProjectInfo.dwTypeID==IDC_EXE_NOBASE){
899        sprintf(buffer,"#include \"%s.idx\"\r\n\r\n",NewProjectInfo.name);
900        i=lstrlen(buffer);
901        lstrcpy(buffer+i,"' ↓ ここからプログラムが実行されます\r\n\r\n");
902        i+=lstrlen(buffer+i);
903    }
904    else if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
905        const std::string mainExeDirectXAbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dx\\main_exe_directx.abp";
906        pTemp = ReadBuffer( mainExeDirectXAbpPath );
907
908        //#name#をプロジェクト名に置換
909        pTemp=PermutationWndPgmTemplate(pTemp,NewProjectInfo.name,0,0,0);
910    }
911    else if(NewProjectInfo.dwTypeID==IDC_DLL){
912        sprintf(buffer,"#include \"%s.idx\"\r\n\r\n",NewProjectInfo.name);
913        i=lstrlen(buffer);
914        lstrcpy(buffer+i,"'-------------------------------------------------------------------\r\n");
915        i+=lstrlen(buffer+i);
916        lstrcpy(buffer+i,"' メモ - このファイルには、DLLの構成要素を記述します。\r\n");
917        i+=lstrlen(buffer+i);
918        lstrcpy(buffer+i,"'        (例:関数定義、グローバル変数、定数定義など)\r\n");
919        i+=lstrlen(buffer+i);
920        lstrcpy(buffer+i,"'\r\n");
921        i+=lstrlen(buffer+i);
922        lstrcpy(buffer+i,"'        エクスポートが必要な関数には、\"Export\" 修飾子を指定します。\r\n");
923        i+=lstrlen(buffer+i);
924        lstrcpy(buffer+i,"'        (例:Function Export FuncName() As Long)\r\n");
925        i+=lstrlen(buffer+i);
926        lstrcpy(buffer+i,"'-------------------------------------------------------------------\r\n");
927        i+=lstrlen(buffer+i);
928        lstrcpy(buffer+i,"\r\n");
929        i+=lstrlen(buffer+i);
930        lstrcpy(buffer+i,"Function Export DllMain(hinstDLL As HINSTANCE, fdwReason As DWord, lpvReserved As VoidPtr) As Long\r\n");
931        i+=lstrlen(buffer+i);
932        lstrcpy(buffer+i,"\t'DLLエントリポイント\r\n");
933        i+=lstrlen(buffer+i);
934        lstrcpy(buffer+i,"\tSelect Case fdwReason\r\n");
935        i+=lstrlen(buffer+i);
936        lstrcpy(buffer+i,"\t\tCase DLL_PROCESS_ATTACH\r\n");
937        i+=lstrlen(buffer+i);
938        lstrcpy(buffer+i,"\t\t\t'DLLがプロセス空間にロードされた時に実行されます。\r\n");
939        i+=lstrlen(buffer+i);
940        lstrcpy(buffer+i,"\t\t\t_System_StartupProgram()\r\n");
941        i+=lstrlen(buffer+i);
942        lstrcpy(buffer+i,"\t\t\tDllMain=1\r\n");
943        i+=lstrlen(buffer+i);
944        lstrcpy(buffer+i,"\t\tCase DLL_PROCESS_DETACH\r\n");
945        i+=lstrlen(buffer+i);
946        lstrcpy(buffer+i,"\t\t\t_System_Call_Destructor_of_GlobalObject()\r\n");
947        i+=lstrlen(buffer+i);
948        lstrcpy(buffer+i,"\tEnd Select\r\n");
949        i+=lstrlen(buffer+i);
950        lstrcpy(buffer+i,"End Function\r\n");
951        i+=lstrlen(buffer+i);
952        lstrcpy(buffer+i,"\r\n");
953        i+=lstrlen(buffer+i);
954    }
955    else if( NewProjectInfo.dwTypeID == IDC_SLL )
956    {
957        buffer[0] = 0;
958    }
959
960    //保存
961    if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
962        sprintf(temporary,"%s%s.ab",dir,NewProjectInfo.name);
963        WriteBuffer(temporary,pTemp,lstrlen(pTemp));
964
965        HeapDefaultFree(pTemp);
966    }
967    else{
968        sprintf(temporary,"%s%s.ab",dir,NewProjectInfo.name);
969        if(!WriteBuffer(temporary,buffer,lstrlen(buffer))) return;
970    }
971
972
973    /////////////////////
974    // MainWnd.abを作成
975    /////////////////////
976
977    std::string mainWndSbpPath = "";
978    if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE)
979    {
980        mainWndSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\MainWnd_exe_windowbase.sbp";
981    }
982    else if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX)
983    {
984        mainWndSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\MainWnd_exe_directx.sbp";
985    }
986
987    if( !mainWndSbpPath.empty() ){
988        pTemp = ReadBuffer( mainWndSbpPath );
989
990        //#name#をプロジェクト名に置換
991        pTemp=PermutationWndPgmTemplate(pTemp,
992            NewProjectInfo.name,
993            "MainWnd",
994            "hMainWnd",
995            "MainWndProc");
996
997        if(NewProjectInfo.ShowHelloWorld){
998            //Hello World!表示
999            i=0;
1000            lstrcpy(buffer+i,"\r\nSub MainWnd_Paint(hDC As HDC)\r\n");
1001            i+=lstrlen(buffer+i);
1002            lstrcpy(buffer+i,"\tDim rect As RECT\r\n");
1003            i+=lstrlen(buffer+i);
1004            lstrcpy(buffer+i,"\tGetClientRect(hMainWnd,rect)\r\n");
1005            i+=lstrlen(buffer+i);
1006            lstrcpy(buffer+i,"\tDrawText(hDC,\"Hello World!\",-1,rect,DT_CENTER or DT_VCENTER or DT_SINGLELINE)\r\n");
1007            i+=lstrlen(buffer+i);
1008            lstrcpy(buffer+i,"End Sub\r\n");
1009            i+=lstrlen(buffer+i);
1010
1011            pTemp=(char *)HeapReAlloc(hHeap,0,pTemp,lstrlen(pTemp)+lstrlen(buffer)+1);
1012            lstrcat(pTemp,buffer);
1013        }
1014
1015        sprintf(temporary,"%sMainWnd.ab",dir,NewProjectInfo.name);
1016        WriteBuffer(temporary,pTemp,lstrlen(pTemp));
1017
1018        HeapDefaultFree(pTemp);
1019    }
1020
1021
1022    if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
1023        ///////////////////////////
1024        // DirextX対応アプリのとき
1025        ///////////////////////////
1026
1027        //dx_graphics.sbpをコピー
1028        const std::string dxGraphicsSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dx\\dx_graphics.sbp";
1029        pTemp = ReadBuffer( dxGraphicsSbpPath );
1030        sprintf(temporary,"%sdx_graphics.sbp",dir,NewProjectInfo.name);
1031        WriteBuffer(temporary,pTemp,lstrlen(pTemp));
1032        HeapDefaultFree(pTemp);
1033
1034        //dx_input.sbpをコピー
1035        const std::string dxInputSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dx\\dx_input.sbp";
1036        pTemp = ReadBuffer( dxInputSbpPath );
1037        sprintf(temporary,"%sdx_input.sbp",dir,NewProjectInfo.name);
1038        WriteBuffer(temporary,pTemp,lstrlen(pTemp));
1039        HeapDefaultFree(pTemp);
1040
1041        //dx_music.sbpをコピー
1042        const std::string dxMusicSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dx\\dx_music.sbp";
1043        pTemp = ReadBuffer( dxMusicSbpPath );
1044        sprintf(temporary,"%sdx_music.sbp",dir,NewProjectInfo.name);
1045        WriteBuffer(temporary,pTemp,lstrlen(pTemp));
1046        HeapDefaultFree(pTemp);
1047
1048        //dx9abm.dllをコピー
1049        sprintf(temporary,"%sRuntime\\dx9abm.dll",pj_editor_Dir);
1050        sprintf(buffer,"%sdx9abm.dll",dir,NewProjectInfo.name);
1051        CopyFile(temporary,buffer,0);
1052    }
1053
1054
1055    if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE||
1056        NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
1057        /////////////////////////////////////////
1058        // ウィンドウ定義ファイル(*.wnd)を作成
1059        /////////////////////////////////////////
1060        std::vector<WINDOW_INFO> windowInfos;
1061        windowInfos.push_back( WINDOW_INFO() );
1062        windowInfos.back().name="MainWnd";
1063        windowInfos.back().HandleName="hMainWnd";
1064        windowInfos.back().pos.x=CW_USEDEFAULT;
1065        windowInfos.back().pos.y=CW_USEDEFAULT;
1066        windowInfos.back().size.cx=480;
1067        windowInfos.back().size.cy=360;
1068        windowInfos.back().caption=NewProjectInfo.name;
1069        if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE)
1070            windowInfos.back().style=WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_VISIBLE;
1071        else if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX)
1072            windowInfos.back().style=WS_OVERLAPPED|WS_THICKFRAME|WS_SYSMENU;
1073        windowInfos.back().ExStyle=0;
1074        windowInfos.back().MenuID=0;
1075        windowInfos.back().id=0;
1076        windowInfos.back().bgColor=COLOR_3DFACE;
1077        GetDefaultWindowFont(&windowInfos.back().LogFont);
1078        windowInfos.back().IconResName=0;
1079        windowInfos.back().ClassName="NORMAL";
1080        windowInfos.back().CallBackName="MainWndProc";
1081        windowInfos.back().type=WNDTYPE_DEFAULT;
1082        windowInfos.back().filepath="MainWnd.ab";
1083        windowInfos.back().NumberOfChildWindows=0;
1084        sprintf(temporary,"%s%s.wnd",dir,NewProjectInfo.name);
1085
1086        ProjectInfo.NumberOfMenu=0;
1087        SaveWindowFile( temporary, windowInfos );
1088    }
1089
1090
1091    ////////////////////////
1092    // ワークファイルを作成
1093    ////////////////////////
1094    lstrcpy(buffer,"case4\r\n\r\n");
1095    if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE){
1096        lstrcat(buffer,"rad,MainWnd\r\n\r\n");
1097    }
1098    else{
1099        sprintf(buffer+lstrlen(buffer),"text,\"%s.ab\",0,0,0,0\r\n\r\n",NewProjectInfo.name);
1100    }
1101    lstrcat(buffer,"0\r\n0\r\n0\r\n0,0");
1102    //保存
1103    sprintf(temporary,"%s%s.wrk",dir,NewProjectInfo.name);
1104    if(!WriteBuffer(temporary,buffer,lstrlen(buffer))) return;
1105
1106
1107    //マニフェストを作成
1108    char temp2[MAX_PATH];
1109    const std::string manifestTempXmlPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\manifest_temp.xml";
1110    sprintf(temp2,"%s%s.manifest.xml",dir,NewProjectInfo.name);
1111    CopyFile( manifestTempXmlPath.c_str(), temp2, 0 );
1112
1113
1114    sprintf(temporary,"%s%s.pj",dir,NewProjectInfo.name);
1115    OpenProject(temporary);
1116    SaveProject();
1117}
1118void SetTreeViewForProjectInfo(){
1119    extern HANDLE hHeap;
1120    extern HWND hProjectView;
1121    extern PROJECTINFO ProjectInfo;
1122    int i;
1123    char temporary[MAX_PATH];
1124    TV_INSERTSTRUCT tv;
1125
1126    sprintf(temporary,"%s ",ProjectInfo.name);
1127    lstrcat(temporary,STRING_PROJECT);
1128    SetWindowText(hProjectView,temporary);
1129
1130    tv.hInsertAfter=TVI_SORT;
1131    tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
1132
1133    //ファイル ツリー
1134    ProjectInfo.pobj_DBFileInfo->ResetTree();
1135
1136    //関数ツリー
1137    ResetClassTree(-1);
1138
1139    /////////////////////
1140    // マテリアル ツリー
1141
1142    //Cursorリソース フォルダ
1143    sprintf(temporary,"Cursor %s",STRING_RESOURCE);
1144    tv.hParent=TVI_ROOT;
1145    tv.item.iImage=0;
1146    tv.item.iSelectedImage=0;
1147    tv.item.pszText=temporary;
1148    tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1149    ProjectInfo.res.hCursorTreeItem=tv.hParent;
1150    for(i=0;i<ProjectInfo.res.NumberOfCursorRes;i++){
1151        tv.item.iImage=6;
1152        tv.item.iSelectedImage=6;
1153        tv.item.pszText=ProjectInfo.res.pCursorResInfo[i].IdName;
1154        ProjectInfo.res.pCursorResInfo[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1155    }
1156
1157    //Bitmapリソース フォルダ
1158    sprintf(temporary,"Bitmap %s",STRING_RESOURCE);
1159    tv.hParent=TVI_ROOT;
1160    tv.item.iImage=0;
1161    tv.item.iSelectedImage=0;
1162    tv.item.pszText=temporary;
1163    tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1164    ProjectInfo.res.hBitmapTreeItem=tv.hParent;
1165    for(i=0;i<ProjectInfo.res.NumberOfBitmapRes;i++){
1166        tv.item.iImage=5;
1167        tv.item.iSelectedImage=5;
1168        tv.item.pszText=ProjectInfo.res.pBitmapResInfo[i].IdName;
1169        ProjectInfo.res.pBitmapResInfo[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1170    }
1171
1172    //Iconリソース フォルダ
1173    sprintf(temporary,"Icon %s",STRING_RESOURCE);
1174    tv.hParent=TVI_ROOT;
1175    tv.item.iImage=0;
1176    tv.item.iSelectedImage=0;
1177    tv.item.pszText=temporary;
1178    tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1179    ProjectInfo.res.hIconTreeItem=tv.hParent;
1180    for(i=0;i<ProjectInfo.res.NumberOfIconRes;i++){
1181        tv.item.iImage=4;
1182        tv.item.iSelectedImage=4;
1183        if(i==0){
1184            sprintf(temporary,"%s (Main)",ProjectInfo.res.pIconResInfo[i].IdName);
1185            tv.item.pszText=temporary;
1186        }
1187        else tv.item.pszText=ProjectInfo.res.pIconResInfo[i].IdName;
1188        ProjectInfo.res.pIconResInfo[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1189    }
1190
1191    //Menuフォルダ
1192    tv.hParent=TVI_ROOT;
1193    tv.item.iImage=0;
1194    tv.item.iSelectedImage=0;
1195    tv.item.pszText="Menu";
1196    tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1197    ProjectInfo.hMenuTreeItem=tv.hParent;
1198    for(i=0;i<ProjectInfo.NumberOfMenu;i++){
1199        tv.item.iImage=3;
1200        tv.item.iSelectedImage=3;
1201        tv.item.pszText=ProjectInfo.pMenuInfo[i].IdName;
1202        ProjectInfo.pMenuInfo[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1203    }
1204
1205    //Windowフォルダ
1206    tv.hParent=TVI_ROOT;
1207    tv.item.iImage=0;
1208    tv.item.iSelectedImage=0;
1209    tv.item.pszText="Window";
1210    tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1211    ProjectInfo.hWindowTreeItem=tv.hParent;
1212    BOOST_FOREACH( WINDOW_INFO &windowInfo, ProjectInfo.windowInfos )
1213    {
1214        tv.item.iImage=2;
1215        tv.item.iSelectedImage=2;
1216        tv.item.pszText = windowInfo.name;
1217        windowInfo.hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1218    }
1219}
1220void OpenProject(char *path){
1221    extern HANDLE hHeap;
1222    extern PROJECTINFO ProjectInfo;
1223    int i,i2,i3;
1224    char *buffer,temporary[MAX_PATH],temp2[MAX_PATH];
1225
1226    //既にプロジェクトが開かれている場合は閉じる
1227    if(ProjectInfo.name[0]){
1228        if(!CloseProject()) return;
1229    }
1230    memset(&ProjectInfo,0,sizeof(PROJECTINFO));
1231
1232    //プロジェクトの作業ディレクトリを取得
1233    _splitpath(path,ProjectInfo.dir,temporary,0,0);
1234    lstrcat(ProjectInfo.dir,temporary);
1235
1236    //ファイルを開く、保存の初期ディレクトリをセット
1237    lstrcpy(pobj_nv->DefSaveDir,ProjectInfo.dir);
1238
1239
1240    //////////////////////////////////////////
1241    // リソースデータ用領域を確保
1242    ProjectInfo.res.pCursorResInfo=(RESITEMINFO *)HeapAlloc(hHeap,0,1);
1243    ProjectInfo.res.NumberOfCursorRes=0;
1244    ProjectInfo.res.pBitmapResInfo=(RESITEMINFO *)HeapAlloc(hHeap,0,1);
1245    ProjectInfo.res.NumberOfBitmapRes=0;
1246    ProjectInfo.res.pIconResInfo=(RESITEMINFO *)HeapAlloc(hHeap,0,1);
1247    ProjectInfo.res.NumberOfIconRes=0;
1248
1249
1250    //////////////////////////////////////////
1251    //プロジェクトファイル(*.pj)をオープン
1252    buffer=ReadBuffer(path);
1253    if(!buffer) return;
1254
1255    //解析
1256    ProjectInfo.pobj_DBFileInfo=new CDBFileInfo();
1257    bool isUseWindow = false;
1258    for(i=0;;i++){
1259        if(buffer[i]=='\0') break;
1260        if(buffer[i]=='\r'&&buffer[i+1]=='\n'&&buffer[i+2]=='#'){
1261            for(i+=3,i2=0;;i++,i2++){
1262                if(!IsVariableChar(buffer[i])){
1263                    temporary[i2]=0;
1264                    break;
1265                }
1266                temporary[i2]=buffer[i];
1267            }
1268            if(lstrcmpi(temporary,"VERSION")==0&&buffer[i]=='='){
1269                for(i++,i2=0;;i++,i2++){
1270                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1271                        temporary[i2]=0;
1272                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1273                        break;
1274                    }
1275                    temporary[i2]=buffer[i];
1276                }
1277                ProjectInfo.dwVersion=GetValue(temporary);
1278            }
1279            else if(lstrcmpi(temporary,"MODULETYPE")==0&&buffer[i]=='='){
1280                for(i++,i2=0;;i++,i2++){
1281                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1282                        temporary[i2]=0;
1283                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1284                        break;
1285                    }
1286                    temporary[i2]=buffer[i];
1287                }
1288                ProjectInfo.dwModuleType=atoi(temporary);
1289            }
1290            else if(lstrcmpi(temporary,"NAME")==0&&buffer[i]=='='){
1291                for(i++,i2=0;;i++,i2++){
1292                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1293                        ProjectInfo.name[i2]=0;
1294                        break;
1295                    }
1296                    ProjectInfo.name[i2]=buffer[i];
1297                }
1298            }
1299            else if(lstrcmpi(temporary,"PLATFORM")==0&&buffer[i]=='='){
1300                for(i++,i2=0;;i++,i2++){
1301                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1302                        temporary[i2]=0;
1303                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1304                        break;
1305                    }
1306                    temporary[i2]=buffer[i];
1307                }
1308                i2=atoi(temporary);
1309                extern HWND hSelectCompilerCombo;
1310                if(i2==32){
1311                    //プラットフォームにWin32を選択
1312                    SendMessage(hSelectCompilerCombo,CB_SETCURSEL,0,0);
1313                }
1314                else if(i2==64){
1315                    //プラットフォームにWin64を選択
1316                    SendMessage(hSelectCompilerCombo,CB_SETCURSEL,1,0);
1317                }
1318                SendMessage(hSelectCompilerCombo,WM_COMMAND,MAKELONG(0,CBN_SELCHANGE),0);
1319            }
1320            else if(lstrcmpi(temporary,"USEWINDOW")==0&&buffer[i]=='='){
1321                for(i++,i2=0;;i++,i2++){
1322                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1323                        temporary[i2]=0;
1324                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1325                        break;
1326                    }
1327                    temporary[i2]=buffer[i];
1328                }
1329                if( atoi(temporary) > 0 )
1330                {
1331                    isUseWindow = true;
1332                }
1333            }
1334            else if(lstrcmpi(temporary,"OPTION")==0&&buffer[i]=='='){
1335                for(i++,i2=0;;i++,i2++){
1336                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1337                        temporary[i2]=0;
1338                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1339                        break;
1340                    }
1341                    temporary[i2]=buffer[i];
1342                }
1343                ProjectInfo.dwOption=GetValue(temporary);
1344            }
1345            else if(lstrcmpi(temporary,"OUTPUT_RELEASE")==0&&buffer[i]=='='){
1346                for(i++,i2=0;;i++,i2++){
1347                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1348                        temporary[i2]=0;
1349                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1350                        break;
1351                    }
1352                    temporary[i2]=buffer[i];
1353                }
1354                lstrcpy(ProjectInfo.lpszOutput_Release,temporary);
1355            }
1356            else if(lstrcmpi(temporary,"OUTPUT_DEBUG")==0&&buffer[i]=='='){
1357                for(i++,i2=0;;i++,i2++){
1358                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1359                        temporary[i2]=0;
1360                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1361                        break;
1362                    }
1363                    temporary[i2]=buffer[i];
1364                }
1365                lstrcpy(ProjectInfo.lpszOutput_Debug,temporary);
1366            }
1367            else if(lstrcmpi(temporary,"MANIFEST")==0&&buffer[i]=='='){
1368                for(i++,i2=0;;i++,i2++){
1369                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1370                        temporary[i2]=0;
1371                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1372                        break;
1373                    }
1374                    temporary[i2]=buffer[i];
1375                }
1376                lstrcpy(ProjectInfo.szManifestPath,temporary);
1377            }
1378            else if(lstrcmpi(temporary,"DEBUG_CMD_LINE")==0&&buffer[i]=='='){
1379                for(i++,i2=0;;i++,i2++){
1380                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1381                        temporary[i2]=0;
1382                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1383                        break;
1384                    }
1385                    temporary[i2]=buffer[i];
1386                }
1387                lstrcpy(ProjectInfo.szCmdLine,temporary);
1388            }
1389            else if(lstrcmpi(temporary,"DEBUG_EXE_PATH")==0&&buffer[i]=='='){
1390                for(i++,i2=0;;i++,i2++){
1391                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1392                        temporary[i2]=0;
1393                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1394                        break;
1395                    }
1396                    temporary[i2]=buffer[i];
1397                }
1398                lstrcpy(ProjectInfo.szExePath,temporary);
1399            }
1400            else if(lstrcmpi(temporary,"RESOURCE")==0&&buffer[i]=='='){
1401                for(i++,i2=0;;i++,i2++){
1402                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1403                        temporary[i2]=0;
1404                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1405                        break;
1406                    }
1407                    temporary[i2]=buffer[i];
1408                }
1409                if(temporary[0]!='\0'&&(!(temporary[0]=='0'&&temporary[1]=='\0'))){
1410                    lstrcpy(ProjectInfo.ResourceFileName,temporary);
1411                    GetResourceData();
1412                }
1413                else{
1414                    sprintf(ProjectInfo.ResourceFileName,"%s.rc",ProjectInfo.name);
1415                }
1416            }
1417            else if(lstrcmpi(temporary,"SOURCE")==0&&buffer[i]=='\r'&&buffer[i+1]=='\n'){
1418                while(1){
1419                    for(i+=2,i2=0;;i++,i2++){
1420                        if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1421                            temporary[i2]=0;
1422                            break;
1423                        }
1424                        temporary[i2]=buffer[i];
1425                    }
1426                    if(temporary[0]=='\0') break;
1427                    ProjectInfo.pobj_DBFileInfo->add(temporary,0);
1428
1429                    if(buffer[i]=='\0') break;
1430                }
1431            }
1432            else{
1433                //不明なパラメータは無視
1434                for(i++;;i++){
1435                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1436                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1437                        break;
1438                    }
1439                }
1440            }
1441            if(buffer[i]=='\0') break;
1442        }
1443    }
1444    HeapDefaultFree(buffer);
1445
1446    //古いバージョンファイルを考慮
1447    if(ProjectInfo.dwVersion<=4){
1448        if(ProjectInfo.dwModuleType==MT_DLL)
1449            sprintf(ProjectInfo.lpszOutput_Release,".\\%s.dll",ProjectInfo.name);
1450        else sprintf(ProjectInfo.lpszOutput_Release,".\\%s.exe",ProjectInfo.name);
1451        sprintf(ProjectInfo.lpszOutput_Debug,".\\%s_debug.exe",ProjectInfo.name);
1452    }
1453
1454    //ブレークポイントを初期化
1455    ProjectInfo.pobj_DBBreakPoint=new CDBBreakPoint();
1456
1457
1458    if( isUseWindow )
1459    {
1460        /////////////////////////////////////////////
1461        //ウィンドウ定義ファイル(*.wnd)をオープン
1462        sprintf(temp2,"%s%s.wnd",ProjectInfo.dir,ProjectInfo.name);
1463        if(!OpenWindowFile(temp2)) return;
1464    }
1465    else{
1466        ProjectInfo.windowInfos.clear();
1467
1468        ProjectInfo.NumberOfMenu=0;
1469        ProjectInfo.pMenuInfo=(MENU_INFO *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1);
1470    }
1471
1472
1473    //プロジェクト ビューを設定、表示
1474    extern HWND hProjectView;
1475    SetTreeViewForProjectInfo();
1476    if(!IsWindowVisible(hProjectView)) SendMessage(hOwner,WM_COMMAND,IDM_PROJECTVIEW,0);
1477
1478
1479    //メニュー状態を設定
1480    ResetState_DocMenu();
1481
1482
1483    //////////////////////////////////////////
1484    //ワークファイル(*.wrk)をオープン
1485    extern MDIINFO MdiInfo[MAX_WNDNUM];
1486    HTREEITEM hTreeItem;
1487    HANDLE hFind;
1488    WIN32_FIND_DATA wfd;
1489    HWND hChild;
1490    int WndNum;
1491    sprintf(temp2,"%s%s.wrk",ProjectInfo.dir,ProjectInfo.name);
1492    hFind=FindFirstFile(temp2,&wfd);
1493    if(hFind!=INVALID_HANDLE_VALUE){
1494        FindClose(hFind);
1495        buffer=ReadBuffer(temp2);
1496        if(!buffer) return;
1497
1498        //解析、反映
1499        memcpy(temporary,buffer,5);
1500        temporary[5]=0;
1501        if(lstrcmp(temporary,"case4")==0){
1502
1503            LockWindowUpdate(hOwner);
1504            for(i=9,i2=0;;i++,i2++){
1505                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1506                    if(i2!=0){
1507                        temporary[i2]=0;
1508                        for(i3=0;;i3++){
1509                            if(temporary[i3]==','||temporary[i3]=='\0') break;
1510                        }
1511                        if(temporary[i3]=='\0') goto EndToSetWorkFile;
1512                        lstrcpy(temp2,temporary+i3+1);
1513                        temporary[i3]=0;
1514                        if(lstrcmpi(temporary,"text")==0){
1515                            if(temp2[0]!='\"') goto EndToSetWorkFile;
1516
1517                            //ファイルを開く
1518                            i2=1;
1519                            for(i3=0;;i2++,i3++){
1520                                if(temp2[i2]=='\"'||temp2[i2]=='\0'){
1521                                    temporary[i3]=0;
1522                                    break;
1523                                }
1524                                temporary[i3]=temp2[i2];
1525                            }
1526                            GetFullPath(temporary,ProjectInfo.dir);
1527                            hChild=OpenFileWithExtension(temporary);
1528                            WndNum=GetWndNum(hChild);
1529                            if(WndNum==-1){
1530                                goto EndToSetWorkFile;
1531                            }
1532
1533                            //ResetScrollbarが再描画時に呼び出されるので、再描画する
1534                            InvalidateRect(MdiInfo[WndNum].pMdiTextEdit->hEdit,NULL,0);
1535                            UpdateWindow(MdiInfo[WndNum].pMdiTextEdit->hEdit);
1536
1537                            if(temp2[i2]=='\0') goto EndToSetWorkFile;
1538                            if(temp2[i2+1]!=',') goto EndToSetWorkFile;
1539
1540                            //以前のスクロール位置を復元
1541                            SCROLLINFO si;
1542                            POINT pos;
1543                            for(i2+=2,i3=0;;i2++,i3++){
1544                                if(temp2[i2]==','||temp2[i2]=='\0'){
1545                                    temporary[i3]=0;
1546                                    break;
1547                                }
1548                                temporary[i3]=temp2[i2];
1549                            }
1550                            sscanf(temporary,"%d",&pos.x);
1551                            if(temp2[i2]=='\0') goto EndToSetWorkFile;
1552                            for(i2++,i3=0;;i2++,i3++){
1553                                if(temp2[i2]==','||temp2[i2]=='\0'){
1554                                    temporary[i3]=0;
1555                                    break;
1556                                }
1557                                temporary[i3]=temp2[i2];
1558                            }
1559                            sscanf(temporary,"%d",&pos.y);
1560                            si.cbSize=sizeof(SCROLLINFO);
1561                            si.fMask=SIF_POS;
1562                            si.nPos=pos.x;
1563                            SetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_HORZ,&si,1);
1564                            si.nPos=pos.y;
1565                            SetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_VERT,&si,1);
1566
1567                            if(temp2[i2]=='\0') goto EndToSetWorkFile;
1568
1569                            //キャレット位置をセット
1570                            for(i2++,i3=0;;i2++,i3++){
1571                                if(temp2[i2]==','||temp2[i2]=='\0'){
1572                                    temporary[i3]=0;
1573                                    break;
1574                                }
1575                                temporary[i3]=temp2[i2];
1576                            }
1577                            sscanf(temporary,"%d",&pos.x);
1578                            if(temp2[i2]=='\0') goto EndToSetWorkFile;
1579                            for(i2++,i3=0;;i2++,i3++){
1580                                if(temp2[i2]==','||temp2[i2]=='\0'){
1581                                    temporary[i3]=0;
1582                                    break;
1583                                }
1584                                temporary[i3]=temp2[i2];
1585                            }
1586                            sscanf(temporary,"%d",&pos.y);
1587                            TextEdit_SetSel(WndNum,pos.x,pos.y);
1588                        }
1589                        else if(lstrcmpi(temporary,"rad")==0){
1590                            for(i3=0;i3<static_cast<int>(ProjectInfo.windowInfos.size());i3++){
1591                                if(lstrcmpi(ProjectInfo.windowInfos[i3].name,temp2)==0){
1592                                    NewRadWindow( ProjectInfo.windowInfos[i3] );
1593                                    break;
1594                                }
1595                            }
1596                        }
1597                        else if(lstrcmpi(temporary,"menu")==0){
1598                            for(i3=0;i3<ProjectInfo.NumberOfMenu;i3++){
1599                                if(lstrcmpi(ProjectInfo.pMenuInfo[i3].IdName,temp2)==0){
1600                                    NewMenuWindow(&ProjectInfo.pMenuInfo[i3]);
1601                                    break;
1602                                }
1603                            }
1604                        }
1605                        else if(lstrcmpi(temporary,"icon")==0){
1606                            for(i3=0;i3<ProjectInfo.res.NumberOfIconRes;i3++){
1607                                if(lstrcmpi(ProjectInfo.res.pIconResInfo[i3].path,temp2)==0){
1608                                    GetFullPath(temp2,ProjectInfo.dir);
1609                                    NewIconEditWindow(temp2);
1610                                    break;
1611                                }
1612                            }
1613                        }
1614                        i++;
1615                        i2=-1;
1616                        continue;
1617                    }
1618                    else break;
1619                }
1620                temporary[i2]=buffer[i];
1621            }
1622
1623            for(i+=2,i2=0;;i++,i2++){
1624                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1625                    temporary[i2]=0;
1626                    break;
1627                }
1628                temporary[i2]=buffer[i];
1629            }
1630            sscanf(temporary,"%d",&i2);
1631
1632            switch( i2 ){
1633                case 0:
1634                    ShowFileView();
1635                    break;
1636                case 1:
1637                    ShowClassView();
1638                    break;
1639                case 2:
1640                    ShowMaterialView();
1641                    break;
1642            }
1643
1644            if(buffer[i]=='\0') goto EndToSetWorkFile;
1645
1646            for(i+=2,i2=0;;i++,i2++){
1647                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1648                    temporary[i2]=0;
1649                    break;
1650                }
1651                temporary[i2]=buffer[i];
1652            }
1653            if(temporary[0]=='1') TreeView_Expand(pobj_FileTree->hTree,TreeView_GetRoot(pobj_FileTree->hTree),TVE_EXPAND);
1654
1655            for(i+=2,i2=0;;i++,i2++){
1656                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1657                    temporary[i2]=0;
1658                    break;
1659                }
1660                temporary[i2]=buffer[i];
1661            }
1662            if(temporary[0]=='1') TreeView_Expand(hProcedureTreeView,TreeView_GetRoot(hProcedureTreeView),TVE_EXPAND);
1663
1664            for(i+=2,i2=0;;i++,i2++){
1665                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1666                    temporary[i2]=0;
1667                    break;
1668                }
1669                temporary[i2]=buffer[i];
1670            }
1671            hTreeItem=TreeView_GetRoot(hMaterialTreeView);
1672            i2=0;
1673            while(hTreeItem){
1674                i2=GetOneParameter(temporary,i2,temp2);
1675                if(GetValue(temp2)) TreeView_Expand(hMaterialTreeView,hTreeItem,TVE_EXPAND);
1676                hTreeItem=TreeView_GetNextSibling(hMaterialTreeView,hTreeItem);
1677            }
1678        }
1679        else if(lstrcmp(temporary,"case3")==0){
1680            ////////////////////////////////////////
1681            // 古いフォーマットのワークファイル
1682
1683            LockWindowUpdate(hOwner);
1684            for(i=9,i2=0;;i++,i2++){
1685                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1686                    if(i2!=0){
1687                        temporary[i2]=0;
1688                        for(i3=0;;i3++){
1689                            if(temporary[i3]==','||temporary[i3]=='\0') break;
1690                        }
1691                        if(temporary[i3]=='\0') goto EndToSetWorkFile;
1692                        lstrcpy(temp2,temporary+i3+1);
1693                        temporary[i3]=0;
1694                        if(lstrcmpi(temporary,"text")==0){
1695                            for(i3=0;;i3++){
1696                                if(temp2[i3]==','||temp2[i3]=='\0') break;
1697                            }
1698                            if(temp2[i3]=='\0') goto EndToSetWorkFile;
1699                            lstrcpy(temporary,temp2+i3+1);
1700                            temp2[i3]=0;
1701                            GetFullPath(temporary,ProjectInfo.dir);
1702                            sscanf(temp2,"%d",&i3);
1703
1704                            //ファイルを開く
1705                            hChild=OpenFileWithExtension(temporary);
1706                            WndNum=GetWndNum(hChild);
1707
1708                            //キャレット位置をセット
1709                            TextEdit_SetSel(WndNum,i3,i3);
1710                        }
1711                        else if(lstrcmpi(temporary,"rad")==0){
1712                            for(i3=0;i3<static_cast<int>(ProjectInfo.windowInfos.size());i3++){
1713                                if(lstrcmpi(ProjectInfo.windowInfos[i3].name,temp2)==0){
1714                                    NewRadWindow( ProjectInfo.windowInfos[i3] );
1715                                    break;
1716                                }
1717                            }
1718                        }
1719                        else if(lstrcmpi(temporary,"menu")==0){
1720                            for(i3=0;i3<ProjectInfo.NumberOfMenu;i3++){
1721                                if(lstrcmpi(ProjectInfo.pMenuInfo[i3].IdName,temp2)==0){
1722                                    NewMenuWindow(&ProjectInfo.pMenuInfo[i3]);
1723                                    break;
1724                                }
1725                            }
1726                        }
1727                        else if(lstrcmpi(temporary,"icon")==0){
1728                            for(i3=0;i3<ProjectInfo.res.NumberOfIconRes;i3++){
1729                                if(lstrcmpi(ProjectInfo.res.pIconResInfo[i3].path,temp2)==0){
1730                                    GetFullPath(temp2,ProjectInfo.dir);
1731                                    NewIconEditWindow(temp2);
1732                                    break;
1733                                }
1734                            }
1735                        }
1736                        i++;
1737                        i2=-1;
1738                        continue;
1739                    }
1740                    else break;
1741                }
1742                temporary[i2]=buffer[i];
1743            }
1744
1745            for(i+=2,i2=0;;i++,i2++){
1746                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1747                    temporary[i2]=0;
1748                    break;
1749                }
1750                temporary[i2]=buffer[i];
1751            }
1752            sscanf(temporary,"%d",&i2);
1753
1754            switch( i2 ){
1755                case 0:
1756                    ShowFileView();
1757                    break;
1758                case 1:
1759                    ShowClassView();
1760                    break;
1761                case 2:
1762                    ShowMaterialView();
1763                    break;
1764            }
1765
1766            if(buffer[i]=='\0') goto EndToSetWorkFile;
1767
1768            for(i+=2,i2=0;;i++,i2++){
1769                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1770                    temporary[i2]=0;
1771                    break;
1772                }
1773                temporary[i2]=buffer[i];
1774            }
1775            if(temporary[0]=='1') TreeView_Expand(pobj_FileTree->hTree,TreeView_GetRoot(pobj_FileTree->hTree),TVE_EXPAND);
1776
1777            for(i+=2,i2=0;;i++,i2++){
1778                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1779                    temporary[i2]=0;
1780                    break;
1781                }
1782                temporary[i2]=buffer[i];
1783            }
1784            if(temporary[0]=='1') TreeView_Expand(hProcedureTreeView,TreeView_GetRoot(hProcedureTreeView),TVE_EXPAND);
1785
1786            for(i+=2,i2=0;;i++,i2++){
1787                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1788                    temporary[i2]=0;
1789                    break;
1790                }
1791                temporary[i2]=buffer[i];
1792            }
1793            hTreeItem=TreeView_GetRoot(hMaterialTreeView);
1794            i2=0;
1795            while(hTreeItem){
1796                i2=GetOneParameter(temporary,i2,temp2);
1797                if(GetValue(temp2)) TreeView_Expand(hMaterialTreeView,hTreeItem,TVE_EXPAND);
1798                hTreeItem=TreeView_GetNextSibling(hMaterialTreeView,hTreeItem);
1799            }
1800        }
1801EndToSetWorkFile:
1802        LockWindowUpdate(NULL);
1803        HeapDefaultFree(buffer);
1804    }
1805
1806
1807    //ウィンドウ タイトルを変更
1808    sprintf(temporary,"%s - %s",ProjectInfo.name,APPLICATION_NAME);
1809    SetWindowText(hOwner,temporary);
1810
1811
1812    ProjectInfo.modify=0;
1813    ProjectInfo.ModifyOfMaterial=0;
1814    ProjectInfo.ModifuOfResource=0;
1815}
1816BOOL ProjectModifyCheck(BOOL bRun){
1817    extern MDIINFO MdiInfo[MAX_WNDNUM];
1818    extern PROJECTINFO ProjectInfo;
1819    int i,WndNum,sw;
1820    HWND hChild;
1821    char temporary[MAX_PATH];
1822    if(ProjectInfo.modify||ProjectInfo.ModifyOfMaterial||ProjectInfo.ModifuOfResource){
1823        if(bRun==0||pobj_nv->bSaveCheckProject){
1824            //"\"%s\" プロジェクトは変更されています。保存しますか?"
1825            sprintf(temporary,STRING_MODIFYCHECK_PROJECT,ProjectInfo.name);
1826            i=MessageBox(hOwner,temporary,APPLICATION_NAME,MB_YESNOCANCEL|MB_ICONEXCLAMATION);
1827
1828            if(i==IDCANCEL) return 0;
1829            if(i==IDYES) SaveProject();
1830        }
1831        else SaveProject();
1832        return 1;
1833    }
1834    hChild=GetWindow(hClient,GW_CHILD);
1835    while(hChild){
1836        WndNum=GetWndNum(hChild);
1837        sw=0;
1838        if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
1839            if( MdiInfo[WndNum].pMdiTextEdit->IsModified() ){
1840                for(i=0;i<ProjectInfo.pobj_DBFileInfo->iNum;i++){
1841                    ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->GetFullPath(temporary);
1842                    if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0) sw=1;
1843                }
1844            }
1845        }
1846        else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
1847            if(MdiInfo[WndNum].MdiIconEditInfo->bModify){
1848                for(i=0;i<ProjectInfo.res.NumberOfIconRes;i++){
1849                    lstrcpy(temporary,ProjectInfo.res.pIconResInfo[i].path);
1850                    GetFullPath(temporary,ProjectInfo.dir);
1851                    if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0) sw=1;
1852                }
1853            }
1854        }
1855
1856        if(sw){
1857            if(bRun==0||pobj_nv->bSaveCheckProject){
1858                //"\"%s\" プロジェクトは変更されています。保存しますか?"
1859                sprintf(temporary,STRING_MODIFYCHECK_PROJECT,ProjectInfo.name);
1860                i=MessageBox(hOwner,temporary,APPLICATION_NAME,MB_YESNOCANCEL|MB_ICONEXCLAMATION);
1861
1862                if(i==IDCANCEL) return 0;
1863                if(i==IDYES) SaveProject();
1864            }
1865            else SaveProject();
1866            return 1;
1867        }
1868        hChild=GetNextWindow(hChild,GW_HWNDNEXT);
1869    }
1870    return 2;
1871}
1872_int8 CloseProject(void){
1873    extern HANDLE hHeap;
1874    extern MDIINFO MdiInfo[MAX_WNDNUM];
1875    extern PROJECTINFO ProjectInfo;
1876    int i,i2,WndNum;
1877    HWND hChild,hCloseChild;
1878    char temporary[MAX_PATH];
1879
1880
1881    //保存確認
1882    i=ProjectModifyCheck(0);
1883    if(i==0) return 0;
1884    else if(i==2) MakeWorkFile();
1885
1886    //プロジェクトに関するMDIウィンドウをすべて閉じる
1887    hChild=GetWindow(hClient,GW_CHILD);
1888    while(hChild){
1889        hCloseChild=hChild;
1890        hChild=GetNextWindow(hChild,GW_HWNDNEXT);
1891        WndNum=GetWndNum(hCloseChild);
1892        if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
1893            for(i=0;i<ProjectInfo.pobj_DBFileInfo->iNum;i++){
1894                ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->GetFullPath(temporary);
1895                if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
1896
1897                    //変更フラグをオフにする
1898                    MdiInfo[WndNum].pMdiTextEdit->UnModify();
1899
1900                    SendMessage(hCloseChild,WM_CLOSE,0,0);
1901                    break;
1902                }
1903            }
1904        }
1905        else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){
1906            BOOST_FOREACH( const WINDOW_INFO &windowInfo, ProjectInfo.windowInfos )
1907            {
1908                if(lstrcmp(MdiInfo[WndNum].path, windowInfo.name)==0){
1909                    SendMessage(hCloseChild,WM_CLOSE,0,0);
1910                    break;
1911                }
1912            }
1913        }
1914        else if(MdiInfo[WndNum].DocType==WNDTYPE_MENU){
1915            for(i=0;i<ProjectInfo.NumberOfMenu;i++){
1916                if(lstrcmp(MdiInfo[WndNum].path,ProjectInfo.pMenuInfo[i].IdName)==0){
1917                    SendMessage(hCloseChild,WM_CLOSE,0,0);
1918                    break;
1919                }
1920            }
1921        }
1922        else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
1923            for(i=0;ProjectInfo.res.NumberOfIconRes;i++){
1924                lstrcpy(temporary,ProjectInfo.res.pIconResInfo[i].path);
1925                GetFullPath(temporary,ProjectInfo.dir);
1926                if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
1927                    SendMessage(hCloseChild,WM_CLOSE,0,0);
1928                    break;
1929                }
1930            }
1931        }
1932    }
1933
1934    //ファイル情報のメモリを解放
1935    delete ProjectInfo.pobj_DBFileInfo;
1936
1937    //ブレークポイントのオブジェクトを解放
1938    delete ProjectInfo.pobj_DBBreakPoint;
1939
1940    //ウィンドウ情報のメモリを解放
1941    BOOST_FOREACH( WINDOW_INFO &windowInfo, ProjectInfo.windowInfos )
1942    {
1943        HeapDefaultFree(windowInfo.name);
1944        HeapDefaultFree(windowInfo.HandleName);
1945        HeapDefaultFree(windowInfo.caption);
1946        HeapDefaultFree(windowInfo.ClassName);
1947        HeapDefaultFree(windowInfo.CallBackName);
1948        HeapDefaultFree(windowInfo.filepath);
1949        if(windowInfo.MenuID)
1950            HeapDefaultFree(windowInfo.MenuID);
1951        if(windowInfo.IconResName)
1952            HeapDefaultFree(windowInfo.IconResName);
1953
1954        //子ウィンドウのメモリを解放
1955        for(i2=0;i2<windowInfo.NumberOfChildWindows;i2++){
1956            HeapDefaultFree(windowInfo.pChildInfo[i2].IdName);
1957            HeapDefaultFree(windowInfo.pChildInfo[i2].caption);
1958            if(windowInfo.pChildInfo[i2].Control==CT_IMAGEBOX){
1959                //イメージ ボックスの場合
1960                HeapDefaultFree(windowInfo.pChildInfo[i2].ImageCtrlInfo.path);
1961            }
1962        }
1963        HeapDefaultFree(windowInfo.pChildInfo);
1964    }
1965    ProjectInfo.windowInfos.clear();
1966
1967    //メニュー情報のメモリを解放
1968    HeapMenuDataFree(ProjectInfo.pMenuInfo,ProjectInfo.NumberOfMenu,0);
1969    HeapDefaultFree(ProjectInfo.pMenuInfo);
1970
1971    //リソースのメモリを解放
1972    for(i=0;i<ProjectInfo.res.NumberOfCursorRes;i++){
1973        HeapDefaultFree(ProjectInfo.res.pCursorResInfo[i].IdName);
1974        HeapDefaultFree(ProjectInfo.res.pCursorResInfo[i].path);
1975    }
1976    HeapDefaultFree(ProjectInfo.res.pCursorResInfo);
1977    for(i=0;i<ProjectInfo.res.NumberOfBitmapRes;i++){
1978        HeapDefaultFree(ProjectInfo.res.pBitmapResInfo[i].IdName);
1979        HeapDefaultFree(ProjectInfo.res.pBitmapResInfo[i].path);
1980    }
1981    HeapDefaultFree(ProjectInfo.res.pBitmapResInfo);
1982    for(i=0;i<ProjectInfo.res.NumberOfIconRes;i++){
1983        HeapDefaultFree(ProjectInfo.res.pIconResInfo[i].IdName);
1984        HeapDefaultFree(ProjectInfo.res.pIconResInfo[i].path);
1985    }
1986    HeapDefaultFree(ProjectInfo.res.pIconResInfo);
1987
1988    //プロジェクト ビューを非表示にする
1989    extern HWND hProjectView;
1990    if(IsWindowVisible(hProjectView)) SendMessage(hOwner,WM_COMMAND,IDM_PROJECTVIEW,0);
1991    SetWindowText(hProjectView,"Project View");
1992
1993    TreeView_DeleteAllItems(pobj_FileTree->hTree);
1994    TreeView_DeleteAllItems(hProcedureTreeView);
1995    TreeView_DeleteAllItems(hMaterialTreeView);
1996
1997    //ウィンドウ タイトルを変更
1998    SetWindowText(hOwner,APPLICATION_NAME);
1999
2000    ProjectInfo.name[0]=0;
2001
2002    //メニュー状態を設定
2003    ResetState_DocMenu();
2004
2005    return 1;
2006}
2007void MakeWorkFile(void){
2008    extern MDIINFO MdiInfo[MAX_WNDNUM];
2009    extern PROJECTINFO ProjectInfo;
2010    int i,i2,WndNum;
2011    char temporary[MAX_PATH],buffer[32767];
2012    HWND hChild;
2013    CHARRANGE CharRange;
2014
2015    //ワークファイル(*.wrk)を作成
2016    lstrcpy(buffer,"case4\r\n\r\n");
2017    i2=lstrlen(buffer);
2018
2019
2020    ///////////////////////
2021    //MDIウィンドウの並び
2022    hChild=GetWindow(GetWindow(hClient,GW_CHILD),GW_HWNDLAST);
2023    while(hChild){
2024        WndNum=GetWndNum(hChild);
2025        if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
2026            for(i=0;i<ProjectInfo.pobj_DBFileInfo->iNum;i++){
2027                ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->GetFullPath(temporary);
2028                if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
2029                    TextEdit_GetSel(WndNum,&CharRange);
2030
2031                    SCROLLINFO si;
2032                    POINT pos;
2033                    si.cbSize=sizeof(SCROLLINFO);
2034                    si.fMask=SIF_POS;
2035                    GetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_HORZ,&si);
2036                    pos.x=si.nPos;
2037                    GetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_VERT,&si);
2038                    pos.y=si.nPos;
2039
2040                    sprintf(buffer+i2,"text,\"%s\",%d,%d,%d,%d\r\n",
2041                        ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->m_path,
2042                        pos.x,
2043                        pos.y,
2044                        CharRange.cpMin,
2045                        CharRange.cpMax);
2046                    i2+=lstrlen(buffer+i2);
2047                    break;
2048                }
2049            }
2050        }
2051        else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){
2052            BOOST_FOREACH( WINDOW_INFO &windowInfo, ProjectInfo.windowInfos )
2053            {
2054                if(lstrcmpi(MdiInfo[WndNum].path,windowInfo.name)==0){
2055                    sprintf(buffer+i2,"rad,%s\r\n",MdiInfo[WndNum].path);
2056                    i2+=lstrlen(buffer+i2);
2057                    break;
2058                }
2059            }
2060        }
2061        else if(MdiInfo[WndNum].DocType==WNDTYPE_MENU){
2062            for(i=0;i<ProjectInfo.NumberOfMenu;i++){
2063                if(lstrcmpi(MdiInfo[WndNum].path,ProjectInfo.pMenuInfo[i].IdName)==0){
2064                    sprintf(buffer+i2,"menu,%s\r\n",MdiInfo[WndNum].path);
2065                    i2+=lstrlen(buffer+i2);
2066                    break;
2067                }
2068            }
2069        }
2070        else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
2071            for(i=0;i<ProjectInfo.res.NumberOfIconRes;i++){
2072                lstrcpy(temporary,ProjectInfo.res.pIconResInfo[i].path);
2073                GetFullPath(temporary,ProjectInfo.dir);
2074                if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
2075                    sprintf(buffer+i2,"icon,%s\r\n",ProjectInfo.res.pIconResInfo[i].path);
2076                    i2+=lstrlen(buffer+i2);
2077                    break;
2078                }
2079            }
2080        }
2081        hChild=GetNextWindow(hChild,GW_HWNDPREV);
2082    }
2083    lstrcpy(buffer+i2,"\r\n");
2084    i2+=2;
2085
2086
2087    //////////////////////////
2088    //ツリービューの展開状況
2089    sprintf(buffer+i2,"%d\r\n",TabCtrl_GetCurSel(hProjectViewTab));
2090    i2+=lstrlen(buffer+i2);
2091    TVITEM tvItem;
2092    memset(&tvItem,0,sizeof(TVITEM));
2093    tvItem.mask=TVIF_HANDLE|TVIF_STATE;
2094    tvItem.hItem=TreeView_GetRoot(pobj_FileTree->hTree);
2095    TreeView_GetItem(pobj_FileTree->hTree,&tvItem);
2096    if(tvItem.state&TVIS_EXPANDED) i=1;
2097    else i=0;
2098    sprintf(buffer+i2,"%d\r\n",i);
2099    i2+=lstrlen(buffer+i2);
2100
2101    tvItem.hItem=TreeView_GetRoot(hProcedureTreeView);
2102    TreeView_GetItem(hProcedureTreeView,&tvItem);
2103    if(tvItem.state&TVIS_EXPANDED) i=1;
2104    else i=0;
2105    sprintf(buffer+i2,"%d\r\n",i);
2106    i2+=lstrlen(buffer+i2);
2107
2108    tvItem.hItem=TreeView_GetRoot(hMaterialTreeView);
2109    while(tvItem.hItem){
2110        TreeView_GetItem(hMaterialTreeView,&tvItem);
2111        if(tvItem.state&TVIS_EXPANDED) i=1;
2112        else i=0;
2113        sprintf(buffer+i2,"%d",i);
2114        i2+=lstrlen(buffer+i2);
2115
2116        tvItem.hItem=TreeView_GetNextSibling(hMaterialTreeView,tvItem.hItem);
2117        if(tvItem.hItem){
2118            lstrcpy(buffer+i2,",");
2119            i2+=lstrlen(buffer+i2);
2120        }
2121    }
2122
2123
2124    //保存
2125    sprintf(temporary,"%s%s.wrk",ProjectInfo.dir,ProjectInfo.name);
2126    WriteBuffer(temporary,buffer,i2);
2127}
2128void SaveProject(void){
2129    extern MDIINFO MdiInfo[MAX_WNDNUM];
2130    extern PROJECTINFO ProjectInfo;
2131    int i,i2,i3,WndNum;
2132    char temporary[MAX_PATH],buffer[32767];
2133    HWND hChild;
2134
2135    //"プロジェクトを保存中..."
2136    SetStatusText(STRING_PROJECT_SAVING);
2137
2138    //プロジェクトファイルのバージョンを設定
2139    ProjectInfo.dwVersion=PROJECT_VERSION;
2140
2141    hChild=GetWindow(hClient,GW_CHILD);
2142    while(hChild){
2143        WndNum=GetWndNum(hChild);
2144        if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
2145            if( MdiInfo[WndNum].pMdiTextEdit->IsModified() ){
2146                for(i=0;i<ProjectInfo.pobj_DBFileInfo->iNum;i++){
2147                    ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->GetFullPath(temporary);
2148                    if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
2149                        SaveDocument(hChild,NULL);
2150                        break;
2151                    }
2152                }
2153            }
2154        }
2155        if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
2156            if(MdiInfo[WndNum].MdiIconEditInfo->bModify){
2157                for(i=0;i<ProjectInfo.res.NumberOfIconRes;i++){
2158                    lstrcpy(temporary,ProjectInfo.res.pIconResInfo[i].path);
2159                    GetFullPath(temporary,ProjectInfo.dir);
2160                    if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
2161                        SaveDocument(hChild,NULL);
2162                        break;
2163                    }
2164                }
2165            }
2166        }
2167        hChild=GetNextWindow(hChild,GW_HWNDNEXT);
2168    }
2169
2170
2171    //////////////////////////////////////
2172    //プロジェクトファイル(*.pj)を作成
2173    lstrcpy(buffer,"\' ActiveBasic Project file.\r\n\r\n");
2174    i2=lstrlen(buffer);
2175    sprintf(buffer+i2,"#VERSION=%d\r\n\r\n",ProjectInfo.dwVersion);
2176    i2+=lstrlen(buffer+i2);
2177    sprintf(buffer+i2,"#MODULETYPE=%d\r\n\r\n",ProjectInfo.dwModuleType);
2178    i2+=lstrlen(buffer+i2);
2179    sprintf(buffer+i2,"#NAME=%s\r\n\r\n",ProjectInfo.name);
2180    i2+=lstrlen(buffer+i2);
2181    extern HWND hSelectCompilerCombo;
2182    if(SendMessage(hSelectCompilerCombo,CB_GETCURSEL,0,0)==0){
2183        sprintf(buffer+i2,"#PLATFORM=32\r\n\r\n",ProjectInfo.name);
2184        i2+=lstrlen(buffer+i2);
2185    }
2186    else{
2187        sprintf(buffer+i2,"#PLATFORM=64\r\n\r\n",ProjectInfo.name);
2188        i2+=lstrlen(buffer+i2);
2189    }
2190    sprintf(buffer+i2,"#USEWINDOW=%d\r\n\r\n",ProjectInfo.windowInfos.size());
2191    i2+=lstrlen(buffer+i2);
2192    sprintf(buffer+i2,"#OPTION=&H%08x\r\n\r\n",ProjectInfo.dwOption);
2193    i2+=lstrlen(buffer+i2);
2194    sprintf(buffer+i2,"#OUTPUT_RELEASE=%s\r\n\r\n",ProjectInfo.lpszOutput_Release);
2195    i2+=lstrlen(buffer+i2);
2196    sprintf(buffer+i2,"#OUTPUT_DEBUG=%s\r\n\r\n",ProjectInfo.lpszOutput_Debug);
2197    i2+=lstrlen(buffer+i2);
2198    sprintf(buffer+i2,"#MANIFEST=%s\r\n\r\n",ProjectInfo.szManifestPath);
2199    i2+=lstrlen(buffer+i2);
2200    sprintf(buffer+i2,"#DEBUG_CMD_LINE=%s\r\n\r\n",ProjectInfo.szCmdLine);
2201    i2+=lstrlen(buffer+i2);
2202    sprintf(buffer+i2,"#DEBUG_EXE_PATH=%s\r\n\r\n",ProjectInfo.szExePath);
2203    i2+=lstrlen(buffer+i2);
2204    if(ProjectInfo.ResourceFileName[0]){
2205        sprintf(buffer+i2,"#RESOURCE=%s\r\n\r\n",ProjectInfo.ResourceFileName);
2206        i2+=lstrlen(buffer+i2);
2207    }
2208    else{
2209        lstrcpy(buffer+i2,"#RESOURCE=0\r\n\r\n");
2210        i2+=lstrlen(buffer+i2);
2211    }
2212    sprintf(buffer+i2,"#SOURCE\r\n");
2213    i2+=lstrlen(buffer+i2);
2214    for(i=0;i<ProjectInfo.pobj_DBFileInfo->iNum;i++){
2215        sprintf(buffer+i2,"%s\r\n",ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->m_path);
2216        i2+=lstrlen(buffer+i2);
2217    }
2218
2219    //保存
2220    sprintf(temporary,"%s%s.pj",ProjectInfo.dir,ProjectInfo.name);
2221    WriteBuffer(temporary,buffer,i2);
2222
2223
2224    //////////////////////////////////
2225    // リソースファイル(*.rc、resource.ab)を作成
2226    if(ProjectInfo.ResourceFileName[0]){
2227        i2=0;
2228        i3=101;
2229        for(i=0;i<ProjectInfo.res.NumberOfCursorRes;i++,i3++){
2230            sprintf(buffer+i2,"Const %s=%d\r\n",
2231                ProjectInfo.res.pCursorResInfo[i].IdName,
2232                i3);
2233            i2+=lstrlen(buffer+i2);
2234        }
2235        for(i=0;i<ProjectInfo.res.NumberOfBitmapRes;i++,i3++){
2236            sprintf(buffer+i2,"Const %s=%d\r\n",
2237                ProjectInfo.res.pBitmapResInfo[i].IdName,
2238                i3);
2239            i2+=lstrlen(buffer+i2);
2240        }
2241        for(i=0;i<ProjectInfo.res.NumberOfIconRes;i++,i3++){
2242            sprintf(buffer+i2,"Const %s=%d\r\n",
2243                ProjectInfo.res.pIconResInfo[i].IdName,
2244                i3);
2245            i2+=lstrlen(buffer+i2);
2246        }
2247
2248        //保存(resource.ab)
2249        lstrcpy(temporary,"resource.ab");
2250        GetFullPath(temporary,ProjectInfo.dir);
2251        WriteBuffer(temporary,buffer,i2);
2252
2253        i2=0;
2254        for(i=0;i<ProjectInfo.res.NumberOfCursorRes;i++){
2255            sprintf(buffer+i2,"%s CURSOR \"%s\"\r\n",
2256                ProjectInfo.res.pCursorResInfo[i].IdName,
2257                ProjectInfo.res.pCursorResInfo[i].path);
2258            i2+=lstrlen(buffer+i2);
2259        }
2260        for(i=0;i<ProjectInfo.res.NumberOfBitmapRes;i++){
2261            sprintf(buffer+i2,"%s BITMAP \"%s\"\r\n",
2262                ProjectInfo.res.pBitmapResInfo[i].IdName,
2263                ProjectInfo.res.pBitmapResInfo[i].path);
2264            i2+=lstrlen(buffer+i2);
2265        }
2266        for(i=0;i<ProjectInfo.res.NumberOfIconRes;i++){
2267            sprintf(buffer+i2,"%s ICON \"%s\"\r\n",
2268                ProjectInfo.res.pIconResInfo[i].IdName,
2269                ProjectInfo.res.pIconResInfo[i].path);
2270            i2+=lstrlen(buffer+i2);
2271        }
2272
2273        //マニフェスト
2274        if(ProjectInfo.dwOption&PJ_OP_RC_MANIFEST){
2275            sprintf(buffer+i2,"CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST \"%s\"\r\n",
2276                ProjectInfo.szManifestPath);
2277            i2+=lstrlen(buffer+i2);
2278        }
2279
2280        //保存
2281        lstrcpy(temporary,ProjectInfo.ResourceFileName);
2282        GetFullPath(temporary,ProjectInfo.dir);
2283        WriteBuffer(temporary,buffer,i2);
2284    }
2285
2286
2287    ///////////////////////////////////////
2288    //インデックスファイル(*.idx)を作成
2289    buffer[0]=0;
2290    lstrcpy(buffer,"' インデックス プログラム\r\n");
2291    i2=lstrlen(buffer);
2292    if(ProjectInfo.dwOption&PJ_OP_SOURCE_MASK){
2293        if(ProjectInfo.dwOption&PJ_OP_STRICT){
2294            /* #strictディレクティブは今は使われていない
2295            lstrcpy(buffer+i2,"\r\n");
2296            i2+=lstrlen(buffer+i2);
2297            lstrcpy(buffer+i2,"#strict");
2298            i2+=lstrlen(buffer+i2);
2299            lstrcpy(buffer+i2,"\r\n");
2300            i2+=lstrlen(buffer+i2);
2301            */
2302        }
2303        lstrcpy(buffer+i2,"\r\n");
2304        i2+=lstrlen(buffer+i2);
2305        lstrcpy(buffer+i2,"'Win32APIの定義ファイル\r\n");
2306        i2+=lstrlen(buffer+i2);
2307        if(ProjectInfo.dwOption&PJ_OP_MMSYSTEM){
2308            lstrcpy(buffer+i2,"#include <api_mmsys.sbp>\r\n");
2309            i2+=lstrlen(buffer+i2);
2310        }
2311        if(ProjectInfo.dwOption&PJ_OP_COMMCTRL){
2312            lstrcpy(buffer+i2,"#include <api_commctrl.sbp>\r\n");
2313            i2+=lstrlen(buffer+i2);
2314        }
2315        if(ProjectInfo.dwOption&PJ_OP_RICHEDIT){
2316            lstrcpy(buffer+i2,"#include <api_richedit.sbp>\r\n");
2317            i2+=lstrlen(buffer+i2);
2318        }
2319        if(ProjectInfo.dwOption&PJ_OP_WINSOCK){
2320            lstrcpy(buffer+i2,"#include <api_winsock2.sbp>\r\n");
2321            i2+=lstrlen(buffer+i2);
2322        }
2323    }
2324    if( !ProjectInfo.windowInfos.empty() )
2325    {
2326        lstrcpy(buffer+i2,"\r\n");
2327        i2+=lstrlen(buffer+i2);
2328        lstrcpy(buffer+i2,"'RADツールが生成するウィンドウ制御プログラム\r\n");
2329        i2+=lstrlen(buffer+i2);
2330        sprintf(buffer+i2,"#include \"Callback.wbp\"\r\n");
2331        i2+=lstrlen(buffer+i2);
2332    }
2333    if(ProjectInfo.pobj_DBFileInfo->iNum>1){
2334        lstrcpy(buffer+i2,"\r\n");
2335        i2+=lstrlen(buffer+i2);
2336        lstrcpy(buffer+i2,"'プロジェクト内のプログラム ファイル\r\n");
2337        i2+=lstrlen(buffer+i2);
2338        for(i=1;i<ProjectInfo.pobj_DBFileInfo->iNum;i++){
2339            //メインファイルは含まない
2340            sprintf(buffer+i2,"#include \"%s\"\r\n",ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->m_path);
2341            i2+=lstrlen(buffer+i2);
2342            lstrcpy(buffer+i2,"_ClearNamespaceImported\r\n");
2343            i2+=lstrlen(buffer+i2);
2344        }
2345    }
2346    if( !ProjectInfo.windowInfos.empty() )
2347    {
2348        lstrcpy(buffer+i2,"\r\n");
2349        i2+=lstrlen(buffer+i2);
2350        lstrcpy(buffer+i2,"'RADツールが生成するウィンドウ生成プログラム\r\n");
2351        i2+=lstrlen(buffer+i2);
2352        sprintf(buffer+i2,"#include \"MakeWindow.wbp\"\r\n");
2353        i2+=lstrlen(buffer+i2);
2354    }
2355    if(ProjectInfo.ResourceFileName[0]){
2356        //リソースファイルが含まれる場合
2357        lstrcpy(buffer+i2,"\r\n");
2358        i2+=lstrlen(buffer+i2);
2359        lstrcpy(buffer+i2,"'リソースファイル\r\n");
2360        i2+=lstrlen(buffer+i2);
2361        lstrcpy(buffer+i2,"#include \"resource.ab\"\r\n");
2362        i2+=lstrlen(buffer+i2);
2363        sprintf(buffer+i2,"#resource \"%s.rc\"\r\n",ProjectInfo.name);
2364        i2+=lstrlen(buffer+i2);
2365    }
2366
2367    //保存
2368    sprintf(temporary,"%s%s.idx",ProjectInfo.dir,ProjectInfo.name);
2369    WriteBuffer(temporary,buffer,i2);
2370
2371
2372    if( !ProjectInfo.windowInfos.empty() )
2373    {
2374        /////////////////////////////////////////////////////
2375        //ウィンドウ関連ファイル(*.wnd)を作成、保存
2376        if(ProjectInfo.ModifyOfMaterial){
2377            sprintf(temporary,"%s%s.wnd",ProjectInfo.dir,ProjectInfo.name);
2378            SaveWindowFile( temporary, ProjectInfo.windowInfos );
2379        }
2380
2381        //.wbpファイルを生成
2382        SaveWindowProgram();
2383    }
2384
2385
2386    MakeWorkFile();
2387
2388    SetStatusText("");
2389
2390    ProjectInfo.modify=0;
2391    ProjectInfo.ModifuOfResource=0;
2392}
2393
2394BOOL SetProjectToRun(void){
2395    extern PROJECTINFO ProjectInfo;
2396    HANDLE hFind;
2397    WIN32_FIND_DATA wfd;
2398
2399    if(ProjectInfo.pobj_DBFileInfo->iNum==0){
2400        //"プログラム ファイルがプロジェクトに存在しません。"
2401        MessageBox(hOwner,STRING_ERROR_NOFILE,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
2402        return 0;
2403    }
2404
2405    extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
2406    hFind=FindFirstFile( ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ).c_str(), &wfd );
2407    if(hFind==INVALID_HANDLE_VALUE){
2408        //"BasicCompiler.exe が見つかりません"
2409        MessageBox(hOwner,STRING_ERROR_NOBASICCOMPILER,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
2410        return 0;
2411    }
2412    FindClose(hFind);
2413
2414    //プロジェクト構造のバージョンが違う時は、再保存する
2415    if(ProjectInfo.dwVersion<PROJECT_VERSION)
2416        ProjectInfo.ModifyOfMaterial=1;
2417
2418    //保存確認
2419    if(!ProjectModifyCheck(1)) return 0;
2420
2421    return 1;
2422}
2423BOOL IsNeedCompileForProject(BOOL bDebug){
2424    extern PROJECTINFO ProjectInfo;
2425    int i2;
2426    char temporary[MAX_PATH];
2427    HANDLE hFind,hFile;
2428    WIN32_FIND_DATA wfd;
2429    FILETIME SourceTime,ExeTime;
2430
2431    if(bDebug) lstrcpy(temporary,ProjectInfo.lpszOutput_Debug);
2432    else lstrcpy(temporary,ProjectInfo.lpszOutput_Release);
2433    GetFullPath(temporary,ProjectInfo.dir);
2434
2435    hFind=FindFirstFile(temporary,&wfd);
2436    if(hFind==INVALID_HANDLE_VALUE) return 1;
2437    FindClose(hFind);
2438
2439    hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
2440    GetFileTime(hFile,NULL,NULL,&ExeTime);
2441    CloseHandle(hFile);
2442
2443    for(i2=0;i2<ProjectInfo.pobj_DBFileInfo->iNum;i2++){
2444        ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i2]->GetFullPath(temporary);
2445        hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
2446        GetFileTime(hFile,NULL,NULL,&SourceTime);
2447        CloseHandle(hFile);
2448
2449        if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
2450            SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
2451            SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
2452    }
2453    if( !ProjectInfo.windowInfos.empty() )
2454    {
2455        //CallBack.wbp
2456        lstrcpy(temporary,"CallBack.wbp");
2457        GetFullPath(temporary,ProjectInfo.dir);
2458        hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
2459        GetFileTime(hFile,NULL,NULL,&SourceTime);
2460        CloseHandle(hFile);
2461        if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
2462            SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
2463            SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
2464
2465        //MakeWindow.wbp
2466        lstrcpy(temporary,"MakeWindow.wbp");
2467        GetFullPath(temporary,ProjectInfo.dir);
2468        hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
2469        GetFileTime(hFile,NULL,NULL,&SourceTime);
2470        CloseHandle(hFile);
2471        if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
2472            SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
2473            SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
2474    }
2475    return 0;
2476}
Note: See TracBrowser for help on using the repository browser.