static bool MakeDiffTmpFile_core(CTextOutputStream& out, HWND hwnd, CEditView& view, bool bBom) { CLogicInt y = CLogicInt(0); const wchar_t* pLineData; if( !hwnd ){ const CDocLineMgr& docMgr = view.m_pcEditDoc->m_cDocLineMgr; for(;;){ CLogicInt nLineLen; pLineData = docMgr.GetLine(y)->GetDocLineStrWithEOL(&nLineLen); // 正常終了 if( 0 == nLineLen || NULL == pLineData ) break; if( bBom ){ CNativeW cLine2(L"\ufeff"); cLine2.AppendString(pLineData, nLineLen); out.WriteString(cLine2.GetStringPtr(), cLine2.GetStringLength()); bBom = false; }else{ out.WriteString(pLineData,nLineLen); } y++; } }else if( IsSakuraMainWindow(hwnd) ) { const int max_size = (int)GetDllShareData().m_sWorkBuffer.GetWorkBufferCount<const EDIT_CHAR>(); pLineData = GetDllShareData().m_sWorkBuffer.GetWorkBuffer<const EDIT_CHAR>(); for(;;){ int nLineOffset = 0; int nLineLen = 0; //初回用仮値 do{ // m_sWorkBuffer#m_Workの排他制御。外部コマンド出力/TraceOut/Diffが対象 LockGuard<CMutex> guard( CShareData::GetMutexShareWork() ); { nLineLen = ::SendMessageAny( hwnd, MYWM_GETLINEDATA, y, nLineOffset ); if( nLineLen == 0 ){ return true; } // EOF => 正常終了 if( nLineLen < 0 ){ return false; } // 何かエラー if( bBom ){ CNativeW cLine2(L"\ufeff"); cLine2.AppendString(pLineData, t_min(nLineLen, max_size)); out.WriteString(cLine2.GetStringPtr(), cLine2.GetStringLength()); bBom = false; }else{ out.WriteString(pLineData, t_min(nLineLen, max_size)); } } nLineOffset += max_size; }while(max_size < nLineLen); y++; } }else{ return false; } if( bBom ){ out.WriteString(L"\ufeff", 1); } return true; }
/** フレームウィンドウをアクティブにする @date 2007.11.07 ryoji 対象がdisableのときは最近のポップアップをフォアグラウンド化する. (モーダルダイアログやメッセージボックスを表示しているようなとき) */ void ActivateFrameWindow( HWND hwnd ) { // 編集ウィンドウでタブまとめ表示の場合は表示位置を復元する DLLSHAREDATA* pShareData = &GetDllShareData(); if( pShareData->m_Common.m_sTabBar.m_bDispTabWnd && !pShareData->m_Common.m_sTabBar.m_bDispTabWndMultiWin ) { if( IsSakuraMainWindow( hwnd ) ){ if( pShareData->m_sFlags.m_bEditWndChanging ) return; // 切替の最中(busy)は要求を無視する pShareData->m_sFlags.m_bEditWndChanging = TRUE; // 編集ウィンドウ切替中ON 2007.04.03 ryoji // 対象ウィンドウのスレッドに位置合わせを依頼する // 2007.04.03 ryoji DWORD_PTR dwResult; ::SendMessageTimeout( hwnd, MYWM_TAB_WINDOW_NOTIFY, TWNT_WNDPL_ADJUST, (LPARAM)NULL, SMTO_ABORTIFHUNG | SMTO_BLOCK, 10000, &dwResult ); } } // 対象がdisableのときは最近のポップアップをフォアグラウンド化する HWND hwndActivate; hwndActivate = ::IsWindowEnabled( hwnd )? hwnd: ::GetLastActivePopup( hwnd ); if( ::IsIconic( hwnd ) ){ ::ShowWindow( hwnd, SW_RESTORE ); } else if ( ::IsZoomed( hwnd ) ){ ::ShowWindow( hwnd, SW_MAXIMIZE ); } else { ::ShowWindow( hwnd, SW_SHOW ); } ::SetForegroundWindow( hwndActivate ); ::BringWindowToTop( hwndActivate ); if( pShareData ) pShareData->m_sFlags.m_bEditWndChanging = FALSE; // 編集ウィンドウ切替中OFF 2007.04.03 ryoji return; }
void CViewCommander::Command_MINIMIZE_ALL( void ) { HWND* phWndArr; int i; int j; j = GetDllShareData().m_sNodes.m_nEditArrNum; if( 0 == j ){ return; } phWndArr = new HWND[j]; for( i = 0; i < j; ++i ){ phWndArr[i] = GetDllShareData().m_sNodes.m_pEditArr[i].GetHwnd(); } for( i = 0; i < j; ++i ){ if( IsSakuraMainWindow( phWndArr[i] ) ) { if( ::IsWindowVisible( phWndArr[i] ) ) ::ShowWindow( phWndArr[i], SW_MINIMIZE ); } } delete [] phWndArr; return; }