CFindPanel::CFindPanel(CConEmuMain* apConEmu) : mp_ConEmu(apConEmu) , mh_Pane(NULL) , mh_Edit(NULL) , mh_Font(NULL) , mn_KeyDown(0) , mn_RebarHeight(0) { if (!g_FindMap.Initialized()) g_FindMap.Init(16); ms_PrevSearch = new CmdArg(); }
/* Uniqualizer for Each tab */ CTabID::CTabID(CVirtualConsole* apVCon, LPCWSTR asName, CEFarWindowType anType, int anPID, int anFarWindowID, int anViewEditID) { memset(&Info, 0, sizeof(Info)); memset(&DrawInfo, 0, sizeof(DrawInfo)); Info.pVCon = apVCon; Set(asName, anType, anPID, anFarWindowID, anViewEditID); #ifdef DEBUG_TAB_LIST if (!bTabIdListInit) { gTabIdList.Init(256,true); bTabIdListInit = true; } gTabIdList.Set(this, true); #endif }
void CTabBarClass::Update(BOOL abPosted/*=FALSE*/) { #ifdef _DEBUG if (this != gpConEmu->mp_TabBar) { _ASSERTE(this == gpConEmu->mp_TabBar); } #endif MCHKHEAP /*if (!_active) { return; }*/ // Теперь - ВСЕГДА! т.к. сами управляем мультиконсолью if (mb_DisableRedraw) { _ASSERTE(FALSE && "mb_DisableRedraw?"); // Надо? return; } if (!isMainThread()) { RequestPostUpdate(); return; } gpConEmu->mp_Status->UpdateStatusBar(); mb_PostUpdateCalled = FALSE; #ifdef _DEBUG _ASSERTE(mn_InUpdate >= 0); if (mn_InUpdate > 0) { _ASSERTE(mn_InUpdate == 0); } #endif mn_InUpdate ++; MCHKHEAP int V, I, tabIdx = 0, nCurTab = -1; BOOL bShowFarWindows = gpSet->bShowFarWindows; // Выполняться должно только в основной нити, так что CriticalSection не нужна #ifdef _DEBUG if (this != gpConEmu->mp_TabBar) { _ASSERTE(this == gpConEmu->mp_TabBar); } #endif TODO("Обработка gpSet->bHideInactiveConsoleTabs для новых табов"); MCHKHEAP // Check if we need to AutoSHOW or AutoHIDE tab bar if (!IsTabsActive() && gpSet->isTabs) { int nTabs = CountActiveTabs(2); if (nTabs > 1) { Activate(); } } else if (IsTabsActive() && gpSet->isTabs==2) { int nTabs = CountActiveTabs(2); if (nTabs <= 1) { Deactivate(); } } // Validation? #ifdef _DEBUG if (this != gpConEmu->mp_TabBar) { _ASSERTE(this == gpConEmu->mp_TabBar); } #endif MCHKHEAP HANDLE hUpdate = m_Tabs.UpdateBegin(); _ASSERTE(hUpdate!=NULL); bool bStackChanged = false; /* ********************* */ /* Go */ /* ********************* */ { MMap<CVConGroup*,CVirtualConsole*> Groups; Groups.Init(MAX_CONSOLE_COUNT, true); for (V = 0; V < MAX_CONSOLE_COUNT; V++) { //if (!(pVCon = gpConEmu->GetVCon(V))) continue; CVConGuard guard; if (!CVConGroup::GetVCon(V, &guard)) continue; CVirtualConsole* pVCon = guard.VCon(); BOOL lbActive = pVCon->isActive(false); if (gpSet->bHideInactiveConsoleTabs && !lbActive) continue; if (gpSet->isOneTabPerGroup) { CVConGroup *pGr; CVConGuard VGrActive; if (CVConGroup::isGroup(pVCon, &pGr, &VGrActive)) { CVirtualConsole* pGrVCon; if (Groups.Get(pGr, &pGrVCon)) continue; // эта группа уже есть pGrVCon = VGrActive.VCon(); Groups.Set(pGr, pGrVCon); // И показывать таб нужно от "активной" консоли, а не от первой в группе if (pVCon != pGrVCon) { guard = pGrVCon; pVCon = pGrVCon; } if (!lbActive) { lbActive = pVCon->isActive(true); } // Показывать редакторы из всех групп? if (gpSet->bShowFarWindows) { MArray<CVConGuard*> Panes; int nPanes = pGr->GetGroupPanes(&Panes); // Только если в группе более одного таба - тогда нужно дополниетльная логика населения... if (nPanes > 1) { // Первым табом - показать текущую панель, либо МОДАЛЬНЫЙ редактор/вьювер // Редакторы из "far /e ..." здесь НЕ добавлять! if (!pVCon->RCon()->isFarPanelAllowed() || !UpdateAddTab(hUpdate, tabIdx, nCurTab, bStackChanged, pVCon, uat_PanelsOrModalsOnly)) { // Если есть - добавить ОДНУ панель, чтобы табы сплита не прыгали туда-сюда for (int K = 0; K < nPanes; K++) { if (Panes[K]->VCon()->RCon()->isFarPanelAllowed()) { if (UpdateAddTab(hUpdate, tabIdx, nCurTab, bStackChanged, Panes[K]->VCon(), uat_PanelsOnly) > 0) break; } } } // Потом - все оставшиеся редакторы/вьюверы (в том числе и "far /e ...") for (int K = 0; K < nPanes; K++) { UpdateAddTab(hUpdate, tabIdx, nCurTab, bStackChanged, Panes[K]->VCon(), uat_NonModals|uat_NonPanels); } // Release CVConGroup::FreePanesArray(Panes); // Already processed, next VCon continue; } } } } UpdateAddTab(hUpdate, tabIdx, nCurTab, bStackChanged, pVCon, uat_AnyTab); } Groups.Release(); } MCHKHEAP // Must be at least one tab ("ConEmu -Detached" for example) if (tabIdx == 0) { m_Tabs.UpdateAppend(hUpdate, mp_DummyTab, FALSE); // Физически (WinAPI) добавляет закладку, или меняет (при необходимости) заголовок существующей mp_Rebar->AddTabInt(gpConEmu->GetDefaultTabLabel(), tabIdx, gpConEmu->mb_IsUacAdmin, -1); nCurTab = tabIdx; tabIdx++; } m_Tabs.UpdateEnd(hUpdate, 0); // Проверим стек последних выбранных if (CheckStack()) bStackChanged = true; #ifdef PRINT_RECENT_STACK PrintRecentStack(); #endif #ifdef _DEBUG static int nPrevVisible, nPrevStacked; { wchar_t szDbg[100]; int nNewVisible = m_Tabs.GetCount(); int nNewStacked = m_TabStack.size(); _wsprintf(szDbg, SKIPLEN(countof(szDbg)) L"*** Tab list updated. Visible:%u, Stacked:%u, StackChanged:%s\n", nNewVisible, nNewStacked, bStackChanged ? L"Yes" : L"No"); DEBUGSTRCOUNT(szDbg); nPrevVisible = nNewVisible; nPrevStacked = nNewStacked; } #endif // удалить лишние закладки (визуально) int nCurCount = GetItemCount(); #ifdef _DEBUG wchar_t szDbg[128]; _wsprintf(szDbg, SKIPLEN(countof(szDbg)) L"CTabBarClass::Update. ItemCount=%i, PrevItemCount=%i\n", tabIdx, nCurCount); DEBUGSTRTABS(szDbg); #endif if (mp_Rebar->IsTabbarCreated()) { for (I = tabIdx; I < nCurCount; I++) { #ifdef _DEBUG _wsprintf(szDbg, SKIPLEN(countof(szDbg)) L" Deleting tab=%i\n", I+1); DEBUGSTRTABS(szDbg); #endif DeleteItem(tabIdx); } } MCHKHEAP if (mb_InKeySwitching) { if (mn_CurSelTab >= nCurCount) // Если выбранный таб вылез за границы mb_InKeySwitching = false; } if (!mb_InKeySwitching && nCurTab != -1) { SelectTab(nCurTab); } UpdateToolConsoles(); //if (gpSet->isTabsInCaption) //{ // SendMessage(ghWnd, WM_NCPAINT, 0, 0); //} mn_InUpdate --; if (mb_PostUpdateRequested) { mb_PostUpdateCalled = FALSE; mb_PostUpdateRequested = FALSE; RequestPostUpdate(); } MCHKHEAP return; // Just for clearness }