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

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

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

File size: 68.2 KB
Line 
1#include "stdafx.h"
2
3#include "Common.h"
4
5using namespace ActiveBasic::IDE;
6
7#if defined(JPN)
8//日本語
9#include "pj_msg_jpn.h"
10#else
11//英語
12#include "pj_msg_eng.h"
13#endif
14
15HWND hProjectViewTab;
16HWND hProcedureTreeView,hMaterialTreeView;
17HIMAGELIST hProcedureTreeViewImageList,hMaterialTreeViewImageList;
18WNDPROC OldProcedureTreeViewProc,OldMaterialTreeViewProc;
19WNDPROC OldTabProc;
20
21LRESULT CALLBACK ProcedureTreeViewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
22    if(message==WM_CHAR&&wParam==VK_RETURN){
23        SendMessage(hProjectViewTab,WM_COMMAND,IDM_PROCEDURETREE_SHOW,0);
24        //デフォルトのメッセージ処理をするとビープ音がしてしまうので避ける
25        return 0;
26    }
27    else if(message==WM_LBUTTONDBLCLK){
28        SendMessage(hProjectViewTab,WM_COMMAND,IDM_PROCEDURETREE_SHOW,0);
29        return 0;
30    }
31    return CallWindowProc(OldProcedureTreeViewProc,hwnd,message,wParam,lParam);
32}
33LRESULT CALLBACK MaterialTreeViewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
34    if(message==WM_CHAR&&wParam==VK_RETURN){
35        SendMessage(hProjectViewTab,WM_COMMAND,IDM_MATERIALTREE_OPEN,0);
36        //デフォルトのメッセージ処理をするとビープ音がしてしまうので避ける
37        return 0;
38    }
39    if(message==WM_KEYDOWN&&wParam==VK_DELETE) SendMessage(hProjectViewTab,WM_COMMAND,IDM_MATERIALTREE_DELETE,0);
40    return CallWindowProc(OldMaterialTreeViewProc,hwnd,message,wParam,lParam);
41}
42LRESULT CALLBACK TabProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
43    extern HANDLE hHeap;
44    extern MDIINFO MdiInfo[MAX_WNDNUM];
45    extern LPSTR DefFileFilter;
46    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                                lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
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                            lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
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    lstrcpy( path, projectInfo.GetWorkDir().GetRelationalPath( path ).c_str() );
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                            lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
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                                    NewIconEditWindow( projectInfo.GetWorkDir().GetFullPath( temp2 ).c_str() );
1358                                    break;
1359                                }
1360                            }
1361                        }
1362                        i++;
1363                        i2=-1;
1364                        continue;
1365                    }
1366                    else break;
1367                }
1368                temporary[i2]=buffer[i];
1369            }
1370
1371            for(i+=2,i2=0;;i++,i2++){
1372                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1373                    temporary[i2]=0;
1374                    break;
1375                }
1376                temporary[i2]=buffer[i];
1377            }
1378            sscanf(temporary,"%d",&i2);
1379
1380            switch( i2 ){
1381                case 0:
1382                    ShowFileView();
1383                    break;
1384                case 1:
1385                    ShowClassView();
1386                    break;
1387                case 2:
1388                    ShowMaterialView();
1389                    break;
1390            }
1391
1392            if(buffer[i]=='\0') goto EndToSetWorkFile;
1393
1394            for(i+=2,i2=0;;i++,i2++){
1395                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1396                    temporary[i2]=0;
1397                    break;
1398                }
1399                temporary[i2]=buffer[i];
1400            }
1401            if(temporary[0]=='1') TreeView_Expand(pobj_FileTree->hTree,TreeView_GetRoot(pobj_FileTree->hTree),TVE_EXPAND);
1402
1403            for(i+=2,i2=0;;i++,i2++){
1404                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1405                    temporary[i2]=0;
1406                    break;
1407                }
1408                temporary[i2]=buffer[i];
1409            }
1410            if(temporary[0]=='1') TreeView_Expand(hProcedureTreeView,TreeView_GetRoot(hProcedureTreeView),TVE_EXPAND);
1411
1412            for(i+=2,i2=0;;i++,i2++){
1413                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1414                    temporary[i2]=0;
1415                    break;
1416                }
1417                temporary[i2]=buffer[i];
1418            }
1419            hTreeItem=TreeView_GetRoot(hMaterialTreeView);
1420            i2=0;
1421            while(hTreeItem){
1422                i2=GetOneParameter(temporary,i2,temp2);
1423                if(GetValue(temp2)) TreeView_Expand(hMaterialTreeView,hTreeItem,TVE_EXPAND);
1424                hTreeItem=TreeView_GetNextSibling(hMaterialTreeView,hTreeItem);
1425            }
1426        }
1427        else if(lstrcmp(temporary,"case3")==0){
1428            ////////////////////////////////////////
1429            // 古いフォーマットのワークファイル
1430
1431            LockWindowUpdate(hOwner);
1432            for(i=9,i2=0;;i++,i2++){
1433                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1434                    if(i2!=0){
1435                        temporary[i2]=0;
1436                        for(i3=0;;i3++){
1437                            if(temporary[i3]==','||temporary[i3]=='\0') break;
1438                        }
1439                        if(temporary[i3]=='\0') goto EndToSetWorkFile;
1440                        lstrcpy(temp2,temporary+i3+1);
1441                        temporary[i3]=0;
1442                        if(lstrcmpi(temporary,"text")==0){
1443                            for(i3=0;;i3++){
1444                                if(temp2[i3]==','||temp2[i3]=='\0') break;
1445                            }
1446                            if(temp2[i3]=='\0') goto EndToSetWorkFile;
1447                            lstrcpy(temporary,temp2+i3+1);
1448                            temp2[i3]=0;
1449                            lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1450                            sscanf(temp2,"%d",&i3);
1451
1452                            //ファイルを開く
1453                            hChild=OpenFileWithExtension(temporary);
1454                            WndNum=GetWndNum(hChild);
1455
1456                            //キャレット位置をセット
1457                            TextEdit_SetSel(WndNum,i3,i3);
1458                        }
1459                        else if(lstrcmpi(temporary,"rad")==0){
1460                            for(i3=0;i3<static_cast<int>(projectInfo.windowInfos.size());i3++){
1461                                if(lstrcmpi(projectInfo.windowInfos[i3]->GetName().c_str(),temp2)==0){
1462                                    NewRadWindow( *projectInfo.windowInfos[i3] );
1463                                    break;
1464                                }
1465                            }
1466                        }
1467                        else if(lstrcmpi(temporary,"menu")==0){
1468                            for(i3=0;i3<projectInfo.NumberOfMenu;i3++){
1469                                if(lstrcmpi(projectInfo.pMenuInfo[i3].IdName,temp2)==0){
1470                                    NewMenuWindow(&projectInfo.pMenuInfo[i3]);
1471                                    break;
1472                                }
1473                            }
1474                        }
1475                        else if(lstrcmpi(temporary,"icon")==0){
1476                            for(i3=0;i3<projectInfo.res.NumberOfIconRes;i3++){
1477                                if(lstrcmpi(projectInfo.res.pIconResInfo[i3].path,temp2)==0){
1478                                    NewIconEditWindow( projectInfo.GetWorkDir().GetFullPath( temp2 ).c_str() );
1479                                    break;
1480                                }
1481                            }
1482                        }
1483                        i++;
1484                        i2=-1;
1485                        continue;
1486                    }
1487                    else break;
1488                }
1489                temporary[i2]=buffer[i];
1490            }
1491
1492            for(i+=2,i2=0;;i++,i2++){
1493                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1494                    temporary[i2]=0;
1495                    break;
1496                }
1497                temporary[i2]=buffer[i];
1498            }
1499            sscanf(temporary,"%d",&i2);
1500
1501            switch( i2 ){
1502                case 0:
1503                    ShowFileView();
1504                    break;
1505                case 1:
1506                    ShowClassView();
1507                    break;
1508                case 2:
1509                    ShowMaterialView();
1510                    break;
1511            }
1512
1513            if(buffer[i]=='\0') goto EndToSetWorkFile;
1514
1515            for(i+=2,i2=0;;i++,i2++){
1516                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1517                    temporary[i2]=0;
1518                    break;
1519                }
1520                temporary[i2]=buffer[i];
1521            }
1522            if(temporary[0]=='1') TreeView_Expand(pobj_FileTree->hTree,TreeView_GetRoot(pobj_FileTree->hTree),TVE_EXPAND);
1523
1524            for(i+=2,i2=0;;i++,i2++){
1525                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1526                    temporary[i2]=0;
1527                    break;
1528                }
1529                temporary[i2]=buffer[i];
1530            }
1531            if(temporary[0]=='1') TreeView_Expand(hProcedureTreeView,TreeView_GetRoot(hProcedureTreeView),TVE_EXPAND);
1532
1533            for(i+=2,i2=0;;i++,i2++){
1534                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1535                    temporary[i2]=0;
1536                    break;
1537                }
1538                temporary[i2]=buffer[i];
1539            }
1540            hTreeItem=TreeView_GetRoot(hMaterialTreeView);
1541            i2=0;
1542            while(hTreeItem){
1543                i2=GetOneParameter(temporary,i2,temp2);
1544                if(GetValue(temp2)) TreeView_Expand(hMaterialTreeView,hTreeItem,TVE_EXPAND);
1545                hTreeItem=TreeView_GetNextSibling(hMaterialTreeView,hTreeItem);
1546            }
1547        }
1548EndToSetWorkFile:
1549        LockWindowUpdate(NULL);
1550        HeapDefaultFree(buffer);
1551    }
1552
1553
1554    //ウィンドウ タイトルを変更
1555    sprintf(temporary,"%s - %s",projectInfo.GetName().c_str(),APPLICATION_NAME);
1556    SetWindowText(hOwner,temporary);
1557}
1558BOOL ProjectModifyCheck(BOOL bRun){
1559    extern MDIINFO MdiInfo[MAX_WNDNUM];
1560    int i,WndNum,sw;
1561    HWND hChild;
1562    char temporary[MAX_PATH];
1563    if(projectInfo.modify||projectInfo.ModifyOfMaterial||projectInfo.ModifuOfResource){
1564        if(bRun==0||pobj_nv->bSaveCheckProject){
1565            //"\"%s\" プロジェクトは変更されています。保存しますか?"
1566            sprintf(temporary,STRING_MODIFYCHECK_PROJECT,projectInfo.GetName().c_str());
1567            i=MessageBox(hOwner,temporary,APPLICATION_NAME,MB_YESNOCANCEL|MB_ICONEXCLAMATION);
1568
1569            if(i==IDCANCEL) return 0;
1570            if(i==IDYES) SaveProject();
1571        }
1572        else SaveProject();
1573        return 1;
1574    }
1575    hChild=GetWindow(hClient,GW_CHILD);
1576    while(hChild){
1577        WndNum=GetWndNum(hChild);
1578        sw=0;
1579        if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
1580            if( MdiInfo[WndNum].pMdiTextEdit->IsModified() ){
1581                for(i=0;i<projectInfo.pobj_DBFileInfo->iNum;i++){
1582                    projectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->GetFullPath(temporary);
1583                    if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0) sw=1;
1584                }
1585            }
1586        }
1587        else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
1588            if(MdiInfo[WndNum].MdiIconEditInfo->bModify){
1589                for(i=0;i<projectInfo.res.NumberOfIconRes;i++){
1590                    lstrcpy(temporary,projectInfo.res.pIconResInfo[i].path);
1591                    lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1592                    if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0) sw=1;
1593                }
1594            }
1595        }
1596
1597        if(sw){
1598            if(bRun==0||pobj_nv->bSaveCheckProject){
1599                //"\"%s\" プロジェクトは変更されています。保存しますか?"
1600                sprintf(temporary,STRING_MODIFYCHECK_PROJECT,projectInfo.GetName().c_str());
1601                i=MessageBox(hOwner,temporary,APPLICATION_NAME,MB_YESNOCANCEL|MB_ICONEXCLAMATION);
1602
1603                if(i==IDCANCEL) return 0;
1604                if(i==IDYES) SaveProject();
1605            }
1606            else SaveProject();
1607            return 1;
1608        }
1609        hChild=GetNextWindow(hChild,GW_HWNDNEXT);
1610    }
1611    return 2;
1612}
1613void MakeWorkFile(void){
1614    extern MDIINFO MdiInfo[MAX_WNDNUM];
1615    int i,i2,WndNum;
1616    char temporary[MAX_PATH],buffer[32767];
1617    HWND hChild;
1618    CHARRANGE CharRange;
1619
1620    //ワークファイル(*.wrk)を作成
1621    lstrcpy(buffer,"case4\r\n\r\n");
1622    i2=lstrlen(buffer);
1623
1624
1625    ///////////////////////
1626    //MDIウィンドウの並び
1627    hChild=GetWindow(GetWindow(hClient,GW_CHILD),GW_HWNDLAST);
1628    while(hChild){
1629        WndNum=GetWndNum(hChild);
1630        if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
1631            for(i=0;i<projectInfo.pobj_DBFileInfo->iNum;i++){
1632                projectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->GetFullPath(temporary);
1633                if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
1634                    TextEdit_GetSel(WndNum,&CharRange);
1635
1636                    SCROLLINFO si;
1637                    POINT pos;
1638                    si.cbSize=sizeof(SCROLLINFO);
1639                    si.fMask=SIF_POS;
1640                    GetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_HORZ,&si);
1641                    pos.x=si.nPos;
1642                    GetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_VERT,&si);
1643                    pos.y=si.nPos;
1644
1645                    sprintf(buffer+i2,"text,\"%s\",%d,%d,%d,%d\r\n",
1646                        projectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->m_path,
1647                        pos.x,
1648                        pos.y,
1649                        CharRange.cpMin,
1650                        CharRange.cpMax);
1651                    i2+=lstrlen(buffer+i2);
1652                    break;
1653                }
1654            }
1655        }
1656        else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){
1657            BOOST_FOREACH( WindowInfo *pWindowInfo, projectInfo.windowInfos )
1658            {
1659                if(lstrcmpi(MdiInfo[WndNum].path,pWindowInfo->GetName().c_str())==0){
1660                    sprintf(buffer+i2,"rad,%s\r\n",MdiInfo[WndNum].path);
1661                    i2+=lstrlen(buffer+i2);
1662                    break;
1663                }
1664            }
1665        }
1666        else if(MdiInfo[WndNum].DocType==WNDTYPE_MENU){
1667            for(i=0;i<projectInfo.NumberOfMenu;i++){
1668                if(lstrcmpi(MdiInfo[WndNum].path,projectInfo.pMenuInfo[i].IdName)==0){
1669                    sprintf(buffer+i2,"menu,%s\r\n",MdiInfo[WndNum].path);
1670                    i2+=lstrlen(buffer+i2);
1671                    break;
1672                }
1673            }
1674        }
1675        else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
1676            for(i=0;i<projectInfo.res.NumberOfIconRes;i++){
1677                lstrcpy(temporary,projectInfo.res.pIconResInfo[i].path);
1678                lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1679                if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
1680                    sprintf(buffer+i2,"icon,%s\r\n",projectInfo.res.pIconResInfo[i].path);
1681                    i2+=lstrlen(buffer+i2);
1682                    break;
1683                }
1684            }
1685        }
1686        hChild=GetNextWindow(hChild,GW_HWNDPREV);
1687    }
1688    lstrcpy(buffer+i2,"\r\n");
1689    i2+=2;
1690
1691
1692    //////////////////////////
1693    //ツリービューの展開状況
1694    sprintf(buffer+i2,"%d\r\n",TabCtrl_GetCurSel(hProjectViewTab));
1695    i2+=lstrlen(buffer+i2);
1696    TVITEM tvItem;
1697    memset(&tvItem,0,sizeof(TVITEM));
1698    tvItem.mask=TVIF_HANDLE|TVIF_STATE;
1699    tvItem.hItem=TreeView_GetRoot(pobj_FileTree->hTree);
1700    TreeView_GetItem(pobj_FileTree->hTree,&tvItem);
1701    if(tvItem.state&TVIS_EXPANDED) i=1;
1702    else i=0;
1703    sprintf(buffer+i2,"%d\r\n",i);
1704    i2+=lstrlen(buffer+i2);
1705
1706    tvItem.hItem=TreeView_GetRoot(hProcedureTreeView);
1707    TreeView_GetItem(hProcedureTreeView,&tvItem);
1708    if(tvItem.state&TVIS_EXPANDED) i=1;
1709    else i=0;
1710    sprintf(buffer+i2,"%d\r\n",i);
1711    i2+=lstrlen(buffer+i2);
1712
1713    tvItem.hItem=TreeView_GetRoot(hMaterialTreeView);
1714    while(tvItem.hItem){
1715        TreeView_GetItem(hMaterialTreeView,&tvItem);
1716        if(tvItem.state&TVIS_EXPANDED) i=1;
1717        else i=0;
1718        sprintf(buffer+i2,"%d",i);
1719        i2+=lstrlen(buffer+i2);
1720
1721        tvItem.hItem=TreeView_GetNextSibling(hMaterialTreeView,tvItem.hItem);
1722        if(tvItem.hItem){
1723            lstrcpy(buffer+i2,",");
1724            i2+=lstrlen(buffer+i2);
1725        }
1726    }
1727
1728
1729    //保存
1730    sprintf(temporary,"%s%s.wrk",projectInfo.GetWorkDir().GetPath().c_str(),projectInfo.GetName().c_str());
1731    WriteBuffer(temporary,buffer,i2);
1732}
1733void SaveProject(void){
1734    extern MDIINFO MdiInfo[MAX_WNDNUM];
1735    int i,i2,i3,WndNum;
1736    char temporary[MAX_PATH],buffer[32767];
1737    HWND hChild;
1738
1739    //"プロジェクトを保存中..."
1740    SetStatusText(STRING_PROJECT_SAVING);
1741
1742    //プロジェクトファイルのバージョンを設定
1743    projectInfo.dwVersion=PROJECT_VERSION;
1744
1745    hChild=GetWindow(hClient,GW_CHILD);
1746    while(hChild){
1747        WndNum=GetWndNum(hChild);
1748        if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
1749            if( MdiInfo[WndNum].pMdiTextEdit->IsModified() ){
1750                for(i=0;i<projectInfo.pobj_DBFileInfo->iNum;i++){
1751                    projectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->GetFullPath(temporary);
1752                    if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
1753                        SaveDocument(hChild,NULL);
1754                        break;
1755                    }
1756                }
1757            }
1758        }
1759        if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
1760            if(MdiInfo[WndNum].MdiIconEditInfo->bModify){
1761                for(i=0;i<projectInfo.res.NumberOfIconRes;i++){
1762                    lstrcpy(temporary,projectInfo.res.pIconResInfo[i].path);
1763                    lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1764                    if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
1765                        SaveDocument(hChild,NULL);
1766                        break;
1767                    }
1768                }
1769            }
1770        }
1771        hChild=GetNextWindow(hChild,GW_HWNDNEXT);
1772    }
1773
1774
1775    //////////////////////////////////////
1776    //プロジェクトファイル(*.pj)を作成
1777    lstrcpy(buffer,"\' ActiveBasic Project file.\r\n\r\n");
1778    i2=lstrlen(buffer);
1779    sprintf(buffer+i2,"#VERSION=%d\r\n\r\n",projectInfo.dwVersion);
1780    i2+=lstrlen(buffer+i2);
1781    sprintf(buffer+i2,"#MODULETYPE=%d\r\n\r\n",(int)projectInfo.GetModuleType());
1782    i2+=lstrlen(buffer+i2);
1783    sprintf(buffer+i2,"#NAME=%s\r\n\r\n",projectInfo.GetName().c_str());
1784    i2+=lstrlen(buffer+i2);
1785    extern HWND hSelectCompilerCombo;
1786    if(SendMessage(hSelectCompilerCombo,CB_GETCURSEL,0,0)==0){
1787        sprintf(buffer+i2,"#PLATFORM=32\r\n\r\n",projectInfo.GetName().c_str());
1788        i2+=lstrlen(buffer+i2);
1789    }
1790    else{
1791        sprintf(buffer+i2,"#PLATFORM=64\r\n\r\n",projectInfo.GetName().c_str());
1792        i2+=lstrlen(buffer+i2);
1793    }
1794    sprintf(buffer+i2,"#USEWINDOW=%d\r\n\r\n",projectInfo.windowInfos.size());
1795    i2+=lstrlen(buffer+i2);
1796    sprintf(buffer+i2,"#OPTION=&H%08x\r\n\r\n",projectInfo.dwOption);
1797    i2+=lstrlen(buffer+i2);
1798    sprintf(buffer+i2,"#OUTPUT_RELEASE=%s\r\n\r\n",projectInfo.lpszOutput_Release);
1799    i2+=lstrlen(buffer+i2);
1800    sprintf(buffer+i2,"#OUTPUT_DEBUG=%s\r\n\r\n",projectInfo.lpszOutput_Debug);
1801    i2+=lstrlen(buffer+i2);
1802    sprintf(buffer+i2,"#MANIFEST=%s\r\n\r\n",projectInfo.szManifestPath);
1803    i2+=lstrlen(buffer+i2);
1804    sprintf(buffer+i2,"#DEBUG_CMD_LINE=%s\r\n\r\n",projectInfo.szCmdLine);
1805    i2+=lstrlen(buffer+i2);
1806    sprintf(buffer+i2,"#DEBUG_EXE_PATH=%s\r\n\r\n",projectInfo.szExePath);
1807    i2+=lstrlen(buffer+i2);
1808    if(projectInfo.ResourceFileName[0]){
1809        sprintf(buffer+i2,"#RESOURCE=%s\r\n\r\n",projectInfo.ResourceFileName);
1810        i2+=lstrlen(buffer+i2);
1811    }
1812    else{
1813        lstrcpy(buffer+i2,"#RESOURCE=0\r\n\r\n");
1814        i2+=lstrlen(buffer+i2);
1815    }
1816    sprintf(buffer+i2,"#SOURCE\r\n");
1817    i2+=lstrlen(buffer+i2);
1818    for(i=0;i<projectInfo.pobj_DBFileInfo->iNum;i++){
1819        sprintf(buffer+i2,"%s\r\n",projectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->m_path);
1820        i2+=lstrlen(buffer+i2);
1821    }
1822
1823    //保存
1824    sprintf(temporary,"%s%s.pj",projectInfo.GetWorkDir().GetPath().c_str(),projectInfo.GetName().c_str());
1825    WriteBuffer(temporary,buffer,i2);
1826
1827
1828    //////////////////////////////////
1829    // リソースファイル(*.rc、resource.ab)を作成
1830    if(projectInfo.ResourceFileName[0]){
1831        i2=0;
1832        i3=101;
1833        for(i=0;i<projectInfo.res.NumberOfCursorRes;i++,i3++){
1834            sprintf(buffer+i2,"Const %s=%d\r\n",
1835                projectInfo.res.pCursorResInfo[i].IdName,
1836                i3);
1837            i2+=lstrlen(buffer+i2);
1838        }
1839        for(i=0;i<projectInfo.res.NumberOfBitmapRes;i++,i3++){
1840            sprintf(buffer+i2,"Const %s=%d\r\n",
1841                projectInfo.res.pBitmapResInfo[i].IdName,
1842                i3);
1843            i2+=lstrlen(buffer+i2);
1844        }
1845        for(i=0;i<projectInfo.res.NumberOfIconRes;i++,i3++){
1846            sprintf(buffer+i2,"Const %s=%d\r\n",
1847                projectInfo.res.pIconResInfo[i].IdName,
1848                i3);
1849            i2+=lstrlen(buffer+i2);
1850        }
1851
1852        //保存(resource.ab)
1853        lstrcpy(temporary,"resource.ab");
1854        lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1855        WriteBuffer(temporary,buffer,i2);
1856
1857        i2=0;
1858        for(i=0;i<projectInfo.res.NumberOfCursorRes;i++){
1859            sprintf(buffer+i2,"%s CURSOR \"%s\"\r\n",
1860                projectInfo.res.pCursorResInfo[i].IdName,
1861                projectInfo.res.pCursorResInfo[i].path);
1862            i2+=lstrlen(buffer+i2);
1863        }
1864        for(i=0;i<projectInfo.res.NumberOfBitmapRes;i++){
1865            sprintf(buffer+i2,"%s BITMAP \"%s\"\r\n",
1866                projectInfo.res.pBitmapResInfo[i].IdName,
1867                projectInfo.res.pBitmapResInfo[i].path);
1868            i2+=lstrlen(buffer+i2);
1869        }
1870        for(i=0;i<projectInfo.res.NumberOfIconRes;i++){
1871            sprintf(buffer+i2,"%s ICON \"%s\"\r\n",
1872                projectInfo.res.pIconResInfo[i].IdName,
1873                projectInfo.res.pIconResInfo[i].path);
1874            i2+=lstrlen(buffer+i2);
1875        }
1876
1877        //マニフェスト
1878        if(projectInfo.dwOption&PJ_OP_RC_MANIFEST){
1879            sprintf(buffer+i2,"CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST \"%s\"\r\n",
1880                projectInfo.szManifestPath);
1881            i2+=lstrlen(buffer+i2);
1882        }
1883
1884        //保存
1885        lstrcpy(temporary,projectInfo.ResourceFileName);
1886        lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1887        WriteBuffer(temporary,buffer,i2);
1888    }
1889
1890
1891    ///////////////////////////////////////
1892    //インデックスファイル(*.idx)を作成
1893    buffer[0]=0;
1894    lstrcpy(buffer,"' インデックス プログラム\r\n");
1895    i2=lstrlen(buffer);
1896    if(projectInfo.dwOption&PJ_OP_SOURCE_MASK){
1897        if(projectInfo.dwOption&PJ_OP_STRICT){
1898            /* #strictディレクティブは今は使われていない
1899            lstrcpy(buffer+i2,"\r\n");
1900            i2+=lstrlen(buffer+i2);
1901            lstrcpy(buffer+i2,"#strict");
1902            i2+=lstrlen(buffer+i2);
1903            lstrcpy(buffer+i2,"\r\n");
1904            i2+=lstrlen(buffer+i2);
1905            */
1906        }
1907        lstrcpy(buffer+i2,"\r\n");
1908        i2+=lstrlen(buffer+i2);
1909        lstrcpy(buffer+i2,"'Win32APIの定義ファイル\r\n");
1910        i2+=lstrlen(buffer+i2);
1911        if(projectInfo.dwOption&PJ_OP_MMSYSTEM){
1912            lstrcpy(buffer+i2,"#include <api_mmsys.sbp>\r\n");
1913            i2+=lstrlen(buffer+i2);
1914        }
1915        if(projectInfo.dwOption&PJ_OP_COMMCTRL){
1916            lstrcpy(buffer+i2,"#include <api_commctrl.sbp>\r\n");
1917            i2+=lstrlen(buffer+i2);
1918        }
1919        if(projectInfo.dwOption&PJ_OP_RICHEDIT){
1920            lstrcpy(buffer+i2,"#include <api_richedit.sbp>\r\n");
1921            i2+=lstrlen(buffer+i2);
1922        }
1923        if(projectInfo.dwOption&PJ_OP_WINSOCK){
1924            lstrcpy(buffer+i2,"#include <api_winsock2.sbp>\r\n");
1925            i2+=lstrlen(buffer+i2);
1926        }
1927    }
1928    if( !projectInfo.windowInfos.empty() )
1929    {
1930        lstrcpy(buffer+i2,"\r\n");
1931        i2+=lstrlen(buffer+i2);
1932        lstrcpy(buffer+i2,"'RADツールが生成するウィンドウ制御プログラム\r\n");
1933        i2+=lstrlen(buffer+i2);
1934        sprintf(buffer+i2,"#include \"Callback.wbp\"\r\n");
1935        i2+=lstrlen(buffer+i2);
1936    }
1937    if(projectInfo.pobj_DBFileInfo->iNum>1){
1938        lstrcpy(buffer+i2,"\r\n");
1939        i2+=lstrlen(buffer+i2);
1940        lstrcpy(buffer+i2,"'プロジェクト内のプログラム ファイル\r\n");
1941        i2+=lstrlen(buffer+i2);
1942        for(i=1;i<projectInfo.pobj_DBFileInfo->iNum;i++){
1943            //メインファイルは含まない
1944            sprintf(buffer+i2,"#include \"%s\"\r\n",projectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->m_path);
1945            i2+=lstrlen(buffer+i2);
1946            lstrcpy(buffer+i2,"_ClearNamespaceImported\r\n");
1947            i2+=lstrlen(buffer+i2);
1948        }
1949    }
1950    if( !projectInfo.windowInfos.empty() )
1951    {
1952        lstrcpy(buffer+i2,"\r\n");
1953        i2+=lstrlen(buffer+i2);
1954        lstrcpy(buffer+i2,"'RADツールが生成するウィンドウ生成プログラム\r\n");
1955        i2+=lstrlen(buffer+i2);
1956        sprintf(buffer+i2,"#include \"MakeWindow.wbp\"\r\n");
1957        i2+=lstrlen(buffer+i2);
1958    }
1959    if(projectInfo.ResourceFileName[0]){
1960        //リソースファイルが含まれる場合
1961        lstrcpy(buffer+i2,"\r\n");
1962        i2+=lstrlen(buffer+i2);
1963        lstrcpy(buffer+i2,"'リソースファイル\r\n");
1964        i2+=lstrlen(buffer+i2);
1965        lstrcpy(buffer+i2,"#include \"resource.ab\"\r\n");
1966        i2+=lstrlen(buffer+i2);
1967        sprintf(buffer+i2,"#resource \"%s.rc\"\r\n",projectInfo.GetName().c_str());
1968        i2+=lstrlen(buffer+i2);
1969    }
1970
1971    //保存
1972    sprintf(temporary,"%s%s.idx",projectInfo.GetWorkDir().GetPath().c_str(),projectInfo.GetName().c_str());
1973    WriteBuffer(temporary,buffer,i2);
1974
1975
1976    if( !projectInfo.windowInfos.empty() )
1977    {
1978        /////////////////////////////////////////////////////
1979        //ウィンドウ関連ファイル(*.wnd)を作成、保存
1980        if(projectInfo.ModifyOfMaterial){
1981            sprintf(temporary,"%s%s.wnd",projectInfo.GetWorkDir().GetPath().c_str(),projectInfo.GetName().c_str());
1982            SaveWindowFile( temporary, projectInfo.windowInfos );
1983        }
1984
1985        //.wbpファイルを生成
1986        SaveWindowProgram();
1987    }
1988
1989
1990    MakeWorkFile();
1991
1992    SetStatusText("");
1993
1994    projectInfo.modify=0;
1995    projectInfo.ModifuOfResource=0;
1996}
1997
1998BOOL SetProjectToRun(void){
1999    HANDLE hFind;
2000    WIN32_FIND_DATA wfd;
2001
2002    if(projectInfo.pobj_DBFileInfo->iNum==0){
2003        //"プログラム ファイルがプロジェクトに存在しません。"
2004        MessageBox(hOwner,STRING_ERROR_NOFILE,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
2005        return 0;
2006    }
2007
2008    extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
2009    hFind=FindFirstFile( ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ).c_str(), &wfd );
2010    if(hFind==INVALID_HANDLE_VALUE){
2011        //"BasicCompiler.exe が見つかりません"
2012        MessageBox(hOwner,STRING_ERROR_NOBASICCOMPILER,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
2013        return 0;
2014    }
2015    FindClose(hFind);
2016
2017    //プロジェクト構造のバージョンが違う時は、再保存する
2018    if(projectInfo.dwVersion<PROJECT_VERSION)
2019        projectInfo.ModifyOfMaterial=1;
2020
2021    //保存確認
2022    if(!ProjectModifyCheck(1)) return 0;
2023
2024    return 1;
2025}
2026BOOL IsNeedCompileForProject(BOOL bDebug){
2027    int i2;
2028    char temporary[MAX_PATH];
2029    HANDLE hFind,hFile;
2030    WIN32_FIND_DATA wfd;
2031    FILETIME SourceTime,ExeTime;
2032
2033    if(bDebug) lstrcpy(temporary,projectInfo.lpszOutput_Debug);
2034    else lstrcpy(temporary,projectInfo.lpszOutput_Release);
2035    lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
2036
2037    hFind=FindFirstFile(temporary,&wfd);
2038    if(hFind==INVALID_HANDLE_VALUE) return 1;
2039    FindClose(hFind);
2040
2041    hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
2042    GetFileTime(hFile,NULL,NULL,&ExeTime);
2043    CloseHandle(hFile);
2044
2045    for(i2=0;i2<projectInfo.pobj_DBFileInfo->iNum;i2++){
2046        projectInfo.pobj_DBFileInfo->ppobj_FileInfo[i2]->GetFullPath(temporary);
2047        hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
2048        GetFileTime(hFile,NULL,NULL,&SourceTime);
2049        CloseHandle(hFile);
2050
2051        if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
2052            SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
2053            SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
2054    }
2055    if( !projectInfo.windowInfos.empty() )
2056    {
2057        //CallBack.wbp
2058        lstrcpy(temporary,"CallBack.wbp");
2059        lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
2060        hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
2061        GetFileTime(hFile,NULL,NULL,&SourceTime);
2062        CloseHandle(hFile);
2063        if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
2064            SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
2065            SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
2066
2067        //MakeWindow.wbp
2068        lstrcpy(temporary,"MakeWindow.wbp");
2069        lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
2070        hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
2071        GetFileTime(hFile,NULL,NULL,&SourceTime);
2072        CloseHandle(hFile);
2073        if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
2074            SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
2075            SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
2076    }
2077    return 0;
2078}
Note: See TracBrowser for help on using the repository browser.