#include "stdafx.h" using namespace ActiveBasic::IDE; using namespace ActiveBasic::IDE::WindowComponents; LRESULT CALLBACK WindowFunc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam); void SetupWindow(HWND hwnd); void ResetTextEditFont(HWND hwnd); void MainFrame::OpenWebBrowser( const std::string &url ) { ShellExecute(m_hWnd,"open",url.c_str(),"",NULL,SW_SHOWNORMAL); } void MainFrame::OpenExplorer( const std::string &path ) { ShellExecute(m_hWnd,"explore",path.c_str(),NULL,NULL,SW_SHOWNORMAL); } ::LRESULT MainFrame::OnCreate( ::UINT msg, ::WPARAM wParam, ::LPARAM lParam, ::BOOL& handled ) { // ウィンドウエリアマネージャに親ウィンドウを登録 wam.SetParentWnd( m_hWnd ); RECT rect; GetClientRect( &rect ); // MDIベースを作成 mdiWindow = new MdiWindow(); mdiWindow->Create( m_hWnd, rect, NULL, WS_CHILD ); wam.AddMdiWindow( mdiWindow ); extern HWND hOwner; hOwner = m_hWnd; extern WNDPROC oldMainFrameWndProc; oldMainFrameWndProc = (WNDPROC)::GetWindowLong( hOwner, GWL_WNDPROC ); ::SetWindowLong( hOwner, GWL_WNDPROC, (LONG)WindowFunc ); SetupWindow(hOwner); //テキストエディタフォント設定 ResetTextEditFont(hOwner); return 0; } void MainFrame::OnSize(UINT nType, CSize size) { //mdiWindow->MoveWindow( 0, 0, size.cx, size.cy ); } BOOL MainFrame::OnQueryEndSession(UINT nSource, UINT uLogOff) { OnClose(); return TRUE; } void MainFrame::OnClose() { extern BOOL bSearchingClasses; if(bSearchingClasses){ pobj_ClassTreeView->bCloseSwitch=1; return; } //コンパイラビューを閉じる extern HWND hCompileView; if( hCompileView && ::IsWindow( hCompileView ) ) { SendMessage(hCompileView,WM_COMMAND,IDCANCEL,0); } //次回起動時にMDIウィンドウを最大化させるかを判定 HWND hChild=::GetWindow(hClient,GW_CHILD); pobj_nv->bMDIZoomed=::IsZoomed(hChild); //プロジェクトを閉じる if( projectInfo.IsOpened() ){ if(!projectInfo.Close()) return; } //MDIウィンドウの保存確認 hChild=::GetWindow(hClient,GW_CHILD); while(hChild){ if(!DocumentModifyCheck(hChild)) return; hChild=::GetNextWindow(hChild,GW_HWNDNEXT); } KillTimer(ID_TIMER_BACKUP); //ProjectViewの位置を保存、ProjectViewを破棄 extern HWND hProjectView; extern HWND hProjectView_ToolWindow; ::GetWindowRect(hProjectView_ToolWindow,&pobj_nv->rectProjectView); ::DestroyWindow(hProjectView); ::DestroyWindow(hProjectView_ToolWindow); //Rebarの位置を保存、Rebarを破棄 delete pobj_Rebar; pobj_Rebar=0; //タブコントロールを破棄 delete pobj_MainTab; pobj_MainTab=0; //SideWebを破棄 delete pobj_SideWeb; pobj_SideWeb=0; //メインウィンドウの最大化有無、座標を保存 if(IsZoomed()) pobj_nv->bWindowMax=1; else if(!IsIconic()){ pobj_nv->bWindowMax=0; GetWindowRect(&pobj_nv->StartupWindowRect); } hChild=::GetWindow(hClient,GW_CHILD); while(hChild){ CloseDocWindow(GetWndNum(hChild)); ::DestroyWindow(hChild); hChild=::GetWindow(hClient,GW_CHILD); } EndProjectEditor(); //ProjectEditorの情報を保存 //エディタ用フォントを破棄 extern HFONT hFont_TextEdit,hFont_HyperLink_TextEdit; if(hFont_TextEdit) DeleteObject(hFont_TextEdit); if(hFont_HyperLink_TextEdit) DeleteObject(hFont_HyperLink_TextEdit); DestroyWindow(); } void MainFrame::OnDestroy() { mdiWindow->DestroyWindow(); delete mdiWindow; ::PostQuitMessage( 0 ); } void backup(void *dummy); void MainFrame::OnTimer( UINT_PTR id ) { switch( id ) { case ID_TIMER_BACKUP: _beginthread( backup, 0, 0 ); break; #ifndef THETEXT case ID_DEBUGSAFTY: { //BasicCompiler.exeが強制終了しているかどうかを検証 extern CDebugger *pobj_Debugger; pobj_Debugger->SaftyCheck(); break; } #endif } } void ResetState_EditMenu(void); void MainFrame::OnDrawClipboard() { ResetState_EditMenu(); } void MenuAdvice(WPARAM msg); void MainFrame::OnMenuSelect( UINT nItemID, UINT nFlags, HMENU menu ) { MenuAdvice( nItemID ); } void MainFrame::OnInitMenu( HMENU menu ) { extern CNonVolatile *pobj_nv; extern CSubMenuEx *pobj_FileHistoryMenu; pobj_nv->pobj_History->ResetFileMenu(pobj_FileHistoryMenu,1); #ifndef THETEXT extern CSubMenuEx *pobj_ProjectHistoryMenu; pobj_nv->pobj_ProjectHistory->ResetFileMenu(pobj_ProjectHistoryMenu,0); #endif } void MainFrame::OnMeasureItem( int nIDCtl, LPMEASUREITEMSTRUCT lpMI ) { if(lpMI->CtlType==ODT_MENU){ SIZE size; CMenuItemData *pobj_MenuItemData; pobj_MenuItemData=(CMenuItemData *)lpMI->itemData; if(pobj_MenuItemData->pobj_ThisMenu->hMenu==pobj_MainMenu->hMenu){ //メインメニューの親アイテム pobj_MainMenu->GetItemSize(pobj_MenuItemData->item_index,&size); lpMI->itemWidth = size.cx; lpMI->itemHeight = size.cy; } else{ //メインメニューにぶらさがるサブメニュー pobj_MenuItemData->pobj_ThisMenu->GetItemSize(pobj_MenuItemData->item_index,&size); lpMI->itemWidth = size.cx; lpMI->itemHeight = size.cy; } } } void MainFrame::OnDrawItem( int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct ) { if(lpDrawItemStruct->CtlType==ODT_MENU){ if(!pobj_MainMenu) return; CMenuItemData *pobj_MenuItemData; pobj_MenuItemData=(CMenuItemData *)lpDrawItemStruct->itemData; if(pobj_MainMenu->hMenu==pobj_MenuItemData->pobj_ThisMenu->hMenu){ //メインメニューの親アイテム pobj_MainMenu->OwnerDrawMenu(lpDrawItemStruct->hDC, &lpDrawItemStruct->rcItem, (lpDrawItemStruct->itemState&ODS_SELECTED)!=0, pobj_MenuItemData->item_index); } else{ //メインメニューにぶらさがるサブメニュー pobj_MainMenu->OwnerDrawSubMenu(pobj_MenuItemData->pobj_ThisMenu->hMenu, lpDrawItemStruct->hDC, &lpDrawItemStruct->rcItem, (lpDrawItemStruct->itemState&ODS_SELECTED)!=0, pobj_MenuItemData->item_index); } } } LRESULT MainFrame::OnNotify( int idCtrl, LPNMHDR pnmh ) { NMPGCALCSIZE *lpCalcSize; NMPGSCROLL *lpScroll; if(!pnmh) return 0; LPTOOLTIPTEXT TipText=(LPTOOLTIPTEXT)pnmh; if(TipText->hdr.code==TTN_NEEDTEXT) ShowToolTipText(TipText); extern HWND hStandardToolbarPager; extern HWND hDebuggerToolbarPager; if(pobj_Rebar){ //レバーオブジェクトが存在するとき if(pnmh->hwndFrom==pobj_Rebar->hRebar&&pnmh->code==RBN_HEIGHTCHANGE){ ResizeOwnerWnd(); return 0; } } if(pnmh->hwndFrom==hStandardToolbarPager){ if(pnmh->code==PGN_CALCSIZE){ lpCalcSize=(LPNMPGCALCSIZE)pnmh; if(lpCalcSize->dwFlag==PGF_CALCWIDTH) lpCalcSize->iWidth=BMPNUM_STANDARDTOOLBAR*23+SEPNUM_STANDARDTOOLBAR*8; } else if(pnmh->code==PGN_SCROLL){ lpScroll=(LPNMPGSCROLL)pnmh; lpScroll->iScroll=20; } } else if(pnmh->hwndFrom==hDebuggerToolbarPager){ if(pnmh->code==PGN_CALCSIZE){ lpCalcSize=(LPNMPGCALCSIZE)pnmh; if(lpCalcSize->dwFlag==PGF_CALCWIDTH) lpCalcSize->iWidth=BMPNUM_DEBUGGERTOOLBAR*23+SEPNUM_DEBUGGERTOOLBAR*8; } else if(pnmh->code==PGN_SCROLL){ lpScroll=(LPNMPGSCROLL)pnmh; lpScroll->iScroll=20; } } if(pobj_MainTab){ if(pnmh->hwndFrom==pobj_MainTab->hTab){ if(pnmh->code==TCN_SELCHANGE) pobj_MainTab->SelChangeEvent(); if(pnmh->code==NM_RCLICK){ TCHITTESTINFO tcHitTest; GetCursorPos(&tcHitTest.pt); ::ScreenToClient(pobj_MainTab->hTab,&tcHitTest.pt); int index = TabCtrl_HitTest(pobj_MainTab->hTab,&tcHitTest); if( index == -1 ) return 0; TabCtrl_SetCurSel(pobj_MainTab->hTab,index); pobj_MainTab->SelChangeEvent(); ///////////////////// // メニューを表示 ///////////////////// HWND hChild=::GetWindow(hClient,GW_CHILD); int WndNum=GetWndNum(hChild); //保存コマンドの文字列をセット char temporary[1024], temp2[1024]; MENUITEMINFO mii; mii.cbSize=sizeof(MENUITEMINFO); mii.fMask=MIIM_TYPE; mii.dwTypeData=temporary; mii.fType=MFT_STRING; if(!MdiInfo[WndNum].path.empty()){ _splitpath(MdiInfo[WndNum].path.c_str(),NULL,NULL,temporary,temp2); lstrcat(temporary,temp2); lstrcat(temporary," を保存(&S)"); } else{ lstrcpy(temporary,"保存(&S)"); } extern HMENU hTabMenu; SetMenuItemInfo(hTabMenu,IDM_SAVE,FALSE,&mii); /*「絶対パスをコピー」「フォルダを開く」「ファイルを削除」 コマンドを場合によって無効化にする */ if(!MdiInfo[WndNum].path.empty()){ EnableMenuItem(hTabMenu,IDM_PATH_COPY,MF_BYCOMMAND|MF_ENABLED); EnableMenuItem(hTabMenu,IDM_FOLDER_OPEN,MF_BYCOMMAND|MF_ENABLED); EnableMenuItem(hTabMenu,IDM_DELETE_FILE,MF_BYCOMMAND|MF_ENABLED); } else{ EnableMenuItem(hTabMenu,IDM_PATH_COPY,MF_BYCOMMAND|MF_GRAYED); EnableMenuItem(hTabMenu,IDM_FOLDER_OPEN,MF_BYCOMMAND|MF_GRAYED); EnableMenuItem(hTabMenu,IDM_DELETE_FILE,MF_BYCOMMAND|MF_GRAYED); } POINT MousePos; GetCursorPos(&MousePos); TrackPopupMenu(hTabMenu,TPM_LEFTALIGN|TPM_RIGHTBUTTON,MousePos.x,MousePos.y,0,hOwner,NULL); } } } if(pobj_SideWeb){ if(pnmh->hwndFrom==pobj_SideWeb->hTab&&pnmh->code==TCN_SELCHANGE){ pobj_SideWeb->SelChangeEvent(); } } return 0; } void MainFrame::OnDropFiles( HDROP hDropInfo ) { int max = DragQueryFile(hDropInfo,-1,0,0); for(int i=0;ibuffer; //行の先頭インデックスを取得(取得する行の番号はwParamで渡される) int i,i2; for(i=0,i2=0;;i++){ if(i2>=(int)wParam) break; if(pTemp[i]=='\0') break; if(pTemp[i]=='\r'&&pTemp[i+1]=='\n'){ i++; i2++; } } POINT pos; pos.x=i; //行の終端インデックスを取得 for(;;i++){ if(pTemp[i]=='\0') break; if(pTemp[i]=='\r'&&pTemp[i+1]=='\n') break; } pos.y=i; //行を選択する TextEdit_SetSel(WndNum,pos.x,pos.y,TRUE); return 0; } void MainFrame::OnCmdNew( UINT uNotifyCode, int nID, CWindow wndCtl ) { #ifdef THETEXT NewTextEditWindow(NULL,WNDTYPE_TEXT); return; #else int FileType; BOOL bAddToProject; char temporary[MAX_PATH]; FileType=DialogBox(hResInst,MAKEINTRESOURCE(IDD_NEWFILE),hOwner,(DLGPROC)DlgNewFile); if(FileType==-1) return; if(FileType&0x00008000){ bAddToProject=1; FileType&=0x0FFF; extern char NewFileName[MAX_PATH]; lstrcpy(temporary,NewFileName); if(!strstr(temporary,".")) lstrcat(temporary,".ab"); lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() ); } else bAddToProject=0; switch(FileType){ case FT_BASICPROGRAM: //Basicプログラム case FT_SUBPROGRAM: if(bAddToProject){ WriteBuffer(temporary,0,0); NewTextEditWindow(temporary,WNDTYPE_BASIC); Project_File_Insert(temporary); } else NewTextEditWindow(NULL,WNDTYPE_BASIC); break; case FT_PROJECT: DlgNewProjectWizard(hOwner); break; case FT_TEXT: NewTextEditWindow(NULL,WNDTYPE_TEXT); break; case FT_HTML: NewTextEditWindow(NULL,WNDTYPE_HTML); break; case FT_ICON: NewIconEditWindow(NULL); break; } #endif } void MainFrame::OnCmdOpen( UINT uNotifyCode, int nID, CWindow wndCtl ) { //"ファイルを指定してください" extern LPSTR DefFileFilter; char temporary[1024]; if(!GetFilePathDialog(m_hWnd,temporary,DefFileFilter,STRING_FILEOPENTITLE_DEFAULT,TRUE)) return; OpenFileWithExtension( temporary ); } void MainFrame::OnCmdClose( UINT uNotifyCode, int nID, CWindow wndCtl ) { HWND hChild=::GetWindow(hClient,GW_CHILD); if(::IsWindow(hChild)) SendMessage(hChild,WM_CLOSE,0,0); } void MainFrame::OnCmdProjectOpen( UINT uNotifyCode, int nID, CWindow wndCtl ) { //"プロジェクト ファイルを指定して下さい" extern LPSTR ProjectFileFilter; char temporary[1024]; if(!GetFilePathDialog(m_hWnd,temporary,ProjectFileFilter,STRING_FILEOPENTITLE_PROJECT,TRUE)) { return; } projectInfo.Load(temporary); } void MainFrame::OnCmdProjectSave( UINT uNotifyCode, int nID, CWindow wndCtl ) { projectInfo.Save(); } void MainFrame::OnCmdProjectClose( UINT uNotifyCode, int nID, CWindow wndCtl ) { projectInfo.Close(); } void MainFrame::OnCmdProjectFolderOpen( UINT uNotifyCode, int nID, CWindow wndCtl ) { ShellExecute(m_hWnd,"explore",projectInfo.GetWorkDir().GetPath().c_str(),NULL,NULL,SW_SHOWNORMAL); } void MainFrame::OnCmdSave( UINT uNotifyCode, int nID, CWindow wndCtl ) { SaveDocument(::GetWindow(hClient,GW_CHILD),NULL); } void MainFrame::OnCmdNewSave( UINT uNotifyCode, int nID, CWindow wndCtl ) { //"保存先のファイルを指定してください" extern LPSTR DefFileFilter; char temporary[1024]; if(!GetFilePathDialog(m_hWnd,temporary,DefFileFilter,STRING_FILESAVETITLE_DEFAULT,FALSE)) return; SaveDocument(::GetWindow(hClient,GW_CHILD),temporary); } void MainFrame::OnCmdCodeSave( UINT uNotifyCode, int nID, CWindow wndCtl ) { //文字コードを指定して保存 DialogBox(hResInst,MAKEINTRESOURCE(IDD_CODE_SAVE),m_hWnd,(DLGPROC)nkfDlgCodeSave); } void MainFrame::OnCmdAllSave( UINT uNotifyCode, int nID, CWindow wndCtl ) { for( int i=0;ibuffer+CharRange.cpMin,CharRange.cpMax-CharRange.cpMin); pTemp[CharRange.cpMax-CharRange.cpMin]=0; GlobalUnlock(hGlobal); //クリップボードに保存 OpenClipboard(); EmptyClipboard(); SetClipboardData(CF_TEXT,hGlobal); CloseClipboard(); //選択文字列を消去 SendMessage(hEdit,WM_KEYDOWN,VK_DELETE,0); } else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){ ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[WndNum].path); int indexOfWndInfo = GetWndInfoNum(MdiInfo[WndNum].path); //クリップボードに格納するためのデータを用意する pWindowInfo->childWindowInfos[MdiInfo[WndNum].MdiRadInfo->SelectingItem[0]]->pos.x-=17; pWindowInfo->childWindowInfos[MdiInfo[WndNum].MdiRadInfo->SelectingItem[0]]->pos.y-=10; HGLOBAL hGlobal=Rad_GetChildInfoClipboardData(WndNum,indexOfWndInfo); pWindowInfo->childWindowInfos[MdiInfo[WndNum].MdiRadInfo->SelectingItem[0]]->pos.x+=17; pWindowInfo->childWindowInfos[MdiInfo[WndNum].MdiRadInfo->SelectingItem[0]]->pos.y+=10; OpenClipboard(); EmptyClipboard(); extern DWORD dwRadClipboardID; SetClipboardData(dwRadClipboardID,hGlobal); CloseClipboard(); SendMessage(MdiInfo[WndNum].MdiRadInfo->hRad,WM_COMMAND,IDM_RAD_ITEM_DELETE,0); } else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){ //クリップボードに格納するためのデータを用意する HGLOBAL hGlobal=IconEdit_GetChildInfoClipboardData(WndNum); if(hGlobal==0) return; OpenClipboard(); EmptyClipboard(); SetClipboardData(CF_BITMAP,hGlobal); CloseClipboard(); DeleteObject(MdiInfo[WndNum].MdiIconEditInfo->hSelectingBmp); MdiInfo[WndNum].MdiIconEditInfo->SelectLevel=0; IconEdit_EraseRect(WndNum,&MdiInfo[WndNum].MdiIconEditInfo->DraggingRect); } } void MainFrame::OnCmdCopy( UINT uNotifyCode, int nID, CWindow wndCtl ) { HWND hChild=::GetWindow(hClient,GW_CHILD); int WndNum=GetWndNum(hChild); if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){ HWND hEdit = ::GetWindow(hChild,GW_CHILD); CHARRANGE CharRange; TextEdit_GetSel(WndNum,&CharRange); HGLOBAL hGlobal=(char *)GlobalAlloc(GMEM_MOVEABLE,CharRange.cpMax-CharRange.cpMin+1); char *pTemp=(char *)GlobalLock(hGlobal); memcpy(pTemp,MdiInfo[WndNum].pMdiTextEdit->buffer+CharRange.cpMin,CharRange.cpMax-CharRange.cpMin); pTemp[CharRange.cpMax-CharRange.cpMin]=0; GlobalUnlock(hGlobal); //クリップボードに保存 OpenClipboard(); EmptyClipboard(); SetClipboardData(CF_TEXT,hGlobal); CloseClipboard(); } else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){ int indexOfWndInfo = GetWndInfoNum(MdiInfo[WndNum].path); //クリップボードに格納するためのデータを用意する HGLOBAL hGlobal=Rad_GetChildInfoClipboardData(WndNum,indexOfWndInfo); OpenClipboard(); EmptyClipboard(); extern DWORD dwRadClipboardID; SetClipboardData(dwRadClipboardID,hGlobal); CloseClipboard(); } else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){ //クリップボードに格納するためのデータを用意する HGLOBAL hGlobal=IconEdit_GetChildInfoClipboardData(WndNum); OpenClipboard(); EmptyClipboard(); SetClipboardData(CF_BITMAP,hGlobal); CloseClipboard(); } } void MainFrame::OnCmdPaste( UINT uNotifyCode, int nID, CWindow wndCtl ) { HWND hChild=::GetWindow(hClient,GW_CHILD); int WndNum=GetWndNum(hChild); if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){ HWND hEdit=::GetWindow(hChild,GW_CHILD); //クリップボードを開く OpenClipboard(); HGLOBAL hGlobal=GetClipboardData(CF_TEXT); if(!hGlobal){ CloseClipboard(); return; } char *pTemp; if(pobj_nv->bPasteIndent){ //インデント整形 pTemp=CodeFormatter((char *)GlobalLock(hGlobal)); GlobalUnlock(hGlobal); } else pTemp=(char *)GlobalLock(hGlobal); //テキストエディタの文字列をリプレイス TextEdit_ReplaceUpdateUndoData(WndNum, pTemp, 1, 1); if(pobj_nv->bPasteIndent) HeapDefaultFree(pTemp); else GlobalUnlock(hGlobal); //クリップボードを閉じる CloseClipboard(); //キャレット位置までスクロールする TextEdit_ScrollCaret(WndNum,0); ResetCaretPos(WndNum); } else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){ OpenClipboard(); extern DWORD dwRadClipboardID; HGLOBAL hGlobal=GetClipboardData(dwRadClipboardID); if(!hGlobal){ CloseClipboard(); return; } Rad_PasteChildInfoClipboardData(WndNum,hGlobal); CloseClipboard(); } else if(MdiInfo[WndNum].DocType==WNDTYPE_ICONEDIT){ OpenClipboard(); HGLOBAL hGlobal=GetClipboardData(CF_BITMAP); if(!hGlobal){ CloseClipboard(); return; } IconEdit_PasteChildInfoClipboardData(WndNum,(HBITMAP)hGlobal); CloseClipboard(); } } void MainFrame::OnCmdDelete( UINT uNotifyCode, int nID, CWindow wndCtl ) { HWND hChild=::GetWindow(hClient,GW_CHILD); int WndNum=GetWndNum(hChild); if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){ HWND hEdit=::GetWindow(hChild,GW_CHILD); TextEdit_ReplaceUpdateUndoData(WndNum,"",0,1); } else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD) SendMessage(MdiInfo[WndNum].MdiRadInfo->hRad,WM_COMMAND,IDM_RAD_ITEM_DELETE,0); } void MainFrame::OnCmdAllSelect( UINT uNotifyCode, int nID, CWindow wndCtl ) { HWND hChild=::GetWindow(hClient,GW_CHILD); int WndNum=GetWndNum(hChild); if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){ HWND hEdit=::GetWindow(hChild,GW_CHILD); MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x=0; MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y=0; GetCaretPosFromBufferIndex( MdiInfo[WndNum].pMdiTextEdit->buffer, lstrlen(MdiInfo[WndNum].pMdiTextEdit->buffer), &MdiInfo[WndNum].pMdiTextEdit->EndCaretPos); ::InvalidateRect(hEdit,NULL,0); ResetState_EditMenu(); } else if(MdiInfo[WndNum].DocType==WNDTYPE_RAD){ ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[WndNum].path); for( int i3=0; i3(pWindowInfo->childWindowInfos.size()); i3++ ) { MdiInfo[WndNum].MdiRadInfo->SelectingItem[i3] = i3; } DrawRadWindow(WndNum,pWindowInfo); } } void MainFrame::OnCmdFind( UINT uNotifyCode, int nID, CWindow wndCtl ) { DialogBox(hResInst,MAKEINTRESOURCE(IDD_FIND),m_hWnd,(DLGPROC)DlgFind); } void MainFrame::OnCmdPermutation( UINT uNotifyCode, int nID, CWindow wndCtl ) { DialogBox(hResInst,MAKEINTRESOURCE(IDD_PERMUTATION),m_hWnd,(DLGPROC)DlgPermutation); } void MainFrame::OnCmdConvertX( UINT uNotifyCode, int nID, CWindow wndCtl ) { TextEdit_Convert( nID ); } #ifdef THETEXT void MainFrame::OnCmdStringCount( UINT uNotifyCode, int nID, CWindow wndCtl ) { DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_STRING_COUNT),m_hWnd,(DLGPROC)DlgStringCount,0); } void MainFrame::OnCmdSelStringCount( UINT uNotifyCode, int nID, CWindow wndCtl ) { DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_STRING_COUNT),m_hWnd,(DLGPROC)DlgStringCount,1); } #endif void MainFrame::OnCmdProjectView( UINT uNotifyCode, int nID, CWindow wndCtl ) { extern HWND hProjectView; bool isCheck = false; if(pobj_nv->bClipProjectView){ if(::IsWindowVisible(hProjectView)){ ::ShowWindow(hProjectView,SW_HIDE); } else{ ::ShowWindow(hProjectView,SW_SHOW); isCheck = true; } } else{ extern HWND hProjectView_ToolWindow; if(::IsWindowVisible(hProjectView_ToolWindow)){ ::ShowWindow(hProjectView_ToolWindow,SW_HIDE); } else{ ::ShowWindow(hProjectView_ToolWindow,SW_SHOW); ::ShowWindow(hProjectView,SW_SHOW); isCheck = true; } } pobj_MainMenu->CheckMenu(IDM_PROJECTVIEW,isCheck); //再配置 ResizeOwnerWnd(); ::ShowWindow(hClient,SW_SHOW); } void MainFrame::OnCmdProjectOption( UINT uNotifyCode, int nID, CWindow wndCtl ) { DlgProjectOptionSetting( m_hWnd ); } void MainFrame::OnCmdTopMost( UINT uNotifyCode, int nID, CWindow wndCtl ) { if(pobj_MainMenu->IsCheck(IDM_TOPMOST)){ SetWindowPos( HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); pobj_MainMenu->CheckMenu(IDM_TOPMOST,0); } else{ SetWindowPos( HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); pobj_MainMenu->CheckMenu(IDM_TOPMOST,1); } } void ResetState_ViewMenu(void); void MainFrame::OnCmdRightTurn( UINT uNotifyCode, int nID, CWindow wndCtl ) { pobj_nv->bRightTurn^=1; ResetState_ViewMenu(); //トップのウィンドウを再描画 RedrawAllWindow(); } void MainFrame::OnCmdSet( UINT uNotifyCode, int nID, CWindow wndCtl ) { DlgOptionSetting( m_hWnd ); } void CreateProcessWithStdHandle( const std::string &appPath, const std::string &cmdLine) { std::string argsStr = (std::string)"\"" + appPath + "\" " + cmdLine; STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si,0,sizeof(STARTUPINFO)); si.cb=sizeof(STARTUPINFO); si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); si.hStdInput = GetStdHandle(STD_INPUT_HANDLE); si.hStdError = GetStdHandle(STD_ERROR_HANDLE); char args[8192]; lstrcpy( args, argsStr.c_str() ); CreateProcess( NULL, args, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi ); } #ifndef THETEXT void MainFrame::OnCmdDebug( UINT uNotifyCode, int nID, CWindow wndCtl ) { char temporary[1024], temp2[1024], temp3[1024]; if(pobj_Debugger->IsDebugging()){ pobj_Debugger->DebugContinue(); return; } HWND hChild = ::GetWindow(hClient,GW_CHILD); if( projectInfo.IsOpened() ){ //プロジェクトが開かれている場合 if(!SetProjectToRun()) return; //デバッグ用のコマンドライン及び実行可能ファイル(DLLのみ) sprintf(temporary,"%s\r\n%s",projectInfo.szExePath,projectInfo.szCmdLine); sprintf(temp2,"%spgm.tmp",pj_editor_Dir); HANDLE hFile=CreateFile(temp2,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_TEMPORARY,NULL); DWORD dwAccessBytes; WriteFile(hFile,temporary,lstrlen(temporary),&dwAccessBytes,NULL); CloseHandle(hFile); //ソースファイル名をtemp2へ projectInfo.pobj_DBFileInfo->ppobj_FileInfo[0]->GetFullPath(temp2); //出力ファイル名をtemp3へ lstrcpy(temp3,projectInfo.lpszOutput_Debug); lstrcpy( temp3, projectInfo.GetWorkDir().GetFullPath( temp3 ).c_str() ); if(IsNeedCompileForProject(1)) sprintf(temporary,"\"%s\" \"%s\" /debug /run /wnd:%08x",temp2,temp3,m_hWnd); else sprintf(temporary,"\"%s\" \"%s\" /run /wnd:%08x",temp2,temp3,m_hWnd); // DLLオプション if( projectInfo.GetModuleType() == ActiveBasic::Common::TargetModuleType::Dll ) { lstrcat(temporary," /dll"); } // SLLオプション if( projectInfo.GetModuleType() == ActiveBasic::Common::TargetModuleType::Sll ) { lstrcat(temporary," /static_library"); } //Unicodeオプション if(projectInfo.dwOption & PJ_OP_UNICODE) lstrcat(temporary," /unicode"); //ブレークポイントをセーブ projectInfo.pobj_DBBreakPoint->SaveToTempFile(); } else{ //単独ソースコード if(!SetRunning(hChild)) return; if(IsNeedCompile(MdiInfo[GetWndNum(hChild)].path,1)) sprintf(temporary,"\"%s\" /debug /run /wnd:%08x",MdiInfo[GetWndNum(hChild)].path.c_str(),m_hWnd); else sprintf(temporary,"\"%s\" /run /wnd:%08x",MdiInfo[GetWndNum(hChild)].path.c_str(),m_hWnd); //ブレークポイントをセーブ extern CDBBreakPoint *pobj_DBBreakPoint; pobj_DBBreakPoint->SaveToTempFile(); } //コンパイルビューをクリップするかどうか extern BOOL bClipCompileView; if(bClipCompileView){ lstrcat(temporary," /clip_compile_view"); //コンパイラビューを閉じる extern HWND hCompileView; if(hCompileView==(HWND)-1) return; if(hCompileView){ hChild=hCompileView; hCompileView=(HWND)-1; SendMessage(hChild,WM_COMMAND,IDCANCEL,0); } //重複起動防止のため hCompileView=(HWND)-1; } //インクルードディレクトリ sprintf(temp2," /include_dir:\"%s\"",pobj_nv->GetIncludeDirFullPath().c_str()); lstrcat(temporary,temp2); extern ActiveBasic::Common::Platform::EnumType selectingPlatform; CreateProcessWithStdHandle( ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ), temporary ); } void MainFrame::OnCmdDebugCompile( UINT uNotifyCode, int nID, CWindow wndCtl ) { char temporary[1024], temp2[1024], temp3[1024]; HWND hChild=::GetWindow(hClient,GW_CHILD); if( projectInfo.IsOpened() ){ //プロジェクトが開かれている場合 if(!SetProjectToRun()) return; //ソースファイル名をtemp2へ projectInfo.pobj_DBFileInfo->ppobj_FileInfo[0]->GetFullPath(temp2); //出力ファイル名をtemp3へ lstrcpy(temp3,projectInfo.lpszOutput_Debug); lstrcpy( temp3, projectInfo.GetWorkDir().GetFullPath( temp3 ).c_str() ); sprintf(temporary,"\"%s\" \"%s\" /debug /wnd:%08x",temp2,temp3,m_hWnd); //DLLオプション if( projectInfo.GetModuleType() == ActiveBasic::Common::TargetModuleType::Dll ) { lstrcat(temporary," /dll"); } //Unicodeオプション if(projectInfo.dwOption & PJ_OP_UNICODE) lstrcat(temporary," /unicode"); } else{ //単独ソースコード if(!SetRunning(hChild)) return; sprintf(temporary,"\"%s\" /debug /wnd:%08x",MdiInfo[GetWndNum(hChild)].path.c_str(),m_hWnd); } //コンパイルビューをクリップするかどうか extern BOOL bClipCompileView; if(bClipCompileView){ lstrcat(temporary," /clip_compile_view"); //コンパイラビューを閉じる extern HWND hCompileView; if(hCompileView==(HWND)-1) return; if(hCompileView){ hChild=hCompileView; hCompileView=(HWND)-1; if( ::IsWindow( hChild ) ) { SendMessage(hChild,WM_COMMAND,IDCANCEL,0); } } //重複起動防止のため hCompileView=(HWND)-1; } //インクルードディレクトリ sprintf(temp2," /include_dir:\"%s\"",pobj_nv->GetIncludeDirFullPath().c_str()); lstrcat(temporary,temp2); extern ActiveBasic::Common::Platform::EnumType selectingPlatform; CreateProcessWithStdHandle( ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ), temporary ); } void MainFrame::OnCmdAttach( UINT uNotifyCode, int nID, CWindow wndCtl ) { char temporary[1024], temp2[1024]; int idProcess; DWORD dwPlatform; idProcess=DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_ATTACH),m_hWnd,(DLGPROC)DlgAttach,(LPARAM)&dwPlatform); if(idProcess==0) return; sprintf(temporary,"/attach:%08x /wnd:%08x",idProcess,m_hWnd); //コンパイルビューをクリップするかどうか extern BOOL bClipCompileView; if(bClipCompileView){ lstrcat(temporary," /clip_compile_view"); //コンパイラビューを閉じる extern HWND hCompileView; if(hCompileView==(HWND)-1) return; if(hCompileView){ HWND hChild=hCompileView; hCompileView=(HWND)-1; SendMessage(hChild,WM_COMMAND,IDCANCEL,0); } //重複起動防止のため hCompileView=(HWND)-1; } //インクルードディレクトリ sprintf(temp2," /include_dir:\"%s\"",pobj_nv->GetIncludeDirFullPath().c_str()); lstrcat(temporary,temp2); ActiveBasic::Common::Platform::EnumType platform; if(dwPlatform==IMAGE_FILE_MACHINE_I386) { platform = ActiveBasic::Common::Platform::X86; } else if(dwPlatform==IMAGE_FILE_MACHINE_AMD64) { platform = ActiveBasic::Common::Platform::X64; } else { throw; } extern ActiveBasic::Common::Platform::EnumType selectingPlatform; CreateProcessWithStdHandle( ActiveBasic::Common::Environment::GetCompilerExePath( platform ), temporary ); } void MainFrame::OnCmdReleaseCompile( UINT uNotifyCode, int nID, CWindow wndCtl ) { char temporary[1024], temp2[1024], temp3[1024]; HWND hChild=::GetWindow(hClient,GW_CHILD); if( projectInfo.IsOpened() ){ //プロジェクトが開かれている場合 if(!SetProjectToRun()) return; //ソースファイル名をtemp2へ projectInfo.pobj_DBFileInfo->ppobj_FileInfo[0]->GetFullPath(temp2); //出力ファイル名をtemp3へ lstrcpy(temp3,projectInfo.lpszOutput_Release); lstrcpy( temp3, projectInfo.GetWorkDir().GetFullPath( temp3 ).c_str() ); sprintf(temporary,"\"%s\" \"%s\" /wnd:%08x",temp2,temp3,m_hWnd); //DLLオプション if( projectInfo.GetModuleType() == ActiveBasic::Common::TargetModuleType::Dll ) { lstrcat(temporary," /dll"); } //Unicodeオプション if(projectInfo.dwOption & PJ_OP_UNICODE) lstrcat(temporary," /unicode"); } else{ //単独ソースコード if(!SetRunning(hChild)) return; sprintf(temporary,"\"%s\" /wnd:%08x",MdiInfo[GetWndNum(hChild)].path.c_str(),m_hWnd); } //コンパイルビューをクリップするかどうか extern BOOL bClipCompileView; if(bClipCompileView){ lstrcat(temporary," /clip_compile_view"); //コンパイラビューを閉じる extern HWND hCompileView; if(hCompileView==(HWND)-1) return; if(hCompileView){ hChild=hCompileView; hCompileView=(HWND)-1; SendMessage(hChild,WM_COMMAND,IDCANCEL,0); } //重複起動防止のため hCompileView=(HWND)-1; } //インクルードディレクトリ sprintf(temp2," /include_dir:\"%s\"",pobj_nv->GetIncludeDirFullPath().c_str()); lstrcat(temporary,temp2); extern ActiveBasic::Common::Platform::EnumType selectingPlatform; CreateProcessWithStdHandle( ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ), temporary ); } void MainFrame::OnCmdReleaseRun( UINT uNotifyCode, int nID, CWindow wndCtl ) { char temporary[1024], temp2[1024], temp3[1024]; HWND hChild=::GetWindow(hClient,GW_CHILD); if( projectInfo.IsOpened() ){ /* //プロジェクトが開かれている場合 if(!SetProjectToRun()) return; //必要であればリリースコンパイル if(IsNeedCompileForProject(0)) SendMessage(WM_COMMAND,IDM_RELEASECOMPILE,0);*/ if( projectInfo.GetModuleType() == ActiveBasic::Common::TargetModuleType::Dll ) { lstrcpy(temporary,projectInfo.szExePath); } else{ lstrcpy(temporary,projectInfo.lpszOutput_Debug); lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() ); } } else{ /* //必要であればリリースコンパイル if(!SetRunning(hChild)) return; if(IsNeedCompile(MdiInfo[GetWndNum(hChild)].path,0)) SendMessage(WM_COMMAND,IDM_RELEASECOMPILE,0);*/ //単独ソースコード _splitpath(MdiInfo[GetWndNum(hChild)].path.c_str(),temporary,temp2,temp3,NULL); lstrcat(temporary,temp2); lstrcat(temporary,temp3); lstrcat(temporary,".exe"); } //インクルードディレクトリ sprintf(temp2," /include_dir:\"%s\"",pobj_nv->GetIncludeDirFullPath().c_str()); lstrcat(temporary,temp2); ShellExecute(m_hWnd,"open",temporary,NULL,NULL,SW_SHOWNORMAL); } void MainFrame::OnCmdStepIn( UINT uNotifyCode, int nID, CWindow wndCtl ) { pobj_Debugger->StepIn(); } void MainFrame::OnCmdStepOver( UINT uNotifyCode, int nID, CWindow wndCtl ) { pobj_Debugger->StepOver(); } void MainFrame::OnCmdStepCursor( UINT uNotifyCode, int nID, CWindow wndCtl ) { pobj_Debugger->StepToCursor(); } void MainFrame::OnCmdBreakPoint( UINT uNotifyCode, int nID, CWindow wndCtl ) { if( projectInfo.IsOpened() ){ projectInfo.pobj_DBBreakPoint->Event_BreakPoint(); } else{ extern CDBBreakPoint *pobj_DBBreakPoint; pobj_DBBreakPoint->Event_BreakPoint(); } } void MainFrame::OnCmdDebugStop( UINT uNotifyCode, int nID, CWindow wndCtl ) { pobj_Debugger->DebugStop(); } void MainFrame::OnCmdDebugPause( UINT uNotifyCode, int nID, CWindow wndCtl ) { pobj_Debugger->DebugPause(); } #endif // not THETEXT void MainFrame::OnCmdWebLink( UINT uNotifyCode, int nID, CWindow wndCtl ) { switch( nID ) { #ifndef THETEXT case IDM_COMMUNITY: OpenWebBrowser( "http://www.activebasic.com/forum/" ); break; case IDM_COMMU_SEARCH: OpenWebBrowser( "http://www.activebasic.com/forum/search.php" ); break; case IDM_COMMU_PM: OpenWebBrowser( "http://www.activebasic.com/forum/privmsg.php?folder=inbox" ); break; case ID_COMMU_FORUM1: OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=1" ); break; case ID_COMMU_FORUM2: OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=2" ); break; case ID_COMMU_FORUM3: OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=5" ); break; case ID_COMMU_FORUM4: OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=3" ); break; case ID_COMMU_FORUM5: OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=6" ); break; case ID_COMMU_FORUM6: OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=8" ); break; case ID_COMMU_FORUM7: OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=4" ); break; case ID_COMMU_FORUM8: OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=7" ); break; case IDM_AB_WEBSITE: OpenWebBrowser( "http://www.activebasic.com/" ); break; case IDM_ACTBDL: OpenWebBrowser( "http://www.activebasic.com/activebasic5/download.htm" ); break; #else case IDM_DSHOMEPAGE: OpenWebBrowser( "http://www.discoversoft.net/" ); break; #endif // not THETEXT default: throw; } } void MainFrame::OnCmdTopics( UINT uNotifyCode, int nID, CWindow wndCtl ) { char temporary[1024]; #ifdef THETEXT sprintf(temporary,"%sTopics\\index.html",pj_editor_Dir); ShellExecute(m_hWnd,"open",temporary,NULL,NULL,SW_SHOWNORMAL); #else sprintf(temporary,"%sBasicHelp.chm",pj_editor_Dir); HtmlHelp(NULL,temporary,HH_DISPLAY_TOPIC,0); #endif } void MainFrame::OnCmdAbout( UINT uNotifyCode, int nID, CWindow wndCtl ) { DialogBox(hResInst,MAKEINTRESOURCE(IDD_ABOUT),m_hWnd,(DLGPROC)DialogAbout); } void MainFrame::OnCmdDocSelectBand( UINT uNotifyCode, int nID, CWindow wndCtl ) { pobj_Rebar->ChangeRebarBand(ID_DOCCOMBO); } void MainFrame::OnCmdStandardBand( UINT uNotifyCode, int nID, CWindow wndCtl ) { pobj_Rebar->ChangeRebarBand(ID_STANDARDTOOLBAR); } void MainFrame::OnCmdReleaseBand( UINT uNotifyCode, int nID, CWindow wndCtl ) { pobj_Rebar->ChangeRebarBand(ID_RELEASETOOLBAR); } void MainFrame::OnCmdDebugBand( UINT uNotifyCode, int nID, CWindow wndCtl ) { pobj_Rebar->ChangeRebarBand(ID_DEBUGGERTOOLBAR); } void MainFrame::OnCmdSelectCompilerBand( UINT uNotifyCode, int nID, CWindow wndCtl ) { pobj_Rebar->ChangeRebarBand(ID_SELECTCOMPILERCOMBO); } void MainFrame::OnCmdNoGripper( UINT uNotifyCode, int nID, CWindow wndCtl ) { if(pobj_nv->bNoGripper) pobj_nv->bNoGripper=0; else pobj_nv->bNoGripper=1; //レバーコントロールを再生成 pobj_Rebar->ResetRebar(); //メニュー状態を設定 ResetState_DocMenu(); } void MainFrame::OnCmdResetRebar( UINT uNotifyCode, int nID, CWindow wndCtl ) { //"ツールバーの配置をすべて初期状態に戻します。\nよろしいですか?" if( MessageBox(STRING_TOOLBAR_RESET,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION) == IDCANCEL ) { return; } //レバーコントロールを再生成 pobj_Rebar->ResetInitRebar(); //メニュー状態を設定 ResetState_DocMenu(); } void MainFrame::OnCmdAllCloseOmitMyself( UINT uNotifyCode, int nID, CWindow wndCtl ) { //このウィンドウ以外をすべて閉じる(&A) HWND hChild=::GetWindow(hClient,GW_CHILD); int WndNum=GetWndNum(hChild); for(int i=0;iUnModify(); SendMessage(MdiInfo[WndNum].hwnd,WM_CLOSE,0,0); } void MainFrame::OnCmdColor( UINT uNotifyCode, int nID, CWindow wndCtl ) { static COLORREF colorUser=RGB(255,255,255); switch( nID ) { case IDM_USER_COLOR: { CHOOSECOLOR cc; COLORREF CusColors[16]={ RGB(255,255,255), RGB(0,0,0), RGB(128,128,128), RGB(192,192,192), RGB(128,0,0), RGB(255,0,0), RGB(128,128,0), RGB(255,255,0), RGB(0,128,0), RGB(0,255,0), RGB(0,128,128), RGB(0,255,255), RGB(0,0,128), RGB(0,0,255), RGB(128,0,128), RGB(255,0,255)}; cc.lStructSize=sizeof(CHOOSECOLOR); cc.hwndOwner=m_hWnd; cc.rgbResult=colorUser; cc.lpCustColors=CusColors; cc.Flags=CC_RGBINIT|CC_FULLOPEN; if(!ChooseColor(&cc)){ return; } colorUser=cc.rgbResult; } case IDM_GRAY: case IDM_WHITE: case IDM_RED: case IDM_GREEN: case IDM_BLUE: case IDM_YELLOW: { HWND hChild=::GetWindow(hClient,GW_CHILD); int WndNum=GetWndNum(hChild); TC_ITEM tcItem; tcItem.mask=TCIF_PARAM; if(nID==IDM_GRAY) tcItem.lParam=TABCOLOR_GRAY; if(nID==IDM_WHITE) tcItem.lParam=TABCOLOR_WHITE; if(nID==IDM_RED) tcItem.lParam=TABCOLOR_RED; if(nID==IDM_GREEN) tcItem.lParam=TABCOLOR_GREEN; if(nID==IDM_BLUE) tcItem.lParam=TABCOLOR_BLUE; if(nID==IDM_YELLOW) tcItem.lParam=TABCOLOR_YELLOW; if(nID==IDM_USER_COLOR) tcItem.lParam=colorUser; TabCtrl_SetItem(pobj_MainTab->hTab, TabCtrl_GetCurSel(pobj_MainTab->hTab), &tcItem); ::InvalidateRect(pobj_MainTab->hTab,NULL,0); break; } default: throw; } }