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

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

構成管理を大幅に改良。

File size: 78.8 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    lstrcpy(buffer,"\' ActiveBasic Project file.\r\n\r\n");
752    i=lstrlen(buffer);
753
754    //プロジェクトのフォーマットバージョン
755    sprintf(buffer+i,"#VERSION=%d\r\n\r\n",PROJECT_VERSION);
756    i+=lstrlen(buffer+i);
757
758    //モジュールタイプ(EXEならば0、DLLならば1)
759    if(NewProjectInfo.dwTypeID==IDC_DLL) lstrcpy(buffer+i,"#MODULETYPE=1\r\n\r\n");
760    else lstrcpy(buffer+i,"#MODULETYPE=0\r\n\r\n");
761    i+=lstrlen(buffer+i);
762
763    //プロジェクト名
764    sprintf(buffer+i,"#NAME=%s\r\n\r\n",NewProjectInfo.name);
765    i+=lstrlen(buffer+i);
766
767    lstrcpy(buffer+i,"#PLATFORM=32\r\n\r\n");
768    i+=lstrlen(buffer+i);
769
770    //RADウィンドウの数
771    if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE||
772        NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX)
773        lstrcpy(buffer+i,"#USEWINDOW=1\r\n\r\n");
774    else lstrcpy(buffer+i,"#USEWINDOW=0\r\n\r\n");
775    i+=lstrlen(buffer+i);
776
777    //プロジェクトオプション
778    sprintf(buffer+i,"#OPTION=&H%08x\r\n\r\n",NewProjectInfo.dwOption);
779    i+=lstrlen(buffer+i);
780
781    //出力先(Release)
782    if(NewProjectInfo.dwTypeID==IDC_DLL)
783        sprintf(buffer+i,"#OUTPUT_RELEASE=.\\%s.dll\r\n\r\n",NewProjectInfo.name);
784    else sprintf(buffer+i,"#OUTPUT_RELEASE=.\\%s.exe\r\n\r\n",NewProjectInfo.name);
785    i+=lstrlen(buffer+i);
786
787    //出力先(Debug)
788    if(NewProjectInfo.dwTypeID==IDC_DLL)
789        sprintf(buffer+i,"#OUTPUT_DEBUG=.\\%s.dll\r\n\r\n",NewProjectInfo.name);
790    else sprintf(buffer+i,"#OUTPUT_DEBUG=.\\%s_debug.exe\r\n\r\n",NewProjectInfo.name);
791    i+=lstrlen(buffer+i);
792
793    //マニフェスト
794    sprintf(buffer+i,"#MANIFEST=%s.manifest.xml\r\n\r\n",NewProjectInfo.name);
795    i+=lstrlen(buffer+i);
796
797    //デバッグ用(コマンドライン)
798    lstrcpy(buffer+i,"#DEBUG_CMD_LINE=\r\n\r\n");
799    i+=lstrlen(buffer+i);
800
801    //デバッグ用(DLL用の実行ファイル)
802    lstrcpy(buffer+i,"#DEBUG_EXE_PATH=\r\n\r\n");
803    i+=lstrlen(buffer+i);
804
805    //リソースファイル
806    lstrcpy(buffer+i,"#RESOURCE=0\r\n\r\n");
807    i+=lstrlen(buffer+i);
808
809    //ソースファイル
810    sprintf(buffer+i,"#SOURCE\r\n%s.ab\r\n",NewProjectInfo.name);
811    i+=lstrlen(buffer+i);
812    if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE||
813        NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
814        lstrcpy(buffer+i,"MainWnd.ab\r\n");
815        i+=lstrlen(buffer+i);
816    }
817    if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
818        lstrcpy(buffer+i,"dx_graphics.sbp\r\n");
819        i+=lstrlen(buffer+i);
820        lstrcpy(buffer+i,"dx_input.sbp\r\n");
821        i+=lstrlen(buffer+i);
822        lstrcpy(buffer+i,"dx_music.sbp\r\n");
823        i+=lstrlen(buffer+i);
824    }
825
826    //保存
827    sprintf(temporary,"%s%s.pj",dir,NewProjectInfo.name);
828    if(hFind=FindFirstFile(temporary,&wfd)){
829        if(hFind!=INVALID_HANDLE_VALUE){
830            FindClose(hFind);
831
832            //"指定したディレクトリにはすでにプロジェクトが存在します。上書きしますか?"
833            if(MessageBox(hOwner,STRING_ERROR_PROJECT_OVERWRITE,APPLICATION_NAME,MB_YESNO|MB_ICONEXCLAMATION)==IDNO) return;
834        }
835    }
836    if(!WriteBuffer(temporary,buffer,i)) return;
837
838
839    ///////////////////////////////////////////
840    //メインプログラムファイル(*.ab)を作成
841    if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE){
842        sprintf(buffer,"#include \"%s.idx\"\r\n\r\n",NewProjectInfo.name);
843        i=lstrlen(buffer);
844        lstrcpy(buffer+i,"'---------------------------\r\n");
845        i+=lstrlen(buffer+i);
846        lstrcpy(buffer+i,"'  Window Message Loop\r\n");
847        i+=lstrlen(buffer+i);
848        lstrcpy(buffer+i,"'---------------------------\r\n");
849        i+=lstrlen(buffer+i);
850        lstrcpy(buffer+i,"Dim msgMain As MSG, iResult As Long\r\n");
851        i+=lstrlen(buffer+i);
852        lstrcpy(buffer+i,"Do\r\n");
853        i+=lstrlen(buffer+i);
854        lstrcpy(buffer+i,"\tiResult=GetMessage(msgMain,0,0,0)\r\n");
855        i+=lstrlen(buffer+i);
856        lstrcpy(buffer+i,"\tIf iResult=0 or iResult=-1 Then Exit Do\r\n");
857        i+=lstrlen(buffer+i);
858        lstrcpy(buffer+i,"\tTranslateMessage(msgMain)\r\n");
859        i+=lstrlen(buffer+i);
860        lstrcpy(buffer+i,"\tDispatchMessage(msgMain)\r\n");
861        i+=lstrlen(buffer+i);
862        lstrcpy(buffer+i,"Loop\r\n\r\n");
863        i+=lstrlen(buffer+i);
864        lstrcpy(buffer+i,"' Call destructores and exit process\r\n");
865        i+=lstrlen(buffer+i);
866        lstrcpy(buffer+i,"End\r\n");
867        i+=lstrlen(buffer+i);
868    }
869    else if(NewProjectInfo.dwTypeID==IDC_EXE_PROMPTBASE){
870        sprintf(buffer,"#include \"%s.idx\"\r\n\r\n",NewProjectInfo.name);
871        i=lstrlen(buffer);
872        lstrcpy(buffer+i,"#N88BASIC\r\n\r\n");
873        i+=lstrlen(buffer+i);
874        lstrcpy(buffer+i,"' ↓ ここからプログラムが実行されます\r\n\r\n");
875        i+=lstrlen(buffer+i);
876        if(NewProjectInfo.ShowHelloWorld){
877            lstrcpy(buffer+i,"Print \"Hello World!\"\r\n");
878            i+=lstrlen(buffer+i);
879        }
880    }
881    else if(NewProjectInfo.dwTypeID==IDC_EXE_DOSPROMPTBASE){
882        sprintf(buffer,"#include \"%s.idx\"\r\n\r\n",NewProjectInfo.name);
883        i=lstrlen(buffer);
884        lstrcpy(buffer+i,"#console\r\n\r\n");
885        i+=lstrlen(buffer+i);
886        lstrcpy(buffer+i,"' ↓ ここからプログラムが実行されます\r\n\r\n");
887        i+=lstrlen(buffer+i);
888        if(NewProjectInfo.ShowHelloWorld){
889            lstrcpy(buffer+i,"Print \"Hello World!\"\r\n");
890            i+=lstrlen(buffer+i);
891        }
892    }
893    else if(NewProjectInfo.dwTypeID==IDC_EXE_NOBASE){
894        sprintf(buffer,"#include \"%s.idx\"\r\n\r\n",NewProjectInfo.name);
895        i=lstrlen(buffer);
896        lstrcpy(buffer+i,"' ↓ ここからプログラムが実行されます\r\n\r\n");
897        i+=lstrlen(buffer+i);
898    }
899    else if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
900        const std::string mainExeDirectXAbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dx\\main_exe_directx.abp";
901        pTemp = ReadBuffer( mainExeDirectXAbpPath );
902
903        //#name#をプロジェクト名に置換
904        pTemp=PermutationWndPgmTemplate(pTemp,NewProjectInfo.name,0,0,0);
905    }
906    else if(NewProjectInfo.dwTypeID==IDC_DLL){
907        sprintf(buffer,"#include \"%s.idx\"\r\n\r\n",NewProjectInfo.name);
908        i=lstrlen(buffer);
909        lstrcpy(buffer+i,"'-------------------------------------------------------------------\r\n");
910        i+=lstrlen(buffer+i);
911        lstrcpy(buffer+i,"' メモ - このファイルには、DLLの構成要素を記述します。\r\n");
912        i+=lstrlen(buffer+i);
913        lstrcpy(buffer+i,"'        (例:関数定義、グローバル変数、定数定義など)\r\n");
914        i+=lstrlen(buffer+i);
915        lstrcpy(buffer+i,"'\r\n");
916        i+=lstrlen(buffer+i);
917        lstrcpy(buffer+i,"'        エクスポートが必要な関数には、\"Export\" 修飾子を指定します。\r\n");
918        i+=lstrlen(buffer+i);
919        lstrcpy(buffer+i,"'        (例:Function Export FuncName() As Long)\r\n");
920        i+=lstrlen(buffer+i);
921        lstrcpy(buffer+i,"'-------------------------------------------------------------------\r\n");
922        i+=lstrlen(buffer+i);
923        lstrcpy(buffer+i,"\r\n");
924        i+=lstrlen(buffer+i);
925        lstrcpy(buffer+i,"Function Export DllMain(hinstDLL As HINSTANCE, fdwReason As DWord, lpvReserved As VoidPtr) As Long\r\n");
926        i+=lstrlen(buffer+i);
927        lstrcpy(buffer+i,"\t'DLLエントリポイント\r\n");
928        i+=lstrlen(buffer+i);
929        lstrcpy(buffer+i,"\tSelect Case fdwReason\r\n");
930        i+=lstrlen(buffer+i);
931        lstrcpy(buffer+i,"\t\tCase DLL_PROCESS_ATTACH\r\n");
932        i+=lstrlen(buffer+i);
933        lstrcpy(buffer+i,"\t\t\t'DLLがプロセス空間にロードされた時に実行されます。\r\n");
934        i+=lstrlen(buffer+i);
935        lstrcpy(buffer+i,"\t\t\t_System_StartupProgram()\r\n");
936        i+=lstrlen(buffer+i);
937        lstrcpy(buffer+i,"\t\t\tDllMain=1\r\n");
938        i+=lstrlen(buffer+i);
939        lstrcpy(buffer+i,"\t\tCase DLL_PROCESS_DETACH\r\n");
940        i+=lstrlen(buffer+i);
941        lstrcpy(buffer+i,"\t\t\t_System_Call_Destructor_of_GlobalObject()\r\n");
942        i+=lstrlen(buffer+i);
943        lstrcpy(buffer+i,"\tEnd Select\r\n");
944        i+=lstrlen(buffer+i);
945        lstrcpy(buffer+i,"End Function\r\n");
946        i+=lstrlen(buffer+i);
947        lstrcpy(buffer+i,"\r\n");
948        i+=lstrlen(buffer+i);
949    }
950
951    //保存
952    if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
953        sprintf(temporary,"%s%s.ab",dir,NewProjectInfo.name);
954        WriteBuffer(temporary,pTemp,lstrlen(pTemp));
955
956        HeapDefaultFree(pTemp);
957    }
958    else{
959        sprintf(temporary,"%s%s.ab",dir,NewProjectInfo.name);
960        if(!WriteBuffer(temporary,buffer,i)) return;
961    }
962
963
964    /////////////////////
965    // MainWnd.abを作成
966    /////////////////////
967
968    std::string mainWndSbpPath = "";
969    if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE)
970    {
971        mainWndSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\MainWnd_exe_windowbase.sbp";
972    }
973    else if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX)
974    {
975        mainWndSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\MainWnd_exe_directx.sbp";
976    }
977
978    if( !mainWndSbpPath.empty() ){
979        pTemp = ReadBuffer( mainWndSbpPath );
980
981        //#name#をプロジェクト名に置換
982        pTemp=PermutationWndPgmTemplate(pTemp,
983            NewProjectInfo.name,
984            "MainWnd",
985            "hMainWnd",
986            "MainWndProc");
987
988        if(NewProjectInfo.ShowHelloWorld){
989            //Hello World!表示
990            i=0;
991            lstrcpy(buffer+i,"\r\nSub MainWnd_Paint(hDC As HDC)\r\n");
992            i+=lstrlen(buffer+i);
993            lstrcpy(buffer+i,"\tDim rect As RECT\r\n");
994            i+=lstrlen(buffer+i);
995            lstrcpy(buffer+i,"\tGetClientRect(hMainWnd,rect)\r\n");
996            i+=lstrlen(buffer+i);
997            lstrcpy(buffer+i,"\tDrawText(hDC,\"Hello World!\",-1,rect,DT_CENTER or DT_VCENTER or DT_SINGLELINE)\r\n");
998            i+=lstrlen(buffer+i);
999            lstrcpy(buffer+i,"End Sub\r\n");
1000            i+=lstrlen(buffer+i);
1001
1002            pTemp=(char *)HeapReAlloc(hHeap,0,pTemp,lstrlen(pTemp)+lstrlen(buffer)+1);
1003            lstrcat(pTemp,buffer);
1004        }
1005
1006        sprintf(temporary,"%sMainWnd.ab",dir,NewProjectInfo.name);
1007        WriteBuffer(temporary,pTemp,lstrlen(pTemp));
1008
1009        HeapDefaultFree(pTemp);
1010    }
1011
1012
1013    if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
1014        ///////////////////////////
1015        // DirextX対応アプリのとき
1016        ///////////////////////////
1017
1018        //dx_graphics.sbpをコピー
1019        const std::string dxGraphicsSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dx\\dx_graphics.sbp";
1020        pTemp = ReadBuffer( dxGraphicsSbpPath );
1021        sprintf(temporary,"%sdx_graphics.sbp",dir,NewProjectInfo.name);
1022        WriteBuffer(temporary,pTemp,lstrlen(pTemp));
1023        HeapDefaultFree(pTemp);
1024
1025        //dx_input.sbpをコピー
1026        const std::string dxInputSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dx\\dx_input.sbp";
1027        pTemp = ReadBuffer( dxInputSbpPath );
1028        sprintf(temporary,"%sdx_input.sbp",dir,NewProjectInfo.name);
1029        WriteBuffer(temporary,pTemp,lstrlen(pTemp));
1030        HeapDefaultFree(pTemp);
1031
1032        //dx_music.sbpをコピー
1033        const std::string dxMusicSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dx\\dx_music.sbp";
1034        pTemp = ReadBuffer( dxMusicSbpPath );
1035        sprintf(temporary,"%sdx_music.sbp",dir,NewProjectInfo.name);
1036        WriteBuffer(temporary,pTemp,lstrlen(pTemp));
1037        HeapDefaultFree(pTemp);
1038
1039        //dx9abm.dllをコピー
1040        sprintf(temporary,"%sRuntime\\dx9abm.dll",pj_editor_Dir);
1041        sprintf(buffer,"%sdx9abm.dll",dir,NewProjectInfo.name);
1042        CopyFile(temporary,buffer,0);
1043    }
1044
1045
1046    if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE||
1047        NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
1048        /////////////////////////////////////////
1049        // ウィンドウ定義ファイル(*.wnd)を作成
1050        /////////////////////////////////////////
1051        WINDOW_INFO WindowInfo[1];
1052        WindowInfo[0].name="MainWnd";
1053        WindowInfo[0].HandleName="hMainWnd";
1054        WindowInfo[0].pos.x=CW_USEDEFAULT;
1055        WindowInfo[0].pos.y=CW_USEDEFAULT;
1056        WindowInfo[0].size.cx=480;
1057        WindowInfo[0].size.cy=360;
1058        WindowInfo[0].caption=NewProjectInfo.name;
1059        if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE)
1060            WindowInfo[0].style=WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_VISIBLE;
1061        else if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX)
1062            WindowInfo[0].style=WS_OVERLAPPED|WS_THICKFRAME|WS_SYSMENU;
1063        WindowInfo[0].ExStyle=0;
1064        WindowInfo[0].MenuID=0;
1065        WindowInfo[0].id=0;
1066        WindowInfo[0].bgColor=COLOR_3DFACE;
1067        GetDefaultWindowFont(&WindowInfo[0].LogFont);
1068        WindowInfo[0].IconResName=0;
1069        WindowInfo[0].ClassName="NORMAL";
1070        WindowInfo[0].CallBackName="MainWndProc";
1071        WindowInfo[0].type=WNDTYPE_DEFAULT;
1072        WindowInfo[0].filepath="MainWnd.ab";
1073        WindowInfo[0].NumberOfChildWindows=0;
1074        sprintf(temporary,"%s%s.wnd",dir,NewProjectInfo.name);
1075
1076        ProjectInfo.NumberOfMenu=0;
1077        SaveWindowFile(temporary,WindowInfo,1);
1078    }
1079
1080
1081    ////////////////////////
1082    // ワークファイルを作成
1083    ////////////////////////
1084    lstrcpy(buffer,"case4\r\n\r\n");
1085    if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE){
1086        lstrcat(buffer,"rad,MainWnd\r\n\r\n");
1087    }
1088    else{
1089        sprintf(buffer+lstrlen(buffer),"text,\"%s.ab\",0,0,0,0\r\n\r\n",NewProjectInfo.name);
1090    }
1091    lstrcat(buffer,"0\r\n0\r\n0\r\n0,0");
1092    //保存
1093    sprintf(temporary,"%s%s.wrk",dir,NewProjectInfo.name);
1094    if(!WriteBuffer(temporary,buffer,lstrlen(buffer))) return;
1095
1096
1097    //マニフェストを作成
1098    char temp2[MAX_PATH];
1099    const std::string manifestTempXmlPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\manifest_temp.xml";
1100    sprintf(temp2,"%s%s.manifest.xml",dir,NewProjectInfo.name);
1101    CopyFile( manifestTempXmlPath.c_str(), temp2, 0 );
1102
1103
1104    sprintf(temporary,"%s%s.pj",dir,NewProjectInfo.name);
1105    OpenProject(temporary);
1106    SaveProject();
1107}
1108void SetTreeViewForProjectInfo(){
1109    extern HANDLE hHeap;
1110    extern HWND hProjectView;
1111    extern PROJECTINFO ProjectInfo;
1112    int i;
1113    char temporary[MAX_PATH];
1114    TV_INSERTSTRUCT tv;
1115
1116    sprintf(temporary,"%s ",ProjectInfo.name);
1117    lstrcat(temporary,STRING_PROJECT);
1118    SetWindowText(hProjectView,temporary);
1119
1120    tv.hInsertAfter=TVI_SORT;
1121    tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
1122
1123    //ファイル ツリー
1124    ProjectInfo.pobj_DBFileInfo->ResetTree();
1125
1126    //関数ツリー
1127    ResetClassTree(-1);
1128
1129    /////////////////////
1130    // マテリアル ツリー
1131
1132    //Cursorリソース フォルダ
1133    sprintf(temporary,"Cursor %s",STRING_RESOURCE);
1134    tv.hParent=TVI_ROOT;
1135    tv.item.iImage=0;
1136    tv.item.iSelectedImage=0;
1137    tv.item.pszText=temporary;
1138    tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1139    ProjectInfo.res.hCursorTreeItem=tv.hParent;
1140    for(i=0;i<ProjectInfo.res.NumberOfCursorRes;i++){
1141        tv.item.iImage=6;
1142        tv.item.iSelectedImage=6;
1143        tv.item.pszText=ProjectInfo.res.pCursorResInfo[i].IdName;
1144        ProjectInfo.res.pCursorResInfo[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1145    }
1146
1147    //Bitmapリソース フォルダ
1148    sprintf(temporary,"Bitmap %s",STRING_RESOURCE);
1149    tv.hParent=TVI_ROOT;
1150    tv.item.iImage=0;
1151    tv.item.iSelectedImage=0;
1152    tv.item.pszText=temporary;
1153    tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1154    ProjectInfo.res.hBitmapTreeItem=tv.hParent;
1155    for(i=0;i<ProjectInfo.res.NumberOfBitmapRes;i++){
1156        tv.item.iImage=5;
1157        tv.item.iSelectedImage=5;
1158        tv.item.pszText=ProjectInfo.res.pBitmapResInfo[i].IdName;
1159        ProjectInfo.res.pBitmapResInfo[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1160    }
1161
1162    //Iconリソース フォルダ
1163    sprintf(temporary,"Icon %s",STRING_RESOURCE);
1164    tv.hParent=TVI_ROOT;
1165    tv.item.iImage=0;
1166    tv.item.iSelectedImage=0;
1167    tv.item.pszText=temporary;
1168    tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1169    ProjectInfo.res.hIconTreeItem=tv.hParent;
1170    for(i=0;i<ProjectInfo.res.NumberOfIconRes;i++){
1171        tv.item.iImage=4;
1172        tv.item.iSelectedImage=4;
1173        if(i==0){
1174            sprintf(temporary,"%s (Main)",ProjectInfo.res.pIconResInfo[i].IdName);
1175            tv.item.pszText=temporary;
1176        }
1177        else tv.item.pszText=ProjectInfo.res.pIconResInfo[i].IdName;
1178        ProjectInfo.res.pIconResInfo[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1179    }
1180
1181    //Menuフォルダ
1182    tv.hParent=TVI_ROOT;
1183    tv.item.iImage=0;
1184    tv.item.iSelectedImage=0;
1185    tv.item.pszText="Menu";
1186    tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1187    ProjectInfo.hMenuTreeItem=tv.hParent;
1188    for(i=0;i<ProjectInfo.NumberOfMenu;i++){
1189        tv.item.iImage=3;
1190        tv.item.iSelectedImage=3;
1191        tv.item.pszText=ProjectInfo.pMenuInfo[i].IdName;
1192        ProjectInfo.pMenuInfo[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1193    }
1194
1195    //Windowフォルダ
1196    tv.hParent=TVI_ROOT;
1197    tv.item.iImage=0;
1198    tv.item.iSelectedImage=0;
1199    tv.item.pszText="Window";
1200    tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1201    ProjectInfo.hWindowTreeItem=tv.hParent;
1202    for(i=0;i<ProjectInfo.NumberOfWindows;i++){
1203        tv.item.iImage=2;
1204        tv.item.iSelectedImage=2;
1205        tv.item.pszText=ProjectInfo.pWindowInfo[i].name;
1206        ProjectInfo.pWindowInfo[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1207    }
1208}
1209void OpenProject(char *path){
1210    extern HANDLE hHeap;
1211    extern PROJECTINFO ProjectInfo;
1212    int i,i2,i3;
1213    char *buffer,temporary[MAX_PATH],temp2[MAX_PATH];
1214
1215    //既にプロジェクトが開かれている場合は閉じる
1216    if(ProjectInfo.name[0]){
1217        if(!CloseProject()) return;
1218    }
1219    memset(&ProjectInfo,0,sizeof(PROJECTINFO));
1220
1221    //プロジェクトの作業ディレクトリを取得
1222    _splitpath(path,ProjectInfo.dir,temporary,0,0);
1223    lstrcat(ProjectInfo.dir,temporary);
1224
1225    //ファイルを開く、保存の初期ディレクトリをセット
1226    lstrcpy(pobj_nv->DefSaveDir,ProjectInfo.dir);
1227
1228
1229    //////////////////////////////////////////
1230    // リソースデータ用領域を確保
1231    ProjectInfo.res.pCursorResInfo=(RESITEMINFO *)HeapAlloc(hHeap,0,1);
1232    ProjectInfo.res.NumberOfCursorRes=0;
1233    ProjectInfo.res.pBitmapResInfo=(RESITEMINFO *)HeapAlloc(hHeap,0,1);
1234    ProjectInfo.res.NumberOfBitmapRes=0;
1235    ProjectInfo.res.pIconResInfo=(RESITEMINFO *)HeapAlloc(hHeap,0,1);
1236    ProjectInfo.res.NumberOfIconRes=0;
1237
1238
1239    //////////////////////////////////////////
1240    //プロジェクトファイル(*.pj)をオープン
1241    buffer=ReadBuffer(path);
1242    if(!buffer) return;
1243
1244    //解析
1245    ProjectInfo.pobj_DBFileInfo=new CDBFileInfo();
1246    for(i=0;;i++){
1247        if(buffer[i]=='\0') break;
1248        if(buffer[i]=='\r'&&buffer[i+1]=='\n'&&buffer[i+2]=='#'){
1249            for(i+=3,i2=0;;i++,i2++){
1250                if(!IsVariableChar(buffer[i])){
1251                    temporary[i2]=0;
1252                    break;
1253                }
1254                temporary[i2]=buffer[i];
1255            }
1256            if(lstrcmpi(temporary,"VERSION")==0&&buffer[i]=='='){
1257                for(i++,i2=0;;i++,i2++){
1258                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1259                        temporary[i2]=0;
1260                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1261                        break;
1262                    }
1263                    temporary[i2]=buffer[i];
1264                }
1265                ProjectInfo.dwVersion=GetValue(temporary);
1266            }
1267            else if(lstrcmpi(temporary,"MODULETYPE")==0&&buffer[i]=='='){
1268                for(i++,i2=0;;i++,i2++){
1269                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1270                        temporary[i2]=0;
1271                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1272                        break;
1273                    }
1274                    temporary[i2]=buffer[i];
1275                }
1276                ProjectInfo.dwModuleType=atoi(temporary);
1277            }
1278            else if(lstrcmpi(temporary,"NAME")==0&&buffer[i]=='='){
1279                for(i++,i2=0;;i++,i2++){
1280                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1281                        ProjectInfo.name[i2]=0;
1282                        break;
1283                    }
1284                    ProjectInfo.name[i2]=buffer[i];
1285                }
1286            }
1287            else if(lstrcmpi(temporary,"PLATFORM")==0&&buffer[i]=='='){
1288                for(i++,i2=0;;i++,i2++){
1289                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1290                        temporary[i2]=0;
1291                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1292                        break;
1293                    }
1294                    temporary[i2]=buffer[i];
1295                }
1296                i2=atoi(temporary);
1297                extern HWND hSelectCompilerCombo;
1298                if(i2==32){
1299                    //プラットフォームにWin32を選択
1300                    SendMessage(hSelectCompilerCombo,CB_SETCURSEL,0,0);
1301                }
1302                else if(i2==64){
1303                    //プラットフォームにWin64を選択
1304                    SendMessage(hSelectCompilerCombo,CB_SETCURSEL,1,0);
1305                }
1306                SendMessage(hSelectCompilerCombo,WM_COMMAND,MAKELONG(0,CBN_SELCHANGE),0);
1307            }
1308            else if(lstrcmpi(temporary,"USEWINDOW")==0&&buffer[i]=='='){
1309                for(i++,i2=0;;i++,i2++){
1310                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1311                        temporary[i2]=0;
1312                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1313                        break;
1314                    }
1315                    temporary[i2]=buffer[i];
1316                }
1317                ProjectInfo.NumberOfWindows=atoi(temporary);
1318            }
1319            else if(lstrcmpi(temporary,"OPTION")==0&&buffer[i]=='='){
1320                for(i++,i2=0;;i++,i2++){
1321                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1322                        temporary[i2]=0;
1323                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1324                        break;
1325                    }
1326                    temporary[i2]=buffer[i];
1327                }
1328                ProjectInfo.dwOption=GetValue(temporary);
1329            }
1330            else if(lstrcmpi(temporary,"OUTPUT_RELEASE")==0&&buffer[i]=='='){
1331                for(i++,i2=0;;i++,i2++){
1332                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1333                        temporary[i2]=0;
1334                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1335                        break;
1336                    }
1337                    temporary[i2]=buffer[i];
1338                }
1339                lstrcpy(ProjectInfo.lpszOutput_Release,temporary);
1340            }
1341            else if(lstrcmpi(temporary,"OUTPUT_DEBUG")==0&&buffer[i]=='='){
1342                for(i++,i2=0;;i++,i2++){
1343                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1344                        temporary[i2]=0;
1345                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1346                        break;
1347                    }
1348                    temporary[i2]=buffer[i];
1349                }
1350                lstrcpy(ProjectInfo.lpszOutput_Debug,temporary);
1351            }
1352            else if(lstrcmpi(temporary,"MANIFEST")==0&&buffer[i]=='='){
1353                for(i++,i2=0;;i++,i2++){
1354                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1355                        temporary[i2]=0;
1356                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1357                        break;
1358                    }
1359                    temporary[i2]=buffer[i];
1360                }
1361                lstrcpy(ProjectInfo.szManifestPath,temporary);
1362            }
1363            else if(lstrcmpi(temporary,"DEBUG_CMD_LINE")==0&&buffer[i]=='='){
1364                for(i++,i2=0;;i++,i2++){
1365                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1366                        temporary[i2]=0;
1367                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1368                        break;
1369                    }
1370                    temporary[i2]=buffer[i];
1371                }
1372                lstrcpy(ProjectInfo.szCmdLine,temporary);
1373            }
1374            else if(lstrcmpi(temporary,"DEBUG_EXE_PATH")==0&&buffer[i]=='='){
1375                for(i++,i2=0;;i++,i2++){
1376                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1377                        temporary[i2]=0;
1378                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1379                        break;
1380                    }
1381                    temporary[i2]=buffer[i];
1382                }
1383                lstrcpy(ProjectInfo.szExePath,temporary);
1384            }
1385            else if(lstrcmpi(temporary,"RESOURCE")==0&&buffer[i]=='='){
1386                for(i++,i2=0;;i++,i2++){
1387                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1388                        temporary[i2]=0;
1389                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1390                        break;
1391                    }
1392                    temporary[i2]=buffer[i];
1393                }
1394                if(temporary[0]!='\0'&&(!(temporary[0]=='0'&&temporary[1]=='\0'))){
1395                    lstrcpy(ProjectInfo.ResourceFileName,temporary);
1396                    GetResourceData();
1397                }
1398                else{
1399                    sprintf(ProjectInfo.ResourceFileName,"%s.rc",ProjectInfo.name);
1400                }
1401            }
1402            else if(lstrcmpi(temporary,"SOURCE")==0&&buffer[i]=='\r'&&buffer[i+1]=='\n'){
1403                while(1){
1404                    for(i+=2,i2=0;;i++,i2++){
1405                        if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1406                            temporary[i2]=0;
1407                            break;
1408                        }
1409                        temporary[i2]=buffer[i];
1410                    }
1411                    if(temporary[0]=='\0') break;
1412                    ProjectInfo.pobj_DBFileInfo->add(temporary,0);
1413
1414                    if(buffer[i]=='\0') break;
1415                }
1416            }
1417            else{
1418                //不明なパラメータは無視
1419                for(i++;;i++){
1420                    if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1421                        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
1422                        break;
1423                    }
1424                }
1425            }
1426            if(buffer[i]=='\0') break;
1427        }
1428    }
1429    HeapDefaultFree(buffer);
1430
1431    //古いバージョンファイルを考慮
1432    if(ProjectInfo.dwVersion<=4){
1433        if(ProjectInfo.dwModuleType==MT_DLL)
1434            sprintf(ProjectInfo.lpszOutput_Release,".\\%s.dll",ProjectInfo.name);
1435        else sprintf(ProjectInfo.lpszOutput_Release,".\\%s.exe",ProjectInfo.name);
1436        sprintf(ProjectInfo.lpszOutput_Debug,".\\%s_debug.exe",ProjectInfo.name);
1437    }
1438
1439    //ブレークポイントを初期化
1440    ProjectInfo.pobj_DBBreakPoint=new CDBBreakPoint();
1441
1442
1443    if(ProjectInfo.NumberOfWindows){
1444        /////////////////////////////////////////////
1445        //ウィンドウ定義ファイル(*.wnd)をオープン
1446        sprintf(temp2,"%s%s.wnd",ProjectInfo.dir,ProjectInfo.name);
1447        if(!OpenWindowFile(temp2)) return;
1448    }
1449    else{
1450        ProjectInfo.pWindowInfo=(WINDOW_INFO *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1);
1451
1452        ProjectInfo.NumberOfMenu=0;
1453        ProjectInfo.pMenuInfo=(MENU_INFO *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1);
1454    }
1455
1456
1457    //プロジェクト ビューを設定、表示
1458    extern HWND hProjectView;
1459    SetTreeViewForProjectInfo();
1460    if(!IsWindowVisible(hProjectView)) SendMessage(hOwner,WM_COMMAND,IDM_PROJECTVIEW,0);
1461
1462
1463    //メニュー状態を設定
1464    ResetState_DocMenu();
1465
1466
1467    //////////////////////////////////////////
1468    //ワークファイル(*.wrk)をオープン
1469    extern MDIINFO MdiInfo[MAX_WNDNUM];
1470    HTREEITEM hTreeItem;
1471    HANDLE hFind;
1472    WIN32_FIND_DATA wfd;
1473    HWND hChild;
1474    int WndNum;
1475    sprintf(temp2,"%s%s.wrk",ProjectInfo.dir,ProjectInfo.name);
1476    hFind=FindFirstFile(temp2,&wfd);
1477    if(hFind!=INVALID_HANDLE_VALUE){
1478        FindClose(hFind);
1479        buffer=ReadBuffer(temp2);
1480        if(!buffer) return;
1481
1482        //解析、反映
1483        memcpy(temporary,buffer,5);
1484        temporary[5]=0;
1485        if(lstrcmp(temporary,"case4")==0){
1486
1487            LockWindowUpdate(hOwner);
1488            for(i=9,i2=0;;i++,i2++){
1489                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1490                    if(i2!=0){
1491                        temporary[i2]=0;
1492                        for(i3=0;;i3++){
1493                            if(temporary[i3]==','||temporary[i3]=='\0') break;
1494                        }
1495                        if(temporary[i3]=='\0') goto EndToSetWorkFile;
1496                        lstrcpy(temp2,temporary+i3+1);
1497                        temporary[i3]=0;
1498                        if(lstrcmpi(temporary,"text")==0){
1499                            if(temp2[0]!='\"') goto EndToSetWorkFile;
1500
1501                            //ファイルを開く
1502                            i2=1;
1503                            for(i3=0;;i2++,i3++){
1504                                if(temp2[i2]=='\"'||temp2[i2]=='\0'){
1505                                    temporary[i3]=0;
1506                                    break;
1507                                }
1508                                temporary[i3]=temp2[i2];
1509                            }
1510                            GetFullPath(temporary,ProjectInfo.dir);
1511                            hChild=OpenFileWithExtension(temporary);
1512                            WndNum=GetWndNum(hChild);
1513                            if(WndNum==-1){
1514                                goto EndToSetWorkFile;
1515                            }
1516
1517                            //ResetScrollbarが再描画時に呼び出されるので、再描画する
1518                            InvalidateRect(MdiInfo[WndNum].pMdiTextEdit->hEdit,NULL,0);
1519                            UpdateWindow(MdiInfo[WndNum].pMdiTextEdit->hEdit);
1520
1521                            if(temp2[i2]=='\0') goto EndToSetWorkFile;
1522                            if(temp2[i2+1]!=',') goto EndToSetWorkFile;
1523
1524                            //以前のスクロール位置を復元
1525                            SCROLLINFO si;
1526                            POINT pos;
1527                            for(i2+=2,i3=0;;i2++,i3++){
1528                                if(temp2[i2]==','||temp2[i2]=='\0'){
1529                                    temporary[i3]=0;
1530                                    break;
1531                                }
1532                                temporary[i3]=temp2[i2];
1533                            }
1534                            sscanf(temporary,"%d",&pos.x);
1535                            if(temp2[i2]=='\0') goto EndToSetWorkFile;
1536                            for(i2++,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.y);
1544                            si.cbSize=sizeof(SCROLLINFO);
1545                            si.fMask=SIF_POS;
1546                            si.nPos=pos.x;
1547                            SetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_HORZ,&si,1);
1548                            si.nPos=pos.y;
1549                            SetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_VERT,&si,1);
1550
1551                            if(temp2[i2]=='\0') goto EndToSetWorkFile;
1552
1553                            //キャレット位置をセット
1554                            for(i2++,i3=0;;i2++,i3++){
1555                                if(temp2[i2]==','||temp2[i2]=='\0'){
1556                                    temporary[i3]=0;
1557                                    break;
1558                                }
1559                                temporary[i3]=temp2[i2];
1560                            }
1561                            sscanf(temporary,"%d",&pos.x);
1562                            if(temp2[i2]=='\0') goto EndToSetWorkFile;
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.y);
1571                            TextEdit_SetSel(WndNum,pos.x,pos.y);
1572                        }
1573                        else if(lstrcmpi(temporary,"rad")==0){
1574                            for(i3=0;i3<ProjectInfo.NumberOfWindows;i3++){
1575                                if(lstrcmpi(ProjectInfo.pWindowInfo[i3].name,temp2)==0){
1576                                    NewRadWindow(i3);
1577                                    break;
1578                                }
1579                            }
1580                        }
1581                        else if(lstrcmpi(temporary,"menu")==0){
1582                            for(i3=0;i3<ProjectInfo.NumberOfMenu;i3++){
1583                                if(lstrcmpi(ProjectInfo.pMenuInfo[i3].IdName,temp2)==0){
1584                                    NewMenuWindow(&ProjectInfo.pMenuInfo[i3]);
1585                                    break;
1586                                }
1587                            }
1588                        }
1589                        else if(lstrcmpi(temporary,"icon")==0){
1590                            for(i3=0;i3<ProjectInfo.res.NumberOfIconRes;i3++){
1591                                if(lstrcmpi(ProjectInfo.res.pIconResInfo[i3].path,temp2)==0){
1592                                    GetFullPath(temp2,ProjectInfo.dir);
1593                                    NewIconEditWindow(temp2);
1594                                    break;
1595                                }
1596                            }
1597                        }
1598                        i++;
1599                        i2=-1;
1600                        continue;
1601                    }
1602                    else break;
1603                }
1604                temporary[i2]=buffer[i];
1605            }
1606
1607            for(i+=2,i2=0;;i++,i2++){
1608                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1609                    temporary[i2]=0;
1610                    break;
1611                }
1612                temporary[i2]=buffer[i];
1613            }
1614            sscanf(temporary,"%d",&i2);
1615
1616            switch( i2 ){
1617                case 0:
1618                    ShowFileView();
1619                    break;
1620                case 1:
1621                    ShowClassView();
1622                    break;
1623                case 2:
1624                    ShowMaterialView();
1625                    break;
1626            }
1627
1628            if(buffer[i]=='\0') goto EndToSetWorkFile;
1629
1630            for(i+=2,i2=0;;i++,i2++){
1631                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1632                    temporary[i2]=0;
1633                    break;
1634                }
1635                temporary[i2]=buffer[i];
1636            }
1637            if(temporary[0]=='1') TreeView_Expand(pobj_FileTree->hTree,TreeView_GetRoot(pobj_FileTree->hTree),TVE_EXPAND);
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(hProcedureTreeView,TreeView_GetRoot(hProcedureTreeView),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            hTreeItem=TreeView_GetRoot(hMaterialTreeView);
1656            i2=0;
1657            while(hTreeItem){
1658                i2=GetOneParameter(temporary,i2,temp2);
1659                if(GetValue(temp2)) TreeView_Expand(hMaterialTreeView,hTreeItem,TVE_EXPAND);
1660                hTreeItem=TreeView_GetNextSibling(hMaterialTreeView,hTreeItem);
1661            }
1662        }
1663        else if(lstrcmp(temporary,"case3")==0){
1664            ////////////////////////////////////////
1665            // 古いフォーマットのワークファイル
1666
1667            LockWindowUpdate(hOwner);
1668            for(i=9,i2=0;;i++,i2++){
1669                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1670                    if(i2!=0){
1671                        temporary[i2]=0;
1672                        for(i3=0;;i3++){
1673                            if(temporary[i3]==','||temporary[i3]=='\0') break;
1674                        }
1675                        if(temporary[i3]=='\0') goto EndToSetWorkFile;
1676                        lstrcpy(temp2,temporary+i3+1);
1677                        temporary[i3]=0;
1678                        if(lstrcmpi(temporary,"text")==0){
1679                            for(i3=0;;i3++){
1680                                if(temp2[i3]==','||temp2[i3]=='\0') break;
1681                            }
1682                            if(temp2[i3]=='\0') goto EndToSetWorkFile;
1683                            lstrcpy(temporary,temp2+i3+1);
1684                            temp2[i3]=0;
1685                            GetFullPath(temporary,ProjectInfo.dir);
1686                            sscanf(temp2,"%d",&i3);
1687
1688                            //ファイルを開く
1689                            hChild=OpenFileWithExtension(temporary);
1690                            WndNum=GetWndNum(hChild);
1691
1692                            //キャレット位置をセット
1693                            TextEdit_SetSel(WndNum,i3,i3);
1694                        }
1695                        else if(lstrcmpi(temporary,"rad")==0){
1696                            for(i3=0;i3<ProjectInfo.NumberOfWindows;i3++){
1697                                if(lstrcmpi(ProjectInfo.pWindowInfo[i3].name,temp2)==0){
1698                                    NewRadWindow(i3);
1699                                    break;
1700                                }
1701                            }
1702                        }
1703                        else if(lstrcmpi(temporary,"menu")==0){
1704                            for(i3=0;i3<ProjectInfo.NumberOfMenu;i3++){
1705                                if(lstrcmpi(ProjectInfo.pMenuInfo[i3].IdName,temp2)==0){
1706                                    NewMenuWindow(&ProjectInfo.pMenuInfo[i3]);
1707                                    break;
1708                                }
1709                            }
1710                        }
1711                        else if(lstrcmpi(temporary,"icon")==0){
1712                            for(i3=0;i3<ProjectInfo.res.NumberOfIconRes;i3++){
1713                                if(lstrcmpi(ProjectInfo.res.pIconResInfo[i3].path,temp2)==0){
1714                                    GetFullPath(temp2,ProjectInfo.dir);
1715                                    NewIconEditWindow(temp2);
1716                                    break;
1717                                }
1718                            }
1719                        }
1720                        i++;
1721                        i2=-1;
1722                        continue;
1723                    }
1724                    else break;
1725                }
1726                temporary[i2]=buffer[i];
1727            }
1728
1729            for(i+=2,i2=0;;i++,i2++){
1730                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1731                    temporary[i2]=0;
1732                    break;
1733                }
1734                temporary[i2]=buffer[i];
1735            }
1736            sscanf(temporary,"%d",&i2);
1737
1738            switch( i2 ){
1739                case 0:
1740                    ShowFileView();
1741                    break;
1742                case 1:
1743                    ShowClassView();
1744                    break;
1745                case 2:
1746                    ShowMaterialView();
1747                    break;
1748            }
1749
1750            if(buffer[i]=='\0') goto EndToSetWorkFile;
1751
1752            for(i+=2,i2=0;;i++,i2++){
1753                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1754                    temporary[i2]=0;
1755                    break;
1756                }
1757                temporary[i2]=buffer[i];
1758            }
1759            if(temporary[0]=='1') TreeView_Expand(pobj_FileTree->hTree,TreeView_GetRoot(pobj_FileTree->hTree),TVE_EXPAND);
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(hProcedureTreeView,TreeView_GetRoot(hProcedureTreeView),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            hTreeItem=TreeView_GetRoot(hMaterialTreeView);
1778            i2=0;
1779            while(hTreeItem){
1780                i2=GetOneParameter(temporary,i2,temp2);
1781                if(GetValue(temp2)) TreeView_Expand(hMaterialTreeView,hTreeItem,TVE_EXPAND);
1782                hTreeItem=TreeView_GetNextSibling(hMaterialTreeView,hTreeItem);
1783            }
1784        }
1785EndToSetWorkFile:
1786        LockWindowUpdate(NULL);
1787        HeapDefaultFree(buffer);
1788    }
1789
1790
1791    //ウィンドウ タイトルを変更
1792    sprintf(temporary,"%s - %s",ProjectInfo.name,APPLICATION_NAME);
1793    SetWindowText(hOwner,temporary);
1794
1795
1796    ProjectInfo.modify=0;
1797    ProjectInfo.ModifyOfMaterial=0;
1798    ProjectInfo.ModifuOfResource=0;
1799}
1800BOOL ProjectModifyCheck(BOOL bRun){
1801    extern MDIINFO MdiInfo[MAX_WNDNUM];
1802    extern PROJECTINFO ProjectInfo;
1803    int i,WndNum,sw;
1804    HWND hChild;
1805    char temporary[MAX_PATH];
1806    if(ProjectInfo.modify||ProjectInfo.ModifyOfMaterial||ProjectInfo.ModifuOfResource){
1807        if(bRun==0||pobj_nv->bSaveCheckProject){
1808            //"\"%s\" プロジェクトは変更されています。保存しますか?"
1809            sprintf(temporary,STRING_MODIFYCHECK_PROJECT,ProjectInfo.name);
1810            i=MessageBox(hOwner,temporary,APPLICATION_NAME,MB_YESNOCANCEL|MB_ICONEXCLAMATION);
1811
1812            if(i==IDCANCEL) return 0;
1813            if(i==IDYES) SaveProject();
1814        }
1815        else SaveProject();
1816        return 1;
1817    }
1818    hChild=GetWindow(hClient,GW_CHILD);
1819    while(hChild){
1820        WndNum=GetWndNum(hChild);
1821        sw=0;
1822        if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
1823            if( MdiInfo[WndNum].pMdiTextEdit->IsModified() ){
1824                for(i=0;i<ProjectInfo.pobj_DBFileInfo->iNum;i++){
1825                    ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->GetFullPath(temporary);
1826                    if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0) sw=1;
1827                }
1828            }
1829        }
1830        else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
1831            if(MdiInfo[WndNum].MdiIconEditInfo->bModify){
1832                for(i=0;i<ProjectInfo.res.NumberOfIconRes;i++){
1833                    lstrcpy(temporary,ProjectInfo.res.pIconResInfo[i].path);
1834                    GetFullPath(temporary,ProjectInfo.dir);
1835                    if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0) sw=1;
1836                }
1837            }
1838        }
1839
1840        if(sw){
1841            if(bRun==0||pobj_nv->bSaveCheckProject){
1842                //"\"%s\" プロジェクトは変更されています。保存しますか?"
1843                sprintf(temporary,STRING_MODIFYCHECK_PROJECT,ProjectInfo.name);
1844                i=MessageBox(hOwner,temporary,APPLICATION_NAME,MB_YESNOCANCEL|MB_ICONEXCLAMATION);
1845
1846                if(i==IDCANCEL) return 0;
1847                if(i==IDYES) SaveProject();
1848            }
1849            else SaveProject();
1850            return 1;
1851        }
1852        hChild=GetNextWindow(hChild,GW_HWNDNEXT);
1853    }
1854    return 2;
1855}
1856_int8 CloseProject(void){
1857    extern HANDLE hHeap;
1858    extern MDIINFO MdiInfo[MAX_WNDNUM];
1859    extern PROJECTINFO ProjectInfo;
1860    int i,i2,WndNum;
1861    HWND hChild,hCloseChild;
1862    char temporary[MAX_PATH];
1863
1864
1865    //保存確認
1866    i=ProjectModifyCheck(0);
1867    if(i==0) return 0;
1868    else if(i==2) MakeWorkFile();
1869
1870    //プロジェクトに関するMDIウィンドウをすべて閉じる
1871    hChild=GetWindow(hClient,GW_CHILD);
1872    while(hChild){
1873        hCloseChild=hChild;
1874        hChild=GetNextWindow(hChild,GW_HWNDNEXT);
1875        WndNum=GetWndNum(hCloseChild);
1876        if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
1877            for(i=0;i<ProjectInfo.pobj_DBFileInfo->iNum;i++){
1878                ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->GetFullPath(temporary);
1879                if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
1880
1881                    //変更フラグをオフにする
1882                    MdiInfo[WndNum].pMdiTextEdit->UnModify();
1883
1884                    SendMessage(hCloseChild,WM_CLOSE,0,0);
1885                    break;
1886                }
1887            }
1888        }
1889        else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){
1890            for(i=0;i<ProjectInfo.NumberOfWindows;i++){
1891                if(lstrcmp(MdiInfo[WndNum].path,ProjectInfo.pWindowInfo[i].name)==0){
1892                    SendMessage(hCloseChild,WM_CLOSE,0,0);
1893                    break;
1894                }
1895            }
1896        }
1897        else if(MdiInfo[WndNum].DocType==WNDTYPE_MENU){
1898            for(i=0;i<ProjectInfo.NumberOfMenu;i++){
1899                if(lstrcmp(MdiInfo[WndNum].path,ProjectInfo.pMenuInfo[i].IdName)==0){
1900                    SendMessage(hCloseChild,WM_CLOSE,0,0);
1901                    break;
1902                }
1903            }
1904        }
1905        else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
1906            for(i=0;ProjectInfo.res.NumberOfIconRes;i++){
1907                lstrcpy(temporary,ProjectInfo.res.pIconResInfo[i].path);
1908                GetFullPath(temporary,ProjectInfo.dir);
1909                if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
1910                    SendMessage(hCloseChild,WM_CLOSE,0,0);
1911                    break;
1912                }
1913            }
1914        }
1915    }
1916
1917    //ファイル情報のメモリを解放
1918    delete ProjectInfo.pobj_DBFileInfo;
1919
1920    //ブレークポイントのオブジェクトを解放
1921    delete ProjectInfo.pobj_DBBreakPoint;
1922
1923    //ウィンドウ情報のメモリを解放
1924    for(i=0;i<ProjectInfo.NumberOfWindows;i++){
1925        HeapDefaultFree(ProjectInfo.pWindowInfo[i].name);
1926        HeapDefaultFree(ProjectInfo.pWindowInfo[i].HandleName);
1927        HeapDefaultFree(ProjectInfo.pWindowInfo[i].caption);
1928        HeapDefaultFree(ProjectInfo.pWindowInfo[i].ClassName);
1929        HeapDefaultFree(ProjectInfo.pWindowInfo[i].CallBackName);
1930        HeapDefaultFree(ProjectInfo.pWindowInfo[i].filepath);
1931        if(ProjectInfo.pWindowInfo[i].MenuID)
1932            HeapDefaultFree(ProjectInfo.pWindowInfo[i].MenuID);
1933        if(ProjectInfo.pWindowInfo[i].IconResName)
1934            HeapDefaultFree(ProjectInfo.pWindowInfo[i].IconResName);
1935
1936        //子ウィンドウのメモリを解放
1937        for(i2=0;i2<ProjectInfo.pWindowInfo[i].NumberOfChildWindows;i2++){
1938            HeapDefaultFree(ProjectInfo.pWindowInfo[i].pChildInfo[i2].IdName);
1939            HeapDefaultFree(ProjectInfo.pWindowInfo[i].pChildInfo[i2].caption);
1940            if(ProjectInfo.pWindowInfo[i].pChildInfo[i2].Control==CT_IMAGEBOX){
1941                //イメージ ボックスの場合
1942                HeapDefaultFree(ProjectInfo.pWindowInfo[i].pChildInfo[i2].ImageCtrlInfo.path);
1943            }
1944        }
1945        HeapDefaultFree(ProjectInfo.pWindowInfo[i].pChildInfo);
1946    }
1947    HeapDefaultFree(ProjectInfo.pWindowInfo);
1948
1949    //メニュー情報のメモリを解放
1950    HeapMenuDataFree(ProjectInfo.pMenuInfo,ProjectInfo.NumberOfMenu,0);
1951    HeapDefaultFree(ProjectInfo.pMenuInfo);
1952
1953    //リソースのメモリを解放
1954    for(i=0;i<ProjectInfo.res.NumberOfCursorRes;i++){
1955        HeapDefaultFree(ProjectInfo.res.pCursorResInfo[i].IdName);
1956        HeapDefaultFree(ProjectInfo.res.pCursorResInfo[i].path);
1957    }
1958    HeapDefaultFree(ProjectInfo.res.pCursorResInfo);
1959    for(i=0;i<ProjectInfo.res.NumberOfBitmapRes;i++){
1960        HeapDefaultFree(ProjectInfo.res.pBitmapResInfo[i].IdName);
1961        HeapDefaultFree(ProjectInfo.res.pBitmapResInfo[i].path);
1962    }
1963    HeapDefaultFree(ProjectInfo.res.pBitmapResInfo);
1964    for(i=0;i<ProjectInfo.res.NumberOfIconRes;i++){
1965        HeapDefaultFree(ProjectInfo.res.pIconResInfo[i].IdName);
1966        HeapDefaultFree(ProjectInfo.res.pIconResInfo[i].path);
1967    }
1968    HeapDefaultFree(ProjectInfo.res.pIconResInfo);
1969
1970    //プロジェクト ビューを非表示にする
1971    extern HWND hProjectView;
1972    if(IsWindowVisible(hProjectView)) SendMessage(hOwner,WM_COMMAND,IDM_PROJECTVIEW,0);
1973    SetWindowText(hProjectView,"Project View");
1974
1975    TreeView_DeleteAllItems(pobj_FileTree->hTree);
1976    TreeView_DeleteAllItems(hProcedureTreeView);
1977    TreeView_DeleteAllItems(hMaterialTreeView);
1978
1979    //ウィンドウ タイトルを変更
1980    SetWindowText(hOwner,APPLICATION_NAME);
1981
1982    ProjectInfo.name[0]=0;
1983
1984    //メニュー状態を設定
1985    ResetState_DocMenu();
1986
1987    return 1;
1988}
1989void MakeWorkFile(void){
1990    extern MDIINFO MdiInfo[MAX_WNDNUM];
1991    extern PROJECTINFO ProjectInfo;
1992    int i,i2,WndNum;
1993    char temporary[MAX_PATH],buffer[32767];
1994    HWND hChild;
1995    CHARRANGE CharRange;
1996
1997    //ワークファイル(*.wrk)を作成
1998    lstrcpy(buffer,"case4\r\n\r\n");
1999    i2=lstrlen(buffer);
2000
2001
2002    ///////////////////////
2003    //MDIウィンドウの並び
2004    hChild=GetWindow(GetWindow(hClient,GW_CHILD),GW_HWNDLAST);
2005    while(hChild){
2006        WndNum=GetWndNum(hChild);
2007        if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
2008            for(i=0;i<ProjectInfo.pobj_DBFileInfo->iNum;i++){
2009                ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->GetFullPath(temporary);
2010                if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
2011                    TextEdit_GetSel(WndNum,&CharRange);
2012
2013                    SCROLLINFO si;
2014                    POINT pos;
2015                    si.cbSize=sizeof(SCROLLINFO);
2016                    si.fMask=SIF_POS;
2017                    GetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_HORZ,&si);
2018                    pos.x=si.nPos;
2019                    GetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_VERT,&si);
2020                    pos.y=si.nPos;
2021
2022                    sprintf(buffer+i2,"text,\"%s\",%d,%d,%d,%d\r\n",
2023                        ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->m_path,
2024                        pos.x,
2025                        pos.y,
2026                        CharRange.cpMin,
2027                        CharRange.cpMax);
2028                    i2+=lstrlen(buffer+i2);
2029                    break;
2030                }
2031            }
2032        }
2033        else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){
2034            for(i=0;i<ProjectInfo.NumberOfWindows;i++){
2035                if(lstrcmpi(MdiInfo[WndNum].path,ProjectInfo.pWindowInfo[i].name)==0){
2036                    sprintf(buffer+i2,"rad,%s\r\n",MdiInfo[WndNum].path);
2037                    i2+=lstrlen(buffer+i2);
2038                    break;
2039                }
2040            }
2041        }
2042        else if(MdiInfo[WndNum].DocType==WNDTYPE_MENU){
2043            for(i=0;i<ProjectInfo.NumberOfMenu;i++){
2044                if(lstrcmpi(MdiInfo[WndNum].path,ProjectInfo.pMenuInfo[i].IdName)==0){
2045                    sprintf(buffer+i2,"menu,%s\r\n",MdiInfo[WndNum].path);
2046                    i2+=lstrlen(buffer+i2);
2047                    break;
2048                }
2049            }
2050        }
2051        else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
2052            for(i=0;i<ProjectInfo.res.NumberOfIconRes;i++){
2053                lstrcpy(temporary,ProjectInfo.res.pIconResInfo[i].path);
2054                GetFullPath(temporary,ProjectInfo.dir);
2055                if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
2056                    sprintf(buffer+i2,"icon,%s\r\n",ProjectInfo.res.pIconResInfo[i].path);
2057                    i2+=lstrlen(buffer+i2);
2058                    break;
2059                }
2060            }
2061        }
2062        hChild=GetNextWindow(hChild,GW_HWNDPREV);
2063    }
2064    lstrcpy(buffer+i2,"\r\n");
2065    i2+=2;
2066
2067
2068    //////////////////////////
2069    //ツリービューの展開状況
2070    sprintf(buffer+i2,"%d\r\n",TabCtrl_GetCurSel(hProjectViewTab));
2071    i2+=lstrlen(buffer+i2);
2072    TVITEM tvItem;
2073    memset(&tvItem,0,sizeof(TVITEM));
2074    tvItem.mask=TVIF_HANDLE|TVIF_STATE;
2075    tvItem.hItem=TreeView_GetRoot(pobj_FileTree->hTree);
2076    TreeView_GetItem(pobj_FileTree->hTree,&tvItem);
2077    if(tvItem.state&TVIS_EXPANDED) i=1;
2078    else i=0;
2079    sprintf(buffer+i2,"%d\r\n",i);
2080    i2+=lstrlen(buffer+i2);
2081
2082    tvItem.hItem=TreeView_GetRoot(hProcedureTreeView);
2083    TreeView_GetItem(hProcedureTreeView,&tvItem);
2084    if(tvItem.state&TVIS_EXPANDED) i=1;
2085    else i=0;
2086    sprintf(buffer+i2,"%d\r\n",i);
2087    i2+=lstrlen(buffer+i2);
2088
2089    tvItem.hItem=TreeView_GetRoot(hMaterialTreeView);
2090    while(tvItem.hItem){
2091        TreeView_GetItem(hMaterialTreeView,&tvItem);
2092        if(tvItem.state&TVIS_EXPANDED) i=1;
2093        else i=0;
2094        sprintf(buffer+i2,"%d",i);
2095        i2+=lstrlen(buffer+i2);
2096
2097        tvItem.hItem=TreeView_GetNextSibling(hMaterialTreeView,tvItem.hItem);
2098        if(tvItem.hItem){
2099            lstrcpy(buffer+i2,",");
2100            i2+=lstrlen(buffer+i2);
2101        }
2102    }
2103
2104
2105    //保存
2106    sprintf(temporary,"%s%s.wrk",ProjectInfo.dir,ProjectInfo.name);
2107    WriteBuffer(temporary,buffer,i2);
2108}
2109void SaveProject(void){
2110    extern MDIINFO MdiInfo[MAX_WNDNUM];
2111    extern PROJECTINFO ProjectInfo;
2112    int i,i2,i3,WndNum;
2113    char temporary[MAX_PATH],buffer[32767];
2114    HWND hChild;
2115
2116    //"プロジェクトを保存中..."
2117    SetStatusText(STRING_PROJECT_SAVING);
2118
2119    //プロジェクトファイルのバージョンを設定
2120    ProjectInfo.dwVersion=PROJECT_VERSION;
2121
2122    hChild=GetWindow(hClient,GW_CHILD);
2123    while(hChild){
2124        WndNum=GetWndNum(hChild);
2125        if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
2126            if( MdiInfo[WndNum].pMdiTextEdit->IsModified() ){
2127                for(i=0;i<ProjectInfo.pobj_DBFileInfo->iNum;i++){
2128                    ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->GetFullPath(temporary);
2129                    if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
2130                        SaveDocument(hChild,NULL);
2131                        break;
2132                    }
2133                }
2134            }
2135        }
2136        if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
2137            if(MdiInfo[WndNum].MdiIconEditInfo->bModify){
2138                for(i=0;i<ProjectInfo.res.NumberOfIconRes;i++){
2139                    lstrcpy(temporary,ProjectInfo.res.pIconResInfo[i].path);
2140                    GetFullPath(temporary,ProjectInfo.dir);
2141                    if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
2142                        SaveDocument(hChild,NULL);
2143                        break;
2144                    }
2145                }
2146            }
2147        }
2148        hChild=GetNextWindow(hChild,GW_HWNDNEXT);
2149    }
2150
2151
2152    //////////////////////////////////////
2153    //プロジェクトファイル(*.pj)を作成
2154    lstrcpy(buffer,"\' ActiveBasic Project file.\r\n\r\n");
2155    i2=lstrlen(buffer);
2156    sprintf(buffer+i2,"#VERSION=%d\r\n\r\n",ProjectInfo.dwVersion);
2157    i2+=lstrlen(buffer+i2);
2158    sprintf(buffer+i2,"#MODULETYPE=%d\r\n\r\n",ProjectInfo.dwModuleType);
2159    i2+=lstrlen(buffer+i2);
2160    sprintf(buffer+i2,"#NAME=%s\r\n\r\n",ProjectInfo.name);
2161    i2+=lstrlen(buffer+i2);
2162    extern HWND hSelectCompilerCombo;
2163    if(SendMessage(hSelectCompilerCombo,CB_GETCURSEL,0,0)==0){
2164        sprintf(buffer+i2,"#PLATFORM=32\r\n\r\n",ProjectInfo.name);
2165        i2+=lstrlen(buffer+i2);
2166    }
2167    else{
2168        sprintf(buffer+i2,"#PLATFORM=64\r\n\r\n",ProjectInfo.name);
2169        i2+=lstrlen(buffer+i2);
2170    }
2171    sprintf(buffer+i2,"#USEWINDOW=%d\r\n\r\n",ProjectInfo.NumberOfWindows);
2172    i2+=lstrlen(buffer+i2);
2173    sprintf(buffer+i2,"#OPTION=&H%08x\r\n\r\n",ProjectInfo.dwOption);
2174    i2+=lstrlen(buffer+i2);
2175    sprintf(buffer+i2,"#OUTPUT_RELEASE=%s\r\n\r\n",ProjectInfo.lpszOutput_Release);
2176    i2+=lstrlen(buffer+i2);
2177    sprintf(buffer+i2,"#OUTPUT_DEBUG=%s\r\n\r\n",ProjectInfo.lpszOutput_Debug);
2178    i2+=lstrlen(buffer+i2);
2179    sprintf(buffer+i2,"#MANIFEST=%s\r\n\r\n",ProjectInfo.szManifestPath);
2180    i2+=lstrlen(buffer+i2);
2181    sprintf(buffer+i2,"#DEBUG_CMD_LINE=%s\r\n\r\n",ProjectInfo.szCmdLine);
2182    i2+=lstrlen(buffer+i2);
2183    sprintf(buffer+i2,"#DEBUG_EXE_PATH=%s\r\n\r\n",ProjectInfo.szExePath);
2184    i2+=lstrlen(buffer+i2);
2185    if(ProjectInfo.ResourceFileName[0]){
2186        sprintf(buffer+i2,"#RESOURCE=%s\r\n\r\n",ProjectInfo.ResourceFileName);
2187        i2+=lstrlen(buffer+i2);
2188    }
2189    else{
2190        lstrcpy(buffer+i2,"#RESOURCE=0\r\n\r\n");
2191        i2+=lstrlen(buffer+i2);
2192    }
2193    sprintf(buffer+i2,"#SOURCE\r\n");
2194    i2+=lstrlen(buffer+i2);
2195    for(i=0;i<ProjectInfo.pobj_DBFileInfo->iNum;i++){
2196        sprintf(buffer+i2,"%s\r\n",ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->m_path);
2197        i2+=lstrlen(buffer+i2);
2198    }
2199
2200    //保存
2201    sprintf(temporary,"%s%s.pj",ProjectInfo.dir,ProjectInfo.name);
2202    WriteBuffer(temporary,buffer,i2);
2203
2204
2205    //////////////////////////////////
2206    // リソースファイル(*.rc、resource.ab)を作成
2207    if(ProjectInfo.ResourceFileName[0]){
2208        i2=0;
2209        i3=101;
2210        for(i=0;i<ProjectInfo.res.NumberOfCursorRes;i++,i3++){
2211            sprintf(buffer+i2,"Const %s=%d\r\n",
2212                ProjectInfo.res.pCursorResInfo[i].IdName,
2213                i3);
2214            i2+=lstrlen(buffer+i2);
2215        }
2216        for(i=0;i<ProjectInfo.res.NumberOfBitmapRes;i++,i3++){
2217            sprintf(buffer+i2,"Const %s=%d\r\n",
2218                ProjectInfo.res.pBitmapResInfo[i].IdName,
2219                i3);
2220            i2+=lstrlen(buffer+i2);
2221        }
2222        for(i=0;i<ProjectInfo.res.NumberOfIconRes;i++,i3++){
2223            sprintf(buffer+i2,"Const %s=%d\r\n",
2224                ProjectInfo.res.pIconResInfo[i].IdName,
2225                i3);
2226            i2+=lstrlen(buffer+i2);
2227        }
2228
2229        //保存(resource.ab)
2230        lstrcpy(temporary,"resource.ab");
2231        GetFullPath(temporary,ProjectInfo.dir);
2232        WriteBuffer(temporary,buffer,i2);
2233
2234        i2=0;
2235        for(i=0;i<ProjectInfo.res.NumberOfCursorRes;i++){
2236            sprintf(buffer+i2,"%s CURSOR \"%s\"\r\n",
2237                ProjectInfo.res.pCursorResInfo[i].IdName,
2238                ProjectInfo.res.pCursorResInfo[i].path);
2239            i2+=lstrlen(buffer+i2);
2240        }
2241        for(i=0;i<ProjectInfo.res.NumberOfBitmapRes;i++){
2242            sprintf(buffer+i2,"%s BITMAP \"%s\"\r\n",
2243                ProjectInfo.res.pBitmapResInfo[i].IdName,
2244                ProjectInfo.res.pBitmapResInfo[i].path);
2245            i2+=lstrlen(buffer+i2);
2246        }
2247        for(i=0;i<ProjectInfo.res.NumberOfIconRes;i++){
2248            sprintf(buffer+i2,"%s ICON \"%s\"\r\n",
2249                ProjectInfo.res.pIconResInfo[i].IdName,
2250                ProjectInfo.res.pIconResInfo[i].path);
2251            i2+=lstrlen(buffer+i2);
2252        }
2253
2254        //マニフェスト
2255        if(ProjectInfo.dwOption&PJ_OP_RC_MANIFEST){
2256            sprintf(buffer+i2,"CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST \"%s\"\r\n",
2257                ProjectInfo.szManifestPath);
2258            i2+=lstrlen(buffer+i2);
2259        }
2260
2261        //保存
2262        lstrcpy(temporary,ProjectInfo.ResourceFileName);
2263        GetFullPath(temporary,ProjectInfo.dir);
2264        WriteBuffer(temporary,buffer,i2);
2265    }
2266
2267
2268    ///////////////////////////////////////
2269    //インデックスファイル(*.idx)を作成
2270    buffer[0]=0;
2271    lstrcpy(buffer,"' インデックス プログラム\r\n");
2272    i2=lstrlen(buffer);
2273    if(ProjectInfo.dwOption&PJ_OP_SOURCE_MASK){
2274        if(ProjectInfo.dwOption&PJ_OP_STRICT){
2275            /* #strictディレクティブは今は使われていない
2276            lstrcpy(buffer+i2,"\r\n");
2277            i2+=lstrlen(buffer+i2);
2278            lstrcpy(buffer+i2,"#strict");
2279            i2+=lstrlen(buffer+i2);
2280            lstrcpy(buffer+i2,"\r\n");
2281            i2+=lstrlen(buffer+i2);
2282            */
2283        }
2284        lstrcpy(buffer+i2,"\r\n");
2285        i2+=lstrlen(buffer+i2);
2286        lstrcpy(buffer+i2,"'Win32APIの定義ファイル\r\n");
2287        i2+=lstrlen(buffer+i2);
2288        if(ProjectInfo.dwOption&PJ_OP_MMSYSTEM){
2289            lstrcpy(buffer+i2,"#include <api_mmsys.sbp>\r\n");
2290            i2+=lstrlen(buffer+i2);
2291        }
2292        if(ProjectInfo.dwOption&PJ_OP_COMMCTRL){
2293            lstrcpy(buffer+i2,"#include <api_commctrl.sbp>\r\n");
2294            i2+=lstrlen(buffer+i2);
2295        }
2296        if(ProjectInfo.dwOption&PJ_OP_RICHEDIT){
2297            lstrcpy(buffer+i2,"#include <api_richedit.sbp>\r\n");
2298            i2+=lstrlen(buffer+i2);
2299        }
2300        if(ProjectInfo.dwOption&PJ_OP_WINSOCK){
2301            lstrcpy(buffer+i2,"#include <api_winsock2.sbp>\r\n");
2302            i2+=lstrlen(buffer+i2);
2303        }
2304    }
2305    if(ProjectInfo.NumberOfWindows){
2306        lstrcpy(buffer+i2,"\r\n");
2307        i2+=lstrlen(buffer+i2);
2308        lstrcpy(buffer+i2,"'RADツールが生成するウィンドウ制御プログラム\r\n");
2309        i2+=lstrlen(buffer+i2);
2310        sprintf(buffer+i2,"#include \"Callback.wbp\"\r\n");
2311        i2+=lstrlen(buffer+i2);
2312    }
2313    if(ProjectInfo.pobj_DBFileInfo->iNum>1){
2314        lstrcpy(buffer+i2,"\r\n");
2315        i2+=lstrlen(buffer+i2);
2316        lstrcpy(buffer+i2,"'プロジェクト内のプログラム ファイル\r\n");
2317        i2+=lstrlen(buffer+i2);
2318        for(i=1;i<ProjectInfo.pobj_DBFileInfo->iNum;i++){
2319            //メインファイルは含まない
2320            sprintf(buffer+i2,"#include \"%s\"\r\n",ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->m_path);
2321            i2+=lstrlen(buffer+i2);
2322            lstrcpy(buffer+i2,"_ClearNamespaceImported\r\n");
2323            i2+=lstrlen(buffer+i2);
2324        }
2325    }
2326    if(ProjectInfo.NumberOfWindows){
2327        lstrcpy(buffer+i2,"\r\n");
2328        i2+=lstrlen(buffer+i2);
2329        lstrcpy(buffer+i2,"'RADツールが生成するウィンドウ生成プログラム\r\n");
2330        i2+=lstrlen(buffer+i2);
2331        sprintf(buffer+i2,"#include \"MakeWindow.wbp\"\r\n");
2332        i2+=lstrlen(buffer+i2);
2333    }
2334    if(ProjectInfo.ResourceFileName[0]){
2335        //リソースファイルが含まれる場合
2336        lstrcpy(buffer+i2,"\r\n");
2337        i2+=lstrlen(buffer+i2);
2338        lstrcpy(buffer+i2,"'リソースファイル\r\n");
2339        i2+=lstrlen(buffer+i2);
2340        lstrcpy(buffer+i2,"#include \"resource.ab\"\r\n");
2341        i2+=lstrlen(buffer+i2);
2342        sprintf(buffer+i2,"#resource \"%s.rc\"\r\n",ProjectInfo.name);
2343        i2+=lstrlen(buffer+i2);
2344    }
2345
2346    //保存
2347    sprintf(temporary,"%s%s.idx",ProjectInfo.dir,ProjectInfo.name);
2348    WriteBuffer(temporary,buffer,i2);
2349
2350
2351    if(ProjectInfo.NumberOfWindows){
2352        /////////////////////////////////////////////////////
2353        //ウィンドウ関連ファイル(*.wnd)を作成、保存
2354        if(ProjectInfo.ModifyOfMaterial){
2355            sprintf(temporary,"%s%s.wnd",ProjectInfo.dir,ProjectInfo.name);
2356            SaveWindowFile(temporary,ProjectInfo.pWindowInfo,ProjectInfo.NumberOfWindows);
2357        }
2358
2359        //.wbpファイルを生成
2360        SaveWindowProgram();
2361    }
2362
2363
2364    MakeWorkFile();
2365
2366    SetStatusText("");
2367
2368    ProjectInfo.modify=0;
2369    ProjectInfo.ModifuOfResource=0;
2370}
2371
2372BOOL SetProjectToRun(void){
2373    extern PROJECTINFO ProjectInfo;
2374    HANDLE hFind;
2375    WIN32_FIND_DATA wfd;
2376
2377    if(ProjectInfo.pobj_DBFileInfo->iNum==0){
2378        //"プログラム ファイルがプロジェクトに存在しません。"
2379        MessageBox(hOwner,STRING_ERROR_NOFILE,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
2380        return 0;
2381    }
2382
2383    extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
2384    hFind=FindFirstFile( ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ).c_str(), &wfd );
2385    if(hFind==INVALID_HANDLE_VALUE){
2386        //"BasicCompiler.exe が見つかりません"
2387        MessageBox(hOwner,STRING_ERROR_NOBASICCOMPILER,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
2388        return 0;
2389    }
2390    FindClose(hFind);
2391
2392    //プロジェクト構造のバージョンが違う時は、再保存する
2393    if(ProjectInfo.dwVersion<PROJECT_VERSION)
2394        ProjectInfo.ModifyOfMaterial=1;
2395
2396    //保存確認
2397    if(!ProjectModifyCheck(1)) return 0;
2398
2399    return 1;
2400}
2401BOOL IsNeedCompileForProject(BOOL bDebug){
2402    extern PROJECTINFO ProjectInfo;
2403    int i2;
2404    char temporary[MAX_PATH];
2405    HANDLE hFind,hFile;
2406    WIN32_FIND_DATA wfd;
2407    FILETIME SourceTime,ExeTime;
2408
2409    if(bDebug) lstrcpy(temporary,ProjectInfo.lpszOutput_Debug);
2410    else lstrcpy(temporary,ProjectInfo.lpszOutput_Release);
2411    GetFullPath(temporary,ProjectInfo.dir);
2412
2413    hFind=FindFirstFile(temporary,&wfd);
2414    if(hFind==INVALID_HANDLE_VALUE) return 1;
2415    FindClose(hFind);
2416
2417    hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
2418    GetFileTime(hFile,NULL,NULL,&ExeTime);
2419    CloseHandle(hFile);
2420
2421    for(i2=0;i2<ProjectInfo.pobj_DBFileInfo->iNum;i2++){
2422        ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i2]->GetFullPath(temporary);
2423        hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
2424        GetFileTime(hFile,NULL,NULL,&SourceTime);
2425        CloseHandle(hFile);
2426
2427        if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
2428            SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
2429            SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
2430    }
2431    if(ProjectInfo.NumberOfWindows){
2432        //CallBack.wbp
2433        lstrcpy(temporary,"CallBack.wbp");
2434        GetFullPath(temporary,ProjectInfo.dir);
2435        hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
2436        GetFileTime(hFile,NULL,NULL,&SourceTime);
2437        CloseHandle(hFile);
2438        if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
2439            SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
2440            SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
2441
2442        //MakeWindow.wbp
2443        lstrcpy(temporary,"MakeWindow.wbp");
2444        GetFullPath(temporary,ProjectInfo.dir);
2445        hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
2446        GetFileTime(hFile,NULL,NULL,&SourceTime);
2447        CloseHandle(hFile);
2448        if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
2449            SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
2450            SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
2451    }
2452    return 0;
2453}
Note: See TracBrowser for help on using the repository browser.