// トグル用のフラグに変更 20060201 aroka BOOL CViewCommander::Command_FUNCLIST( int nAction, int _nOutlineType = OUTLINE_DEFAULT ) { static bool bIsProcessing = false; //アウトライン解析処理中フラグ //アウトラインプラグイン内でのEditor.Outline呼び出しによる再入を禁止する if( bIsProcessing )return FALSE; bIsProcessing = true; // 自プロセスが前面にいるかどうか調べる DWORD dwPid1, dwPid2; dwPid1 = ::GetCurrentProcessId(); ::GetWindowThreadProcessId( ::GetForegroundWindow(), &dwPid2 ); bool bForeground = (dwPid1 == dwPid2); EOutlineType nOutlineType = (EOutlineType)_nOutlineType; //2007.11.29 kobake // if( bCheckOnly ){ // return TRUE; // } static CFuncInfoArr cFuncInfoArr; // int nLine; // int nListType; std::tstring sTitleOverride; //プラグインによるダイアログタイトル上書き // 2001.12.03 hor & 2002.3.13 YAZAKI if( nOutlineType == OUTLINE_DEFAULT ){ /* タイプ別に設定されたアウトライン解析方法 */ nOutlineType = m_pCommanderView->m_pTypeData->m_eDefaultOutline; if( nOutlineType == OUTLINE_CPP ){ if( CheckEXT( GetDocument()->m_cDocFile.GetFilePath(), _T("c") ) ){ nOutlineType = OUTLINE_C; /* これでC関数一覧リストビューになる */ } } } if( NULL != GetEditWindow()->m_cDlgFuncList.GetHwnd() && nAction != SHOW_RELOAD ){ switch(nAction ){ case SHOW_NORMAL: // アクティブにする // 開いているものと種別が同じならActiveにするだけ.異なれば再解析 GetEditWindow()->m_cDlgFuncList.SyncColor(); if( GetEditWindow()->m_cDlgFuncList.CheckListType( nOutlineType )){ if( bForeground ){ ::SetFocus( GetEditWindow()->m_cDlgFuncList.GetHwnd() ); } bIsProcessing = false; return TRUE; } break; case SHOW_TOGGLE: // 閉じる // 開いているものと種別が同じなら閉じる.異なれば再解析 if( GetEditWindow()->m_cDlgFuncList.CheckListType( nOutlineType )){ if( GetEditWindow()->m_cDlgFuncList.IsDocking() ) ::DestroyWindow( GetEditWindow()->m_cDlgFuncList.GetHwnd() ); else ::SendMessageAny( GetEditWindow()->m_cDlgFuncList.GetHwnd(), WM_CLOSE, 0, 0 ); bIsProcessing = false; return TRUE; } break; default: break; } } /* 解析結果データを空にする */ cFuncInfoArr.Empty(); int nListType = nOutlineType; //2011.06.25 syat switch( nOutlineType ){ case OUTLINE_C: // C/C++ は MakeFuncList_C case OUTLINE_CPP: GetDocument()->m_cDocOutline.MakeFuncList_C( &cFuncInfoArr );break; case OUTLINE_PLSQL: GetDocument()->m_cDocOutline.MakeFuncList_PLSQL( &cFuncInfoArr );break; case OUTLINE_JAVA: GetDocument()->m_cDocOutline.MakeFuncList_Java( &cFuncInfoArr );break; case OUTLINE_COBOL: GetDocument()->m_cDocOutline.MakeTopicList_cobol( &cFuncInfoArr );break; case OUTLINE_ASM: GetDocument()->m_cDocOutline.MakeTopicList_asm( &cFuncInfoArr );break; case OUTLINE_PERL: GetDocument()->m_cDocOutline.MakeFuncList_Perl( &cFuncInfoArr );break; // Sep. 8, 2000 genta case OUTLINE_VB: GetDocument()->m_cDocOutline.MakeFuncList_VisualBasic( &cFuncInfoArr );break; // June 23, 2001 N.Nakatani case OUTLINE_WZTXT: GetDocument()->m_cDocOutline.MakeTopicList_wztxt(&cFuncInfoArr);break; // 2003.05.20 zenryaku 階層付テキスト アウトライン解析 case OUTLINE_HTML: GetDocument()->m_cDocOutline.MakeTopicList_html(&cFuncInfoArr, false);break; // 2003.05.20 zenryaku HTML アウトライン解析 case OUTLINE_TEX: GetDocument()->m_cDocOutline.MakeTopicList_tex(&cFuncInfoArr);break; // 2003.07.20 naoh TeX アウトライン解析 case OUTLINE_BOOKMARK: GetDocument()->m_cDocOutline.MakeFuncList_BookMark( &cFuncInfoArr );break; // 2001.12.03 hor case OUTLINE_FILE: GetDocument()->m_cDocOutline.MakeFuncList_RuleFile( &cFuncInfoArr, sTitleOverride );break; // 2002.04.01 YAZAKI アウトライン解析にルールファイルを導入 // case OUTLINE_UNKNOWN: //Jul. 08, 2001 JEPRO 使わないように変更 case OUTLINE_PYTHON: GetDocument()->m_cDocOutline.MakeFuncList_python(&cFuncInfoArr);break; // 2007.02.08 genta case OUTLINE_ERLANG: GetDocument()->m_cDocOutline.MakeFuncList_Erlang(&cFuncInfoArr);break; // 2009.08.10 genta case OUTLINE_XML: GetDocument()->m_cDocOutline.MakeTopicList_html(&cFuncInfoArr, true);break; // 2014.12.25 Moca case OUTLINE_FILETREE: /* 特に何もしない*/ ;break; // 2013.12.08 Moca case OUTLINE_TEXT: // fall though // ここには何も入れてはいけない 2007.02.28 genta 注意書き default: //プラグインから検索する { CPlug::Array plugs; CJackManager::getInstance()->GetUsablePlug( PP_OUTLINE, nOutlineType, &plugs ); if( plugs.size() > 0 ){ assert_warning( 1 == plugs.size() ); //インタフェースオブジェクト準備 CWSHIfObj::List params; COutlineIfObj* objOutline = new COutlineIfObj( cFuncInfoArr ); objOutline->AddRef(); params.push_back( objOutline ); //プラグイン呼び出し ( *plugs.begin() )->Invoke( m_pCommanderView, params ); nListType = objOutline->m_nListType; //ダイアログの表示方法をを上書き sTitleOverride = objOutline->m_sOutlineTitle; //ダイアログタイトルを上書き objOutline->Release(); break; } } //それ以外 GetDocument()->m_cDocOutline.MakeTopicList_txt( &cFuncInfoArr ); break; } /* 解析対象ファイル名 */ _tcscpy( cFuncInfoArr.m_szFilePath, GetDocument()->m_cDocFile.GetFilePath() ); /* アウトライン ダイアログの表示 */ CLayoutPoint poCaret = GetCaret().GetCaretLayoutPos(); if( NULL == GetEditWindow()->m_cDlgFuncList.GetHwnd() ){ GetEditWindow()->m_cDlgFuncList.DoModeless( G_AppInstance(), m_pCommanderView->GetHwnd(), (LPARAM)m_pCommanderView, &cFuncInfoArr, poCaret.GetY2() + CLayoutInt(1), poCaret.GetX2() + CLayoutInt(1), nOutlineType, nListType, m_pCommanderView->m_pTypeData->m_bLineNumIsCRLF /* 行番号の表示 false=折り返し単位/true=改行単位 */ ); }else{ /* アクティブにする */ GetEditWindow()->m_cDlgFuncList.Redraw( nOutlineType, nListType, &cFuncInfoArr, poCaret.GetY2() + 1, poCaret.GetX2() + 1 ); if( bForeground ){ ::SetFocus( GetEditWindow()->m_cDlgFuncList.GetHwnd() ); } } // ダイアログタイトルを上書き if( ! sTitleOverride.empty() ){ GetEditWindow()->m_cDlgFuncList.SetWindowText( sTitleOverride.c_str() ); } // 解析結果を折りたたみに反映する if (m_pCommanderView->m_pTypeData->m_ColorInfoArr[COLORIDX_FOLDING].m_bDisp && nOutlineType != OUTLINE_BOOKMARK && nOutlineType != OUTLINE_FILETREE) { CDocFoldMgr::getInstance()->RefreshFromOutline(&cFuncInfoArr, m_pCommanderView->GetDocument()->m_cDocLineMgr); if (m_pCommanderView->m_pTypeData->m_ColorInfoArr[COLORIDX_FOLDING].m_bDisp) { m_pCommanderView->m_pcEditDoc->OnChangeSetting(); } } bIsProcessing = false; return TRUE; }
/*! 初期化 pcmemHokanWord == NULLのとき、補完候補がひとつだったら、補完ウィンドウを表示しないで終了します。 Search()呼び出し元で確定処理を進めてください。 @date 2002.2.17 YAZAKI CShareDataのインスタンスは、CProcessにひとつあるのみ。 */ int CHokanMgr::Search( POINT* ppoWin, int nWinHeight, int nColumnWidth, const wchar_t* pszCurWord, const TCHAR* pszHokanFile, bool bHokanLoHiCase, // 入力補完機能:英大文字小文字を同一視する 2001/06/19 asa-o bool bHokanByFile, // 編集中データから候補を探す 2003.06.23 Moca int nHokanType, bool bHokanByKeyword, CNativeW* pcmemHokanWord // 2001/06/19 asa-o ) { CEditView* pcEditView = reinterpret_cast<CEditView*>(m_lParam); /* 共有データ構造体のアドレスを返す */ m_pShareData = &GetDllShareData(); /* || 補完キーワードの検索 || || ・見つかった候補をすべて返す(改行で区切って返す) || ・指定された候補の最大数を超えると処理を中断する || ・見つかった数を返す || */ m_vKouho.clear(); CDicMgr::HokanSearch( pszCurWord, bHokanLoHiCase, // 引数からに変更 2001/06/19 asa-o m_vKouho, 0, //Max候補数 pszHokanFile ); // 2003.05.16 Moca 追加 編集中データ内から候補を探す if( bHokanByFile ){ pcEditView->HokanSearchByFile( pszCurWord, bHokanLoHiCase, m_vKouho, 1024 // 編集中データからなので数を制限しておく ); } // 2012.10.13 Moca 強調キーワードから候補を探す if( bHokanByKeyword ){ HokanSearchByKeyword( pszCurWord, bHokanLoHiCase, m_vKouho ); } { int nOption = ( (bHokanLoHiCase ? 0x01 : 0) | (bHokanByFile ? 0x02 : 0) ); CPlug::Array plugs; CPlug::Array plugType; CJackManager::getInstance()->GetUsablePlug( PP_COMPLEMENTGLOBAL, 0, &plugs ); if( nHokanType != 0 ){ CJackManager::getInstance()->GetUsablePlug( PP_COMPLEMENT, nHokanType, &plugType ); if( 0 < plugType.size() ){ plugs.push_back( plugType[0] ); } } for( auto it = plugs.begin(); it != plugs.end(); ++it ){ //インタフェースオブジェクト準備 CWSHIfObj::List params; std::wstring curWord = pszCurWord; CComplementIfObj* objComp = new CComplementIfObj( curWord , this, nOption ); objComp->AddRef(); params.push_back( objComp ); //プラグイン呼び出し (*it)->Invoke( pcEditView, params ); objComp->Release(); } } if( 0 == m_vKouho.size() ){ m_nCurKouhoIdx = -1; return 0; } // 2001/06/19 asa-o 候補が1つの場合補完ウィンドウは表示しない(逐次補完の場合は除く) if( 1 == m_vKouho.size() ){ if(pcmemHokanWord != NULL){ m_nCurKouhoIdx = -1; pcmemHokanWord->SetString( m_vKouho[0].c_str() ); return 1; } } // m_hFont = hFont; m_poWin.x = ppoWin->x; m_poWin.y = ppoWin->y; m_nWinHeight = nWinHeight; m_nColumnWidth = nColumnWidth; // m_cmemCurWord.SetData( pszCurWord, lstrlen( pszCurWord ) ); m_cmemCurWord.SetString( pszCurWord ); m_nCurKouhoIdx = 0; // SetCurKouhoStr(); // ::ShowWindow( GetHwnd(), SW_SHOWNA ); HWND hwndList; hwndList = GetItemHwnd( IDC_LIST_WORDS ); List_ResetContent( hwndList ); { size_t kouhoNum = m_vKouho.size(); for( size_t i = 0; i < kouhoNum; ++i ){ ::List_AddString( hwndList, m_vKouho[i].c_str() ); } } List_SetCurSel( hwndList, 0 ); //@@ ::EnableWindow( ::GetParent( ::GetParent( m_hwndParent ) ), FALSE ); int nX; int nY; int nCX; int nCY; RECT rcDesktop; // May 01, 2004 genta マルチモニタ対応 ::GetMonitorWorkRect( GetHwnd(), &rcDesktop ); nX = m_poWin.x - m_nColumnWidth; nY = m_poWin.y + m_nWinHeight + 4; nCX = m_nWidth; nCY = m_nHeight; /* 下に入るなら */ if( nY + nCY < rcDesktop.bottom ){ /* 何もしない */ }else /* 上に入るなら */ if( rcDesktop.top < m_poWin.y - m_nHeight - 4 ){ /* 上に出す */ nY = m_poWin.y - m_nHeight - 4; }else /* 上に出すか下に出すか(広いほうに出す) */ if( rcDesktop.bottom - nY > m_poWin.y ){ /* 下に出す */ // m_nHeight = rcDesktop.bottom - nY; nCY = rcDesktop.bottom - nY; }else{ /* 上に出す */ nY = rcDesktop.top; nCY = m_poWin.y - 4 - rcDesktop.top; } // 2001/06/19 Start by asa-o: 表示位置補正 // 右に入る if(nX + nCX < rcDesktop.right ){ // そのまま }else // 左に入る if(rcDesktop.left < nX - nCX + 8){ // 左に表示 nX -= nCX - 8; }else{ // サイズを調整して右に表示 nCX = t_max((int)(rcDesktop.right - nX) , 100); // 最低サイズを100くらいに } // 2001/06/19 End // 2001/06/18 Start by asa-o: 補正後の位置・サイズを保存 m_poWin.x = nX; m_poWin.y = nY; m_nHeight = nCY; m_nWidth = nCX; // 2001/06/18 End /* はみ出すなら小さくする */ // if( rcDesktop.bottom < nY + nCY ){ // /* 下にはみ出す */ // if( m_poWin.y - 4 - nCY < 0 ){ // /* 上にはみ出す */ // /* →高さだけ調節 */ // nCY = rcDesktop.bottom - nY - 4; // }else{ // // } // // } ::MoveWindow( GetHwnd(), nX, nY, nCX, nCY, TRUE ); ::ShowWindow( GetHwnd(), SW_SHOWNA ); // 2001/06/18 asa-o: ShowTip(); // 補完ウィンドウで選択中の単語にキーワードヘルプを表示 // 2003.06.25 Moca 他のメソッドで使っていないので、とりあえず削除しておく int kouhoNum = m_vKouho.size(); m_vKouho.clear(); return kouhoNum; }