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

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

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

File size: 41.4 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 ActiveBasic::PM::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 ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[WndNum].path);
814 for( int i3=0; i3<static_cast<int>(pWindowInfo->childWindowInfos.size()); i3++ )
815 {
816 MdiInfo[WndNum].MdiRadInfo->SelectingItem[i3] = i3;
817 }
818 DrawRadWindow(WndNum,pWindowInfo);
819 }
820}
821
822void MainFrame::OnCmdFind( UINT uNotifyCode, int nID, CWindow wndCtl )
823{
824 DialogBox(hResInst,MAKEINTRESOURCE(IDD_FIND),m_hWnd,(DLGPROC)DlgFind);
825}
826
827void MainFrame::OnCmdPermutation( UINT uNotifyCode, int nID, CWindow wndCtl )
828{
829 DialogBox(hResInst,MAKEINTRESOURCE(IDD_PERMUTATION),m_hWnd,(DLGPROC)DlgPermutation);
830}
831
832void MainFrame::OnCmdConvertX( UINT uNotifyCode, int nID, CWindow wndCtl )
833{
834 TextEdit_Convert( nID );
835}
836
837#ifdef THETEXT
838void MainFrame::OnCmdStringCount( UINT uNotifyCode, int nID, CWindow wndCtl )
839{
840 DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_STRING_COUNT),m_hWnd,(DLGPROC)DlgStringCount,0);
841}
842
843void MainFrame::OnCmdSelStringCount( UINT uNotifyCode, int nID, CWindow wndCtl )
844{
845 DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_STRING_COUNT),m_hWnd,(DLGPROC)DlgStringCount,1);
846}
847#endif
848
849void MainFrame::OnCmdProjectView( UINT uNotifyCode, int nID, CWindow wndCtl )
850{
851 extern HWND hProjectView;
852 bool isCheck = false;
853 if(pobj_nv->bClipProjectView){
854 if(::IsWindowVisible(hProjectView)){
855 ::ShowWindow(hProjectView,SW_HIDE);
856 }
857 else{
858 ::ShowWindow(hProjectView,SW_SHOW);
859 isCheck = true;
860 }
861 }
862 else{
863 extern HWND hProjectView_ToolWindow;
864 if(::IsWindowVisible(hProjectView_ToolWindow)){
865 ::ShowWindow(hProjectView_ToolWindow,SW_HIDE);
866 }
867 else{
868 ::ShowWindow(hProjectView_ToolWindow,SW_SHOW);
869 ::ShowWindow(hProjectView,SW_SHOW);
870 isCheck = true;
871 }
872 }
873 pobj_MainMenu->CheckMenu(IDM_PROJECTVIEW,isCheck);
874
875 //再配置
876 ResizeOwnerWnd();
877
878 ::ShowWindow(hClient,SW_SHOW);
879}
880
881void MainFrame::OnCmdProjectOption( UINT uNotifyCode, int nID, CWindow wndCtl )
882{
883 DlgProjectOptionSetting( m_hWnd );
884}
885
886void MainFrame::OnCmdTopMost( UINT uNotifyCode, int nID, CWindow wndCtl )
887{
888 if(pobj_MainMenu->IsCheck(IDM_TOPMOST)){
889 SetWindowPos( HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
890 pobj_MainMenu->CheckMenu(IDM_TOPMOST,0);
891 }
892 else{
893 SetWindowPos( HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
894 pobj_MainMenu->CheckMenu(IDM_TOPMOST,1);
895 }
896}
897
898void ResetState_ViewMenu(void);
899void MainFrame::OnCmdRightTurn( UINT uNotifyCode, int nID, CWindow wndCtl )
900{
901 pobj_nv->bRightTurn^=1;
902 ResetState_ViewMenu();
903
904 //トップのウィンドウを再描画
905 RedrawAllWindow();
906}
907
908void MainFrame::OnCmdSet( UINT uNotifyCode, int nID, CWindow wndCtl )
909{
910 DlgOptionSetting( m_hWnd );
911}
912
913void CreateProcessWithStdHandle( const std::string &appPath, const std::string &cmdLine)
914{
915 std::string argsStr = (std::string)"\"" + appPath + "\" " + cmdLine;
916 STARTUPINFO si;
917 PROCESS_INFORMATION pi;
918 memset(&si,0,sizeof(STARTUPINFO));
919 si.cb=sizeof(STARTUPINFO);
920 si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
921 si.wShowWindow = SW_HIDE;
922 si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
923 si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
924 si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
925
926 char args[8192];
927 lstrcpy( args, argsStr.c_str() );
928
929 CreateProcess( NULL, args, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi );
930}
931
932#ifndef THETEXT
933void MainFrame::OnCmdDebug( UINT uNotifyCode, int nID, CWindow wndCtl )
934{
935 char temporary[1024], temp2[1024], temp3[1024];
936 if(pobj_Debugger->IsDebugging()){
937 pobj_Debugger->DebugContinue();
938 return;
939 }
940
941 HWND hChild = ::GetWindow(hClient,GW_CHILD);
942 if( projectInfo.IsOpened() ){
943 //プロジェクトが開かれている場合
944 if(!SetProjectToRun()) return;
945
946 //デバッグ用のコマンドライン及び実行可能ファイル(DLLのみ)
947 sprintf(temporary,"%s\r\n%s",projectInfo.szExePath,projectInfo.szCmdLine);
948 sprintf(temp2,"%spgm.tmp",pj_editor_Dir);
949 HANDLE hFile=CreateFile(temp2,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_TEMPORARY,NULL);
950 DWORD dwAccessBytes;
951 WriteFile(hFile,temporary,lstrlen(temporary),&dwAccessBytes,NULL);
952 CloseHandle(hFile);
953
954 //ソースファイル名をtemp2へ
955 projectInfo.pobj_DBFileInfo->ppobj_FileInfo[0]->GetFullPath(temp2);
956
957 //出力ファイル名をtemp3へ
958 lstrcpy(temp3,projectInfo.lpszOutput_Debug);
959 lstrcpy( temp3, projectInfo.GetWorkDir().GetFullPath( temp3 ).c_str() );
960
961 if(IsNeedCompileForProject(1))
962 sprintf(temporary,"\"%s\" \"%s\" /debug /run /wnd:%08x",temp2,temp3,m_hWnd);
963 else
964 sprintf(temporary,"\"%s\" \"%s\" /run /wnd:%08x",temp2,temp3,m_hWnd);
965
966 // DLLオプション
967 if( projectInfo.GetModuleType() == ActiveBasic::Common::TargetModuleType::Dll )
968 {
969 lstrcat(temporary," /dll");
970 }
971
972 // SLLオプション
973 if( projectInfo.GetModuleType() == ActiveBasic::Common::TargetModuleType::Sll )
974 {
975 lstrcat(temporary," /static_library");
976 }
977
978 //Unicodeオプション
979 if(projectInfo.dwOption & PJ_OP_UNICODE) lstrcat(temporary," /unicode");
980
981 //ブレークポイントをセーブ
982 projectInfo.pobj_DBBreakPoint->SaveToTempFile();
983 }
984 else{
985 //単独ソースコード
986 if(!SetRunning(hChild)) return;
987 if(IsNeedCompile(MdiInfo[GetWndNum(hChild)].path,1))
988 sprintf(temporary,"\"%s\" /debug /run /wnd:%08x",MdiInfo[GetWndNum(hChild)].path,m_hWnd);
989 else
990 sprintf(temporary,"\"%s\" /run /wnd:%08x",MdiInfo[GetWndNum(hChild)].path,m_hWnd);
991
992 //ブレークポイントをセーブ
993 extern CDBBreakPoint *pobj_DBBreakPoint;
994 pobj_DBBreakPoint->SaveToTempFile();
995 }
996
997 //コンパイルビューをクリップするかどうか
998 extern BOOL bClipCompileView;
999 if(bClipCompileView){
1000 lstrcat(temporary," /clip_compile_view");
1001
1002 //コンパイラビューを閉じる
1003 extern HWND hCompileView;
1004 if(hCompileView==(HWND)-1) return;
1005 if(hCompileView){
1006 hChild=hCompileView;
1007 hCompileView=(HWND)-1;
1008 SendMessage(hChild,WM_COMMAND,IDCANCEL,0);
1009 }
1010
1011 //重複起動防止のため
1012 hCompileView=(HWND)-1;
1013 }
1014
1015 //インクルードディレクトリ
1016 sprintf(temp2," /include_dir:\"%s\"",pobj_nv->GetIncludeDirFullPath().c_str());
1017 lstrcat(temporary,temp2);
1018
1019 extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
1020 CreateProcessWithStdHandle( ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ), temporary );
1021}
1022
1023void MainFrame::OnCmdDebugCompile( UINT uNotifyCode, int nID, CWindow wndCtl )
1024{
1025 char temporary[1024], temp2[1024], temp3[1024];
1026
1027 HWND hChild=::GetWindow(hClient,GW_CHILD);
1028 if( projectInfo.IsOpened() ){
1029 //プロジェクトが開かれている場合
1030 if(!SetProjectToRun()) return;
1031
1032 //ソースファイル名をtemp2へ
1033 projectInfo.pobj_DBFileInfo->ppobj_FileInfo[0]->GetFullPath(temp2);
1034
1035 //出力ファイル名をtemp3へ
1036 lstrcpy(temp3,projectInfo.lpszOutput_Debug);
1037 lstrcpy( temp3, projectInfo.GetWorkDir().GetFullPath( temp3 ).c_str() );
1038
1039 sprintf(temporary,"\"%s\" \"%s\" /debug /wnd:%08x",temp2,temp3,m_hWnd);
1040
1041 //DLLオプション
1042 if( projectInfo.GetModuleType() == ActiveBasic::Common::TargetModuleType::Dll )
1043 {
1044 lstrcat(temporary," /dll");
1045 }
1046
1047 //Unicodeオプション
1048 if(projectInfo.dwOption & PJ_OP_UNICODE) lstrcat(temporary," /unicode");
1049 }
1050 else{
1051 //単独ソースコード
1052 if(!SetRunning(hChild)) return;
1053 sprintf(temporary,"\"%s\" /debug /wnd:%08x",MdiInfo[GetWndNum(hChild)].path,m_hWnd);
1054 }
1055
1056 //コンパイルビューをクリップするかどうか
1057 extern BOOL bClipCompileView;
1058 if(bClipCompileView){
1059 lstrcat(temporary," /clip_compile_view");
1060
1061 //コンパイラビューを閉じる
1062 extern HWND hCompileView;
1063 if(hCompileView==(HWND)-1) return;
1064 if(hCompileView){
1065 hChild=hCompileView;
1066 hCompileView=(HWND)-1;
1067 if( ::IsWindow( hChild ) )
1068 {
1069 SendMessage(hChild,WM_COMMAND,IDCANCEL,0);
1070 }
1071 }
1072
1073 //重複起動防止のため
1074 hCompileView=(HWND)-1;
1075 }
1076
1077 //インクルードディレクトリ
1078 sprintf(temp2," /include_dir:\"%s\"",pobj_nv->GetIncludeDirFullPath().c_str());
1079 lstrcat(temporary,temp2);
1080
1081 extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
1082 CreateProcessWithStdHandle( ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ), temporary );
1083
1084}
1085
1086void MainFrame::OnCmdAttach( UINT uNotifyCode, int nID, CWindow wndCtl )
1087{
1088 char temporary[1024], temp2[1024];
1089
1090 int idProcess;
1091 DWORD dwPlatform;
1092 idProcess=DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_ATTACH),m_hWnd,(DLGPROC)DlgAttach,(LPARAM)&dwPlatform);
1093 if(idProcess==0) return;
1094
1095 sprintf(temporary,"/attach:%08x /wnd:%08x",idProcess,m_hWnd);
1096
1097 //コンパイルビューをクリップするかどうか
1098 extern BOOL bClipCompileView;
1099 if(bClipCompileView){
1100 lstrcat(temporary," /clip_compile_view");
1101
1102 //コンパイラビューを閉じる
1103 extern HWND hCompileView;
1104 if(hCompileView==(HWND)-1) return;
1105 if(hCompileView){
1106 HWND hChild=hCompileView;
1107 hCompileView=(HWND)-1;
1108 SendMessage(hChild,WM_COMMAND,IDCANCEL,0);
1109 }
1110
1111 //重複起動防止のため
1112 hCompileView=(HWND)-1;
1113 }
1114
1115 //インクルードディレクトリ
1116 sprintf(temp2," /include_dir:\"%s\"",pobj_nv->GetIncludeDirFullPath().c_str());
1117 lstrcat(temporary,temp2);
1118
1119 ActiveBasic::Common::Platform::EnumType platform;
1120 if(dwPlatform==IMAGE_FILE_MACHINE_I386)
1121 {
1122 platform = ActiveBasic::Common::Platform::X86;
1123 }
1124 else if(dwPlatform==IMAGE_FILE_MACHINE_AMD64)
1125 {
1126 platform = ActiveBasic::Common::Platform::X64;
1127 }
1128 else
1129 {
1130 throw;
1131 }
1132
1133 extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
1134 CreateProcessWithStdHandle( ActiveBasic::Common::Environment::GetCompilerExePath( platform ), temporary );
1135}
1136
1137void MainFrame::OnCmdReleaseCompile( UINT uNotifyCode, int nID, CWindow wndCtl )
1138{
1139 char temporary[1024], temp2[1024], temp3[1024];
1140
1141 HWND hChild=::GetWindow(hClient,GW_CHILD);
1142 if( projectInfo.IsOpened() ){
1143 //プロジェクトが開かれている場合
1144 if(!SetProjectToRun()) return;
1145
1146 //ソースファイル名をtemp2へ
1147 projectInfo.pobj_DBFileInfo->ppobj_FileInfo[0]->GetFullPath(temp2);
1148
1149 //出力ファイル名をtemp3へ
1150 lstrcpy(temp3,projectInfo.lpszOutput_Release);
1151 lstrcpy( temp3, projectInfo.GetWorkDir().GetFullPath( temp3 ).c_str() );
1152
1153 sprintf(temporary,"\"%s\" \"%s\" /wnd:%08x",temp2,temp3,m_hWnd);
1154
1155 //DLLオプション
1156 if( projectInfo.GetModuleType() == ActiveBasic::Common::TargetModuleType::Dll )
1157 {
1158 lstrcat(temporary," /dll");
1159 }
1160
1161 //Unicodeオプション
1162 if(projectInfo.dwOption & PJ_OP_UNICODE) lstrcat(temporary," /unicode");
1163 }
1164 else{
1165 //単独ソースコード
1166 if(!SetRunning(hChild)) return;
1167 sprintf(temporary,"\"%s\" /wnd:%08x",MdiInfo[GetWndNum(hChild)].path,m_hWnd);
1168 }
1169
1170 //コンパイルビューをクリップするかどうか
1171 extern BOOL bClipCompileView;
1172 if(bClipCompileView){
1173 lstrcat(temporary," /clip_compile_view");
1174
1175 //コンパイラビューを閉じる
1176 extern HWND hCompileView;
1177 if(hCompileView==(HWND)-1) return;
1178 if(hCompileView){
1179 hChild=hCompileView;
1180 hCompileView=(HWND)-1;
1181 SendMessage(hChild,WM_COMMAND,IDCANCEL,0);
1182 }
1183
1184 //重複起動防止のため
1185 hCompileView=(HWND)-1;
1186 }
1187
1188 //インクルードディレクトリ
1189 sprintf(temp2," /include_dir:\"%s\"",pobj_nv->GetIncludeDirFullPath().c_str());
1190 lstrcat(temporary,temp2);
1191
1192 extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
1193 CreateProcessWithStdHandle( ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ), temporary );
1194}
1195
1196void MainFrame::OnCmdReleaseRun( UINT uNotifyCode, int nID, CWindow wndCtl )
1197{
1198 char temporary[1024], temp2[1024], temp3[1024];
1199
1200 HWND hChild=::GetWindow(hClient,GW_CHILD);
1201 if( projectInfo.IsOpened() ){
1202/* //プロジェクトが開かれている場合
1203 if(!SetProjectToRun()) return;
1204
1205 //必要であればリリースコンパイル
1206 if(IsNeedCompileForProject(0))
1207 SendMessage(WM_COMMAND,IDM_RELEASECOMPILE,0);*/
1208
1209 if( projectInfo.GetModuleType() == ActiveBasic::Common::TargetModuleType::Dll )
1210 {
1211 lstrcpy(temporary,projectInfo.szExePath);
1212 }
1213 else{
1214 lstrcpy(temporary,projectInfo.lpszOutput_Debug);
1215 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1216 }
1217 }
1218 else{
1219/* //必要であればリリースコンパイル
1220 if(!SetRunning(hChild)) return;
1221
1222 if(IsNeedCompile(MdiInfo[GetWndNum(hChild)].path,0))
1223 SendMessage(WM_COMMAND,IDM_RELEASECOMPILE,0);*/
1224
1225 //単独ソースコード
1226 _splitpath(MdiInfo[GetWndNum(hChild)].path,temporary,temp2,temp3,NULL);
1227 lstrcat(temporary,temp2);
1228 lstrcat(temporary,temp3);
1229 lstrcat(temporary,".exe");
1230 }
1231
1232 //インクルードディレクトリ
1233 sprintf(temp2," /include_dir:\"%s\"",pobj_nv->GetIncludeDirFullPath().c_str());
1234 lstrcat(temporary,temp2);
1235
1236 ShellExecute(m_hWnd,"open",temporary,NULL,NULL,SW_SHOWNORMAL);
1237}
1238
1239void MainFrame::OnCmdStepIn( UINT uNotifyCode, int nID, CWindow wndCtl )
1240{
1241 pobj_Debugger->StepIn();
1242}
1243
1244void MainFrame::OnCmdStepOver( UINT uNotifyCode, int nID, CWindow wndCtl )
1245{
1246 pobj_Debugger->StepOver();
1247}
1248
1249void MainFrame::OnCmdStepCursor( UINT uNotifyCode, int nID, CWindow wndCtl )
1250{
1251 pobj_Debugger->StepToCursor();
1252}
1253
1254void MainFrame::OnCmdBreakPoint( UINT uNotifyCode, int nID, CWindow wndCtl )
1255{
1256 if( projectInfo.IsOpened() ){
1257 projectInfo.pobj_DBBreakPoint->Event_BreakPoint();
1258 }
1259 else{
1260 extern CDBBreakPoint *pobj_DBBreakPoint;
1261 pobj_DBBreakPoint->Event_BreakPoint();
1262 }
1263}
1264
1265void MainFrame::OnCmdDebugStop( UINT uNotifyCode, int nID, CWindow wndCtl )
1266{
1267 pobj_Debugger->DebugStop();
1268}
1269
1270void MainFrame::OnCmdDebugPause( UINT uNotifyCode, int nID, CWindow wndCtl )
1271{
1272 pobj_Debugger->DebugPause();
1273}
1274
1275#endif // not THETEXT
1276
1277void MainFrame::OnCmdWebLink( UINT uNotifyCode, int nID, CWindow wndCtl )
1278{
1279 switch( nID )
1280 {
1281#ifndef THETEXT
1282 case IDM_COMMUNITY:
1283 OpenWebBrowser( "http://www.activebasic.com/forum/" );
1284 break;
1285 case IDM_COMMU_SEARCH:
1286 OpenWebBrowser( "http://www.activebasic.com/forum/search.php" );
1287 break;
1288 case IDM_COMMU_PM:
1289 OpenWebBrowser( "http://www.activebasic.com/forum/privmsg.php?folder=inbox" );
1290 break;
1291 case ID_COMMU_FORUM1:
1292 OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=1" );
1293 break;
1294 case ID_COMMU_FORUM2:
1295 OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=2" );
1296 break;
1297 case ID_COMMU_FORUM3:
1298 OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=5" );
1299 break;
1300 case ID_COMMU_FORUM4:
1301 OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=3" );
1302 break;
1303 case ID_COMMU_FORUM5:
1304 OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=6" );
1305 break;
1306 case ID_COMMU_FORUM6:
1307 OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=8" );
1308 break;
1309 case ID_COMMU_FORUM7:
1310 OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=4" );
1311 break;
1312 case ID_COMMU_FORUM8:
1313 OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=7" );
1314 break;
1315 case IDM_AB_WEBSITE:
1316 OpenWebBrowser( "http://www.activebasic.com/" );
1317 break;
1318 case IDM_ACTBDL:
1319 OpenWebBrowser( "http://www.activebasic.com/activebasic5/download.htm" );
1320 break;
1321#else
1322 case IDM_DSHOMEPAGE:
1323 OpenWebBrowser( "http://www.discoversoft.net/" );
1324 break;
1325#endif // not THETEXT
1326 default:
1327 throw;
1328 }
1329}
1330
1331void MainFrame::OnCmdTopics( UINT uNotifyCode, int nID, CWindow wndCtl )
1332{
1333 char temporary[1024];
1334#ifdef THETEXT
1335 sprintf(temporary,"%sTopics\\index.html",pj_editor_Dir);
1336 ShellExecute(m_hWnd,"open",temporary,NULL,NULL,SW_SHOWNORMAL);
1337#else
1338 sprintf(temporary,"%sBasicHelp.chm",pj_editor_Dir);
1339 HtmlHelp(NULL,temporary,HH_DISPLAY_TOPIC,0);
1340#endif
1341}
1342
1343void MainFrame::OnCmdAbout( UINT uNotifyCode, int nID, CWindow wndCtl )
1344{
1345 DialogBox(hResInst,MAKEINTRESOURCE(IDD_ABOUT),m_hWnd,(DLGPROC)DialogAbout);
1346}
1347
1348void MainFrame::OnCmdDocSelectBand( UINT uNotifyCode, int nID, CWindow wndCtl )
1349{
1350 pobj_Rebar->ChangeRebarBand(ID_DOCCOMBO);
1351}
1352
1353void MainFrame::OnCmdStandardBand( UINT uNotifyCode, int nID, CWindow wndCtl )
1354{
1355 pobj_Rebar->ChangeRebarBand(ID_STANDARDTOOLBAR);
1356}
1357
1358void MainFrame::OnCmdReleaseBand( UINT uNotifyCode, int nID, CWindow wndCtl )
1359{
1360 pobj_Rebar->ChangeRebarBand(ID_RELEASETOOLBAR);
1361}
1362
1363void MainFrame::OnCmdDebugBand( UINT uNotifyCode, int nID, CWindow wndCtl )
1364{
1365 pobj_Rebar->ChangeRebarBand(ID_DEBUGGERTOOLBAR);
1366}
1367
1368void MainFrame::OnCmdSelectCompilerBand( UINT uNotifyCode, int nID, CWindow wndCtl )
1369{
1370 pobj_Rebar->ChangeRebarBand(ID_SELECTCOMPILERCOMBO);
1371}
1372
1373void MainFrame::OnCmdNoGripper( UINT uNotifyCode, int nID, CWindow wndCtl )
1374{
1375 if(pobj_nv->bNoGripper) pobj_nv->bNoGripper=0;
1376 else pobj_nv->bNoGripper=1;
1377
1378 //レバーコントロールを再生成
1379 pobj_Rebar->ResetRebar();
1380
1381 //メニュー状態を設定
1382 ResetState_DocMenu();
1383}
1384
1385void MainFrame::OnCmdResetRebar( UINT uNotifyCode, int nID, CWindow wndCtl )
1386{
1387 //"ツールバーの配置をすべて初期状態に戻します。\nよろしいですか?"
1388 if( MessageBox(STRING_TOOLBAR_RESET,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION) == IDCANCEL )
1389 {
1390 return;
1391 }
1392
1393 //レバーコントロールを再生成
1394 pobj_Rebar->ResetInitRebar();
1395
1396 //メニュー状態を設定
1397 ResetState_DocMenu();
1398}
1399
1400void MainFrame::OnCmdAllCloseOmitMyself( UINT uNotifyCode, int nID, CWindow wndCtl )
1401{
1402 //このウィンドウ以外をすべて閉じる(&A)
1403 HWND hChild=::GetWindow(hClient,GW_CHILD);
1404 int WndNum=GetWndNum(hChild);
1405 for(int i=0;i<MAX_WNDNUM;i++){
1406 if(i==WndNum) continue;
1407 if(MdiInfo[i].hwnd) SendMessage(MdiInfo[i].hwnd,WM_CLOSE,0,0);
1408 }
1409}
1410
1411void MainFrame::OnCmdPathCopy( UINT uNotifyCode, int nID, CWindow wndCtl )
1412{
1413 HWND hChild=::GetWindow(hClient,GW_CHILD);
1414 int WndNum=GetWndNum(hChild);
1415
1416 //絶対パスをコピー
1417 HGLOBAL hGlobal=(char *)GlobalAlloc(GMEM_MOVEABLE,lstrlen(MdiInfo[WndNum].path)+1);
1418 char *pTemp=(char *)GlobalLock(hGlobal);
1419 lstrcpy(pTemp,MdiInfo[WndNum].path);
1420 GlobalUnlock(hGlobal);
1421
1422 //クリップボードに保存
1423 OpenClipboard();
1424 EmptyClipboard();
1425 SetClipboardData(CF_TEXT,hGlobal);
1426 CloseClipboard();
1427}
1428
1429void MainFrame::OnCmdFolderOpen( UINT uNotifyCode, int nID, CWindow wndCtl )
1430{
1431 HWND hChild=::GetWindow(hClient,GW_CHILD);
1432 int WndNum=GetWndNum(hChild);
1433
1434 char temporary[1024], temp2[1024];
1435 _splitpath(MdiInfo[WndNum].path,temporary,temp2,NULL,NULL);
1436 lstrcat(temporary,temp2);
1437
1438 OpenExplorer( temporary );
1439}
1440
1441void MainFrame::OnCmdDeleteFile( UINT uNotifyCode, int nID, CWindow wndCtl )
1442{
1443 HWND hChild=::GetWindow(hClient,GW_CHILD);
1444 int WndNum=GetWndNum(hChild);
1445
1446 char temporary[1024], temp2[1024];
1447 _splitpath(MdiInfo[WndNum].path,NULL,NULL,temporary,temp2);
1448 lstrcat(temporary,temp2);
1449
1450 lstrcat(temporary," をごみ箱に移動して閉じます。よろしいですか?");
1451 if(MessageBox(temporary,APPLICATION_NAME,MB_OKCANCEL|MB_ICONQUESTION)==IDCANCEL) return;
1452
1453 //ゴミ箱へ
1454 SHFILEOPSTRUCT fo;
1455 fo.hwnd=m_hWnd;
1456 fo.wFunc=FO_DELETE;
1457 fo.pFrom =MdiInfo[WndNum].path;
1458 fo.pTo="\0";
1459 fo.fFlags =FOF_ALLOWUNDO|FOF_NOCONFIRMATION;
1460 SHFileOperation(&fo);
1461
1462 //閉じる
1463 MdiInfo[WndNum].pMdiTextEdit->UnModify();
1464 SendMessage(MdiInfo[WndNum].hwnd,WM_CLOSE,0,0);
1465}
1466
1467void MainFrame::OnCmdColor( UINT uNotifyCode, int nID, CWindow wndCtl )
1468{
1469 static COLORREF colorUser=RGB(255,255,255);
1470
1471 switch( nID )
1472 {
1473 case IDM_USER_COLOR:
1474 {
1475 CHOOSECOLOR cc;
1476 COLORREF CusColors[16]={
1477 RGB(255,255,255),
1478 RGB(0,0,0),
1479 RGB(128,128,128),
1480 RGB(192,192,192),
1481 RGB(128,0,0),
1482 RGB(255,0,0),
1483 RGB(128,128,0),
1484 RGB(255,255,0),
1485 RGB(0,128,0),
1486 RGB(0,255,0),
1487 RGB(0,128,128),
1488 RGB(0,255,255),
1489 RGB(0,0,128),
1490 RGB(0,0,255),
1491 RGB(128,0,128),
1492 RGB(255,0,255)};
1493 cc.lStructSize=sizeof(CHOOSECOLOR);
1494 cc.hwndOwner=m_hWnd;
1495 cc.rgbResult=colorUser;
1496 cc.lpCustColors=CusColors;
1497 cc.Flags=CC_RGBINIT|CC_FULLOPEN;
1498 if(!ChooseColor(&cc)){
1499 return;
1500 }
1501 colorUser=cc.rgbResult;
1502 }
1503 case IDM_GRAY:
1504 case IDM_WHITE:
1505 case IDM_RED:
1506 case IDM_GREEN:
1507 case IDM_BLUE:
1508 case IDM_YELLOW:
1509 {
1510 HWND hChild=::GetWindow(hClient,GW_CHILD);
1511 int WndNum=GetWndNum(hChild);
1512
1513 TC_ITEM tcItem;
1514 tcItem.mask=TCIF_PARAM;
1515 if(nID==IDM_GRAY) tcItem.lParam=TABCOLOR_GRAY;
1516 if(nID==IDM_WHITE) tcItem.lParam=TABCOLOR_WHITE;
1517 if(nID==IDM_RED) tcItem.lParam=TABCOLOR_RED;
1518 if(nID==IDM_GREEN) tcItem.lParam=TABCOLOR_GREEN;
1519 if(nID==IDM_BLUE) tcItem.lParam=TABCOLOR_BLUE;
1520 if(nID==IDM_YELLOW) tcItem.lParam=TABCOLOR_YELLOW;
1521 if(nID==IDM_USER_COLOR) tcItem.lParam=colorUser;
1522 TabCtrl_SetItem(pobj_MainTab->hTab,
1523 TabCtrl_GetCurSel(pobj_MainTab->hTab),
1524 &tcItem);
1525 ::InvalidateRect(pobj_MainTab->hTab,NULL,0);
1526 break;
1527 }
1528 default:
1529 throw;
1530 }
1531}
Note: See TracBrowser for help on using the repository browser.