source: dev/trunk/ab5.0/abdev/abdev/src/MainFrame.cpp@ 620

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

Projectクラスをリファクタリング中。

File size: 41.3 KB
Line 
1#include "stdafx.h"
2
3using namespace ActiveBasic::IDE;
4using namespace ActiveBasic::IDE::WindowComponents;
5
6LRESULT CALLBACK WindowFunc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
7void SetupWindow(HWND hwnd);
8void ResetTextEditFont(HWND hwnd);
9
10void MainFrame::OpenWebBrowser( const std::string &url )
11{
12 ShellExecute(m_hWnd,"open",url.c_str(),"",NULL,SW_SHOWNORMAL);
13}
14
15void MainFrame::OpenExplorer( const std::string &path )
16{
17 ShellExecute(m_hWnd,"explore",path.c_str(),NULL,NULL,SW_SHOWNORMAL);
18}
19
20::LRESULT MainFrame::OnCreate( ::UINT msg, ::WPARAM wParam, ::LPARAM lParam, ::BOOL& handled )
21{
22 // ウィンドウエリアマネージャに親ウィンドウを登録
23 wam.SetParentWnd( m_hWnd );
24
25 RECT rect;
26 GetClientRect( &rect );
27
28 // MDIベースを作成
29 mdiWindow = new MdiWindow();
30 mdiWindow->Create(
31 m_hWnd,
32 rect,
33 NULL,
34 WS_CHILD
35 );
36 wam.AddMdiWindow( mdiWindow );
37
38
39
40
41
42 extern HWND hOwner;
43 hOwner = m_hWnd;
44 extern WNDPROC oldMainFrameWndProc;
45 oldMainFrameWndProc = (WNDPROC)::GetWindowLong( hOwner, GWL_WNDPROC );
46 ::SetWindowLong( hOwner, GWL_WNDPROC, (LONG)WindowFunc );
47
48 SetupWindow(hOwner);
49
50 //テキストエディタフォント設定
51 ResetTextEditFont(hOwner);
52
53
54
55 return 0;
56}
57
58void MainFrame::OnSize(UINT nType, CSize size)
59{
60 //mdiWindow->MoveWindow( 0, 0, size.cx, size.cy );
61}
62
63BOOL MainFrame::OnQueryEndSession(UINT nSource, UINT uLogOff)
64{
65 OnClose();
66
67 return TRUE;
68}
69
70void MainFrame::OnClose()
71{
72 extern BOOL bSearchingClasses;
73 if(bSearchingClasses){
74 pobj_ClassTreeView->bCloseSwitch=1;
75 return;
76 }
77
78 //コンパイラビューを閉じる
79 extern HWND hCompileView;
80 if( hCompileView && ::IsWindow( hCompileView ) )
81 {
82 SendMessage(hCompileView,WM_COMMAND,IDCANCEL,0);
83 }
84
85 //次回起動時にMDIウィンドウを最大化させるかを判定
86 HWND hChild=::GetWindow(hClient,GW_CHILD);
87 pobj_nv->bMDIZoomed=::IsZoomed(hChild);
88
89 //プロジェクトを閉じる
90 if( projectInfo.IsOpened() ){
91 if(!projectInfo.Close()) return;
92 }
93
94 //MDIウィンドウの保存確認
95 hChild=::GetWindow(hClient,GW_CHILD);
96 while(hChild){
97 if(!DocumentModifyCheck(hChild)) return;
98 hChild=::GetNextWindow(hChild,GW_HWNDNEXT);
99 }
100
101
102 KillTimer(ID_TIMER_BACKUP);
103
104
105 //ProjectViewの位置を保存、ProjectViewを破棄
106 extern HWND hProjectView;
107 extern HWND hProjectView_ToolWindow;
108 ::GetWindowRect(hProjectView_ToolWindow,&pobj_nv->rectProjectView);
109 ::DestroyWindow(hProjectView);
110 ::DestroyWindow(hProjectView_ToolWindow);
111
112 //Rebarの位置を保存、Rebarを破棄
113 delete pobj_Rebar;
114 pobj_Rebar=0;
115
116 //タブコントロールを破棄
117 delete pobj_MainTab;
118 pobj_MainTab=0;
119
120 //SideWebを破棄
121 delete pobj_SideWeb;
122 pobj_SideWeb=0;
123
124 //メインウィンドウの最大化有無、座標を保存
125 if(IsZoomed()) pobj_nv->bWindowMax=1;
126 else if(!IsIconic()){
127 pobj_nv->bWindowMax=0;
128 GetWindowRect(&pobj_nv->StartupWindowRect);
129 }
130
131 hChild=::GetWindow(hClient,GW_CHILD);
132 while(hChild){
133 CloseDocWindow(GetWndNum(hChild));
134 ::DestroyWindow(hChild);
135 hChild=::GetWindow(hClient,GW_CHILD);
136 }
137
138 EndProjectEditor(); //ProjectEditorの情報を保存
139
140 //エディタ用フォントを破棄
141 extern HFONT hFont_TextEdit,hFont_HyperLink_TextEdit;
142 if(hFont_TextEdit) DeleteObject(hFont_TextEdit);
143 if(hFont_HyperLink_TextEdit) DeleteObject(hFont_HyperLink_TextEdit);
144
145 DestroyWindow();
146}
147void MainFrame::OnDestroy()
148{
149 mdiWindow->DestroyWindow();
150 delete mdiWindow;
151
152 ::PostQuitMessage( 0 );
153}
154
155void backup(void *dummy);
156void MainFrame::OnTimer( UINT_PTR id )
157{
158 switch( id )
159 {
160 case ID_TIMER_BACKUP:
161 _beginthread( backup, 0, 0 );
162 break;
163
164#ifndef THETEXT
165 case ID_DEBUGSAFTY:
166 {
167 //BasicCompiler.exeが強制終了しているかどうかを検証
168 extern CDebugger *pobj_Debugger;
169 pobj_Debugger->SaftyCheck();
170 break;
171 }
172#endif
173 }
174}
175
176void ResetState_EditMenu(void);
177void MainFrame::OnDrawClipboard()
178{
179 ResetState_EditMenu();
180}
181
182void MenuAdvice(WPARAM msg);
183void MainFrame::OnMenuSelect( UINT nItemID, UINT nFlags, HMENU menu )
184{
185 MenuAdvice( nItemID );
186}
187
188void MainFrame::OnInitMenu( HMENU menu )
189{
190 extern CNonVolatile *pobj_nv;
191 extern CSubMenuEx *pobj_FileHistoryMenu;
192 pobj_nv->pobj_History->ResetFileMenu(pobj_FileHistoryMenu,1);
193#ifndef THETEXT
194 extern CSubMenuEx *pobj_ProjectHistoryMenu;
195 pobj_nv->pobj_ProjectHistory->ResetFileMenu(pobj_ProjectHistoryMenu,0);
196#endif
197}
198
199void MainFrame::OnMeasureItem( int nIDCtl, LPMEASUREITEMSTRUCT lpMI )
200{
201 if(lpMI->CtlType==ODT_MENU){
202 SIZE size;
203 CMenuItemData *pobj_MenuItemData;
204 pobj_MenuItemData=(CMenuItemData *)lpMI->itemData;
205 if(pobj_MenuItemData->pobj_ThisMenu->hMenu==pobj_MainMenu->hMenu){
206 //メインメニューの親アイテム
207 pobj_MainMenu->GetItemSize(pobj_MenuItemData->item_index,&size);
208 lpMI->itemWidth = size.cx;
209 lpMI->itemHeight = size.cy;
210 }
211 else{
212 //メインメニューにぶらさがるサブメニュー
213 pobj_MenuItemData->pobj_ThisMenu->GetItemSize(pobj_MenuItemData->item_index,&size);
214 lpMI->itemWidth = size.cx;
215 lpMI->itemHeight = size.cy;
216 }
217 }
218}
219
220void MainFrame::OnDrawItem( int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct )
221{
222 if(lpDrawItemStruct->CtlType==ODT_MENU){
223 if(!pobj_MainMenu) return;
224
225 CMenuItemData *pobj_MenuItemData;
226 pobj_MenuItemData=(CMenuItemData *)lpDrawItemStruct->itemData;
227 if(pobj_MainMenu->hMenu==pobj_MenuItemData->pobj_ThisMenu->hMenu){
228 //メインメニューの親アイテム
229 pobj_MainMenu->OwnerDrawMenu(lpDrawItemStruct->hDC,
230 &lpDrawItemStruct->rcItem,
231 (lpDrawItemStruct->itemState&ODS_SELECTED)!=0,
232 pobj_MenuItemData->item_index);
233 }
234 else{
235 //メインメニューにぶらさがるサブメニュー
236 pobj_MainMenu->OwnerDrawSubMenu(pobj_MenuItemData->pobj_ThisMenu->hMenu,
237 lpDrawItemStruct->hDC,
238 &lpDrawItemStruct->rcItem,
239 (lpDrawItemStruct->itemState&ODS_SELECTED)!=0,
240 pobj_MenuItemData->item_index);
241 }
242 }
243}
244
245LRESULT MainFrame::OnNotify( int idCtrl, LPNMHDR pnmh )
246{
247 NMPGCALCSIZE *lpCalcSize;
248 NMPGSCROLL *lpScroll;
249
250 if(!pnmh) return 0;
251 LPTOOLTIPTEXT TipText=(LPTOOLTIPTEXT)pnmh;
252 if(TipText->hdr.code==TTN_NEEDTEXT) ShowToolTipText(TipText);
253
254 extern HWND hStandardToolbarPager;
255 extern HWND hDebuggerToolbarPager;
256 if(pobj_Rebar){
257 //レバーオブジェクトが存在するとき
258 if(pnmh->hwndFrom==pobj_Rebar->hRebar&&pnmh->code==RBN_HEIGHTCHANGE){
259 ResizeOwnerWnd();
260 return 0;
261 }
262 }
263 if(pnmh->hwndFrom==hStandardToolbarPager){
264 if(pnmh->code==PGN_CALCSIZE){
265 lpCalcSize=(LPNMPGCALCSIZE)pnmh;
266 if(lpCalcSize->dwFlag==PGF_CALCWIDTH)
267 lpCalcSize->iWidth=BMPNUM_STANDARDTOOLBAR*23+SEPNUM_STANDARDTOOLBAR*8;
268 }
269 else if(pnmh->code==PGN_SCROLL){
270 lpScroll=(LPNMPGSCROLL)pnmh;
271 lpScroll->iScroll=20;
272 }
273 }
274 else if(pnmh->hwndFrom==hDebuggerToolbarPager){
275 if(pnmh->code==PGN_CALCSIZE){
276 lpCalcSize=(LPNMPGCALCSIZE)pnmh;
277 if(lpCalcSize->dwFlag==PGF_CALCWIDTH)
278 lpCalcSize->iWidth=BMPNUM_DEBUGGERTOOLBAR*23+SEPNUM_DEBUGGERTOOLBAR*8;
279 }
280 else if(pnmh->code==PGN_SCROLL){
281 lpScroll=(LPNMPGSCROLL)pnmh;
282 lpScroll->iScroll=20;
283 }
284 }
285
286 if(pobj_MainTab){
287 if(pnmh->hwndFrom==pobj_MainTab->hTab){
288 if(pnmh->code==TCN_SELCHANGE)
289 pobj_MainTab->SelChangeEvent();
290
291 if(pnmh->code==NM_RCLICK){
292
293 TCHITTESTINFO tcHitTest;
294 GetCursorPos(&tcHitTest.pt);
295 ::ScreenToClient(pobj_MainTab->hTab,&tcHitTest.pt);
296 int index = TabCtrl_HitTest(pobj_MainTab->hTab,&tcHitTest);
297 if( index == -1 ) return 0;
298
299 TabCtrl_SetCurSel(pobj_MainTab->hTab,index);
300
301 pobj_MainTab->SelChangeEvent();
302
303
304 /////////////////////
305 // メニューを表示
306 /////////////////////
307
308 HWND hChild=::GetWindow(hClient,GW_CHILD);
309 int WndNum=GetWndNum(hChild);
310
311 //保存コマンドの文字列をセット
312 char temporary[1024], temp2[1024];
313 MENUITEMINFO mii;
314 mii.cbSize=sizeof(MENUITEMINFO);
315 mii.fMask=MIIM_TYPE;
316 mii.dwTypeData=temporary;
317 mii.fType=MFT_STRING;
318 if(MdiInfo[WndNum].path[0]){
319 _splitpath(MdiInfo[WndNum].path,NULL,NULL,temporary,temp2);
320 lstrcat(temporary,temp2);
321 lstrcat(temporary," を保存(&S)");
322 }
323 else{
324 lstrcpy(temporary,"保存(&S)");
325 }
326 extern HMENU hTabMenu;
327 SetMenuItemInfo(hTabMenu,IDM_SAVE,FALSE,&mii);
328
329 /*「絶対パスをコピー」「フォルダを開く」「ファイルを削除」
330 コマンドを場合によって無効化にする */
331 if(MdiInfo[WndNum].path[0]){
332 EnableMenuItem(hTabMenu,IDM_PATH_COPY,MF_BYCOMMAND|MF_ENABLED);
333 EnableMenuItem(hTabMenu,IDM_FOLDER_OPEN,MF_BYCOMMAND|MF_ENABLED);
334 EnableMenuItem(hTabMenu,IDM_DELETE_FILE,MF_BYCOMMAND|MF_ENABLED);
335 }
336 else{
337 EnableMenuItem(hTabMenu,IDM_PATH_COPY,MF_BYCOMMAND|MF_GRAYED);
338 EnableMenuItem(hTabMenu,IDM_FOLDER_OPEN,MF_BYCOMMAND|MF_GRAYED);
339 EnableMenuItem(hTabMenu,IDM_DELETE_FILE,MF_BYCOMMAND|MF_GRAYED);
340 }
341
342 POINT MousePos;
343 GetCursorPos(&MousePos);
344 TrackPopupMenu(hTabMenu,TPM_LEFTALIGN|TPM_RIGHTBUTTON,MousePos.x,MousePos.y,0,hOwner,NULL);
345 }
346 }
347 }
348 if(pobj_SideWeb){
349 if(pnmh->hwndFrom==pobj_SideWeb->hTab&&pnmh->code==TCN_SELCHANGE){
350 pobj_SideWeb->SelChangeEvent();
351 }
352 }
353
354 return 0;
355}
356
357void MainFrame::OnDropFiles( HDROP hDropInfo )
358{
359 int max = DragQueryFile(hDropInfo,-1,0,0);
360 for(int i=0;i<max;i++){
361 char temporary[1024];
362 DragQueryFile(hDropInfo,i,temporary,MAX_PATH);
363 OpenFileWithExtension(temporary);
364 }
365 DragFinish(hDropInfo);
366}
367
368::LRESULT MainFrame::OnShowSourceLine( ::UINT msg, ::WPARAM wParam, ::LPARAM lParam, ::BOOL& handled )
369{
370 char temporary[1024];
371
372 //エラー部分を反転表示
373 DWORD AccBytes;
374 HANDLE fh;
375 sprintf(temporary,"%spgm.tmp",pj_editor_Dir);
376 fh=CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
377 ReadFile(fh,temporary,MAX_PATH,&AccBytes,NULL);
378 CloseHandle(fh);
379 temporary[AccBytes]=0;
380 HWND hChild=::GetWindow(hClient,GW_CHILD);
381 int WndNum = -1;
382 while(hChild){
383 WndNum=GetWndNum(hChild);
384 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
385 if(lstrcmpi(MdiInfo[WndNum].path,temporary)==0) break;
386 }
387 hChild=::GetNextWindow(hChild,GW_HWNDNEXT);
388 }
389 if(!hChild){
390 hChild=OpenFileWithExtension(temporary);
391 WndNum=GetWndNum(hChild);
392 }
393
394 if(WndNum==-1) return 0;
395
396 //ウィンドウを最前面に表示
397 ::BringWindowToTop(hChild);
398 ::UpdateWindow(hChild);
399
400 char *pTemp=MdiInfo[WndNum].pMdiTextEdit->buffer;
401
402 //行の先頭インデックスを取得(取得する行の番号はwParamで渡される)
403 int i,i2;
404 for(i=0,i2=0;;i++){
405 if(i2>=(int)wParam) break;
406 if(pTemp[i]=='\0') break;
407 if(pTemp[i]=='\r'&&pTemp[i+1]=='\n'){
408 i++;
409 i2++;
410 }
411 }
412 POINT pos;
413 pos.x=i;
414
415 //行の終端インデックスを取得
416 for(;;i++){
417 if(pTemp[i]=='\0') break;
418 if(pTemp[i]=='\r'&&pTemp[i+1]=='\n') break;
419 }
420 pos.y=i;
421
422 //行を選択する
423 TextEdit_SetSel(WndNum,pos.x,pos.y,TRUE);
424
425 return 0;
426}
427
428void MainFrame::OnCmdNew( UINT uNotifyCode, int nID, CWindow wndCtl )
429{
430
431#ifdef THETEXT
432 NewTextEditWindow(NULL,WNDTYPE_TEXT);
433 return;
434#else
435 int FileType;
436 BOOL bAddToProject;
437 char temporary[MAX_PATH];
438
439 FileType=DialogBox(hResInst,MAKEINTRESOURCE(IDD_NEWFILE),hOwner,(DLGPROC)DlgNewFile);
440 if(FileType==-1) return;
441
442 if(FileType&0x00008000){
443 bAddToProject=1;
444 FileType&=0x0FFF;
445 extern char NewFileName[MAX_PATH];
446 lstrcpy(temporary,NewFileName);
447 if(!strstr(temporary,".")) lstrcat(temporary,".ab");
448
449 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
450 }
451 else bAddToProject=0;
452
453 switch(FileType){
454 case FT_BASICPROGRAM: //Basicプログラム
455 case FT_SUBPROGRAM:
456 if(bAddToProject){
457 WriteBuffer(temporary,0,0);
458 NewTextEditWindow(temporary,WNDTYPE_BASIC);
459 Project_File_Insert(temporary);
460 }
461 else NewTextEditWindow(NULL,WNDTYPE_BASIC);
462 break;
463
464 case FT_PROJECT:
465 DlgNewProjectWizard(hOwner);
466 break;
467
468 case FT_TEXT:
469 NewTextEditWindow(NULL,WNDTYPE_TEXT);
470 break;
471
472 case FT_HTML:
473 NewTextEditWindow(NULL,WNDTYPE_HTML);
474 break;
475
476 case FT_ICON:
477 NewIconEditWindow(NULL);
478 break;
479 }
480#endif
481}
482
483void MainFrame::OnCmdOpen( UINT uNotifyCode, int nID, CWindow wndCtl )
484{
485 //"ファイルを指定してください"
486 extern LPSTR DefFileFilter;
487 char temporary[1024];
488 if(!GetFilePathDialog(m_hWnd,temporary,DefFileFilter,STRING_FILEOPENTITLE_DEFAULT,TRUE)) return;
489
490 OpenFileWithExtension( temporary );
491}
492
493void MainFrame::OnCmdClose( UINT uNotifyCode, int nID, CWindow wndCtl )
494{
495 HWND hChild=::GetWindow(hClient,GW_CHILD);
496 if(::IsWindow(hChild)) SendMessage(hChild,WM_CLOSE,0,0);
497}
498
499void MainFrame::OnCmdProjectOpen( UINT uNotifyCode, int nID, CWindow wndCtl )
500{
501 //"プロジェクト ファイルを指定して下さい"
502 extern LPSTR ProjectFileFilter;
503 char temporary[1024];
504 if(!GetFilePathDialog(m_hWnd,temporary,ProjectFileFilter,STRING_FILEOPENTITLE_PROJECT,TRUE))
505 {
506 return;
507 }
508
509 projectInfo.Open(temporary);
510}
511
512void MainFrame::OnCmdProjectSave( UINT uNotifyCode, int nID, CWindow wndCtl )
513{
514 SaveProject();
515}
516
517void MainFrame::OnCmdProjectClose( UINT uNotifyCode, int nID, CWindow wndCtl )
518{
519 projectInfo.Close();
520}
521
522void MainFrame::OnCmdProjectFolderOpen( UINT uNotifyCode, int nID, CWindow wndCtl )
523{
524 ShellExecute(m_hWnd,"explore",projectInfo.GetWorkDir().GetPath().c_str(),NULL,NULL,SW_SHOWNORMAL);
525}
526
527void MainFrame::OnCmdSave( UINT uNotifyCode, int nID, CWindow wndCtl )
528{
529 SaveDocument(::GetWindow(hClient,GW_CHILD),NULL);
530}
531
532void MainFrame::OnCmdNewSave( UINT uNotifyCode, int nID, CWindow wndCtl )
533{
534 //"保存先のファイルを指定してください"
535 extern LPSTR DefFileFilter;
536 char temporary[1024];
537 if(!GetFilePathDialog(m_hWnd,temporary,DefFileFilter,STRING_FILESAVETITLE_DEFAULT,FALSE)) return;
538
539 SaveDocument(::GetWindow(hClient,GW_CHILD),temporary);
540}
541
542void MainFrame::OnCmdCodeSave( UINT uNotifyCode, int nID, CWindow wndCtl )
543{
544 //文字コードを指定して保存
545 DialogBox(hResInst,MAKEINTRESOURCE(IDD_CODE_SAVE),m_hWnd,(DLGPROC)nkfDlgCodeSave);
546}
547
548void MainFrame::OnCmdAllSave( UINT uNotifyCode, int nID, CWindow wndCtl )
549{
550 for( int i=0;i<MAX_WNDNUM;i++){
551 if(MdiInfo[i].hwnd) SaveDocument(MdiInfo[i].hwnd,NULL);
552 }
553 if( projectInfo.IsOpened() ) SaveProject();
554}
555
556void MainFrame::OnCmdPageSet( UINT uNotifyCode, int nID, CWindow wndCtl )
557{
558 //ページ設定
559 obj_Page.SetupDlg();
560}
561
562void MainFrame::OnCmdPreview( UINT uNotifyCode, int nID, CWindow wndCtl )
563{
564 //プレビュー(Pro版のみ)
565 Preview();
566}
567
568void MainFrame::OnCmdPrintOut( UINT uNotifyCode, int nID, CWindow wndCtl )
569{
570 //印刷
571 Printout();
572}
573
574void MainFrame::OnCmdExit( UINT uNotifyCode, int nID, CWindow wndCtl )
575{
576 SendMessage(WM_CLOSE);
577}
578
579void MainFrame::OnCmdUndo( UINT uNotifyCode, int nID, CWindow wndCtl )
580{
581 HWND hChild=::GetWindow(hClient,GW_CHILD);
582 if(!hChild) return;
583 int WndNum=GetWndNum(hChild);
584 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType))
585 TextEdit_UndoCommand(WndNum);
586 else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD)
587 Rad_UndoCommand(WndNum);
588 else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT)
589 IconEdit_UndoCommand(WndNum);
590}
591
592void MainFrame::OnCmdRedo( UINT uNotifyCode, int nID, CWindow wndCtl )
593{
594 HWND hChild=::GetWindow(hClient,GW_CHILD);
595 if(!hChild) return;
596 int WndNum=GetWndNum(hChild);
597 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType))
598 TextEdit_RedoCommand(WndNum);
599 else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD)
600 Rad_RedoCommand(WndNum);
601 else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT)
602 IconEdit_RedoCommand(WndNum);
603}
604
605void MainFrame::OnCmdCut( UINT uNotifyCode, int nID, CWindow wndCtl )
606{
607 HWND hChild=::GetWindow(hClient,GW_CHILD);
608 int WndNum=GetWndNum(hChild);
609 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
610 HWND hEdit=::GetWindow(hChild,GW_CHILD);
611
612 CHARRANGE CharRange;
613 TextEdit_GetSel(WndNum,&CharRange);
614
615 HGLOBAL hGlobal=(char *)GlobalAlloc(GMEM_MOVEABLE,CharRange.cpMax-CharRange.cpMin+1);
616 char *pTemp=(char *)GlobalLock(hGlobal);
617 memcpy(pTemp,MdiInfo[WndNum].pMdiTextEdit->buffer+CharRange.cpMin,CharRange.cpMax-CharRange.cpMin);
618 pTemp[CharRange.cpMax-CharRange.cpMin]=0;
619 GlobalUnlock(hGlobal);
620
621 //クリップボードに保存
622 OpenClipboard();
623 EmptyClipboard();
624 SetClipboardData(CF_TEXT,hGlobal);
625 CloseClipboard();
626
627 //選択文字列を消去
628 SendMessage(hEdit,WM_KEYDOWN,VK_DELETE,0);
629 }
630 else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){
631 WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[WndNum].path);
632 int indexOfWndInfo = GetWndInfoNum(MdiInfo[WndNum].path);
633
634 //クリップボードに格納するためのデータを用意する
635 pWindowInfo->childWindowInfos[MdiInfo[WndNum].MdiRadInfo->SelectingItem[0]]->pos.x-=17;
636 pWindowInfo->childWindowInfos[MdiInfo[WndNum].MdiRadInfo->SelectingItem[0]]->pos.y-=10;
637 HGLOBAL hGlobal=Rad_GetChildInfoClipboardData(WndNum,indexOfWndInfo);
638 pWindowInfo->childWindowInfos[MdiInfo[WndNum].MdiRadInfo->SelectingItem[0]]->pos.x+=17;
639 pWindowInfo->childWindowInfos[MdiInfo[WndNum].MdiRadInfo->SelectingItem[0]]->pos.y+=10;
640
641 OpenClipboard();
642 EmptyClipboard();
643 extern DWORD dwRadClipboardID;
644 SetClipboardData(dwRadClipboardID,hGlobal);
645 CloseClipboard();
646
647 SendMessage(MdiInfo[WndNum].MdiRadInfo->hRad,WM_COMMAND,IDM_RAD_ITEM_DELETE,0);
648 }
649 else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
650 //クリップボードに格納するためのデータを用意する
651 HGLOBAL hGlobal=IconEdit_GetChildInfoClipboardData(WndNum);
652 if(hGlobal==0) return;
653
654 OpenClipboard();
655 EmptyClipboard();
656 SetClipboardData(CF_BITMAP,hGlobal);
657 CloseClipboard();
658
659 DeleteObject(MdiInfo[WndNum].MdiIconEditInfo->hSelectingBmp);
660 MdiInfo[WndNum].MdiIconEditInfo->SelectLevel=0;
661
662 IconEdit_EraseRect(WndNum,&MdiInfo[WndNum].MdiIconEditInfo->DraggingRect);
663 }
664}
665
666void MainFrame::OnCmdCopy( UINT uNotifyCode, int nID, CWindow wndCtl )
667{
668 HWND hChild=::GetWindow(hClient,GW_CHILD);
669 int WndNum=GetWndNum(hChild);
670 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
671 HWND hEdit = ::GetWindow(hChild,GW_CHILD);
672
673 CHARRANGE CharRange;
674 TextEdit_GetSel(WndNum,&CharRange);
675
676 HGLOBAL hGlobal=(char *)GlobalAlloc(GMEM_MOVEABLE,CharRange.cpMax-CharRange.cpMin+1);
677 char *pTemp=(char *)GlobalLock(hGlobal);
678 memcpy(pTemp,MdiInfo[WndNum].pMdiTextEdit->buffer+CharRange.cpMin,CharRange.cpMax-CharRange.cpMin);
679 pTemp[CharRange.cpMax-CharRange.cpMin]=0;
680 GlobalUnlock(hGlobal);
681
682 //クリップボードに保存
683 OpenClipboard();
684 EmptyClipboard();
685 SetClipboardData(CF_TEXT,hGlobal);
686 CloseClipboard();
687 }
688 else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){
689 int indexOfWndInfo = GetWndInfoNum(MdiInfo[WndNum].path);
690
691 //クリップボードに格納するためのデータを用意する
692 HGLOBAL hGlobal=Rad_GetChildInfoClipboardData(WndNum,indexOfWndInfo);
693
694 OpenClipboard();
695 EmptyClipboard();
696 extern DWORD dwRadClipboardID;
697 SetClipboardData(dwRadClipboardID,hGlobal);
698 CloseClipboard();
699 }
700 else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
701 //クリップボードに格納するためのデータを用意する
702 HGLOBAL hGlobal=IconEdit_GetChildInfoClipboardData(WndNum);
703
704 OpenClipboard();
705 EmptyClipboard();
706 SetClipboardData(CF_BITMAP,hGlobal);
707 CloseClipboard();
708 }
709}
710
711void MainFrame::OnCmdPaste( UINT uNotifyCode, int nID, CWindow wndCtl )
712{
713 HWND hChild=::GetWindow(hClient,GW_CHILD);
714 int WndNum=GetWndNum(hChild);
715 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
716 HWND hEdit=::GetWindow(hChild,GW_CHILD);
717
718 //クリップボードを開く
719 OpenClipboard();
720 HGLOBAL hGlobal=GetClipboardData(CF_TEXT);
721 if(!hGlobal){
722 CloseClipboard();
723 return;
724 }
725
726
727 char *pTemp;
728 if(pobj_nv->bPasteIndent){
729 //インデント整形
730 pTemp=CodeFormatter((char *)GlobalLock(hGlobal));
731 GlobalUnlock(hGlobal);
732 }
733 else pTemp=(char *)GlobalLock(hGlobal);
734
735
736 //テキストエディタの文字列をリプレイス
737 TextEdit_ReplaceUpdateUndoData(WndNum,
738 pTemp,
739 1,
740 1);
741
742 if(pobj_nv->bPasteIndent)
743 HeapDefaultFree(pTemp);
744 else
745 GlobalUnlock(hGlobal);
746
747 //クリップボードを閉じる
748 CloseClipboard();
749
750
751 //キャレット位置までスクロールする
752 TextEdit_ScrollCaret(WndNum,0);
753 ResetCaretPos(WndNum);
754 }
755 else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){
756 OpenClipboard();
757 extern DWORD dwRadClipboardID;
758 HGLOBAL hGlobal=GetClipboardData(dwRadClipboardID);
759 if(!hGlobal){
760 CloseClipboard();
761 return;
762 }
763 Rad_PasteChildInfoClipboardData(WndNum,hGlobal);
764 CloseClipboard();
765 }
766 else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
767 OpenClipboard();
768 HGLOBAL hGlobal=GetClipboardData(CF_BITMAP);
769 if(!hGlobal){
770 CloseClipboard();
771 return;
772 }
773 IconEdit_PasteChildInfoClipboardData(WndNum,(HBITMAP)hGlobal);
774 CloseClipboard();
775 }
776}
777
778void MainFrame::OnCmdDelete( UINT uNotifyCode, int nID, CWindow wndCtl )
779{
780 HWND hChild=::GetWindow(hClient,GW_CHILD);
781 int WndNum=GetWndNum(hChild);
782 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
783 HWND hEdit=::GetWindow(hChild,GW_CHILD);
784 TextEdit_ReplaceUpdateUndoData(WndNum,"",0,1);
785 }
786 else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD)
787 SendMessage(MdiInfo[WndNum].MdiRadInfo->hRad,WM_COMMAND,IDM_RAD_ITEM_DELETE,0);
788}
789
790void MainFrame::OnCmdAllSelect( UINT uNotifyCode, int nID, CWindow wndCtl )
791{
792 HWND hChild=::GetWindow(hClient,GW_CHILD);
793 int WndNum=GetWndNum(hChild);
794 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
795 HWND hEdit=::GetWindow(hChild,GW_CHILD);
796
797 MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x=0;
798 MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y=0;
799
800 GetCaretPosFromBufferIndex(
801 MdiInfo[WndNum].pMdiTextEdit->buffer,
802 lstrlen(MdiInfo[WndNum].pMdiTextEdit->buffer),
803 &MdiInfo[WndNum].pMdiTextEdit->EndCaretPos);
804
805 ::InvalidateRect(hEdit,NULL,0);
806
807 ResetState_EditMenu();
808 }
809 else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){
810 WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[WndNum].path);
811 for(int i3=0;i3<pWindowInfo->childWindowInfos.size();i3++){
812 MdiInfo[WndNum].MdiRadInfo->SelectingItem[i3]=i3;
813 }
814 DrawRadWindow(WndNum,pWindowInfo);
815 }
816}
817
818void MainFrame::OnCmdFind( UINT uNotifyCode, int nID, CWindow wndCtl )
819{
820 DialogBox(hResInst,MAKEINTRESOURCE(IDD_FIND),m_hWnd,(DLGPROC)DlgFind);
821}
822
823void MainFrame::OnCmdPermutation( UINT uNotifyCode, int nID, CWindow wndCtl )
824{
825 DialogBox(hResInst,MAKEINTRESOURCE(IDD_PERMUTATION),m_hWnd,(DLGPROC)DlgPermutation);
826}
827
828void MainFrame::OnCmdConvertX( UINT uNotifyCode, int nID, CWindow wndCtl )
829{
830 TextEdit_Convert( nID );
831}
832
833#ifdef THETEXT
834void MainFrame::OnCmdStringCount( UINT uNotifyCode, int nID, CWindow wndCtl )
835{
836 DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_STRING_COUNT),m_hWnd,(DLGPROC)DlgStringCount,0);
837}
838
839void MainFrame::OnCmdSelStringCount( UINT uNotifyCode, int nID, CWindow wndCtl )
840{
841 DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_STRING_COUNT),m_hWnd,(DLGPROC)DlgStringCount,1);
842}
843#endif
844
845void MainFrame::OnCmdProjectView( UINT uNotifyCode, int nID, CWindow wndCtl )
846{
847 extern HWND hProjectView;
848 bool isCheck = false;
849 if(pobj_nv->bClipProjectView){
850 if(::IsWindowVisible(hProjectView)){
851 ::ShowWindow(hProjectView,SW_HIDE);
852 }
853 else{
854 ::ShowWindow(hProjectView,SW_SHOW);
855 isCheck = true;
856 }
857 }
858 else{
859 extern HWND hProjectView_ToolWindow;
860 if(::IsWindowVisible(hProjectView_ToolWindow)){
861 ::ShowWindow(hProjectView_ToolWindow,SW_HIDE);
862 }
863 else{
864 ::ShowWindow(hProjectView_ToolWindow,SW_SHOW);
865 ::ShowWindow(hProjectView,SW_SHOW);
866 isCheck = true;
867 }
868 }
869 pobj_MainMenu->CheckMenu(IDM_PROJECTVIEW,isCheck);
870
871 //再配置
872 ResizeOwnerWnd();
873
874 ::ShowWindow(hClient,SW_SHOW);
875}
876
877void MainFrame::OnCmdProjectOption( UINT uNotifyCode, int nID, CWindow wndCtl )
878{
879 DlgProjectOptionSetting( m_hWnd );
880}
881
882void MainFrame::OnCmdTopMost( UINT uNotifyCode, int nID, CWindow wndCtl )
883{
884 if(pobj_MainMenu->IsCheck(IDM_TOPMOST)){
885 SetWindowPos( HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
886 pobj_MainMenu->CheckMenu(IDM_TOPMOST,0);
887 }
888 else{
889 SetWindowPos( HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
890 pobj_MainMenu->CheckMenu(IDM_TOPMOST,1);
891 }
892}
893
894void ResetState_ViewMenu(void);
895void MainFrame::OnCmdRightTurn( UINT uNotifyCode, int nID, CWindow wndCtl )
896{
897 pobj_nv->bRightTurn^=1;
898 ResetState_ViewMenu();
899
900 //トップのウィンドウを再描画
901 RedrawAllWindow();
902}
903
904void MainFrame::OnCmdSet( UINT uNotifyCode, int nID, CWindow wndCtl )
905{
906 DlgOptionSetting( m_hWnd );
907}
908
909void CreateProcessWithStdHandle( const std::string &appPath, const std::string &cmdLine)
910{
911 std::string argsStr = (std::string)"\"" + appPath + "\" " + cmdLine;
912 STARTUPINFO si;
913 PROCESS_INFORMATION pi;
914 memset(&si,0,sizeof(STARTUPINFO));
915 si.cb=sizeof(STARTUPINFO);
916 si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
917 si.wShowWindow = SW_HIDE;
918 si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
919 si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
920 si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
921
922 char args[8192];
923 lstrcpy( args, argsStr.c_str() );
924
925 CreateProcess( NULL, args, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi );
926}
927
928#ifndef THETEXT
929void MainFrame::OnCmdDebug( UINT uNotifyCode, int nID, CWindow wndCtl )
930{
931 char temporary[1024], temp2[1024], temp3[1024];
932 if(pobj_Debugger->IsDebugging()){
933 pobj_Debugger->DebugContinue();
934 return;
935 }
936
937 HWND hChild = ::GetWindow(hClient,GW_CHILD);
938 if( projectInfo.IsOpened() ){
939 //プロジェクトが開かれている場合
940 if(!SetProjectToRun()) return;
941
942 //デバッグ用のコマンドライン及び実行可能ファイル(DLLのみ)
943 sprintf(temporary,"%s\r\n%s",projectInfo.szExePath,projectInfo.szCmdLine);
944 sprintf(temp2,"%spgm.tmp",pj_editor_Dir);
945 HANDLE hFile=CreateFile(temp2,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_TEMPORARY,NULL);
946 DWORD dwAccessBytes;
947 WriteFile(hFile,temporary,lstrlen(temporary),&dwAccessBytes,NULL);
948 CloseHandle(hFile);
949
950 //ソースファイル名をtemp2へ
951 projectInfo.pobj_DBFileInfo->ppobj_FileInfo[0]->GetFullPath(temp2);
952
953 //出力ファイル名をtemp3へ
954 lstrcpy(temp3,projectInfo.lpszOutput_Debug);
955 lstrcpy( temp3, projectInfo.GetWorkDir().GetFullPath( temp3 ).c_str() );
956
957 if(IsNeedCompileForProject(1))
958 sprintf(temporary,"\"%s\" \"%s\" /debug /run /wnd:%08x",temp2,temp3,m_hWnd);
959 else
960 sprintf(temporary,"\"%s\" \"%s\" /run /wnd:%08x",temp2,temp3,m_hWnd);
961
962 // DLLオプション
963 if( projectInfo.GetModuleType() == ActiveBasic::Common::TargetModuleType::Dll )
964 {
965 lstrcat(temporary," /dll");
966 }
967
968 // SLLオプション
969 if( projectInfo.GetModuleType() == ActiveBasic::Common::TargetModuleType::Sll )
970 {
971 lstrcat(temporary," /static_library");
972 }
973
974 //Unicodeオプション
975 if(projectInfo.dwOption & PJ_OP_UNICODE) lstrcat(temporary," /unicode");
976
977 //ブレークポイントをセーブ
978 projectInfo.pobj_DBBreakPoint->SaveToTempFile();
979 }
980 else{
981 //単独ソースコード
982 if(!SetRunning(hChild)) return;
983 if(IsNeedCompile(MdiInfo[GetWndNum(hChild)].path,1))
984 sprintf(temporary,"\"%s\" /debug /run /wnd:%08x",MdiInfo[GetWndNum(hChild)].path,m_hWnd);
985 else
986 sprintf(temporary,"\"%s\" /run /wnd:%08x",MdiInfo[GetWndNum(hChild)].path,m_hWnd);
987
988 //ブレークポイントをセーブ
989 extern CDBBreakPoint *pobj_DBBreakPoint;
990 pobj_DBBreakPoint->SaveToTempFile();
991 }
992
993 //コンパイルビューをクリップするかどうか
994 extern BOOL bClipCompileView;
995 if(bClipCompileView){
996 lstrcat(temporary," /clip_compile_view");
997
998 //コンパイラビューを閉じる
999 extern HWND hCompileView;
1000 if(hCompileView==(HWND)-1) return;
1001 if(hCompileView){
1002 hChild=hCompileView;
1003 hCompileView=(HWND)-1;
1004 SendMessage(hChild,WM_COMMAND,IDCANCEL,0);
1005 }
1006
1007 //重複起動防止のため
1008 hCompileView=(HWND)-1;
1009 }
1010
1011 //インクルードディレクトリ
1012 sprintf(temp2," /include_dir:\"%s\"",pobj_nv->GetIncludeDirFullPath().c_str());
1013 lstrcat(temporary,temp2);
1014
1015 extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
1016 CreateProcessWithStdHandle( ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ), temporary );
1017}
1018
1019void MainFrame::OnCmdDebugCompile( UINT uNotifyCode, int nID, CWindow wndCtl )
1020{
1021 char temporary[1024], temp2[1024], temp3[1024];
1022
1023 HWND hChild=::GetWindow(hClient,GW_CHILD);
1024 if( projectInfo.IsOpened() ){
1025 //プロジェクトが開かれている場合
1026 if(!SetProjectToRun()) return;
1027
1028 //ソースファイル名をtemp2へ
1029 projectInfo.pobj_DBFileInfo->ppobj_FileInfo[0]->GetFullPath(temp2);
1030
1031 //出力ファイル名をtemp3へ
1032 lstrcpy(temp3,projectInfo.lpszOutput_Debug);
1033 lstrcpy( temp3, projectInfo.GetWorkDir().GetFullPath( temp3 ).c_str() );
1034
1035 sprintf(temporary,"\"%s\" \"%s\" /debug /wnd:%08x",temp2,temp3,m_hWnd);
1036
1037 //DLLオプション
1038 if( projectInfo.GetModuleType() == ActiveBasic::Common::TargetModuleType::Dll )
1039 {
1040 lstrcat(temporary," /dll");
1041 }
1042
1043 //Unicodeオプション
1044 if(projectInfo.dwOption & PJ_OP_UNICODE) lstrcat(temporary," /unicode");
1045 }
1046 else{
1047 //単独ソースコード
1048 if(!SetRunning(hChild)) return;
1049 sprintf(temporary,"\"%s\" /debug /wnd:%08x",MdiInfo[GetWndNum(hChild)].path,m_hWnd);
1050 }
1051
1052 //コンパイルビューをクリップするかどうか
1053 extern BOOL bClipCompileView;
1054 if(bClipCompileView){
1055 lstrcat(temporary," /clip_compile_view");
1056
1057 //コンパイラビューを閉じる
1058 extern HWND hCompileView;
1059 if(hCompileView==(HWND)-1) return;
1060 if(hCompileView){
1061 hChild=hCompileView;
1062 hCompileView=(HWND)-1;
1063 if( ::IsWindow( hChild ) )
1064 {
1065 SendMessage(hChild,WM_COMMAND,IDCANCEL,0);
1066 }
1067 }
1068
1069 //重複起動防止のため
1070 hCompileView=(HWND)-1;
1071 }
1072
1073 //インクルードディレクトリ
1074 sprintf(temp2," /include_dir:\"%s\"",pobj_nv->GetIncludeDirFullPath().c_str());
1075 lstrcat(temporary,temp2);
1076
1077 extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
1078 CreateProcessWithStdHandle( ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ), temporary );
1079
1080}
1081
1082void MainFrame::OnCmdAttach( UINT uNotifyCode, int nID, CWindow wndCtl )
1083{
1084 char temporary[1024], temp2[1024];
1085
1086 int idProcess;
1087 DWORD dwPlatform;
1088 idProcess=DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_ATTACH),m_hWnd,(DLGPROC)DlgAttach,(LPARAM)&dwPlatform);
1089 if(idProcess==0) return;
1090
1091 sprintf(temporary,"/attach:%08x /wnd:%08x",idProcess,m_hWnd);
1092
1093 //コンパイルビューをクリップするかどうか
1094 extern BOOL bClipCompileView;
1095 if(bClipCompileView){
1096 lstrcat(temporary," /clip_compile_view");
1097
1098 //コンパイラビューを閉じる
1099 extern HWND hCompileView;
1100 if(hCompileView==(HWND)-1) return;
1101 if(hCompileView){
1102 HWND hChild=hCompileView;
1103 hCompileView=(HWND)-1;
1104 SendMessage(hChild,WM_COMMAND,IDCANCEL,0);
1105 }
1106
1107 //重複起動防止のため
1108 hCompileView=(HWND)-1;
1109 }
1110
1111 //インクルードディレクトリ
1112 sprintf(temp2," /include_dir:\"%s\"",pobj_nv->GetIncludeDirFullPath().c_str());
1113 lstrcat(temporary,temp2);
1114
1115 ActiveBasic::Common::Platform::EnumType platform;
1116 if(dwPlatform==IMAGE_FILE_MACHINE_I386)
1117 {
1118 platform = ActiveBasic::Common::Platform::X86;
1119 }
1120 else if(dwPlatform==IMAGE_FILE_MACHINE_AMD64)
1121 {
1122 platform = ActiveBasic::Common::Platform::X64;
1123 }
1124 else
1125 {
1126 throw;
1127 }
1128
1129 extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
1130 CreateProcessWithStdHandle( ActiveBasic::Common::Environment::GetCompilerExePath( platform ), temporary );
1131}
1132
1133void MainFrame::OnCmdReleaseCompile( UINT uNotifyCode, int nID, CWindow wndCtl )
1134{
1135 char temporary[1024], temp2[1024], temp3[1024];
1136
1137 HWND hChild=::GetWindow(hClient,GW_CHILD);
1138 if( projectInfo.IsOpened() ){
1139 //プロジェクトが開かれている場合
1140 if(!SetProjectToRun()) return;
1141
1142 //ソースファイル名をtemp2へ
1143 projectInfo.pobj_DBFileInfo->ppobj_FileInfo[0]->GetFullPath(temp2);
1144
1145 //出力ファイル名をtemp3へ
1146 lstrcpy(temp3,projectInfo.lpszOutput_Release);
1147 lstrcpy( temp3, projectInfo.GetWorkDir().GetFullPath( temp3 ).c_str() );
1148
1149 sprintf(temporary,"\"%s\" \"%s\" /wnd:%08x",temp2,temp3,m_hWnd);
1150
1151 //DLLオプション
1152 if( projectInfo.GetModuleType() == ActiveBasic::Common::TargetModuleType::Dll )
1153 {
1154 lstrcat(temporary," /dll");
1155 }
1156
1157 //Unicodeオプション
1158 if(projectInfo.dwOption & PJ_OP_UNICODE) lstrcat(temporary," /unicode");
1159 }
1160 else{
1161 //単独ソースコード
1162 if(!SetRunning(hChild)) return;
1163 sprintf(temporary,"\"%s\" /wnd:%08x",MdiInfo[GetWndNum(hChild)].path,m_hWnd);
1164 }
1165
1166 //コンパイルビューをクリップするかどうか
1167 extern BOOL bClipCompileView;
1168 if(bClipCompileView){
1169 lstrcat(temporary," /clip_compile_view");
1170
1171 //コンパイラビューを閉じる
1172 extern HWND hCompileView;
1173 if(hCompileView==(HWND)-1) return;
1174 if(hCompileView){
1175 hChild=hCompileView;
1176 hCompileView=(HWND)-1;
1177 SendMessage(hChild,WM_COMMAND,IDCANCEL,0);
1178 }
1179
1180 //重複起動防止のため
1181 hCompileView=(HWND)-1;
1182 }
1183
1184 //インクルードディレクトリ
1185 sprintf(temp2," /include_dir:\"%s\"",pobj_nv->GetIncludeDirFullPath().c_str());
1186 lstrcat(temporary,temp2);
1187
1188 extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
1189 CreateProcessWithStdHandle( ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ), temporary );
1190}
1191
1192void MainFrame::OnCmdReleaseRun( UINT uNotifyCode, int nID, CWindow wndCtl )
1193{
1194 char temporary[1024], temp2[1024], temp3[1024];
1195
1196 HWND hChild=::GetWindow(hClient,GW_CHILD);
1197 if( projectInfo.IsOpened() ){
1198/* //プロジェクトが開かれている場合
1199 if(!SetProjectToRun()) return;
1200
1201 //必要であればリリースコンパイル
1202 if(IsNeedCompileForProject(0))
1203 SendMessage(WM_COMMAND,IDM_RELEASECOMPILE,0);*/
1204
1205 if( projectInfo.GetModuleType() == ActiveBasic::Common::TargetModuleType::Dll )
1206 {
1207 lstrcpy(temporary,projectInfo.szExePath);
1208 }
1209 else{
1210 lstrcpy(temporary,projectInfo.lpszOutput_Debug);
1211 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1212 }
1213 }
1214 else{
1215/* //必要であればリリースコンパイル
1216 if(!SetRunning(hChild)) return;
1217
1218 if(IsNeedCompile(MdiInfo[GetWndNum(hChild)].path,0))
1219 SendMessage(WM_COMMAND,IDM_RELEASECOMPILE,0);*/
1220
1221 //単独ソースコード
1222 _splitpath(MdiInfo[GetWndNum(hChild)].path,temporary,temp2,temp3,NULL);
1223 lstrcat(temporary,temp2);
1224 lstrcat(temporary,temp3);
1225 lstrcat(temporary,".exe");
1226 }
1227
1228 //インクルードディレクトリ
1229 sprintf(temp2," /include_dir:\"%s\"",pobj_nv->GetIncludeDirFullPath().c_str());
1230 lstrcat(temporary,temp2);
1231
1232 ShellExecute(m_hWnd,"open",temporary,NULL,NULL,SW_SHOWNORMAL);
1233}
1234
1235void MainFrame::OnCmdStepIn( UINT uNotifyCode, int nID, CWindow wndCtl )
1236{
1237 pobj_Debugger->StepIn();
1238}
1239
1240void MainFrame::OnCmdStepOver( UINT uNotifyCode, int nID, CWindow wndCtl )
1241{
1242 pobj_Debugger->StepOver();
1243}
1244
1245void MainFrame::OnCmdStepCursor( UINT uNotifyCode, int nID, CWindow wndCtl )
1246{
1247 pobj_Debugger->StepToCursor();
1248}
1249
1250void MainFrame::OnCmdBreakPoint( UINT uNotifyCode, int nID, CWindow wndCtl )
1251{
1252 if( projectInfo.IsOpened() ){
1253 projectInfo.pobj_DBBreakPoint->Event_BreakPoint();
1254 }
1255 else{
1256 extern CDBBreakPoint *pobj_DBBreakPoint;
1257 pobj_DBBreakPoint->Event_BreakPoint();
1258 }
1259}
1260
1261void MainFrame::OnCmdDebugStop( UINT uNotifyCode, int nID, CWindow wndCtl )
1262{
1263 pobj_Debugger->DebugStop();
1264}
1265
1266void MainFrame::OnCmdDebugPause( UINT uNotifyCode, int nID, CWindow wndCtl )
1267{
1268 pobj_Debugger->DebugPause();
1269}
1270
1271#endif // not THETEXT
1272
1273void MainFrame::OnCmdWebLink( UINT uNotifyCode, int nID, CWindow wndCtl )
1274{
1275 switch( nID )
1276 {
1277#ifndef THETEXT
1278 case IDM_COMMUNITY:
1279 OpenWebBrowser( "http://www.activebasic.com/forum/" );
1280 break;
1281 case IDM_COMMU_SEARCH:
1282 OpenWebBrowser( "http://www.activebasic.com/forum/search.php" );
1283 break;
1284 case IDM_COMMU_PM:
1285 OpenWebBrowser( "http://www.activebasic.com/forum/privmsg.php?folder=inbox" );
1286 break;
1287 case ID_COMMU_FORUM1:
1288 OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=1" );
1289 break;
1290 case ID_COMMU_FORUM2:
1291 OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=2" );
1292 break;
1293 case ID_COMMU_FORUM3:
1294 OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=5" );
1295 break;
1296 case ID_COMMU_FORUM4:
1297 OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=3" );
1298 break;
1299 case ID_COMMU_FORUM5:
1300 OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=6" );
1301 break;
1302 case ID_COMMU_FORUM6:
1303 OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=8" );
1304 break;
1305 case ID_COMMU_FORUM7:
1306 OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=4" );
1307 break;
1308 case ID_COMMU_FORUM8:
1309 OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=7" );
1310 break;
1311 case IDM_AB_WEBSITE:
1312 OpenWebBrowser( "http://www.activebasic.com/" );
1313 break;
1314 case IDM_ACTBDL:
1315 OpenWebBrowser( "http://www.activebasic.com/activebasic5/download.htm" );
1316 break;
1317#else
1318 case IDM_DSHOMEPAGE:
1319 OpenWebBrowser( "http://www.discoversoft.net/" );
1320 break;
1321#endif // not THETEXT
1322 default:
1323 throw;
1324 }
1325}
1326
1327void MainFrame::OnCmdTopics( UINT uNotifyCode, int nID, CWindow wndCtl )
1328{
1329 char temporary[1024];
1330#ifdef THETEXT
1331 sprintf(temporary,"%sTopics\\index.html",pj_editor_Dir);
1332 ShellExecute(m_hWnd,"open",temporary,NULL,NULL,SW_SHOWNORMAL);
1333#else
1334 sprintf(temporary,"%sBasicHelp.chm",pj_editor_Dir);
1335 HtmlHelp(NULL,temporary,HH_DISPLAY_TOPIC,0);
1336#endif
1337}
1338
1339void MainFrame::OnCmdAbout( UINT uNotifyCode, int nID, CWindow wndCtl )
1340{
1341 DialogBox(hResInst,MAKEINTRESOURCE(IDD_ABOUT),m_hWnd,(DLGPROC)DialogAbout);
1342}
1343
1344void MainFrame::OnCmdDocSelectBand( UINT uNotifyCode, int nID, CWindow wndCtl )
1345{
1346 pobj_Rebar->ChangeRebarBand(ID_DOCCOMBO);
1347}
1348
1349void MainFrame::OnCmdStandardBand( UINT uNotifyCode, int nID, CWindow wndCtl )
1350{
1351 pobj_Rebar->ChangeRebarBand(ID_STANDARDTOOLBAR);
1352}
1353
1354void MainFrame::OnCmdReleaseBand( UINT uNotifyCode, int nID, CWindow wndCtl )
1355{
1356 pobj_Rebar->ChangeRebarBand(ID_RELEASETOOLBAR);
1357}
1358
1359void MainFrame::OnCmdDebugBand( UINT uNotifyCode, int nID, CWindow wndCtl )
1360{
1361 pobj_Rebar->ChangeRebarBand(ID_DEBUGGERTOOLBAR);
1362}
1363
1364void MainFrame::OnCmdSelectCompilerBand( UINT uNotifyCode, int nID, CWindow wndCtl )
1365{
1366 pobj_Rebar->ChangeRebarBand(ID_SELECTCOMPILERCOMBO);
1367}
1368
1369void MainFrame::OnCmdNoGripper( UINT uNotifyCode, int nID, CWindow wndCtl )
1370{
1371 if(pobj_nv->bNoGripper) pobj_nv->bNoGripper=0;
1372 else pobj_nv->bNoGripper=1;
1373
1374 //レバーコントロールを再生成
1375 pobj_Rebar->ResetRebar();
1376
1377 //メニュー状態を設定
1378 ResetState_DocMenu();
1379}
1380
1381void MainFrame::OnCmdResetRebar( UINT uNotifyCode, int nID, CWindow wndCtl )
1382{
1383 //"ツールバーの配置をすべて初期状態に戻します。\nよろしいですか?"
1384 if( MessageBox(STRING_TOOLBAR_RESET,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION) == IDCANCEL )
1385 {
1386 return;
1387 }
1388
1389 //レバーコントロールを再生成
1390 pobj_Rebar->ResetInitRebar();
1391
1392 //メニュー状態を設定
1393 ResetState_DocMenu();
1394}
1395
1396void MainFrame::OnCmdAllCloseOmitMyself( UINT uNotifyCode, int nID, CWindow wndCtl )
1397{
1398 //このウィンドウ以外をすべて閉じる(&A)
1399 HWND hChild=::GetWindow(hClient,GW_CHILD);
1400 int WndNum=GetWndNum(hChild);
1401 for(int i=0;i<MAX_WNDNUM;i++){
1402 if(i==WndNum) continue;
1403 if(MdiInfo[i].hwnd) SendMessage(MdiInfo[i].hwnd,WM_CLOSE,0,0);
1404 }
1405}
1406
1407void MainFrame::OnCmdPathCopy( UINT uNotifyCode, int nID, CWindow wndCtl )
1408{
1409 HWND hChild=::GetWindow(hClient,GW_CHILD);
1410 int WndNum=GetWndNum(hChild);
1411
1412 //絶対パスをコピー
1413 HGLOBAL hGlobal=(char *)GlobalAlloc(GMEM_MOVEABLE,lstrlen(MdiInfo[WndNum].path)+1);
1414 char *pTemp=(char *)GlobalLock(hGlobal);
1415 lstrcpy(pTemp,MdiInfo[WndNum].path);
1416 GlobalUnlock(hGlobal);
1417
1418 //クリップボードに保存
1419 OpenClipboard();
1420 EmptyClipboard();
1421 SetClipboardData(CF_TEXT,hGlobal);
1422 CloseClipboard();
1423}
1424
1425void MainFrame::OnCmdFolderOpen( UINT uNotifyCode, int nID, CWindow wndCtl )
1426{
1427 HWND hChild=::GetWindow(hClient,GW_CHILD);
1428 int WndNum=GetWndNum(hChild);
1429
1430 char temporary[1024], temp2[1024];
1431 _splitpath(MdiInfo[WndNum].path,temporary,temp2,NULL,NULL);
1432 lstrcat(temporary,temp2);
1433
1434 OpenExplorer( temporary );
1435}
1436
1437void MainFrame::OnCmdDeleteFile( UINT uNotifyCode, int nID, CWindow wndCtl )
1438{
1439 HWND hChild=::GetWindow(hClient,GW_CHILD);
1440 int WndNum=GetWndNum(hChild);
1441
1442 char temporary[1024], temp2[1024];
1443 _splitpath(MdiInfo[WndNum].path,NULL,NULL,temporary,temp2);
1444 lstrcat(temporary,temp2);
1445
1446 lstrcat(temporary," をごみ箱に移動して閉じます。よろしいですか?");
1447 if(MessageBox(temporary,APPLICATION_NAME,MB_OKCANCEL|MB_ICONQUESTION)==IDCANCEL) return;
1448
1449 //ゴミ箱へ
1450 SHFILEOPSTRUCT fo;
1451 fo.hwnd=m_hWnd;
1452 fo.wFunc=FO_DELETE;
1453 fo.pFrom =MdiInfo[WndNum].path;
1454 fo.pTo="\0";
1455 fo.fFlags =FOF_ALLOWUNDO|FOF_NOCONFIRMATION;
1456 SHFileOperation(&fo);
1457
1458 //閉じる
1459 MdiInfo[WndNum].pMdiTextEdit->UnModify();
1460 SendMessage(MdiInfo[WndNum].hwnd,WM_CLOSE,0,0);
1461}
1462
1463void MainFrame::OnCmdColor( UINT uNotifyCode, int nID, CWindow wndCtl )
1464{
1465 static COLORREF colorUser=RGB(255,255,255);
1466
1467 switch( nID )
1468 {
1469 case IDM_USER_COLOR:
1470 {
1471 CHOOSECOLOR cc;
1472 COLORREF CusColors[16]={
1473 RGB(255,255,255),
1474 RGB(0,0,0),
1475 RGB(128,128,128),
1476 RGB(192,192,192),
1477 RGB(128,0,0),
1478 RGB(255,0,0),
1479 RGB(128,128,0),
1480 RGB(255,255,0),
1481 RGB(0,128,0),
1482 RGB(0,255,0),
1483 RGB(0,128,128),
1484 RGB(0,255,255),
1485 RGB(0,0,128),
1486 RGB(0,0,255),
1487 RGB(128,0,128),
1488 RGB(255,0,255)};
1489 cc.lStructSize=sizeof(CHOOSECOLOR);
1490 cc.hwndOwner=m_hWnd;
1491 cc.rgbResult=colorUser;
1492 cc.lpCustColors=CusColors;
1493 cc.Flags=CC_RGBINIT|CC_FULLOPEN;
1494 if(!ChooseColor(&cc)){
1495 return;
1496 }
1497 colorUser=cc.rgbResult;
1498 }
1499 case IDM_GRAY:
1500 case IDM_WHITE:
1501 case IDM_RED:
1502 case IDM_GREEN:
1503 case IDM_BLUE:
1504 case IDM_YELLOW:
1505 {
1506 HWND hChild=::GetWindow(hClient,GW_CHILD);
1507 int WndNum=GetWndNum(hChild);
1508
1509 TC_ITEM tcItem;
1510 tcItem.mask=TCIF_PARAM;
1511 if(nID==IDM_GRAY) tcItem.lParam=TABCOLOR_GRAY;
1512 if(nID==IDM_WHITE) tcItem.lParam=TABCOLOR_WHITE;
1513 if(nID==IDM_RED) tcItem.lParam=TABCOLOR_RED;
1514 if(nID==IDM_GREEN) tcItem.lParam=TABCOLOR_GREEN;
1515 if(nID==IDM_BLUE) tcItem.lParam=TABCOLOR_BLUE;
1516 if(nID==IDM_YELLOW) tcItem.lParam=TABCOLOR_YELLOW;
1517 if(nID==IDM_USER_COLOR) tcItem.lParam=colorUser;
1518 TabCtrl_SetItem(pobj_MainTab->hTab,
1519 TabCtrl_GetCurSel(pobj_MainTab->hTab),
1520 &tcItem);
1521 ::InvalidateRect(pobj_MainTab->hTab,NULL,0);
1522 break;
1523 }
1524 default:
1525 throw;
1526 }
1527}
Note: See TracBrowser for help on using the repository browser.