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

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

・WindowInfoクラスをリファクタリング
・MdiInfoを単純配列からvectorに変更した。

File size: 60.8 KB
Line 
1#include "stdafx.h"
2
3#include "Common.h"
4
5using namespace ActiveBasic::IDE;
6
7#if defined(JPN)
8//日本語
9#include "pj_msg_jpn.h"
10#else
11//英語
12#include "pj_msg_eng.h"
13#endif
14
15HWND hProjectViewTab;
16HWND hProcedureTreeView,hMaterialTreeView;
17HIMAGELIST hProcedureTreeViewImageList,hMaterialTreeViewImageList;
18WNDPROC OldProcedureTreeViewProc,OldMaterialTreeViewProc;
19WNDPROC OldTabProc;
20
21LRESULT CALLBACK ProcedureTreeViewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
22    if(message==WM_CHAR&&wParam==VK_RETURN){
23        SendMessage(hProjectViewTab,WM_COMMAND,IDM_PROCEDURETREE_SHOW,0);
24        //デフォルトのメッセージ処理をするとビープ音がしてしまうので避ける
25        return 0;
26    }
27    else if(message==WM_LBUTTONDBLCLK){
28        SendMessage(hProjectViewTab,WM_COMMAND,IDM_PROCEDURETREE_SHOW,0);
29        return 0;
30    }
31    return CallWindowProc(OldProcedureTreeViewProc,hwnd,message,wParam,lParam);
32}
33LRESULT CALLBACK MaterialTreeViewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
34    if(message==WM_CHAR&&wParam==VK_RETURN){
35        SendMessage(hProjectViewTab,WM_COMMAND,IDM_MATERIALTREE_OPEN,0);
36        //デフォルトのメッセージ処理をするとビープ音がしてしまうので避ける
37        return 0;
38    }
39    if(message==WM_KEYDOWN&&wParam==VK_DELETE) SendMessage(hProjectViewTab,WM_COMMAND,IDM_MATERIALTREE_DELETE,0);
40    return CallWindowProc(OldMaterialTreeViewProc,hwnd,message,wParam,lParam);
41}
42LRESULT CALLBACK TabProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
43    extern HANDLE hHeap;
44    extern LPSTR DefFileFilter;
45    int i,i2,WndNum;
46    char str[MAX_PATH],temporary[MAX_PATH];
47    HWND hTree,hChild;
48    HTREEITEM hTreeItem,hTreeItem2;
49    TV_HITTESTINFO tvHitTestInfo;
50    TVITEM tvItem;
51
52    switch(message){
53        case WM_CONTEXTMENU:
54            i=TabCtrl_GetCurSel(hwnd);
55            if(i==0){
56                //ファイルツリー
57                POINT pos;
58                pos.x=LOWORD(lParam);
59                pos.y=HIWORD(lParam);
60                pobj_FileTree->ContextMenu(&pos);
61                return 0;
62            }
63            else if(i==1) hTree=hProcedureTreeView;
64            else if(i==2) hTree=hMaterialTreeView;
65            tvHitTestInfo.pt.x=LOWORD(lParam);
66            tvHitTestInfo.pt.y=HIWORD(lParam);
67            ScreenToClient(hTree,&tvHitTestInfo.pt);
68            hTreeItem=TreeView_HitTest(hTree,&tvHitTestInfo);
69            if(hTreeItem){
70                TreeView_SelectItem(hTree,hTreeItem);
71                if(i==1){
72                    extern HMENU hProcedureTreeMenuBase;
73                    if(TreeView_GetRoot(hTree)!=hTreeItem)
74                        TrackPopupMenu(GetSubMenu(hProcedureTreeMenuBase,1),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
75                }
76                else if(i==2){
77                    extern HMENU hMaterialTreeMenuBase;
78                    hTreeItem2=TreeView_GetRoot(hTree);
79                    for(i2=0;;i2++){
80                        if(hTreeItem2==hTreeItem) break;
81                        hTreeItem2=TreeView_GetNextSibling(hTree,hTreeItem2);
82                        if(!hTreeItem2) break;
83                    }
84                    if(hTreeItem2){
85                        if(i2==0)
86                            TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,0),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
87                        else if(i2==1)
88                            TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,2),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
89                        else if(i2==2)
90                            TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,4),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
91                        else if(i2==3)
92                            TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,6),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
93                        else if(i2==4)
94                            TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,8),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
95                    }
96                    else{
97                        hTreeItem=TreeView_GetNextItem(hTree,hTreeItem,TVGN_PARENT);
98                        hTreeItem2=TreeView_GetRoot(hTree);
99                        for(i2=0;;i2++){
100                            if(hTreeItem2==hTreeItem) break;
101                            hTreeItem2=TreeView_GetNextSibling(hTree,hTreeItem2);
102                            if(!hTreeItem2) break;
103                        }
104                        if(hTreeItem2){
105                            if(i2==0)
106                                TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,1),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
107                            else if(i2==1)
108                                TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,3),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
109                            else if(i2==2)
110                                TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,5),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
111                            else if(i2==3)
112                                TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,7),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
113                            else if(i2==4)
114                                TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,9),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
115                        }
116                    }
117                }
118            }
119            break;
120        case WM_COMMAND:
121            switch(LOWORD(wParam)){
122
123                case IDM_PROCEDURETREE_SHOW:
124                    extern BOOL bSearchingClasses;
125                    if(bSearchingClasses){
126                        pobj_ClassTreeView->bShowSwitch=1;
127                        break;
128                    }
129
130                    hTreeItem=TreeView_GetSelection(hProcedureTreeView);
131                    for(i=0;i<pobj_ClassTreeView->NumberOfProcedures;i++){
132                        if(pobj_ClassTreeView->pProcInfo[i].hTreeItem==hTreeItem){
133
134                            if( projectInfo.IsOpened() ){
135                                // 対象ファイルを開く
136                                lstrcpy(temporary,
137                                    projectInfo.pobj_DBFileInfo->ppobj_FileInfo[pobj_ClassTreeView->pProcInfo[i].FileNum]->m_path);
138                                lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
139                                hChild=OpenFileWithExtension(temporary);
140                            }
141                            else{
142                                hChild = GetWindow(hClient,GW_CHILD);
143                            }
144
145                            //プロシージャの行を選択する
146                            //ResetScrollbarが再描画時に呼び出されるので、再描画する
147                            WndNum=GetWndNum(hChild);
148                            InvalidateRect(MdiInfo[WndNum].pMdiTextEdit->hEdit,NULL,0);
149                            UpdateWindow(MdiInfo[WndNum].pMdiTextEdit->hEdit);
150                            TextEdit_SelectOneLine(WndNum,pobj_ClassTreeView->pProcInfo[i].code_pos,TRUE);
151
152                            //タイマーをセット
153                            // ※フォーカスをエディタにセットするため
154                            // ※タイミングを遅らせてSetFocusを実行する必要あり
155                            SetTimer(hwnd,100,10,NULL);
156
157                            break;
158                        }
159                    }
160
161                    break;
162
163                case IDM_MATERIALTREE_INSERTCURSOR:
164                    Project_CursorResInsert();
165                    break;
166                case IDM_MATERIALTREE_INSERTBITMAP:
167                    Project_BitmapResInsert();
168                    break;
169                case IDM_MATERIALTREE_INSERTICON:
170                    Project_IconResInsert();
171                    break;
172                case IDM_MATERIALTREE_INSERTMENU:
173                    Project_Menu_Insert();
174                    break;
175                case IDM_MATERIALTREE_INSERTWINDOW:
176                    Project_Window_Insert();
177                    break;
178                case IDM_MATERIALTREE_OPEN:
179                    hTreeItem=TreeView_GetSelection(hMaterialTreeView);
180                    for(i=0;i<static_cast<int>(projectInfo.windowInfos.size());i++){
181                        if(projectInfo.windowInfos[i]->hTreeItem==hTreeItem){
182                            NewRadWindow( *projectInfo.windowInfos[i] );
183                            break;
184                        }
185                    }
186                    for(i=0;i<projectInfo.NumberOfMenu;i++){
187                        if(projectInfo.pMenuInfo[i].hTreeItem==hTreeItem){
188                            NewMenuWindow(&projectInfo.pMenuInfo[i]);
189                            break;
190                        }
191                    }
192                    BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
193                    {
194                        if( resourceItem.hTreeItem == hTreeItem )
195                        {
196                            NewIconEditWindow(
197                                projectInfo.GetWorkDir().GetFullPath( resourceItem.filepath ).c_str()
198                            );
199                            break;
200                        }
201                    }
202                    break;
203                case IDM_MATERIALTREE_DELETE:
204                    hTreeItem=TreeView_GetSelection(hMaterialTreeView);
205                    for(i=0;i<static_cast<int>(projectInfo.resourceManager.cursorResources.size());i++){
206                        if(projectInfo.resourceManager.cursorResources[i].hTreeItem==hTreeItem){
207
208                            //"%s カーソルをプロジェクトから削除します。よろしいですか?"
209                            sprintf(str,STRING_PJ_CHECK_DELETECURSOR,projectInfo.resourceManager.cursorResources[i].idName.c_str());
210                            if(IDCANCEL==MessageBox(hOwner,str,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
211
212                            Project_Cursor_Delete(i);
213                            break;
214                        }
215                    }
216                    for(i=0;i<static_cast<int>(projectInfo.resourceManager.bitmapResources.size());i++){
217                        if(projectInfo.resourceManager.bitmapResources[i].hTreeItem==hTreeItem){
218
219                            //"%s ビットマップをプロジェクトから削除します。よろしいですか?"
220                            sprintf(str,STRING_PJ_CHECK_DELETEBITMAP,projectInfo.resourceManager.bitmapResources[i].idName.c_str());
221                            if(IDCANCEL==MessageBox(hOwner,str,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
222
223                            Project_Bitmap_Delete(i);
224                            break;
225                        }
226                    }
227                    for(i=0;i<static_cast<int>(projectInfo.resourceManager.iconResources.size());i++){
228                        if(projectInfo.resourceManager.iconResources[i].hTreeItem==hTreeItem){
229
230                            //"%s アイコンをプロジェクトから削除します。よろしいですか?"
231                            sprintf(str,STRING_PJ_CHECK_DELETEICON,projectInfo.resourceManager.iconResources[i].idName.c_str());
232                            if(IDCANCEL==MessageBox(hOwner,str,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
233
234                            Project_Icon_Delete(i);
235                            break;
236                        }
237                    }
238                    for(i=0;i<projectInfo.NumberOfMenu;i++){
239                        if(projectInfo.pMenuInfo[i].hTreeItem==hTreeItem){
240
241                            //"%s メニューをプロジェクトから削除します。よろしいですか?"
242                            sprintf(str,STRING_PJ_CHECK_DELETEMENU,projectInfo.pMenuInfo[i].IdName);
243                            if(IDCANCEL==MessageBox(hOwner,str,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
244
245                            Project_Menu_Delete(i);
246                            break;
247                        }
248                    }
249                    for(i=0;i<static_cast<int>(projectInfo.windowInfos.size());i++){
250                        if(projectInfo.windowInfos[i]->hTreeItem==hTreeItem){
251
252                            //"%s ウィンドウをプロジェクトから削除します。よろしいですか?"
253                            sprintf(str,STRING_PJ_CHECK_DELETEWINDOW,projectInfo.windowInfos[i]->GetName().c_str());
254                            if(IDCANCEL==MessageBox(hOwner,str,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
255
256                            Project_Window_Delete(i);
257                            break;
258                        }
259                    }
260                    break;
261                case IDM_MENUTREE_RENAMEID:
262                    extern char NewIdName[MAX_PATH];
263                    hTreeItem=TreeView_GetSelection(hMaterialTreeView);
264                    for(i=0;i<static_cast<int>(projectInfo.resourceManager.cursorResources.size());i++){
265                        if(projectInfo.resourceManager.cursorResources[i].hTreeItem==hTreeItem){
266                            Project_Cursor_RenameID(i);
267                            break;
268                        }
269                    }
270                    for(i=0;i<static_cast<int>(projectInfo.resourceManager.bitmapResources.size());i++){
271                        if(projectInfo.resourceManager.bitmapResources[i].hTreeItem==hTreeItem){
272                            Project_Bitmap_RenameID(i);
273                            break;
274                        }
275                    }
276                    for(i=0;i<static_cast<int>(projectInfo.resourceManager.iconResources.size());i++){
277                        if(projectInfo.resourceManager.iconResources[i].hTreeItem==hTreeItem){
278                            Project_Icon_RenameID(i);
279                        }
280                    }
281                    for(i=0;i<projectInfo.NumberOfMenu;i++){
282                        if(projectInfo.pMenuInfo[i].hTreeItem==hTreeItem){
283                            if(!DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_INPUTID),hOwner,(DLGPROC)DlgProject_MenuID_Input,(long)projectInfo.pMenuInfo[i].IdName)) break;
284
285                            //重複チェック
286                            for(i2=0;i2<projectInfo.NumberOfMenu;i2++){
287                                if(i2==i) continue;
288                                if(lstrcmp(NewIdName,projectInfo.pMenuInfo[i2].IdName)==0){
289                                    //"ID \"%s\" は既にプロジェクト内に存在します。"
290                                    sprintf(temporary,STRING_DUPLICATIONERROR_ID_IN_PROJECT,NewIdName);
291                                    MessageBox(hOwner,temporary,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
292                                    return 0;
293                                }
294                            }
295
296                            HeapDefaultFree(projectInfo.pMenuInfo[i].IdName);
297                            projectInfo.pMenuInfo[i].IdName=(char *)HeapAlloc(hHeap,0,lstrlen(NewIdName)+1);
298                            lstrcpy(projectInfo.pMenuInfo[i].IdName,NewIdName);
299
300                            tvItem.hItem=hTreeItem;
301                            tvItem.mask=TVIF_TEXT;
302                            tvItem.pszText=projectInfo.pMenuInfo[i].IdName;
303                            tvItem.cchTextMax=lstrlen(projectInfo.pMenuInfo[i].IdName)+1;
304                            TreeView_SetItem(hMaterialTreeView,&tvItem);
305
306                            projectInfo.ModifyOfMaterial=1;
307
308                            TreeView_SortChildren(hMaterialTreeView,
309                                TreeView_GetParent(hMaterialTreeView,hTreeItem),
310                                0);
311                            break;
312                        }
313                    }
314                    break;
315                case IDM_MATERIALTREE_ICON_SETMAIN:
316                    hTreeItem=TreeView_GetSelection(hMaterialTreeView);
317                    for(i=0;i<static_cast<int>(projectInfo.resourceManager.iconResources.size());i++){
318                        if(projectInfo.resourceManager.iconResources[i].hTreeItem==hTreeItem){
319                            if(i==0) break;
320
321                            ActiveBasic::Common::ResourceItem tempItem = projectInfo.resourceManager.iconResources[i];
322                            Jenga::Common::EraseVectorItem<ActiveBasic::Common::ResourceItems>( projectInfo.resourceManager.iconResources, i );
323                            projectInfo.resourceManager.iconResources.insert( projectInfo.resourceManager.iconResources.begin(), tempItem );
324
325                            tvItem.hItem=projectInfo.resourceManager.iconResources[1].hTreeItem;
326                            tvItem.mask=TVIF_TEXT;
327                            lstrcpy( temporary, projectInfo.resourceManager.iconResources[1].idName.c_str() );
328                            tvItem.pszText = temporary;
329                            tvItem.cchTextMax=lstrlen(temporary)+1;
330                            TreeView_SetItem(hMaterialTreeView,&tvItem);
331
332                            tvItem.hItem=projectInfo.resourceManager.iconResources[0].hTreeItem;
333                            tvItem.mask=TVIF_TEXT;
334                            sprintf(temporary,"%s (Main)",projectInfo.resourceManager.iconResources[0].idName.c_str());
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        ActiveBasic::PM::WindowInfos windowInfos;
1056        windowInfos.push_back( new ActiveBasic::PM::WindowInfo() );
1057        windowInfos.back()->SetName( "MainWnd" );
1058        windowInfos.back()->pos.x=CW_USEDEFAULT;
1059        windowInfos.back()->pos.y=CW_USEDEFAULT;
1060        windowInfos.back()->size.cx=480;
1061        windowInfos.back()->size.cy=360;
1062        windowInfos.back()->SetCaption( NewProjectInfo.name );
1063        if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE)
1064        {
1065            windowInfos.back()->SetStyle( WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_VISIBLE );
1066        }
1067        else if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX)
1068        {
1069            windowInfos.back()->SetStyle( WS_OVERLAPPED|WS_THICKFRAME|WS_SYSMENU );
1070        }
1071        windowInfos.back()->SetExStyle( 0 );
1072        windowInfos.back()->SetMenuIdName( "" );
1073        windowInfos.back()->SetBackgroundColor( COLOR_3DFACE );
1074        GetDefaultWindowFont(&windowInfos.back()->LogFont);
1075        windowInfos.back()->SetIconResourceName( "" );
1076        windowInfos.back()->SetClassName( "NORMAL" );
1077        windowInfos.back()->SetType( ActiveBasic::PM::WindowType::Default );
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.Load(temporary);
1112    projectInfo.Save();
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    hCursorTreeItemForProjectView = tv.hParent;
1145    BOOST_FOREACH( ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.cursorResources )
1146    {
1147        tv.item.iImage=6;
1148        tv.item.iSelectedImage=6;
1149        lstrcpy( temporary, resourceItem.idName.c_str() );
1150        tv.item.pszText=temporary;
1151        resourceItem.hTreeItem = TreeView_InsertItem(hMaterialTreeView,&tv);
1152    }
1153
1154    //Bitmapリソース フォルダ
1155    sprintf(temporary,"Bitmap %s",STRING_RESOURCE);
1156    tv.hParent=TVI_ROOT;
1157    tv.item.iImage=0;
1158    tv.item.iSelectedImage=0;
1159    tv.item.pszText=temporary;
1160    tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1161    hBitmapTreeItemForProjectView = tv.hParent;
1162    BOOST_FOREACH( ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.bitmapResources )
1163    {
1164        tv.item.iImage=5;
1165        tv.item.iSelectedImage=5;
1166        lstrcpy( temporary, resourceItem.idName.c_str() );
1167        tv.item.pszText=temporary;
1168        resourceItem.hTreeItem = TreeView_InsertItem(hMaterialTreeView,&tv);
1169    }
1170
1171    //Iconリソース フォルダ
1172    sprintf(temporary,"Icon %s",STRING_RESOURCE);
1173    tv.hParent=TVI_ROOT;
1174    tv.item.iImage=0;
1175    tv.item.iSelectedImage=0;
1176    tv.item.pszText=temporary;
1177    tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1178    hIconTreeItemForProjectView = tv.hParent;
1179    for(i=0;i<static_cast<int>(projectInfo.resourceManager.iconResources.size());i++){
1180        tv.item.iImage=4;
1181        tv.item.iSelectedImage=4;
1182        if(i==0){
1183            sprintf(temporary,"%s (Main)",projectInfo.resourceManager.iconResources[i].idName.c_str());
1184        }
1185        else
1186        {
1187            sprintf(temporary,"%s",projectInfo.resourceManager.iconResources[i].idName.c_str());
1188        }
1189        tv.item.pszText=temporary;
1190        projectInfo.resourceManager.iconResources[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1191    }
1192
1193    //Menuフォルダ
1194    tv.hParent=TVI_ROOT;
1195    tv.item.iImage=0;
1196    tv.item.iSelectedImage=0;
1197    tv.item.pszText="Menu";
1198    tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1199    projectInfo.hMenuTreeItem=tv.hParent;
1200    for(i=0;i<projectInfo.NumberOfMenu;i++){
1201        tv.item.iImage=3;
1202        tv.item.iSelectedImage=3;
1203        tv.item.pszText=projectInfo.pMenuInfo[i].IdName;
1204        projectInfo.pMenuInfo[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1205    }
1206
1207    //Windowフォルダ
1208    tv.hParent=TVI_ROOT;
1209    tv.item.iImage=0;
1210    tv.item.iSelectedImage=0;
1211    tv.item.pszText="Window";
1212    tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1213    projectInfo.hWindowTreeItem=tv.hParent;
1214    BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
1215    {
1216        tv.item.iImage=2;
1217        tv.item.iSelectedImage=2;
1218        char temporary[1024];
1219        lstrcpy( temporary, pWindowInfo->GetName().c_str() );
1220        tv.item.pszText = temporary;
1221        pWindowInfo->hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1222    }
1223}
1224void OpenWorkfile( const std::string &path )
1225{
1226    extern HANDLE hHeap;
1227    int i,i2,i3;
1228    char *buffer,temporary[MAX_PATH],temp2[MAX_PATH];
1229
1230    //プロジェクト ビューを設定、表示
1231    extern HWND hProjectView;
1232    SetTreeViewForProjectInfo();
1233    if(!IsWindowVisible(hProjectView)) SendMessage(hOwner,WM_COMMAND,IDM_PROJECTVIEW,0);
1234
1235
1236    //メニュー状態を設定
1237    ResetState_DocMenu();
1238
1239
1240    //////////////////////////////////////////
1241    //ワークファイル(*.wrk)をオープン
1242    HTREEITEM hTreeItem;
1243    HANDLE hFind;
1244    WIN32_FIND_DATA wfd;
1245    HWND hChild;
1246    int WndNum;
1247    hFind=FindFirstFile(path.c_str(),&wfd);
1248    if(hFind!=INVALID_HANDLE_VALUE){
1249        FindClose(hFind);
1250        buffer=ReadBuffer(path);
1251        if(!buffer) return;
1252
1253        //解析、反映
1254        memcpy(temporary,buffer,5);
1255        temporary[5]=0;
1256        if(lstrcmp(temporary,"case4")==0){
1257
1258            LockWindowUpdate(hOwner);
1259            for(i=9,i2=0;;i++,i2++){
1260                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1261                    if(i2!=0){
1262                        temporary[i2]=0;
1263                        for(i3=0;;i3++){
1264                            if(temporary[i3]==','||temporary[i3]=='\0') break;
1265                        }
1266                        if(temporary[i3]=='\0') goto EndToSetWorkFile;
1267                        lstrcpy(temp2,temporary+i3+1);
1268                        temporary[i3]=0;
1269                        if(lstrcmpi(temporary,"text")==0){
1270                            if(temp2[0]!='\"') goto EndToSetWorkFile;
1271
1272                            //ファイルを開く
1273                            i2=1;
1274                            for(i3=0;;i2++,i3++){
1275                                if(temp2[i2]=='\"'||temp2[i2]=='\0'){
1276                                    temporary[i3]=0;
1277                                    break;
1278                                }
1279                                temporary[i3]=temp2[i2];
1280                            }
1281                            lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1282                            hChild=OpenFileWithExtension(temporary);
1283                            WndNum=GetWndNum(hChild);
1284                            if(WndNum==-1){
1285                                goto EndToSetWorkFile;
1286                            }
1287
1288                            //ResetScrollbarが再描画時に呼び出されるので、再描画する
1289                            InvalidateRect(MdiInfo[WndNum].pMdiTextEdit->hEdit,NULL,0);
1290                            UpdateWindow(MdiInfo[WndNum].pMdiTextEdit->hEdit);
1291
1292                            if(temp2[i2]=='\0') goto EndToSetWorkFile;
1293                            if(temp2[i2+1]!=',') goto EndToSetWorkFile;
1294
1295                            //以前のスクロール位置を復元
1296                            SCROLLINFO si;
1297                            POINT pos;
1298                            for(i2+=2,i3=0;;i2++,i3++){
1299                                if(temp2[i2]==','||temp2[i2]=='\0'){
1300                                    temporary[i3]=0;
1301                                    break;
1302                                }
1303                                temporary[i3]=temp2[i2];
1304                            }
1305                            sscanf(temporary,"%d",&pos.x);
1306                            if(temp2[i2]=='\0') goto EndToSetWorkFile;
1307                            for(i2++,i3=0;;i2++,i3++){
1308                                if(temp2[i2]==','||temp2[i2]=='\0'){
1309                                    temporary[i3]=0;
1310                                    break;
1311                                }
1312                                temporary[i3]=temp2[i2];
1313                            }
1314                            sscanf(temporary,"%d",&pos.y);
1315                            si.cbSize=sizeof(SCROLLINFO);
1316                            si.fMask=SIF_POS;
1317                            si.nPos=pos.x;
1318                            SetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_HORZ,&si,1);
1319                            si.nPos=pos.y;
1320                            SetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_VERT,&si,1);
1321
1322                            if(temp2[i2]=='\0') goto EndToSetWorkFile;
1323
1324                            //キャレット位置をセット
1325                            for(i2++,i3=0;;i2++,i3++){
1326                                if(temp2[i2]==','||temp2[i2]=='\0'){
1327                                    temporary[i3]=0;
1328                                    break;
1329                                }
1330                                temporary[i3]=temp2[i2];
1331                            }
1332                            sscanf(temporary,"%d",&pos.x);
1333                            if(temp2[i2]=='\0') goto EndToSetWorkFile;
1334                            for(i2++,i3=0;;i2++,i3++){
1335                                if(temp2[i2]==','||temp2[i2]=='\0'){
1336                                    temporary[i3]=0;
1337                                    break;
1338                                }
1339                                temporary[i3]=temp2[i2];
1340                            }
1341                            sscanf(temporary,"%d",&pos.y);
1342                            TextEdit_SetSel(WndNum,pos.x,pos.y);
1343                        }
1344                        else if(lstrcmpi(temporary,"rad")==0){
1345                            for(i3=0;i3<static_cast<int>(projectInfo.windowInfos.size());i3++){
1346                                if(lstrcmpi(projectInfo.windowInfos[i3]->GetName().c_str(),temp2)==0){
1347                                    NewRadWindow( *projectInfo.windowInfos[i3] );
1348                                    break;
1349                                }
1350                            }
1351                        }
1352                        else if(lstrcmpi(temporary,"menu")==0){
1353                            for(i3=0;i3<projectInfo.NumberOfMenu;i3++){
1354                                if(lstrcmpi(projectInfo.pMenuInfo[i3].IdName,temp2)==0){
1355                                    NewMenuWindow(&projectInfo.pMenuInfo[i3]);
1356                                    break;
1357                                }
1358                            }
1359                        }
1360                        else if(lstrcmpi(temporary,"icon")==0)
1361                        {
1362                            BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
1363                            {
1364                                if(lstrcmpi(resourceItem.filepath.c_str(),temp2)==0){
1365                                    NewIconEditWindow( projectInfo.GetWorkDir().GetFullPath( temp2 ).c_str() );
1366                                    break;
1367                                }
1368                            }
1369                        }
1370                        i++;
1371                        i2=-1;
1372                        continue;
1373                    }
1374                    else break;
1375                }
1376                temporary[i2]=buffer[i];
1377            }
1378
1379            for(i+=2,i2=0;;i++,i2++){
1380                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1381                    temporary[i2]=0;
1382                    break;
1383                }
1384                temporary[i2]=buffer[i];
1385            }
1386            sscanf(temporary,"%d",&i2);
1387
1388            switch( i2 ){
1389                case 0:
1390                    ShowFileView();
1391                    break;
1392                case 1:
1393                    ShowClassView();
1394                    break;
1395                case 2:
1396                    ShowMaterialView();
1397                    break;
1398            }
1399
1400            if(buffer[i]=='\0') goto EndToSetWorkFile;
1401
1402            for(i+=2,i2=0;;i++,i2++){
1403                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1404                    temporary[i2]=0;
1405                    break;
1406                }
1407                temporary[i2]=buffer[i];
1408            }
1409            if(temporary[0]=='1') TreeView_Expand(pobj_FileTree->hTree,TreeView_GetRoot(pobj_FileTree->hTree),TVE_EXPAND);
1410
1411            for(i+=2,i2=0;;i++,i2++){
1412                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1413                    temporary[i2]=0;
1414                    break;
1415                }
1416                temporary[i2]=buffer[i];
1417            }
1418            if(temporary[0]=='1') TreeView_Expand(hProcedureTreeView,TreeView_GetRoot(hProcedureTreeView),TVE_EXPAND);
1419
1420            for(i+=2,i2=0;;i++,i2++){
1421                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1422                    temporary[i2]=0;
1423                    break;
1424                }
1425                temporary[i2]=buffer[i];
1426            }
1427            hTreeItem=TreeView_GetRoot(hMaterialTreeView);
1428            i2=0;
1429            while(hTreeItem){
1430                i2=GetOneParameter(temporary,i2,temp2);
1431                if(GetValue(temp2)) TreeView_Expand(hMaterialTreeView,hTreeItem,TVE_EXPAND);
1432                hTreeItem=TreeView_GetNextSibling(hMaterialTreeView,hTreeItem);
1433            }
1434        }
1435        else if(lstrcmp(temporary,"case3")==0){
1436            ////////////////////////////////////////
1437            // 古いフォーマットのワークファイル
1438
1439            LockWindowUpdate(hOwner);
1440            for(i=9,i2=0;;i++,i2++){
1441                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1442                    if(i2!=0){
1443                        temporary[i2]=0;
1444                        for(i3=0;;i3++){
1445                            if(temporary[i3]==','||temporary[i3]=='\0') break;
1446                        }
1447                        if(temporary[i3]=='\0') goto EndToSetWorkFile;
1448                        lstrcpy(temp2,temporary+i3+1);
1449                        temporary[i3]=0;
1450                        if(lstrcmpi(temporary,"text")==0){
1451                            for(i3=0;;i3++){
1452                                if(temp2[i3]==','||temp2[i3]=='\0') break;
1453                            }
1454                            if(temp2[i3]=='\0') goto EndToSetWorkFile;
1455                            lstrcpy(temporary,temp2+i3+1);
1456                            temp2[i3]=0;
1457                            lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1458                            sscanf(temp2,"%d",&i3);
1459
1460                            //ファイルを開く
1461                            hChild=OpenFileWithExtension(temporary);
1462                            WndNum=GetWndNum(hChild);
1463
1464                            //キャレット位置をセット
1465                            TextEdit_SetSel(WndNum,i3,i3);
1466                        }
1467                        else if(lstrcmpi(temporary,"rad")==0){
1468                            for(i3=0;i3<static_cast<int>(projectInfo.windowInfos.size());i3++){
1469                                if(lstrcmpi(projectInfo.windowInfos[i3]->GetName().c_str(),temp2)==0){
1470                                    NewRadWindow( *projectInfo.windowInfos[i3] );
1471                                    break;
1472                                }
1473                            }
1474                        }
1475                        else if(lstrcmpi(temporary,"menu")==0){
1476                            for(i3=0;i3<projectInfo.NumberOfMenu;i3++){
1477                                if(lstrcmpi(projectInfo.pMenuInfo[i3].IdName,temp2)==0){
1478                                    NewMenuWindow(&projectInfo.pMenuInfo[i3]);
1479                                    break;
1480                                }
1481                            }
1482                        }
1483                        else if(lstrcmpi(temporary,"icon")==0){
1484                            BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
1485                            {
1486                                if(lstrcmpi(resourceItem.filepath.c_str(),temp2)==0){
1487                                    NewIconEditWindow( projectInfo.GetWorkDir().GetFullPath( temp2 ).c_str() );
1488                                    break;
1489                                }
1490                            }
1491                        }
1492                        i++;
1493                        i2=-1;
1494                        continue;
1495                    }
1496                    else break;
1497                }
1498                temporary[i2]=buffer[i];
1499            }
1500
1501            for(i+=2,i2=0;;i++,i2++){
1502                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1503                    temporary[i2]=0;
1504                    break;
1505                }
1506                temporary[i2]=buffer[i];
1507            }
1508            sscanf(temporary,"%d",&i2);
1509
1510            switch( i2 ){
1511                case 0:
1512                    ShowFileView();
1513                    break;
1514                case 1:
1515                    ShowClassView();
1516                    break;
1517                case 2:
1518                    ShowMaterialView();
1519                    break;
1520            }
1521
1522            if(buffer[i]=='\0') goto EndToSetWorkFile;
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(pobj_FileTree->hTree,TreeView_GetRoot(pobj_FileTree->hTree),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            if(temporary[0]=='1') TreeView_Expand(hProcedureTreeView,TreeView_GetRoot(hProcedureTreeView),TVE_EXPAND);
1541
1542            for(i+=2,i2=0;;i++,i2++){
1543                if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1544                    temporary[i2]=0;
1545                    break;
1546                }
1547                temporary[i2]=buffer[i];
1548            }
1549            hTreeItem=TreeView_GetRoot(hMaterialTreeView);
1550            i2=0;
1551            while(hTreeItem){
1552                i2=GetOneParameter(temporary,i2,temp2);
1553                if(GetValue(temp2)) TreeView_Expand(hMaterialTreeView,hTreeItem,TVE_EXPAND);
1554                hTreeItem=TreeView_GetNextSibling(hMaterialTreeView,hTreeItem);
1555            }
1556        }
1557EndToSetWorkFile:
1558        LockWindowUpdate(NULL);
1559        HeapDefaultFree(buffer);
1560    }
1561
1562
1563    //ウィンドウ タイトルを変更
1564    sprintf(temporary,"%s - %s",projectInfo.GetName().c_str(),APPLICATION_NAME);
1565    SetWindowText(hOwner,temporary);
1566}
1567BOOL ProjectModifyCheck(BOOL bRun){
1568    int i,WndNum,sw;
1569    HWND hChild;
1570    char temporary[MAX_PATH];
1571    if(projectInfo.modify||projectInfo.ModifyOfMaterial||projectInfo.ModifuOfResource){
1572        if(bRun==0||pobj_nv->bSaveCheckProject){
1573            //"\"%s\" プロジェクトは変更されています。保存しますか?"
1574            sprintf(temporary,STRING_MODIFYCHECK_PROJECT,projectInfo.GetName().c_str());
1575            i=MessageBox(hOwner,temporary,APPLICATION_NAME,MB_YESNOCANCEL|MB_ICONEXCLAMATION);
1576
1577            if(i==IDCANCEL) return 0;
1578            if(i==IDYES)
1579            {
1580                projectInfo.Save();
1581            }
1582        }
1583        else
1584        {
1585            projectInfo.Save();
1586        }
1587        return 1;
1588    }
1589    hChild=GetWindow(hClient,GW_CHILD);
1590    while(hChild){
1591        WndNum=GetWndNum(hChild);
1592        sw=0;
1593        if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
1594            if( MdiInfo[WndNum].pMdiTextEdit->IsModified() ){
1595                for(i=0;i<projectInfo.pobj_DBFileInfo->iNum;i++){
1596                    projectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->GetFullPath(temporary);
1597                    if(lstrcmpi(MdiInfo[WndNum].path.c_str(),temporary)==0) sw=1;
1598                }
1599            }
1600        }
1601        else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
1602            if(MdiInfo[WndNum].MdiIconEditInfo->bModify){
1603                BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
1604                {
1605                    lstrcpy(temporary,resourceItem.filepath.c_str());
1606                    lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1607                    if(lstrcmpi(MdiInfo[WndNum].path.c_str(),temporary)==0) sw=1;
1608                }
1609            }
1610        }
1611
1612        if(sw){
1613            if(bRun==0||pobj_nv->bSaveCheckProject){
1614                //"\"%s\" プロジェクトは変更されています。保存しますか?"
1615                sprintf(temporary,STRING_MODIFYCHECK_PROJECT,projectInfo.GetName().c_str());
1616                i=MessageBox(hOwner,temporary,APPLICATION_NAME,MB_YESNOCANCEL|MB_ICONEXCLAMATION);
1617
1618                if(i==IDCANCEL) return 0;
1619                if(i==IDYES)
1620                {
1621                    projectInfo.Save();
1622                }
1623            }
1624            else
1625            {
1626                projectInfo.Save();
1627            }
1628            return 1;
1629        }
1630        hChild=GetNextWindow(hChild,GW_HWNDNEXT);
1631    }
1632    return 2;
1633}
1634void MakeWorkFile(void){
1635    int i,i2,WndNum;
1636    char temporary[MAX_PATH],buffer[32767];
1637    HWND hChild;
1638    CHARRANGE CharRange;
1639
1640    //ワークファイル(*.wrk)を作成
1641    lstrcpy(buffer,"case4\r\n\r\n");
1642    i2=lstrlen(buffer);
1643
1644
1645    ///////////////////////
1646    //MDIウィンドウの並び
1647    hChild=GetWindow(GetWindow(hClient,GW_CHILD),GW_HWNDLAST);
1648    while(hChild){
1649        WndNum=GetWndNum(hChild);
1650        if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
1651            for(i=0;i<projectInfo.pobj_DBFileInfo->iNum;i++){
1652                projectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->GetFullPath(temporary);
1653                if(lstrcmpi(MdiInfo[WndNum].path.c_str(),temporary)==0){
1654                    TextEdit_GetSel(WndNum,&CharRange);
1655
1656                    SCROLLINFO si;
1657                    POINT pos;
1658                    si.cbSize=sizeof(SCROLLINFO);
1659                    si.fMask=SIF_POS;
1660                    GetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_HORZ,&si);
1661                    pos.x=si.nPos;
1662                    GetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_VERT,&si);
1663                    pos.y=si.nPos;
1664
1665                    sprintf(buffer+i2,"text,\"%s\",%d,%d,%d,%d\r\n",
1666                        projectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->m_path,
1667                        pos.x,
1668                        pos.y,
1669                        CharRange.cpMin,
1670                        CharRange.cpMax);
1671                    i2+=lstrlen(buffer+i2);
1672                    break;
1673                }
1674            }
1675        }
1676        else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){
1677            BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
1678            {
1679                if(lstrcmpi(MdiInfo[WndNum].path.c_str(),pWindowInfo->GetName().c_str())==0){
1680                    sprintf(buffer+i2,"rad,%s\r\n",MdiInfo[WndNum].path.c_str());
1681                    i2+=lstrlen(buffer+i2);
1682                    break;
1683                }
1684            }
1685        }
1686        else if(MdiInfo[WndNum].DocType==WNDTYPE_MENU){
1687            for(i=0;i<projectInfo.NumberOfMenu;i++){
1688                if(lstrcmpi(MdiInfo[WndNum].path.c_str(),projectInfo.pMenuInfo[i].IdName)==0){
1689                    sprintf(buffer+i2,"menu,%s\r\n",MdiInfo[WndNum].path.c_str());
1690                    i2+=lstrlen(buffer+i2);
1691                    break;
1692                }
1693            }
1694        }
1695        else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
1696            BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
1697            {
1698                lstrcpy(temporary,resourceItem.filepath.c_str());
1699                lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1700                if(lstrcmpi(MdiInfo[WndNum].path.c_str(),temporary)==0){
1701                    sprintf(buffer+i2,"icon,%s\r\n",resourceItem.filepath.c_str());
1702                    i2+=lstrlen(buffer+i2);
1703                    break;
1704                }
1705            }
1706        }
1707        hChild=GetNextWindow(hChild,GW_HWNDPREV);
1708    }
1709    lstrcpy(buffer+i2,"\r\n");
1710    i2+=2;
1711
1712
1713    //////////////////////////
1714    //ツリービューの展開状況
1715    sprintf(buffer+i2,"%d\r\n",TabCtrl_GetCurSel(hProjectViewTab));
1716    i2+=lstrlen(buffer+i2);
1717    TVITEM tvItem;
1718    memset(&tvItem,0,sizeof(TVITEM));
1719    tvItem.mask=TVIF_HANDLE|TVIF_STATE;
1720    tvItem.hItem=TreeView_GetRoot(pobj_FileTree->hTree);
1721    TreeView_GetItem(pobj_FileTree->hTree,&tvItem);
1722    if(tvItem.state&TVIS_EXPANDED) i=1;
1723    else i=0;
1724    sprintf(buffer+i2,"%d\r\n",i);
1725    i2+=lstrlen(buffer+i2);
1726
1727    tvItem.hItem=TreeView_GetRoot(hProcedureTreeView);
1728    TreeView_GetItem(hProcedureTreeView,&tvItem);
1729    if(tvItem.state&TVIS_EXPANDED) i=1;
1730    else i=0;
1731    sprintf(buffer+i2,"%d\r\n",i);
1732    i2+=lstrlen(buffer+i2);
1733
1734    tvItem.hItem=TreeView_GetRoot(hMaterialTreeView);
1735    while(tvItem.hItem){
1736        TreeView_GetItem(hMaterialTreeView,&tvItem);
1737        if(tvItem.state&TVIS_EXPANDED) i=1;
1738        else i=0;
1739        sprintf(buffer+i2,"%d",i);
1740        i2+=lstrlen(buffer+i2);
1741
1742        tvItem.hItem=TreeView_GetNextSibling(hMaterialTreeView,tvItem.hItem);
1743        if(tvItem.hItem){
1744            lstrcpy(buffer+i2,",");
1745            i2+=lstrlen(buffer+i2);
1746        }
1747    }
1748
1749
1750    //保存
1751    sprintf(temporary,"%s%s.wrk",projectInfo.GetWorkDir().GetPath().c_str(),projectInfo.GetName().c_str());
1752    WriteBuffer(temporary,buffer,i2);
1753}
1754
1755BOOL SetProjectToRun(void){
1756    HANDLE hFind;
1757    WIN32_FIND_DATA wfd;
1758
1759    if(projectInfo.pobj_DBFileInfo->iNum==0){
1760        //"プログラム ファイルがプロジェクトに存在しません。"
1761        MessageBox(hOwner,STRING_ERROR_NOFILE,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
1762        return 0;
1763    }
1764
1765    extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
1766    hFind=FindFirstFile( ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ).c_str(), &wfd );
1767    if(hFind==INVALID_HANDLE_VALUE){
1768        //"BasicCompiler.exe が見つかりません"
1769        MessageBox(hOwner,STRING_ERROR_NOBASICCOMPILER,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
1770        return 0;
1771    }
1772    FindClose(hFind);
1773
1774    //プロジェクト構造のバージョンが違う時は、再保存する
1775    if(projectInfo.dwVersion<PROJECT_VERSION)
1776        projectInfo.ModifyOfMaterial=1;
1777
1778    //保存確認
1779    if(!ProjectModifyCheck(1)) return 0;
1780
1781    return 1;
1782}
1783BOOL IsNeedCompileForProject(BOOL bDebug){
1784    int i2;
1785    char temporary[MAX_PATH];
1786    HANDLE hFind,hFile;
1787    WIN32_FIND_DATA wfd;
1788    FILETIME SourceTime,ExeTime;
1789
1790    if(bDebug) lstrcpy(temporary,projectInfo.lpszOutput_Debug);
1791    else lstrcpy(temporary,projectInfo.lpszOutput_Release);
1792    lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1793
1794    hFind=FindFirstFile(temporary,&wfd);
1795    if(hFind==INVALID_HANDLE_VALUE) return 1;
1796    FindClose(hFind);
1797
1798    hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
1799    GetFileTime(hFile,NULL,NULL,&ExeTime);
1800    CloseHandle(hFile);
1801
1802    for(i2=0;i2<projectInfo.pobj_DBFileInfo->iNum;i2++){
1803        projectInfo.pobj_DBFileInfo->ppobj_FileInfo[i2]->GetFullPath(temporary);
1804        hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
1805        GetFileTime(hFile,NULL,NULL,&SourceTime);
1806        CloseHandle(hFile);
1807
1808        if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
1809            SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
1810            SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
1811    }
1812    if( !projectInfo.windowInfos.empty() )
1813    {
1814        //CallBack.wbp
1815        lstrcpy(temporary,"CallBack.wbp");
1816        lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1817        hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
1818        GetFileTime(hFile,NULL,NULL,&SourceTime);
1819        CloseHandle(hFile);
1820        if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
1821            SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
1822            SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
1823
1824        //MakeWindow.wbp
1825        lstrcpy(temporary,"MakeWindow.wbp");
1826        lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1827        hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
1828        GetFileTime(hFile,NULL,NULL,&SourceTime);
1829        CloseHandle(hFile);
1830        if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
1831            SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
1832            SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
1833    }
1834    return 0;
1835}
Note: See TracBrowser for help on using the repository browser.