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

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

WindowInfoクラスをリファクタリング

File size: 61.1 KB
RevLine 
[475]1#include "stdafx.h"
2
[3]3#include "Common.h"
4
[475]5using namespace ActiveBasic::IDE;
6
[3]7#if defined(JPN)
8//日本語
9#include "pj_msg_jpn.h"
10#else
11//英語
12#include "pj_msg_eng.h"
13#endif
14
15HWND hProjectViewTab;
16HWND hProcedureTreeView,hMaterialTreeView;
17HIMAGELIST hProcedureTreeViewImageList,hMaterialTreeViewImageList;
18WNDPROC OldProcedureTreeViewProc,OldMaterialTreeViewProc;
19WNDPROC OldTabProc;
20
21LRESULT CALLBACK ProcedureTreeViewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
22 if(message==WM_CHAR&&wParam==VK_RETURN){
23 SendMessage(hProjectViewTab,WM_COMMAND,IDM_PROCEDURETREE_SHOW,0);
24 //デフォルトのメッセージ処理をするとビープ音がしてしまうので避ける
25 return 0;
26 }
27 else if(message==WM_LBUTTONDBLCLK){
28 SendMessage(hProjectViewTab,WM_COMMAND,IDM_PROCEDURETREE_SHOW,0);
29 return 0;
30 }
31 return CallWindowProc(OldProcedureTreeViewProc,hwnd,message,wParam,lParam);
32}
33LRESULT CALLBACK MaterialTreeViewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
34 if(message==WM_CHAR&&wParam==VK_RETURN){
35 SendMessage(hProjectViewTab,WM_COMMAND,IDM_MATERIALTREE_OPEN,0);
36 //デフォルトのメッセージ処理をするとビープ音がしてしまうので避ける
37 return 0;
38 }
39 if(message==WM_KEYDOWN&&wParam==VK_DELETE) SendMessage(hProjectViewTab,WM_COMMAND,IDM_MATERIALTREE_DELETE,0);
40 return CallWindowProc(OldMaterialTreeViewProc,hwnd,message,wParam,lParam);
41}
42LRESULT CALLBACK TabProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
43 extern HANDLE hHeap;
44 extern MDIINFO MdiInfo[MAX_WNDNUM];
45 extern LPSTR DefFileFilter;
46 int i,i2,WndNum;
47 char str[MAX_PATH],temporary[MAX_PATH];
48 HWND hTree,hChild;
49 HTREEITEM hTreeItem,hTreeItem2;
50 TV_HITTESTINFO tvHitTestInfo;
51 TVITEM tvItem;
52
53 switch(message){
54 case WM_CONTEXTMENU:
55 i=TabCtrl_GetCurSel(hwnd);
56 if(i==0){
57 //ファイルツリー
58 POINT pos;
59 pos.x=LOWORD(lParam);
60 pos.y=HIWORD(lParam);
61 pobj_FileTree->ContextMenu(&pos);
62 return 0;
63 }
64 else if(i==1) hTree=hProcedureTreeView;
65 else if(i==2) hTree=hMaterialTreeView;
66 tvHitTestInfo.pt.x=LOWORD(lParam);
67 tvHitTestInfo.pt.y=HIWORD(lParam);
68 ScreenToClient(hTree,&tvHitTestInfo.pt);
69 hTreeItem=TreeView_HitTest(hTree,&tvHitTestInfo);
70 if(hTreeItem){
71 TreeView_SelectItem(hTree,hTreeItem);
72 if(i==1){
73 extern HMENU hProcedureTreeMenuBase;
74 if(TreeView_GetRoot(hTree)!=hTreeItem)
75 TrackPopupMenu(GetSubMenu(hProcedureTreeMenuBase,1),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
76 }
77 else if(i==2){
78 extern HMENU hMaterialTreeMenuBase;
79 hTreeItem2=TreeView_GetRoot(hTree);
80 for(i2=0;;i2++){
81 if(hTreeItem2==hTreeItem) break;
82 hTreeItem2=TreeView_GetNextSibling(hTree,hTreeItem2);
83 if(!hTreeItem2) break;
84 }
85 if(hTreeItem2){
86 if(i2==0)
87 TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,0),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
88 else if(i2==1)
89 TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,2),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
90 else if(i2==2)
91 TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,4),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
92 else if(i2==3)
93 TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,6),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
94 else if(i2==4)
95 TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,8),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
96 }
97 else{
98 hTreeItem=TreeView_GetNextItem(hTree,hTreeItem,TVGN_PARENT);
99 hTreeItem2=TreeView_GetRoot(hTree);
100 for(i2=0;;i2++){
101 if(hTreeItem2==hTreeItem) break;
102 hTreeItem2=TreeView_GetNextSibling(hTree,hTreeItem2);
103 if(!hTreeItem2) break;
104 }
105 if(hTreeItem2){
106 if(i2==0)
107 TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,1),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
108 else if(i2==1)
109 TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,3),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
110 else if(i2==2)
111 TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,5),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
112 else if(i2==3)
113 TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,7),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
114 else if(i2==4)
115 TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,9),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
116 }
117 }
118 }
119 }
120 break;
121 case WM_COMMAND:
122 switch(LOWORD(wParam)){
123
124 case IDM_PROCEDURETREE_SHOW:
125 extern BOOL bSearchingClasses;
126 if(bSearchingClasses){
127 pobj_ClassTreeView->bShowSwitch=1;
128 break;
129 }
130
131 hTreeItem=TreeView_GetSelection(hProcedureTreeView);
132 for(i=0;i<pobj_ClassTreeView->NumberOfProcedures;i++){
133 if(pobj_ClassTreeView->pProcInfo[i].hTreeItem==hTreeItem){
134
[619]135 if( projectInfo.IsOpened() ){
[81]136 // 対象ファイルを開く
137 lstrcpy(temporary,
[618]138 projectInfo.pobj_DBFileInfo->ppobj_FileInfo[pobj_ClassTreeView->pProcInfo[i].FileNum]->m_path);
[620]139 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
[81]140 hChild=OpenFileWithExtension(temporary);
141 }
142 else{
143 hChild = GetWindow(hClient,GW_CHILD);
144 }
145
[3]146 //プロシージャの行を選択する
147 //ResetScrollbarが再描画時に呼び出されるので、再描画する
148 WndNum=GetWndNum(hChild);
[24]149 InvalidateRect(MdiInfo[WndNum].pMdiTextEdit->hEdit,NULL,0);
150 UpdateWindow(MdiInfo[WndNum].pMdiTextEdit->hEdit);
[3]151 TextEdit_SelectOneLine(WndNum,pobj_ClassTreeView->pProcInfo[i].code_pos,TRUE);
152
153 //タイマーをセット
154 // ※フォーカスをエディタにセットするため
155 // ※タイミングを遅らせてSetFocusを実行する必要あり
156 SetTimer(hwnd,100,10,NULL);
157
158 break;
159 }
160 }
[81]161
[3]162 break;
163
164 case IDM_MATERIALTREE_INSERTCURSOR:
165 Project_CursorResInsert();
166 break;
167 case IDM_MATERIALTREE_INSERTBITMAP:
168 Project_BitmapResInsert();
169 break;
170 case IDM_MATERIALTREE_INSERTICON:
171 Project_IconResInsert();
172 break;
173 case IDM_MATERIALTREE_INSERTMENU:
174 Project_Menu_Insert();
175 break;
176 case IDM_MATERIALTREE_INSERTWINDOW:
177 Project_Window_Insert();
178 break;
179 case IDM_MATERIALTREE_OPEN:
180 hTreeItem=TreeView_GetSelection(hMaterialTreeView);
[618]181 for(i=0;i<static_cast<int>(projectInfo.windowInfos.size());i++){
182 if(projectInfo.windowInfos[i]->hTreeItem==hTreeItem){
183 NewRadWindow( *projectInfo.windowInfos[i] );
[3]184 break;
185 }
186 }
[618]187 for(i=0;i<projectInfo.NumberOfMenu;i++){
188 if(projectInfo.pMenuInfo[i].hTreeItem==hTreeItem){
189 NewMenuWindow(&projectInfo.pMenuInfo[i]);
[3]190 break;
191 }
192 }
[624]193 BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
194 {
195 if( resourceItem.hTreeItem == hTreeItem )
196 {
[623]197 NewIconEditWindow(
[624]198 projectInfo.GetWorkDir().GetFullPath( resourceItem.filepath ).c_str()
[623]199 );
[3]200 break;
201 }
202 }
203 break;
204 case IDM_MATERIALTREE_DELETE:
205 hTreeItem=TreeView_GetSelection(hMaterialTreeView);
[624]206 for(i=0;i<static_cast<int>(projectInfo.resourceManager.cursorResources.size());i++){
[623]207 if(projectInfo.resourceManager.cursorResources[i].hTreeItem==hTreeItem){
[3]208
209 //"%s カーソルをプロジェクトから削除します。よろしいですか?"
[623]210 sprintf(str,STRING_PJ_CHECK_DELETECURSOR,projectInfo.resourceManager.cursorResources[i].idName.c_str());
[3]211 if(IDCANCEL==MessageBox(hOwner,str,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
212
213 Project_Cursor_Delete(i);
214 break;
215 }
216 }
[624]217 for(i=0;i<static_cast<int>(projectInfo.resourceManager.bitmapResources.size());i++){
[623]218 if(projectInfo.resourceManager.bitmapResources[i].hTreeItem==hTreeItem){
[3]219
220 //"%s ビットマップをプロジェクトから削除します。よろしいですか?"
[623]221 sprintf(str,STRING_PJ_CHECK_DELETEBITMAP,projectInfo.resourceManager.bitmapResources[i].idName.c_str());
[3]222 if(IDCANCEL==MessageBox(hOwner,str,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
223
224 Project_Bitmap_Delete(i);
225 break;
226 }
227 }
[624]228 for(i=0;i<static_cast<int>(projectInfo.resourceManager.iconResources.size());i++){
[623]229 if(projectInfo.resourceManager.iconResources[i].hTreeItem==hTreeItem){
[3]230
231 //"%s アイコンをプロジェクトから削除します。よろしいですか?"
[623]232 sprintf(str,STRING_PJ_CHECK_DELETEICON,projectInfo.resourceManager.iconResources[i].idName.c_str());
[3]233 if(IDCANCEL==MessageBox(hOwner,str,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
234
235 Project_Icon_Delete(i);
236 break;
237 }
238 }
[618]239 for(i=0;i<projectInfo.NumberOfMenu;i++){
240 if(projectInfo.pMenuInfo[i].hTreeItem==hTreeItem){
[3]241
242 //"%s メニューをプロジェクトから削除します。よろしいですか?"
[618]243 sprintf(str,STRING_PJ_CHECK_DELETEMENU,projectInfo.pMenuInfo[i].IdName);
[3]244 if(IDCANCEL==MessageBox(hOwner,str,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
245
246 Project_Menu_Delete(i);
247 break;
248 }
249 }
[618]250 for(i=0;i<static_cast<int>(projectInfo.windowInfos.size());i++){
251 if(projectInfo.windowInfos[i]->hTreeItem==hTreeItem){
[3]252
253 //"%s ウィンドウをプロジェクトから削除します。よろしいですか?"
[618]254 sprintf(str,STRING_PJ_CHECK_DELETEWINDOW,projectInfo.windowInfos[i]->GetName().c_str());
[3]255 if(IDCANCEL==MessageBox(hOwner,str,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
256
257 Project_Window_Delete(i);
258 break;
259 }
260 }
261 break;
262 case IDM_MENUTREE_RENAMEID:
263 extern char NewIdName[MAX_PATH];
264 hTreeItem=TreeView_GetSelection(hMaterialTreeView);
[624]265 for(i=0;i<static_cast<int>(projectInfo.resourceManager.cursorResources.size());i++){
[623]266 if(projectInfo.resourceManager.cursorResources[i].hTreeItem==hTreeItem){
[3]267 Project_Cursor_RenameID(i);
268 break;
269 }
270 }
[624]271 for(i=0;i<static_cast<int>(projectInfo.resourceManager.bitmapResources.size());i++){
[623]272 if(projectInfo.resourceManager.bitmapResources[i].hTreeItem==hTreeItem){
[3]273 Project_Bitmap_RenameID(i);
274 break;
275 }
276 }
[624]277 for(i=0;i<static_cast<int>(projectInfo.resourceManager.iconResources.size());i++){
[623]278 if(projectInfo.resourceManager.iconResources[i].hTreeItem==hTreeItem){
[3]279 Project_Icon_RenameID(i);
280 }
281 }
[618]282 for(i=0;i<projectInfo.NumberOfMenu;i++){
283 if(projectInfo.pMenuInfo[i].hTreeItem==hTreeItem){
284 if(!DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_INPUTID),hOwner,(DLGPROC)DlgProject_MenuID_Input,(long)projectInfo.pMenuInfo[i].IdName)) break;
[3]285
286 //重複チェック
[618]287 for(i2=0;i2<projectInfo.NumberOfMenu;i2++){
[3]288 if(i2==i) continue;
[618]289 if(lstrcmp(NewIdName,projectInfo.pMenuInfo[i2].IdName)==0){
[3]290 //"ID \"%s\" は既にプロジェクト内に存在します。"
291 sprintf(temporary,STRING_DUPLICATIONERROR_ID_IN_PROJECT,NewIdName);
292 MessageBox(hOwner,temporary,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
293 return 0;
294 }
295 }
296
[618]297 HeapDefaultFree(projectInfo.pMenuInfo[i].IdName);
298 projectInfo.pMenuInfo[i].IdName=(char *)HeapAlloc(hHeap,0,lstrlen(NewIdName)+1);
299 lstrcpy(projectInfo.pMenuInfo[i].IdName,NewIdName);
[3]300
301 tvItem.hItem=hTreeItem;
302 tvItem.mask=TVIF_TEXT;
[618]303 tvItem.pszText=projectInfo.pMenuInfo[i].IdName;
304 tvItem.cchTextMax=lstrlen(projectInfo.pMenuInfo[i].IdName)+1;
[3]305 TreeView_SetItem(hMaterialTreeView,&tvItem);
306
[618]307 projectInfo.ModifyOfMaterial=1;
[3]308
309 TreeView_SortChildren(hMaterialTreeView,
310 TreeView_GetParent(hMaterialTreeView,hTreeItem),
311 0);
312 break;
313 }
314 }
315 break;
316 case IDM_MATERIALTREE_ICON_SETMAIN:
317 hTreeItem=TreeView_GetSelection(hMaterialTreeView);
[624]318 for(i=0;i<static_cast<int>(projectInfo.resourceManager.iconResources.size());i++){
[623]319 if(projectInfo.resourceManager.iconResources[i].hTreeItem==hTreeItem){
[3]320 if(i==0) break;
321
[623]322 ActiveBasic::Common::ResourceItem tempItem = projectInfo.resourceManager.iconResources[i];
323 Jenga::Common::EraseVectorItem<ActiveBasic::Common::ResourceItems>( projectInfo.resourceManager.iconResources, i );
324 projectInfo.resourceManager.iconResources.insert( projectInfo.resourceManager.iconResources.begin(), tempItem );
[3]325
[623]326 tvItem.hItem=projectInfo.resourceManager.iconResources[1].hTreeItem;
[3]327 tvItem.mask=TVIF_TEXT;
[623]328 lstrcpy( temporary, projectInfo.resourceManager.iconResources[1].idName.c_str() );
329 tvItem.pszText = temporary;
330 tvItem.cchTextMax=lstrlen(temporary)+1;
[3]331 TreeView_SetItem(hMaterialTreeView,&tvItem);
332
[623]333 tvItem.hItem=projectInfo.resourceManager.iconResources[0].hTreeItem;
[3]334 tvItem.mask=TVIF_TEXT;
[623]335 sprintf(temporary,"%s (Main)",projectInfo.resourceManager.iconResources[0].idName.c_str());
[3]336 tvItem.pszText=temporary;
337 tvItem.cchTextMax=lstrlen(temporary)+1;
338 TreeView_SetItem(hMaterialTreeView,&tvItem);
339
[618]340 projectInfo.ModifuOfResource=1;
[3]341 break;
342 }
343 }
344 break;
345 }
346 break;
347 case WM_TIMER:
348 KillTimer(hwnd,wParam);
349
350 //フォーカスをエディタにセット
351 SetFocus(GetWindow(GetWindow(hClient,GW_CHILD),GW_CHILD));
352 break;
353 case WM_NOTIFY:
354 NMHDR *hdr;
355 hdr=(NMHDR *)lParam;
356 if(hdr->code==NM_DBLCLK){
357 if(hdr->hwndFrom==hProcedureTreeView) SendMessage(hwnd,WM_COMMAND,IDM_PROCEDURETREE_SHOW,0);
358 else if(hdr->hwndFrom==hMaterialTreeView) SendMessage(hwnd,WM_COMMAND,IDM_MATERIALTREE_OPEN,0);
359 }
360 if(hdr->code==TVN_ITEMEXPANDEDW||hdr->code==TVN_ITEMEXPANDED){
361 NMTREEVIEW *nmTreeView;
362 TVITEM tvItem;
363 nmTreeView=(NMTREEVIEW *)lParam;
364 tvItem.mask=TVIF_HANDLE|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
365 tvItem.hItem=nmTreeView->itemNew.hItem;
366 TreeView_GetItem(nmTreeView->hdr.hwndFrom,&tvItem);
367 if(tvItem.iImage==0||tvItem.iImage==1){
368 if(nmTreeView->action==TVE_EXPAND){
369 tvItem.iImage=1;
370 tvItem.iSelectedImage=1;
371 }
372 else if(nmTreeView->action==TVE_COLLAPSE){
373 tvItem.iImage=0;
374 tvItem.iSelectedImage=0;
375 }
376 tvItem.hItem=nmTreeView->itemNew.hItem;
377 TreeView_SetItem(nmTreeView->hdr.hwndFrom,&tvItem);
378 }
379 }
380 break;
381 }
382 return CallWindowProc(OldTabProc,hwnd,message,wParam,lParam);
383}
384void ResizeProjectView_ToolWindow(void){
385 extern HWND hProjectView_ToolWindow;
386 RECT rect;
387 GetClientRect(hProjectView_ToolWindow,&rect);
388 SendMessage(hProjectView_ToolWindow,WM_SIZE,0,MAKELONG(rect.right,rect.bottom));
389}
390LRESULT CALLBACK ProjectView_ToolWindowProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
391 extern HWND hProjectView;
392 switch(message){
393 case WM_SIZE:
394 MoveWindow(hProjectView,0,0,
395 LOWORD(lParam),
396 HIWORD(lParam),1);
397 return 0;
398 case WM_CLOSE:
399 SendMessage(hOwner,WM_COMMAND,IDM_PROJECTVIEW,0);
400 return 0;
401 }
402 return DefWindowProc(hwnd,message,wParam,lParam);
403}
[84]404void ShowFileView(){
405 TabCtrl_SetCurSel(hProjectViewTab,0);
406 ShowWindow(pobj_FileTree->hTree,SW_SHOW);
407 ShowWindow(hProcedureTreeView,SW_HIDE);
408 ShowWindow(hMaterialTreeView,SW_HIDE);
409}
410void ShowClassView(){
411 TabCtrl_SetCurSel(hProjectViewTab,1);
412 ShowWindow(pobj_FileTree->hTree,SW_HIDE);
413 ShowWindow(hMaterialTreeView,SW_HIDE);
414 ShowWindow(hProcedureTreeView,SW_SHOW);
415}
416void ShowMaterialView(){
417 TabCtrl_SetCurSel(hProjectViewTab,2);
418 ShowWindow(pobj_FileTree->hTree,SW_HIDE);
419 ShowWindow(hProcedureTreeView,SW_HIDE);
420 ShowWindow(hMaterialTreeView,SW_SHOW);
421}
[3]422LRESULT CALLBACK ProjectViewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
423 extern HINSTANCE hInst,hResInst;
424 extern HWND hTabOfProjectView;
425 extern HFONT hStatusFont;
426 extern HWND hProjectView_ToolWindow;
427 RECT rect;
428 HWND hButton;
429
430 switch(message){
431 case WM_CREATE:
432 hProjectViewTab=CreateWindow(WC_TABCONTROL,NULL,
433 WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
434 0,0,0,0,hwnd,0,hInst,0);
435 SendMessage(hProjectViewTab,WM_SETFONT,(long)hStatusFont,0);
436
437 hButton=CreateWindow("BUTTON","↓",WS_CHILD|WS_VISIBLE,
438 0,0,30,13,
439 hwnd,(HMENU)IDC_CLIP,hInst,0);
440 SendMessage(hButton,WM_SETFONT,(long)hStatusFont,0);
441
[302]442 OldTabProc=(WNDPROC)GetWindowLongPtr(hProjectViewTab,GWLP_WNDPROC);
443 SetWindowLongPtr(hProjectViewTab,GWLP_WNDPROC,(long)TabProc);
[3]444
445 //タブを設定
446 TC_ITEM tcItem;
447 tcItem.mask=TCIF_TEXT;
448 tcItem.pszText="File";
449 TabCtrl_InsertItem(hProjectViewTab,0,&tcItem);
450 tcItem.mask=TCIF_TEXT;
451 tcItem.pszText="Class";
452 TabCtrl_InsertItem(hProjectViewTab,1,&tcItem);
453 tcItem.mask=TCIF_TEXT;
454 tcItem.pszText="Material";
455 TabCtrl_InsertItem(hProjectViewTab,2,&tcItem);
456
457 //ファイルツリービューを作成
458 pobj_FileTree=new CFileTree(hProjectViewTab);
459
460 //クラスツリービューを作成
461 hProcedureTreeView=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
462 WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
463 0,0,0,0,
464 hProjectViewTab,0,hInst,0);
[302]465 OldProcedureTreeViewProc=(WNDPROC)GetWindowLongPtr(hProcedureTreeView,GWLP_WNDPROC);
466 SetWindowLongPtr(hProcedureTreeView,GWLP_WNDPROC,(long)ProcedureTreeViewProc);
[3]467 //イメージリスト読み込み、設定
468 hProcedureTreeViewImageList=ImageList_Create(16,16,ILC_COLOR24|ILC_MASK,8,0);
469 ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FOLDER_CLOSE)));
470 ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FOLDER_OPEN)));
471 ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_PROCEDURE)));
472 ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_PROGRAM_FOLDER)));
473 ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_MEMBER_PUBLIC_VARIABLE)));
474 ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_MEMBER_PUBLIC_FUNCTION)));
475 ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_MEMBER_PRIVATE_VARIABLE)));
476 ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_MEMBER_PRIVATE_FUNCTION)));
477 TreeView_SetImageList(hProcedureTreeView,hProcedureTreeViewImageList,TVSIL_NORMAL);
478
479 //マテリアルツリービューを作成
480 hMaterialTreeView=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
481 WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
482 0,0,0,0,
483 hProjectViewTab,0,hInst,0);
[302]484 OldMaterialTreeViewProc=(WNDPROC)GetWindowLongPtr(hMaterialTreeView,GWLP_WNDPROC);
485 SetWindowLongPtr(hMaterialTreeView,GWLP_WNDPROC,(long)MaterialTreeViewProc);
[3]486 //イメージリスト読み込み、設定
487 hMaterialTreeViewImageList=ImageList_Create(16,16,ILC_COLOR24|ILC_MASK,3,0);
488 ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FOLDER_CLOSE)));
489 ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FOLDER_OPEN)));
490 ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_WINDOW)));
491 ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_MENU)));
492 ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FILE_ICON)));
493 ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FILE_BMP)));
494 ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FILE_CURSOR)));
495 TreeView_SetImageList(hMaterialTreeView,hMaterialTreeViewImageList,TVSIL_NORMAL);
496
497 ShowWindow(pobj_FileTree->hTree,SW_SHOW);
498 GetClientRect(hwnd,&rect);
499 SendMessage(hwnd,WM_SIZE,0,MAKELONG(rect.right,rect.bottom));
500 return 0;
501 case WM_COMMAND:
502 switch(LOWORD(wParam)){
503 case IDC_CLIP:
504 if(pobj_nv->bClipProjectView==0){
505 pobj_nv->bClipProjectView=1;
506
[302]507 SetWindowLongPtr(hwnd,GWL_EXSTYLE,WS_EX_STATICEDGE);
[3]508 SetParent(hwnd,hOwner);
509 ResizeOwnerWnd();
510
511 ShowWindow(hProjectView_ToolWindow,SW_HIDE);
512 }
513 else{
514 pobj_nv->bClipProjectView=0;
515
[302]516 SetWindowLongPtr(hwnd,GWL_EXSTYLE,0);
[3]517
518 SetParent(hwnd,hProjectView_ToolWindow);
519
520 ResizeOwnerWnd();
521 ResizeProjectView_ToolWindow();
522
523 ShowWindow(hProjectView_ToolWindow,SW_SHOW);
524 }
525 return 0;
526 }
527 break;
528 case WM_NOTIFY:
529 NMHDR *hdr;
530 hdr=(NMHDR *)lParam;
531 if(hdr->hwndFrom==hProjectViewTab&&hdr->code==TCN_SELCHANGE){
[84]532 switch( TabCtrl_GetCurSel(hProjectViewTab) ){
533 case 0:
534 ShowFileView();
535 break;
536 case 1:
537 ShowClassView();
538 break;
539 case 2:
540 ShowMaterialView();
541 break;
[3]542 }
543 }
544 return 0;
545 case WM_PAINT:
546 PAINTSTRUCT ps;
547 HDC hdc;
548 HFONT hOldFont;
549 SIZE size;
550 HBRUSH hBrush,hOldBrush;
551 HPEN hPen,hOldPen;
552 char temporary[MAX_PATH];
553
554 if(pobj_nv->bClipProjectView==0) break;
555
556 hBrush=CreateSolidBrush(GetSysColor(COLOR_3DSHADOW));
557 hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DSHADOW));
558
559 hdc=BeginPaint(hwnd,&ps);
560
561 hOldFont=(HFONT)SelectObject(hdc,hStatusFont);
[619]562 if( projectInfo.IsOpened() ){
563 sprintf(temporary,"%s \'%s\'",STRING_PROJECT,projectInfo.GetName().c_str());
[81]564 }
565 else{
566 lstrcpy( temporary, "現在のドキュメント" );
567 }
[3]568
569 GetTextExtentPoint32(hdc,temporary,lstrlen(temporary),&size);
570 GetClientRect(hwnd,&rect);
571 rect.left++;
572 rect.top++;
573 rect.right--;
574 rect.bottom=size.cy+2;
575
576 hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
577 hOldPen=(HPEN)SelectObject(hdc,hPen);
578 Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom);
579 SelectObject(hdc,hOldBrush);
580 SelectObject(hdc,hPen);
581
582 rect.top++;
583 rect.bottom--;
584 SetBkMode(hdc,OPAQUE);
585 SetBkColor(hdc,GetSysColor(COLOR_3DSHADOW));
586 SetTextColor(hdc,GetSysColor(COLOR_3DHILIGHT));
587 DrawText(hdc,temporary,lstrlen(temporary),&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
588
589 EndPaint(hwnd,&ps);
590
591 DeleteObject(hBrush);
592 DeleteObject(hPen);
593 return 0;
594 case WM_SIZE:
595 if(pobj_nv->bClipProjectView){
596 MoveWindow(hProjectViewTab,
597 LEVER_THICK,
598 LEVER_THICK+11,
599 LOWORD(lParam)-LEVER_THICK*2,
600 HIWORD(lParam)-LEVER_THICK*2-21,1);
601
602 GetClientRect(hProjectViewTab,&rect);
603 TabCtrl_AdjustRect(hProjectViewTab,FALSE,&rect);
604 rect.left-=2;
605 rect.right++;
606 rect.bottom++;
607
608 pobj_FileTree->resize(rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top);
609 MoveWindow(hProcedureTreeView,
610 rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
611 MoveWindow(hMaterialTreeView,
612 rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
613
614 GetClientRect(GetDlgItem(hwnd,IDC_CLIP),&rect);
615 MoveWindow(GetDlgItem(hwnd,IDC_CLIP),LOWORD(lParam)-rect.right,HIWORD(lParam)-rect.bottom,rect.right,rect.bottom,1);
616 InvalidateRect(GetDlgItem(hwnd,IDC_CLIP),NULL,0);
617 }
618 else{
619 MoveWindow(hProjectViewTab,0,0,
620 LOWORD(lParam),
621 HIWORD(lParam)-15,1);
622
623 GetClientRect(hProjectViewTab,&rect);
624 TabCtrl_AdjustRect(hProjectViewTab,FALSE,&rect);
625
626 pobj_FileTree->resize(rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top);
627 MoveWindow(hProcedureTreeView,
628 rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
629 MoveWindow(hMaterialTreeView,
630 rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
631
632 GetClientRect(GetDlgItem(hwnd,IDC_CLIP),&rect);
633 MoveWindow(GetDlgItem(hwnd,IDC_CLIP),LOWORD(lParam)-rect.right,HIWORD(lParam)-rect.bottom,rect.right,rect.bottom,1);
634 }
635 return 0;
636 case WM_CLOSE:
637 SendMessage(hOwner,WM_COMMAND,IDM_PROJECTVIEW,0);
638 return 0;
639 case WM_DESTROY:
640 delete pobj_FileTree;
641 ImageList_Destroy(hProcedureTreeViewImageList);
642 ImageList_Destroy(hMaterialTreeViewImageList);
643 return 0;
644 }
645 return DefWindowProc(hwnd,message,wParam,lParam);
646}
647
648void Project_File_Insert(char *path){
649 extern HANDLE hHeap;
650 char temporary[MAX_PATH],temp2[MAX_PATH];
651
[620]652 lstrcpy( path, projectInfo.GetWorkDir().GetRelationalPath( path ).c_str() );
[3]653
654 //重複チェック
[618]655 if(projectInfo.pobj_DBFileInfo->dupli_check(path)){
[3]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
[618]671 //projectInfo.ppobj_DBFileInfoオブジェクトに追加
672 projectInfo.pobj_DBFileInfo->add(path,hTreeItem);
[3]673
674
[618]675 projectInfo.modify=1;
[3]676
677 //ファイル操作によるクラスビューの再表示
678 ResetClassTree(-1);
679}
680void Project_File_Delete(HTREEITEM hTreeItem){
681 extern HANDLE hHeap;
682
[618]683 if(projectInfo.pobj_DBFileInfo->IsMainFile(hTreeItem)){
[3]684 //"このファイルはプロジェクトのメイン ファイルです。プロジェクト内から削除することはできません。"
685 MessageBox(hOwner,STRING_ERROR_CANT_MAINFILE,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
686 return;
687 }
688
689 //ツリービューから削除
690 TreeView_DeleteItem(pobj_FileTree->hTree,hTreeItem);
691
[618]692 //projectInfo.pobj_DBFileInfoオブジェクトから削除
693 projectInfo.pobj_DBFileInfo->del(hTreeItem);
[3]694
[618]695 projectInfo.modify=1;
[3]696
697 //ファイル操作によるクラスビューの再表示
698 ResetClassTree(-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 //既にプロジェクトが開かれている場合は閉じる
[619]710 if( projectInfo.IsOpened() ){
711 if(!projectInfo.Close()) return;
[3]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
[608]746 // 出力先拡張子
747 const std::string outputFileExt
748 = ( NewProjectInfo.dwTypeID == IDC_DLL ) ? ".dll"
749 : ( NewProjectInfo.dwTypeID == IDC_SLL ) ? ".lib"
750 : ".exe";
751
[3]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)
[608]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());
[3]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)
[608]787 sprintf(buffer+i,"#OUTPUT_RELEASE=.\\%s%s\r\n\r\n",NewProjectInfo.name, outputFileExt.c_str());
[3]788 i+=lstrlen(buffer+i);
789
790 //出力先(Debug)
[608]791 sprintf(buffer+i,"#OUTPUT_DEBUG=.\\%s_debug%s\r\n\r\n",NewProjectInfo.name, outputFileExt.c_str());
[3]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){
[477]901 const std::string mainExeDirectXAbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dx\\main_exe_directx.abp";
[475]902 pTemp = ReadBuffer( mainExeDirectXAbpPath );
[3]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 }
[608]951 else if( NewProjectInfo.dwTypeID == IDC_SLL )
952 {
953 buffer[0] = 0;
954 }
[3]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);
[608]965 if(!WriteBuffer(temporary,buffer,lstrlen(buffer))) return;
[3]966 }
967
968
969 /////////////////////
970 // MainWnd.abを作成
971 /////////////////////
972
[475]973 std::string mainWndSbpPath = "";
974 if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE)
975 {
[477]976 mainWndSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\MainWnd_exe_windowbase.sbp";
[3]977 }
978 else if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX)
[475]979 {
[477]980 mainWndSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\MainWnd_exe_directx.sbp";
[475]981 }
[3]982
[475]983 if( !mainWndSbpPath.empty() ){
984 pTemp = ReadBuffer( mainWndSbpPath );
[3]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をコピー
[477]1024 const std::string dxGraphicsSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dx\\dx_graphics.sbp";
[475]1025 pTemp = ReadBuffer( dxGraphicsSbpPath );
[3]1026 sprintf(temporary,"%sdx_graphics.sbp",dir,NewProjectInfo.name);
1027 WriteBuffer(temporary,pTemp,lstrlen(pTemp));
1028 HeapDefaultFree(pTemp);
1029
1030 //dx_input.sbpをコピー
[477]1031 const std::string dxInputSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dx\\dx_input.sbp";
[475]1032 pTemp = ReadBuffer( dxInputSbpPath );
[3]1033 sprintf(temporary,"%sdx_input.sbp",dir,NewProjectInfo.name);
1034 WriteBuffer(temporary,pTemp,lstrlen(pTemp));
1035 HeapDefaultFree(pTemp);
1036
1037 //dx_music.sbpをコピー
[477]1038 const std::string dxMusicSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dx\\dx_music.sbp";
[475]1039 pTemp = ReadBuffer( dxMusicSbpPath );
[3]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 /////////////////////////////////////////
[624]1056 ActiveBasic::PM::WindowInfos windowInfos;
1057 windowInfos.push_back( new ActiveBasic::PM::WindowInfo() );
[617]1058 windowInfos.back()->SetName( "MainWnd" );
1059 windowInfos.back()->SetHandleName( "hMainWnd" );
[615]1060 windowInfos.back()->pos.x=CW_USEDEFAULT;
1061 windowInfos.back()->pos.y=CW_USEDEFAULT;
1062 windowInfos.back()->size.cx=480;
1063 windowInfos.back()->size.cy=360;
[624]1064 windowInfos.back()->SetCaption( NewProjectInfo.name );
[3]1065 if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE)
[624]1066 {
1067 windowInfos.back()->SetStyle( WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_VISIBLE );
1068 }
[3]1069 else if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX)
[624]1070 {
1071 windowInfos.back()->SetStyle( WS_OVERLAPPED|WS_THICKFRAME|WS_SYSMENU );
1072 }
1073 windowInfos.back()->SetExStyle( 0 );
1074 windowInfos.back()->SetMenuIdName( "" );
1075 windowInfos.back()->SetBackgroundColor( COLOR_3DFACE );
[615]1076 GetDefaultWindowFont(&windowInfos.back()->LogFont);
[624]1077 windowInfos.back()->SetIconResourceName( "" );
1078 windowInfos.back()->SetClassName( "NORMAL" );
[615]1079 windowInfos.back()->CallBackName="MainWndProc";
1080 windowInfos.back()->type=WNDTYPE_DEFAULT;
1081 windowInfos.back()->filepath="MainWnd.ab";
[3]1082 sprintf(temporary,"%s%s.wnd",dir,NewProjectInfo.name);
1083
[618]1084 projectInfo.NumberOfMenu=0;
[609]1085 SaveWindowFile( temporary, windowInfos );
[617]1086
1087 windowInfos.Clear();
[3]1088 }
1089
1090
1091 ////////////////////////
1092 // ワークファイルを作成
1093 ////////////////////////
1094 lstrcpy(buffer,"case4\r\n\r\n");
1095 if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE){
1096 lstrcat(buffer,"rad,MainWnd\r\n\r\n");
1097 }
1098 else{
1099 sprintf(buffer+lstrlen(buffer),"text,\"%s.ab\",0,0,0,0\r\n\r\n",NewProjectInfo.name);
1100 }
1101 lstrcat(buffer,"0\r\n0\r\n0\r\n0,0");
1102 //保存
1103 sprintf(temporary,"%s%s.wrk",dir,NewProjectInfo.name);
1104 if(!WriteBuffer(temporary,buffer,lstrlen(buffer))) return;
1105
1106
1107 //マニフェストを作成
1108 char temp2[MAX_PATH];
[477]1109 const std::string manifestTempXmlPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\manifest_temp.xml";
[3]1110 sprintf(temp2,"%s%s.manifest.xml",dir,NewProjectInfo.name);
[475]1111 CopyFile( manifestTempXmlPath.c_str(), temp2, 0 );
[3]1112
1113
1114 sprintf(temporary,"%s%s.pj",dir,NewProjectInfo.name);
[621]1115 projectInfo.Load(temporary);
1116 projectInfo.Save();
[3]1117}
1118void SetTreeViewForProjectInfo(){
1119 extern HANDLE hHeap;
1120 extern HWND hProjectView;
1121 int i;
1122 char temporary[MAX_PATH];
1123 TV_INSERTSTRUCT tv;
1124
[619]1125 sprintf(temporary,"%s ",projectInfo.GetName().c_str());
[3]1126 lstrcat(temporary,STRING_PROJECT);
1127 SetWindowText(hProjectView,temporary);
1128
1129 tv.hInsertAfter=TVI_SORT;
1130 tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
1131
1132 //ファイル ツリー
[618]1133 projectInfo.pobj_DBFileInfo->ResetTree();
[3]1134
1135 //関数ツリー
1136 ResetClassTree(-1);
1137
1138 /////////////////////
1139 // マテリアル ツリー
1140
1141 //Cursorリソース フォルダ
1142 sprintf(temporary,"Cursor %s",STRING_RESOURCE);
1143 tv.hParent=TVI_ROOT;
1144 tv.item.iImage=0;
1145 tv.item.iSelectedImage=0;
1146 tv.item.pszText=temporary;
1147 tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
[623]1148 hCursorTreeItemForProjectView = tv.hParent;
[624]1149 BOOST_FOREACH( ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.cursorResources )
1150 {
[3]1151 tv.item.iImage=6;
1152 tv.item.iSelectedImage=6;
[624]1153 lstrcpy( temporary, resourceItem.idName.c_str() );
[623]1154 tv.item.pszText=temporary;
[624]1155 resourceItem.hTreeItem = TreeView_InsertItem(hMaterialTreeView,&tv);
[3]1156 }
1157
1158 //Bitmapリソース フォルダ
1159 sprintf(temporary,"Bitmap %s",STRING_RESOURCE);
1160 tv.hParent=TVI_ROOT;
1161 tv.item.iImage=0;
1162 tv.item.iSelectedImage=0;
1163 tv.item.pszText=temporary;
1164 tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
[623]1165 hBitmapTreeItemForProjectView = tv.hParent;
[624]1166 BOOST_FOREACH( ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.bitmapResources )
1167 {
[3]1168 tv.item.iImage=5;
1169 tv.item.iSelectedImage=5;
[624]1170 lstrcpy( temporary, resourceItem.idName.c_str() );
[623]1171 tv.item.pszText=temporary;
[624]1172 resourceItem.hTreeItem = TreeView_InsertItem(hMaterialTreeView,&tv);
[3]1173 }
1174
1175 //Iconリソース フォルダ
1176 sprintf(temporary,"Icon %s",STRING_RESOURCE);
1177 tv.hParent=TVI_ROOT;
1178 tv.item.iImage=0;
1179 tv.item.iSelectedImage=0;
1180 tv.item.pszText=temporary;
1181 tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
[623]1182 hIconTreeItemForProjectView = tv.hParent;
[624]1183 for(i=0;i<static_cast<int>(projectInfo.resourceManager.iconResources.size());i++){
[3]1184 tv.item.iImage=4;
1185 tv.item.iSelectedImage=4;
1186 if(i==0){
[623]1187 sprintf(temporary,"%s (Main)",projectInfo.resourceManager.iconResources[i].idName.c_str());
[3]1188 }
[623]1189 else
1190 {
1191 sprintf(temporary,"%s",projectInfo.resourceManager.iconResources[i].idName.c_str());
1192 }
1193 tv.item.pszText=temporary;
1194 projectInfo.resourceManager.iconResources[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
[3]1195 }
1196
1197 //Menuフォルダ
1198 tv.hParent=TVI_ROOT;
1199 tv.item.iImage=0;
1200 tv.item.iSelectedImage=0;
1201 tv.item.pszText="Menu";
1202 tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
[618]1203 projectInfo.hMenuTreeItem=tv.hParent;
1204 for(i=0;i<projectInfo.NumberOfMenu;i++){
[3]1205 tv.item.iImage=3;
1206 tv.item.iSelectedImage=3;
[618]1207 tv.item.pszText=projectInfo.pMenuInfo[i].IdName;
1208 projectInfo.pMenuInfo[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
[3]1209 }
1210
1211 //Windowフォルダ
1212 tv.hParent=TVI_ROOT;
1213 tv.item.iImage=0;
1214 tv.item.iSelectedImage=0;
1215 tv.item.pszText="Window";
1216 tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
[618]1217 projectInfo.hWindowTreeItem=tv.hParent;
[624]1218 BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
[609]1219 {
[3]1220 tv.item.iImage=2;
1221 tv.item.iSelectedImage=2;
[617]1222 char temporary[1024];
1223 lstrcpy( temporary, pWindowInfo->GetName().c_str() );
1224 tv.item.pszText = temporary;
[615]1225 pWindowInfo->hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
[3]1226 }
1227}
[619]1228void OpenWorkfile( const std::string &path )
1229{
[3]1230 extern HANDLE hHeap;
1231 int i,i2,i3;
1232 char *buffer,temporary[MAX_PATH],temp2[MAX_PATH];
1233
1234 //プロジェクト ビューを設定、表示
1235 extern HWND hProjectView;
1236 SetTreeViewForProjectInfo();
1237 if(!IsWindowVisible(hProjectView)) SendMessage(hOwner,WM_COMMAND,IDM_PROJECTVIEW,0);
1238
1239
1240 //メニュー状態を設定
1241 ResetState_DocMenu();
1242
1243
1244 //////////////////////////////////////////
1245 //ワークファイル(*.wrk)をオープン
1246 extern MDIINFO MdiInfo[MAX_WNDNUM];
1247 HTREEITEM hTreeItem;
1248 HANDLE hFind;
1249 WIN32_FIND_DATA wfd;
1250 HWND hChild;
1251 int WndNum;
[619]1252 hFind=FindFirstFile(path.c_str(),&wfd);
[3]1253 if(hFind!=INVALID_HANDLE_VALUE){
1254 FindClose(hFind);
[619]1255 buffer=ReadBuffer(path);
[3]1256 if(!buffer) return;
1257
1258 //解析、反映
1259 memcpy(temporary,buffer,5);
1260 temporary[5]=0;
1261 if(lstrcmp(temporary,"case4")==0){
1262
1263 LockWindowUpdate(hOwner);
1264 for(i=9,i2=0;;i++,i2++){
1265 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1266 if(i2!=0){
1267 temporary[i2]=0;
1268 for(i3=0;;i3++){
1269 if(temporary[i3]==','||temporary[i3]=='\0') break;
1270 }
1271 if(temporary[i3]=='\0') goto EndToSetWorkFile;
1272 lstrcpy(temp2,temporary+i3+1);
1273 temporary[i3]=0;
1274 if(lstrcmpi(temporary,"text")==0){
1275 if(temp2[0]!='\"') goto EndToSetWorkFile;
1276
1277 //ファイルを開く
1278 i2=1;
1279 for(i3=0;;i2++,i3++){
1280 if(temp2[i2]=='\"'||temp2[i2]=='\0'){
1281 temporary[i3]=0;
1282 break;
1283 }
1284 temporary[i3]=temp2[i2];
1285 }
[620]1286 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
[3]1287 hChild=OpenFileWithExtension(temporary);
1288 WndNum=GetWndNum(hChild);
1289 if(WndNum==-1){
1290 goto EndToSetWorkFile;
1291 }
1292
1293 //ResetScrollbarが再描画時に呼び出されるので、再描画する
[24]1294 InvalidateRect(MdiInfo[WndNum].pMdiTextEdit->hEdit,NULL,0);
1295 UpdateWindow(MdiInfo[WndNum].pMdiTextEdit->hEdit);
[3]1296
1297 if(temp2[i2]=='\0') goto EndToSetWorkFile;
1298 if(temp2[i2+1]!=',') goto EndToSetWorkFile;
1299
1300 //以前のスクロール位置を復元
1301 SCROLLINFO si;
1302 POINT pos;
1303 for(i2+=2,i3=0;;i2++,i3++){
1304 if(temp2[i2]==','||temp2[i2]=='\0'){
1305 temporary[i3]=0;
1306 break;
1307 }
1308 temporary[i3]=temp2[i2];
1309 }
1310 sscanf(temporary,"%d",&pos.x);
1311 if(temp2[i2]=='\0') goto EndToSetWorkFile;
1312 for(i2++,i3=0;;i2++,i3++){
1313 if(temp2[i2]==','||temp2[i2]=='\0'){
1314 temporary[i3]=0;
1315 break;
1316 }
1317 temporary[i3]=temp2[i2];
1318 }
1319 sscanf(temporary,"%d",&pos.y);
1320 si.cbSize=sizeof(SCROLLINFO);
1321 si.fMask=SIF_POS;
1322 si.nPos=pos.x;
[24]1323 SetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_HORZ,&si,1);
[3]1324 si.nPos=pos.y;
[24]1325 SetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_VERT,&si,1);
[3]1326
1327 if(temp2[i2]=='\0') goto EndToSetWorkFile;
1328
1329 //キャレット位置をセット
1330 for(i2++,i3=0;;i2++,i3++){
1331 if(temp2[i2]==','||temp2[i2]=='\0'){
1332 temporary[i3]=0;
1333 break;
1334 }
1335 temporary[i3]=temp2[i2];
1336 }
1337 sscanf(temporary,"%d",&pos.x);
1338 if(temp2[i2]=='\0') goto EndToSetWorkFile;
1339 for(i2++,i3=0;;i2++,i3++){
1340 if(temp2[i2]==','||temp2[i2]=='\0'){
1341 temporary[i3]=0;
1342 break;
1343 }
1344 temporary[i3]=temp2[i2];
1345 }
1346 sscanf(temporary,"%d",&pos.y);
1347 TextEdit_SetSel(WndNum,pos.x,pos.y);
1348 }
1349 else if(lstrcmpi(temporary,"rad")==0){
[618]1350 for(i3=0;i3<static_cast<int>(projectInfo.windowInfos.size());i3++){
1351 if(lstrcmpi(projectInfo.windowInfos[i3]->GetName().c_str(),temp2)==0){
1352 NewRadWindow( *projectInfo.windowInfos[i3] );
[3]1353 break;
1354 }
1355 }
1356 }
1357 else if(lstrcmpi(temporary,"menu")==0){
[618]1358 for(i3=0;i3<projectInfo.NumberOfMenu;i3++){
1359 if(lstrcmpi(projectInfo.pMenuInfo[i3].IdName,temp2)==0){
1360 NewMenuWindow(&projectInfo.pMenuInfo[i3]);
[3]1361 break;
1362 }
1363 }
1364 }
[624]1365 else if(lstrcmpi(temporary,"icon")==0)
1366 {
1367 BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
1368 {
1369 if(lstrcmpi(resourceItem.filepath.c_str(),temp2)==0){
[620]1370 NewIconEditWindow( projectInfo.GetWorkDir().GetFullPath( temp2 ).c_str() );
[3]1371 break;
1372 }
1373 }
1374 }
1375 i++;
1376 i2=-1;
1377 continue;
1378 }
1379 else break;
1380 }
1381 temporary[i2]=buffer[i];
1382 }
1383
1384 for(i+=2,i2=0;;i++,i2++){
1385 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1386 temporary[i2]=0;
1387 break;
1388 }
1389 temporary[i2]=buffer[i];
1390 }
1391 sscanf(temporary,"%d",&i2);
[84]1392
1393 switch( i2 ){
1394 case 0:
1395 ShowFileView();
1396 break;
1397 case 1:
1398 ShowClassView();
1399 break;
1400 case 2:
1401 ShowMaterialView();
1402 break;
[3]1403 }
[84]1404
[3]1405 if(buffer[i]=='\0') goto EndToSetWorkFile;
1406
1407 for(i+=2,i2=0;;i++,i2++){
1408 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1409 temporary[i2]=0;
1410 break;
1411 }
1412 temporary[i2]=buffer[i];
1413 }
1414 if(temporary[0]=='1') TreeView_Expand(pobj_FileTree->hTree,TreeView_GetRoot(pobj_FileTree->hTree),TVE_EXPAND);
1415
1416 for(i+=2,i2=0;;i++,i2++){
1417 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1418 temporary[i2]=0;
1419 break;
1420 }
1421 temporary[i2]=buffer[i];
1422 }
1423 if(temporary[0]=='1') TreeView_Expand(hProcedureTreeView,TreeView_GetRoot(hProcedureTreeView),TVE_EXPAND);
1424
1425 for(i+=2,i2=0;;i++,i2++){
1426 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1427 temporary[i2]=0;
1428 break;
1429 }
1430 temporary[i2]=buffer[i];
1431 }
1432 hTreeItem=TreeView_GetRoot(hMaterialTreeView);
1433 i2=0;
1434 while(hTreeItem){
1435 i2=GetOneParameter(temporary,i2,temp2);
1436 if(GetValue(temp2)) TreeView_Expand(hMaterialTreeView,hTreeItem,TVE_EXPAND);
1437 hTreeItem=TreeView_GetNextSibling(hMaterialTreeView,hTreeItem);
1438 }
1439 }
1440 else if(lstrcmp(temporary,"case3")==0){
1441 ////////////////////////////////////////
1442 // 古いフォーマットのワークファイル
1443
1444 LockWindowUpdate(hOwner);
1445 for(i=9,i2=0;;i++,i2++){
1446 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1447 if(i2!=0){
1448 temporary[i2]=0;
1449 for(i3=0;;i3++){
1450 if(temporary[i3]==','||temporary[i3]=='\0') break;
1451 }
1452 if(temporary[i3]=='\0') goto EndToSetWorkFile;
1453 lstrcpy(temp2,temporary+i3+1);
1454 temporary[i3]=0;
1455 if(lstrcmpi(temporary,"text")==0){
1456 for(i3=0;;i3++){
1457 if(temp2[i3]==','||temp2[i3]=='\0') break;
1458 }
1459 if(temp2[i3]=='\0') goto EndToSetWorkFile;
1460 lstrcpy(temporary,temp2+i3+1);
1461 temp2[i3]=0;
[620]1462 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
[3]1463 sscanf(temp2,"%d",&i3);
1464
1465 //ファイルを開く
1466 hChild=OpenFileWithExtension(temporary);
1467 WndNum=GetWndNum(hChild);
1468
1469 //キャレット位置をセット
1470 TextEdit_SetSel(WndNum,i3,i3);
1471 }
1472 else if(lstrcmpi(temporary,"rad")==0){
[618]1473 for(i3=0;i3<static_cast<int>(projectInfo.windowInfos.size());i3++){
1474 if(lstrcmpi(projectInfo.windowInfos[i3]->GetName().c_str(),temp2)==0){
1475 NewRadWindow( *projectInfo.windowInfos[i3] );
[3]1476 break;
1477 }
1478 }
1479 }
1480 else if(lstrcmpi(temporary,"menu")==0){
[618]1481 for(i3=0;i3<projectInfo.NumberOfMenu;i3++){
1482 if(lstrcmpi(projectInfo.pMenuInfo[i3].IdName,temp2)==0){
1483 NewMenuWindow(&projectInfo.pMenuInfo[i3]);
[3]1484 break;
1485 }
1486 }
1487 }
1488 else if(lstrcmpi(temporary,"icon")==0){
[624]1489 BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
1490 {
1491 if(lstrcmpi(resourceItem.filepath.c_str(),temp2)==0){
[620]1492 NewIconEditWindow( projectInfo.GetWorkDir().GetFullPath( temp2 ).c_str() );
[3]1493 break;
1494 }
1495 }
1496 }
1497 i++;
1498 i2=-1;
1499 continue;
1500 }
1501 else break;
1502 }
1503 temporary[i2]=buffer[i];
1504 }
1505
1506 for(i+=2,i2=0;;i++,i2++){
1507 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1508 temporary[i2]=0;
1509 break;
1510 }
1511 temporary[i2]=buffer[i];
1512 }
1513 sscanf(temporary,"%d",&i2);
[84]1514
1515 switch( i2 ){
1516 case 0:
1517 ShowFileView();
1518 break;
1519 case 1:
1520 ShowClassView();
1521 break;
1522 case 2:
1523 ShowMaterialView();
1524 break;
[3]1525 }
[84]1526
[3]1527 if(buffer[i]=='\0') goto EndToSetWorkFile;
1528
1529 for(i+=2,i2=0;;i++,i2++){
1530 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1531 temporary[i2]=0;
1532 break;
1533 }
1534 temporary[i2]=buffer[i];
1535 }
1536 if(temporary[0]=='1') TreeView_Expand(pobj_FileTree->hTree,TreeView_GetRoot(pobj_FileTree->hTree),TVE_EXPAND);
1537
1538 for(i+=2,i2=0;;i++,i2++){
1539 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1540 temporary[i2]=0;
1541 break;
1542 }
1543 temporary[i2]=buffer[i];
1544 }
1545 if(temporary[0]=='1') TreeView_Expand(hProcedureTreeView,TreeView_GetRoot(hProcedureTreeView),TVE_EXPAND);
1546
1547 for(i+=2,i2=0;;i++,i2++){
1548 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
1549 temporary[i2]=0;
1550 break;
1551 }
1552 temporary[i2]=buffer[i];
1553 }
1554 hTreeItem=TreeView_GetRoot(hMaterialTreeView);
1555 i2=0;
1556 while(hTreeItem){
1557 i2=GetOneParameter(temporary,i2,temp2);
1558 if(GetValue(temp2)) TreeView_Expand(hMaterialTreeView,hTreeItem,TVE_EXPAND);
1559 hTreeItem=TreeView_GetNextSibling(hMaterialTreeView,hTreeItem);
1560 }
1561 }
1562EndToSetWorkFile:
1563 LockWindowUpdate(NULL);
1564 HeapDefaultFree(buffer);
1565 }
1566
1567
1568 //ウィンドウ タイトルを変更
[619]1569 sprintf(temporary,"%s - %s",projectInfo.GetName().c_str(),APPLICATION_NAME);
[3]1570 SetWindowText(hOwner,temporary);
1571}
1572BOOL ProjectModifyCheck(BOOL bRun){
1573 extern MDIINFO MdiInfo[MAX_WNDNUM];
1574 int i,WndNum,sw;
1575 HWND hChild;
1576 char temporary[MAX_PATH];
[618]1577 if(projectInfo.modify||projectInfo.ModifyOfMaterial||projectInfo.ModifuOfResource){
[3]1578 if(bRun==0||pobj_nv->bSaveCheckProject){
1579 //"\"%s\" プロジェクトは変更されています。保存しますか?"
[619]1580 sprintf(temporary,STRING_MODIFYCHECK_PROJECT,projectInfo.GetName().c_str());
[3]1581 i=MessageBox(hOwner,temporary,APPLICATION_NAME,MB_YESNOCANCEL|MB_ICONEXCLAMATION);
1582
1583 if(i==IDCANCEL) return 0;
[621]1584 if(i==IDYES)
1585 {
1586 projectInfo.Save();
1587 }
[3]1588 }
[621]1589 else
1590 {
1591 projectInfo.Save();
1592 }
[3]1593 return 1;
1594 }
1595 hChild=GetWindow(hClient,GW_CHILD);
1596 while(hChild){
1597 WndNum=GetWndNum(hChild);
1598 sw=0;
1599 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
[24]1600 if( MdiInfo[WndNum].pMdiTextEdit->IsModified() ){
[618]1601 for(i=0;i<projectInfo.pobj_DBFileInfo->iNum;i++){
1602 projectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->GetFullPath(temporary);
[3]1603 if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0) sw=1;
1604 }
1605 }
1606 }
1607 else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
1608 if(MdiInfo[WndNum].MdiIconEditInfo->bModify){
[624]1609 BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
1610 {
1611 lstrcpy(temporary,resourceItem.filepath.c_str());
[620]1612 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
[3]1613 if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0) sw=1;
1614 }
1615 }
1616 }
1617
1618 if(sw){
1619 if(bRun==0||pobj_nv->bSaveCheckProject){
1620 //"\"%s\" プロジェクトは変更されています。保存しますか?"
[619]1621 sprintf(temporary,STRING_MODIFYCHECK_PROJECT,projectInfo.GetName().c_str());
[3]1622 i=MessageBox(hOwner,temporary,APPLICATION_NAME,MB_YESNOCANCEL|MB_ICONEXCLAMATION);
1623
1624 if(i==IDCANCEL) return 0;
[621]1625 if(i==IDYES)
1626 {
1627 projectInfo.Save();
1628 }
[3]1629 }
[621]1630 else
1631 {
1632 projectInfo.Save();
1633 }
[3]1634 return 1;
1635 }
1636 hChild=GetNextWindow(hChild,GW_HWNDNEXT);
1637 }
1638 return 2;
1639}
1640void MakeWorkFile(void){
1641 extern MDIINFO MdiInfo[MAX_WNDNUM];
1642 int i,i2,WndNum;
1643 char temporary[MAX_PATH],buffer[32767];
1644 HWND hChild;
1645 CHARRANGE CharRange;
1646
1647 //ワークファイル(*.wrk)を作成
1648 lstrcpy(buffer,"case4\r\n\r\n");
1649 i2=lstrlen(buffer);
1650
1651
1652 ///////////////////////
1653 //MDIウィンドウの並び
1654 hChild=GetWindow(GetWindow(hClient,GW_CHILD),GW_HWNDLAST);
1655 while(hChild){
1656 WndNum=GetWndNum(hChild);
1657 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
[618]1658 for(i=0;i<projectInfo.pobj_DBFileInfo->iNum;i++){
1659 projectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->GetFullPath(temporary);
[3]1660 if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
1661 TextEdit_GetSel(WndNum,&CharRange);
1662
1663 SCROLLINFO si;
1664 POINT pos;
1665 si.cbSize=sizeof(SCROLLINFO);
1666 si.fMask=SIF_POS;
[24]1667 GetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_HORZ,&si);
[3]1668 pos.x=si.nPos;
[24]1669 GetScrollInfo(MdiInfo[WndNum].pMdiTextEdit->hEdit,SB_VERT,&si);
[3]1670 pos.y=si.nPos;
1671
1672 sprintf(buffer+i2,"text,\"%s\",%d,%d,%d,%d\r\n",
[618]1673 projectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->m_path,
[3]1674 pos.x,
1675 pos.y,
1676 CharRange.cpMin,
1677 CharRange.cpMax);
1678 i2+=lstrlen(buffer+i2);
1679 break;
1680 }
1681 }
1682 }
1683 else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){
[624]1684 BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
[609]1685 {
[617]1686 if(lstrcmpi(MdiInfo[WndNum].path,pWindowInfo->GetName().c_str())==0){
[3]1687 sprintf(buffer+i2,"rad,%s\r\n",MdiInfo[WndNum].path);
1688 i2+=lstrlen(buffer+i2);
1689 break;
1690 }
1691 }
1692 }
1693 else if(MdiInfo[WndNum].DocType==WNDTYPE_MENU){
[618]1694 for(i=0;i<projectInfo.NumberOfMenu;i++){
1695 if(lstrcmpi(MdiInfo[WndNum].path,projectInfo.pMenuInfo[i].IdName)==0){
[3]1696 sprintf(buffer+i2,"menu,%s\r\n",MdiInfo[WndNum].path);
1697 i2+=lstrlen(buffer+i2);
1698 break;
1699 }
1700 }
1701 }
1702 else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
[624]1703 BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
1704 {
1705 lstrcpy(temporary,resourceItem.filepath.c_str());
[620]1706 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
[3]1707 if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0){
[624]1708 sprintf(buffer+i2,"icon,%s\r\n",resourceItem.filepath.c_str());
[3]1709 i2+=lstrlen(buffer+i2);
1710 break;
1711 }
1712 }
1713 }
1714 hChild=GetNextWindow(hChild,GW_HWNDPREV);
1715 }
1716 lstrcpy(buffer+i2,"\r\n");
1717 i2+=2;
1718
1719
1720 //////////////////////////
1721 //ツリービューの展開状況
1722 sprintf(buffer+i2,"%d\r\n",TabCtrl_GetCurSel(hProjectViewTab));
1723 i2+=lstrlen(buffer+i2);
1724 TVITEM tvItem;
1725 memset(&tvItem,0,sizeof(TVITEM));
1726 tvItem.mask=TVIF_HANDLE|TVIF_STATE;
1727 tvItem.hItem=TreeView_GetRoot(pobj_FileTree->hTree);
1728 TreeView_GetItem(pobj_FileTree->hTree,&tvItem);
1729 if(tvItem.state&TVIS_EXPANDED) i=1;
1730 else i=0;
1731 sprintf(buffer+i2,"%d\r\n",i);
1732 i2+=lstrlen(buffer+i2);
1733
1734 tvItem.hItem=TreeView_GetRoot(hProcedureTreeView);
1735 TreeView_GetItem(hProcedureTreeView,&tvItem);
1736 if(tvItem.state&TVIS_EXPANDED) i=1;
1737 else i=0;
1738 sprintf(buffer+i2,"%d\r\n",i);
1739 i2+=lstrlen(buffer+i2);
1740
1741 tvItem.hItem=TreeView_GetRoot(hMaterialTreeView);
1742 while(tvItem.hItem){
1743 TreeView_GetItem(hMaterialTreeView,&tvItem);
1744 if(tvItem.state&TVIS_EXPANDED) i=1;
1745 else i=0;
1746 sprintf(buffer+i2,"%d",i);
1747 i2+=lstrlen(buffer+i2);
1748
1749 tvItem.hItem=TreeView_GetNextSibling(hMaterialTreeView,tvItem.hItem);
1750 if(tvItem.hItem){
1751 lstrcpy(buffer+i2,",");
1752 i2+=lstrlen(buffer+i2);
1753 }
1754 }
1755
1756
1757 //保存
[620]1758 sprintf(temporary,"%s%s.wrk",projectInfo.GetWorkDir().GetPath().c_str(),projectInfo.GetName().c_str());
[3]1759 WriteBuffer(temporary,buffer,i2);
1760}
1761
1762BOOL SetProjectToRun(void){
1763 HANDLE hFind;
1764 WIN32_FIND_DATA wfd;
1765
[618]1766 if(projectInfo.pobj_DBFileInfo->iNum==0){
[3]1767 //"プログラム ファイルがプロジェクトに存在しません。"
1768 MessageBox(hOwner,STRING_ERROR_NOFILE,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
1769 return 0;
1770 }
1771
[477]1772 extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
1773 hFind=FindFirstFile( ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ).c_str(), &wfd );
[3]1774 if(hFind==INVALID_HANDLE_VALUE){
1775 //"BasicCompiler.exe が見つかりません"
1776 MessageBox(hOwner,STRING_ERROR_NOBASICCOMPILER,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
1777 return 0;
1778 }
1779 FindClose(hFind);
1780
1781 //プロジェクト構造のバージョンが違う時は、再保存する
[618]1782 if(projectInfo.dwVersion<PROJECT_VERSION)
1783 projectInfo.ModifyOfMaterial=1;
[3]1784
1785 //保存確認
1786 if(!ProjectModifyCheck(1)) return 0;
1787
1788 return 1;
1789}
1790BOOL IsNeedCompileForProject(BOOL bDebug){
1791 int i2;
1792 char temporary[MAX_PATH];
1793 HANDLE hFind,hFile;
1794 WIN32_FIND_DATA wfd;
1795 FILETIME SourceTime,ExeTime;
1796
[618]1797 if(bDebug) lstrcpy(temporary,projectInfo.lpszOutput_Debug);
1798 else lstrcpy(temporary,projectInfo.lpszOutput_Release);
[620]1799 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
[3]1800
1801 hFind=FindFirstFile(temporary,&wfd);
1802 if(hFind==INVALID_HANDLE_VALUE) return 1;
1803 FindClose(hFind);
1804
1805 hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
1806 GetFileTime(hFile,NULL,NULL,&ExeTime);
1807 CloseHandle(hFile);
1808
[618]1809 for(i2=0;i2<projectInfo.pobj_DBFileInfo->iNum;i2++){
1810 projectInfo.pobj_DBFileInfo->ppobj_FileInfo[i2]->GetFullPath(temporary);
[3]1811 hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
1812 GetFileTime(hFile,NULL,NULL,&SourceTime);
1813 CloseHandle(hFile);
1814
1815 if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
1816 SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
1817 SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
1818 }
[618]1819 if( !projectInfo.windowInfos.empty() )
[609]1820 {
[3]1821 //CallBack.wbp
1822 lstrcpy(temporary,"CallBack.wbp");
[620]1823 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
[3]1824 hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
1825 GetFileTime(hFile,NULL,NULL,&SourceTime);
1826 CloseHandle(hFile);
1827 if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
1828 SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
1829 SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
1830
1831 //MakeWindow.wbp
1832 lstrcpy(temporary,"MakeWindow.wbp");
[620]1833 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
[3]1834 hFile=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
1835 GetFileTime(hFile,NULL,NULL,&SourceTime);
1836 CloseHandle(hFile);
1837 if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
1838 SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
1839 SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
1840 }
1841 return 0;
1842}
Note: See TracBrowser for help on using the repository browser.