// static nsHtml5HtmlAttributes* nsHtml5ViewSourceUtils::NewBodyAttributes() { nsHtml5HtmlAttributes* bodyAttrs = new nsHtml5HtmlAttributes(0); auto id = MakeUnique<nsString>(NS_LITERAL_STRING("viewsource")); bodyAttrs->addAttribute(nsHtml5AttributeName::ATTR_ID, id.release(), -1); auto klass = MakeUnique<nsString>(); if (mozilla::Preferences::GetBool("view_source.wrap_long_lines", true)) { klass->Append(NS_LITERAL_STRING("wrap ")); } if (mozilla::Preferences::GetBool("view_source.syntax_highlight", true)) { klass->Append(NS_LITERAL_STRING("highlight")); } if (!klass->IsEmpty()) { bodyAttrs->addAttribute(nsHtml5AttributeName::ATTR_CLASS, klass.release(), -1); } int32_t tabSize = mozilla::Preferences::GetInt("view_source.tab_size", 4); if (tabSize > 0) { auto style = MakeUnique<nsString>(NS_LITERAL_STRING("-moz-tab-size: ")); style->AppendInt(tabSize); bodyAttrs->addAttribute(nsHtml5AttributeName::ATTR_STYLE, style.release(), -1); } return bodyAttrs; }
void CTabStack::UpdateAppend(HANDLE hUpdate, CTabID* pTab, BOOL abMoveFirst) { MSectionLockSimple* pUpdateLock = (MSectionLockSimple*)hUpdate; // Функция должна вызваться ТОЛЬКО между UpdateBegin & UpdateEnd if (mn_UpdatePos < 0 || !pUpdateLock) { _ASSERTE(mn_UpdatePos>=0); _ASSERTE(pUpdateLock!=NULL); return; } // Если таб в списке уже есть - то НИЧЕГО не делать (только переместить его в начало, если abActive) // Если таб новый - добавить в список и вызвать AddRef для таба if (!pTab) { _ASSERTE(pTab != NULL); return; } int nIndex = -1; for (int i = 0; i < mn_Used; i++) { if (mpp_Stack[i] == pTab) { nIndex = i; break; } } if (!abMoveFirst) { // "Обычное" население #ifdef _DEBUG if (nIndex == -1 || nIndex != mn_UpdatePos) { #if 1 _ASSERTE(pUpdateLock->isLocked()); #else pUpdateLock->RelockExclusive(); #endif } #endif RequestSize(mn_UpdatePos+1, pUpdateLock); if (nIndex != -1 && nIndex != mn_UpdatePos) { //_ASSERTE(nIndex > mn_UpdatePos); -- may happens when creating new split from active "far /e ..." tab // Do NOT release tab here! Behavior can differs by arguments of UpdateEnd! CTabID* p = mpp_Stack[mn_UpdatePos]; mpp_Stack[mn_UpdatePos] = mpp_Stack[nIndex]; mpp_Stack[nIndex] = p; // At the moment vector must be realigned! _ASSERTE(mpp_Stack[mn_UpdatePos] == pTab); } if (mpp_Stack[mn_UpdatePos] != pTab) { pTab->AddRef(); #ifdef TAB_REF_PLACE pTab->AddPlace(m_rp.filename, m_rp.fileline); #endif } mpp_Stack[mn_UpdatePos] = pTab; mn_UpdatePos++; if (mn_UpdatePos > mn_Used) { mn_Used = mn_UpdatePos; } } else { if (nIndex == -1) { // Таба в списке еще нет, добавляем AppendInt(pTab, abMoveFirst, pUpdateLock); } else if (abMoveFirst && nIndex > 0) { // Таб нужно переместить в начало списка #if 1 _ASSERTE(pUpdateLock->isLocked()); #else pUpdateLock->RelockExclusive(); #endif memmove(mpp_Stack+1, mpp_Stack, sizeof(CTabID**) * (nIndex-1)); mpp_Stack[0] = pTab; // AddRef не нужен, таб уже у нас в списке! } mn_UpdatePos++; } }
// Должен вызываться только из CRealConsole! // Возвращает "true" если были изменения bool CTabStack::UpdateFarWindow(HANDLE hUpdate, CVirtualConsole* apVCon, LPCWSTR asName, CEFarWindowType anType, int anPID, int anFarWindowID, int anViewEditID, CTab& rActiveTab) { MSectionLockSimple* pUpdateLock = (MSectionLockSimple*)hUpdate; // Функция должна вызваться ТОЛЬКО между UpdateBegin & UpdateEnd if (mn_UpdatePos < 0 || !pUpdateLock) { _ASSERTE(mn_UpdatePos>=0); _ASSERTE(pUpdateLock!=NULL); return false; } bool bChanged = false; CTabID* pTab = NULL; mb_FarUpdateMode = true; // Теперь - поехали обновлять. Правила такие: // 1. Новая вкладка в ФАР может появиться ТОЛЬКО в конце // 2. Закрыта может быть любая вкладка // 3. панели НЕ должны перебиваться на редактор при запуске "far /e" // 4. и вообще, первый таб мог быть добавлен изначально как редактор! int i = mn_UpdatePos; while (i < mn_Used) { if (!mpp_Stack[i]) { i++; continue; } if (mpp_Stack[i]->IsEqual(apVCon, asName, anType, anPID, anViewEditID, fwt_TypeMask)) { // OK, таб совпадает pTab = mpp_Stack[i]; // Refresh status and title if (pTab->Set(asName, anType, anPID, anFarWindowID, anViewEditID, fwt_UpdateFlags)) bChanged = true; _ASSERTE(pTab->Info.Status == tisValid); if (anType & fwt_CurrentFarWnd) rActiveTab.Init(pTab); mn_UpdatePos = i+1; // Закончили break; } // Tab was closed or gone to background bChanged = true; mpp_Stack[i]->Info.Status = tisPassive; i++; } // Если таб новый if (pTab == NULL) { // это новая вкладка, добавляемая в конец pTab = new CTabID(apVCon, asName, anType, anPID, anFarWindowID, anViewEditID); _ASSERTE(pTab->RefCount()==1); _ASSERTE(mn_Used == i); i = AppendInt(pTab, FALSE/*abMoveFirst*/, pUpdateLock); _ASSERTE(pTab->RefCount()==2); if (anType & fwt_CurrentFarWnd) rActiveTab.Init(pTab); pTab->Release(); bChanged = true; mn_UpdatePos = i+1; } _ASSERTE(mn_UpdatePos>=1 && mn_UpdatePos<=mn_Used); return bChanged; }
void Hash::AppendStringVec(const vector<string>& string_vec) { AppendInt(string_vec.size()); for (size_t i = 0; i < string_vec.size(); i++) { AppendString(string_vec[i]); } }