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

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

Projectクラスをリファクタリング中。

File size: 67.6 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    int i,i2,WndNum;
47    char str[MAX_PATH],temporary[MAX_PATH];
48    HWND hTree,hChild;
49    HTREEITEM hTreeItem,hTreeItem2;
50    TV_HITTESTINFO tvHitTestInfo;
51    TVITEM tvItem;
52
53    switch(message){
54        case WM_CONTEXTMENU:
55            i=TabCtrl_GetCurSel(hwnd);
56            if(i==0){
57                //ファイルツリー
58                POINT pos;
59                pos.x=LOWORD(lParam);
60                pos.y=HIWORD(lParam);
61                pobj_FileTree->ContextMenu(&pos);
62                return 0;
63            }
64            else if(i==1) hTree=hProcedureTreeView;
65            else if(i==2) hTree=hMaterialTreeView;
66            tvHitTestInfo.pt.x=LOWORD(lParam);
67            tvHitTestInfo.pt.y=HIWORD(lParam);
68            ScreenToClient(hTree,&tvHitTestInfo.pt);
69            hTreeItem=TreeView_HitTest(hTree,&tvHitTestInfo);
70            if(hTreeItem){
71                TreeView_SelectItem(hTree,hTreeItem);
72                if(i==1){
73                    extern HMENU hProcedureTreeMenuBase;
74                    if(TreeView_GetRoot(hTree)!=hTreeItem)
75                        TrackPopupMenu(GetSubMenu(hProcedureTreeMenuBase,1),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
76                }
77                else if(i==2){
78                    extern HMENU hMaterialTreeMenuBase;
79                    hTreeItem2=TreeView_GetRoot(hTree);
80                    for(i2=0;;i2++){
81                        if(hTreeItem2==hTreeItem) break;
82                        hTreeItem2=TreeView_GetNextSibling(hTree,hTreeItem2);
83                        if(!hTreeItem2) break;
84                    }
85                    if(hTreeItem2){
86                        if(i2==0)
87                            TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,0),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
88                        else if(i2==1)
89                            TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,2),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
90                        else if(i2==2)
91                            TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,4),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
92                        else if(i2==3)
93                            TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,6),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
94                        else if(i2==4)
95                            TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,8),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
96                    }
97                    else{
98                        hTreeItem=TreeView_GetNextItem(hTree,hTreeItem,TVGN_PARENT);
99                        hTreeItem2=TreeView_GetRoot(hTree);
100                        for(i2=0;;i2++){
101                            if(hTreeItem2==hTreeItem) break;
102                            hTreeItem2=TreeView_GetNextSibling(hTree,hTreeItem2);
103                            if(!hTreeItem2) break;
104                        }
105                        if(hTreeItem2){
106                            if(i2==0)
107                                TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,1),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
108                            else if(i2==1)
109                                TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,3),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
110                            else if(i2==2)
111                                TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,5),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
112                            else if(i2==3)
113                                TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,7),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
114                            else if(i2==4)
115                                TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,9),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
116                        }
117                    }
118                }
119            }
120            break;
121        case WM_COMMAND:
122            switch(LOWORD(wParam)){
123
124                case IDM_PROCEDURETREE_SHOW:
125                    extern BOOL bSearchingClasses;
126                    if(bSearchingClasses){
127                        pobj_ClassTreeView->bShowSwitch=1;
128                        break;
129                    }
130
131                    hTreeItem=TreeView_GetSelection(hProcedureTreeView);
132                    for(i=0;i<pobj_ClassTreeView->NumberOfProcedures;i++){
133                        if(pobj_ClassTreeView->pProcInfo[i].hTreeItem==hTreeItem){
134
135                            if( projectInfo.IsOpened() ){
136                                // 対象ファイルを開く
137                                lstrcpy(temporary,
138                                    projectInfo.pobj_DBFileInfo->ppobj_FileInfo[pobj_ClassTreeView->pProcInfo[i].FileNum]->m_path);
139                                GetFullPath(temporary,projectInfo.dir);
140                                hChild=OpenFileWithExtension(temporary);
141                            }
142                            else{
143                                hChild = GetWindow(hClient,GW_CHILD);
144                            }
145
146                            //プロシージャの行を選択する
147                            //ResetScrollbarが再描画時に呼び出されるので、再描画する
148                            WndNum=GetWndNum(hChild);
149                            InvalidateRect(MdiInfo[WndNum].pMdiTextEdit->hEdit,NULL,0);
150                            UpdateWindow(MdiInfo[WndNum].pMdiTextEdit->hEdit);
151                            TextEdit_SelectOneLine(WndNum,pobj_ClassTreeView->pProcInfo[i].code_pos,TRUE);
152
153                            //タイマーをセット
154                            // ※フォーカスをエディタにセットするため
155                            // ※タイミングを遅らせてSetFocusを実行する必要あり
156                            SetTimer(hwnd,100,10,NULL);
157
158                            break;
159                        }
160                    }
161
162                    break;
163
164                case IDM_MATERIALTREE_INSERTCURSOR:
165                    Project_CursorResInsert();
166                    break;
167                case IDM_MATERIALTREE_INSERTBITMAP:
168                    Project_BitmapResInsert();
169                    break;
170                case IDM_MATERIALTREE_INSERTICON:
171                    Project_IconResInsert();
172                    break;
173                case IDM_MATERIALTREE_INSERTMENU:
174                    Project_Menu_Insert();
175                    break;
176                case IDM_MATERIALTREE_INSERTWINDOW:
177                    Project_Window_Insert();
178                    break;
179                case IDM_MATERIALTREE_OPEN:
180                    hTreeItem=TreeView_GetSelection(hMaterialTreeView);
181                    for(i=0;i<static_cast<int>(projectInfo.windowInfos.size());i++){
182                        if(projectInfo.windowInfos[i]->hTreeItem==hTreeItem){
183                            NewRadWindow( *projectInfo.windowInfos[i] );
184                            break;
185                        }
186                    }
187                    for(i=0;i<projectInfo.NumberOfMenu;i++){
188                        if(projectInfo.pMenuInfo[i].hTreeItem==hTreeItem){
189                            NewMenuWindow(&projectInfo.pMenuInfo[i]);
190                            break;
191                        }
192                    }
193                    for(i=0;i<projectInfo.res.NumberOfIconRes;i++){
194                        if(projectInfo.res.pIconResInfo[i].hTreeItem==hTreeItem){
195                            lstrcpy(temporary,projectInfo.res.pIconResInfo[i].path);
196                            GetFullPath(temporary,projectInfo.dir);
197                            NewIconEditWindow(temporary);
198                            break;
199                        }
200                    }
201                    break;
202                case IDM_MATERIALTREE_DELETE:
203                    hTreeItem=TreeView_GetSelection(hMaterialTreeView);
204                    for(i=0;i<projectInfo.res.NumberOfCursorRes;i++){
205                        if(projectInfo.res.pCursorResInfo[i].hTreeItem==hTreeItem){
206
207                            //"%s カーソルをプロジェクトから削除します。よろしいですか?"
208                            sprintf(str,STRING_PJ_CHECK_DELETECURSOR,projectInfo.res.pCursorResInfo[i].IdName);
209                            if(IDCANCEL==MessageBox(hOwner,str,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
210
211                            Project_Cursor_Delete(i);
212                            break;
213                        }
214                    }
215                    for(i=0;i<projectInfo.res.NumberOfBitmapRes;i++){
216                        if(projectInfo.res.pBitmapResInfo[i].hTreeItem==hTreeItem){
217
218                            //"%s ビットマップをプロジェクトから削除します。よろしいですか?"
219                            sprintf(str,STRING_PJ_CHECK_DELETEBITMAP,projectInfo.res.pBitmapResInfo[i].IdName);
220                            if(IDCANCEL==MessageBox(hOwner,str,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
221
222                            Project_Bitmap_Delete(i);
223                            break;
224                        }
225                    }
226                    for(i=0;i<projectInfo.res.NumberOfIconRes;i++){
227                        if(projectInfo.res.pIconResInfo[i].hTreeItem==hTreeItem){
228
229                            //"%s アイコンをプロジェクトから削除します。よろしいですか?"
230                            sprintf(str,STRING_PJ_CHECK_DELETEICON,projectInfo.res.pIconResInfo[i].IdName);
231                            if(IDCANCEL==MessageBox(hOwner,str,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
232
233                            Project_Icon_Delete(i);
234                            break;
235                        }
236                    }
237                    for(i=0;i<projectInfo.NumberOfMenu;i++){
238                        if(projectInfo.pMenuInfo[i].hTreeItem==hTreeItem){
239
240                            //"%s メニューをプロジェクトから削除します。よろしいですか?"
241                            sprintf(str,STRING_PJ_CHECK_DELETEMENU,projectInfo.pMenuInfo[i].IdName);
242                            if(IDCANCEL==MessageBox(hOwner,str,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
243
244                            Project_Menu_Delete(i);
245                            break;
246                        }
247                    }
248                    for(i=0;i<static_cast<int>(projectInfo.windowInfos.size());i++){
249                        if(projectInfo.windowInfos[i]->hTreeItem==hTreeItem){
250
251                            //"%s ウィンドウをプロジェクトから削除します。よろしいですか?"
252                            sprintf(str,STRING_PJ_CHECK_DELETEWINDOW,projectInfo.windowInfos[i]->GetName().c_str());
253                            if(IDCANCEL==MessageBox(hOwner,str,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
254
255                            Project_Window_Delete(i);
256                            break;
257                        }
258                    }
259                    break;
260                case IDM_MENUTREE_RENAMEID:
261                    extern char NewIdName[MAX_PATH];
262                    hTreeItem=TreeView_GetSelection(hMaterialTreeView);
263                    for(i=0;i<projectInfo.res.NumberOfCursorRes;i++){
264                        if(projectInfo.res.pCursorResInfo[i].hTreeItem==hTreeItem){
265                            Project_Cursor_RenameID(i);
266                            break;
267                        }
268                    }
269                    for(i=0;i<projectInfo.res.NumberOfBitmapRes;i++){
270                        if(projectInfo.res.pBitmapResInfo[i].hTreeItem==hTreeItem){
271                            Project_Bitmap_RenameID(i);
272                            break;
273                        }
274                    }
275                    for(i=0;i<projectInfo.res.NumberOfIconRes;i++){
276                        if(projectInfo.res.pIconResInfo[i].hTreeItem==hTreeItem){
277                            Project_Icon_RenameID(i);
278                        }
279                    }
280                    for(i=0;i<projectInfo.NumberOfMenu;i++){
281                        if(projectInfo.pMenuInfo[i].hTreeItem==hTreeItem){
282                            if(!DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_INPUTID),hOwner,(DLGPROC)DlgProject_MenuID_Input,(long)projectInfo.pMenuInfo[i].IdName)) break;
283
284                            //重複チェック
285                            for(i2=0;i2<projectInfo.NumberOfMenu;i2++){
286                                if(i2==i) continue;
287                                if(lstrcmp(NewIdName,projectInfo.pMenuInfo[i2].IdName)==0){
288                                    //"ID \"%s\" は既にプロジェクト内に存在します。"
289                                    sprintf(temporary,STRING_DUPLICATIONERROR_ID_IN_PROJECT,NewIdName);
290                                    MessageBox(hOwner,temporary,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
291                                    return 0;
292                                }
293                            }
294
295                            HeapDefaultFree(projectInfo.pMenuInfo[i].IdName);
296                            projectInfo.pMenuInfo[i].IdName=(char *)HeapAlloc(hHeap,0,lstrlen(NewIdName)+1);
297                            lstrcpy(projectInfo.pMenuInfo[i].IdName,NewIdName);
298
299                            tvItem.hItem=hTreeItem;
300                            tvItem.mask=TVIF_TEXT;
301                            tvItem.pszText=projectInfo.pMenuInfo[i].IdName;
302                            tvItem.cchTextMax=lstrlen(projectInfo.pMenuInfo[i].IdName)+1;
303                            TreeView_SetItem(hMaterialTreeView,&tvItem);
304
305                            projectInfo.ModifyOfMaterial=1;
306
307                            TreeView_SortChildren(hMaterialTreeView,
308                                TreeView_GetParent(hMaterialTreeView,hTreeItem),
309                                0);
310                            break;
311                        }
312                    }
313                    break;
314                case IDM_MATERIALTREE_ICON_SETMAIN:
315                    RESITEMINFO TempIconResInfo;
316                    hTreeItem=TreeView_GetSelection(hMaterialTreeView);
317                    for(i=0;i<projectInfo.res.NumberOfIconRes;i++){
318                        if(projectInfo.res.pIconResInfo[i].hTreeItem==hTreeItem){
319                            if(i==0) break;
320
321                            TempIconResInfo=projectInfo.res.pIconResInfo[i];
322                            for(;i>0;i--)
323                                projectInfo.res.pIconResInfo[i]=projectInfo.res.pIconResInfo[i-1];
324                            projectInfo.res.pIconResInfo[0]=TempIconResInfo;
325
326                            tvItem.hItem=projectInfo.res.pIconResInfo[1].hTreeItem;
327                            tvItem.mask=TVIF_TEXT;
328                            tvItem.pszText=projectInfo.res.pIconResInfo[1].IdName;
329                            tvItem.cchTextMax=lstrlen(projectInfo.res.pIconResInfo[1].IdName)+1;
330                            TreeView_SetItem(hMaterialTreeView,&tvItem);
331
332                            tvItem.hItem=projectInfo.res.pIconResInfo[0].hTreeItem;
333                            tvItem.mask=TVIF_TEXT;
334                            sprintf(temporary,"%s (Main)",projectInfo.res.pIconResInfo[0].IdName);
335                            tvItem.pszText=temporary;
336                            tvItem.cchTextMax=lstrlen(temporary)+1;
337                            TreeView_SetItem(hMaterialTreeView,&tvItem);
338
339                            projectInfo.ModifuOfResource=1;
340                            break;
341                        }
342                    }
343                    break;
344            }
345            break;
346        case WM_TIMER:
347            KillTimer(hwnd,wParam);
348
349            //フォーカスをエディタにセット
350            SetFocus(GetWindow(GetWindow(hClient,GW_CHILD),GW_CHILD));
351            break;
352        case WM_NOTIFY:
353            NMHDR *hdr;
354            hdr=(NMHDR *)lParam;
355            if(hdr->code==NM_DBLCLK){
356                if(hdr->hwndFrom==hProcedureTreeView) SendMessage(hwnd,WM_COMMAND,IDM_PROCEDURETREE_SHOW,0);
357                else if(hdr->hwndFrom==hMaterialTreeView) SendMessage(hwnd,WM_COMMAND,IDM_MATERIALTREE_OPEN,0);
358            }
359            if(hdr->code==TVN_ITEMEXPANDEDW||hdr->code==TVN_ITEMEXPANDED){
360                NMTREEVIEW *nmTreeView;
361                TVITEM tvItem;
362                nmTreeView=(NMTREEVIEW *)lParam;
363                tvItem.mask=TVIF_HANDLE|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
364                tvItem.hItem=nmTreeView->itemNew.hItem;
365                TreeView_GetItem(nmTreeView->hdr.hwndFrom,&tvItem);
366                if(tvItem.iImage==0||tvItem.iImage==1){
367                    if(nmTreeView->action==TVE_EXPAND){
368                        tvItem.iImage=1;
369                        tvItem.iSelectedImage=1;
370                    }
371                    else if(nmTreeView->action==TVE_COLLAPSE){
372                        tvItem.iImage=0;
373                        tvItem.iSelectedImage=0;
374                    }
375                    tvItem.hItem=nmTreeView->itemNew.hItem;
376                    TreeView_SetItem(nmTreeView->hdr.hwndFrom,&tvItem);
377                }
378            }
379            break;
380    }
381    return CallWindowProc(OldTabProc,hwnd,message,wParam,lParam);
382}
383void ResizeProjectView_ToolWindow(void){
384    extern HWND hProjectView_ToolWindow;
385    RECT rect;
386    GetClientRect(hProjectView_ToolWindow,&rect);
387    SendMessage(hProjectView_ToolWindow,WM_SIZE,0,MAKELONG(rect.right,rect.bottom));
388}
389LRESULT CALLBACK ProjectView_ToolWindowProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
390    extern HWND hProjectView;
391    switch(message){
392        case WM_SIZE:
393            MoveWindow(hProjectView,0,0,
394                LOWORD(lParam),
395                HIWORD(lParam),1);
396            return 0;
397        case WM_CLOSE:
398            SendMessage(hOwner,WM_COMMAND,IDM_PROJECTVIEW,0);
399            return 0;
400    }
401    return DefWindowProc(hwnd,message,wParam,lParam);
402}
403void ShowFileView(){
404    TabCtrl_SetCurSel(hProjectViewTab,0);
405    ShowWindow(pobj_FileTree->hTree,SW_SHOW);
406    ShowWindow(hProcedureTreeView,SW_HIDE);
407    ShowWindow(hMaterialTreeView,SW_HIDE);
408}
409void ShowClassView(){
410    TabCtrl_SetCurSel(hProjectViewTab,1);
411    ShowWindow(pobj_FileTree->hTree,SW_HIDE);
412    ShowWindow(hMaterialTreeView,SW_HIDE);
413    ShowWindow(hProcedureTreeView,SW_SHOW);
414}
415void ShowMaterialView(){
416    TabCtrl_SetCurSel(hProjectViewTab,2);
417    ShowWindow(pobj_FileTree->hTree,SW_HIDE);
418    ShowWindow(hProcedureTreeView,SW_HIDE);
419    ShowWindow(hMaterialTreeView,SW_SHOW);
420}
421LRESULT CALLBACK ProjectViewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
422    extern HINSTANCE hInst,hResInst;
423    extern HWND hTabOfProjectView;
424    extern HFONT hStatusFont;
425    extern HWND hProjectView_ToolWindow;
426    RECT rect;
427    HWND hButton;
428
429    switch(message){
430        case WM_CREATE:
431            hProjectViewTab=CreateWindow(WC_TABCONTROL,NULL,
432                WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
433                0,0,0,0,hwnd,0,hInst,0);
434            SendMessage(hProjectViewTab,WM_SETFONT,(long)hStatusFont,0);
435
436            hButton=CreateWindow("BUTTON","↓",WS_CHILD|WS_VISIBLE,
437                0,0,30,13,
438                hwnd,(HMENU)IDC_CLIP,hInst,0);
439            SendMessage(hButton,WM_SETFONT,(long)hStatusFont,0);
440
441            OldTabProc=(WNDPROC)GetWindowLongPtr(hProjectViewTab,GWLP_WNDPROC);
442            SetWindowLongPtr(hProjectViewTab,GWLP_WNDPROC,(long)TabProc);
443
444            //タブを設定
445            TC_ITEM tcItem;
446            tcItem.mask=TCIF_TEXT;
447            tcItem.pszText="File";
448            TabCtrl_InsertItem(hProjectViewTab,0,&tcItem);
449            tcItem.mask=TCIF_TEXT;
450            tcItem.pszText="Class";
451            TabCtrl_InsertItem(hProjectViewTab,1,&tcItem);
452            tcItem.mask=TCIF_TEXT;
453            tcItem.pszText="Material";
454            TabCtrl_InsertItem(hProjectViewTab,2,&tcItem);
455
456            //ファイルツリービューを作成
457            pobj_FileTree=new CFileTree(hProjectViewTab);
458
459            //クラスツリービューを作成
460            hProcedureTreeView=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
461                WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
462                0,0,0,0,
463                hProjectViewTab,0,hInst,0);
464            OldProcedureTreeViewProc=(WNDPROC)GetWindowLongPtr(hProcedureTreeView,GWLP_WNDPROC);
465            SetWindowLongPtr(hProcedureTreeView,GWLP_WNDPROC,(long)ProcedureTreeViewProc);
466            //イメージリスト読み込み、設定
467            hProcedureTreeViewImageList=ImageList_Create(16,16,ILC_COLOR24|ILC_MASK,8,0);
468            ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FOLDER_CLOSE)));
469            ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FOLDER_OPEN)));
470            ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_PROCEDURE)));
471            ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_PROGRAM_FOLDER)));
472            ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_MEMBER_PUBLIC_VARIABLE)));
473            ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_MEMBER_PUBLIC_FUNCTION)));
474            ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_MEMBER_PRIVATE_VARIABLE)));
475            ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_MEMBER_PRIVATE_FUNCTION)));
476            TreeView_SetImageList(hProcedureTreeView,hProcedureTreeViewImageList,TVSIL_NORMAL);
477
478            //マテリアルツリービューを作成
479            hMaterialTreeView=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
480                WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
481                0,0,0,0,
482                hProjectViewTab,0,hInst,0);
483            OldMaterialTreeViewProc=(WNDPROC)GetWindowLongPtr(hMaterialTreeView,GWLP_WNDPROC);
484            SetWindowLongPtr(hMaterialTreeView,GWLP_WNDPROC,(long)MaterialTreeViewProc);
485            //イメージリスト読み込み、設定
486            hMaterialTreeViewImageList=ImageList_Create(16,16,ILC_COLOR24|ILC_MASK,3,0);
487            ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FOLDER_CLOSE)));
488            ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FOLDER_OPEN)));
489            ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_WINDOW)));
490            ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_MENU)));
491            ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FILE_ICON)));
492            ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FILE_BMP)));
493            ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FILE_CURSOR)));
494            TreeView_SetImageList(hMaterialTreeView,hMaterialTreeViewImageList,TVSIL_NORMAL);
495
496            ShowWindow(pobj_FileTree->hTree,SW_SHOW);
497            GetClientRect(hwnd,&rect);
498            SendMessage(hwnd,WM_SIZE,0,MAKELONG(rect.right,rect.bottom));
499            return 0;
500        case WM_COMMAND:
501            switch(LOWORD(wParam)){
502                case IDC_CLIP:
503                    if(pobj_nv->bClipProjectView==0){
504                        pobj_nv->bClipProjectView=1;
505
506                        SetWindowLongPtr(hwnd,GWL_EXSTYLE,WS_EX_STATICEDGE);
507                        SetParent(hwnd,hOwner);
508                        ResizeOwnerWnd();
509
510                        ShowWindow(hProjectView_ToolWindow,SW_HIDE);
511                    }
512                    else{
513                        pobj_nv->bClipProjectView=0;
514
515                        SetWindowLongPtr(hwnd,GWL_EXSTYLE,0);
516
517                        SetParent(hwnd,hProjectView_ToolWindow);
518
519                        ResizeOwnerWnd();
520                        ResizeProjectView_ToolWindow();
521
522                        ShowWindow(hProjectView_ToolWindow,SW_SHOW);
523                    }
524                    return 0;
525            }
526            break;
527        case WM_NOTIFY:
528            NMHDR *hdr;
529            hdr=(NMHDR *)lParam;
530            if(hdr->hwndFrom==hProjectViewTab&&hdr->code==TCN_SELCHANGE){
531                switch( TabCtrl_GetCurSel(hProjectViewTab) ){
532                    case 0:
533                        ShowFileView();
534                        break;
535                    case 1:
536                        ShowClassView();
537                        break;
538                    case 2:
539                        ShowMaterialView();
540                        break;
541                }
542            }
543            return 0;
544        case WM_PAINT:
545            PAINTSTRUCT ps;
546            HDC hdc;
547            HFONT hOldFont;
548            SIZE size;
549            HBRUSH hBrush,hOldBrush;
550            HPEN hPen,hOldPen;
551            char temporary[MAX_PATH];
552
553            if(pobj_nv->bClipProjectView==0) break;
554
555            hBrush=CreateSolidBrush(GetSysColor(COLOR_3DSHADOW));
556            hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DSHADOW));
557
558            hdc=BeginPaint(hwnd,&ps);
559
560            hOldFont=(HFONT)SelectObject(hdc,hStatusFont);
561            if( projectInfo.IsOpened() ){
562                sprintf(temporary,"%s \'%s\'",STRING_PROJECT,projectInfo.GetName().c_str());
563            }
564            else{
565                lstrcpy( temporary, "現在のドキュメント" );
566            }
567
568            GetTextExtentPoint32(hdc,temporary,lstrlen(temporary),&size);
569            GetClientRect(hwnd,&rect);
570            rect.left++;
571            rect.top++;
572            rect.right--;
573            rect.bottom=size.cy+2;
574
575            hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
576            hOldPen=(HPEN)SelectObject(hdc,hPen);
577            Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom);
578            SelectObject(hdc,hOldBrush);
579            SelectObject(hdc,hPen);
580
581            rect.top++;
582            rect.bottom--;
583            SetBkMode(hdc,OPAQUE);
584            SetBkColor(hdc,GetSysColor(COLOR_3DSHADOW));
585            SetTextColor(hdc,GetSysColor(COLOR_3DHILIGHT));
586            DrawText(hdc,temporary,lstrlen(temporary),&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
587
588            EndPaint(hwnd,&ps);
589
590            DeleteObject(hBrush);
591            DeleteObject(hPen);
592            return 0;
593        case WM_SIZE:
594            if(pobj_nv->bClipProjectView){
595                MoveWindow(hProjectViewTab,
596                    LEVER_THICK,
597                    LEVER_THICK+11,
598                    LOWORD(lParam)-LEVER_THICK*2,
599                    HIWORD(lParam)-LEVER_THICK*2-21,1);
600
601                GetClientRect(hProjectViewTab,&rect);
602                TabCtrl_AdjustRect(hProjectViewTab,FALSE,&rect);
603                rect.left-=2;
604                rect.right++;
605                rect.bottom++;
606
607                pobj_FileTree->resize(rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top);
608                MoveWindow(hProcedureTreeView,
609                    rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
610                MoveWindow(hMaterialTreeView,
611                    rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
612
613                GetClientRect(GetDlgItem(hwnd,IDC_CLIP),&rect);
614                MoveWindow(GetDlgItem(hwnd,IDC_CLIP),LOWORD(lParam)-rect.right,HIWORD(lParam)-rect.bottom,rect.right,rect.bottom,1);
615                InvalidateRect(GetDlgItem(hwnd,IDC_CLIP),NULL,0);
616            }
617            else{
618                MoveWindow(hProjectViewTab,0,0,
619                    LOWORD(lParam),
620                    HIWORD(lParam)-15,1);
621
622                GetClientRect(hProjectViewTab,&rect);
623                TabCtrl_AdjustRect(hProjectViewTab,FALSE,&rect);
624
625                pobj_FileTree->resize(rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top);
626                MoveWindow(hProcedureTreeView,
627                    rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
628                MoveWindow(hMaterialTreeView,
629                    rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
630
631                GetClientRect(GetDlgItem(hwnd,IDC_CLIP),&rect);
632                MoveWindow(GetDlgItem(hwnd,IDC_CLIP),LOWORD(lParam)-rect.right,HIWORD(lParam)-rect.bottom,rect.right,rect.bottom,1);
633            }
634            return 0;
635        case WM_CLOSE:
636            SendMessage(hOwner,WM_COMMAND,IDM_PROJECTVIEW,0);
637            return 0;
638        case WM_DESTROY:
639            delete pobj_FileTree;
640            ImageList_Destroy(hProcedureTreeViewImageList);
641            ImageList_Destroy(hMaterialTreeViewImageList);
642            return 0;
643    }
644    return DefWindowProc(hwnd,message,wParam,lParam);
645}
646
647void Project_File_Insert(char *path){
648    extern HANDLE hHeap;
649    char temporary[MAX_PATH],temp2[MAX_PATH];
650
651    GetRelationalPath(path,projectInfo.dir);
652
653    //重複チェック
654    if(projectInfo.pobj_DBFileInfo->dupli_check(path)){
655        //"\"%s\" ファイルは既にプロジェクト内に存在します。"
656        sprintf(temporary,STRING_DUPLICATIONERROR_FILE_IN_PROJECT,path);
657        MessageBox(hOwner,temporary,APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
658        return;
659    }
660
661
662    //////////////////////
663    //ツリービューに追加
664    HTREEITEM hTreeItem;
665    _splitpath(path,0,0,temporary,temp2);
666    lstrcat(temporary,temp2);
667    hTreeItem=pobj_FileTree->insert(temporary);
668
669
670    //projectInfo.ppobj_DBFileInfoオブジェクトに追加
671    projectInfo.pobj_DBFileInfo->add(path,hTreeItem);
672
673
674    projectInfo.modify=1;
675
676    //ファイル操作によるクラスビューの再表示
677    ResetClassTree(-1);
678}
679void Project_File_Delete(HTREEITEM hTreeItem){
680    extern HANDLE hHeap;
681
682    if(projectInfo.pobj_DBFileInfo->IsMainFile(hTreeItem)){
683        //"このファイルはプロジェクトのメイン ファイルです。プロジェクト内から削除することはできません。"
684        MessageBox(hOwner,STRING_ERROR_CANT_MAINFILE,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
685        return;
686    }
687
688    //ツリービューから削除
689    TreeView_DeleteItem(pobj_FileTree->hTree,hTreeItem);
690
691    //projectInfo.pobj_DBFileInfoオブジェクトから削除
692    projectInfo.pobj_DBFileInfo->del(hTreeItem);
693
694    projectInfo.modify=1;
695
696    //ファイル操作によるクラスビューの再表示
697    ResetClassTree(-1);
698}
699
700void MakeNewProject(){
701    extern HANDLE hHeap;
702    extern NEWPROJECTINFO NewProjectInfo;
703    int i;
704    char buffer[GENERAL_SIZE],dir[MAX_PATH],temporary[MAX_PATH],*pTemp;
705    HANDLE hFind;
706    WIN32_FIND_DATA wfd;
707
708    //既にプロジェクトが開かれている場合は閉じる
709    if( projectInfo.IsOpened() ){
710        if(!projectInfo.Close()) return;
711    }
712
713    //ワークディレクトリを作成
714    i=lstrlen(pobj_nv->ProjectSaveDir);
715    if(pobj_nv->ProjectSaveDir[i-1]=='\\'&&pobj_nv->ProjectSaveDir[i-2]!=':') pobj_nv->ProjectSaveDir[i-1]=0;
716    sprintf(dir,"%s\\%s\\",pobj_nv->ProjectSaveDir,NewProjectInfo.name);
717    i=0;
718    while(!(dir[i]==':'||(dir[i-1]=='\\'&&dir[i]=='\\'))) i++;
719    if(dir[i]==':') i++;
720    else{
721        i++;
722        while(dir[i]!='\\') i++;
723    }
724    for(i++;;i++){
725        if(dir[i]=='\\'){
726            lstrcpy(temporary,dir);
727            temporary[i]=0;
728            hFind=FindFirstFile(temporary,&wfd);
729            if(hFind==INVALID_HANDLE_VALUE){
730                if(!CreateDirectory(temporary,NULL)){
731                    MessageBox(hOwner,"ディレクトリを作成できませんでした",APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
732                    return;
733                }
734            }
735            else FindClose(hFind);
736        }
737        if(dir[i]=='\0') break;
738    }
739
740
741    //////////////////////////////////////
742    // プロジェクトファイル(*.pj)を作成
743    //////////////////////////////////////
744
745    // 出力先拡張子
746    const std::string outputFileExt
747        = ( NewProjectInfo.dwTypeID == IDC_DLL ) ? ".dll"
748        : ( NewProjectInfo.dwTypeID == IDC_SLL ) ? ".lib"
749        : ".exe";
750
751    //先頭の注釈
752    lstrcpy(buffer,"\' ActiveBasic Project file.\r\n\r\n");
753    i=lstrlen(buffer);
754
755    //プロジェクトのフォーマットバージョン
756    sprintf(buffer+i,"#VERSION=%d\r\n\r\n",PROJECT_VERSION);
757    i+=lstrlen(buffer+i);
758
759    //モジュールタイプ(EXEならば0、DLLならば1)
760    ActiveBasic::Common::TargetModuleType::EnumType moduleType
761        = ( NewProjectInfo.dwTypeID == IDC_DLL ) ? ActiveBasic::Common::TargetModuleType::Dll
762        : ( NewProjectInfo.dwTypeID == IDC_SLL ) ? ActiveBasic::Common::TargetModuleType::Sll
763        : ActiveBasic::Common::TargetModuleType::Exe;
764    lstrcpy(buffer+i,( (std::string)"#MODULETYPE=" + Jenga::Common::ToString( static_cast<int>(moduleType) ) + "\r\n\r\n" ).c_str());
765    i+=lstrlen(buffer+i);
766
767    //プロジェクト名
768    sprintf(buffer+i,"#NAME=%s\r\n\r\n",NewProjectInfo.name);
769    i+=lstrlen(buffer+i);
770
771    lstrcpy(buffer+i,"#PLATFORM=32\r\n\r\n");
772    i+=lstrlen(buffer+i);
773
774    //RADウィンドウの数
775    if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE||
776        NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX)
777        lstrcpy(buffer+i,"#USEWINDOW=1\r\n\r\n");
778    else lstrcpy(buffer+i,"#USEWINDOW=0\r\n\r\n");
779    i+=lstrlen(buffer+i);
780
781    //プロジェクトオプション
782    sprintf(buffer+i,"#OPTION=&H%08x\r\n\r\n",NewProjectInfo.dwOption);
783    i+=lstrlen(buffer+i);
784
785    //出力先(Release)
786    sprintf(buffer+i,"#OUTPUT_RELEASE=.\\%s%s\r\n\r\n",NewProjectInfo.name, outputFileExt.c_str());
787    i+=lstrlen(buffer+i);
788
789    //出力先(Debug)
790    sprintf(buffer+i,"#OUTPUT_DEBUG=.\\%s_debug%s\r\n\r\n",NewProjectInfo.name, outputFileExt.c_str());
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    else if( NewProjectInfo.dwTypeID == IDC_SLL )
951    {
952        buffer[0] = 0;
953    }
954
955    //保存
956    if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
957        sprintf(temporary,"%s%s.ab",dir,NewProjectInfo.name);
958        WriteBuffer(temporary,pTemp,lstrlen(pTemp));
959
960        HeapDefaultFree(pTemp);
961    }
962    else{
963        sprintf(temporary,"%s%s.ab",dir,NewProjectInfo.name);
964        if(!WriteBuffer(temporary,buffer,lstrlen(buffer))) return;
965    }
966
967
968    /////////////////////
969    // MainWnd.abを作成
970    /////////////////////
971
972    std::string mainWndSbpPath = "";
973    if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE)
974    {
975        mainWndSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\MainWnd_exe_windowbase.sbp";
976    }
977    else if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX)
978    {
979        mainWndSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\MainWnd_exe_directx.sbp";
980    }
981
982    if( !mainWndSbpPath.empty() ){
983        pTemp = ReadBuffer( mainWndSbpPath );
984
985        //#name#をプロジェクト名に置換
986        pTemp=PermutationWndPgmTemplate(pTemp,
987            NewProjectInfo.name,
988            "MainWnd",
989            "hMainWnd",
990            "MainWndProc");
991
992        if(NewProjectInfo.ShowHelloWorld){
993            //Hello World!表示
994            i=0;
995            lstrcpy(buffer+i,"\r\nSub MainWnd_Paint(hDC As HDC)\r\n");
996            i+=lstrlen(buffer+i);
997            lstrcpy(buffer+i,"\tDim rect As RECT\r\n");
998            i+=lstrlen(buffer+i);
999            lstrcpy(buffer+i,"\tGetClientRect(hMainWnd,rect)\r\n");
1000            i+=lstrlen(buffer+i);
1001            lstrcpy(buffer+i,"\tDrawText(hDC,\"Hello World!\",-1,rect,DT_CENTER or DT_VCENTER or DT_SINGLELINE)\r\n");
1002            i+=lstrlen(buffer+i);
1003            lstrcpy(buffer+i,"End Sub\r\n");
1004            i+=lstrlen(buffer+i);
1005
1006            pTemp=(char *)HeapReAlloc(hHeap,0,pTemp,lstrlen(pTemp)+lstrlen(buffer)+1);
1007            lstrcat(pTemp,buffer);
1008        }
1009
1010        sprintf(temporary,"%sMainWnd.ab",dir,NewProjectInfo.name);
1011        WriteBuffer(temporary,pTemp,lstrlen(pTemp));
1012
1013        HeapDefaultFree(pTemp);
1014    }
1015
1016
1017    if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
1018        ///////////////////////////
1019        // DirextX対応アプリのとき
1020        ///////////////////////////
1021
1022        //dx_graphics.sbpをコピー
1023        const std::string dxGraphicsSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dx\\dx_graphics.sbp";
1024        pTemp = ReadBuffer( dxGraphicsSbpPath );
1025        sprintf(temporary,"%sdx_graphics.sbp",dir,NewProjectInfo.name);
1026        WriteBuffer(temporary,pTemp,lstrlen(pTemp));
1027        HeapDefaultFree(pTemp);
1028
1029        //dx_input.sbpをコピー
1030        const std::string dxInputSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dx\\dx_input.sbp";
1031        pTemp = ReadBuffer( dxInputSbpPath );
1032        sprintf(temporary,"%sdx_input.sbp",dir,NewProjectInfo.name);
1033        WriteBuffer(temporary,pTemp,lstrlen(pTemp));
1034        HeapDefaultFree(pTemp);
1035
1036        //dx_music.sbpをコピー
1037        const std::string dxMusicSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dx\\dx_music.sbp";
1038        pTemp = ReadBuffer( dxMusicSbpPath );
1039        sprintf(temporary,"%sdx_music.sbp",dir,NewProjectInfo.name);
1040        WriteBuffer(temporary,pTemp,lstrlen(pTemp));
1041        HeapDefaultFree(pTemp);
1042
1043        //dx9abm.dllをコピー
1044        sprintf(temporary,"%sRuntime\\dx9abm.dll",pj_editor_Dir);
1045        sprintf(buffer,"%sdx9abm.dll",dir,NewProjectInfo.name);
1046        CopyFile(temporary,buffer,0);
1047    }
1048
1049
1050    if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE||
1051        NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
1052        /////////////////////////////////////////
1053        // ウィンドウ定義ファイル(*.wnd)を作成
1054        /////////////////////////////////////////
1055        WindowInfos windowInfos;
1056        windowInfos.push_back( new WindowInfo() );
1057        windowInfos.back()->SetName( "MainWnd" );
1058        windowInfos.back()->SetHandleName( "hMainWnd" );
1059        windowInfos.back()->pos.x=CW_USEDEFAULT;
1060        windowInfos.back()->pos.y=CW_USEDEFAULT;
1061        windowInfos.back()->size.cx=480;
1062        windowInfos.back()->size.cy=360;
1063        windowInfos.back()->caption=NewProjectInfo.name;
1064        if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE)
1065            windowInfos.back()->style=WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_VISIBLE;
1066        else if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX)
1067            windowInfos.back()->style=WS_OVERLAPPED|WS_THICKFRAME|WS_SYSMENU;
1068        windowInfos.back()->ExStyle=0;
1069        windowInfos.back()->MenuID=0;
1070        windowInfos.back()->id=0;
1071        windowInfos.back()->bgColor=COLOR_3DFACE;
1072        GetDefaultWindowFont(&windowInfos.back()->LogFont);
1073        windowInfos.back()->IconResName=0;
1074        windowInfos.back()->ClassName="NORMAL";
1075        windowInfos.back()->CallBackName="MainWndProc";
1076        windowInfos.back()->type=WNDTYPE_DEFAULT;
1077        windowInfos.back()->filepath="MainWnd.ab";
1078        sprintf(temporary,"%s%s.wnd",dir,NewProjectInfo.name);
1079
1080        projectInfo.NumberOfMenu=0;
1081        SaveWindowFile( temporary, windowInfos );
1082
1083        windowInfos.Clear();
1084    }
1085
1086
1087    ////////////////////////
1088    // ワークファイルを作成
1089    ////////////////////////
1090    lstrcpy(buffer,"case4\r\n\r\n");
1091    if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE){
1092        lstrcat(buffer,"rad,MainWnd\r\n\r\n");
1093    }
1094    else{
1095        sprintf(buffer+lstrlen(buffer),"text,\"%s.ab\",0,0,0,0\r\n\r\n",NewProjectInfo.name);
1096    }
1097    lstrcat(buffer,"0\r\n0\r\n0\r\n0,0");
1098    //保存
1099    sprintf(temporary,"%s%s.wrk",dir,NewProjectInfo.name);
1100    if(!WriteBuffer(temporary,buffer,lstrlen(buffer))) return;
1101
1102
1103    //マニフェストを作成
1104    char temp2[MAX_PATH];
1105    const std::string manifestTempXmlPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\manifest_temp.xml";
1106    sprintf(temp2,"%s%s.manifest.xml",dir,NewProjectInfo.name);
1107    CopyFile( manifestTempXmlPath.c_str(), temp2, 0 );
1108
1109
1110    sprintf(temporary,"%s%s.pj",dir,NewProjectInfo.name);
1111    projectInfo.Open(temporary);
1112    SaveProject();
1113}
1114void SetTreeViewForProjectInfo(){
1115    extern HANDLE hHeap;
1116    extern HWND hProjectView;
1117    int i;
1118    char temporary[MAX_PATH];
1119    TV_INSERTSTRUCT tv;
1120
1121    sprintf(temporary,"%s ",projectInfo.GetName().c_str());
1122    lstrcat(temporary,STRING_PROJECT);
1123    SetWindowText(hProjectView,temporary);
1124
1125    tv.hInsertAfter=TVI_SORT;
1126    tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
1127
1128    //ファイル ツリー
1129    projectInfo.pobj_DBFileInfo->ResetTree();
1130
1131    //関数ツリー
1132    ResetClassTree(-1);
1133
1134    /////////////////////
1135    // マテリアル ツリー
1136
1137    //Cursorリソース フォルダ
1138    sprintf(temporary,"Cursor %s",STRING_RESOURCE);
1139    tv.hParent=TVI_ROOT;
1140    tv.item.iImage=0;
1141    tv.item.iSelectedImage=0;
1142    tv.item.pszText=temporary;
1143    tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1144    projectInfo.res.hCursorTreeItem=tv.hParent;
1145    for(i=0;i<projectInfo.res.NumberOfCursorRes;i++){
1146        tv.item.iImage=6;
1147        tv.item.iSelectedImage=6;
1148        tv.item.pszText=projectInfo.res.pCursorResInfo[i].IdName;
1149        projectInfo.res.pCursorResInfo[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1150    }
1151
1152    //Bitmapリソース フォルダ
1153    sprintf(temporary,"Bitmap %s",STRING_RESOURCE);
1154    tv.hParent=TVI_ROOT;
1155    tv.item.iImage=0;
1156    tv.item.iSelectedImage=0;
1157    tv.item.pszText=temporary;
1158    tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1159    projectInfo.res.hBitmapTreeItem=tv.hParent;
1160    for(i=0;i<projectInfo.res.NumberOfBitmapRes;i++){
1161        tv.item.iImage=5;
1162        tv.item.iSelectedImage=5;
1163        tv.item.pszText=projectInfo.res.pBitmapResInfo[i].IdName;
1164        projectInfo.res.pBitmapResInfo[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1165    }
1166
1167    //Iconリソース フォルダ
1168    sprintf(temporary,"Icon %s",STRING_RESOURCE);
1169    tv.hParent=TVI_ROOT;
1170    tv.item.iImage=0;
1171    tv.item.iSelectedImage=0;
1172    tv.item.pszText=temporary;
1173    tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1174    projectInfo.res.hIconTreeItem=tv.hParent;
1175    for(i=0;i<projectInfo.res.NumberOfIconRes;i++){
1176        tv.item.iImage=4;
1177        tv.item.iSelectedImage=4;
1178        if(i==0){
1179            sprintf(temporary,"%s (Main)",projectInfo.res.pIconResInfo[i].IdName);
1180            tv.item.pszText=temporary;
1181        }
1182        else tv.item.pszText=projectInfo.res.pIconResInfo[i].IdName;
1183        projectInfo.res.pIconResInfo[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1184    }
1185
1186    //Menuフォルダ
1187    tv.hParent=TVI_ROOT;
1188    tv.item.iImage=0;
1189    tv.item.iSelectedImage=0;
1190    tv.item.pszText="Menu";
1191    tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1192    projectInfo.hMenuTreeItem=tv.hParent;
1193    for(i=0;i<projectInfo.NumberOfMenu;i++){
1194        tv.item.iImage=3;
1195        tv.item.iSelectedImage=3;
1196        tv.item.pszText=projectInfo.pMenuInfo[i].IdName;
1197        projectInfo.pMenuInfo[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1198    }
1199
1200    //Windowフォルダ
1201    tv.hParent=TVI_ROOT;
1202    tv.item.iImage=0;
1203    tv.item.iSelectedImage=0;
1204    tv.item.pszText="Window";
1205    tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1206    projectInfo.hWindowTreeItem=tv.hParent;
1207    BOOST_FOREACH( WindowInfo *pWindowInfo, projectInfo.windowInfos )
1208    {
1209        tv.item.iImage=2;
1210        tv.item.iSelectedImage=2;
1211        char temporary[1024];
1212        lstrcpy( temporary, pWindowInfo->GetName().c_str() );
1213        tv.item.pszText = temporary;
1214        pWindowInfo->hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1215    }
1216}
1217void OpenWorkfile( const std::string &path )
1218{
1219    extern HANDLE hHeap;
1220    int i,i2,i3;
1221    char *buffer,temporary[MAX_PATH],temp2[MAX_PATH];
1222
1223    //プロジェクト ビューを設定、表示
1224    extern HWND hProjectView;
1225    SetTreeViewForProjectInfo();
1226    if(!IsWindowVisible(hProjectView)) SendMessage(hOwner,WM_COMMAND,IDM_PROJECTVIEW,0);
1227
1228
1229    //メニュー状態を設定
1230    ResetState_DocMenu();
1231
1232
1233    //////////////////////////////////////////
1234    //ワークファイル(*.wrk)をオープン
1235    extern MDIINFO MdiInfo[MAX_WNDNUM];
1236    HTREEITEM hTreeItem;
1237    HANDLE hFind;
1238    WIN32_FIND_DATA wfd;
1239    HWND hChild;
1240    int WndNum;
1241    hFind=FindFirstFile(path.c_str(),&wfd);
1242    if(hFind!=INVALID_HANDLE_VALUE){
1243        FindClose(hFind);
1244        buffer=ReadBuffer(path);
1245        if(!buffer) return;
1246
1247        //解析、反映
1248        memcpy(temporary,buffer,5);
1249        temporary[5]=0;
1250        if(lstrcmp(temporary,"case4")==0){
1251
1252            LockWindowUpdate(hOwner);
1253            for(i=9,i2=0;;i++,i2++){
1254                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1255                    if(i2!=0){
1256                        temporary[i2]=0;
1257                        for(i3=0;;i3++){
1258                            if(temporary[i3]==','||temporary[i3]=='\0') break;
1259                        }
1260                        if(temporary[i3]=='\0') goto EndToSetWorkFile;
1261                        lstrcpy(temp2,temporary+i3+1);
1262                        temporary[i3]=0;
1263                        if(lstrcmpi(temporary,"text")==0){
1264                            if(temp2[0]!='\"') goto EndToSetWorkFile;
1265
1266                            //ファイルを開く
1267                            i2=1;
1268                            for(i3=0;;i2++,i3++){
1269                                if(temp2[i2]=='\"'||temp2[i2]=='\0'){
1270                                    temporary[i3]=0;
1271                                    break;
1272                                }
1273                                temporary[i3]=temp2[i2];
1274                            }
1275                            GetFullPath(temporary,projectInfo.dir);
1276                            hChild=OpenFileWithExtension(temporary);
1277                            WndNum=GetWndNum(hChild);
1278                            if(WndNum==-1){
1279                                goto EndToSetWorkFile;
1280                            }
1281
1282                            //ResetScrollbarが再描画時に呼び出されるので、再描画する
1283                            InvalidateRect(MdiInfo[WndNum].pMdiTextEdit->hEdit,NULL,0);
1284                            UpdateWindow(MdiInfo[WndNum].pMdiTextEdit->hEdit);
1285
1286                            if(temp2[i2]=='\0') goto EndToSetWorkFile;
1287                            if(temp2[i2+1]!=',') goto EndToSetWorkFile;
1288
1289                            //以前のスクロール位置を復元
1290                            SCROLLINFO si;
1291                            POINT pos;
1292                            for(i2+=2,i3=0;;i2++,i3++){
1293                                if(temp2[i2]==','||temp2[i2]=='\0'){
1294                                    temporary[i3]=0;
1295                                    break;
1296                                }
1297                                temporary[i3]=temp2[i2];
1298                            }
1299                            sscanf(temporary,"%d",&pos.x);
1300                            if(temp2[i2]=='\0') goto EndToSetWorkFile;
1301                            for(i2++,i3=0;;i2++,i3++){
1302                                if(temp2[i2]==','||temp2[i2]=='\0'){
1303                                    temporary[i3]=0;
1304                                    break;
1305                                }
1306                                temporary[i3]=temp2[i2];
1307                            }
1308                            sscanf(temporary,"%d",&pos.y);
1309                            si.cbSize=sizeof(SCROLLINFO);
1310                            si.fMask=SIF_POS;
1311                            si.nPos=pos.x;
1312                            SetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_HORZ,&si,1);
1313                            si.nPos=pos.y;
1314                            SetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_VERT,&si,1);
1315
1316                            if(temp2[i2]=='\0') goto EndToSetWorkFile;
1317
1318                            //キャレット位置をセット
1319                            for(i2++,i3=0;;i2++,i3++){
1320                                if(temp2[i2]==','||temp2[i2]=='\0'){
1321                                    temporary[i3]=0;
1322                                    break;
1323                                }
1324                                temporary[i3]=temp2[i2];
1325                            }
1326                            sscanf(temporary,"%d",&pos.x);
1327                            if(temp2[i2]=='\0') goto EndToSetWorkFile;
1328                            for(i2++,i3=0;;i2++,i3++){
1329                                if(temp2[i2]==','||temp2[i2]=='\0'){
1330                                    temporary[i3]=0;
1331                                    break;
1332                                }
1333                                temporary[i3]=temp2[i2];
1334                            }
1335                            sscanf(temporary,"%d",&pos.y);
1336                            TextEdit_SetSel(WndNum,pos.x,pos.y);
1337                        }
1338                        else if(lstrcmpi(temporary,"rad")==0){
1339                            for(i3=0;i3<static_cast<int>(projectInfo.windowInfos.size());i3++){
1340                                if(lstrcmpi(projectInfo.windowInfos[i3]->GetName().c_str(),temp2)==0){
1341                                    NewRadWindow( *projectInfo.windowInfos[i3] );
1342                                    break;
1343                                }
1344                            }
1345                        }
1346                        else if(lstrcmpi(temporary,"menu")==0){
1347                            for(i3=0;i3<projectInfo.NumberOfMenu;i3++){
1348                                if(lstrcmpi(projectInfo.pMenuInfo[i3].IdName,temp2)==0){
1349                                    NewMenuWindow(&projectInfo.pMenuInfo[i3]);
1350                                    break;
1351                                }
1352                            }
1353                        }
1354                        else if(lstrcmpi(temporary,"icon")==0){
1355                            for(i3=0;i3<projectInfo.res.NumberOfIconRes;i3++){
1356                                if(lstrcmpi(projectInfo.res.pIconResInfo[i3].path,temp2)==0){
1357                                    GetFullPath(temp2,projectInfo.dir);
1358                                    NewIconEditWindow(temp2);
1359                                    break;
1360                                }
1361                            }
1362                        }
1363                        i++;
1364                        i2=-1;
1365                        continue;
1366                    }
1367                    else break;
1368                }
1369                temporary[i2]=buffer[i];
1370            }
1371
1372            for(i+=2,i2=0;;i++,i2++){
1373                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1374                    temporary[i2]=0;
1375                    break;
1376                }
1377                temporary[i2]=buffer[i];
1378            }
1379            sscanf(temporary,"%d",&i2);
1380
1381            switch( i2 ){
1382                case 0:
1383                    ShowFileView();
1384                    break;
1385                case 1:
1386                    ShowClassView();
1387                    break;
1388                case 2:
1389                    ShowMaterialView();
1390                    break;
1391            }
1392
1393            if(buffer[i]=='\0') goto EndToSetWorkFile;
1394
1395            for(i+=2,i2=0;;i++,i2++){
1396                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1397                    temporary[i2]=0;
1398                    break;
1399                }
1400                temporary[i2]=buffer[i];
1401            }
1402            if(temporary[0]=='1') TreeView_Expand(pobj_FileTree->hTree,TreeView_GetRoot(pobj_FileTree->hTree),TVE_EXPAND);
1403
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]=='1') TreeView_Expand(hProcedureTreeView,TreeView_GetRoot(hProcedureTreeView),TVE_EXPAND);
1412
1413            for(i+=2,i2=0;;i++,i2++){
1414                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1415                    temporary[i2]=0;
1416                    break;
1417                }
1418                temporary[i2]=buffer[i];
1419            }
1420            hTreeItem=TreeView_GetRoot(hMaterialTreeView);
1421            i2=0;
1422            while(hTreeItem){
1423                i2=GetOneParameter(temporary,i2,temp2);
1424                if(GetValue(temp2)) TreeView_Expand(hMaterialTreeView,hTreeItem,TVE_EXPAND);
1425                hTreeItem=TreeView_GetNextSibling(hMaterialTreeView,hTreeItem);
1426            }
1427        }
1428        else if(lstrcmp(temporary,"case3")==0){
1429            ////////////////////////////////////////
1430            // 古いフォーマットのワークファイル
1431
1432            LockWindowUpdate(hOwner);
1433            for(i=9,i2=0;;i++,i2++){
1434                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1435                    if(i2!=0){
1436                        temporary[i2]=0;
1437                        for(i3=0;;i3++){
1438                            if(temporary[i3]==','||temporary[i3]=='\0') break;
1439                        }
1440                        if(temporary[i3]=='\0') goto EndToSetWorkFile;
1441                        lstrcpy(temp2,temporary+i3+1);
1442                        temporary[i3]=0;
1443                        if(lstrcmpi(temporary,"text")==0){
1444                            for(i3=0;;i3++){
1445                                if(temp2[i3]==','||temp2[i3]=='\0') break;
1446                            }
1447                            if(temp2[i3]=='\0') goto EndToSetWorkFile;
1448                            lstrcpy(temporary,temp2+i3+1);
1449                            temp2[i3]=0;
1450                            GetFullPath(temporary,projectInfo.dir);
1451                            sscanf(temp2,"%d",&i3);
1452
1453                            //ファイルを開く
1454                            hChild=OpenFileWithExtension(temporary);
1455                            WndNum=GetWndNum(hChild);
1456
1457                            //キャレット位置をセット
1458                            TextEdit_SetSel(WndNum,i3,i3);
1459                        }
1460                        else if(lstrcmpi(temporary,"rad")==0){
1461                            for(i3=0;i3<static_cast<int>(projectInfo.windowInfos.size());i3++){
1462                                if(lstrcmpi(projectInfo.windowInfos[i3]->GetName().c_str(),temp2)==0){
1463                                    NewRadWindow( *projectInfo.windowInfos[i3] );
1464                                    break;
1465                                }
1466                            }
1467                        }
1468                        else if(lstrcmpi(temporary,"menu")==0){
1469                            for(i3=0;i3<projectInfo.NumberOfMenu;i3++){
1470                                if(lstrcmpi(projectInfo.pMenuInfo[i3].IdName,temp2)==0){
1471                                    NewMenuWindow(&projectInfo.pMenuInfo[i3]);
1472                                    break;
1473                                }
1474                            }
1475                        }
1476                        else if(lstrcmpi(temporary,"icon")==0){
1477                            for(i3=0;i3<projectInfo.res.NumberOfIconRes;i3++){
1478                                if(lstrcmpi(projectInfo.res.pIconResInfo[i3].path,temp2)==0){
1479                                    GetFullPath(temp2,projectInfo.dir);
1480                                    NewIconEditWindow(temp2);
1481                                    break;
1482                                }
1483                            }
1484                        }
1485                        i++;
1486                        i2=-1;
1487                        continue;
1488                    }
1489                    else break;
1490                }
1491                temporary[i2]=buffer[i];
1492            }
1493
1494            for(i+=2,i2=0;;i++,i2++){
1495                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1496                    temporary[i2]=0;
1497                    break;
1498                }
1499                temporary[i2]=buffer[i];
1500            }
1501            sscanf(temporary,"%d",&i2);
1502
1503            switch( i2 ){
1504                case 0:
1505                    ShowFileView();
1506                    break;
1507                case 1:
1508                    ShowClassView();
1509                    break;
1510                case 2:
1511                    ShowMaterialView();
1512                    break;
1513            }
1514
1515            if(buffer[i]=='\0') goto EndToSetWorkFile;
1516
1517            for(i+=2,i2=0;;i++,i2++){
1518                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1519                    temporary[i2]=0;
1520                    break;
1521                }
1522                temporary[i2]=buffer[i];
1523            }
1524            if(temporary[0]=='1') TreeView_Expand(pobj_FileTree->hTree,TreeView_GetRoot(pobj_FileTree->hTree),TVE_EXPAND);
1525
1526            for(i+=2,i2=0;;i++,i2++){
1527                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1528                    temporary[i2]=0;
1529                    break;
1530                }
1531                temporary[i2]=buffer[i];
1532            }
1533            if(temporary[0]=='1') TreeView_Expand(hProcedureTreeView,TreeView_GetRoot(hProcedureTreeView),TVE_EXPAND);
1534
1535            for(i+=2,i2=0;;i++,i2++){
1536                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1537                    temporary[i2]=0;
1538                    break;
1539                }
1540                temporary[i2]=buffer[i];
1541            }
1542            hTreeItem=TreeView_GetRoot(hMaterialTreeView);
1543            i2=0;
1544            while(hTreeItem){
1545                i2=GetOneParameter(temporary,i2,temp2);
1546                if(GetValue(temp2)) TreeView_Expand(hMaterialTreeView,hTreeItem,TVE_EXPAND);
1547                hTreeItem=TreeView_GetNextSibling(hMaterialTreeView,hTreeItem);
1548            }
1549        }
1550EndToSetWorkFile:
1551        LockWindowUpdate(NULL);
1552        HeapDefaultFree(buffer);
1553    }
1554
1555
1556    //ウィンドウ タイトルを変更
1557    sprintf(temporary,"%s - %s",projectInfo.GetName().c_str(),APPLICATION_NAME);
1558    SetWindowText(hOwner,temporary);
1559}
1560BOOL ProjectModifyCheck(BOOL bRun){
1561    extern MDIINFO MdiInfo[MAX_WNDNUM];
1562    int i,WndNum,sw;
1563    HWND hChild;
1564    char temporary[MAX_PATH];
1565    if(projectInfo.modify||projectInfo.ModifyOfMaterial||projectInfo.ModifuOfResource){
1566        if(bRun==0||pobj_nv->bSaveCheckProject){
1567            //"\"%s\" プロジェクトは変更されています。保存しますか?"
1568            sprintf(temporary,STRING_MODIFYCHECK_PROJECT,projectInfo.GetName().c_str());
1569            i=MessageBox(hOwner,temporary,APPLICATION_NAME,MB_YESNOCANCEL|MB_ICONEXCLAMATION);
1570
1571            if(i==IDCANCEL) return 0;
1572            if(i==IDYES) SaveProject();
1573        }
1574        else SaveProject();
1575        return 1;
1576    }
1577    hChild=GetWindow(hClient,GW_CHILD);
1578    while(hChild){
1579        WndNum=GetWndNum(hChild);
1580        sw=0;
1581        if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
1582            if( MdiInfo[WndNum].pMdiTextEdit->IsModified() ){
1583                for(i=0;i<projectInfo.pobj_DBFileInfo->iNum;i++){
1584                    projectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->GetFullPath(temporary);
1585                    if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0) sw=1;
1586                }
1587            }
1588        }
1589        else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
1590            if(MdiInfo[WndNum].MdiIconEditInfo->bModify){
1591                for(i=0;i<projectInfo.res.NumberOfIconRes;i++){
1592                    lstrcpy(temporary,projectInfo.res.pIconResInfo[i].path);
1593                    GetFullPath(temporary,projectInfo.dir);
1594                    if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0) sw=1;
1595                }
1596            }
1597        }
1598
1599        if(sw){
1600            if(bRun==0||pobj_nv->bSaveCheckProject){
1601                //"\"%s\" プロジェクトは変更されています。保存しますか?"
1602                sprintf(temporary,STRING_MODIFYCHECK_PROJECT,projectInfo.GetName().c_str());
1603                i=MessageBox(hOwner,temporary,APPLICATION_NAME,MB_YESNOCANCEL|MB_ICONEXCLAMATION);
1604
1605                if(i==IDCANCEL) return 0;
1606                if(i==IDYES) SaveProject();
1607            }
1608            else SaveProject();
1609            return 1;
1610        }
1611        hChild=GetNextWindow(hChild,GW_HWNDNEXT);
1612    }
1613    return 2;
1614}
1615void MakeWorkFile(void){
1616    extern MDIINFO MdiInfo[MAX_WNDNUM];
1617    int i,i2,WndNum;
1618    char temporary[MAX_PATH],buffer[32767];
1619    HWND hChild;
1620    CHARRANGE CharRange;
1621
1622    //ワークファイル(*.wrk)を作成
1623    lstrcpy(buffer,"case4\r\n\r\n");
1624    i2=lstrlen(buffer);
1625
1626
1627    ///////////////////////
1628    //MDIウィンドウの並び
1629    hChild=GetWindow(GetWindow(hClient,GW_CHILD),GW_HWNDLAST);
1630    while(hChild){
1631        WndNum=GetWndNum(hChild);
1632        if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
1633            for(i=0;i<projectInfo.pobj_DBFileInfo->iNum;i++){
1634                projectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->GetFullPath(temporary);
1635                if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
1636                    TextEdit_GetSel(WndNum,&CharRange);
1637
1638                    SCROLLINFO si;
1639                    POINT pos;
1640                    si.cbSize=sizeof(SCROLLINFO);
1641                    si.fMask=SIF_POS;
1642                    GetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_HORZ,&si);
1643                    pos.x=si.nPos;
1644                    GetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_VERT,&si);
1645                    pos.y=si.nPos;
1646
1647                    sprintf(buffer+i2,"text,\"%s\",%d,%d,%d,%d\r\n",
1648                        projectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->m_path,
1649                        pos.x,
1650                        pos.y,
1651                        CharRange.cpMin,
1652                        CharRange.cpMax);
1653                    i2+=lstrlen(buffer+i2);
1654                    break;
1655                }
1656            }
1657        }
1658        else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){
1659            BOOST_FOREACH( WindowInfo *pWindowInfo, projectInfo.windowInfos )
1660            {
1661                if(lstrcmpi(MdiInfo[WndNum].path,pWindowInfo->GetName().c_str())==0){
1662                    sprintf(buffer+i2,"rad,%s\r\n",MdiInfo[WndNum].path);
1663                    i2+=lstrlen(buffer+i2);
1664                    break;
1665                }
1666            }
1667        }
1668        else if(MdiInfo[WndNum].DocType==WNDTYPE_MENU){
1669            for(i=0;i<projectInfo.NumberOfMenu;i++){
1670                if(lstrcmpi(MdiInfo[WndNum].path,projectInfo.pMenuInfo[i].IdName)==0){
1671                    sprintf(buffer+i2,"menu,%s\r\n",MdiInfo[WndNum].path);
1672                    i2+=lstrlen(buffer+i2);
1673                    break;
1674                }
1675            }
1676        }
1677        else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
1678            for(i=0;i<projectInfo.res.NumberOfIconRes;i++){
1679                lstrcpy(temporary,projectInfo.res.pIconResInfo[i].path);
1680                GetFullPath(temporary,projectInfo.dir);
1681                if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
1682                    sprintf(buffer+i2,"icon,%s\r\n",projectInfo.res.pIconResInfo[i].path);
1683                    i2+=lstrlen(buffer+i2);
1684                    break;
1685                }
1686            }
1687        }
1688        hChild=GetNextWindow(hChild,GW_HWNDPREV);
1689    }
1690    lstrcpy(buffer+i2,"\r\n");
1691    i2+=2;
1692
1693
1694    //////////////////////////
1695    //ツリービューの展開状況
1696    sprintf(buffer+i2,"%d\r\n",TabCtrl_GetCurSel(hProjectViewTab));
1697    i2+=lstrlen(buffer+i2);
1698    TVITEM tvItem;
1699    memset(&tvItem,0,sizeof(TVITEM));
1700    tvItem.mask=TVIF_HANDLE|TVIF_STATE;
1701    tvItem.hItem=TreeView_GetRoot(pobj_FileTree->hTree);
1702    TreeView_GetItem(pobj_FileTree->hTree,&tvItem);
1703    if(tvItem.state&TVIS_EXPANDED) i=1;
1704    else i=0;
1705    sprintf(buffer+i2,"%d\r\n",i);
1706    i2+=lstrlen(buffer+i2);
1707
1708    tvItem.hItem=TreeView_GetRoot(hProcedureTreeView);
1709    TreeView_GetItem(hProcedureTreeView,&tvItem);
1710    if(tvItem.state&TVIS_EXPANDED) i=1;
1711    else i=0;
1712    sprintf(buffer+i2,"%d\r\n",i);
1713    i2+=lstrlen(buffer+i2);
1714
1715    tvItem.hItem=TreeView_GetRoot(hMaterialTreeView);
1716    while(tvItem.hItem){
1717        TreeView_GetItem(hMaterialTreeView,&tvItem);
1718        if(tvItem.state&TVIS_EXPANDED) i=1;
1719        else i=0;
1720        sprintf(buffer+i2,"%d",i);
1721        i2+=lstrlen(buffer+i2);
1722
1723        tvItem.hItem=TreeView_GetNextSibling(hMaterialTreeView,tvItem.hItem);
1724        if(tvItem.hItem){
1725            lstrcpy(buffer+i2,",");
1726            i2+=lstrlen(buffer+i2);
1727        }
1728    }
1729
1730
1731    //保存
1732    sprintf(temporary,"%s%s.wrk",projectInfo.dir,projectInfo.GetName().c_str());
1733    WriteBuffer(temporary,buffer,i2);
1734}
1735void SaveProject(void){
1736    extern MDIINFO MdiInfo[MAX_WNDNUM];
1737    int i,i2,i3,WndNum;
1738    char temporary[MAX_PATH],buffer[32767];
1739    HWND hChild;
1740
1741    //"プロジェクトを保存中..."
1742    SetStatusText(STRING_PROJECT_SAVING);
1743
1744    //プロジェクトファイルのバージョンを設定
1745    projectInfo.dwVersion=PROJECT_VERSION;
1746
1747    hChild=GetWindow(hClient,GW_CHILD);
1748    while(hChild){
1749        WndNum=GetWndNum(hChild);
1750        if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
1751            if( MdiInfo[WndNum].pMdiTextEdit->IsModified() ){
1752                for(i=0;i<projectInfo.pobj_DBFileInfo->iNum;i++){
1753                    projectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->GetFullPath(temporary);
1754                    if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
1755                        SaveDocument(hChild,NULL);
1756                        break;
1757                    }
1758                }
1759            }
1760        }
1761        if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
1762            if(MdiInfo[WndNum].MdiIconEditInfo->bModify){
1763                for(i=0;i<projectInfo.res.NumberOfIconRes;i++){
1764                    lstrcpy(temporary,projectInfo.res.pIconResInfo[i].path);
1765                    GetFullPath(temporary,projectInfo.dir);
1766                    if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
1767                        SaveDocument(hChild,NULL);
1768                        break;
1769                    }
1770                }
1771            }
1772        }
1773        hChild=GetNextWindow(hChild,GW_HWNDNEXT);
1774    }
1775
1776
1777    //////////////////////////////////////
1778    //プロジェクトファイル(*.pj)を作成
1779    lstrcpy(buffer,"\' ActiveBasic Project file.\r\n\r\n");
1780    i2=lstrlen(buffer);
1781    sprintf(buffer+i2,"#VERSION=%d\r\n\r\n",projectInfo.dwVersion);
1782    i2+=lstrlen(buffer+i2);
1783    sprintf(buffer+i2,"#MODULETYPE=%d\r\n\r\n",(int)projectInfo.GetModuleType());
1784    i2+=lstrlen(buffer+i2);
1785    sprintf(buffer+i2,"#NAME=%s\r\n\r\n",projectInfo.GetName().c_str());
1786    i2+=lstrlen(buffer+i2);
1787    extern HWND hSelectCompilerCombo;
1788    if(SendMessage(hSelectCompilerCombo,CB_GETCURSEL,0,0)==0){
1789        sprintf(buffer+i2,"#PLATFORM=32\r\n\r\n",projectInfo.GetName().c_str());
1790        i2+=lstrlen(buffer+i2);
1791    }
1792    else{
1793        sprintf(buffer+i2,"#PLATFORM=64\r\n\r\n",projectInfo.GetName().c_str());
1794        i2+=lstrlen(buffer+i2);
1795    }
1796    sprintf(buffer+i2,"#USEWINDOW=%d\r\n\r\n",projectInfo.windowInfos.size());
1797    i2+=lstrlen(buffer+i2);
1798    sprintf(buffer+i2,"#OPTION=&H%08x\r\n\r\n",projectInfo.dwOption);
1799    i2+=lstrlen(buffer+i2);
1800    sprintf(buffer+i2,"#OUTPUT_RELEASE=%s\r\n\r\n",projectInfo.lpszOutput_Release);
1801    i2+=lstrlen(buffer+i2);
1802    sprintf(buffer+i2,"#OUTPUT_DEBUG=%s\r\n\r\n",projectInfo.lpszOutput_Debug);
1803    i2+=lstrlen(buffer+i2);
1804    sprintf(buffer+i2,"#MANIFEST=%s\r\n\r\n",projectInfo.szManifestPath);
1805    i2+=lstrlen(buffer+i2);
1806    sprintf(buffer+i2,"#DEBUG_CMD_LINE=%s\r\n\r\n",projectInfo.szCmdLine);
1807    i2+=lstrlen(buffer+i2);
1808    sprintf(buffer+i2,"#DEBUG_EXE_PATH=%s\r\n\r\n",projectInfo.szExePath);
1809    i2+=lstrlen(buffer+i2);
1810    if(projectInfo.ResourceFileName[0]){
1811        sprintf(buffer+i2,"#RESOURCE=%s\r\n\r\n",projectInfo.ResourceFileName);
1812        i2+=lstrlen(buffer+i2);
1813    }
1814    else{
1815        lstrcpy(buffer+i2,"#RESOURCE=0\r\n\r\n");
1816        i2+=lstrlen(buffer+i2);
1817    }
1818    sprintf(buffer+i2,"#SOURCE\r\n");
1819    i2+=lstrlen(buffer+i2);
1820    for(i=0;i<projectInfo.pobj_DBFileInfo->iNum;i++){
1821        sprintf(buffer+i2,"%s\r\n",projectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->m_path);
1822        i2+=lstrlen(buffer+i2);
1823    }
1824
1825    //保存
1826    sprintf(temporary,"%s%s.pj",projectInfo.dir,projectInfo.GetName().c_str());
1827    WriteBuffer(temporary,buffer,i2);
1828
1829
1830    //////////////////////////////////
1831    // リソースファイル(*.rc、resource.ab)を作成
1832    if(projectInfo.ResourceFileName[0]){
1833        i2=0;
1834        i3=101;
1835        for(i=0;i<projectInfo.res.NumberOfCursorRes;i++,i3++){
1836            sprintf(buffer+i2,"Const %s=%d\r\n",
1837                projectInfo.res.pCursorResInfo[i].IdName,
1838                i3);
1839            i2+=lstrlen(buffer+i2);
1840        }
1841        for(i=0;i<projectInfo.res.NumberOfBitmapRes;i++,i3++){
1842            sprintf(buffer+i2,"Const %s=%d\r\n",
1843                projectInfo.res.pBitmapResInfo[i].IdName,
1844                i3);
1845            i2+=lstrlen(buffer+i2);
1846        }
1847        for(i=0;i<projectInfo.res.NumberOfIconRes;i++,i3++){
1848            sprintf(buffer+i2,"Const %s=%d\r\n",
1849                projectInfo.res.pIconResInfo[i].IdName,
1850                i3);
1851            i2+=lstrlen(buffer+i2);
1852        }
1853
1854        //保存(resource.ab)
1855        lstrcpy(temporary,"resource.ab");
1856        GetFullPath(temporary,projectInfo.dir);
1857        WriteBuffer(temporary,buffer,i2);
1858
1859        i2=0;
1860        for(i=0;i<projectInfo.res.NumberOfCursorRes;i++){
1861            sprintf(buffer+i2,"%s CURSOR \"%s\"\r\n",
1862                projectInfo.res.pCursorResInfo[i].IdName,
1863                projectInfo.res.pCursorResInfo[i].path);
1864            i2+=lstrlen(buffer+i2);
1865        }
1866        for(i=0;i<projectInfo.res.NumberOfBitmapRes;i++){
1867            sprintf(buffer+i2,"%s BITMAP \"%s\"\r\n",
1868                projectInfo.res.pBitmapResInfo[i].IdName,
1869                projectInfo.res.pBitmapResInfo[i].path);
1870            i2+=lstrlen(buffer+i2);
1871        }
1872        for(i=0;i<projectInfo.res.NumberOfIconRes;i++){
1873            sprintf(buffer+i2,"%s ICON \"%s\"\r\n",
1874                projectInfo.res.pIconResInfo[i].IdName,
1875                projectInfo.res.pIconResInfo[i].path);
1876            i2+=lstrlen(buffer+i2);
1877        }
1878
1879        //マニフェスト
1880        if(projectInfo.dwOption&PJ_OP_RC_MANIFEST){
1881            sprintf(buffer+i2,"CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST \"%s\"\r\n",
1882                projectInfo.szManifestPath);
1883            i2+=lstrlen(buffer+i2);
1884        }
1885
1886        //保存
1887        lstrcpy(temporary,projectInfo.ResourceFileName);
1888        GetFullPath(temporary,projectInfo.dir);
1889        WriteBuffer(temporary,buffer,i2);
1890    }
1891
1892
1893    ///////////////////////////////////////
1894    //インデックスファイル(*.idx)を作成
1895    buffer[0]=0;
1896    lstrcpy(buffer,"' インデックス プログラム\r\n");
1897    i2=lstrlen(buffer);
1898    if(projectInfo.dwOption&PJ_OP_SOURCE_MASK){
1899        if(projectInfo.dwOption&PJ_OP_STRICT){
1900            /* #strictディレクティブは今は使われていない
1901            lstrcpy(buffer+i2,"\r\n");
1902            i2+=lstrlen(buffer+i2);
1903            lstrcpy(buffer+i2,"#strict");
1904            i2+=lstrlen(buffer+i2);
1905            lstrcpy(buffer+i2,"\r\n");
1906            i2+=lstrlen(buffer+i2);
1907            */
1908        }
1909        lstrcpy(buffer+i2,"\r\n");
1910        i2+=lstrlen(buffer+i2);
1911        lstrcpy(buffer+i2,"'Win32APIの定義ファイル\r\n");
1912        i2+=lstrlen(buffer+i2);
1913        if(projectInfo.dwOption&PJ_OP_MMSYSTEM){
1914            lstrcpy(buffer+i2,"#include <api_mmsys.sbp>\r\n");
1915            i2+=lstrlen(buffer+i2);
1916        }
1917        if(projectInfo.dwOption&PJ_OP_COMMCTRL){
1918            lstrcpy(buffer+i2,"#include <api_commctrl.sbp>\r\n");
1919            i2+=lstrlen(buffer+i2);
1920        }
1921        if(projectInfo.dwOption&PJ_OP_RICHEDIT){
1922            lstrcpy(buffer+i2,"#include <api_richedit.sbp>\r\n");
1923            i2+=lstrlen(buffer+i2);
1924        }
1925        if(projectInfo.dwOption&PJ_OP_WINSOCK){
1926            lstrcpy(buffer+i2,"#include <api_winsock2.sbp>\r\n");
1927            i2+=lstrlen(buffer+i2);
1928        }
1929    }
1930    if( !projectInfo.windowInfos.empty() )
1931    {
1932        lstrcpy(buffer+i2,"\r\n");
1933        i2+=lstrlen(buffer+i2);
1934        lstrcpy(buffer+i2,"'RADツールが生成するウィンドウ制御プログラム\r\n");
1935        i2+=lstrlen(buffer+i2);
1936        sprintf(buffer+i2,"#include \"Callback.wbp\"\r\n");
1937        i2+=lstrlen(buffer+i2);
1938    }
1939    if(projectInfo.pobj_DBFileInfo->iNum>1){
1940        lstrcpy(buffer+i2,"\r\n");
1941        i2+=lstrlen(buffer+i2);
1942        lstrcpy(buffer+i2,"'プロジェクト内のプログラム ファイル\r\n");
1943        i2+=lstrlen(buffer+i2);
1944        for(i=1;i<projectInfo.pobj_DBFileInfo->iNum;i++){
1945            //メインファイルは含まない
1946            sprintf(buffer+i2,"#include \"%s\"\r\n",projectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->m_path);
1947            i2+=lstrlen(buffer+i2);
1948            lstrcpy(buffer+i2,"_ClearNamespaceImported\r\n");
1949            i2+=lstrlen(buffer+i2);
1950        }
1951    }
1952    if( !projectInfo.windowInfos.empty() )
1953    {
1954        lstrcpy(buffer+i2,"\r\n");
1955        i2+=lstrlen(buffer+i2);
1956        lstrcpy(buffer+i2,"'RADツールが生成するウィンドウ生成プログラム\r\n");
1957        i2+=lstrlen(buffer+i2);
1958        sprintf(buffer+i2,"#include \"MakeWindow.wbp\"\r\n");
1959        i2+=lstrlen(buffer+i2);
1960    }
1961    if(projectInfo.ResourceFileName[0]){
1962        //リソースファイルが含まれる場合
1963        lstrcpy(buffer+i2,"\r\n");
1964        i2+=lstrlen(buffer+i2);
1965        lstrcpy(buffer+i2,"'リソースファイル\r\n");
1966        i2+=lstrlen(buffer+i2);
1967        lstrcpy(buffer+i2,"#include \"resource.ab\"\r\n");
1968        i2+=lstrlen(buffer+i2);
1969        sprintf(buffer+i2,"#resource \"%s.rc\"\r\n",projectInfo.GetName().c_str());
1970        i2+=lstrlen(buffer+i2);
1971    }
1972
1973    //保存
1974    sprintf(temporary,"%s%s.idx",projectInfo.dir,projectInfo.GetName().c_str());
1975    WriteBuffer(temporary,buffer,i2);
1976
1977
1978    if( !projectInfo.windowInfos.empty() )
1979    {
1980        /////////////////////////////////////////////////////
1981        //ウィンドウ関連ファイル(*.wnd)を作成、保存
1982        if(projectInfo.ModifyOfMaterial){
1983            sprintf(temporary,"%s%s.wnd",projectInfo.dir,projectInfo.GetName().c_str());
1984            SaveWindowFile( temporary, projectInfo.windowInfos );
1985        }
1986
1987        //.wbpファイルを生成
1988        SaveWindowProgram();
1989    }
1990
1991
1992    MakeWorkFile();
1993
1994    SetStatusText("");
1995
1996    projectInfo.modify=0;
1997    projectInfo.ModifuOfResource=0;
1998}
1999
2000BOOL SetProjectToRun(void){
2001    HANDLE hFind;
2002    WIN32_FIND_DATA wfd;
2003
2004    if(projectInfo.pobj_DBFileInfo->iNum==0){
2005        //"プログラム ファイルがプロジェクトに存在しません。"
2006        MessageBox(hOwner,STRING_ERROR_NOFILE,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
2007        return 0;
2008    }
2009
2010    extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
2011    hFind=FindFirstFile( ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ).c_str(), &wfd );
2012    if(hFind==INVALID_HANDLE_VALUE){
2013        //"BasicCompiler.exe が見つかりません"
2014        MessageBox(hOwner,STRING_ERROR_NOBASICCOMPILER,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
2015        return 0;
2016    }
2017    FindClose(hFind);
2018
2019    //プロジェクト構造のバージョンが違う時は、再保存する
2020    if(projectInfo.dwVersion<PROJECT_VERSION)
2021        projectInfo.ModifyOfMaterial=1;
2022
2023    //保存確認
2024    if(!ProjectModifyCheck(1)) return 0;
2025
2026    return 1;
2027}
2028BOOL IsNeedCompileForProject(BOOL bDebug){
2029    int i2;
2030    char temporary[MAX_PATH];
2031    HANDLE hFind,hFile;
2032    WIN32_FIND_DATA wfd;
2033    FILETIME SourceTime,ExeTime;
2034
2035    if(bDebug) lstrcpy(temporary,projectInfo.lpszOutput_Debug);
2036    else lstrcpy(temporary,projectInfo.lpszOutput_Release);
2037    GetFullPath(temporary,projectInfo.dir);
2038
2039    hFind=FindFirstFile(temporary,&wfd);
2040    if(hFind==INVALID_HANDLE_VALUE) return 1;
2041    FindClose(hFind);
2042
2043    hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
2044    GetFileTime(hFile,NULL,NULL,&ExeTime);
2045    CloseHandle(hFile);
2046
2047    for(i2=0;i2<projectInfo.pobj_DBFileInfo->iNum;i2++){
2048        projectInfo.pobj_DBFileInfo->ppobj_FileInfo[i2]->GetFullPath(temporary);
2049        hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
2050        GetFileTime(hFile,NULL,NULL,&SourceTime);
2051        CloseHandle(hFile);
2052
2053        if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
2054            SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
2055            SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
2056    }
2057    if( !projectInfo.windowInfos.empty() )
2058    {
2059        //CallBack.wbp
2060        lstrcpy(temporary,"CallBack.wbp");
2061        GetFullPath(temporary,projectInfo.dir);
2062        hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
2063        GetFileTime(hFile,NULL,NULL,&SourceTime);
2064        CloseHandle(hFile);
2065        if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
2066            SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
2067            SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
2068
2069        //MakeWindow.wbp
2070        lstrcpy(temporary,"MakeWindow.wbp");
2071        GetFullPath(temporary,projectInfo.dir);
2072        hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
2073        GetFileTime(hFile,NULL,NULL,&SourceTime);
2074        CloseHandle(hFile);
2075        if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
2076            SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
2077            SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
2078    }
2079    return 0;
2080}
Note: See TracBrowser for help on using the repository browser.