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

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

svn:eol-styleとsvn:mime-type(文字コード指定含む)の設定

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/plain; charset=Shift_JIS
File size: 59.9 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 const LPCSTR 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 (!ActiveBasic::Resource::DialogBoxAlt(hResInst,IDD_INPUTID, hOwner, DlgProject_MenuID_Input, reinterpret_cast<LPARAM>(projectInfo.pMenuInfo[i].IdName)))
284 {
285 break;
286 }
287
288 //重複チェック
289 for(i2=0;i2<projectInfo.NumberOfMenu;i2++){
290 if(i2==i) continue;
291 if(lstrcmp(NewIdName,projectInfo.pMenuInfo[i2].IdName)==0){
292 //"ID \"%s\" は既にプロジェクト内に存在します。"
293 sprintf(temporary,STRING_DUPLICATIONERROR_ID_IN_PROJECT,NewIdName);
294 MessageBox(hOwner,temporary,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
295 return 0;
296 }
297 }
298
299 HeapDefaultFree(projectInfo.pMenuInfo[i].IdName);
300 projectInfo.pMenuInfo[i].IdName=(char *)HeapAlloc(hHeap,0,lstrlen(NewIdName)+1);
301 lstrcpy(projectInfo.pMenuInfo[i].IdName,NewIdName);
302
303 tvItem.hItem=hTreeItem;
304 tvItem.mask=TVIF_TEXT;
305 tvItem.pszText=projectInfo.pMenuInfo[i].IdName;
306 tvItem.cchTextMax=lstrlen(projectInfo.pMenuInfo[i].IdName)+1;
307 TreeView_SetItem(hMaterialTreeView,&tvItem);
308
309 projectInfo.ModifyOfMaterial=1;
310
311 TreeView_SortChildren(hMaterialTreeView,
312 TreeView_GetParent(hMaterialTreeView,hTreeItem),
313 0);
314 break;
315 }
316 }
317 break;
318 case IDM_MATERIALTREE_ICON_SETMAIN:
319 hTreeItem=TreeView_GetSelection(hMaterialTreeView);
320 for(i=0;i<static_cast<int>(projectInfo.resourceManager.iconResources.size());i++){
321 if(projectInfo.resourceManager.iconResources[i].hTreeItem==hTreeItem){
322 if(i==0) break;
323
324 ActiveBasic::Common::ResourceItem tempItem = projectInfo.resourceManager.iconResources[i];
325 Jenga::Common::EraseVectorItem<ActiveBasic::Common::ResourceItems>( projectInfo.resourceManager.iconResources, i );
326 projectInfo.resourceManager.iconResources.insert( projectInfo.resourceManager.iconResources.begin(), tempItem );
327
328 tvItem.hItem=projectInfo.resourceManager.iconResources[1].hTreeItem;
329 tvItem.mask=TVIF_TEXT;
330 lstrcpy( temporary, projectInfo.resourceManager.iconResources[1].idName.c_str() );
331 tvItem.pszText = temporary;
332 tvItem.cchTextMax=lstrlen(temporary)+1;
333 TreeView_SetItem(hMaterialTreeView,&tvItem);
334
335 tvItem.hItem=projectInfo.resourceManager.iconResources[0].hTreeItem;
336 tvItem.mask=TVIF_TEXT;
337 sprintf(temporary,"%s (Main)",projectInfo.resourceManager.iconResources[0].idName.c_str());
338 tvItem.pszText=temporary;
339 tvItem.cchTextMax=lstrlen(temporary)+1;
340 TreeView_SetItem(hMaterialTreeView,&tvItem);
341
342 projectInfo.ModifuOfResource=1;
343 break;
344 }
345 }
346 break;
347 }
348 break;
349 case WM_TIMER:
350 KillTimer(hwnd,wParam);
351
352 //フォーカスをエディタにセット
353 SetFocus(GetWindow(GetWindow(hClient,GW_CHILD),GW_CHILD));
354 break;
355 case WM_NOTIFY:
356 NMHDR *hdr;
357 hdr=(NMHDR *)lParam;
358 if(hdr->code==NM_DBLCLK){
359 if(hdr->hwndFrom==hProcedureTreeView) SendMessage(hwnd,WM_COMMAND,IDM_PROCEDURETREE_SHOW,0);
360 else if(hdr->hwndFrom==hMaterialTreeView) SendMessage(hwnd,WM_COMMAND,IDM_MATERIALTREE_OPEN,0);
361 }
362 if(hdr->code==TVN_ITEMEXPANDEDW||hdr->code==TVN_ITEMEXPANDED){
363 NMTREEVIEW *nmTreeView;
364 TVITEM tvItem;
365 nmTreeView=(NMTREEVIEW *)lParam;
366 tvItem.mask=TVIF_HANDLE|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
367 tvItem.hItem=nmTreeView->itemNew.hItem;
368 TreeView_GetItem(nmTreeView->hdr.hwndFrom,&tvItem);
369 if(tvItem.iImage==0||tvItem.iImage==1){
370 if(nmTreeView->action==TVE_EXPAND){
371 tvItem.iImage=1;
372 tvItem.iSelectedImage=1;
373 }
374 else if(nmTreeView->action==TVE_COLLAPSE){
375 tvItem.iImage=0;
376 tvItem.iSelectedImage=0;
377 }
378 tvItem.hItem=nmTreeView->itemNew.hItem;
379 TreeView_SetItem(nmTreeView->hdr.hwndFrom,&tvItem);
380 }
381 }
382 break;
383 }
384 return CallWindowProc(OldTabProc,hwnd,message,wParam,lParam);
385}
386void ResizeProjectView_ToolWindow(void){
387 extern HWND hProjectView_ToolWindow;
388 RECT rect;
389 GetClientRect(hProjectView_ToolWindow,&rect);
390 SendMessage(hProjectView_ToolWindow,WM_SIZE,0,MAKELONG(rect.right,rect.bottom));
391}
392LRESULT CALLBACK ProjectView_ToolWindowProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
393 extern HWND hProjectView;
394 switch(message){
395 case WM_SIZE:
396 MoveWindow(hProjectView,0,0,
397 LOWORD(lParam),
398 HIWORD(lParam),1);
399 return 0;
400 case WM_CLOSE:
401 SendMessage(hOwner,WM_COMMAND,IDM_PROJECTVIEW,0);
402 return 0;
403 }
404 return DefWindowProc(hwnd,message,wParam,lParam);
405}
406void ShowFileView(){
407 TabCtrl_SetCurSel(hProjectViewTab,0);
408 pobj_FileTree->ShowWindow( SW_SHOW );
409 ShowWindow(hProcedureTreeView,SW_HIDE);
410 ShowWindow(hMaterialTreeView,SW_HIDE);
411}
412void ShowClassView(){
413 TabCtrl_SetCurSel(hProjectViewTab,1);
414 pobj_FileTree->ShowWindow( SW_HIDE );
415 ShowWindow(hMaterialTreeView,SW_HIDE);
416 ShowWindow(hProcedureTreeView,SW_SHOW);
417}
418void ShowMaterialView(){
419 TabCtrl_SetCurSel(hProjectViewTab,2);
420 pobj_FileTree->ShowWindow( SW_HIDE );
421 ShowWindow(hProcedureTreeView,SW_HIDE);
422 ShowWindow(hMaterialTreeView,SW_SHOW);
423}
424LRESULT CALLBACK ProjectViewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
425 extern HINSTANCE hInst,hResInst;
426 extern HWND hTabOfProjectView;
427 extern HFONT hStatusFont;
428 extern HWND hProjectView_ToolWindow;
429 RECT rect;
430 HWND hButton;
431
432 switch(message){
433 case WM_CREATE:
434 hProjectViewTab=CreateWindow(WC_TABCONTROL,NULL,
435 WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
436 0,0,0,0,hwnd,0,hInst,0);
437 SendMessage(hProjectViewTab,WM_SETFONT,(long)hStatusFont,0);
438
439 hButton=CreateWindow("BUTTON","↓",WS_CHILD|WS_VISIBLE,
440 0,0,30,13,
441 hwnd,(HMENU)IDC_CLIP,hInst,0);
442 SendMessage(hButton,WM_SETFONT,(long)hStatusFont,0);
443
444 OldTabProc=(WNDPROC)GetWindowLongPtr(hProjectViewTab,GWLP_WNDPROC);
445 SetWindowLongPtr(hProjectViewTab,GWLP_WNDPROC,(long)TabProc);
446
447 //タブを設定
448 TC_ITEM tcItem;
449 tcItem.mask=TCIF_TEXT;
450 tcItem.pszText="File";
451 TabCtrl_InsertItem(hProjectViewTab,0,&tcItem);
452 tcItem.mask=TCIF_TEXT;
453 tcItem.pszText="Class";
454 TabCtrl_InsertItem(hProjectViewTab,1,&tcItem);
455 tcItem.mask=TCIF_TEXT;
456 tcItem.pszText="Material";
457 TabCtrl_InsertItem(hProjectViewTab,2,&tcItem);
458
459 //ファイルツリービューを作成
460 pobj_FileTree = new FileListTreeViewCtrl( hProjectViewTab );
461
462 //クラスツリービューを作成
463 hProcedureTreeView=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
464 WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
465 0,0,0,0,
466 hProjectViewTab,0,hInst,0);
467 OldProcedureTreeViewProc=(WNDPROC)GetWindowLongPtr(hProcedureTreeView,GWLP_WNDPROC);
468 SetWindowLongPtr(hProcedureTreeView,GWLP_WNDPROC,(long)ProcedureTreeViewProc);
469 //イメージリスト読み込み、設定
470 hProcedureTreeViewImageList=ImageList_Create(16,16,ILC_COLOR24|ILC_MASK,8,0);
471 ImageList_AddIcon(hProcedureTreeViewImageList, ActiveBasic::Resource::LoadIconAlt(hResInst, IDI_FOLDER_CLOSE));
472 ImageList_AddIcon(hProcedureTreeViewImageList, ActiveBasic::Resource::LoadIconAlt(hResInst, IDI_FOLDER_OPEN));
473 ImageList_AddIcon(hProcedureTreeViewImageList, ActiveBasic::Resource::LoadIconAlt(hResInst, IDI_PROCEDURE));
474 ImageList_AddIcon(hProcedureTreeViewImageList, ActiveBasic::Resource::LoadIconAlt(hResInst, IDI_PROGRAM_FOLDER));
475 ImageList_AddIcon(hProcedureTreeViewImageList, ActiveBasic::Resource::LoadIconAlt(hResInst, IDI_MEMBER_PUBLIC_VARIABLE));
476 ImageList_AddIcon(hProcedureTreeViewImageList, ActiveBasic::Resource::LoadIconAlt(hResInst, IDI_MEMBER_PUBLIC_FUNCTION));
477 ImageList_AddIcon(hProcedureTreeViewImageList, ActiveBasic::Resource::LoadIconAlt(hResInst, IDI_MEMBER_PRIVATE_VARIABLE));
478 ImageList_AddIcon(hProcedureTreeViewImageList, ActiveBasic::Resource::LoadIconAlt(hResInst, IDI_MEMBER_PRIVATE_FUNCTION));
479 TreeView_SetImageList(hProcedureTreeView,hProcedureTreeViewImageList,TVSIL_NORMAL);
480
481 //マテリアルツリービューを作成
482 hMaterialTreeView=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
483 WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
484 0,0,0,0,
485 hProjectViewTab,0,hInst,0);
486 OldMaterialTreeViewProc=(WNDPROC)GetWindowLongPtr(hMaterialTreeView,GWLP_WNDPROC);
487 SetWindowLongPtr(hMaterialTreeView,GWLP_WNDPROC,(long)MaterialTreeViewProc);
488 //イメージリスト読み込み、設定
489 hMaterialTreeViewImageList=ImageList_Create(16,16,ILC_COLOR24|ILC_MASK,3,0);
490 ImageList_AddIcon(hMaterialTreeViewImageList, ActiveBasic::Resource::LoadIconAlt(hResInst, IDI_FOLDER_CLOSE));
491 ImageList_AddIcon(hMaterialTreeViewImageList, ActiveBasic::Resource::LoadIconAlt(hResInst, IDI_FOLDER_OPEN));
492 ImageList_AddIcon(hMaterialTreeViewImageList, ActiveBasic::Resource::LoadIconAlt(hResInst, IDI_WINDOW));
493 ImageList_AddIcon(hMaterialTreeViewImageList, ActiveBasic::Resource::LoadIconAlt(hResInst, IDI_MENU));
494 ImageList_AddIcon(hMaterialTreeViewImageList, ActiveBasic::Resource::LoadIconAlt(hResInst, IDI_FILE_ICON));
495 ImageList_AddIcon(hMaterialTreeViewImageList, ActiveBasic::Resource::LoadIconAlt(hResInst, IDI_FILE_BMP));
496 ImageList_AddIcon(hMaterialTreeViewImageList, ActiveBasic::Resource::LoadIconAlt(hResInst, IDI_FILE_CURSOR));
497 TreeView_SetImageList(hMaterialTreeView,hMaterialTreeViewImageList,TVSIL_NORMAL);
498
499 pobj_FileTree->ShowWindow( SW_SHOW );
500 GetClientRect(hwnd,&rect);
501 SendMessage(hwnd,WM_SIZE,0,MAKELONG(rect.right,rect.bottom));
502 return 0;
503 case WM_COMMAND:
504 switch(LOWORD(wParam)){
505 case IDC_CLIP:
506 if(pobj_nv->bClipProjectView==0){
507 pobj_nv->bClipProjectView=1;
508
509 SetWindowLongPtr(hwnd,GWL_EXSTYLE,WS_EX_STATICEDGE);
510 SetParent(hwnd,hOwner);
511 ActiveBasic::IDE::Program::mainFrame.Resized();
512
513 ShowWindow(hProjectView_ToolWindow,SW_HIDE);
514 }
515 else{
516 pobj_nv->bClipProjectView=0;
517
518 SetWindowLongPtr(hwnd,GWL_EXSTYLE,0);
519
520 SetParent(hwnd,hProjectView_ToolWindow);
521
522 ActiveBasic::IDE::Program::mainFrame.Resized();
523 ResizeProjectView_ToolWindow();
524
525 ShowWindow(hProjectView_ToolWindow,SW_SHOW);
526 }
527 return 0;
528 }
529 break;
530 case WM_NOTIFY:
531 NMHDR *hdr;
532 hdr=(NMHDR *)lParam;
533 if(hdr->hwndFrom==hProjectViewTab&&hdr->code==TCN_SELCHANGE){
534 switch( TabCtrl_GetCurSel(hProjectViewTab) ){
535 case 0:
536 ShowFileView();
537 break;
538 case 1:
539 ShowClassView();
540 break;
541 case 2:
542 ShowMaterialView();
543 break;
544 }
545 }
546 return 0;
547 case WM_PAINT:
548 PAINTSTRUCT ps;
549 HDC hdc;
550 HFONT hOldFont;
551 SIZE size;
552 HBRUSH hBrush,hOldBrush;
553 HPEN hPen,hOldPen;
554 char temporary[MAX_PATH];
555
556 if(pobj_nv->bClipProjectView==0) break;
557
558 hBrush=CreateSolidBrush(GetSysColor(COLOR_3DSHADOW));
559 hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DSHADOW));
560
561 hdc=BeginPaint(hwnd,&ps);
562
563 hOldFont=(HFONT)SelectObject(hdc,hStatusFont);
564 if( projectInfo.IsOpened() ){
565 sprintf(temporary,"%s \'%s\'",STRING_PROJECT,projectInfo.GetName().c_str());
566 }
567 else{
568 lstrcpy( temporary, "現在のドキュメント" );
569 }
570
571 GetTextExtentPoint32(hdc,temporary,lstrlen(temporary),&size);
572 GetClientRect(hwnd,&rect);
573 rect.left++;
574 rect.top++;
575 rect.right--;
576 rect.bottom=size.cy+2;
577
578 hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
579 hOldPen=(HPEN)SelectObject(hdc,hPen);
580 Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom);
581 SelectObject(hdc,hOldBrush);
582 SelectObject(hdc,hPen);
583
584 rect.top++;
585 rect.bottom--;
586 SetBkMode(hdc,OPAQUE);
587 SetBkColor(hdc,GetSysColor(COLOR_3DSHADOW));
588 SetTextColor(hdc,GetSysColor(COLOR_3DHILIGHT));
589 DrawText(hdc,temporary,lstrlen(temporary),&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
590
591 EndPaint(hwnd,&ps);
592
593 DeleteObject(hBrush);
594 DeleteObject(hPen);
595 return 0;
596 case WM_SIZE:
597 if(pobj_nv->bClipProjectView){
598 MoveWindow(hProjectViewTab,
599 LEVER_THICK,
600 LEVER_THICK+11,
601 LOWORD(lParam)-LEVER_THICK*2,
602 HIWORD(lParam)-LEVER_THICK*2-21,1);
603
604 GetClientRect(hProjectViewTab,&rect);
605 TabCtrl_AdjustRect(hProjectViewTab,FALSE,&rect);
606 rect.left-=2;
607 rect.right++;
608 rect.bottom++;
609
610 pobj_FileTree->MoveWindow(rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top);
611 MoveWindow(hProcedureTreeView,
612 rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
613 MoveWindow(hMaterialTreeView,
614 rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
615
616 GetClientRect(GetDlgItem(hwnd,IDC_CLIP),&rect);
617 MoveWindow(GetDlgItem(hwnd,IDC_CLIP),LOWORD(lParam)-rect.right,HIWORD(lParam)-rect.bottom,rect.right,rect.bottom,1);
618 InvalidateRect(GetDlgItem(hwnd,IDC_CLIP),NULL,0);
619 }
620 else{
621 MoveWindow(hProjectViewTab,0,0,
622 LOWORD(lParam),
623 HIWORD(lParam)-15,1);
624
625 GetClientRect(hProjectViewTab,&rect);
626 TabCtrl_AdjustRect(hProjectViewTab,FALSE,&rect);
627
628 pobj_FileTree->MoveWindow(rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top);
629 MoveWindow(hProcedureTreeView,
630 rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
631 MoveWindow(hMaterialTreeView,
632 rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
633
634 GetClientRect(GetDlgItem(hwnd,IDC_CLIP),&rect);
635 MoveWindow(GetDlgItem(hwnd,IDC_CLIP),LOWORD(lParam)-rect.right,HIWORD(lParam)-rect.bottom,rect.right,rect.bottom,1);
636 }
637 return 0;
638 case WM_CLOSE:
639 SendMessage(hOwner,WM_COMMAND,IDM_PROJECTVIEW,0);
640 return 0;
641 case WM_DESTROY:
642 delete pobj_FileTree;
643 ImageList_Destroy(hProcedureTreeViewImageList);
644 ImageList_Destroy(hMaterialTreeViewImageList);
645 return 0;
646 }
647 return DefWindowProc(hwnd,message,wParam,lParam);
648}
649
650void Project_File_Insert(char *path){
651 extern HANDLE hHeap;
652 char temporary[MAX_PATH],temp2[MAX_PATH];
653
654 lstrcpy( path, projectInfo.GetWorkDir().GetRelationalPath( path ).c_str() );
655
656 //重複チェック
657 if( projectInfo.fileSystem.root.IsExistFile( path ) )
658 {
659 //"\"%s\" ファイルは既にプロジェクト内に存在します。"
660 sprintf(temporary,STRING_DUPLICATIONERROR_FILE_IN_PROJECT,path);
661 MessageBox(hOwner,temporary,APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
662 return;
663 }
664
665
666 //////////////////////
667 //ツリービューに追加
668 HTREEITEM hTreeItem;
669 _splitpath(path,0,0,temporary,temp2);
670 lstrcat(temporary,temp2);
671 hTreeItem=pobj_FileTree->Insert( temporary );
672
673
674 //projectInfo.ppobj_DBFileInfoオブジェクトに追加
675 projectInfo.fileSystem.root.files.push_back( ActiveBasic::PM::FM::File( path, hTreeItem ) );
676
677
678 projectInfo.modify=1;
679
680 //ファイル操作によるクラスビューの再表示
681 ResetClassTree((HTREEITEM)-1);
682}
683void Project_File_Delete(HTREEITEM hTreeItem){
684 extern HANDLE hHeap;
685
686 /*if(projectInfo.pobj_DBFileInfo->IsMainFile(hTreeItem)){
687 //"このファイルはプロジェクトのメイン ファイルです。プロジェクト内から削除することはできません。"
688 MessageBox(hOwner,STRING_ERROR_CANT_MAINFILE,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
689 return;
690 }*/
691
692 //ツリービューから削除
693 pobj_FileTree->DeleteItem( hTreeItem );
694
695 // オブジェクトから削除
696 projectInfo.fileSystem.root.Remove( hTreeItem );
697
698 projectInfo.modify=1;
699
700 //ファイル操作によるクラスビューの再表示
701 ResetClassTree((HTREEITEM)-1);
702}
703
704void MakeNewProject(){
705 extern HANDLE hHeap;
706 extern NEWPROJECTINFO NewProjectInfo;
707 int i;
708 char buffer[GENERAL_SIZE],dir[MAX_PATH],temporary[MAX_PATH],*pTemp;
709 HANDLE hFind;
710 WIN32_FIND_DATA wfd;
711
712 //既にプロジェクトが開かれている場合は閉じる
713 if( projectInfo.IsOpened() ){
714 if(!projectInfo.Close()) return;
715 }
716
717 //ワークディレクトリを作成
718 i=lstrlen(pobj_nv->ProjectSaveDir);
719 if(pobj_nv->ProjectSaveDir[i-1]=='\\'&&pobj_nv->ProjectSaveDir[i-2]!=':') pobj_nv->ProjectSaveDir[i-1]=0;
720 sprintf(dir,"%s\\%s\\",pobj_nv->ProjectSaveDir,NewProjectInfo.name);
721 i=0;
722 while(!(dir[i]==':'||(dir[i-1]=='\\'&&dir[i]=='\\'))) i++;
723 if(dir[i]==':') i++;
724 else{
725 i++;
726 while(dir[i]!='\\') i++;
727 }
728 for(i++;;i++){
729 if(dir[i]=='\\'){
730 lstrcpy(temporary,dir);
731 temporary[i]=0;
732 hFind=FindFirstFile(temporary,&wfd);
733 if(hFind==INVALID_HANDLE_VALUE){
734 if(!CreateDirectory(temporary,NULL)){
735 MessageBox(hOwner,"ディレクトリを作成できませんでした",APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
736 return;
737 }
738 }
739 else FindClose(hFind);
740 }
741 if(dir[i]=='\0') break;
742 }
743
744
745 //////////////////////////////////////
746 // プロジェクトファイル(*.pj)を作成
747 //////////////////////////////////////
748
749 // 出力先拡張子
750 const std::string outputFileExt
751 = ( NewProjectInfo.dwTypeID == IDC_DLL ) ? ".dll"
752 : ( NewProjectInfo.dwTypeID == IDC_SLL ) ? ".lib"
753 : ".exe";
754
755 //先頭の注釈
756 lstrcpy(buffer,"\' ActiveBasic Project file.\r\n\r\n");
757 i=lstrlen(buffer);
758
759 //プロジェクトのフォーマットバージョン
760 sprintf(buffer+i,"#VERSION=%d\r\n\r\n",PROJECT_VERSION);
761 i+=lstrlen(buffer+i);
762
763 //モジュールタイプ(EXEならば0、DLLならば1)
764 ActiveBasic::Common::TargetModuleType::EnumType moduleType
765 = ( NewProjectInfo.dwTypeID == IDC_DLL ) ? ActiveBasic::Common::TargetModuleType::Dll
766 : ( NewProjectInfo.dwTypeID == IDC_SLL ) ? ActiveBasic::Common::TargetModuleType::Sll
767 : ActiveBasic::Common::TargetModuleType::Exe;
768 lstrcpy(buffer+i,( (std::string)"#MODULETYPE=" + Jenga::Common::ToString( static_cast<int>(moduleType) ) + "\r\n\r\n" ).c_str());
769 i+=lstrlen(buffer+i);
770
771 //プロジェクト名
772 sprintf(buffer+i,"#NAME=%s\r\n\r\n",NewProjectInfo.name);
773 i+=lstrlen(buffer+i);
774
775 lstrcpy(buffer+i,"#PLATFORM=32\r\n\r\n");
776 i+=lstrlen(buffer+i);
777
778 //RADウィンドウの数
779 if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE||
780 NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX)
781 lstrcpy(buffer+i,"#USEWINDOW=1\r\n\r\n");
782 else lstrcpy(buffer+i,"#USEWINDOW=0\r\n\r\n");
783 i+=lstrlen(buffer+i);
784
785 //プロジェクトオプション
786 sprintf(buffer+i,"#OPTION=&H%08x\r\n\r\n",NewProjectInfo.dwOption);
787 i+=lstrlen(buffer+i);
788
789 //出力先(Release)
790 sprintf(buffer+i,"#OUTPUT_RELEASE=.\\%s%s\r\n\r\n",NewProjectInfo.name, outputFileExt.c_str());
791 i+=lstrlen(buffer+i);
792
793 //出力先(Debug)
794 sprintf(buffer+i,"#OUTPUT_DEBUG=.\\%s_debug%s\r\n\r\n",NewProjectInfo.name, outputFileExt.c_str());
795 i+=lstrlen(buffer+i);
796
797 //マニフェスト
798 sprintf(buffer+i,"#MANIFEST=%s.manifest.xml\r\n\r\n",NewProjectInfo.name);
799 i+=lstrlen(buffer+i);
800
801 //デバッグ用(コマンドライン)
802 lstrcpy(buffer+i,"#DEBUG_CMD_LINE=\r\n\r\n");
803 i+=lstrlen(buffer+i);
804
805 //デバッグ用(DLL用の実行ファイル)
806 lstrcpy(buffer+i,"#DEBUG_EXE_PATH=\r\n\r\n");
807 i+=lstrlen(buffer+i);
808
809 //リソースファイル
810 lstrcpy(buffer+i,"#RESOURCE=0\r\n\r\n");
811 i+=lstrlen(buffer+i);
812
813 //ソースファイル
814 sprintf(buffer+i,"#SOURCE\r\n%s.ab\r\n",NewProjectInfo.name);
815 i+=lstrlen(buffer+i);
816 if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE||
817 NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
818 lstrcpy(buffer+i,"MainWnd.ab\r\n");
819 i+=lstrlen(buffer+i);
820 }
821 if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
822 lstrcpy(buffer+i,"dx_graphics.sbp\r\n");
823 i+=lstrlen(buffer+i);
824 lstrcpy(buffer+i,"dx_input.sbp\r\n");
825 i+=lstrlen(buffer+i);
826 lstrcpy(buffer+i,"dx_music.sbp\r\n");
827 i+=lstrlen(buffer+i);
828 }
829
830 //保存
831 sprintf(temporary,"%s%s.pj",dir,NewProjectInfo.name);
832 hFind=FindFirstFile(temporary,&wfd);
833 if(hFind!=INVALID_HANDLE_VALUE){
834 FindClose(hFind);
835
836 //"指定したディレクトリにはすでにプロジェクトが存在します。上書きしますか?"
837 if(MessageBox(hOwner,STRING_ERROR_PROJECT_OVERWRITE,APPLICATION_NAME,MB_YESNO|MB_ICONEXCLAMATION)==IDNO) return;
838 }
839 if(!WriteBuffer(temporary,buffer,i)) return;
840
841
842 ///////////////////////////////////////////
843 //メインプログラムファイル(*.ab)を作成
844 if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE){
845 sprintf(buffer,"#include \"%s.idx\"\r\n\r\n",NewProjectInfo.name);
846 i=lstrlen(buffer);
847 lstrcpy(buffer+i,"'---------------------------\r\n");
848 i+=lstrlen(buffer+i);
849 lstrcpy(buffer+i,"' Window Message Loop\r\n");
850 i+=lstrlen(buffer+i);
851 lstrcpy(buffer+i,"'---------------------------\r\n");
852 i+=lstrlen(buffer+i);
853 lstrcpy(buffer+i,"Dim msgMain As MSG, iResult As Long\r\n");
854 i+=lstrlen(buffer+i);
855 lstrcpy(buffer+i,"Do\r\n");
856 i+=lstrlen(buffer+i);
857 lstrcpy(buffer+i,"\tiResult=GetMessage(msgMain,0,0,0)\r\n");
858 i+=lstrlen(buffer+i);
859 lstrcpy(buffer+i,"\tIf iResult=0 or iResult=-1 Then Exit Do\r\n");
860 i+=lstrlen(buffer+i);
861 lstrcpy(buffer+i,"\tTranslateMessage(msgMain)\r\n");
862 i+=lstrlen(buffer+i);
863 lstrcpy(buffer+i,"\tDispatchMessage(msgMain)\r\n");
864 i+=lstrlen(buffer+i);
865 lstrcpy(buffer+i,"Loop\r\n\r\n");
866 i+=lstrlen(buffer+i);
867 lstrcpy(buffer+i,"' Call destructores and exit process\r\n");
868 i+=lstrlen(buffer+i);
869 lstrcpy(buffer+i,"End\r\n");
870 i+=lstrlen(buffer+i);
871 }
872 else if(NewProjectInfo.dwTypeID==IDC_EXE_PROMPTBASE){
873 sprintf(buffer,"#include \"%s.idx\"\r\n\r\n",NewProjectInfo.name);
874 i=lstrlen(buffer);
875 lstrcpy(buffer+i,"#N88BASIC\r\n\r\n");
876 i+=lstrlen(buffer+i);
877 lstrcpy(buffer+i,"' ↓ ここからプログラムが実行されます\r\n\r\n");
878 i+=lstrlen(buffer+i);
879 if(NewProjectInfo.ShowHelloWorld){
880 lstrcpy(buffer+i,"Print \"Hello World!\"\r\n");
881 i+=lstrlen(buffer+i);
882 }
883 }
884 else if(NewProjectInfo.dwTypeID==IDC_EXE_DOSPROMPTBASE){
885 sprintf(buffer,"#include \"%s.idx\"\r\n\r\n",NewProjectInfo.name);
886 i=lstrlen(buffer);
887 lstrcpy(buffer+i,"#console\r\n\r\n");
888 i+=lstrlen(buffer+i);
889 lstrcpy(buffer+i,"' ↓ ここからプログラムが実行されます\r\n\r\n");
890 i+=lstrlen(buffer+i);
891 if(NewProjectInfo.ShowHelloWorld){
892 lstrcpy(buffer+i,"Print \"Hello World!\"\r\n");
893 i+=lstrlen(buffer+i);
894 }
895 }
896 else if(NewProjectInfo.dwTypeID==IDC_EXE_NOBASE){
897 sprintf(buffer,"#include \"%s.idx\"\r\n\r\n",NewProjectInfo.name);
898 i=lstrlen(buffer);
899 lstrcpy(buffer+i,"' ↓ ここからプログラムが実行されます\r\n\r\n");
900 i+=lstrlen(buffer+i);
901 }
902 else if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
903 const std::string mainExeDirectXAbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dx\\main_exe_directx.abp";
904 pTemp = ReadBuffer( mainExeDirectXAbpPath );
905
906 //#name#をプロジェクト名に置換
907 pTemp=PermutationWndPgmTemplate(pTemp,NewProjectInfo.name,0,0,0);
908 }
909 else if(NewProjectInfo.dwTypeID==IDC_DLL){
910 sprintf(buffer,"#include \"%s.idx\"\r\n\r\n",NewProjectInfo.name);
911 i=lstrlen(buffer);
912 lstrcpy(buffer+i,"'-------------------------------------------------------------------\r\n");
913 i+=lstrlen(buffer+i);
914 lstrcpy(buffer+i,"' メモ - このファイルには、DLLの構成要素を記述します。\r\n");
915 i+=lstrlen(buffer+i);
916 lstrcpy(buffer+i,"' (例:関数定義、グローバル変数、定数定義など)\r\n");
917 i+=lstrlen(buffer+i);
918 lstrcpy(buffer+i,"'\r\n");
919 i+=lstrlen(buffer+i);
920 lstrcpy(buffer+i,"' エクスポートが必要な関数には、\"Export\" 修飾子を指定します。\r\n");
921 i+=lstrlen(buffer+i);
922 lstrcpy(buffer+i,"' (例:Function Export FuncName() As Long)\r\n");
923 i+=lstrlen(buffer+i);
924 lstrcpy(buffer+i,"'-------------------------------------------------------------------\r\n");
925 i+=lstrlen(buffer+i);
926 lstrcpy(buffer+i,"\r\n");
927 i+=lstrlen(buffer+i);
928 lstrcpy(buffer+i,"Function Export DllMain(hinstDLL As HINSTANCE, fdwReason As DWord, lpvReserved As VoidPtr) As Long\r\n");
929 i+=lstrlen(buffer+i);
930 lstrcpy(buffer+i,"\t'DLLエントリポイント\r\n");
931 i+=lstrlen(buffer+i);
932 lstrcpy(buffer+i,"\tSelect Case fdwReason\r\n");
933 i+=lstrlen(buffer+i);
934 lstrcpy(buffer+i,"\t\tCase DLL_PROCESS_ATTACH\r\n");
935 i+=lstrlen(buffer+i);
936 lstrcpy(buffer+i,"\t\t\t'DLLがプロセス空間にロードされた時に実行されます。\r\n");
937 i+=lstrlen(buffer+i);
938 lstrcpy(buffer+i,"\t\t\t_System_StartupProgram()\r\n");
939 i+=lstrlen(buffer+i);
940 lstrcpy(buffer+i,"\t\t\tDllMain=1\r\n");
941 i+=lstrlen(buffer+i);
942 lstrcpy(buffer+i,"\t\tCase DLL_PROCESS_DETACH\r\n");
943 i+=lstrlen(buffer+i);
944 lstrcpy(buffer+i,"\t\t\t_System_Call_Destructor_of_GlobalObject()\r\n");
945 i+=lstrlen(buffer+i);
946 lstrcpy(buffer+i,"\tEnd Select\r\n");
947 i+=lstrlen(buffer+i);
948 lstrcpy(buffer+i,"End Function\r\n");
949 i+=lstrlen(buffer+i);
950 lstrcpy(buffer+i,"\r\n");
951 i+=lstrlen(buffer+i);
952 }
953 else if( NewProjectInfo.dwTypeID == IDC_SLL )
954 {
955 buffer[0] = 0;
956 }
957
958 //保存
959 if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
960 sprintf(temporary,"%s%s.ab",dir,NewProjectInfo.name);
961 WriteBuffer(temporary,pTemp,lstrlen(pTemp));
962
963 HeapDefaultFree(pTemp);
964 }
965 else{
966 sprintf(temporary,"%s%s.ab",dir,NewProjectInfo.name);
967 if(!WriteBuffer(temporary,buffer,lstrlen(buffer))) return;
968 }
969
970
971 /////////////////////
972 // MainWnd.abを作成
973 /////////////////////
974
975 std::string mainWndSbpPath = "";
976 if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE)
977 {
978 mainWndSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\MainWnd_exe_windowbase.sbp";
979 }
980 else if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX)
981 {
982 mainWndSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\MainWnd_exe_directx.sbp";
983 }
984
985 if( !mainWndSbpPath.empty() ){
986 pTemp = ReadBuffer( mainWndSbpPath );
987
988 //#name#をプロジェクト名に置換
989 pTemp=PermutationWndPgmTemplate(pTemp,
990 NewProjectInfo.name,
991 "MainWnd",
992 "hMainWnd",
993 "MainWndProc");
994
995 if(NewProjectInfo.ShowHelloWorld){
996 //Hello World!表示
997 i=0;
998 lstrcpy(buffer+i,"\r\nSub MainWnd_Paint(hDC As HDC)\r\n");
999 i+=lstrlen(buffer+i);
1000 lstrcpy(buffer+i,"\tDim rect As RECT\r\n");
1001 i+=lstrlen(buffer+i);
1002 lstrcpy(buffer+i,"\tGetClientRect(hMainWnd,rect)\r\n");
1003 i+=lstrlen(buffer+i);
1004 lstrcpy(buffer+i,"\tDrawText(hDC,\"Hello World!\",-1,rect,DT_CENTER or DT_VCENTER or DT_SINGLELINE)\r\n");
1005 i+=lstrlen(buffer+i);
1006 lstrcpy(buffer+i,"End Sub\r\n");
1007 i+=lstrlen(buffer+i);
1008
1009 pTemp=(char *)HeapReAlloc(hHeap,0,pTemp,lstrlen(pTemp)+lstrlen(buffer)+1);
1010 lstrcat(pTemp,buffer);
1011 }
1012
1013 sprintf(temporary,"%sMainWnd.ab",dir,NewProjectInfo.name);
1014 WriteBuffer(temporary,pTemp,lstrlen(pTemp));
1015
1016 HeapDefaultFree(pTemp);
1017 }
1018
1019
1020 if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
1021 ///////////////////////////
1022 // DirextX対応アプリのとき
1023 ///////////////////////////
1024
1025 //dx_graphics.sbpをコピー
1026 const std::string dxGraphicsSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dx\\dx_graphics.sbp";
1027 pTemp = ReadBuffer( dxGraphicsSbpPath );
1028 sprintf(temporary,"%sdx_graphics.sbp",dir,NewProjectInfo.name);
1029 WriteBuffer(temporary,pTemp,lstrlen(pTemp));
1030 HeapDefaultFree(pTemp);
1031
1032 //dx_input.sbpをコピー
1033 const std::string dxInputSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dx\\dx_input.sbp";
1034 pTemp = ReadBuffer( dxInputSbpPath );
1035 sprintf(temporary,"%sdx_input.sbp",dir,NewProjectInfo.name);
1036 WriteBuffer(temporary,pTemp,lstrlen(pTemp));
1037 HeapDefaultFree(pTemp);
1038
1039 //dx_music.sbpをコピー
1040 const std::string dxMusicSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dx\\dx_music.sbp";
1041 pTemp = ReadBuffer( dxMusicSbpPath );
1042 sprintf(temporary,"%sdx_music.sbp",dir,NewProjectInfo.name);
1043 WriteBuffer(temporary,pTemp,lstrlen(pTemp));
1044 HeapDefaultFree(pTemp);
1045
1046 //dx9abm.dllをコピー
1047 sprintf(temporary,"%sRuntime\\dx9abm.dll",pj_editor_Dir);
1048 sprintf(buffer,"%sdx9abm.dll",dir,NewProjectInfo.name);
1049 CopyFile(temporary,buffer,0);
1050 }
1051
1052
1053 if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE||
1054 NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
1055 /////////////////////////////////////////
1056 // ウィンドウ定義ファイル(*.wnd)を作成
1057 /////////////////////////////////////////
1058 ActiveBasic::PM::WindowInfos windowInfos;
1059 windowInfos.push_back( new ActiveBasic::PM::WindowInfo() );
1060 windowInfos.back()->SetName( "MainWnd" );
1061 windowInfos.back()->pos.x=CW_USEDEFAULT;
1062 windowInfos.back()->pos.y=CW_USEDEFAULT;
1063 windowInfos.back()->size.cx=480;
1064 windowInfos.back()->size.cy=360;
1065 windowInfos.back()->SetCaption( NewProjectInfo.name );
1066 if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE)
1067 {
1068 windowInfos.back()->SetStyle( WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_VISIBLE );
1069 }
1070 else if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX)
1071 {
1072 windowInfos.back()->SetStyle( WS_OVERLAPPED|WS_THICKFRAME|WS_SYSMENU );
1073 }
1074 windowInfos.back()->SetExStyle( 0 );
1075 windowInfos.back()->SetMenuIdName( "" );
1076 windowInfos.back()->SetBackgroundColor( COLOR_3DFACE );
1077 GetDefaultWindowFont(&windowInfos.back()->LogFont);
1078 windowInfos.back()->SetIconResourceName( "" );
1079 windowInfos.back()->SetClassName( "NORMAL" );
1080 windowInfos.back()->SetType( ActiveBasic::PM::WindowType::Default );
1081 sprintf(temporary,"%s%s.wnd",dir,NewProjectInfo.name);
1082
1083 projectInfo.NumberOfMenu=0;
1084 SaveWindowFile( temporary, windowInfos );
1085
1086 windowInfos.Clear();
1087 }
1088
1089
1090 ////////////////////////
1091 // ワークファイルを作成
1092 ////////////////////////
1093 lstrcpy(buffer,"case4\r\n\r\n");
1094 if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE){
1095 lstrcat(buffer,"rad,MainWnd\r\n\r\n");
1096 }
1097 else{
1098 sprintf(buffer+lstrlen(buffer),"text,\"%s.ab\",0,0,0,0\r\n\r\n",NewProjectInfo.name);
1099 }
1100 lstrcat(buffer,"0\r\n0\r\n0\r\n0,0");
1101 //保存
1102 sprintf(temporary,"%s%s.wrk",dir,NewProjectInfo.name);
1103 if(!WriteBuffer(temporary,buffer,lstrlen(buffer))) return;
1104
1105
1106 //マニフェストを作成
1107 char temp2[MAX_PATH];
1108 const std::string manifestTempXmlPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\manifest_temp.xml";
1109 sprintf(temp2,"%s%s.manifest.xml",dir,NewProjectInfo.name);
1110 CopyFile( manifestTempXmlPath.c_str(), temp2, 0 );
1111
1112
1113 sprintf(temporary,"%s%s.pj",dir,NewProjectInfo.name);
1114 projectInfo.Load(temporary);
1115 projectInfo.Save();
1116}
1117void SetTreeViewForProjectInfo(){
1118 extern HANDLE hHeap;
1119 extern HWND hProjectView;
1120 int i;
1121 char temporary[MAX_PATH];
1122 TV_INSERTSTRUCT tv;
1123
1124 sprintf(temporary,"%s ",projectInfo.GetName().c_str());
1125 lstrcat(temporary,STRING_PROJECT);
1126 SetWindowText(hProjectView,temporary);
1127
1128 tv.hInsertAfter=TVI_SORT;
1129 tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
1130
1131 //ファイル ツリー
1132 pobj_FileTree->Reset( projectInfo.fileSystem );
1133
1134 //関数ツリー
1135 ResetClassTree((HTREEITEM)-1);
1136
1137 /////////////////////
1138 // マテリアル ツリー
1139
1140 //Cursorリソース フォルダ
1141 sprintf(temporary,"Cursor %s",STRING_RESOURCE);
1142 tv.hParent=TVI_ROOT;
1143 tv.item.iImage=0;
1144 tv.item.iSelectedImage=0;
1145 tv.item.pszText=temporary;
1146 tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1147 hCursorTreeItemForProjectView = tv.hParent;
1148 BOOST_FOREACH( ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.cursorResources )
1149 {
1150 tv.item.iImage=6;
1151 tv.item.iSelectedImage=6;
1152 lstrcpy( temporary, resourceItem.idName.c_str() );
1153 tv.item.pszText=temporary;
1154 resourceItem.hTreeItem = TreeView_InsertItem(hMaterialTreeView,&tv);
1155 }
1156
1157 //Bitmapリソース フォルダ
1158 sprintf(temporary,"Bitmap %s",STRING_RESOURCE);
1159 tv.hParent=TVI_ROOT;
1160 tv.item.iImage=0;
1161 tv.item.iSelectedImage=0;
1162 tv.item.pszText=temporary;
1163 tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1164 hBitmapTreeItemForProjectView = tv.hParent;
1165 BOOST_FOREACH( ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.bitmapResources )
1166 {
1167 tv.item.iImage=5;
1168 tv.item.iSelectedImage=5;
1169 lstrcpy( temporary, resourceItem.idName.c_str() );
1170 tv.item.pszText=temporary;
1171 resourceItem.hTreeItem = TreeView_InsertItem(hMaterialTreeView,&tv);
1172 }
1173
1174 //Iconリソース フォルダ
1175 sprintf(temporary,"Icon %s",STRING_RESOURCE);
1176 tv.hParent=TVI_ROOT;
1177 tv.item.iImage=0;
1178 tv.item.iSelectedImage=0;
1179 tv.item.pszText=temporary;
1180 tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1181 hIconTreeItemForProjectView = tv.hParent;
1182 for(i=0;i<static_cast<int>(projectInfo.resourceManager.iconResources.size());i++){
1183 tv.item.iImage=4;
1184 tv.item.iSelectedImage=4;
1185 if(i==0){
1186 sprintf(temporary,"%s (Main)",projectInfo.resourceManager.iconResources[i].idName.c_str());
1187 }
1188 else
1189 {
1190 sprintf(temporary,"%s",projectInfo.resourceManager.iconResources[i].idName.c_str());
1191 }
1192 tv.item.pszText=temporary;
1193 projectInfo.resourceManager.iconResources[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1194 }
1195
1196 //Menuフォルダ
1197 tv.hParent=TVI_ROOT;
1198 tv.item.iImage=0;
1199 tv.item.iSelectedImage=0;
1200 tv.item.pszText="Menu";
1201 tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1202 projectInfo.hMenuTreeItem=tv.hParent;
1203 for(i=0;i<projectInfo.NumberOfMenu;i++){
1204 tv.item.iImage=3;
1205 tv.item.iSelectedImage=3;
1206 tv.item.pszText=projectInfo.pMenuInfo[i].IdName;
1207 projectInfo.pMenuInfo[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1208 }
1209
1210 //Windowフォルダ
1211 tv.hParent=TVI_ROOT;
1212 tv.item.iImage=0;
1213 tv.item.iSelectedImage=0;
1214 tv.item.pszText="Window";
1215 tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
1216 projectInfo.hWindowTreeItem=tv.hParent;
1217 BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
1218 {
1219 tv.item.iImage=2;
1220 tv.item.iSelectedImage=2;
1221 char temporary[1024];
1222 lstrcpy( temporary, pWindowInfo->GetName().c_str() );
1223 tv.item.pszText = temporary;
1224 pWindowInfo->hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
1225 }
1226}
1227void OpenWorkfile( const std::string &path )
1228{
1229 extern HANDLE hHeap;
1230 int i,i2,i3;
1231 char *buffer,temporary[MAX_PATH],temp2[MAX_PATH];
1232
1233 //プロジェクト ビューを設定、表示
1234 extern HWND hProjectView;
1235 SetTreeViewForProjectInfo();
1236 if(!IsWindowVisible(hProjectView)) SendMessage(hOwner,WM_COMMAND,IDM_PROJECTVIEW,0);
1237
1238
1239 //メニュー状態を設定
1240 ResetState_DocMenu();
1241
1242
1243 //////////////////////////////////////////
1244 //ワークファイル(*.wrk)をオープン
1245 HTREEITEM hTreeItem;
1246 HANDLE hFind;
1247 WIN32_FIND_DATA wfd;
1248 HWND hChild;
1249 int WndNum;
1250 hFind=FindFirstFile(path.c_str(),&wfd);
1251 if(hFind!=INVALID_HANDLE_VALUE){
1252 FindClose(hFind);
1253 buffer=ReadBuffer(path);
1254 if(!buffer) return;
1255
1256 //解析、反映
1257 memcpy(temporary,buffer,5);
1258 temporary[5]=0;
1259 if(lstrcmp(temporary,"case4")==0){
1260
1261 LockWindowUpdate(hOwner);
1262 for(i=9,i2=0;;i++,i2++){
1263 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1264 if(i2!=0){
1265 temporary[i2]=0;
1266 for(i3=0;;i3++){
1267 if(temporary[i3]==','||temporary[i3]=='\0') break;
1268 }
1269 if(temporary[i3]=='\0') goto EndToSetWorkFile;
1270 lstrcpy(temp2,temporary+i3+1);
1271 temporary[i3]=0;
1272 if(lstrcmpi(temporary,"text")==0){
1273 if(temp2[0]!='\"') goto EndToSetWorkFile;
1274
1275 //ファイルを開く
1276 i2=1;
1277 for(i3=0;;i2++,i3++){
1278 if(temp2[i2]=='\"'||temp2[i2]=='\0'){
1279 temporary[i3]=0;
1280 break;
1281 }
1282 temporary[i3]=temp2[i2];
1283 }
1284 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1285 hChild=OpenFileWithExtension(temporary);
1286 WndNum=GetWndNum(hChild);
1287 if(WndNum==-1){
1288 goto EndToSetWorkFile;
1289 }
1290
1291 //ResetScrollbarが再描画時に呼び出されるので、再描画する
1292 InvalidateRect(MdiInfo[WndNum]->pMdiTextEdit->hEdit,NULL,0);
1293 UpdateWindow(MdiInfo[WndNum]->pMdiTextEdit->hEdit);
1294
1295 if(temp2[i2]=='\0') goto EndToSetWorkFile;
1296 if(temp2[i2+1]!=',') goto EndToSetWorkFile;
1297
1298 //以前のスクロール位置を復元
1299 SCROLLINFO si;
1300 POINT pos;
1301 for(i2+=2,i3=0;;i2++,i3++){
1302 if(temp2[i2]==','||temp2[i2]=='\0'){
1303 temporary[i3]=0;
1304 break;
1305 }
1306 temporary[i3]=temp2[i2];
1307 }
1308 sscanf(temporary,"%d",&pos.x);
1309 if(temp2[i2]=='\0') goto EndToSetWorkFile;
1310 for(i2++,i3=0;;i2++,i3++){
1311 if(temp2[i2]==','||temp2[i2]=='\0'){
1312 temporary[i3]=0;
1313 break;
1314 }
1315 temporary[i3]=temp2[i2];
1316 }
1317 sscanf(temporary,"%d",&pos.y);
1318 si.cbSize=sizeof(SCROLLINFO);
1319 si.fMask=SIF_POS;
1320 si.nPos=pos.x;
1321 SetScrollInfo(MdiInfo[WndNum]->pMdiTextEdit->hEdit,SB_HORZ,&si,1);
1322 si.nPos=pos.y;
1323 SetScrollInfo(MdiInfo[WndNum]->pMdiTextEdit->hEdit,SB_VERT,&si,1);
1324
1325 if(temp2[i2]=='\0') goto EndToSetWorkFile;
1326
1327 //キャレット位置をセット
1328 for(i2++,i3=0;;i2++,i3++){
1329 if(temp2[i2]==','||temp2[i2]=='\0'){
1330 temporary[i3]=0;
1331 break;
1332 }
1333 temporary[i3]=temp2[i2];
1334 }
1335 sscanf(temporary,"%d",&pos.x);
1336 if(temp2[i2]=='\0') goto EndToSetWorkFile;
1337 for(i2++,i3=0;;i2++,i3++){
1338 if(temp2[i2]==','||temp2[i2]=='\0'){
1339 temporary[i3]=0;
1340 break;
1341 }
1342 temporary[i3]=temp2[i2];
1343 }
1344 sscanf(temporary,"%d",&pos.y);
1345 TextEdit_SetSel(WndNum,pos.x,pos.y);
1346 }
1347 else if(lstrcmpi(temporary,"rad")==0){
1348 for(i3=0;i3<static_cast<int>(projectInfo.windowInfos.size());i3++){
1349 if(lstrcmpi(projectInfo.windowInfos[i3]->GetName().c_str(),temp2)==0){
1350 NewRadWindow( *projectInfo.windowInfos[i3] );
1351 break;
1352 }
1353 }
1354 }
1355 else if(lstrcmpi(temporary,"menu")==0){
1356 for(i3=0;i3<projectInfo.NumberOfMenu;i3++){
1357 if(lstrcmpi(projectInfo.pMenuInfo[i3].IdName,temp2)==0){
1358 NewMenuWindow(&projectInfo.pMenuInfo[i3]);
1359 break;
1360 }
1361 }
1362 }
1363 else if(lstrcmpi(temporary,"icon")==0)
1364 {
1365 BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
1366 {
1367 if(lstrcmpi(resourceItem.filepath.c_str(),temp2)==0){
1368 NewIconEditWindow( projectInfo.GetWorkDir().GetFullPath( temp2 ).c_str() );
1369 break;
1370 }
1371 }
1372 }
1373 i++;
1374 i2=-1;
1375 continue;
1376 }
1377 else break;
1378 }
1379 temporary[i2]=buffer[i];
1380 }
1381
1382 for(i+=2,i2=0;;i++,i2++){
1383 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1384 temporary[i2]=0;
1385 break;
1386 }
1387 temporary[i2]=buffer[i];
1388 }
1389 sscanf(temporary,"%d",&i2);
1390
1391 switch( i2 ){
1392 case 0:
1393 ShowFileView();
1394 break;
1395 case 1:
1396 ShowClassView();
1397 break;
1398 case 2:
1399 ShowMaterialView();
1400 break;
1401 }
1402
1403 if(buffer[i]=='\0') goto EndToSetWorkFile;
1404
1405 for(i+=2,i2=0;;i++,i2++){
1406 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1407 temporary[i2]=0;
1408 break;
1409 }
1410 temporary[i2]=buffer[i];
1411 }
1412 if(temporary[0]=='1')
1413 {
1414 pobj_FileTree->Expand( pobj_FileTree->GetRootItem(), TVE_EXPAND );
1415 }
1416
1417 for(i+=2,i2=0;;i++,i2++){
1418 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1419 temporary[i2]=0;
1420 break;
1421 }
1422 temporary[i2]=buffer[i];
1423 }
1424 if(temporary[0]=='1') TreeView_Expand(hProcedureTreeView,TreeView_GetRoot(hProcedureTreeView),TVE_EXPAND);
1425
1426 for(i+=2,i2=0;;i++,i2++){
1427 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1428 temporary[i2]=0;
1429 break;
1430 }
1431 temporary[i2]=buffer[i];
1432 }
1433 hTreeItem=TreeView_GetRoot(hMaterialTreeView);
1434 i2=0;
1435 while(hTreeItem){
1436 i2=GetOneParameter(temporary,i2,temp2);
1437 if(GetValue(temp2)) TreeView_Expand(hMaterialTreeView,hTreeItem,TVE_EXPAND);
1438 hTreeItem=TreeView_GetNextSibling(hMaterialTreeView,hTreeItem);
1439 }
1440 }
1441 else if(lstrcmp(temporary,"case3")==0){
1442 ////////////////////////////////////////
1443 // 古いフォーマットのワークファイル
1444
1445 LockWindowUpdate(hOwner);
1446 for(i=9,i2=0;;i++,i2++){
1447 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1448 if(i2!=0){
1449 temporary[i2]=0;
1450 for(i3=0;;i3++){
1451 if(temporary[i3]==','||temporary[i3]=='\0') break;
1452 }
1453 if(temporary[i3]=='\0') goto EndToSetWorkFile;
1454 lstrcpy(temp2,temporary+i3+1);
1455 temporary[i3]=0;
1456 if(lstrcmpi(temporary,"text")==0){
1457 for(i3=0;;i3++){
1458 if(temp2[i3]==','||temp2[i3]=='\0') break;
1459 }
1460 if(temp2[i3]=='\0') goto EndToSetWorkFile;
1461 lstrcpy(temporary,temp2+i3+1);
1462 temp2[i3]=0;
1463 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1464 sscanf(temp2,"%d",&i3);
1465
1466 //ファイルを開く
1467 hChild=OpenFileWithExtension(temporary);
1468 WndNum=GetWndNum(hChild);
1469
1470 //キャレット位置をセット
1471 TextEdit_SetSel(WndNum,i3,i3);
1472 }
1473 else if(lstrcmpi(temporary,"rad")==0){
1474 for(i3=0;i3<static_cast<int>(projectInfo.windowInfos.size());i3++){
1475 if(lstrcmpi(projectInfo.windowInfos[i3]->GetName().c_str(),temp2)==0){
1476 NewRadWindow( *projectInfo.windowInfos[i3] );
1477 break;
1478 }
1479 }
1480 }
1481 else if(lstrcmpi(temporary,"menu")==0){
1482 for(i3=0;i3<projectInfo.NumberOfMenu;i3++){
1483 if(lstrcmpi(projectInfo.pMenuInfo[i3].IdName,temp2)==0){
1484 NewMenuWindow(&projectInfo.pMenuInfo[i3]);
1485 break;
1486 }
1487 }
1488 }
1489 else if(lstrcmpi(temporary,"icon")==0){
1490 BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
1491 {
1492 if(lstrcmpi(resourceItem.filepath.c_str(),temp2)==0){
1493 NewIconEditWindow( projectInfo.GetWorkDir().GetFullPath( temp2 ).c_str() );
1494 break;
1495 }
1496 }
1497 }
1498 i++;
1499 i2=-1;
1500 continue;
1501 }
1502 else break;
1503 }
1504 temporary[i2]=buffer[i];
1505 }
1506
1507 for(i+=2,i2=0;;i++,i2++){
1508 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1509 temporary[i2]=0;
1510 break;
1511 }
1512 temporary[i2]=buffer[i];
1513 }
1514 sscanf(temporary,"%d",&i2);
1515
1516 switch( i2 ){
1517 case 0:
1518 ShowFileView();
1519 break;
1520 case 1:
1521 ShowClassView();
1522 break;
1523 case 2:
1524 ShowMaterialView();
1525 break;
1526 }
1527
1528 if(buffer[i]=='\0') goto EndToSetWorkFile;
1529
1530 for(i+=2,i2=0;;i++,i2++){
1531 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1532 temporary[i2]=0;
1533 break;
1534 }
1535 temporary[i2]=buffer[i];
1536 }
1537 if(temporary[0]=='1')
1538 {
1539 pobj_FileTree->Expand( pobj_FileTree->GetRootItem(), TVE_EXPAND );
1540 }
1541
1542 for(i+=2,i2=0;;i++,i2++){
1543 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1544 temporary[i2]=0;
1545 break;
1546 }
1547 temporary[i2]=buffer[i];
1548 }
1549 if(temporary[0]=='1') TreeView_Expand(hProcedureTreeView,TreeView_GetRoot(hProcedureTreeView),TVE_EXPAND);
1550
1551 for(i+=2,i2=0;;i++,i2++){
1552 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1553 temporary[i2]=0;
1554 break;
1555 }
1556 temporary[i2]=buffer[i];
1557 }
1558 hTreeItem=TreeView_GetRoot(hMaterialTreeView);
1559 i2=0;
1560 while(hTreeItem){
1561 i2=GetOneParameter(temporary,i2,temp2);
1562 if(GetValue(temp2)) TreeView_Expand(hMaterialTreeView,hTreeItem,TVE_EXPAND);
1563 hTreeItem=TreeView_GetNextSibling(hMaterialTreeView,hTreeItem);
1564 }
1565 }
1566EndToSetWorkFile:
1567 LockWindowUpdate(NULL);
1568 HeapDefaultFree(buffer);
1569 }
1570
1571
1572 //ウィンドウ タイトルを変更
1573 sprintf(temporary,"%s - %s",projectInfo.GetName().c_str(),APPLICATION_NAME);
1574 SetWindowText(hOwner,temporary);
1575}
1576BOOL ProjectModifyCheck(BOOL bRun){
1577 int i,WndNum,sw;
1578 HWND hChild;
1579 char temporary[MAX_PATH];
1580 if(projectInfo.modify||projectInfo.ModifyOfMaterial||projectInfo.ModifuOfResource){
1581 if(bRun==0||pobj_nv->bSaveCheckProject){
1582 //"\"%s\" プロジェクトは変更されています。保存しますか?"
1583 sprintf(temporary,STRING_MODIFYCHECK_PROJECT,projectInfo.GetName().c_str());
1584 i=MessageBox(hOwner,temporary,APPLICATION_NAME,MB_YESNOCANCEL|MB_ICONEXCLAMATION);
1585
1586 if(i==IDCANCEL) return 0;
1587 if(i==IDYES)
1588 {
1589 projectInfo.Save();
1590 }
1591 }
1592 else
1593 {
1594 projectInfo.Save();
1595 }
1596 return 1;
1597 }
1598 hChild=GetWindow(hClient,GW_CHILD);
1599 while(hChild){
1600 WndNum=GetWndNum(hChild);
1601 sw=0;
1602 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
1603 if( MdiInfo[WndNum]->pMdiTextEdit->IsModified() ){
1604 sw = projectInfo.fileSystem.root.IsExistFile( MdiInfo[WndNum]->path );
1605 }
1606 }
1607 else if(MdiInfo[WndNum]->DocType==WNDTYPE_ICONEDIT){
1608 if(MdiInfo[WndNum]->MdiIconEditInfo->bModify){
1609 BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
1610 {
1611 lstrcpy(temporary,resourceItem.filepath.c_str());
1612 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1613 if(lstrcmpi(MdiInfo[WndNum]->path.c_str(),temporary)==0) sw=1;
1614 }
1615 }
1616 }
1617
1618 if(sw){
1619 if(bRun==0||pobj_nv->bSaveCheckProject){
1620 //"\"%s\" プロジェクトは変更されています。保存しますか?"
1621 sprintf(temporary,STRING_MODIFYCHECK_PROJECT,projectInfo.GetName().c_str());
1622 i=MessageBox(hOwner,temporary,APPLICATION_NAME,MB_YESNOCANCEL|MB_ICONEXCLAMATION);
1623
1624 if(i==IDCANCEL) return 0;
1625 if(i==IDYES)
1626 {
1627 projectInfo.Save();
1628 }
1629 }
1630 else
1631 {
1632 projectInfo.Save();
1633 }
1634 return 1;
1635 }
1636 hChild=GetNextWindow(hChild,GW_HWNDNEXT);
1637 }
1638 return 2;
1639}
1640
1641void MakeTextMdiWindowBuffer( ActiveBasic::PM::FM::Folder &folder, int WndNum, char *buffer )
1642{
1643 BOOST_FOREACH( ActiveBasic::PM::FM::Folder &childFolder, folder.folders )
1644 {
1645 MakeTextMdiWindowBuffer( childFolder, WndNum, buffer );
1646 }
1647
1648 BOOST_FOREACH( ActiveBasic::PM::FM::File &file, folder.files )
1649 {
1650 if(lstrcmpi(MdiInfo[WndNum]->path.c_str(),file.GetFullPath().c_str())==0){
1651 CHARRANGE CharRange;
1652 TextEdit_GetSel(WndNum,&CharRange);
1653
1654 SCROLLINFO si;
1655 POINT pos;
1656 si.cbSize=sizeof(SCROLLINFO);
1657 si.fMask=SIF_POS;
1658 GetScrollInfo(MdiInfo[WndNum]->pMdiTextEdit->hEdit,SB_HORZ,&si);
1659 pos.x=si.nPos;
1660 GetScrollInfo(MdiInfo[WndNum]->pMdiTextEdit->hEdit,SB_VERT,&si);
1661 pos.y=si.nPos;
1662
1663 char temporary[1024];
1664 sprintf(temporary,"text,\"%s\",%d,%d,%d,%d\r\n",
1665 file.GetRelationalPath().c_str(),
1666 pos.x,
1667 pos.y,
1668 CharRange.cpMin,
1669 CharRange.cpMax);
1670
1671 lstrcat( buffer, temporary );
1672 break;
1673 }
1674 }
1675}
1676
1677void MakeWorkFile(void){
1678 int i,i2,WndNum;
1679 char temporary[MAX_PATH],buffer[32767];
1680 HWND hChild;
1681
1682 //ワークファイル(*.wrk)を作成
1683 lstrcpy(buffer,"case4\r\n\r\n");
1684 i2=lstrlen(buffer);
1685
1686
1687 ///////////////////////
1688 //MDIウィンドウの並び
1689 hChild=GetWindow(GetWindow(hClient,GW_CHILD),GW_HWNDLAST);
1690 while(hChild){
1691 WndNum=GetWndNum(hChild);
1692 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
1693 MakeTextMdiWindowBuffer( projectInfo.fileSystem.root, WndNum, buffer );
1694 i2 = lstrlen( buffer );
1695 }
1696 else if(MdiInfo[WndNum]->DocType==WNDTYPE_RAD){
1697 BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
1698 {
1699 if(lstrcmpi(MdiInfo[WndNum]->path.c_str(),pWindowInfo->GetName().c_str())==0){
1700 sprintf(buffer+i2,"rad,%s\r\n",MdiInfo[WndNum]->path.c_str());
1701 i2+=lstrlen(buffer+i2);
1702 break;
1703 }
1704 }
1705 }
1706 else if(MdiInfo[WndNum]->DocType==WNDTYPE_MENU){
1707 for(i=0;i<projectInfo.NumberOfMenu;i++){
1708 if(lstrcmpi(MdiInfo[WndNum]->path.c_str(),projectInfo.pMenuInfo[i].IdName)==0){
1709 sprintf(buffer+i2,"menu,%s\r\n",MdiInfo[WndNum]->path.c_str());
1710 i2+=lstrlen(buffer+i2);
1711 break;
1712 }
1713 }
1714 }
1715 else if(MdiInfo[WndNum]->DocType==WNDTYPE_ICONEDIT){
1716 BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
1717 {
1718 lstrcpy(temporary,resourceItem.filepath.c_str());
1719 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1720 if(lstrcmpi(MdiInfo[WndNum]->path.c_str(),temporary)==0){
1721 sprintf(buffer+i2,"icon,%s\r\n",resourceItem.filepath.c_str());
1722 i2+=lstrlen(buffer+i2);
1723 break;
1724 }
1725 }
1726 }
1727 hChild=GetNextWindow(hChild,GW_HWNDPREV);
1728 }
1729 lstrcpy(buffer+i2,"\r\n");
1730 i2+=2;
1731
1732
1733 //////////////////////////
1734 //ツリービューの展開状況
1735 sprintf(buffer+i2,"%d\r\n",TabCtrl_GetCurSel(hProjectViewTab));
1736 i2+=lstrlen(buffer+i2);
1737 TVITEM tvItem;
1738 memset(&tvItem,0,sizeof(TVITEM));
1739 tvItem.mask=TVIF_HANDLE|TVIF_STATE;
1740 tvItem.hItem = pobj_FileTree->GetRootItem();
1741 pobj_FileTree->GetItem( &tvItem );
1742 if(tvItem.state&TVIS_EXPANDED) i=1;
1743 else i=0;
1744 sprintf(buffer+i2,"%d\r\n",i);
1745 i2+=lstrlen(buffer+i2);
1746
1747 tvItem.hItem=TreeView_GetRoot(hProcedureTreeView);
1748 TreeView_GetItem(hProcedureTreeView,&tvItem);
1749 if(tvItem.state&TVIS_EXPANDED) i=1;
1750 else i=0;
1751 sprintf(buffer+i2,"%d\r\n",i);
1752 i2+=lstrlen(buffer+i2);
1753
1754 tvItem.hItem=TreeView_GetRoot(hMaterialTreeView);
1755 while(tvItem.hItem){
1756 TreeView_GetItem(hMaterialTreeView,&tvItem);
1757 if(tvItem.state&TVIS_EXPANDED) i=1;
1758 else i=0;
1759 sprintf(buffer+i2,"%d",i);
1760 i2+=lstrlen(buffer+i2);
1761
1762 tvItem.hItem=TreeView_GetNextSibling(hMaterialTreeView,tvItem.hItem);
1763 if(tvItem.hItem){
1764 lstrcpy(buffer+i2,",");
1765 i2+=lstrlen(buffer+i2);
1766 }
1767 }
1768
1769
1770 //保存
1771 sprintf(temporary,"%s%s.wrk",projectInfo.GetWorkDir().GetPath().c_str(),projectInfo.GetName().c_str());
1772 WriteBuffer(temporary,buffer,i2);
1773}
1774
1775BOOL SetProjectToRun(void){
1776 HANDLE hFind;
1777 WIN32_FIND_DATA wfd;
1778
1779 if( projectInfo.fileSystem.root.IsEmpty() )
1780 {
1781 //"プログラム ファイルがプロジェクトに存在しません。"
1782 MessageBox(hOwner,STRING_ERROR_NOFILE,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
1783 return 0;
1784 }
1785
1786 extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
1787 hFind=FindFirstFile( ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ).c_str(), &wfd );
1788 if(hFind==INVALID_HANDLE_VALUE){
1789 //"BasicCompiler.exe が見つかりません"
1790 MessageBox(hOwner,STRING_ERROR_NOBASICCOMPILER,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
1791 return 0;
1792 }
1793 FindClose(hFind);
1794
1795 //プロジェクト構造のバージョンが違う時は、再保存する
1796 if(projectInfo.dwVersion<PROJECT_VERSION)
1797 projectInfo.ModifyOfMaterial=1;
1798
1799 //保存確認
1800 if(!ProjectModifyCheck(1)) return 0;
1801
1802 return 1;
1803}
1804bool IsNeedCompileForProject( const ActiveBasic::PM::FM::Folder &folder, const FILETIME &exeTime )
1805{
1806 BOOST_FOREACH( const ActiveBasic::PM::FM::Folder &childFolder, folder.folders )
1807 {
1808 if( IsNeedCompileForProject( childFolder, exeTime ) )
1809 {
1810 return true;
1811 }
1812 }
1813
1814 BOOST_FOREACH( const ActiveBasic::PM::FM::File &file, folder.files )
1815 {
1816 FILETIME sourceTime;
1817 {
1818 ATL::CHandle hFile(CreateFile(file.GetFullPath().c_str(),GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
1819 GetFileTime(hFile,NULL,NULL,&sourceTime);
1820 }
1821
1822 if(sourceTime.dwHighDateTime>exeTime.dwHighDateTime||
1823 sourceTime.dwHighDateTime==exeTime.dwHighDateTime&&
1824 sourceTime.dwLowDateTime>exeTime.dwLowDateTime) return true;
1825 }
1826
1827 return false;
1828}
1829
1830BOOL IsNeedCompileForProject(BOOL bDebug){
1831 char temporary[MAX_PATH];
1832 HANDLE hFind;
1833 WIN32_FIND_DATA wfd;
1834 FILETIME SourceTime,ExeTime;
1835
1836 if(bDebug) lstrcpy(temporary,projectInfo.lpszOutput_Debug);
1837 else lstrcpy(temporary,projectInfo.lpszOutput_Release);
1838 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1839
1840 hFind=FindFirstFile(temporary,&wfd);
1841 if(hFind==INVALID_HANDLE_VALUE) return 1;
1842 FindClose(hFind);
1843
1844 {
1845 ATL::CHandle hFile(CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
1846 GetFileTime(hFile,NULL,NULL,&ExeTime);
1847 }
1848
1849 if( IsNeedCompileForProject( projectInfo.fileSystem.root, ExeTime ) )
1850 {
1851 return 1;
1852 }
1853 if( !projectInfo.windowInfos.empty() )
1854 {
1855 //CallBack.wbp
1856 lstrcpy(temporary,"CallBack.wbp");
1857 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1858 {
1859 ATL::CHandle hFile(CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
1860 GetFileTime(hFile,NULL,NULL,&SourceTime);
1861 }
1862 if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
1863 SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
1864 SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
1865
1866 //MakeWindow.wbp
1867 lstrcpy(temporary,"MakeWindow.wbp");
1868 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1869 {
1870 ATL::CHandle hFile(CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
1871 GetFileTime(hFile,NULL,NULL,&SourceTime);
1872 }
1873 if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
1874 SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
1875 SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
1876 }
1877 return 0;
1878}
Note: See TracBrowser for help on using the repository browser.