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

Last change on this file since 621 was 621, 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.Load(temporary);
510}
511
512void MainFrame::OnCmdProjectSave( UINT uNotifyCode, int nID, CWindow wndCtl )
513{
514 projectInfo.Save();
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() )
554 {
555 projectInfo.Save();
556 }
557}
558
559void MainFrame::OnCmdPageSet( UINT uNotifyCode, int nID, CWindow wndCtl )
560{
561 //ページ設定
562 obj_Page.SetupDlg();
563}
564
565void MainFrame::OnCmdPreview( UINT uNotifyCode, int nID, CWindow wndCtl )
566{
567 //プレビュー(Pro版のみ)
568 Preview();
569}
570
571void MainFrame::OnCmdPrintOut( UINT uNotifyCode, int nID, CWindow wndCtl )
572{
573 //印刷
574 Printout();
575}
576
577void MainFrame::OnCmdExit( UINT uNotifyCode, int nID, CWindow wndCtl )
578{
579 SendMessage(WM_CLOSE);
580}
581
582void MainFrame::OnCmdUndo( UINT uNotifyCode, int nID, CWindow wndCtl )
583{
584 HWND hChild=::GetWindow(hClient,GW_CHILD);
585 if(!hChild) return;
586 int WndNum=GetWndNum(hChild);
587 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType))
588 TextEdit_UndoCommand(WndNum);
589 else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD)
590 Rad_UndoCommand(WndNum);
591 else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT)
592 IconEdit_UndoCommand(WndNum);
593}
594
595void MainFrame::OnCmdRedo( UINT uNotifyCode, int nID, CWindow wndCtl )
596{
597 HWND hChild=::GetWindow(hClient,GW_CHILD);
598 if(!hChild) return;
599 int WndNum=GetWndNum(hChild);
600 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType))
601 TextEdit_RedoCommand(WndNum);
602 else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD)
603 Rad_RedoCommand(WndNum);
604 else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT)
605 IconEdit_RedoCommand(WndNum);
606}
607
608void MainFrame::OnCmdCut( UINT uNotifyCode, int nID, CWindow wndCtl )
609{
610 HWND hChild=::GetWindow(hClient,GW_CHILD);
611 int WndNum=GetWndNum(hChild);
612 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
613 HWND hEdit=::GetWindow(hChild,GW_CHILD);
614
615 CHARRANGE CharRange;
616 TextEdit_GetSel(WndNum,&CharRange);
617
618 HGLOBAL hGlobal=(char *)GlobalAlloc(GMEM_MOVEABLE,CharRange.cpMax-CharRange.cpMin+1);
619 char *pTemp=(char *)GlobalLock(hGlobal);
620 memcpy(pTemp,MdiInfo[WndNum].pMdiTextEdit->buffer+CharRange.cpMin,CharRange.cpMax-CharRange.cpMin);
621 pTemp[CharRange.cpMax-CharRange.cpMin]=0;
622 GlobalUnlock(hGlobal);
623
624 //クリップボードに保存
625 OpenClipboard();
626 EmptyClipboard();
627 SetClipboardData(CF_TEXT,hGlobal);
628 CloseClipboard();
629
630 //選択文字列を消去
631 SendMessage(hEdit,WM_KEYDOWN,VK_DELETE,0);
632 }
633 else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){
634 WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[WndNum].path);
635 int indexOfWndInfo = GetWndInfoNum(MdiInfo[WndNum].path);
636
637 //クリップボードに格納するためのデータを用意する
638 pWindowInfo->childWindowInfos[MdiInfo[WndNum].MdiRadInfo->SelectingItem[0]]->pos.x-=17;
639 pWindowInfo->childWindowInfos[MdiInfo[WndNum].MdiRadInfo->SelectingItem[0]]->pos.y-=10;
640 HGLOBAL hGlobal=Rad_GetChildInfoClipboardData(WndNum,indexOfWndInfo);
641 pWindowInfo->childWindowInfos[MdiInfo[WndNum].MdiRadInfo->SelectingItem[0]]->pos.x+=17;
642 pWindowInfo->childWindowInfos[MdiInfo[WndNum].MdiRadInfo->SelectingItem[0]]->pos.y+=10;
643
644 OpenClipboard();
645 EmptyClipboard();
646 extern DWORD dwRadClipboardID;
647 SetClipboardData(dwRadClipboardID,hGlobal);
648 CloseClipboard();
649
650 SendMessage(MdiInfo[WndNum].MdiRadInfo->hRad,WM_COMMAND,IDM_RAD_ITEM_DELETE,0);
651 }
652 else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
653 //クリップボードに格納するためのデータを用意する
654 HGLOBAL hGlobal=IconEdit_GetChildInfoClipboardData(WndNum);
655 if(hGlobal==0) return;
656
657 OpenClipboard();
658 EmptyClipboard();
659 SetClipboardData(CF_BITMAP,hGlobal);
660 CloseClipboard();
661
662 DeleteObject(MdiInfo[WndNum].MdiIconEditInfo->hSelectingBmp);
663 MdiInfo[WndNum].MdiIconEditInfo->SelectLevel=0;
664
665 IconEdit_EraseRect(WndNum,&MdiInfo[WndNum].MdiIconEditInfo->DraggingRect);
666 }
667}
668
669void MainFrame::OnCmdCopy( UINT uNotifyCode, int nID, CWindow wndCtl )
670{
671 HWND hChild=::GetWindow(hClient,GW_CHILD);
672 int WndNum=GetWndNum(hChild);
673 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
674 HWND hEdit = ::GetWindow(hChild,GW_CHILD);
675
676 CHARRANGE CharRange;
677 TextEdit_GetSel(WndNum,&CharRange);
678
679 HGLOBAL hGlobal=(char *)GlobalAlloc(GMEM_MOVEABLE,CharRange.cpMax-CharRange.cpMin+1);
680 char *pTemp=(char *)GlobalLock(hGlobal);
681 memcpy(pTemp,MdiInfo[WndNum].pMdiTextEdit->buffer+CharRange.cpMin,CharRange.cpMax-CharRange.cpMin);
682 pTemp[CharRange.cpMax-CharRange.cpMin]=0;
683 GlobalUnlock(hGlobal);
684
685 //クリップボードに保存
686 OpenClipboard();
687 EmptyClipboard();
688 SetClipboardData(CF_TEXT,hGlobal);
689 CloseClipboard();
690 }
691 else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){
692 int indexOfWndInfo = GetWndInfoNum(MdiInfo[WndNum].path);
693
694 //クリップボードに格納するためのデータを用意する
695 HGLOBAL hGlobal=Rad_GetChildInfoClipboardData(WndNum,indexOfWndInfo);
696
697 OpenClipboard();
698 EmptyClipboard();
699 extern DWORD dwRadClipboardID;
700 SetClipboardData(dwRadClipboardID,hGlobal);
701 CloseClipboard();
702 }
703 else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
704 //クリップボードに格納するためのデータを用意する
705 HGLOBAL hGlobal=IconEdit_GetChildInfoClipboardData(WndNum);
706
707 OpenClipboard();
708 EmptyClipboard();
709 SetClipboardData(CF_BITMAP,hGlobal);
710 CloseClipboard();
711 }
712}
713
714void MainFrame::OnCmdPaste( UINT uNotifyCode, int nID, CWindow wndCtl )
715{
716 HWND hChild=::GetWindow(hClient,GW_CHILD);
717 int WndNum=GetWndNum(hChild);
718 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
719 HWND hEdit=::GetWindow(hChild,GW_CHILD);
720
721 //クリップボードを開く
722 OpenClipboard();
723 HGLOBAL hGlobal=GetClipboardData(CF_TEXT);
724 if(!hGlobal){
725 CloseClipboard();
726 return;
727 }
728
729
730 char *pTemp;
731 if(pobj_nv->bPasteIndent){
732 //インデント整形
733 pTemp=CodeFormatter((char *)GlobalLock(hGlobal));
734 GlobalUnlock(hGlobal);
735 }
736 else pTemp=(char *)GlobalLock(hGlobal);
737
738
739 //テキストエディタの文字列をリプレイス
740 TextEdit_ReplaceUpdateUndoData(WndNum,
741 pTemp,
742 1,
743 1);
744
745 if(pobj_nv->bPasteIndent)
746 HeapDefaultFree(pTemp);
747 else
748 GlobalUnlock(hGlobal);
749
750 //クリップボードを閉じる
751 CloseClipboard();
752
753
754 //キャレット位置までスクロールする
755 TextEdit_ScrollCaret(WndNum,0);
756 ResetCaretPos(WndNum);
757 }
758 else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){
759 OpenClipboard();
760 extern DWORD dwRadClipboardID;
761 HGLOBAL hGlobal=GetClipboardData(dwRadClipboardID);
762 if(!hGlobal){
763 CloseClipboard();
764 return;
765 }
766 Rad_PasteChildInfoClipboardData(WndNum,hGlobal);
767 CloseClipboard();
768 }
769 else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){
770 OpenClipboard();
771 HGLOBAL hGlobal=GetClipboardData(CF_BITMAP);
772 if(!hGlobal){
773 CloseClipboard();
774 return;
775 }
776 IconEdit_PasteChildInfoClipboardData(WndNum,(HBITMAP)hGlobal);
777 CloseClipboard();
778 }
779}
780
781void MainFrame::OnCmdDelete( UINT uNotifyCode, int nID, CWindow wndCtl )
782{
783 HWND hChild=::GetWindow(hClient,GW_CHILD);
784 int WndNum=GetWndNum(hChild);
785 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
786 HWND hEdit=::GetWindow(hChild,GW_CHILD);
787 TextEdit_ReplaceUpdateUndoData(WndNum,"",0,1);
788 }
789 else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD)
790 SendMessage(MdiInfo[WndNum].MdiRadInfo->hRad,WM_COMMAND,IDM_RAD_ITEM_DELETE,0);
791}
792
793void MainFrame::OnCmdAllSelect( UINT uNotifyCode, int nID, CWindow wndCtl )
794{
795 HWND hChild=::GetWindow(hClient,GW_CHILD);
796 int WndNum=GetWndNum(hChild);
797 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
798 HWND hEdit=::GetWindow(hChild,GW_CHILD);
799
800 MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x=0;
801 MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y=0;
802
803 GetCaretPosFromBufferIndex(
804 MdiInfo[WndNum].pMdiTextEdit->buffer,
805 lstrlen(MdiInfo[WndNum].pMdiTextEdit->buffer),
806 &MdiInfo[WndNum].pMdiTextEdit->EndCaretPos);
807
808 ::InvalidateRect(hEdit,NULL,0);
809
810 ResetState_EditMenu();
811 }
812 else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){
813 WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[WndNum].path);
814 for(int i3=0;i3<pWindowInfo->childWindowInfos.size();i3++){
815 MdiInfo[WndNum].MdiRadInfo->SelectingItem[i3]=i3;
816 }
817 DrawRadWindow(WndNum,pWindowInfo);
818 }
819}
820
821void MainFrame::OnCmdFind( UINT uNotifyCode, int nID, CWindow wndCtl )
822{
823 DialogBox(hResInst,MAKEINTRESOURCE(IDD_FIND),m_hWnd,(DLGPROC)DlgFind);
824}
825
826void MainFrame::OnCmdPermutation( UINT uNotifyCode, int nID, CWindow wndCtl )
827{
828 DialogBox(hResInst,MAKEINTRESOURCE(IDD_PERMUTATION),m_hWnd,(DLGPROC)DlgPermutation);
829}
830
831void MainFrame::OnCmdConvertX( UINT uNotifyCode, int nID, CWindow wndCtl )
832{
833 TextEdit_Convert( nID );
834}
835
836#ifdef THETEXT
837void MainFrame::OnCmdStringCount( UINT uNotifyCode, int nID, CWindow wndCtl )
838{
839 DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_STRING_COUNT),m_hWnd,(DLGPROC)DlgStringCount,0);
840}
841
842void MainFrame::OnCmdSelStringCount( UINT uNotifyCode, int nID, CWindow wndCtl )
843{
844 DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_STRING_COUNT),m_hWnd,(DLGPROC)DlgStringCount,1);
845}
846#endif
847
848void MainFrame::OnCmdProjectView( UINT uNotifyCode, int nID, CWindow wndCtl )
849{
850 extern HWND hProjectView;
851 bool isCheck = false;
852 if(pobj_nv->bClipProjectView){
853 if(::IsWindowVisible(hProjectView)){
854 ::ShowWindow(hProjectView,SW_HIDE);
855 }
856 else{
857 ::ShowWindow(hProjectView,SW_SHOW);
858 isCheck = true;
859 }
860 }
861 else{
862 extern HWND hProjectView_ToolWindow;
863 if(::IsWindowVisible(hProjectView_ToolWindow)){
864 ::ShowWindow(hProjectView_ToolWindow,SW_HIDE);
865 }
866 else{
867 ::ShowWindow(hProjectView_ToolWindow,SW_SHOW);
868 ::ShowWindow(hProjectView,SW_SHOW);
869 isCheck = true;
870 }
871 }
872 pobj_MainMenu->CheckMenu(IDM_PROJECTVIEW,isCheck);
873
874 //再配置
875 ResizeOwnerWnd();
876
877 ::ShowWindow(hClient,SW_SHOW);
878}
879
880void MainFrame::OnCmdProjectOption( UINT uNotifyCode, int nID, CWindow wndCtl )
881{
882 DlgProjectOptionSetting( m_hWnd );
883}
884
885void MainFrame::OnCmdTopMost( UINT uNotifyCode, int nID, CWindow wndCtl )
886{
887 if(pobj_MainMenu->IsCheck(IDM_TOPMOST)){
888 SetWindowPos( HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
889 pobj_MainMenu->CheckMenu(IDM_TOPMOST,0);
890 }
891 else{
892 SetWindowPos( HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
893 pobj_MainMenu->CheckMenu(IDM_TOPMOST,1);
894 }
895}
896
897void ResetState_ViewMenu(void);
898void MainFrame::OnCmdRightTurn( UINT uNotifyCode, int nID, CWindow wndCtl )
899{
900 pobj_nv->bRightTurn^=1;
901 ResetState_ViewMenu();
902
903 //トップのウィンドウを再描画
904 RedrawAllWindow();
905}
906
907void MainFrame::OnCmdSet( UINT uNotifyCode, int nID, CWindow wndCtl )
908{
909 DlgOptionSetting( m_hWnd );
910}
911
912void CreateProcessWithStdHandle( const std::string &appPath, const std::string &cmdLine)
913{
914 std::string argsStr = (std::string)"\"" + appPath + "\" " + cmdLine;
915 STARTUPINFO si;
916 PROCESS_INFORMATION pi;
917 memset(&si,0,sizeof(STARTUPINFO));
918 si.cb=sizeof(STARTUPINFO);
919 si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
920 si.wShowWindow = SW_HIDE;
921 si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
922 si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
923 si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
924
925 char args[8192];
926 lstrcpy( args, argsStr.c_str() );
927
928 CreateProcess( NULL, args, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi );
929}
930
931#ifndef THETEXT
932void MainFrame::OnCmdDebug( UINT uNotifyCode, int nID, CWindow wndCtl )
933{
934 char temporary[1024], temp2[1024], temp3[1024];
935 if(pobj_Debugger->IsDebugging()){
936 pobj_Debugger->DebugContinue();
937 return;
938 }
939
940 HWND hChild = ::GetWindow(hClient,GW_CHILD);
941 if( projectInfo.IsOpened() ){
942 //プロジェクトが開かれている場合
943 if(!SetProjectToRun()) return;
944
945 //デバッグ用のコマンドライン及び実行可能ファイル(DLLのみ)
946 sprintf(temporary,"%s\r\n%s",projectInfo.szExePath,projectInfo.szCmdLine);
947 sprintf(temp2,"%spgm.tmp",pj_editor_Dir);
948 HANDLE hFile=CreateFile(temp2,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_TEMPORARY,NULL);
949 DWORD dwAccessBytes;
950 WriteFile(hFile,temporary,lstrlen(temporary),&dwAccessBytes,NULL);
951 CloseHandle(hFile);
952
953 //ソースファイル名をtemp2へ
954 projectInfo.pobj_DBFileInfo->ppobj_FileInfo[0]->GetFullPath(temp2);
955
956 //出力ファイル名をtemp3へ
957 lstrcpy(temp3,projectInfo.lpszOutput_Debug);
958 lstrcpy( temp3, projectInfo.GetWorkDir().GetFullPath( temp3 ).c_str() );
959
960 if(IsNeedCompileForProject(1))
961 sprintf(temporary,"\"%s\" \"%s\" /debug /run /wnd:%08x",temp2,temp3,m_hWnd);
962 else
963 sprintf(temporary,"\"%s\" \"%s\" /run /wnd:%08x",temp2,temp3,m_hWnd);
964
965 // DLLオプション
966 if( projectInfo.GetModuleType() == ActiveBasic::Common::TargetModuleType::Dll )
967 {
968 lstrcat(temporary," /dll");
969 }
970
971 // SLLオプション
972 if( projectInfo.GetModuleType() == ActiveBasic::Common::TargetModuleType::Sll )
973 {
974 lstrcat(temporary," /static_library");
975 }
976
977 //Unicodeオプション
978 if(projectInfo.dwOption & PJ_OP_UNICODE) lstrcat(temporary," /unicode");
979
980 //ブレークポイントをセーブ
981 projectInfo.pobj_DBBreakPoint->SaveToTempFile();
982 }
983 else{
984 //単独ソースコード
985 if(!SetRunning(hChild)) return;
986 if(IsNeedCompile(MdiInfo[GetWndNum(hChild)].path,1))
987 sprintf(temporary,"\"%s\" /debug /run /wnd:%08x",MdiInfo[GetWndNum(hChild)].path,m_hWnd);
988 else
989 sprintf(temporary,"\"%s\" /run /wnd:%08x",MdiInfo[GetWndNum(hChild)].path,m_hWnd);
990
991 //ブレークポイントをセーブ
992 extern CDBBreakPoint *pobj_DBBreakPoint;
993 pobj_DBBreakPoint->SaveToTempFile();
994 }
995
996 //コンパイルビューをクリップするかどうか
997 extern BOOL bClipCompileView;
998 if(bClipCompileView){
999 lstrcat(temporary," /clip_compile_view");
1000
1001 //コンパイラビューを閉じる
1002 extern HWND hCompileView;
1003 if(hCompileView==(HWND)-1) return;
1004 if(hCompileView){
1005 hChild=hCompileView;
1006 hCompileView=(HWND)-1;
1007 SendMessage(hChild,WM_COMMAND,IDCANCEL,0);
1008 }
1009
1010 //重複起動防止のため
1011 hCompileView=(HWND)-1;
1012 }
1013
1014 //インクルードディレクトリ
1015 sprintf(temp2," /include_dir:\"%s\"",pobj_nv->GetIncludeDirFullPath().c_str());
1016 lstrcat(temporary,temp2);
1017
1018 extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
1019 CreateProcessWithStdHandle( ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ), temporary );
1020}
1021
1022void MainFrame::OnCmdDebugCompile( UINT uNotifyCode, int nID, CWindow wndCtl )
1023{
1024 char temporary[1024], temp2[1024], temp3[1024];
1025
1026 HWND hChild=::GetWindow(hClient,GW_CHILD);
1027 if( projectInfo.IsOpened() ){
1028 //プロジェクトが開かれている場合
1029 if(!SetProjectToRun()) return;
1030
1031 //ソースファイル名をtemp2へ
1032 projectInfo.pobj_DBFileInfo->ppobj_FileInfo[0]->GetFullPath(temp2);
1033
1034 //出力ファイル名をtemp3へ
1035 lstrcpy(temp3,projectInfo.lpszOutput_Debug);
1036 lstrcpy( temp3, projectInfo.GetWorkDir().GetFullPath( temp3 ).c_str() );
1037
1038 sprintf(temporary,"\"%s\" \"%s\" /debug /wnd:%08x",temp2,temp3,m_hWnd);
1039
1040 //DLLオプション
1041 if( projectInfo.GetModuleType() == ActiveBasic::Common::TargetModuleType::Dll )
1042 {
1043 lstrcat(temporary," /dll");
1044 }
1045
1046 //Unicodeオプション
1047 if(projectInfo.dwOption & PJ_OP_UNICODE) lstrcat(temporary," /unicode");
1048 }
1049 else{
1050 //単独ソースコード
1051 if(!SetRunning(hChild)) return;
1052 sprintf(temporary,"\"%s\" /debug /wnd:%08x",MdiInfo[GetWndNum(hChild)].path,m_hWnd);
1053 }
1054
1055 //コンパイルビューをクリップするかどうか
1056 extern BOOL bClipCompileView;
1057 if(bClipCompileView){
1058 lstrcat(temporary," /clip_compile_view");
1059
1060 //コンパイラビューを閉じる
1061 extern HWND hCompileView;
1062 if(hCompileView==(HWND)-1) return;
1063 if(hCompileView){
1064 hChild=hCompileView;
1065 hCompileView=(HWND)-1;
1066 if( ::IsWindow( hChild ) )
1067 {
1068 SendMessage(hChild,WM_COMMAND,IDCANCEL,0);
1069 }
1070 }
1071
1072 //重複起動防止のため
1073 hCompileView=(HWND)-1;
1074 }
1075
1076 //インクルードディレクトリ
1077 sprintf(temp2," /include_dir:\"%s\"",pobj_nv->GetIncludeDirFullPath().c_str());
1078 lstrcat(temporary,temp2);
1079
1080 extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
1081 CreateProcessWithStdHandle( ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ), temporary );
1082
1083}
1084
1085void MainFrame::OnCmdAttach( UINT uNotifyCode, int nID, CWindow wndCtl )
1086{
1087 char temporary[1024], temp2[1024];
1088
1089 int idProcess;
1090 DWORD dwPlatform;
1091 idProcess=DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_ATTACH),m_hWnd,(DLGPROC)DlgAttach,(LPARAM)&dwPlatform);
1092 if(idProcess==0) return;
1093
1094 sprintf(temporary,"/attach:%08x /wnd:%08x",idProcess,m_hWnd);
1095
1096 //コンパイルビューをクリップするかどうか
1097 extern BOOL bClipCompileView;
1098 if(bClipCompileView){
1099 lstrcat(temporary," /clip_compile_view");
1100
1101 //コンパイラビューを閉じる
1102 extern HWND hCompileView;
1103 if(hCompileView==(HWND)-1) return;
1104 if(hCompileView){
1105 HWND hChild=hCompileView;
1106 hCompileView=(HWND)-1;
1107 SendMessage(hChild,WM_COMMAND,IDCANCEL,0);
1108 }
1109
1110 //重複起動防止のため
1111 hCompileView=(HWND)-1;
1112 }
1113
1114 //インクルードディレクトリ
1115 sprintf(temp2," /include_dir:\"%s\"",pobj_nv->GetIncludeDirFullPath().c_str());
1116 lstrcat(temporary,temp2);
1117
1118 ActiveBasic::Common::Platform::EnumType platform;
1119 if(dwPlatform==IMAGE_FILE_MACHINE_I386)
1120 {
1121 platform = ActiveBasic::Common::Platform::X86;
1122 }
1123 else if(dwPlatform==IMAGE_FILE_MACHINE_AMD64)
1124 {
1125 platform = ActiveBasic::Common::Platform::X64;
1126 }
1127 else
1128 {
1129 throw;
1130 }
1131
1132 extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
1133 CreateProcessWithStdHandle( ActiveBasic::Common::Environment::GetCompilerExePath( platform ), temporary );
1134}
1135
1136void MainFrame::OnCmdReleaseCompile( UINT uNotifyCode, int nID, CWindow wndCtl )
1137{
1138 char temporary[1024], temp2[1024], temp3[1024];
1139
1140 HWND hChild=::GetWindow(hClient,GW_CHILD);
1141 if( projectInfo.IsOpened() ){
1142 //プロジェクトが開かれている場合
1143 if(!SetProjectToRun()) return;
1144
1145 //ソースファイル名をtemp2へ
1146 projectInfo.pobj_DBFileInfo->ppobj_FileInfo[0]->GetFullPath(temp2);
1147
1148 //出力ファイル名をtemp3へ
1149 lstrcpy(temp3,projectInfo.lpszOutput_Release);
1150 lstrcpy( temp3, projectInfo.GetWorkDir().GetFullPath( temp3 ).c_str() );
1151
1152 sprintf(temporary,"\"%s\" \"%s\" /wnd:%08x",temp2,temp3,m_hWnd);
1153
1154 //DLLオプション
1155 if( projectInfo.GetModuleType() == ActiveBasic::Common::TargetModuleType::Dll )
1156 {
1157 lstrcat(temporary," /dll");
1158 }
1159
1160 //Unicodeオプション
1161 if(projectInfo.dwOption & PJ_OP_UNICODE) lstrcat(temporary," /unicode");
1162 }
1163 else{
1164 //単独ソースコード
1165 if(!SetRunning(hChild)) return;
1166 sprintf(temporary,"\"%s\" /wnd:%08x",MdiInfo[GetWndNum(hChild)].path,m_hWnd);
1167 }
1168
1169 //コンパイルビューをクリップするかどうか
1170 extern BOOL bClipCompileView;
1171 if(bClipCompileView){
1172 lstrcat(temporary," /clip_compile_view");
1173
1174 //コンパイラビューを閉じる
1175 extern HWND hCompileView;
1176 if(hCompileView==(HWND)-1) return;
1177 if(hCompileView){
1178 hChild=hCompileView;
1179 hCompileView=(HWND)-1;
1180 SendMessage(hChild,WM_COMMAND,IDCANCEL,0);
1181 }
1182
1183 //重複起動防止のため
1184 hCompileView=(HWND)-1;
1185 }
1186
1187 //インクルードディレクトリ
1188 sprintf(temp2," /include_dir:\"%s\"",pobj_nv->GetIncludeDirFullPath().c_str());
1189 lstrcat(temporary,temp2);
1190
1191 extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
1192 CreateProcessWithStdHandle( ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ), temporary );
1193}
1194
1195void MainFrame::OnCmdReleaseRun( UINT uNotifyCode, int nID, CWindow wndCtl )
1196{
1197 char temporary[1024], temp2[1024], temp3[1024];
1198
1199 HWND hChild=::GetWindow(hClient,GW_CHILD);
1200 if( projectInfo.IsOpened() ){
1201/* //プロジェクトが開かれている場合
1202 if(!SetProjectToRun()) return;
1203
1204 //必要であればリリースコンパイル
1205 if(IsNeedCompileForProject(0))
1206 SendMessage(WM_COMMAND,IDM_RELEASECOMPILE,0);*/
1207
1208 if( projectInfo.GetModuleType() == ActiveBasic::Common::TargetModuleType::Dll )
1209 {
1210 lstrcpy(temporary,projectInfo.szExePath);
1211 }
1212 else{
1213 lstrcpy(temporary,projectInfo.lpszOutput_Debug);
1214 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1215 }
1216 }
1217 else{
1218/* //必要であればリリースコンパイル
1219 if(!SetRunning(hChild)) return;
1220
1221 if(IsNeedCompile(MdiInfo[GetWndNum(hChild)].path,0))
1222 SendMessage(WM_COMMAND,IDM_RELEASECOMPILE,0);*/
1223
1224 //単独ソースコード
1225 _splitpath(MdiInfo[GetWndNum(hChild)].path,temporary,temp2,temp3,NULL);
1226 lstrcat(temporary,temp2);
1227 lstrcat(temporary,temp3);
1228 lstrcat(temporary,".exe");
1229 }
1230
1231 //インクルードディレクトリ
1232 sprintf(temp2," /include_dir:\"%s\"",pobj_nv->GetIncludeDirFullPath().c_str());
1233 lstrcat(temporary,temp2);
1234
1235 ShellExecute(m_hWnd,"open",temporary,NULL,NULL,SW_SHOWNORMAL);
1236}
1237
1238void MainFrame::OnCmdStepIn( UINT uNotifyCode, int nID, CWindow wndCtl )
1239{
1240 pobj_Debugger->StepIn();
1241}
1242
1243void MainFrame::OnCmdStepOver( UINT uNotifyCode, int nID, CWindow wndCtl )
1244{
1245 pobj_Debugger->StepOver();
1246}
1247
1248void MainFrame::OnCmdStepCursor( UINT uNotifyCode, int nID, CWindow wndCtl )
1249{
1250 pobj_Debugger->StepToCursor();
1251}
1252
1253void MainFrame::OnCmdBreakPoint( UINT uNotifyCode, int nID, CWindow wndCtl )
1254{
1255 if( projectInfo.IsOpened() ){
1256 projectInfo.pobj_DBBreakPoint->Event_BreakPoint();
1257 }
1258 else{
1259 extern CDBBreakPoint *pobj_DBBreakPoint;
1260 pobj_DBBreakPoint->Event_BreakPoint();
1261 }
1262}
1263
1264void MainFrame::OnCmdDebugStop( UINT uNotifyCode, int nID, CWindow wndCtl )
1265{
1266 pobj_Debugger->DebugStop();
1267}
1268
1269void MainFrame::OnCmdDebugPause( UINT uNotifyCode, int nID, CWindow wndCtl )
1270{
1271 pobj_Debugger->DebugPause();
1272}
1273
1274#endif // not THETEXT
1275
1276void MainFrame::OnCmdWebLink( UINT uNotifyCode, int nID, CWindow wndCtl )
1277{
1278 switch( nID )
1279 {
1280#ifndef THETEXT
1281 case IDM_COMMUNITY:
1282 OpenWebBrowser( "http://www.activebasic.com/forum/" );
1283 break;
1284 case IDM_COMMU_SEARCH:
1285 OpenWebBrowser( "http://www.activebasic.com/forum/search.php" );
1286 break;
1287 case IDM_COMMU_PM:
1288 OpenWebBrowser( "http://www.activebasic.com/forum/privmsg.php?folder=inbox" );
1289 break;
1290 case ID_COMMU_FORUM1:
1291 OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=1" );
1292 break;
1293 case ID_COMMU_FORUM2:
1294 OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=2" );
1295 break;
1296 case ID_COMMU_FORUM3:
1297 OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=5" );
1298 break;
1299 case ID_COMMU_FORUM4:
1300 OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=3" );
1301 break;
1302 case ID_COMMU_FORUM5:
1303 OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=6" );
1304 break;
1305 case ID_COMMU_FORUM6:
1306 OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=8" );
1307 break;
1308 case ID_COMMU_FORUM7:
1309 OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=4" );
1310 break;
1311 case ID_COMMU_FORUM8:
1312 OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=7" );
1313 break;
1314 case IDM_AB_WEBSITE:
1315 OpenWebBrowser( "http://www.activebasic.com/" );
1316 break;
1317 case IDM_ACTBDL:
1318 OpenWebBrowser( "http://www.activebasic.com/activebasic5/download.htm" );
1319 break;
1320#else
1321 case IDM_DSHOMEPAGE:
1322 OpenWebBrowser( "http://www.discoversoft.net/" );
1323 break;
1324#endif // not THETEXT
1325 default:
1326 throw;
1327 }
1328}
1329
1330void MainFrame::OnCmdTopics( UINT uNotifyCode, int nID, CWindow wndCtl )
1331{
1332 char temporary[1024];
1333#ifdef THETEXT
1334 sprintf(temporary,"%sTopics\\index.html",pj_editor_Dir);
1335 ShellExecute(m_hWnd,"open",temporary,NULL,NULL,SW_SHOWNORMAL);
1336#else
1337 sprintf(temporary,"%sBasicHelp.chm",pj_editor_Dir);
1338 HtmlHelp(NULL,temporary,HH_DISPLAY_TOPIC,0);
1339#endif
1340}
1341
1342void MainFrame::OnCmdAbout( UINT uNotifyCode, int nID, CWindow wndCtl )
1343{
1344 DialogBox(hResInst,MAKEINTRESOURCE(IDD_ABOUT),m_hWnd,(DLGPROC)DialogAbout);
1345}
1346
1347void MainFrame::OnCmdDocSelectBand( UINT uNotifyCode, int nID, CWindow wndCtl )
1348{
1349 pobj_Rebar->ChangeRebarBand(ID_DOCCOMBO);
1350}
1351
1352void MainFrame::OnCmdStandardBand( UINT uNotifyCode, int nID, CWindow wndCtl )
1353{
1354 pobj_Rebar->ChangeRebarBand(ID_STANDARDTOOLBAR);
1355}
1356
1357void MainFrame::OnCmdReleaseBand( UINT uNotifyCode, int nID, CWindow wndCtl )
1358{
1359 pobj_Rebar->ChangeRebarBand(ID_RELEASETOOLBAR);
1360}
1361
1362void MainFrame::OnCmdDebugBand( UINT uNotifyCode, int nID, CWindow wndCtl )
1363{
1364 pobj_Rebar->ChangeRebarBand(ID_DEBUGGERTOOLBAR);
1365}
1366
1367void MainFrame::OnCmdSelectCompilerBand( UINT uNotifyCode, int nID, CWindow wndCtl )
1368{
1369 pobj_Rebar->ChangeRebarBand(ID_SELECTCOMPILERCOMBO);
1370}
1371
1372void MainFrame::OnCmdNoGripper( UINT uNotifyCode, int nID, CWindow wndCtl )
1373{
1374 if(pobj_nv->bNoGripper) pobj_nv->bNoGripper=0;
1375 else pobj_nv->bNoGripper=1;
1376
1377 //レバーコントロールを再生成
1378 pobj_Rebar->ResetRebar();
1379
1380 //メニュー状態を設定
1381 ResetState_DocMenu();
1382}
1383
1384void MainFrame::OnCmdResetRebar( UINT uNotifyCode, int nID, CWindow wndCtl )
1385{
1386 //"ツールバーの配置をすべて初期状態に戻します。\nよろしいですか?"
1387 if( MessageBox(STRING_TOOLBAR_RESET,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION) == IDCANCEL )
1388 {
1389 return;
1390 }
1391
1392 //レバーコントロールを再生成
1393 pobj_Rebar->ResetInitRebar();
1394
1395 //メニュー状態を設定
1396 ResetState_DocMenu();
1397}
1398
1399void MainFrame::OnCmdAllCloseOmitMyself( UINT uNotifyCode, int nID, CWindow wndCtl )
1400{
1401 //このウィンドウ以外をすべて閉じる(&A)
1402 HWND hChild=::GetWindow(hClient,GW_CHILD);
1403 int WndNum=GetWndNum(hChild);
1404 for(int i=0;i<MAX_WNDNUM;i++){
1405 if(i==WndNum) continue;
1406 if(MdiInfo[i].hwnd) SendMessage(MdiInfo[i].hwnd,WM_CLOSE,0,0);
1407 }
1408}
1409
1410void MainFrame::OnCmdPathCopy( UINT uNotifyCode, int nID, CWindow wndCtl )
1411{
1412 HWND hChild=::GetWindow(hClient,GW_CHILD);
1413 int WndNum=GetWndNum(hChild);
1414
1415 //絶対パスをコピー
1416 HGLOBAL hGlobal=(char *)GlobalAlloc(GMEM_MOVEABLE,lstrlen(MdiInfo[WndNum].path)+1);
1417 char *pTemp=(char *)GlobalLock(hGlobal);
1418 lstrcpy(pTemp,MdiInfo[WndNum].path);
1419 GlobalUnlock(hGlobal);
1420
1421 //クリップボードに保存
1422 OpenClipboard();
1423 EmptyClipboard();
1424 SetClipboardData(CF_TEXT,hGlobal);
1425 CloseClipboard();
1426}
1427
1428void MainFrame::OnCmdFolderOpen( UINT uNotifyCode, int nID, CWindow wndCtl )
1429{
1430 HWND hChild=::GetWindow(hClient,GW_CHILD);
1431 int WndNum=GetWndNum(hChild);
1432
1433 char temporary[1024], temp2[1024];
1434 _splitpath(MdiInfo[WndNum].path,temporary,temp2,NULL,NULL);
1435 lstrcat(temporary,temp2);
1436
1437 OpenExplorer( temporary );
1438}
1439
1440void MainFrame::OnCmdDeleteFile( UINT uNotifyCode, int nID, CWindow wndCtl )
1441{
1442 HWND hChild=::GetWindow(hClient,GW_CHILD);
1443 int WndNum=GetWndNum(hChild);
1444
1445 char temporary[1024], temp2[1024];
1446 _splitpath(MdiInfo[WndNum].path,NULL,NULL,temporary,temp2);
1447 lstrcat(temporary,temp2);
1448
1449 lstrcat(temporary," をごみ箱に移動して閉じます。よろしいですか?");
1450 if(MessageBox(temporary,APPLICATION_NAME,MB_OKCANCEL|MB_ICONQUESTION)==IDCANCEL) return;
1451
1452 //ゴミ箱へ
1453 SHFILEOPSTRUCT fo;
1454 fo.hwnd=m_hWnd;
1455 fo.wFunc=FO_DELETE;
1456 fo.pFrom =MdiInfo[WndNum].path;
1457 fo.pTo="\0";
1458 fo.fFlags =FOF_ALLOWUNDO|FOF_NOCONFIRMATION;
1459 SHFileOperation(&fo);
1460
1461 //閉じる
1462 MdiInfo[WndNum].pMdiTextEdit->UnModify();
1463 SendMessage(MdiInfo[WndNum].hwnd,WM_CLOSE,0,0);
1464}
1465
1466void MainFrame::OnCmdColor( UINT uNotifyCode, int nID, CWindow wndCtl )
1467{
1468 static COLORREF colorUser=RGB(255,255,255);
1469
1470 switch( nID )
1471 {
1472 case IDM_USER_COLOR:
1473 {
1474 CHOOSECOLOR cc;
1475 COLORREF CusColors[16]={
1476 RGB(255,255,255),
1477 RGB(0,0,0),
1478 RGB(128,128,128),
1479 RGB(192,192,192),
1480 RGB(128,0,0),
1481 RGB(255,0,0),
1482 RGB(128,128,0),
1483 RGB(255,255,0),
1484 RGB(0,128,0),
1485 RGB(0,255,0),
1486 RGB(0,128,128),
1487 RGB(0,255,255),
1488 RGB(0,0,128),
1489 RGB(0,0,255),
1490 RGB(128,0,128),
1491 RGB(255,0,255)};
1492 cc.lStructSize=sizeof(CHOOSECOLOR);
1493 cc.hwndOwner=m_hWnd;
1494 cc.rgbResult=colorUser;
1495 cc.lpCustColors=CusColors;
1496 cc.Flags=CC_RGBINIT|CC_FULLOPEN;
1497 if(!ChooseColor(&cc)){
1498 return;
1499 }
1500 colorUser=cc.rgbResult;
1501 }
1502 case IDM_GRAY:
1503 case IDM_WHITE:
1504 case IDM_RED:
1505 case IDM_GREEN:
1506 case IDM_BLUE:
1507 case IDM_YELLOW:
1508 {
1509 HWND hChild=::GetWindow(hClient,GW_CHILD);
1510 int WndNum=GetWndNum(hChild);
1511
1512 TC_ITEM tcItem;
1513 tcItem.mask=TCIF_PARAM;
1514 if(nID==IDM_GRAY) tcItem.lParam=TABCOLOR_GRAY;
1515 if(nID==IDM_WHITE) tcItem.lParam=TABCOLOR_WHITE;
1516 if(nID==IDM_RED) tcItem.lParam=TABCOLOR_RED;
1517 if(nID==IDM_GREEN) tcItem.lParam=TABCOLOR_GREEN;
1518 if(nID==IDM_BLUE) tcItem.lParam=TABCOLOR_BLUE;
1519 if(nID==IDM_YELLOW) tcItem.lParam=TABCOLOR_YELLOW;
1520 if(nID==IDM_USER_COLOR) tcItem.lParam=colorUser;
1521 TabCtrl_SetItem(pobj_MainTab->hTab,
1522 TabCtrl_GetCurSel(pobj_MainTab->hTab),
1523 &tcItem);
1524 ::InvalidateRect(pobj_MainTab->hTab,NULL,0);
1525 break;
1526 }
1527 default:
1528 throw;
1529 }
1530}
Note: See TracBrowser for help on using the repository browser.