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

Last change on this file since 705 was 705, checked in by イグトランス (egtra), 16 years ago

ファイルハンドルが解放されず困ることがあるのでCHandleへ入れた。

File size: 61.5 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.fileSystem.root.FindFile( pobj_ClassTreeView->pProcInfo[i].hFileTreeItem ).GetRelationalPath().c_str());
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 pobj_FileTree->ShowWindow( SW_SHOW );
406 ShowWindow(hProcedureTreeView,SW_HIDE);
407 ShowWindow(hMaterialTreeView,SW_HIDE);
408}
409void ShowClassView(){
410 TabCtrl_SetCurSel(hProjectViewTab,1);
411 pobj_FileTree->ShowWindow( SW_HIDE );
412 ShowWindow(hMaterialTreeView,SW_HIDE);
413 ShowWindow(hProcedureTreeView,SW_SHOW);
414}
415void ShowMaterialView(){
416 TabCtrl_SetCurSel(hProjectViewTab,2);
417 pobj_FileTree->ShowWindow( 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 FileListTreeViewCtrl( 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 pobj_FileTree->ShowWindow( 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 ActiveBasic::IDE::Program::mainFrame.Resized();
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 ActiveBasic::IDE::Program::mainFrame.Resized();
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->MoveWindow(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->MoveWindow(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.fileSystem.root.IsExistFile( path ) )
655 {
656 //"\"%s\" ファイルは既にプロジェクト内に存在します。"
657 sprintf(temporary,STRING_DUPLICATIONERROR_FILE_IN_PROJECT,path);
658 MessageBox(hOwner,temporary,APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
659 return;
660 }
661
662
663 //////////////////////
664 //ツリービューに追加
665 HTREEITEM hTreeItem;
666 _splitpath(path,0,0,temporary,temp2);
667 lstrcat(temporary,temp2);
668 hTreeItem=pobj_FileTree->Insert( temporary );
669
670
671 //projectInfo.ppobj_DBFileInfoオブジェクトに追加
672 projectInfo.fileSystem.root.files.push_back( ActiveBasic::PM::FM::File( path, hTreeItem ) );
673
674
675 projectInfo.modify=1;
676
677 //ファイル操作によるクラスビューの再表示
678 ResetClassTree((HTREEITEM)-1);
679}
680void Project_File_Delete(HTREEITEM hTreeItem){
681 extern HANDLE hHeap;
682
683 /*if(projectInfo.pobj_DBFileInfo->IsMainFile(hTreeItem)){
684 //"このファイルはプロジェクトのメイン ファイルです。プロジェクト内から削除することはできません。"
685 MessageBox(hOwner,STRING_ERROR_CANT_MAINFILE,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
686 return;
687 }*/
688
689 //ツリービューから削除
690 pobj_FileTree->DeleteItem( hTreeItem );
691
692 // オブジェクトから削除
693 projectInfo.fileSystem.root.Remove( hTreeItem );
694
695 projectInfo.modify=1;
696
697 //ファイル操作によるクラスビューの再表示
698 ResetClassTree((HTREEITEM)-1);
699}
700
701void MakeNewProject(){
702 extern HANDLE hHeap;
703 extern NEWPROJECTINFO NewProjectInfo;
704 int i;
705 char buffer[GENERAL_SIZE],dir[MAX_PATH],temporary[MAX_PATH],*pTemp;
706 HANDLE hFind;
707 WIN32_FIND_DATA wfd;
708
709 //既にプロジェクトが開かれている場合は閉じる
710 if( projectInfo.IsOpened() ){
711 if(!projectInfo.Close()) return;
712 }
713
714 //ワークディレクトリを作成
715 i=lstrlen(pobj_nv->ProjectSaveDir);
716 if(pobj_nv->ProjectSaveDir[i-1]=='\\'&&pobj_nv->ProjectSaveDir[i-2]!=':') pobj_nv->ProjectSaveDir[i-1]=0;
717 sprintf(dir,"%s\\%s\\",pobj_nv->ProjectSaveDir,NewProjectInfo.name);
718 i=0;
719 while(!(dir[i]==':'||(dir[i-1]=='\\'&&dir[i]=='\\'))) i++;
720 if(dir[i]==':') i++;
721 else{
722 i++;
723 while(dir[i]!='\\') i++;
724 }
725 for(i++;;i++){
726 if(dir[i]=='\\'){
727 lstrcpy(temporary,dir);
728 temporary[i]=0;
729 hFind=FindFirstFile(temporary,&wfd);
730 if(hFind==INVALID_HANDLE_VALUE){
731 if(!CreateDirectory(temporary,NULL)){
732 MessageBox(hOwner,"ディレクトリを作成できませんでした",APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
733 return;
734 }
735 }
736 else FindClose(hFind);
737 }
738 if(dir[i]=='\0') break;
739 }
740
741
742 //////////////////////////////////////
743 // プロジェクトファイル(*.pj)を作成
744 //////////////////////////////////////
745
746 // 出力先拡張子
747 const std::string outputFileExt
748 = ( NewProjectInfo.dwTypeID == IDC_DLL ) ? ".dll"
749 : ( NewProjectInfo.dwTypeID == IDC_SLL ) ? ".lib"
750 : ".exe";
751
752 //先頭の注釈
753 lstrcpy(buffer,"\' ActiveBasic Project file.\r\n\r\n");
754 i=lstrlen(buffer);
755
756 //プロジェクトのフォーマットバージョン
757 sprintf(buffer+i,"#VERSION=%d\r\n\r\n",PROJECT_VERSION);
758 i+=lstrlen(buffer+i);
759
760 //モジュールタイプ(EXEならば0、DLLならば1)
761 ActiveBasic::Common::TargetModuleType::EnumType moduleType
762 = ( NewProjectInfo.dwTypeID == IDC_DLL ) ? ActiveBasic::Common::TargetModuleType::Dll
763 : ( NewProjectInfo.dwTypeID == IDC_SLL ) ? ActiveBasic::Common::TargetModuleType::Sll
764 : ActiveBasic::Common::TargetModuleType::Exe;
765 lstrcpy(buffer+i,( (std::string)"#MODULETYPE=" + Jenga::Common::ToString( static_cast<int>(moduleType) ) + "\r\n\r\n" ).c_str());
766 i+=lstrlen(buffer+i);
767
768 //プロジェクト名
769 sprintf(buffer+i,"#NAME=%s\r\n\r\n",NewProjectInfo.name);
770 i+=lstrlen(buffer+i);
771
772 lstrcpy(buffer+i,"#PLATFORM=32\r\n\r\n");
773 i+=lstrlen(buffer+i);
774
775 //RADウィンドウの数
776 if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE||
777 NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX)
778 lstrcpy(buffer+i,"#USEWINDOW=1\r\n\r\n");
779 else lstrcpy(buffer+i,"#USEWINDOW=0\r\n\r\n");
780 i+=lstrlen(buffer+i);
781
782 //プロジェクトオプション
783 sprintf(buffer+i,"#OPTION=&H%08x\r\n\r\n",NewProjectInfo.dwOption);
784 i+=lstrlen(buffer+i);
785
786 //出力先(Release)
787 sprintf(buffer+i,"#OUTPUT_RELEASE=.\\%s%s\r\n\r\n",NewProjectInfo.name, outputFileExt.c_str());
788 i+=lstrlen(buffer+i);
789
790 //出力先(Debug)
791 sprintf(buffer+i,"#OUTPUT_DEBUG=.\\%s_debug%s\r\n\r\n",NewProjectInfo.name, outputFileExt.c_str());
792 i+=lstrlen(buffer+i);
793
794 //マニフェスト
795 sprintf(buffer+i,"#MANIFEST=%s.manifest.xml\r\n\r\n",NewProjectInfo.name);
796 i+=lstrlen(buffer+i);
797
798 //デバッグ用(コマンドライン)
799 lstrcpy(buffer+i,"#DEBUG_CMD_LINE=\r\n\r\n");
800 i+=lstrlen(buffer+i);
801
802 //デバッグ用(DLL用の実行ファイル)
803 lstrcpy(buffer+i,"#DEBUG_EXE_PATH=\r\n\r\n");
804 i+=lstrlen(buffer+i);
805
806 //リソースファイル
807 lstrcpy(buffer+i,"#RESOURCE=0\r\n\r\n");
808 i+=lstrlen(buffer+i);
809
810 //ソースファイル
811 sprintf(buffer+i,"#SOURCE\r\n%s.ab\r\n",NewProjectInfo.name);
812 i+=lstrlen(buffer+i);
813 if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE||
814 NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
815 lstrcpy(buffer+i,"MainWnd.ab\r\n");
816 i+=lstrlen(buffer+i);
817 }
818 if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
819 lstrcpy(buffer+i,"dx_graphics.sbp\r\n");
820 i+=lstrlen(buffer+i);
821 lstrcpy(buffer+i,"dx_input.sbp\r\n");
822 i+=lstrlen(buffer+i);
823 lstrcpy(buffer+i,"dx_music.sbp\r\n");
824 i+=lstrlen(buffer+i);
825 }
826
827 //保存
828 sprintf(temporary,"%s%s.pj",dir,NewProjectInfo.name);
829 hFind=FindFirstFile(temporary,&wfd);
830 if(hFind!=INVALID_HANDLE_VALUE){
831 FindClose(hFind);
832
833 //"指定したディレクトリにはすでにプロジェクトが存在します。上書きしますか?"
834 if(MessageBox(hOwner,STRING_ERROR_PROJECT_OVERWRITE,APPLICATION_NAME,MB_YESNO|MB_ICONEXCLAMATION)==IDNO) return;
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 pobj_FileTree->Reset( projectInfo.fileSystem );
1130
1131 //関数ツリー
1132 ResetClassTree((HTREEITEM)-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')
1410 {
1411 pobj_FileTree->Expand( pobj_FileTree->GetRootItem(), TVE_EXPAND );
1412 }
1413
1414 for(i+=2,i2=0;;i++,i2++){
1415 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1416 temporary[i2]=0;
1417 break;
1418 }
1419 temporary[i2]=buffer[i];
1420 }
1421 if(temporary[0]=='1') TreeView_Expand(hProcedureTreeView,TreeView_GetRoot(hProcedureTreeView),TVE_EXPAND);
1422
1423 for(i+=2,i2=0;;i++,i2++){
1424 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1425 temporary[i2]=0;
1426 break;
1427 }
1428 temporary[i2]=buffer[i];
1429 }
1430 hTreeItem=TreeView_GetRoot(hMaterialTreeView);
1431 i2=0;
1432 while(hTreeItem){
1433 i2=GetOneParameter(temporary,i2,temp2);
1434 if(GetValue(temp2)) TreeView_Expand(hMaterialTreeView,hTreeItem,TVE_EXPAND);
1435 hTreeItem=TreeView_GetNextSibling(hMaterialTreeView,hTreeItem);
1436 }
1437 }
1438 else if(lstrcmp(temporary,"case3")==0){
1439 ////////////////////////////////////////
1440 // 古いフォーマットのワークファイル
1441
1442 LockWindowUpdate(hOwner);
1443 for(i=9,i2=0;;i++,i2++){
1444 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1445 if(i2!=0){
1446 temporary[i2]=0;
1447 for(i3=0;;i3++){
1448 if(temporary[i3]==','||temporary[i3]=='\0') break;
1449 }
1450 if(temporary[i3]=='\0') goto EndToSetWorkFile;
1451 lstrcpy(temp2,temporary+i3+1);
1452 temporary[i3]=0;
1453 if(lstrcmpi(temporary,"text")==0){
1454 for(i3=0;;i3++){
1455 if(temp2[i3]==','||temp2[i3]=='\0') break;
1456 }
1457 if(temp2[i3]=='\0') goto EndToSetWorkFile;
1458 lstrcpy(temporary,temp2+i3+1);
1459 temp2[i3]=0;
1460 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1461 sscanf(temp2,"%d",&i3);
1462
1463 //ファイルを開く
1464 hChild=OpenFileWithExtension(temporary);
1465 WndNum=GetWndNum(hChild);
1466
1467 //キャレット位置をセット
1468 TextEdit_SetSel(WndNum,i3,i3);
1469 }
1470 else if(lstrcmpi(temporary,"rad")==0){
1471 for(i3=0;i3<static_cast<int>(projectInfo.windowInfos.size());i3++){
1472 if(lstrcmpi(projectInfo.windowInfos[i3]->GetName().c_str(),temp2)==0){
1473 NewRadWindow( *projectInfo.windowInfos[i3] );
1474 break;
1475 }
1476 }
1477 }
1478 else if(lstrcmpi(temporary,"menu")==0){
1479 for(i3=0;i3<projectInfo.NumberOfMenu;i3++){
1480 if(lstrcmpi(projectInfo.pMenuInfo[i3].IdName,temp2)==0){
1481 NewMenuWindow(&projectInfo.pMenuInfo[i3]);
1482 break;
1483 }
1484 }
1485 }
1486 else if(lstrcmpi(temporary,"icon")==0){
1487 BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
1488 {
1489 if(lstrcmpi(resourceItem.filepath.c_str(),temp2)==0){
1490 NewIconEditWindow( projectInfo.GetWorkDir().GetFullPath( temp2 ).c_str() );
1491 break;
1492 }
1493 }
1494 }
1495 i++;
1496 i2=-1;
1497 continue;
1498 }
1499 else break;
1500 }
1501 temporary[i2]=buffer[i];
1502 }
1503
1504 for(i+=2,i2=0;;i++,i2++){
1505 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1506 temporary[i2]=0;
1507 break;
1508 }
1509 temporary[i2]=buffer[i];
1510 }
1511 sscanf(temporary,"%d",&i2);
1512
1513 switch( i2 ){
1514 case 0:
1515 ShowFileView();
1516 break;
1517 case 1:
1518 ShowClassView();
1519 break;
1520 case 2:
1521 ShowMaterialView();
1522 break;
1523 }
1524
1525 if(buffer[i]=='\0') goto EndToSetWorkFile;
1526
1527 for(i+=2,i2=0;;i++,i2++){
1528 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1529 temporary[i2]=0;
1530 break;
1531 }
1532 temporary[i2]=buffer[i];
1533 }
1534 if(temporary[0]=='1')
1535 {
1536 pobj_FileTree->Expand( pobj_FileTree->GetRootItem(), TVE_EXPAND );
1537 }
1538
1539 for(i+=2,i2=0;;i++,i2++){
1540 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1541 temporary[i2]=0;
1542 break;
1543 }
1544 temporary[i2]=buffer[i];
1545 }
1546 if(temporary[0]=='1') TreeView_Expand(hProcedureTreeView,TreeView_GetRoot(hProcedureTreeView),TVE_EXPAND);
1547
1548 for(i+=2,i2=0;;i++,i2++){
1549 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1550 temporary[i2]=0;
1551 break;
1552 }
1553 temporary[i2]=buffer[i];
1554 }
1555 hTreeItem=TreeView_GetRoot(hMaterialTreeView);
1556 i2=0;
1557 while(hTreeItem){
1558 i2=GetOneParameter(temporary,i2,temp2);
1559 if(GetValue(temp2)) TreeView_Expand(hMaterialTreeView,hTreeItem,TVE_EXPAND);
1560 hTreeItem=TreeView_GetNextSibling(hMaterialTreeView,hTreeItem);
1561 }
1562 }
1563EndToSetWorkFile:
1564 LockWindowUpdate(NULL);
1565 HeapDefaultFree(buffer);
1566 }
1567
1568
1569 //ウィンドウ タイトルを変更
1570 sprintf(temporary,"%s - %s",projectInfo.GetName().c_str(),APPLICATION_NAME);
1571 SetWindowText(hOwner,temporary);
1572}
1573BOOL ProjectModifyCheck(BOOL bRun){
1574 int i,WndNum,sw;
1575 HWND hChild;
1576 char temporary[MAX_PATH];
1577 if(projectInfo.modify||projectInfo.ModifyOfMaterial||projectInfo.ModifuOfResource){
1578 if(bRun==0||pobj_nv->bSaveCheckProject){
1579 //"\"%s\" プロジェクトは変更されています。保存しますか?"
1580 sprintf(temporary,STRING_MODIFYCHECK_PROJECT,projectInfo.GetName().c_str());
1581 i=MessageBox(hOwner,temporary,APPLICATION_NAME,MB_YESNOCANCEL|MB_ICONEXCLAMATION);
1582
1583 if(i==IDCANCEL) return 0;
1584 if(i==IDYES)
1585 {
1586 projectInfo.Save();
1587 }
1588 }
1589 else
1590 {
1591 projectInfo.Save();
1592 }
1593 return 1;
1594 }
1595 hChild=GetWindow(hClient,GW_CHILD);
1596 while(hChild){
1597 WndNum=GetWndNum(hChild);
1598 sw=0;
1599 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
1600 if( MdiInfo[WndNum]->pMdiTextEdit->IsModified() ){
1601 sw = projectInfo.fileSystem.root.IsExistFile( MdiInfo[WndNum]->path );
1602 }
1603 }
1604 else if(MdiInfo[WndNum]->DocType==WNDTYPE_ICONEDIT){
1605 if(MdiInfo[WndNum]->MdiIconEditInfo->bModify){
1606 BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
1607 {
1608 lstrcpy(temporary,resourceItem.filepath.c_str());
1609 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1610 if(lstrcmpi(MdiInfo[WndNum]->path.c_str(),temporary)==0) sw=1;
1611 }
1612 }
1613 }
1614
1615 if(sw){
1616 if(bRun==0||pobj_nv->bSaveCheckProject){
1617 //"\"%s\" プロジェクトは変更されています。保存しますか?"
1618 sprintf(temporary,STRING_MODIFYCHECK_PROJECT,projectInfo.GetName().c_str());
1619 i=MessageBox(hOwner,temporary,APPLICATION_NAME,MB_YESNOCANCEL|MB_ICONEXCLAMATION);
1620
1621 if(i==IDCANCEL) return 0;
1622 if(i==IDYES)
1623 {
1624 projectInfo.Save();
1625 }
1626 }
1627 else
1628 {
1629 projectInfo.Save();
1630 }
1631 return 1;
1632 }
1633 hChild=GetNextWindow(hChild,GW_HWNDNEXT);
1634 }
1635 return 2;
1636}
1637
1638void MakeTextMdiWindowBuffer( ActiveBasic::PM::FM::Folder &folder, int WndNum, char *buffer )
1639{
1640 BOOST_FOREACH( ActiveBasic::PM::FM::Folder &childFolder, folder.folders )
1641 {
1642 MakeTextMdiWindowBuffer( childFolder, WndNum, buffer );
1643 }
1644
1645 BOOST_FOREACH( ActiveBasic::PM::FM::File &file, folder.files )
1646 {
1647 if(lstrcmpi(MdiInfo[WndNum]->path.c_str(),file.GetFullPath().c_str())==0){
1648 CHARRANGE CharRange;
1649 TextEdit_GetSel(WndNum,&CharRange);
1650
1651 SCROLLINFO si;
1652 POINT pos;
1653 si.cbSize=sizeof(SCROLLINFO);
1654 si.fMask=SIF_POS;
1655 GetScrollInfo(MdiInfo[WndNum]->pMdiTextEdit->hEdit,SB_HORZ,&si);
1656 pos.x=si.nPos;
1657 GetScrollInfo(MdiInfo[WndNum]->pMdiTextEdit->hEdit,SB_VERT,&si);
1658 pos.y=si.nPos;
1659
1660 char temporary[1024];
1661 sprintf(temporary,"text,\"%s\",%d,%d,%d,%d\r\n",
1662 file.GetRelationalPath().c_str(),
1663 pos.x,
1664 pos.y,
1665 CharRange.cpMin,
1666 CharRange.cpMax);
1667
1668 lstrcat( buffer, temporary );
1669 break;
1670 }
1671 }
1672}
1673
1674void MakeWorkFile(void){
1675 int i,i2,WndNum;
1676 char temporary[MAX_PATH],buffer[32767];
1677 HWND hChild;
1678
1679 //ワークファイル(*.wrk)を作成
1680 lstrcpy(buffer,"case4\r\n\r\n");
1681 i2=lstrlen(buffer);
1682
1683
1684 ///////////////////////
1685 //MDIウィンドウの並び
1686 hChild=GetWindow(GetWindow(hClient,GW_CHILD),GW_HWNDLAST);
1687 while(hChild){
1688 WndNum=GetWndNum(hChild);
1689 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
1690 MakeTextMdiWindowBuffer( projectInfo.fileSystem.root, WndNum, buffer );
1691 i2 = lstrlen( buffer );
1692 }
1693 else if(MdiInfo[WndNum]->DocType==WNDTYPE_RAD){
1694 BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
1695 {
1696 if(lstrcmpi(MdiInfo[WndNum]->path.c_str(),pWindowInfo->GetName().c_str())==0){
1697 sprintf(buffer+i2,"rad,%s\r\n",MdiInfo[WndNum]->path.c_str());
1698 i2+=lstrlen(buffer+i2);
1699 break;
1700 }
1701 }
1702 }
1703 else if(MdiInfo[WndNum]->DocType==WNDTYPE_MENU){
1704 for(i=0;i<projectInfo.NumberOfMenu;i++){
1705 if(lstrcmpi(MdiInfo[WndNum]->path.c_str(),projectInfo.pMenuInfo[i].IdName)==0){
1706 sprintf(buffer+i2,"menu,%s\r\n",MdiInfo[WndNum]->path.c_str());
1707 i2+=lstrlen(buffer+i2);
1708 break;
1709 }
1710 }
1711 }
1712 else if(MdiInfo[WndNum]->DocType==WNDTYPE_ICONEDIT){
1713 BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
1714 {
1715 lstrcpy(temporary,resourceItem.filepath.c_str());
1716 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1717 if(lstrcmpi(MdiInfo[WndNum]->path.c_str(),temporary)==0){
1718 sprintf(buffer+i2,"icon,%s\r\n",resourceItem.filepath.c_str());
1719 i2+=lstrlen(buffer+i2);
1720 break;
1721 }
1722 }
1723 }
1724 hChild=GetNextWindow(hChild,GW_HWNDPREV);
1725 }
1726 lstrcpy(buffer+i2,"\r\n");
1727 i2+=2;
1728
1729
1730 //////////////////////////
1731 //ツリービューの展開状況
1732 sprintf(buffer+i2,"%d\r\n",TabCtrl_GetCurSel(hProjectViewTab));
1733 i2+=lstrlen(buffer+i2);
1734 TVITEM tvItem;
1735 memset(&tvItem,0,sizeof(TVITEM));
1736 tvItem.mask=TVIF_HANDLE|TVIF_STATE;
1737 tvItem.hItem = pobj_FileTree->GetRootItem();
1738 pobj_FileTree->GetItem( &tvItem );
1739 if(tvItem.state&TVIS_EXPANDED) i=1;
1740 else i=0;
1741 sprintf(buffer+i2,"%d\r\n",i);
1742 i2+=lstrlen(buffer+i2);
1743
1744 tvItem.hItem=TreeView_GetRoot(hProcedureTreeView);
1745 TreeView_GetItem(hProcedureTreeView,&tvItem);
1746 if(tvItem.state&TVIS_EXPANDED) i=1;
1747 else i=0;
1748 sprintf(buffer+i2,"%d\r\n",i);
1749 i2+=lstrlen(buffer+i2);
1750
1751 tvItem.hItem=TreeView_GetRoot(hMaterialTreeView);
1752 while(tvItem.hItem){
1753 TreeView_GetItem(hMaterialTreeView,&tvItem);
1754 if(tvItem.state&TVIS_EXPANDED) i=1;
1755 else i=0;
1756 sprintf(buffer+i2,"%d",i);
1757 i2+=lstrlen(buffer+i2);
1758
1759 tvItem.hItem=TreeView_GetNextSibling(hMaterialTreeView,tvItem.hItem);
1760 if(tvItem.hItem){
1761 lstrcpy(buffer+i2,",");
1762 i2+=lstrlen(buffer+i2);
1763 }
1764 }
1765
1766
1767 //保存
1768 sprintf(temporary,"%s%s.wrk",projectInfo.GetWorkDir().GetPath().c_str(),projectInfo.GetName().c_str());
1769 WriteBuffer(temporary,buffer,i2);
1770}
1771
1772BOOL SetProjectToRun(void){
1773 HANDLE hFind;
1774 WIN32_FIND_DATA wfd;
1775
1776 if( projectInfo.fileSystem.root.IsEmpty() )
1777 {
1778 //"プログラム ファイルがプロジェクトに存在しません。"
1779 MessageBox(hOwner,STRING_ERROR_NOFILE,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
1780 return 0;
1781 }
1782
1783 extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
1784 hFind=FindFirstFile( ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ).c_str(), &wfd );
1785 if(hFind==INVALID_HANDLE_VALUE){
1786 //"BasicCompiler.exe が見つかりません"
1787 MessageBox(hOwner,STRING_ERROR_NOBASICCOMPILER,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
1788 return 0;
1789 }
1790 FindClose(hFind);
1791
1792 //プロジェクト構造のバージョンが違う時は、再保存する
1793 if(projectInfo.dwVersion<PROJECT_VERSION)
1794 projectInfo.ModifyOfMaterial=1;
1795
1796 //保存確認
1797 if(!ProjectModifyCheck(1)) return 0;
1798
1799 return 1;
1800}
1801bool IsNeedCompileForProject( const ActiveBasic::PM::FM::Folder &folder, const FILETIME &exeTime )
1802{
1803 BOOST_FOREACH( const ActiveBasic::PM::FM::Folder &childFolder, folder.folders )
1804 {
1805 if( IsNeedCompileForProject( childFolder, exeTime ) )
1806 {
1807 return true;
1808 }
1809 }
1810
1811 BOOST_FOREACH( const ActiveBasic::PM::FM::File &file, folder.files )
1812 {
1813 FILETIME sourceTime;
1814 {
1815 ATL::CHandle hFile(CreateFile(file.GetFullPath().c_str(),GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
1816 GetFileTime(hFile,NULL,NULL,&sourceTime);
1817 }
1818
1819 if(sourceTime.dwHighDateTime>exeTime.dwHighDateTime||
1820 sourceTime.dwHighDateTime==exeTime.dwHighDateTime&&
1821 sourceTime.dwLowDateTime>exeTime.dwLowDateTime) return true;
1822 }
1823
1824 return false;
1825}
1826
1827BOOL IsNeedCompileForProject(BOOL bDebug){
1828 char temporary[MAX_PATH];
1829 HANDLE hFind;
1830 WIN32_FIND_DATA wfd;
1831 FILETIME SourceTime,ExeTime;
1832
1833 if(bDebug) lstrcpy(temporary,projectInfo.lpszOutput_Debug);
1834 else lstrcpy(temporary,projectInfo.lpszOutput_Release);
1835 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1836
1837 hFind=FindFirstFile(temporary,&wfd);
1838 if(hFind==INVALID_HANDLE_VALUE) return 1;
1839 FindClose(hFind);
1840
1841 {
1842 ATL::CHandle hFile(CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
1843 GetFileTime(hFile,NULL,NULL,&ExeTime);
1844 }
1845
1846 if( IsNeedCompileForProject( projectInfo.fileSystem.root, ExeTime ) )
1847 {
1848 return 1;
1849 }
1850 if( !projectInfo.windowInfos.empty() )
1851 {
1852 //CallBack.wbp
1853 lstrcpy(temporary,"CallBack.wbp");
1854 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1855 {
1856 ATL::CHandle hFile(CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
1857 GetFileTime(hFile,NULL,NULL,&SourceTime);
1858 }
1859 if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
1860 SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
1861 SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
1862
1863 //MakeWindow.wbp
1864 lstrcpy(temporary,"MakeWindow.wbp");
1865 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1866 {
1867 ATL::CHandle hFile(CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
1868 GetFileTime(hFile,NULL,NULL,&SourceTime);
1869 }
1870 if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
1871 SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
1872 SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
1873 }
1874 return 0;
1875}
Note: See TracBrowser for help on using the repository browser.