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

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

静的リンクライブラリプロジェクトの作成(IDE側)に対応。

File size: 79.1 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<ProjectInfo.NumberOfWindows;i++){
183                        if(ProjectInfo.pWindowInfo[i].hTreeItem==hTreeItem){
184                            NewRadWindow(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<ProjectInfo.NumberOfWindows;i++){
250                        if(ProjectInfo.pWindowInfo[i].hTreeItem==hTreeItem){
251
252                            //"%s ウィンドウをプロジェクトから削除します。よろしいですか?"
253                            sprintf(str,STRING_PJ_CHECK_DELETEWINDOW,ProjectInfo.pWindowInfo[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        WINDOW_INFO WindowInfo[1];
1061        WindowInfo[0].name="MainWnd";
1062        WindowInfo[0].HandleName="hMainWnd";
1063        WindowInfo[0].pos.x=CW_USEDEFAULT;
1064        WindowInfo[0].pos.y=CW_USEDEFAULT;
1065        WindowInfo[0].size.cx=480;
1066        WindowInfo[0].size.cy=360;
1067        WindowInfo[0].caption=NewProjectInfo.name;
1068        if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE)
1069            WindowInfo[0].style=WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_VISIBLE;
1070        else if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX)
1071            WindowInfo[0].style=WS_OVERLAPPED|WS_THICKFRAME|WS_SYSMENU;
1072        WindowInfo[0].ExStyle=0;
1073        WindowInfo[0].MenuID=0;
1074        WindowInfo[0].id=0;
1075        WindowInfo[0].bgColor=COLOR_3DFACE;
1076        GetDefaultWindowFont(&WindowInfo[0].LogFont);
1077        WindowInfo[0].IconResName=0;
1078        WindowInfo[0].ClassName="NORMAL";
1079        WindowInfo[0].CallBackName="MainWndProc";
1080        WindowInfo[0].type=WNDTYPE_DEFAULT;
1081        WindowInfo[0].filepath="MainWnd.ab";
1082        WindowInfo[0].NumberOfChildWindows=0;
1083        sprintf(temporary,"%s%s.wnd",dir,NewProjectInfo.name);
1084
1085        ProjectInfo.NumberOfMenu=0;
1086        SaveWindowFile(temporary,WindowInfo,1);
1087    }
1088
1089
1090    ////////////////////////
1091    // ワークファイルを作成
1092    ////////////////////////
1093    lstrcpy(buffer,"case4\r\n\r\n");
1094    if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE){
1095        lstrcat(buffer,"rad,MainWnd\r\n\r\n");
1096    }
1097    else{
1098        sprintf(buffer+lstrlen(buffer),"text,\"%s.ab\",0,0,0,0\r\n\r\n",NewProjectInfo.name);
1099    }
1100    lstrcat(buffer,"0\r\n0\r\n0\r\n0,0");
1101    //保存
1102    sprintf(temporary,"%s%s.wrk",dir,NewProjectInfo.name);
1103    if(!WriteBuffer(temporary,buffer,lstrlen(buffer))) return;
1104
1105
1106    //マニフェストを作成
1107    char temp2[MAX_PATH];
1108    const std::string manifestTempXmlPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\manifest_temp.xml";
1109    sprintf(temp2,"%s%s.manifest.xml",dir,NewProjectInfo.name);
1110    CopyFile( manifestTempXmlPath.c_str(), temp2, 0 );
1111
1112
1113    sprintf(temporary,"%s%s.pj",dir,NewProjectInfo.name);
1114    OpenProject(temporary);
1115    SaveProject();
1116}
1117void SetTreeViewForProjectInfo(){
1118    extern HANDLE hHeap;
1119    extern HWND hProjectView;
1120    extern PROJECTINFO ProjectInfo;
1121    int i;
1122    char temporary[MAX_PATH];
1123    TV_INSERTSTRUCT tv;
1124
1125    sprintf(temporary,"%s ",ProjectInfo.name);
1126    lstrcat(temporary,STRING_PROJECT);
1127    SetWindowText(hProjectView,temporary);
1128
1129    tv.hInsertAfter=TVI_SORT;
1130    tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
1131
1132    //ファイル ツリー
1133    ProjectInfo.pobj_DBFileInfo->ResetTree();
1134
1135    //関数ツリー
1136    ResetClassTree(-1);
1137
1138    /////////////////////
1139    // マテリアル ツリー
1140
1141    //Cursorリソース フォルダ
1142    sprintf(temporary,"Cursor %s",STRING_RESOURCE);
1143    tv.hParent=TVI_ROOT;
1144    tv.item.iImage=0;
1145    tv.item.iSelectedImage=0;
1146    tv.item.pszText=temporary;
1147    tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1148    ProjectInfo.res.hCursorTreeItem=tv.hParent;
1149    for(i=0;i<ProjectInfo.res.NumberOfCursorRes;i++){
1150        tv.item.iImage=6;
1151        tv.item.iSelectedImage=6;
1152        tv.item.pszText=ProjectInfo.res.pCursorResInfo[i].IdName;
1153        ProjectInfo.res.pCursorResInfo[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1154    }
1155
1156    //Bitmapリソース フォルダ
1157    sprintf(temporary,"Bitmap %s",STRING_RESOURCE);
1158    tv.hParent=TVI_ROOT;
1159    tv.item.iImage=0;
1160    tv.item.iSelectedImage=0;
1161    tv.item.pszText=temporary;
1162    tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1163    ProjectInfo.res.hBitmapTreeItem=tv.hParent;
1164    for(i=0;i<ProjectInfo.res.NumberOfBitmapRes;i++){
1165        tv.item.iImage=5;
1166        tv.item.iSelectedImage=5;
1167        tv.item.pszText=ProjectInfo.res.pBitmapResInfo[i].IdName;
1168        ProjectInfo.res.pBitmapResInfo[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1169    }
1170
1171    //Iconリソース フォルダ
1172    sprintf(temporary,"Icon %s",STRING_RESOURCE);
1173    tv.hParent=TVI_ROOT;
1174    tv.item.iImage=0;
1175    tv.item.iSelectedImage=0;
1176    tv.item.pszText=temporary;
1177    tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1178    ProjectInfo.res.hIconTreeItem=tv.hParent;
1179    for(i=0;i<ProjectInfo.res.NumberOfIconRes;i++){
1180        tv.item.iImage=4;
1181        tv.item.iSelectedImage=4;
1182        if(i==0){
1183            sprintf(temporary,"%s (Main)",ProjectInfo.res.pIconResInfo[i].IdName);
1184            tv.item.pszText=temporary;
1185        }
1186        else tv.item.pszText=ProjectInfo.res.pIconResInfo[i].IdName;
1187        ProjectInfo.res.pIconResInfo[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1188    }
1189
1190    //Menuフォルダ
1191    tv.hParent=TVI_ROOT;
1192    tv.item.iImage=0;
1193    tv.item.iSelectedImage=0;
1194    tv.item.pszText="Menu";
1195    tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1196    ProjectInfo.hMenuTreeItem=tv.hParent;
1197    for(i=0;i<ProjectInfo.NumberOfMenu;i++){
1198        tv.item.iImage=3;
1199        tv.item.iSelectedImage=3;
1200        tv.item.pszText=ProjectInfo.pMenuInfo[i].IdName;
1201        ProjectInfo.pMenuInfo[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1202    }
1203
1204    //Windowフォルダ
1205    tv.hParent=TVI_ROOT;
1206    tv.item.iImage=0;
1207    tv.item.iSelectedImage=0;
1208    tv.item.pszText="Window";
1209    tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1210    ProjectInfo.hWindowTreeItem=tv.hParent;
1211    for(i=0;i<ProjectInfo.NumberOfWindows;i++){
1212        tv.item.iImage=2;
1213        tv.item.iSelectedImage=2;
1214        tv.item.pszText=ProjectInfo.pWindowInfo[i].name;
1215        ProjectInfo.pWindowInfo[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1216    }
1217}
1218void OpenProject(char *path){
1219    extern HANDLE hHeap;
1220    extern PROJECTINFO ProjectInfo;
1221    int i,i2,i3;
1222    char *buffer,temporary[MAX_PATH],temp2[MAX_PATH];
1223
1224    //既にプロジェクトが開かれている場合は閉じる
1225    if(ProjectInfo.name[0]){
1226        if(!CloseProject()) return;
1227    }
1228    memset(&ProjectInfo,0,sizeof(PROJECTINFO));
1229
1230    //プロジェクトの作業ディレクトリを取得
1231    _splitpath(path,ProjectInfo.dir,temporary,0,0);
1232    lstrcat(ProjectInfo.dir,temporary);
1233
1234    //ファイルを開く、保存の初期ディレクトリをセット
1235    lstrcpy(pobj_nv->DefSaveDir,ProjectInfo.dir);
1236
1237
1238    //////////////////////////////////////////
1239    // リソースデータ用領域を確保
1240    ProjectInfo.res.pCursorResInfo=(RESITEMINFO *)HeapAlloc(hHeap,0,1);
1241    ProjectInfo.res.NumberOfCursorRes=0;
1242    ProjectInfo.res.pBitmapResInfo=(RESITEMINFO *)HeapAlloc(hHeap,0,1);
1243    ProjectInfo.res.NumberOfBitmapRes=0;
1244    ProjectInfo.res.pIconResInfo=(RESITEMINFO *)HeapAlloc(hHeap,0,1);
1245    ProjectInfo.res.NumberOfIconRes=0;
1246
1247
1248    //////////////////////////////////////////
1249    //プロジェクトファイル(*.pj)をオープン
1250    buffer=ReadBuffer(path);
1251    if(!buffer) return;
1252
1253    //解析
1254    ProjectInfo.pobj_DBFileInfo=new CDBFileInfo();
1255    for(i=0;;i++){
1256        if(buffer[i]=='\0') break;
1257        if(buffer[i]=='\r'&&buffer[i+1]=='\n'&&buffer[i+2]=='#'){
1258            for(i+=3,i2=0;;i++,i2++){
1259                if(!IsVariableChar(buffer[i])){
1260                    temporary[i2]=0;
1261                    break;
1262                }
1263                temporary[i2]=buffer[i];
1264            }
1265            if(lstrcmpi(temporary,"VERSION")==0&&buffer[i]=='='){
1266                for(i++,i2=0;;i++,i2++){
1267                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1268                        temporary[i2]=0;
1269                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1270                        break;
1271                    }
1272                    temporary[i2]=buffer[i];
1273                }
1274                ProjectInfo.dwVersion=GetValue(temporary);
1275            }
1276            else if(lstrcmpi(temporary,"MODULETYPE")==0&&buffer[i]=='='){
1277                for(i++,i2=0;;i++,i2++){
1278                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1279                        temporary[i2]=0;
1280                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1281                        break;
1282                    }
1283                    temporary[i2]=buffer[i];
1284                }
1285                ProjectInfo.dwModuleType=atoi(temporary);
1286            }
1287            else if(lstrcmpi(temporary,"NAME")==0&&buffer[i]=='='){
1288                for(i++,i2=0;;i++,i2++){
1289                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1290                        ProjectInfo.name[i2]=0;
1291                        break;
1292                    }
1293                    ProjectInfo.name[i2]=buffer[i];
1294                }
1295            }
1296            else if(lstrcmpi(temporary,"PLATFORM")==0&&buffer[i]=='='){
1297                for(i++,i2=0;;i++,i2++){
1298                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1299                        temporary[i2]=0;
1300                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1301                        break;
1302                    }
1303                    temporary[i2]=buffer[i];
1304                }
1305                i2=atoi(temporary);
1306                extern HWND hSelectCompilerCombo;
1307                if(i2==32){
1308                    //プラットフォームにWin32を選択
1309                    SendMessage(hSelectCompilerCombo,CB_SETCURSEL,0,0);
1310                }
1311                else if(i2==64){
1312                    //プラットフォームにWin64を選択
1313                    SendMessage(hSelectCompilerCombo,CB_SETCURSEL,1,0);
1314                }
1315                SendMessage(hSelectCompilerCombo,WM_COMMAND,MAKELONG(0,CBN_SELCHANGE),0);
1316            }
1317            else if(lstrcmpi(temporary,"USEWINDOW")==0&&buffer[i]=='='){
1318                for(i++,i2=0;;i++,i2++){
1319                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1320                        temporary[i2]=0;
1321                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1322                        break;
1323                    }
1324                    temporary[i2]=buffer[i];
1325                }
1326                ProjectInfo.NumberOfWindows=atoi(temporary);
1327            }
1328            else if(lstrcmpi(temporary,"OPTION")==0&&buffer[i]=='='){
1329                for(i++,i2=0;;i++,i2++){
1330                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1331                        temporary[i2]=0;
1332                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1333                        break;
1334                    }
1335                    temporary[i2]=buffer[i];
1336                }
1337                ProjectInfo.dwOption=GetValue(temporary);
1338            }
1339            else if(lstrcmpi(temporary,"OUTPUT_RELEASE")==0&&buffer[i]=='='){
1340                for(i++,i2=0;;i++,i2++){
1341                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1342                        temporary[i2]=0;
1343                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1344                        break;
1345                    }
1346                    temporary[i2]=buffer[i];
1347                }
1348                lstrcpy(ProjectInfo.lpszOutput_Release,temporary);
1349            }
1350            else if(lstrcmpi(temporary,"OUTPUT_DEBUG")==0&&buffer[i]=='='){
1351                for(i++,i2=0;;i++,i2++){
1352                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1353                        temporary[i2]=0;
1354                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1355                        break;
1356                    }
1357                    temporary[i2]=buffer[i];
1358                }
1359                lstrcpy(ProjectInfo.lpszOutput_Debug,temporary);
1360            }
1361            else if(lstrcmpi(temporary,"MANIFEST")==0&&buffer[i]=='='){
1362                for(i++,i2=0;;i++,i2++){
1363                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1364                        temporary[i2]=0;
1365                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1366                        break;
1367                    }
1368                    temporary[i2]=buffer[i];
1369                }
1370                lstrcpy(ProjectInfo.szManifestPath,temporary);
1371            }
1372            else if(lstrcmpi(temporary,"DEBUG_CMD_LINE")==0&&buffer[i]=='='){
1373                for(i++,i2=0;;i++,i2++){
1374                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1375                        temporary[i2]=0;
1376                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1377                        break;
1378                    }
1379                    temporary[i2]=buffer[i];
1380                }
1381                lstrcpy(ProjectInfo.szCmdLine,temporary);
1382            }
1383            else if(lstrcmpi(temporary,"DEBUG_EXE_PATH")==0&&buffer[i]=='='){
1384                for(i++,i2=0;;i++,i2++){
1385                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1386                        temporary[i2]=0;
1387                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1388                        break;
1389                    }
1390                    temporary[i2]=buffer[i];
1391                }
1392                lstrcpy(ProjectInfo.szExePath,temporary);
1393            }
1394            else if(lstrcmpi(temporary,"RESOURCE")==0&&buffer[i]=='='){
1395                for(i++,i2=0;;i++,i2++){
1396                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1397                        temporary[i2]=0;
1398                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1399                        break;
1400                    }
1401                    temporary[i2]=buffer[i];
1402                }
1403                if(temporary[0]!='\0'&&(!(temporary[0]=='0'&&temporary[1]=='\0'))){
1404                    lstrcpy(ProjectInfo.ResourceFileName,temporary);
1405                    GetResourceData();
1406                }
1407                else{
1408                    sprintf(ProjectInfo.ResourceFileName,"%s.rc",ProjectInfo.name);
1409                }
1410            }
1411            else if(lstrcmpi(temporary,"SOURCE")==0&&buffer[i]=='\r'&&buffer[i+1]=='\n'){
1412                while(1){
1413                    for(i+=2,i2=0;;i++,i2++){
1414                        if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1415                            temporary[i2]=0;
1416                            break;
1417                        }
1418                        temporary[i2]=buffer[i];
1419                    }
1420                    if(temporary[0]=='\0') break;
1421                    ProjectInfo.pobj_DBFileInfo->add(temporary,0);
1422
1423                    if(buffer[i]=='\0') break;
1424                }
1425            }
1426            else{
1427                //不明なパラメータは無視
1428                for(i++;;i++){
1429                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1430                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1431                        break;
1432                    }
1433                }
1434            }
1435            if(buffer[i]=='\0') break;
1436        }
1437    }
1438    HeapDefaultFree(buffer);
1439
1440    //古いバージョンファイルを考慮
1441    if(ProjectInfo.dwVersion<=4){
1442        if(ProjectInfo.dwModuleType==MT_DLL)
1443            sprintf(ProjectInfo.lpszOutput_Release,".\\%s.dll",ProjectInfo.name);
1444        else sprintf(ProjectInfo.lpszOutput_Release,".\\%s.exe",ProjectInfo.name);
1445        sprintf(ProjectInfo.lpszOutput_Debug,".\\%s_debug.exe",ProjectInfo.name);
1446    }
1447
1448    //ブレークポイントを初期化
1449    ProjectInfo.pobj_DBBreakPoint=new CDBBreakPoint();
1450
1451
1452    if(ProjectInfo.NumberOfWindows){
1453        /////////////////////////////////////////////
1454        //ウィンドウ定義ファイル(*.wnd)をオープン
1455        sprintf(temp2,"%s%s.wnd",ProjectInfo.dir,ProjectInfo.name);
1456        if(!OpenWindowFile(temp2)) return;
1457    }
1458    else{
1459        ProjectInfo.pWindowInfo=(WINDOW_INFO *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1);
1460
1461        ProjectInfo.NumberOfMenu=0;
1462        ProjectInfo.pMenuInfo=(MENU_INFO *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1);
1463    }
1464
1465
1466    //プロジェクト ビューを設定、表示
1467    extern HWND hProjectView;
1468    SetTreeViewForProjectInfo();
1469    if(!IsWindowVisible(hProjectView)) SendMessage(hOwner,WM_COMMAND,IDM_PROJECTVIEW,0);
1470
1471
1472    //メニュー状態を設定
1473    ResetState_DocMenu();
1474
1475
1476    //////////////////////////////////////////
1477    //ワークファイル(*.wrk)をオープン
1478    extern MDIINFO MdiInfo[MAX_WNDNUM];
1479    HTREEITEM hTreeItem;
1480    HANDLE hFind;
1481    WIN32_FIND_DATA wfd;
1482    HWND hChild;
1483    int WndNum;
1484    sprintf(temp2,"%s%s.wrk",ProjectInfo.dir,ProjectInfo.name);
1485    hFind=FindFirstFile(temp2,&wfd);
1486    if(hFind!=INVALID_HANDLE_VALUE){
1487        FindClose(hFind);
1488        buffer=ReadBuffer(temp2);
1489        if(!buffer) return;
1490
1491        //解析、反映
1492        memcpy(temporary,buffer,5);
1493        temporary[5]=0;
1494        if(lstrcmp(temporary,"case4")==0){
1495
1496            LockWindowUpdate(hOwner);
1497            for(i=9,i2=0;;i++,i2++){
1498                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1499                    if(i2!=0){
1500                        temporary[i2]=0;
1501                        for(i3=0;;i3++){
1502                            if(temporary[i3]==','||temporary[i3]=='\0') break;
1503                        }
1504                        if(temporary[i3]=='\0') goto EndToSetWorkFile;
1505                        lstrcpy(temp2,temporary+i3+1);
1506                        temporary[i3]=0;
1507                        if(lstrcmpi(temporary,"text")==0){
1508                            if(temp2[0]!='\"') goto EndToSetWorkFile;
1509
1510                            //ファイルを開く
1511                            i2=1;
1512                            for(i3=0;;i2++,i3++){
1513                                if(temp2[i2]=='\"'||temp2[i2]=='\0'){
1514                                    temporary[i3]=0;
1515                                    break;
1516                                }
1517                                temporary[i3]=temp2[i2];
1518                            }
1519                            GetFullPath(temporary,ProjectInfo.dir);
1520                            hChild=OpenFileWithExtension(temporary);
1521                            WndNum=GetWndNum(hChild);
1522                            if(WndNum==-1){
1523                                goto EndToSetWorkFile;
1524                            }
1525
1526                            //ResetScrollbarが再描画時に呼び出されるので、再描画する
1527                            InvalidateRect(MdiInfo[WndNum].pMdiTextEdit->hEdit,NULL,0);
1528                            UpdateWindow(MdiInfo[WndNum].pMdiTextEdit->hEdit);
1529
1530                            if(temp2[i2]=='\0') goto EndToSetWorkFile;
1531                            if(temp2[i2+1]!=',') goto EndToSetWorkFile;
1532
1533                            //以前のスクロール位置を復元
1534                            SCROLLINFO si;
1535                            POINT pos;
1536                            for(i2+=2,i3=0;;i2++,i3++){
1537                                if(temp2[i2]==','||temp2[i2]=='\0'){
1538                                    temporary[i3]=0;
1539                                    break;
1540                                }
1541                                temporary[i3]=temp2[i2];
1542                            }
1543                            sscanf(temporary,"%d",&pos.x);
1544                            if(temp2[i2]=='\0') goto EndToSetWorkFile;
1545                            for(i2++,i3=0;;i2++,i3++){
1546                                if(temp2[i2]==','||temp2[i2]=='\0'){
1547                                    temporary[i3]=0;
1548                                    break;
1549                                }
1550                                temporary[i3]=temp2[i2];
1551                            }
1552                            sscanf(temporary,"%d",&pos.y);
1553                            si.cbSize=sizeof(SCROLLINFO);
1554                            si.fMask=SIF_POS;
1555                            si.nPos=pos.x;
1556                            SetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_HORZ,&si,1);
1557                            si.nPos=pos.y;
1558                            SetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_VERT,&si,1);
1559
1560                            if(temp2[i2]=='\0') goto EndToSetWorkFile;
1561
1562                            //キャレット位置をセット
1563                            for(i2++,i3=0;;i2++,i3++){
1564                                if(temp2[i2]==','||temp2[i2]=='\0'){
1565                                    temporary[i3]=0;
1566                                    break;
1567                                }
1568                                temporary[i3]=temp2[i2];
1569                            }
1570                            sscanf(temporary,"%d",&pos.x);
1571                            if(temp2[i2]=='\0') goto EndToSetWorkFile;
1572                            for(i2++,i3=0;;i2++,i3++){
1573                                if(temp2[i2]==','||temp2[i2]=='\0'){
1574                                    temporary[i3]=0;
1575                                    break;
1576                                }
1577                                temporary[i3]=temp2[i2];
1578                            }
1579                            sscanf(temporary,"%d",&pos.y);
1580                            TextEdit_SetSel(WndNum,pos.x,pos.y);
1581                        }
1582                        else if(lstrcmpi(temporary,"rad")==0){
1583                            for(i3=0;i3<ProjectInfo.NumberOfWindows;i3++){
1584                                if(lstrcmpi(ProjectInfo.pWindowInfo[i3].name,temp2)==0){
1585                                    NewRadWindow(i3);
1586                                    break;
1587                                }
1588                            }
1589                        }
1590                        else if(lstrcmpi(temporary,"menu")==0){
1591                            for(i3=0;i3<ProjectInfo.NumberOfMenu;i3++){
1592                                if(lstrcmpi(ProjectInfo.pMenuInfo[i3].IdName,temp2)==0){
1593                                    NewMenuWindow(&ProjectInfo.pMenuInfo[i3]);
1594                                    break;
1595                                }
1596                            }
1597                        }
1598                        else if(lstrcmpi(temporary,"icon")==0){
1599                            for(i3=0;i3<ProjectInfo.res.NumberOfIconRes;i3++){
1600                                if(lstrcmpi(ProjectInfo.res.pIconResInfo[i3].path,temp2)==0){
1601                                    GetFullPath(temp2,ProjectInfo.dir);
1602                                    NewIconEditWindow(temp2);
1603                                    break;
1604                                }
1605                            }
1606                        }
1607                        i++;
1608                        i2=-1;
1609                        continue;
1610                    }
1611                    else break;
1612                }
1613                temporary[i2]=buffer[i];
1614            }
1615
1616            for(i+=2,i2=0;;i++,i2++){
1617                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1618                    temporary[i2]=0;
1619                    break;
1620                }
1621                temporary[i2]=buffer[i];
1622            }
1623            sscanf(temporary,"%d",&i2);
1624
1625            switch( i2 ){
1626                case 0:
1627                    ShowFileView();
1628                    break;
1629                case 1:
1630                    ShowClassView();
1631                    break;
1632                case 2:
1633                    ShowMaterialView();
1634                    break;
1635            }
1636
1637            if(buffer[i]=='\0') goto EndToSetWorkFile;
1638
1639            for(i+=2,i2=0;;i++,i2++){
1640                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1641                    temporary[i2]=0;
1642                    break;
1643                }
1644                temporary[i2]=buffer[i];
1645            }
1646            if(temporary[0]=='1') TreeView_Expand(pobj_FileTree->hTree,TreeView_GetRoot(pobj_FileTree->hTree),TVE_EXPAND);
1647
1648            for(i+=2,i2=0;;i++,i2++){
1649                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1650                    temporary[i2]=0;
1651                    break;
1652                }
1653                temporary[i2]=buffer[i];
1654            }
1655            if(temporary[0]=='1') TreeView_Expand(hProcedureTreeView,TreeView_GetRoot(hProcedureTreeView),TVE_EXPAND);
1656
1657            for(i+=2,i2=0;;i++,i2++){
1658                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1659                    temporary[i2]=0;
1660                    break;
1661                }
1662                temporary[i2]=buffer[i];
1663            }
1664            hTreeItem=TreeView_GetRoot(hMaterialTreeView);
1665            i2=0;
1666            while(hTreeItem){
1667                i2=GetOneParameter(temporary,i2,temp2);
1668                if(GetValue(temp2)) TreeView_Expand(hMaterialTreeView,hTreeItem,TVE_EXPAND);
1669                hTreeItem=TreeView_GetNextSibling(hMaterialTreeView,hTreeItem);
1670            }
1671        }
1672        else if(lstrcmp(temporary,"case3")==0){
1673            ////////////////////////////////////////
1674            // 古いフォーマットのワークファイル
1675
1676            LockWindowUpdate(hOwner);
1677            for(i=9,i2=0;;i++,i2++){
1678                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1679                    if(i2!=0){
1680                        temporary[i2]=0;
1681                        for(i3=0;;i3++){
1682                            if(temporary[i3]==','||temporary[i3]=='\0') break;
1683                        }
1684                        if(temporary[i3]=='\0') goto EndToSetWorkFile;
1685                        lstrcpy(temp2,temporary+i3+1);
1686                        temporary[i3]=0;
1687                        if(lstrcmpi(temporary,"text")==0){
1688                            for(i3=0;;i3++){
1689                                if(temp2[i3]==','||temp2[i3]=='\0') break;
1690                            }
1691                            if(temp2[i3]=='\0') goto EndToSetWorkFile;
1692                            lstrcpy(temporary,temp2+i3+1);
1693                            temp2[i3]=0;
1694                            GetFullPath(temporary,ProjectInfo.dir);
1695                            sscanf(temp2,"%d",&i3);
1696
1697                            //ファイルを開く
1698                            hChild=OpenFileWithExtension(temporary);
1699                            WndNum=GetWndNum(hChild);
1700
1701                            //キャレット位置をセット
1702                            TextEdit_SetSel(WndNum,i3,i3);
1703                        }
1704                        else if(lstrcmpi(temporary,"rad")==0){
1705                            for(i3=0;i3<ProjectInfo.NumberOfWindows;i3++){
1706                                if(lstrcmpi(ProjectInfo.pWindowInfo[i3].name,temp2)==0){
1707                                    NewRadWindow(i3);
1708                                    break;
1709                                }
1710                            }
1711                        }
1712                        else if(lstrcmpi(temporary,"menu")==0){
1713                            for(i3=0;i3<ProjectInfo.NumberOfMenu;i3++){
1714                                if(lstrcmpi(ProjectInfo.pMenuInfo[i3].IdName,temp2)==0){
1715                                    NewMenuWindow(&ProjectInfo.pMenuInfo[i3]);
1716                                    break;
1717                                }
1718                            }
1719                        }
1720                        else if(lstrcmpi(temporary,"icon")==0){
1721                            for(i3=0;i3<ProjectInfo.res.NumberOfIconRes;i3++){
1722                                if(lstrcmpi(ProjectInfo.res.pIconResInfo[i3].path,temp2)==0){
1723                                    GetFullPath(temp2,ProjectInfo.dir);
1724                                    NewIconEditWindow(temp2);
1725                                    break;
1726                                }
1727                            }
1728                        }
1729                        i++;
1730                        i2=-1;
1731                        continue;
1732                    }
1733                    else break;
1734                }
1735                temporary[i2]=buffer[i];
1736            }
1737
1738            for(i+=2,i2=0;;i++,i2++){
1739                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1740                    temporary[i2]=0;
1741                    break;
1742                }
1743                temporary[i2]=buffer[i];
1744            }
1745            sscanf(temporary,"%d",&i2);
1746
1747            switch( i2 ){
1748                case 0:
1749                    ShowFileView();
1750                    break;
1751                case 1:
1752                    ShowClassView();
1753                    break;
1754                case 2:
1755                    ShowMaterialView();
1756                    break;
1757            }
1758
1759            if(buffer[i]=='\0') goto EndToSetWorkFile;
1760
1761            for(i+=2,i2=0;;i++,i2++){
1762                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1763                    temporary[i2]=0;
1764                    break;
1765                }
1766                temporary[i2]=buffer[i];
1767            }
1768            if(temporary[0]=='1') TreeView_Expand(pobj_FileTree->hTree,TreeView_GetRoot(pobj_FileTree->hTree),TVE_EXPAND);
1769
1770            for(i+=2,i2=0;;i++,i2++){
1771                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1772                    temporary[i2]=0;
1773                    break;
1774                }
1775                temporary[i2]=buffer[i];
1776            }
1777            if(temporary[0]=='1') TreeView_Expand(hProcedureTreeView,TreeView_GetRoot(hProcedureTreeView),TVE_EXPAND);
1778
1779            for(i+=2,i2=0;;i++,i2++){
1780                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1781                    temporary[i2]=0;
1782                    break;
1783                }
1784                temporary[i2]=buffer[i];
1785            }
1786            hTreeItem=TreeView_GetRoot(hMaterialTreeView);
1787            i2=0;
1788            while(hTreeItem){
1789                i2=GetOneParameter(temporary,i2,temp2);
1790                if(GetValue(temp2)) TreeView_Expand(hMaterialTreeView,hTreeItem,TVE_EXPAND);
1791                hTreeItem=TreeView_GetNextSibling(hMaterialTreeView,hTreeItem);
1792            }
1793        }
1794EndToSetWorkFile:
1795        LockWindowUpdate(NULL);
1796        HeapDefaultFree(buffer);
1797    }
1798
1799
1800    //ウィンドウ タイトルを変更
1801    sprintf(temporary,"%s - %s",ProjectInfo.name,APPLICATION_NAME);
1802    SetWindowText(hOwner,temporary);
1803
1804
1805    ProjectInfo.modify=0;
1806    ProjectInfo.ModifyOfMaterial=0;
1807    ProjectInfo.ModifuOfResource=0;
1808}
1809BOOL ProjectModifyCheck(BOOL bRun){
1810    extern MDIINFO MdiInfo[MAX_WNDNUM];
1811    extern PROJECTINFO ProjectInfo;
1812    int i,WndNum,sw;
1813    HWND hChild;
1814    char temporary[MAX_PATH];
1815    if(ProjectInfo.modify||ProjectInfo.ModifyOfMaterial||ProjectInfo.ModifuOfResource){
1816        if(bRun==0||pobj_nv->bSaveCheckProject){
1817            //"\"%s\" プロジェクトは変更されています。保存しますか?"
1818            sprintf(temporary,STRING_MODIFYCHECK_PROJECT,ProjectInfo.name);
1819            i=MessageBox(hOwner,temporary,APPLICATION_NAME,MB_YESNOCANCEL|MB_ICONEXCLAMATION);
1820
1821            if(i==IDCANCEL) return 0;
1822            if(i==IDYES) SaveProject();
1823        }
1824        else SaveProject();
1825        return 1;
1826    }
1827    hChild=GetWindow(hClient,GW_CHILD);
1828    while(hChild){
1829        WndNum=GetWndNum(hChild);
1830        sw=0;
1831        if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
1832            if( MdiInfo[WndNum].pMdiTextEdit->IsModified() ){
1833                for(i=0;i<ProjectInfo.pobj_DBFileInfo->iNum;i++){
1834                    ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->GetFullPath(temporary);
1835                    if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0) sw=1;
1836                }
1837            }
1838        }
1839        else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
1840            if(MdiInfo[WndNum].MdiIconEditInfo->bModify){
1841                for(i=0;i<ProjectInfo.res.NumberOfIconRes;i++){
1842                    lstrcpy(temporary,ProjectInfo.res.pIconResInfo[i].path);
1843                    GetFullPath(temporary,ProjectInfo.dir);
1844                    if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0) sw=1;
1845                }
1846            }
1847        }
1848
1849        if(sw){
1850            if(bRun==0||pobj_nv->bSaveCheckProject){
1851                //"\"%s\" プロジェクトは変更されています。保存しますか?"
1852                sprintf(temporary,STRING_MODIFYCHECK_PROJECT,ProjectInfo.name);
1853                i=MessageBox(hOwner,temporary,APPLICATION_NAME,MB_YESNOCANCEL|MB_ICONEXCLAMATION);
1854
1855                if(i==IDCANCEL) return 0;
1856                if(i==IDYES) SaveProject();
1857            }
1858            else SaveProject();
1859            return 1;
1860        }
1861        hChild=GetNextWindow(hChild,GW_HWNDNEXT);
1862    }
1863    return 2;
1864}
1865_int8 CloseProject(void){
1866    extern HANDLE hHeap;
1867    extern MDIINFO MdiInfo[MAX_WNDNUM];
1868    extern PROJECTINFO ProjectInfo;
1869    int i,i2,WndNum;
1870    HWND hChild,hCloseChild;
1871    char temporary[MAX_PATH];
1872
1873
1874    //保存確認
1875    i=ProjectModifyCheck(0);
1876    if(i==0) return 0;
1877    else if(i==2) MakeWorkFile();
1878
1879    //プロジェクトに関するMDIウィンドウをすべて閉じる
1880    hChild=GetWindow(hClient,GW_CHILD);
1881    while(hChild){
1882        hCloseChild=hChild;
1883        hChild=GetNextWindow(hChild,GW_HWNDNEXT);
1884        WndNum=GetWndNum(hCloseChild);
1885        if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
1886            for(i=0;i<ProjectInfo.pobj_DBFileInfo->iNum;i++){
1887                ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->GetFullPath(temporary);
1888                if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
1889
1890                    //変更フラグをオフにする
1891                    MdiInfo[WndNum].pMdiTextEdit->UnModify();
1892
1893                    SendMessage(hCloseChild,WM_CLOSE,0,0);
1894                    break;
1895                }
1896            }
1897        }
1898        else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){
1899            for(i=0;i<ProjectInfo.NumberOfWindows;i++){
1900                if(lstrcmp(MdiInfo[WndNum].path,ProjectInfo.pWindowInfo[i].name)==0){
1901                    SendMessage(hCloseChild,WM_CLOSE,0,0);
1902                    break;
1903                }
1904            }
1905        }
1906        else if(MdiInfo[WndNum].DocType==WNDTYPE_MENU){
1907            for(i=0;i<ProjectInfo.NumberOfMenu;i++){
1908                if(lstrcmp(MdiInfo[WndNum].path,ProjectInfo.pMenuInfo[i].IdName)==0){
1909                    SendMessage(hCloseChild,WM_CLOSE,0,0);
1910                    break;
1911                }
1912            }
1913        }
1914        else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
1915            for(i=0;ProjectInfo.res.NumberOfIconRes;i++){
1916                lstrcpy(temporary,ProjectInfo.res.pIconResInfo[i].path);
1917                GetFullPath(temporary,ProjectInfo.dir);
1918                if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
1919                    SendMessage(hCloseChild,WM_CLOSE,0,0);
1920                    break;
1921                }
1922            }
1923        }
1924    }
1925
1926    //ファイル情報のメモリを解放
1927    delete ProjectInfo.pobj_DBFileInfo;
1928
1929    //ブレークポイントのオブジェクトを解放
1930    delete ProjectInfo.pobj_DBBreakPoint;
1931
1932    //ウィンドウ情報のメモリを解放
1933    for(i=0;i<ProjectInfo.NumberOfWindows;i++){
1934        HeapDefaultFree(ProjectInfo.pWindowInfo[i].name);
1935        HeapDefaultFree(ProjectInfo.pWindowInfo[i].HandleName);
1936        HeapDefaultFree(ProjectInfo.pWindowInfo[i].caption);
1937        HeapDefaultFree(ProjectInfo.pWindowInfo[i].ClassName);
1938        HeapDefaultFree(ProjectInfo.pWindowInfo[i].CallBackName);
1939        HeapDefaultFree(ProjectInfo.pWindowInfo[i].filepath);
1940        if(ProjectInfo.pWindowInfo[i].MenuID)
1941            HeapDefaultFree(ProjectInfo.pWindowInfo[i].MenuID);
1942        if(ProjectInfo.pWindowInfo[i].IconResName)
1943            HeapDefaultFree(ProjectInfo.pWindowInfo[i].IconResName);
1944
1945        //子ウィンドウのメモリを解放
1946        for(i2=0;i2<ProjectInfo.pWindowInfo[i].NumberOfChildWindows;i2++){
1947            HeapDefaultFree(ProjectInfo.pWindowInfo[i].pChildInfo[i2].IdName);
1948            HeapDefaultFree(ProjectInfo.pWindowInfo[i].pChildInfo[i2].caption);
1949            if(ProjectInfo.pWindowInfo[i].pChildInfo[i2].Control==CT_IMAGEBOX){
1950                //イメージ ボックスの場合
1951                HeapDefaultFree(ProjectInfo.pWindowInfo[i].pChildInfo[i2].ImageCtrlInfo.path);
1952            }
1953        }
1954        HeapDefaultFree(ProjectInfo.pWindowInfo[i].pChildInfo);
1955    }
1956    HeapDefaultFree(ProjectInfo.pWindowInfo);
1957
1958    //メニュー情報のメモリを解放
1959    HeapMenuDataFree(ProjectInfo.pMenuInfo,ProjectInfo.NumberOfMenu,0);
1960    HeapDefaultFree(ProjectInfo.pMenuInfo);
1961
1962    //リソースのメモリを解放
1963    for(i=0;i<ProjectInfo.res.NumberOfCursorRes;i++){
1964        HeapDefaultFree(ProjectInfo.res.pCursorResInfo[i].IdName);
1965        HeapDefaultFree(ProjectInfo.res.pCursorResInfo[i].path);
1966    }
1967    HeapDefaultFree(ProjectInfo.res.pCursorResInfo);
1968    for(i=0;i<ProjectInfo.res.NumberOfBitmapRes;i++){
1969        HeapDefaultFree(ProjectInfo.res.pBitmapResInfo[i].IdName);
1970        HeapDefaultFree(ProjectInfo.res.pBitmapResInfo[i].path);
1971    }
1972    HeapDefaultFree(ProjectInfo.res.pBitmapResInfo);
1973    for(i=0;i<ProjectInfo.res.NumberOfIconRes;i++){
1974        HeapDefaultFree(ProjectInfo.res.pIconResInfo[i].IdName);
1975        HeapDefaultFree(ProjectInfo.res.pIconResInfo[i].path);
1976    }
1977    HeapDefaultFree(ProjectInfo.res.pIconResInfo);
1978
1979    //プロジェクト ビューを非表示にする
1980    extern HWND hProjectView;
1981    if(IsWindowVisible(hProjectView)) SendMessage(hOwner,WM_COMMAND,IDM_PROJECTVIEW,0);
1982    SetWindowText(hProjectView,"Project View");
1983
1984    TreeView_DeleteAllItems(pobj_FileTree->hTree);
1985    TreeView_DeleteAllItems(hProcedureTreeView);
1986    TreeView_DeleteAllItems(hMaterialTreeView);
1987
1988    //ウィンドウ タイトルを変更
1989    SetWindowText(hOwner,APPLICATION_NAME);
1990
1991    ProjectInfo.name[0]=0;
1992
1993    //メニュー状態を設定
1994    ResetState_DocMenu();
1995
1996    return 1;
1997}
1998void MakeWorkFile(void){
1999    extern MDIINFO MdiInfo[MAX_WNDNUM];
2000    extern PROJECTINFO ProjectInfo;
2001    int i,i2,WndNum;
2002    char temporary[MAX_PATH],buffer[32767];
2003    HWND hChild;
2004    CHARRANGE CharRange;
2005
2006    //ワークファイル(*.wrk)を作成
2007    lstrcpy(buffer,"case4\r\n\r\n");
2008    i2=lstrlen(buffer);
2009
2010
2011    ///////////////////////
2012    //MDIウィンドウの並び
2013    hChild=GetWindow(GetWindow(hClient,GW_CHILD),GW_HWNDLAST);
2014    while(hChild){
2015        WndNum=GetWndNum(hChild);
2016        if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
2017            for(i=0;i<ProjectInfo.pobj_DBFileInfo->iNum;i++){
2018                ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->GetFullPath(temporary);
2019                if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
2020                    TextEdit_GetSel(WndNum,&CharRange);
2021
2022                    SCROLLINFO si;
2023                    POINT pos;
2024                    si.cbSize=sizeof(SCROLLINFO);
2025                    si.fMask=SIF_POS;
2026                    GetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_HORZ,&si);
2027                    pos.x=si.nPos;
2028                    GetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_VERT,&si);
2029                    pos.y=si.nPos;
2030
2031                    sprintf(buffer+i2,"text,\"%s\",%d,%d,%d,%d\r\n",
2032                        ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->m_path,
2033                        pos.x,
2034                        pos.y,
2035                        CharRange.cpMin,
2036                        CharRange.cpMax);
2037                    i2+=lstrlen(buffer+i2);
2038                    break;
2039                }
2040            }
2041        }
2042        else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){
2043            for(i=0;i<ProjectInfo.NumberOfWindows;i++){
2044                if(lstrcmpi(MdiInfo[WndNum].path,ProjectInfo.pWindowInfo[i].name)==0){
2045                    sprintf(buffer+i2,"rad,%s\r\n",MdiInfo[WndNum].path);
2046                    i2+=lstrlen(buffer+i2);
2047                    break;
2048                }
2049            }
2050        }
2051        else if(MdiInfo[WndNum].DocType==WNDTYPE_MENU){
2052            for(i=0;i<ProjectInfo.NumberOfMenu;i++){
2053                if(lstrcmpi(MdiInfo[WndNum].path,ProjectInfo.pMenuInfo[i].IdName)==0){
2054                    sprintf(buffer+i2,"menu,%s\r\n",MdiInfo[WndNum].path);
2055                    i2+=lstrlen(buffer+i2);
2056                    break;
2057                }
2058            }
2059        }
2060        else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
2061            for(i=0;i<ProjectInfo.res.NumberOfIconRes;i++){
2062                lstrcpy(temporary,ProjectInfo.res.pIconResInfo[i].path);
2063                GetFullPath(temporary,ProjectInfo.dir);
2064                if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
2065                    sprintf(buffer+i2,"icon,%s\r\n",ProjectInfo.res.pIconResInfo[i].path);
2066                    i2+=lstrlen(buffer+i2);
2067                    break;
2068                }
2069            }
2070        }
2071        hChild=GetNextWindow(hChild,GW_HWNDPREV);
2072    }
2073    lstrcpy(buffer+i2,"\r\n");
2074    i2+=2;
2075
2076
2077    //////////////////////////
2078    //ツリービューの展開状況
2079    sprintf(buffer+i2,"%d\r\n",TabCtrl_GetCurSel(hProjectViewTab));
2080    i2+=lstrlen(buffer+i2);
2081    TVITEM tvItem;
2082    memset(&tvItem,0,sizeof(TVITEM));
2083    tvItem.mask=TVIF_HANDLE|TVIF_STATE;
2084    tvItem.hItem=TreeView_GetRoot(pobj_FileTree->hTree);
2085    TreeView_GetItem(pobj_FileTree->hTree,&tvItem);
2086    if(tvItem.state&TVIS_EXPANDED) i=1;
2087    else i=0;
2088    sprintf(buffer+i2,"%d\r\n",i);
2089    i2+=lstrlen(buffer+i2);
2090
2091    tvItem.hItem=TreeView_GetRoot(hProcedureTreeView);
2092    TreeView_GetItem(hProcedureTreeView,&tvItem);
2093    if(tvItem.state&TVIS_EXPANDED) i=1;
2094    else i=0;
2095    sprintf(buffer+i2,"%d\r\n",i);
2096    i2+=lstrlen(buffer+i2);
2097
2098    tvItem.hItem=TreeView_GetRoot(hMaterialTreeView);
2099    while(tvItem.hItem){
2100        TreeView_GetItem(hMaterialTreeView,&tvItem);
2101        if(tvItem.state&TVIS_EXPANDED) i=1;
2102        else i=0;
2103        sprintf(buffer+i2,"%d",i);
2104        i2+=lstrlen(buffer+i2);
2105
2106        tvItem.hItem=TreeView_GetNextSibling(hMaterialTreeView,tvItem.hItem);
2107        if(tvItem.hItem){
2108            lstrcpy(buffer+i2,",");
2109            i2+=lstrlen(buffer+i2);
2110        }
2111    }
2112
2113
2114    //保存
2115    sprintf(temporary,"%s%s.wrk",ProjectInfo.dir,ProjectInfo.name);
2116    WriteBuffer(temporary,buffer,i2);
2117}
2118void SaveProject(void){
2119    extern MDIINFO MdiInfo[MAX_WNDNUM];
2120    extern PROJECTINFO ProjectInfo;
2121    int i,i2,i3,WndNum;
2122    char temporary[MAX_PATH],buffer[32767];
2123    HWND hChild;
2124
2125    //"プロジェクトを保存中..."
2126    SetStatusText(STRING_PROJECT_SAVING);
2127
2128    //プロジェクトファイルのバージョンを設定
2129    ProjectInfo.dwVersion=PROJECT_VERSION;
2130
2131    hChild=GetWindow(hClient,GW_CHILD);
2132    while(hChild){
2133        WndNum=GetWndNum(hChild);
2134        if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
2135            if( MdiInfo[WndNum].pMdiTextEdit->IsModified() ){
2136                for(i=0;i<ProjectInfo.pobj_DBFileInfo->iNum;i++){
2137                    ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->GetFullPath(temporary);
2138                    if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
2139                        SaveDocument(hChild,NULL);
2140                        break;
2141                    }
2142                }
2143            }
2144        }
2145        if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
2146            if(MdiInfo[WndNum].MdiIconEditInfo->bModify){
2147                for(i=0;i<ProjectInfo.res.NumberOfIconRes;i++){
2148                    lstrcpy(temporary,ProjectInfo.res.pIconResInfo[i].path);
2149                    GetFullPath(temporary,ProjectInfo.dir);
2150                    if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
2151                        SaveDocument(hChild,NULL);
2152                        break;
2153                    }
2154                }
2155            }
2156        }
2157        hChild=GetNextWindow(hChild,GW_HWNDNEXT);
2158    }
2159
2160
2161    //////////////////////////////////////
2162    //プロジェクトファイル(*.pj)を作成
2163    lstrcpy(buffer,"\' ActiveBasic Project file.\r\n\r\n");
2164    i2=lstrlen(buffer);
2165    sprintf(buffer+i2,"#VERSION=%d\r\n\r\n",ProjectInfo.dwVersion);
2166    i2+=lstrlen(buffer+i2);
2167    sprintf(buffer+i2,"#MODULETYPE=%d\r\n\r\n",ProjectInfo.dwModuleType);
2168    i2+=lstrlen(buffer+i2);
2169    sprintf(buffer+i2,"#NAME=%s\r\n\r\n",ProjectInfo.name);
2170    i2+=lstrlen(buffer+i2);
2171    extern HWND hSelectCompilerCombo;
2172    if(SendMessage(hSelectCompilerCombo,CB_GETCURSEL,0,0)==0){
2173        sprintf(buffer+i2,"#PLATFORM=32\r\n\r\n",ProjectInfo.name);
2174        i2+=lstrlen(buffer+i2);
2175    }
2176    else{
2177        sprintf(buffer+i2,"#PLATFORM=64\r\n\r\n",ProjectInfo.name);
2178        i2+=lstrlen(buffer+i2);
2179    }
2180    sprintf(buffer+i2,"#USEWINDOW=%d\r\n\r\n",ProjectInfo.NumberOfWindows);
2181    i2+=lstrlen(buffer+i2);
2182    sprintf(buffer+i2,"#OPTION=&H%08x\r\n\r\n",ProjectInfo.dwOption);
2183    i2+=lstrlen(buffer+i2);
2184    sprintf(buffer+i2,"#OUTPUT_RELEASE=%s\r\n\r\n",ProjectInfo.lpszOutput_Release);
2185    i2+=lstrlen(buffer+i2);
2186    sprintf(buffer+i2,"#OUTPUT_DEBUG=%s\r\n\r\n",ProjectInfo.lpszOutput_Debug);
2187    i2+=lstrlen(buffer+i2);
2188    sprintf(buffer+i2,"#MANIFEST=%s\r\n\r\n",ProjectInfo.szManifestPath);
2189    i2+=lstrlen(buffer+i2);
2190    sprintf(buffer+i2,"#DEBUG_CMD_LINE=%s\r\n\r\n",ProjectInfo.szCmdLine);
2191    i2+=lstrlen(buffer+i2);
2192    sprintf(buffer+i2,"#DEBUG_EXE_PATH=%s\r\n\r\n",ProjectInfo.szExePath);
2193    i2+=lstrlen(buffer+i2);
2194    if(ProjectInfo.ResourceFileName[0]){
2195        sprintf(buffer+i2,"#RESOURCE=%s\r\n\r\n",ProjectInfo.ResourceFileName);
2196        i2+=lstrlen(buffer+i2);
2197    }
2198    else{
2199        lstrcpy(buffer+i2,"#RESOURCE=0\r\n\r\n");
2200        i2+=lstrlen(buffer+i2);
2201    }
2202    sprintf(buffer+i2,"#SOURCE\r\n");
2203    i2+=lstrlen(buffer+i2);
2204    for(i=0;i<ProjectInfo.pobj_DBFileInfo->iNum;i++){
2205        sprintf(buffer+i2,"%s\r\n",ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->m_path);
2206        i2+=lstrlen(buffer+i2);
2207    }
2208
2209    //保存
2210    sprintf(temporary,"%s%s.pj",ProjectInfo.dir,ProjectInfo.name);
2211    WriteBuffer(temporary,buffer,i2);
2212
2213
2214    //////////////////////////////////
2215    // リソースファイル(*.rc、resource.ab)を作成
2216    if(ProjectInfo.ResourceFileName[0]){
2217        i2=0;
2218        i3=101;
2219        for(i=0;i<ProjectInfo.res.NumberOfCursorRes;i++,i3++){
2220            sprintf(buffer+i2,"Const %s=%d\r\n",
2221                ProjectInfo.res.pCursorResInfo[i].IdName,
2222                i3);
2223            i2+=lstrlen(buffer+i2);
2224        }
2225        for(i=0;i<ProjectInfo.res.NumberOfBitmapRes;i++,i3++){
2226            sprintf(buffer+i2,"Const %s=%d\r\n",
2227                ProjectInfo.res.pBitmapResInfo[i].IdName,
2228                i3);
2229            i2+=lstrlen(buffer+i2);
2230        }
2231        for(i=0;i<ProjectInfo.res.NumberOfIconRes;i++,i3++){
2232            sprintf(buffer+i2,"Const %s=%d\r\n",
2233                ProjectInfo.res.pIconResInfo[i].IdName,
2234                i3);
2235            i2+=lstrlen(buffer+i2);
2236        }
2237
2238        //保存(resource.ab)
2239        lstrcpy(temporary,"resource.ab");
2240        GetFullPath(temporary,ProjectInfo.dir);
2241        WriteBuffer(temporary,buffer,i2);
2242
2243        i2=0;
2244        for(i=0;i<ProjectInfo.res.NumberOfCursorRes;i++){
2245            sprintf(buffer+i2,"%s CURSOR \"%s\"\r\n",
2246                ProjectInfo.res.pCursorResInfo[i].IdName,
2247                ProjectInfo.res.pCursorResInfo[i].path);
2248            i2+=lstrlen(buffer+i2);
2249        }
2250        for(i=0;i<ProjectInfo.res.NumberOfBitmapRes;i++){
2251            sprintf(buffer+i2,"%s BITMAP \"%s\"\r\n",
2252                ProjectInfo.res.pBitmapResInfo[i].IdName,
2253                ProjectInfo.res.pBitmapResInfo[i].path);
2254            i2+=lstrlen(buffer+i2);
2255        }
2256        for(i=0;i<ProjectInfo.res.NumberOfIconRes;i++){
2257            sprintf(buffer+i2,"%s ICON \"%s\"\r\n",
2258                ProjectInfo.res.pIconResInfo[i].IdName,
2259                ProjectInfo.res.pIconResInfo[i].path);
2260            i2+=lstrlen(buffer+i2);
2261        }
2262
2263        //マニフェスト
2264        if(ProjectInfo.dwOption&PJ_OP_RC_MANIFEST){
2265            sprintf(buffer+i2,"CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST \"%s\"\r\n",
2266                ProjectInfo.szManifestPath);
2267            i2+=lstrlen(buffer+i2);
2268        }
2269
2270        //保存
2271        lstrcpy(temporary,ProjectInfo.ResourceFileName);
2272        GetFullPath(temporary,ProjectInfo.dir);
2273        WriteBuffer(temporary,buffer,i2);
2274    }
2275
2276
2277    ///////////////////////////////////////
2278    //インデックスファイル(*.idx)を作成
2279    buffer[0]=0;
2280    lstrcpy(buffer,"' インデックス プログラム\r\n");
2281    i2=lstrlen(buffer);
2282    if(ProjectInfo.dwOption&PJ_OP_SOURCE_MASK){
2283        if(ProjectInfo.dwOption&PJ_OP_STRICT){
2284            /* #strictディレクティブは今は使われていない
2285            lstrcpy(buffer+i2,"\r\n");
2286            i2+=lstrlen(buffer+i2);
2287            lstrcpy(buffer+i2,"#strict");
2288            i2+=lstrlen(buffer+i2);
2289            lstrcpy(buffer+i2,"\r\n");
2290            i2+=lstrlen(buffer+i2);
2291            */
2292        }
2293        lstrcpy(buffer+i2,"\r\n");
2294        i2+=lstrlen(buffer+i2);
2295        lstrcpy(buffer+i2,"'Win32APIの定義ファイル\r\n");
2296        i2+=lstrlen(buffer+i2);
2297        if(ProjectInfo.dwOption&PJ_OP_MMSYSTEM){
2298            lstrcpy(buffer+i2,"#include <api_mmsys.sbp>\r\n");
2299            i2+=lstrlen(buffer+i2);
2300        }
2301        if(ProjectInfo.dwOption&PJ_OP_COMMCTRL){
2302            lstrcpy(buffer+i2,"#include <api_commctrl.sbp>\r\n");
2303            i2+=lstrlen(buffer+i2);
2304        }
2305        if(ProjectInfo.dwOption&PJ_OP_RICHEDIT){
2306            lstrcpy(buffer+i2,"#include <api_richedit.sbp>\r\n");
2307            i2+=lstrlen(buffer+i2);
2308        }
2309        if(ProjectInfo.dwOption&PJ_OP_WINSOCK){
2310            lstrcpy(buffer+i2,"#include <api_winsock2.sbp>\r\n");
2311            i2+=lstrlen(buffer+i2);
2312        }
2313    }
2314    if(ProjectInfo.NumberOfWindows){
2315        lstrcpy(buffer+i2,"\r\n");
2316        i2+=lstrlen(buffer+i2);
2317        lstrcpy(buffer+i2,"'RADツールが生成するウィンドウ制御プログラム\r\n");
2318        i2+=lstrlen(buffer+i2);
2319        sprintf(buffer+i2,"#include \"Callback.wbp\"\r\n");
2320        i2+=lstrlen(buffer+i2);
2321    }
2322    if(ProjectInfo.pobj_DBFileInfo->iNum>1){
2323        lstrcpy(buffer+i2,"\r\n");
2324        i2+=lstrlen(buffer+i2);
2325        lstrcpy(buffer+i2,"'プロジェクト内のプログラム ファイル\r\n");
2326        i2+=lstrlen(buffer+i2);
2327        for(i=1;i<ProjectInfo.pobj_DBFileInfo->iNum;i++){
2328            //メインファイルは含まない
2329            sprintf(buffer+i2,"#include \"%s\"\r\n",ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->m_path);
2330            i2+=lstrlen(buffer+i2);
2331            lstrcpy(buffer+i2,"_ClearNamespaceImported\r\n");
2332            i2+=lstrlen(buffer+i2);
2333        }
2334    }
2335    if(ProjectInfo.NumberOfWindows){
2336        lstrcpy(buffer+i2,"\r\n");
2337        i2+=lstrlen(buffer+i2);
2338        lstrcpy(buffer+i2,"'RADツールが生成するウィンドウ生成プログラム\r\n");
2339        i2+=lstrlen(buffer+i2);
2340        sprintf(buffer+i2,"#include \"MakeWindow.wbp\"\r\n");
2341        i2+=lstrlen(buffer+i2);
2342    }
2343    if(ProjectInfo.ResourceFileName[0]){
2344        //リソースファイルが含まれる場合
2345        lstrcpy(buffer+i2,"\r\n");
2346        i2+=lstrlen(buffer+i2);
2347        lstrcpy(buffer+i2,"'リソースファイル\r\n");
2348        i2+=lstrlen(buffer+i2);
2349        lstrcpy(buffer+i2,"#include \"resource.ab\"\r\n");
2350        i2+=lstrlen(buffer+i2);
2351        sprintf(buffer+i2,"#resource \"%s.rc\"\r\n",ProjectInfo.name);
2352        i2+=lstrlen(buffer+i2);
2353    }
2354
2355    //保存
2356    sprintf(temporary,"%s%s.idx",ProjectInfo.dir,ProjectInfo.name);
2357    WriteBuffer(temporary,buffer,i2);
2358
2359
2360    if(ProjectInfo.NumberOfWindows){
2361        /////////////////////////////////////////////////////
2362        //ウィンドウ関連ファイル(*.wnd)を作成、保存
2363        if(ProjectInfo.ModifyOfMaterial){
2364            sprintf(temporary,"%s%s.wnd",ProjectInfo.dir,ProjectInfo.name);
2365            SaveWindowFile(temporary,ProjectInfo.pWindowInfo,ProjectInfo.NumberOfWindows);
2366        }
2367
2368        //.wbpファイルを生成
2369        SaveWindowProgram();
2370    }
2371
2372
2373    MakeWorkFile();
2374
2375    SetStatusText("");
2376
2377    ProjectInfo.modify=0;
2378    ProjectInfo.ModifuOfResource=0;
2379}
2380
2381BOOL SetProjectToRun(void){
2382    extern PROJECTINFO ProjectInfo;
2383    HANDLE hFind;
2384    WIN32_FIND_DATA wfd;
2385
2386    if(ProjectInfo.pobj_DBFileInfo->iNum==0){
2387        //"プログラム ファイルがプロジェクトに存在しません。"
2388        MessageBox(hOwner,STRING_ERROR_NOFILE,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
2389        return 0;
2390    }
2391
2392    extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
2393    hFind=FindFirstFile( ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ).c_str(), &wfd );
2394    if(hFind==INVALID_HANDLE_VALUE){
2395        //"BasicCompiler.exe が見つかりません"
2396        MessageBox(hOwner,STRING_ERROR_NOBASICCOMPILER,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
2397        return 0;
2398    }
2399    FindClose(hFind);
2400
2401    //プロジェクト構造のバージョンが違う時は、再保存する
2402    if(ProjectInfo.dwVersion<PROJECT_VERSION)
2403        ProjectInfo.ModifyOfMaterial=1;
2404
2405    //保存確認
2406    if(!ProjectModifyCheck(1)) return 0;
2407
2408    return 1;
2409}
2410BOOL IsNeedCompileForProject(BOOL bDebug){
2411    extern PROJECTINFO ProjectInfo;
2412    int i2;
2413    char temporary[MAX_PATH];
2414    HANDLE hFind,hFile;
2415    WIN32_FIND_DATA wfd;
2416    FILETIME SourceTime,ExeTime;
2417
2418    if(bDebug) lstrcpy(temporary,ProjectInfo.lpszOutput_Debug);
2419    else lstrcpy(temporary,ProjectInfo.lpszOutput_Release);
2420    GetFullPath(temporary,ProjectInfo.dir);
2421
2422    hFind=FindFirstFile(temporary,&wfd);
2423    if(hFind==INVALID_HANDLE_VALUE) return 1;
2424    FindClose(hFind);
2425
2426    hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
2427    GetFileTime(hFile,NULL,NULL,&ExeTime);
2428    CloseHandle(hFile);
2429
2430    for(i2=0;i2<ProjectInfo.pobj_DBFileInfo->iNum;i2++){
2431        ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i2]->GetFullPath(temporary);
2432        hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
2433        GetFileTime(hFile,NULL,NULL,&SourceTime);
2434        CloseHandle(hFile);
2435
2436        if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
2437            SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
2438            SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
2439    }
2440    if(ProjectInfo.NumberOfWindows){
2441        //CallBack.wbp
2442        lstrcpy(temporary,"CallBack.wbp");
2443        GetFullPath(temporary,ProjectInfo.dir);
2444        hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
2445        GetFileTime(hFile,NULL,NULL,&SourceTime);
2446        CloseHandle(hFile);
2447        if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
2448            SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
2449            SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
2450
2451        //MakeWindow.wbp
2452        lstrcpy(temporary,"MakeWindow.wbp");
2453        GetFullPath(temporary,ProjectInfo.dir);
2454        hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
2455        GetFileTime(hFile,NULL,NULL,&SourceTime);
2456        CloseHandle(hFile);
2457        if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
2458            SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
2459            SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
2460    }
2461    return 0;
2462}
Note: See TracBrowser for help on using the repository browser.