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

Last change on this file since 681 was 655, checked in by dai_9181, 16 years ago

FileManager周りをリファクタリング

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 if(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 }
837 if(!WriteBuffer(temporary,buffer,i)) return;
838
839
840 ///////////////////////////////////////////
841 //メインプログラムファイル(*.ab)を作成
842 if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE){
843 sprintf(buffer,"#include \"%s.idx\"\r\n\r\n",NewProjectInfo.name);
844 i=lstrlen(buffer);
845 lstrcpy(buffer+i,"'---------------------------\r\n");
846 i+=lstrlen(buffer+i);
847 lstrcpy(buffer+i,"' Window Message Loop\r\n");
848 i+=lstrlen(buffer+i);
849 lstrcpy(buffer+i,"'---------------------------\r\n");
850 i+=lstrlen(buffer+i);
851 lstrcpy(buffer+i,"Dim msgMain As MSG, iResult As Long\r\n");
852 i+=lstrlen(buffer+i);
853 lstrcpy(buffer+i,"Do\r\n");
854 i+=lstrlen(buffer+i);
855 lstrcpy(buffer+i,"\tiResult=GetMessage(msgMain,0,0,0)\r\n");
856 i+=lstrlen(buffer+i);
857 lstrcpy(buffer+i,"\tIf iResult=0 or iResult=-1 Then Exit Do\r\n");
858 i+=lstrlen(buffer+i);
859 lstrcpy(buffer+i,"\tTranslateMessage(msgMain)\r\n");
860 i+=lstrlen(buffer+i);
861 lstrcpy(buffer+i,"\tDispatchMessage(msgMain)\r\n");
862 i+=lstrlen(buffer+i);
863 lstrcpy(buffer+i,"Loop\r\n\r\n");
864 i+=lstrlen(buffer+i);
865 lstrcpy(buffer+i,"' Call destructores and exit process\r\n");
866 i+=lstrlen(buffer+i);
867 lstrcpy(buffer+i,"End\r\n");
868 i+=lstrlen(buffer+i);
869 }
870 else if(NewProjectInfo.dwTypeID==IDC_EXE_PROMPTBASE){
871 sprintf(buffer,"#include \"%s.idx\"\r\n\r\n",NewProjectInfo.name);
872 i=lstrlen(buffer);
873 lstrcpy(buffer+i,"#N88BASIC\r\n\r\n");
874 i+=lstrlen(buffer+i);
875 lstrcpy(buffer+i,"' ↓ ここからプログラムが実行されます\r\n\r\n");
876 i+=lstrlen(buffer+i);
877 if(NewProjectInfo.ShowHelloWorld){
878 lstrcpy(buffer+i,"Print \"Hello World!\"\r\n");
879 i+=lstrlen(buffer+i);
880 }
881 }
882 else if(NewProjectInfo.dwTypeID==IDC_EXE_DOSPROMPTBASE){
883 sprintf(buffer,"#include \"%s.idx\"\r\n\r\n",NewProjectInfo.name);
884 i=lstrlen(buffer);
885 lstrcpy(buffer+i,"#console\r\n\r\n");
886 i+=lstrlen(buffer+i);
887 lstrcpy(buffer+i,"' ↓ ここからプログラムが実行されます\r\n\r\n");
888 i+=lstrlen(buffer+i);
889 if(NewProjectInfo.ShowHelloWorld){
890 lstrcpy(buffer+i,"Print \"Hello World!\"\r\n");
891 i+=lstrlen(buffer+i);
892 }
893 }
894 else if(NewProjectInfo.dwTypeID==IDC_EXE_NOBASE){
895 sprintf(buffer,"#include \"%s.idx\"\r\n\r\n",NewProjectInfo.name);
896 i=lstrlen(buffer);
897 lstrcpy(buffer+i,"' ↓ ここからプログラムが実行されます\r\n\r\n");
898 i+=lstrlen(buffer+i);
899 }
900 else if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
901 const std::string mainExeDirectXAbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dx\\main_exe_directx.abp";
902 pTemp = ReadBuffer( mainExeDirectXAbpPath );
903
904 //#name#をプロジェクト名に置換
905 pTemp=PermutationWndPgmTemplate(pTemp,NewProjectInfo.name,0,0,0);
906 }
907 else if(NewProjectInfo.dwTypeID==IDC_DLL){
908 sprintf(buffer,"#include \"%s.idx\"\r\n\r\n",NewProjectInfo.name);
909 i=lstrlen(buffer);
910 lstrcpy(buffer+i,"'-------------------------------------------------------------------\r\n");
911 i+=lstrlen(buffer+i);
912 lstrcpy(buffer+i,"' メモ - このファイルには、DLLの構成要素を記述します。\r\n");
913 i+=lstrlen(buffer+i);
914 lstrcpy(buffer+i,"' (例:関数定義、グローバル変数、定数定義など)\r\n");
915 i+=lstrlen(buffer+i);
916 lstrcpy(buffer+i,"'\r\n");
917 i+=lstrlen(buffer+i);
918 lstrcpy(buffer+i,"' エクスポートが必要な関数には、\"Export\" 修飾子を指定します。\r\n");
919 i+=lstrlen(buffer+i);
920 lstrcpy(buffer+i,"' (例:Function Export FuncName() As Long)\r\n");
921 i+=lstrlen(buffer+i);
922 lstrcpy(buffer+i,"'-------------------------------------------------------------------\r\n");
923 i+=lstrlen(buffer+i);
924 lstrcpy(buffer+i,"\r\n");
925 i+=lstrlen(buffer+i);
926 lstrcpy(buffer+i,"Function Export DllMain(hinstDLL As HINSTANCE, fdwReason As DWord, lpvReserved As VoidPtr) As Long\r\n");
927 i+=lstrlen(buffer+i);
928 lstrcpy(buffer+i,"\t'DLLエントリポイント\r\n");
929 i+=lstrlen(buffer+i);
930 lstrcpy(buffer+i,"\tSelect Case fdwReason\r\n");
931 i+=lstrlen(buffer+i);
932 lstrcpy(buffer+i,"\t\tCase DLL_PROCESS_ATTACH\r\n");
933 i+=lstrlen(buffer+i);
934 lstrcpy(buffer+i,"\t\t\t'DLLがプロセス空間にロードされた時に実行されます。\r\n");
935 i+=lstrlen(buffer+i);
936 lstrcpy(buffer+i,"\t\t\t_System_StartupProgram()\r\n");
937 i+=lstrlen(buffer+i);
938 lstrcpy(buffer+i,"\t\t\tDllMain=1\r\n");
939 i+=lstrlen(buffer+i);
940 lstrcpy(buffer+i,"\t\tCase DLL_PROCESS_DETACH\r\n");
941 i+=lstrlen(buffer+i);
942 lstrcpy(buffer+i,"\t\t\t_System_Call_Destructor_of_GlobalObject()\r\n");
943 i+=lstrlen(buffer+i);
944 lstrcpy(buffer+i,"\tEnd Select\r\n");
945 i+=lstrlen(buffer+i);
946 lstrcpy(buffer+i,"End Function\r\n");
947 i+=lstrlen(buffer+i);
948 lstrcpy(buffer+i,"\r\n");
949 i+=lstrlen(buffer+i);
950 }
951 else if( NewProjectInfo.dwTypeID == IDC_SLL )
952 {
953 buffer[0] = 0;
954 }
955
956 //保存
957 if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
958 sprintf(temporary,"%s%s.ab",dir,NewProjectInfo.name);
959 WriteBuffer(temporary,pTemp,lstrlen(pTemp));
960
961 HeapDefaultFree(pTemp);
962 }
963 else{
964 sprintf(temporary,"%s%s.ab",dir,NewProjectInfo.name);
965 if(!WriteBuffer(temporary,buffer,lstrlen(buffer))) return;
966 }
967
968
969 /////////////////////
970 // MainWnd.abを作成
971 /////////////////////
972
973 std::string mainWndSbpPath = "";
974 if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE)
975 {
976 mainWndSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\MainWnd_exe_windowbase.sbp";
977 }
978 else if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX)
979 {
980 mainWndSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\MainWnd_exe_directx.sbp";
981 }
982
983 if( !mainWndSbpPath.empty() ){
984 pTemp = ReadBuffer( mainWndSbpPath );
985
986 //#name#をプロジェクト名に置換
987 pTemp=PermutationWndPgmTemplate(pTemp,
988 NewProjectInfo.name,
989 "MainWnd",
990 "hMainWnd",
991 "MainWndProc");
992
993 if(NewProjectInfo.ShowHelloWorld){
994 //Hello World!表示
995 i=0;
996 lstrcpy(buffer+i,"\r\nSub MainWnd_Paint(hDC As HDC)\r\n");
997 i+=lstrlen(buffer+i);
998 lstrcpy(buffer+i,"\tDim rect As RECT\r\n");
999 i+=lstrlen(buffer+i);
1000 lstrcpy(buffer+i,"\tGetClientRect(hMainWnd,rect)\r\n");
1001 i+=lstrlen(buffer+i);
1002 lstrcpy(buffer+i,"\tDrawText(hDC,\"Hello World!\",-1,rect,DT_CENTER or DT_VCENTER or DT_SINGLELINE)\r\n");
1003 i+=lstrlen(buffer+i);
1004 lstrcpy(buffer+i,"End Sub\r\n");
1005 i+=lstrlen(buffer+i);
1006
1007 pTemp=(char *)HeapReAlloc(hHeap,0,pTemp,lstrlen(pTemp)+lstrlen(buffer)+1);
1008 lstrcat(pTemp,buffer);
1009 }
1010
1011 sprintf(temporary,"%sMainWnd.ab",dir,NewProjectInfo.name);
1012 WriteBuffer(temporary,pTemp,lstrlen(pTemp));
1013
1014 HeapDefaultFree(pTemp);
1015 }
1016
1017
1018 if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
1019 ///////////////////////////
1020 // DirextX対応アプリのとき
1021 ///////////////////////////
1022
1023 //dx_graphics.sbpをコピー
1024 const std::string dxGraphicsSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dx\\dx_graphics.sbp";
1025 pTemp = ReadBuffer( dxGraphicsSbpPath );
1026 sprintf(temporary,"%sdx_graphics.sbp",dir,NewProjectInfo.name);
1027 WriteBuffer(temporary,pTemp,lstrlen(pTemp));
1028 HeapDefaultFree(pTemp);
1029
1030 //dx_input.sbpをコピー
1031 const std::string dxInputSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dx\\dx_input.sbp";
1032 pTemp = ReadBuffer( dxInputSbpPath );
1033 sprintf(temporary,"%sdx_input.sbp",dir,NewProjectInfo.name);
1034 WriteBuffer(temporary,pTemp,lstrlen(pTemp));
1035 HeapDefaultFree(pTemp);
1036
1037 //dx_music.sbpをコピー
1038 const std::string dxMusicSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dx\\dx_music.sbp";
1039 pTemp = ReadBuffer( dxMusicSbpPath );
1040 sprintf(temporary,"%sdx_music.sbp",dir,NewProjectInfo.name);
1041 WriteBuffer(temporary,pTemp,lstrlen(pTemp));
1042 HeapDefaultFree(pTemp);
1043
1044 //dx9abm.dllをコピー
1045 sprintf(temporary,"%sRuntime\\dx9abm.dll",pj_editor_Dir);
1046 sprintf(buffer,"%sdx9abm.dll",dir,NewProjectInfo.name);
1047 CopyFile(temporary,buffer,0);
1048 }
1049
1050
1051 if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE||
1052 NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
1053 /////////////////////////////////////////
1054 // ウィンドウ定義ファイル(*.wnd)を作成
1055 /////////////////////////////////////////
1056 ActiveBasic::PM::WindowInfos windowInfos;
1057 windowInfos.push_back( new ActiveBasic::PM::WindowInfo() );
1058 windowInfos.back()->SetName( "MainWnd" );
1059 windowInfos.back()->pos.x=CW_USEDEFAULT;
1060 windowInfos.back()->pos.y=CW_USEDEFAULT;
1061 windowInfos.back()->size.cx=480;
1062 windowInfos.back()->size.cy=360;
1063 windowInfos.back()->SetCaption( NewProjectInfo.name );
1064 if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE)
1065 {
1066 windowInfos.back()->SetStyle( WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_VISIBLE );
1067 }
1068 else if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX)
1069 {
1070 windowInfos.back()->SetStyle( WS_OVERLAPPED|WS_THICKFRAME|WS_SYSMENU );
1071 }
1072 windowInfos.back()->SetExStyle( 0 );
1073 windowInfos.back()->SetMenuIdName( "" );
1074 windowInfos.back()->SetBackgroundColor( COLOR_3DFACE );
1075 GetDefaultWindowFont(&windowInfos.back()->LogFont);
1076 windowInfos.back()->SetIconResourceName( "" );
1077 windowInfos.back()->SetClassName( "NORMAL" );
1078 windowInfos.back()->SetType( ActiveBasic::PM::WindowType::Default );
1079 sprintf(temporary,"%s%s.wnd",dir,NewProjectInfo.name);
1080
1081 projectInfo.NumberOfMenu=0;
1082 SaveWindowFile( temporary, windowInfos );
1083
1084 windowInfos.Clear();
1085 }
1086
1087
1088 ////////////////////////
1089 // ワークファイルを作成
1090 ////////////////////////
1091 lstrcpy(buffer,"case4\r\n\r\n");
1092 if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE){
1093 lstrcat(buffer,"rad,MainWnd\r\n\r\n");
1094 }
1095 else{
1096 sprintf(buffer+lstrlen(buffer),"text,\"%s.ab\",0,0,0,0\r\n\r\n",NewProjectInfo.name);
1097 }
1098 lstrcat(buffer,"0\r\n0\r\n0\r\n0,0");
1099 //保存
1100 sprintf(temporary,"%s%s.wrk",dir,NewProjectInfo.name);
1101 if(!WriteBuffer(temporary,buffer,lstrlen(buffer))) return;
1102
1103
1104 //マニフェストを作成
1105 char temp2[MAX_PATH];
1106 const std::string manifestTempXmlPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\manifest_temp.xml";
1107 sprintf(temp2,"%s%s.manifest.xml",dir,NewProjectInfo.name);
1108 CopyFile( manifestTempXmlPath.c_str(), temp2, 0 );
1109
1110
1111 sprintf(temporary,"%s%s.pj",dir,NewProjectInfo.name);
1112 projectInfo.Load(temporary);
1113 projectInfo.Save();
1114}
1115void SetTreeViewForProjectInfo(){
1116 extern HANDLE hHeap;
1117 extern HWND hProjectView;
1118 int i;
1119 char temporary[MAX_PATH];
1120 TV_INSERTSTRUCT tv;
1121
1122 sprintf(temporary,"%s ",projectInfo.GetName().c_str());
1123 lstrcat(temporary,STRING_PROJECT);
1124 SetWindowText(hProjectView,temporary);
1125
1126 tv.hInsertAfter=TVI_SORT;
1127 tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
1128
1129 //ファイル ツリー
1130 pobj_FileTree->Reset( projectInfo.fileSystem );
1131
1132 //関数ツリー
1133 ResetClassTree((HTREEITEM)-1);
1134
1135 /////////////////////
1136 // マテリアル ツリー
1137
1138 //Cursorリソース フォルダ
1139 sprintf(temporary,"Cursor %s",STRING_RESOURCE);
1140 tv.hParent=TVI_ROOT;
1141 tv.item.iImage=0;
1142 tv.item.iSelectedImage=0;
1143 tv.item.pszText=temporary;
1144 tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1145 hCursorTreeItemForProjectView = tv.hParent;
1146 BOOST_FOREACH( ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.cursorResources )
1147 {
1148 tv.item.iImage=6;
1149 tv.item.iSelectedImage=6;
1150 lstrcpy( temporary, resourceItem.idName.c_str() );
1151 tv.item.pszText=temporary;
1152 resourceItem.hTreeItem = TreeView_InsertItem(hMaterialTreeView,&tv);
1153 }
1154
1155 //Bitmapリソース フォルダ
1156 sprintf(temporary,"Bitmap %s",STRING_RESOURCE);
1157 tv.hParent=TVI_ROOT;
1158 tv.item.iImage=0;
1159 tv.item.iSelectedImage=0;
1160 tv.item.pszText=temporary;
1161 tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1162 hBitmapTreeItemForProjectView = tv.hParent;
1163 BOOST_FOREACH( ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.bitmapResources )
1164 {
1165 tv.item.iImage=5;
1166 tv.item.iSelectedImage=5;
1167 lstrcpy( temporary, resourceItem.idName.c_str() );
1168 tv.item.pszText=temporary;
1169 resourceItem.hTreeItem = TreeView_InsertItem(hMaterialTreeView,&tv);
1170 }
1171
1172 //Iconリソース フォルダ
1173 sprintf(temporary,"Icon %s",STRING_RESOURCE);
1174 tv.hParent=TVI_ROOT;
1175 tv.item.iImage=0;
1176 tv.item.iSelectedImage=0;
1177 tv.item.pszText=temporary;
1178 tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1179 hIconTreeItemForProjectView = tv.hParent;
1180 for(i=0;i<static_cast<int>(projectInfo.resourceManager.iconResources.size());i++){
1181 tv.item.iImage=4;
1182 tv.item.iSelectedImage=4;
1183 if(i==0){
1184 sprintf(temporary,"%s (Main)",projectInfo.resourceManager.iconResources[i].idName.c_str());
1185 }
1186 else
1187 {
1188 sprintf(temporary,"%s",projectInfo.resourceManager.iconResources[i].idName.c_str());
1189 }
1190 tv.item.pszText=temporary;
1191 projectInfo.resourceManager.iconResources[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1192 }
1193
1194 //Menuフォルダ
1195 tv.hParent=TVI_ROOT;
1196 tv.item.iImage=0;
1197 tv.item.iSelectedImage=0;
1198 tv.item.pszText="Menu";
1199 tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1200 projectInfo.hMenuTreeItem=tv.hParent;
1201 for(i=0;i<projectInfo.NumberOfMenu;i++){
1202 tv.item.iImage=3;
1203 tv.item.iSelectedImage=3;
1204 tv.item.pszText=projectInfo.pMenuInfo[i].IdName;
1205 projectInfo.pMenuInfo[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1206 }
1207
1208 //Windowフォルダ
1209 tv.hParent=TVI_ROOT;
1210 tv.item.iImage=0;
1211 tv.item.iSelectedImage=0;
1212 tv.item.pszText="Window";
1213 tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1214 projectInfo.hWindowTreeItem=tv.hParent;
1215 BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
1216 {
1217 tv.item.iImage=2;
1218 tv.item.iSelectedImage=2;
1219 char temporary[1024];
1220 lstrcpy( temporary, pWindowInfo->GetName().c_str() );
1221 tv.item.pszText = temporary;
1222 pWindowInfo->hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1223 }
1224}
1225void OpenWorkfile( const std::string &path )
1226{
1227 extern HANDLE hHeap;
1228 int i,i2,i3;
1229 char *buffer,temporary[MAX_PATH],temp2[MAX_PATH];
1230
1231 //プロジェクト ビューを設定、表示
1232 extern HWND hProjectView;
1233 SetTreeViewForProjectInfo();
1234 if(!IsWindowVisible(hProjectView)) SendMessage(hOwner,WM_COMMAND,IDM_PROJECTVIEW,0);
1235
1236
1237 //メニュー状態を設定
1238 ResetState_DocMenu();
1239
1240
1241 //////////////////////////////////////////
1242 //ワークファイル(*.wrk)をオープン
1243 HTREEITEM hTreeItem;
1244 HANDLE hFind;
1245 WIN32_FIND_DATA wfd;
1246 HWND hChild;
1247 int WndNum;
1248 hFind=FindFirstFile(path.c_str(),&wfd);
1249 if(hFind!=INVALID_HANDLE_VALUE){
1250 FindClose(hFind);
1251 buffer=ReadBuffer(path);
1252 if(!buffer) return;
1253
1254 //解析、反映
1255 memcpy(temporary,buffer,5);
1256 temporary[5]=0;
1257 if(lstrcmp(temporary,"case4")==0){
1258
1259 LockWindowUpdate(hOwner);
1260 for(i=9,i2=0;;i++,i2++){
1261 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1262 if(i2!=0){
1263 temporary[i2]=0;
1264 for(i3=0;;i3++){
1265 if(temporary[i3]==','||temporary[i3]=='\0') break;
1266 }
1267 if(temporary[i3]=='\0') goto EndToSetWorkFile;
1268 lstrcpy(temp2,temporary+i3+1);
1269 temporary[i3]=0;
1270 if(lstrcmpi(temporary,"text")==0){
1271 if(temp2[0]!='\"') goto EndToSetWorkFile;
1272
1273 //ファイルを開く
1274 i2=1;
1275 for(i3=0;;i2++,i3++){
1276 if(temp2[i2]=='\"'||temp2[i2]=='\0'){
1277 temporary[i3]=0;
1278 break;
1279 }
1280 temporary[i3]=temp2[i2];
1281 }
1282 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1283 hChild=OpenFileWithExtension(temporary);
1284 WndNum=GetWndNum(hChild);
1285 if(WndNum==-1){
1286 goto EndToSetWorkFile;
1287 }
1288
1289 //ResetScrollbarが再描画時に呼び出されるので、再描画する
1290 InvalidateRect(MdiInfo[WndNum]->pMdiTextEdit->hEdit,NULL,0);
1291 UpdateWindow(MdiInfo[WndNum]->pMdiTextEdit->hEdit);
1292
1293 if(temp2[i2]=='\0') goto EndToSetWorkFile;
1294 if(temp2[i2+1]!=',') goto EndToSetWorkFile;
1295
1296 //以前のスクロール位置を復元
1297 SCROLLINFO si;
1298 POINT pos;
1299 for(i2+=2,i3=0;;i2++,i3++){
1300 if(temp2[i2]==','||temp2[i2]=='\0'){
1301 temporary[i3]=0;
1302 break;
1303 }
1304 temporary[i3]=temp2[i2];
1305 }
1306 sscanf(temporary,"%d",&pos.x);
1307 if(temp2[i2]=='\0') goto EndToSetWorkFile;
1308 for(i2++,i3=0;;i2++,i3++){
1309 if(temp2[i2]==','||temp2[i2]=='\0'){
1310 temporary[i3]=0;
1311 break;
1312 }
1313 temporary[i3]=temp2[i2];
1314 }
1315 sscanf(temporary,"%d",&pos.y);
1316 si.cbSize=sizeof(SCROLLINFO);
1317 si.fMask=SIF_POS;
1318 si.nPos=pos.x;
1319 SetScrollInfo(MdiInfo[WndNum]->pMdiTextEdit->hEdit,SB_HORZ,&si,1);
1320 si.nPos=pos.y;
1321 SetScrollInfo(MdiInfo[WndNum]->pMdiTextEdit->hEdit,SB_VERT,&si,1);
1322
1323 if(temp2[i2]=='\0') goto EndToSetWorkFile;
1324
1325 //キャレット位置をセット
1326 for(i2++,i3=0;;i2++,i3++){
1327 if(temp2[i2]==','||temp2[i2]=='\0'){
1328 temporary[i3]=0;
1329 break;
1330 }
1331 temporary[i3]=temp2[i2];
1332 }
1333 sscanf(temporary,"%d",&pos.x);
1334 if(temp2[i2]=='\0') goto EndToSetWorkFile;
1335 for(i2++,i3=0;;i2++,i3++){
1336 if(temp2[i2]==','||temp2[i2]=='\0'){
1337 temporary[i3]=0;
1338 break;
1339 }
1340 temporary[i3]=temp2[i2];
1341 }
1342 sscanf(temporary,"%d",&pos.y);
1343 TextEdit_SetSel(WndNum,pos.x,pos.y);
1344 }
1345 else if(lstrcmpi(temporary,"rad")==0){
1346 for(i3=0;i3<static_cast<int>(projectInfo.windowInfos.size());i3++){
1347 if(lstrcmpi(projectInfo.windowInfos[i3]->GetName().c_str(),temp2)==0){
1348 NewRadWindow( *projectInfo.windowInfos[i3] );
1349 break;
1350 }
1351 }
1352 }
1353 else if(lstrcmpi(temporary,"menu")==0){
1354 for(i3=0;i3<projectInfo.NumberOfMenu;i3++){
1355 if(lstrcmpi(projectInfo.pMenuInfo[i3].IdName,temp2)==0){
1356 NewMenuWindow(&projectInfo.pMenuInfo[i3]);
1357 break;
1358 }
1359 }
1360 }
1361 else if(lstrcmpi(temporary,"icon")==0)
1362 {
1363 BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
1364 {
1365 if(lstrcmpi(resourceItem.filepath.c_str(),temp2)==0){
1366 NewIconEditWindow( projectInfo.GetWorkDir().GetFullPath( temp2 ).c_str() );
1367 break;
1368 }
1369 }
1370 }
1371 i++;
1372 i2=-1;
1373 continue;
1374 }
1375 else break;
1376 }
1377 temporary[i2]=buffer[i];
1378 }
1379
1380 for(i+=2,i2=0;;i++,i2++){
1381 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1382 temporary[i2]=0;
1383 break;
1384 }
1385 temporary[i2]=buffer[i];
1386 }
1387 sscanf(temporary,"%d",&i2);
1388
1389 switch( i2 ){
1390 case 0:
1391 ShowFileView();
1392 break;
1393 case 1:
1394 ShowClassView();
1395 break;
1396 case 2:
1397 ShowMaterialView();
1398 break;
1399 }
1400
1401 if(buffer[i]=='\0') goto EndToSetWorkFile;
1402
1403 for(i+=2,i2=0;;i++,i2++){
1404 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1405 temporary[i2]=0;
1406 break;
1407 }
1408 temporary[i2]=buffer[i];
1409 }
1410 if(temporary[0]=='1')
1411 {
1412 pobj_FileTree->Expand( pobj_FileTree->GetRootItem(), TVE_EXPAND );
1413 }
1414
1415 for(i+=2,i2=0;;i++,i2++){
1416 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1417 temporary[i2]=0;
1418 break;
1419 }
1420 temporary[i2]=buffer[i];
1421 }
1422 if(temporary[0]=='1') TreeView_Expand(hProcedureTreeView,TreeView_GetRoot(hProcedureTreeView),TVE_EXPAND);
1423
1424 for(i+=2,i2=0;;i++,i2++){
1425 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1426 temporary[i2]=0;
1427 break;
1428 }
1429 temporary[i2]=buffer[i];
1430 }
1431 hTreeItem=TreeView_GetRoot(hMaterialTreeView);
1432 i2=0;
1433 while(hTreeItem){
1434 i2=GetOneParameter(temporary,i2,temp2);
1435 if(GetValue(temp2)) TreeView_Expand(hMaterialTreeView,hTreeItem,TVE_EXPAND);
1436 hTreeItem=TreeView_GetNextSibling(hMaterialTreeView,hTreeItem);
1437 }
1438 }
1439 else if(lstrcmp(temporary,"case3")==0){
1440 ////////////////////////////////////////
1441 // 古いフォーマットのワークファイル
1442
1443 LockWindowUpdate(hOwner);
1444 for(i=9,i2=0;;i++,i2++){
1445 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1446 if(i2!=0){
1447 temporary[i2]=0;
1448 for(i3=0;;i3++){
1449 if(temporary[i3]==','||temporary[i3]=='\0') break;
1450 }
1451 if(temporary[i3]=='\0') goto EndToSetWorkFile;
1452 lstrcpy(temp2,temporary+i3+1);
1453 temporary[i3]=0;
1454 if(lstrcmpi(temporary,"text")==0){
1455 for(i3=0;;i3++){
1456 if(temp2[i3]==','||temp2[i3]=='\0') break;
1457 }
1458 if(temp2[i3]=='\0') goto EndToSetWorkFile;
1459 lstrcpy(temporary,temp2+i3+1);
1460 temp2[i3]=0;
1461 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1462 sscanf(temp2,"%d",&i3);
1463
1464 //ファイルを開く
1465 hChild=OpenFileWithExtension(temporary);
1466 WndNum=GetWndNum(hChild);
1467
1468 //キャレット位置をセット
1469 TextEdit_SetSel(WndNum,i3,i3);
1470 }
1471 else if(lstrcmpi(temporary,"rad")==0){
1472 for(i3=0;i3<static_cast<int>(projectInfo.windowInfos.size());i3++){
1473 if(lstrcmpi(projectInfo.windowInfos[i3]->GetName().c_str(),temp2)==0){
1474 NewRadWindow( *projectInfo.windowInfos[i3] );
1475 break;
1476 }
1477 }
1478 }
1479 else if(lstrcmpi(temporary,"menu")==0){
1480 for(i3=0;i3<projectInfo.NumberOfMenu;i3++){
1481 if(lstrcmpi(projectInfo.pMenuInfo[i3].IdName,temp2)==0){
1482 NewMenuWindow(&projectInfo.pMenuInfo[i3]);
1483 break;
1484 }
1485 }
1486 }
1487 else if(lstrcmpi(temporary,"icon")==0){
1488 BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
1489 {
1490 if(lstrcmpi(resourceItem.filepath.c_str(),temp2)==0){
1491 NewIconEditWindow( projectInfo.GetWorkDir().GetFullPath( temp2 ).c_str() );
1492 break;
1493 }
1494 }
1495 }
1496 i++;
1497 i2=-1;
1498 continue;
1499 }
1500 else break;
1501 }
1502 temporary[i2]=buffer[i];
1503 }
1504
1505 for(i+=2,i2=0;;i++,i2++){
1506 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1507 temporary[i2]=0;
1508 break;
1509 }
1510 temporary[i2]=buffer[i];
1511 }
1512 sscanf(temporary,"%d",&i2);
1513
1514 switch( i2 ){
1515 case 0:
1516 ShowFileView();
1517 break;
1518 case 1:
1519 ShowClassView();
1520 break;
1521 case 2:
1522 ShowMaterialView();
1523 break;
1524 }
1525
1526 if(buffer[i]=='\0') goto EndToSetWorkFile;
1527
1528 for(i+=2,i2=0;;i++,i2++){
1529 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1530 temporary[i2]=0;
1531 break;
1532 }
1533 temporary[i2]=buffer[i];
1534 }
1535 if(temporary[0]=='1')
1536 {
1537 pobj_FileTree->Expand( pobj_FileTree->GetRootItem(), TVE_EXPAND );
1538 }
1539
1540 for(i+=2,i2=0;;i++,i2++){
1541 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1542 temporary[i2]=0;
1543 break;
1544 }
1545 temporary[i2]=buffer[i];
1546 }
1547 if(temporary[0]=='1') TreeView_Expand(hProcedureTreeView,TreeView_GetRoot(hProcedureTreeView),TVE_EXPAND);
1548
1549 for(i+=2,i2=0;;i++,i2++){
1550 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1551 temporary[i2]=0;
1552 break;
1553 }
1554 temporary[i2]=buffer[i];
1555 }
1556 hTreeItem=TreeView_GetRoot(hMaterialTreeView);
1557 i2=0;
1558 while(hTreeItem){
1559 i2=GetOneParameter(temporary,i2,temp2);
1560 if(GetValue(temp2)) TreeView_Expand(hMaterialTreeView,hTreeItem,TVE_EXPAND);
1561 hTreeItem=TreeView_GetNextSibling(hMaterialTreeView,hTreeItem);
1562 }
1563 }
1564EndToSetWorkFile:
1565 LockWindowUpdate(NULL);
1566 HeapDefaultFree(buffer);
1567 }
1568
1569
1570 //ウィンドウ タイトルを変更
1571 sprintf(temporary,"%s - %s",projectInfo.GetName().c_str(),APPLICATION_NAME);
1572 SetWindowText(hOwner,temporary);
1573}
1574BOOL ProjectModifyCheck(BOOL bRun){
1575 int i,WndNum,sw;
1576 HWND hChild;
1577 char temporary[MAX_PATH];
1578 if(projectInfo.modify||projectInfo.ModifyOfMaterial||projectInfo.ModifuOfResource){
1579 if(bRun==0||pobj_nv->bSaveCheckProject){
1580 //"\"%s\" プロジェクトは変更されています。保存しますか?"
1581 sprintf(temporary,STRING_MODIFYCHECK_PROJECT,projectInfo.GetName().c_str());
1582 i=MessageBox(hOwner,temporary,APPLICATION_NAME,MB_YESNOCANCEL|MB_ICONEXCLAMATION);
1583
1584 if(i==IDCANCEL) return 0;
1585 if(i==IDYES)
1586 {
1587 projectInfo.Save();
1588 }
1589 }
1590 else
1591 {
1592 projectInfo.Save();
1593 }
1594 return 1;
1595 }
1596 hChild=GetWindow(hClient,GW_CHILD);
1597 while(hChild){
1598 WndNum=GetWndNum(hChild);
1599 sw=0;
1600 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
1601 if( MdiInfo[WndNum]->pMdiTextEdit->IsModified() ){
1602 sw = projectInfo.fileSystem.root.IsExistFile( MdiInfo[WndNum]->path );
1603 }
1604 }
1605 else if(MdiInfo[WndNum]->DocType==WNDTYPE_ICONEDIT){
1606 if(MdiInfo[WndNum]->MdiIconEditInfo->bModify){
1607 BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
1608 {
1609 lstrcpy(temporary,resourceItem.filepath.c_str());
1610 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1611 if(lstrcmpi(MdiInfo[WndNum]->path.c_str(),temporary)==0) sw=1;
1612 }
1613 }
1614 }
1615
1616 if(sw){
1617 if(bRun==0||pobj_nv->bSaveCheckProject){
1618 //"\"%s\" プロジェクトは変更されています。保存しますか?"
1619 sprintf(temporary,STRING_MODIFYCHECK_PROJECT,projectInfo.GetName().c_str());
1620 i=MessageBox(hOwner,temporary,APPLICATION_NAME,MB_YESNOCANCEL|MB_ICONEXCLAMATION);
1621
1622 if(i==IDCANCEL) return 0;
1623 if(i==IDYES)
1624 {
1625 projectInfo.Save();
1626 }
1627 }
1628 else
1629 {
1630 projectInfo.Save();
1631 }
1632 return 1;
1633 }
1634 hChild=GetNextWindow(hChild,GW_HWNDNEXT);
1635 }
1636 return 2;
1637}
1638
1639void MakeTextMdiWindowBuffer( ActiveBasic::PM::FM::Folder &folder, int WndNum, char *buffer )
1640{
1641 BOOST_FOREACH( ActiveBasic::PM::FM::Folder &childFolder, folder.folders )
1642 {
1643 MakeTextMdiWindowBuffer( childFolder, WndNum, buffer );
1644 }
1645
1646 BOOST_FOREACH( ActiveBasic::PM::FM::File &file, folder.files )
1647 {
1648 if(lstrcmpi(MdiInfo[WndNum]->path.c_str(),file.GetFullPath().c_str())==0){
1649 CHARRANGE CharRange;
1650 TextEdit_GetSel(WndNum,&CharRange);
1651
1652 SCROLLINFO si;
1653 POINT pos;
1654 si.cbSize=sizeof(SCROLLINFO);
1655 si.fMask=SIF_POS;
1656 GetScrollInfo(MdiInfo[WndNum]->pMdiTextEdit->hEdit,SB_HORZ,&si);
1657 pos.x=si.nPos;
1658 GetScrollInfo(MdiInfo[WndNum]->pMdiTextEdit->hEdit,SB_VERT,&si);
1659 pos.y=si.nPos;
1660
1661 char temporary[1024];
1662 sprintf(temporary,"text,\"%s\",%d,%d,%d,%d\r\n",
1663 file.GetRelationalPath().c_str(),
1664 pos.x,
1665 pos.y,
1666 CharRange.cpMin,
1667 CharRange.cpMax);
1668
1669 lstrcat( buffer, temporary );
1670 break;
1671 }
1672 }
1673}
1674
1675void MakeWorkFile(void){
1676 int i,i2,WndNum;
1677 char temporary[MAX_PATH],buffer[32767];
1678 HWND hChild;
1679
1680 //ワークファイル(*.wrk)を作成
1681 lstrcpy(buffer,"case4\r\n\r\n");
1682 i2=lstrlen(buffer);
1683
1684
1685 ///////////////////////
1686 //MDIウィンドウの並び
1687 hChild=GetWindow(GetWindow(hClient,GW_CHILD),GW_HWNDLAST);
1688 while(hChild){
1689 WndNum=GetWndNum(hChild);
1690 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
1691 MakeTextMdiWindowBuffer( projectInfo.fileSystem.root, WndNum, buffer );
1692 i2 = lstrlen( buffer );
1693 }
1694 else if(MdiInfo[WndNum]->DocType==WNDTYPE_RAD){
1695 BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
1696 {
1697 if(lstrcmpi(MdiInfo[WndNum]->path.c_str(),pWindowInfo->GetName().c_str())==0){
1698 sprintf(buffer+i2,"rad,%s\r\n",MdiInfo[WndNum]->path.c_str());
1699 i2+=lstrlen(buffer+i2);
1700 break;
1701 }
1702 }
1703 }
1704 else if(MdiInfo[WndNum]->DocType==WNDTYPE_MENU){
1705 for(i=0;i<projectInfo.NumberOfMenu;i++){
1706 if(lstrcmpi(MdiInfo[WndNum]->path.c_str(),projectInfo.pMenuInfo[i].IdName)==0){
1707 sprintf(buffer+i2,"menu,%s\r\n",MdiInfo[WndNum]->path.c_str());
1708 i2+=lstrlen(buffer+i2);
1709 break;
1710 }
1711 }
1712 }
1713 else if(MdiInfo[WndNum]->DocType==WNDTYPE_ICONEDIT){
1714 BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
1715 {
1716 lstrcpy(temporary,resourceItem.filepath.c_str());
1717 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1718 if(lstrcmpi(MdiInfo[WndNum]->path.c_str(),temporary)==0){
1719 sprintf(buffer+i2,"icon,%s\r\n",resourceItem.filepath.c_str());
1720 i2+=lstrlen(buffer+i2);
1721 break;
1722 }
1723 }
1724 }
1725 hChild=GetNextWindow(hChild,GW_HWNDPREV);
1726 }
1727 lstrcpy(buffer+i2,"\r\n");
1728 i2+=2;
1729
1730
1731 //////////////////////////
1732 //ツリービューの展開状況
1733 sprintf(buffer+i2,"%d\r\n",TabCtrl_GetCurSel(hProjectViewTab));
1734 i2+=lstrlen(buffer+i2);
1735 TVITEM tvItem;
1736 memset(&tvItem,0,sizeof(TVITEM));
1737 tvItem.mask=TVIF_HANDLE|TVIF_STATE;
1738 tvItem.hItem = pobj_FileTree->GetRootItem();
1739 pobj_FileTree->GetItem( &tvItem );
1740 if(tvItem.state&TVIS_EXPANDED) i=1;
1741 else i=0;
1742 sprintf(buffer+i2,"%d\r\n",i);
1743 i2+=lstrlen(buffer+i2);
1744
1745 tvItem.hItem=TreeView_GetRoot(hProcedureTreeView);
1746 TreeView_GetItem(hProcedureTreeView,&tvItem);
1747 if(tvItem.state&TVIS_EXPANDED) i=1;
1748 else i=0;
1749 sprintf(buffer+i2,"%d\r\n",i);
1750 i2+=lstrlen(buffer+i2);
1751
1752 tvItem.hItem=TreeView_GetRoot(hMaterialTreeView);
1753 while(tvItem.hItem){
1754 TreeView_GetItem(hMaterialTreeView,&tvItem);
1755 if(tvItem.state&TVIS_EXPANDED) i=1;
1756 else i=0;
1757 sprintf(buffer+i2,"%d",i);
1758 i2+=lstrlen(buffer+i2);
1759
1760 tvItem.hItem=TreeView_GetNextSibling(hMaterialTreeView,tvItem.hItem);
1761 if(tvItem.hItem){
1762 lstrcpy(buffer+i2,",");
1763 i2+=lstrlen(buffer+i2);
1764 }
1765 }
1766
1767
1768 //保存
1769 sprintf(temporary,"%s%s.wrk",projectInfo.GetWorkDir().GetPath().c_str(),projectInfo.GetName().c_str());
1770 WriteBuffer(temporary,buffer,i2);
1771}
1772
1773BOOL SetProjectToRun(void){
1774 HANDLE hFind;
1775 WIN32_FIND_DATA wfd;
1776
1777 if( projectInfo.fileSystem.root.IsEmpty() )
1778 {
1779 //"プログラム ファイルがプロジェクトに存在しません。"
1780 MessageBox(hOwner,STRING_ERROR_NOFILE,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
1781 return 0;
1782 }
1783
1784 extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
1785 hFind=FindFirstFile( ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ).c_str(), &wfd );
1786 if(hFind==INVALID_HANDLE_VALUE){
1787 //"BasicCompiler.exe が見つかりません"
1788 MessageBox(hOwner,STRING_ERROR_NOBASICCOMPILER,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
1789 return 0;
1790 }
1791 FindClose(hFind);
1792
1793 //プロジェクト構造のバージョンが違う時は、再保存する
1794 if(projectInfo.dwVersion<PROJECT_VERSION)
1795 projectInfo.ModifyOfMaterial=1;
1796
1797 //保存確認
1798 if(!ProjectModifyCheck(1)) return 0;
1799
1800 return 1;
1801}
1802bool IsNeedCompileForProject( const ActiveBasic::PM::FM::Folder &folder, const FILETIME &exeTime )
1803{
1804 BOOST_FOREACH( const ActiveBasic::PM::FM::Folder &childFolder, folder.folders )
1805 {
1806 if( IsNeedCompileForProject( childFolder, exeTime ) )
1807 {
1808 return true;
1809 }
1810 }
1811
1812 BOOST_FOREACH( const ActiveBasic::PM::FM::File &file, folder.files )
1813 {
1814 HANDLE hFile=CreateFile(file.GetFullPath().c_str(),GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
1815 FILETIME sourceTime;
1816 GetFileTime(hFile,NULL,NULL,&sourceTime);
1817 CloseHandle(hFile);
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,hFile;
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 hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
1842 GetFileTime(hFile,NULL,NULL,&ExeTime);
1843 CloseHandle(hFile);
1844
1845 if( IsNeedCompileForProject( projectInfo.fileSystem.root, ExeTime ) )
1846 {
1847 return 1;
1848 }
1849 if( !projectInfo.windowInfos.empty() )
1850 {
1851 //CallBack.wbp
1852 lstrcpy(temporary,"CallBack.wbp");
1853 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1854 hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
1855 GetFileTime(hFile,NULL,NULL,&SourceTime);
1856 CloseHandle(hFile);
1857 if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
1858 SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
1859 SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
1860
1861 //MakeWindow.wbp
1862 lstrcpy(temporary,"MakeWindow.wbp");
1863 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1864 hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
1865 GetFileTime(hFile,NULL,NULL,&SourceTime);
1866 CloseHandle(hFile);
1867 if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
1868 SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
1869 SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
1870 }
1871 return 0;
1872}
Note: See TracBrowser for help on using the repository browser.