/** * @brief Get folder for temporary files. * This function returns system temp folder. * @param [out] pnerr Error code if erorr happened. * @return Temp path, or empty string if error happened. * @note Temp path is cached after first call. * @todo Should we return NULL for error case? */ LPCTSTR env_GetTempPath(int * pnerr) { if (strTempPath.empty()) { if (GetOptionsMgr()->GetBool(OPT_USE_SYSTEM_TEMP_PATH)) { int cchTempPath = GetTempPath(0, 0); strTempPath.resize(cchTempPath - 1); if (!GetTempPath(cchTempPath, &*strTempPath.begin())) { int err = GetLastError(); if (pnerr) *pnerr = err; #ifdef _DEBUG String sysErr = GetSysError(err); // for debugging #endif return strTempPath.c_str(); // empty } } else { strTempPath = GetOptionsMgr()->GetString(OPT_CUSTOM_TEMP_PATH); if (!paths_EndsWithSlash(strTempPath.c_str())) strTempPath += '\\'; } strTempPath = paths_GetLongPath(strTempPath.c_str()); } return strTempPath.c_str(); }
/** * @brief Reads options values from storage to UI. */ void PropCodepage::ReadOptions() { m_nCodepageSystem = GetOptionsMgr()->GetInt(OPT_CP_DEFAULT_MODE); m_nCustomCodepageValue = GetOptionsMgr()->GetInt(OPT_CP_DEFAULT_CUSTOM); m_cCustomCodepageValue.Format(_T("%d"),m_nCustomCodepageValue); m_bDetectCodepage = GetOptionsMgr()->GetBool(OPT_CP_DETECT); }
/** * @brief Writes options values from UI to storage. */ void PropCodepage::WriteOptions() { GetOptionsMgr()->SaveOption(OPT_CP_DEFAULT_MODE, (int)m_nCodepageSystem); GetEncodingCodePageFromNameString(); GetOptionsMgr()->SaveOption(OPT_CP_DEFAULT_CUSTOM, (int)m_nCustomCodepageValue); GetOptionsMgr()->SaveOption(OPT_CP_DETECT, m_bDetectCodepage == TRUE); }
/** * @brief Writes options values from UI to storage. */ void PropRegistry::WriteOptions() { CMergeApp *app = static_cast<CMergeApp*>(AfxGetApp()); CString sDefaultEditor = app->GetDefaultEditor(); GetOptionsMgr()->SaveOption(OPT_USE_RECYCLE_BIN, m_bUseRecycleBin == TRUE); CString sExtEditor = m_strEditorPath; sExtEditor.TrimLeft(); sExtEditor.TrimRight(); if (sExtEditor.IsEmpty()) sExtEditor = sDefaultEditor; GetOptionsMgr()->SaveOption(OPT_EXT_EDITOR_CMD, sExtEditor); CString sFilterPath = m_strUserFilterPath; sFilterPath.TrimLeft(); sFilterPath.TrimRight(); GetOptionsMgr()->SaveOption(OPT_FILTER_USERPATH, sFilterPath); bool useSysTemp = m_tempFolderType == 0; GetOptionsMgr()->SaveOption(OPT_USE_SYSTEM_TEMP_PATH, useSysTemp); CString tempFolder = m_tempFolder; tempFolder.TrimLeft(); tempFolder.TrimRight(); GetOptionsMgr()->SaveOption(OPT_CUSTOM_TEMP_PATH, tempFolder); }
/** * @brief Reads options values from storage to UI. */ void PropRegistry::ReadOptions() { m_strEditorPath = GetOptionsMgr()->GetString(OPT_EXT_EDITOR_CMD); m_bUseRecycleBin = GetOptionsMgr()->GetBool(OPT_USE_RECYCLE_BIN); m_strUserFilterPath = GetOptionsMgr()->GetString(OPT_FILTER_USERPATH); m_tempFolderType = GetOptionsMgr()->GetBool(OPT_USE_SYSTEM_TEMP_PATH) ? 0 : 1; m_tempFolder = GetOptionsMgr()->GetString(OPT_CUSTOM_TEMP_PATH); }
/** * @brief Save plugins enabled setting when closing the dialog. */ void PluginsListDlg::OnBnClickedOk() { CButton *btn = (CButton *)GetDlgItem(IDC_PLUGINS_ENABLE); int check = btn->GetCheck(); if (check == BST_CHECKED) { GetOptionsMgr()->SaveOption(OPT_PLUGINS_ENABLED, true); } else { GetOptionsMgr()->SaveOption(OPT_PLUGINS_ENABLED, false); } OnOK(); }
/** * @brief Reads options values from storage to UI. * Property sheet calls this before displaying GUI to load values * into members. */ void PropCompare::ReadOptions() { m_nIgnoreWhite = GetOptionsMgr()->GetInt(OPT_CMP_IGNORE_WHITESPACE); m_bIgnoreBlankLines = GetOptionsMgr()->GetBool(OPT_CMP_IGNORE_BLANKLINES); m_bFilterCommentsLines = GetOptionsMgr()->GetBool(OPT_CMP_FILTER_COMMENTLINES); m_bIgnoreCase = GetOptionsMgr()->GetBool(OPT_CMP_IGNORE_CASE); m_bIgnoreEol = GetOptionsMgr()->GetBool(OPT_CMP_IGNORE_EOL); m_bIgnoreCodepage = GetOptionsMgr()->GetBool(OPT_CMP_IGNORE_CODEPAGE); m_bMovedBlocks = GetOptionsMgr()->GetBool(OPT_CMP_MOVED_BLOCKS); m_bMatchSimilarLines = GetOptionsMgr()->GetBool(OPT_CMP_MATCH_SIMILAR_LINES); m_nDiffAlgorithm = GetOptionsMgr()->GetInt(OPT_CMP_DIFF_ALGORITHM); }
/** * @brief Writes options values from UI to storage. * Property sheet calls this after dialog is closed with OK button to * store values in member variables. */ void PropCompare::WriteOptions() { GetOptionsMgr()->SaveOption(OPT_CMP_IGNORE_WHITESPACE, m_nIgnoreWhite); GetOptionsMgr()->SaveOption(OPT_CMP_IGNORE_BLANKLINES, m_bIgnoreBlankLines); GetOptionsMgr()->SaveOption(OPT_CMP_FILTER_COMMENTLINES, m_bFilterCommentsLines); GetOptionsMgr()->SaveOption(OPT_CMP_IGNORE_CODEPAGE, m_bIgnoreCodepage); GetOptionsMgr()->SaveOption(OPT_CMP_IGNORE_EOL, m_bIgnoreEol); GetOptionsMgr()->SaveOption(OPT_CMP_IGNORE_CASE, m_bIgnoreCase); GetOptionsMgr()->SaveOption(OPT_CMP_MOVED_BLOCKS, m_bMovedBlocks); GetOptionsMgr()->SaveOption(OPT_CMP_MATCH_SIMILAR_LINES, m_bMatchSimilarLines); GetOptionsMgr()->SaveOption(OPT_CMP_DIFF_ALGORITHM, m_nDiffAlgorithm); }
void CMergeEditFrame::ActivateFrame(int nCmdShow) { // load docking positions and sizes CDockState pDockState; pDockState.LoadState(_T("Settings")); if (EnsureValidDockState(pDockState)) // checks for valid so won't ASSERT SetDockState(pDockState); // for the dimensions of the diff and location pane, use the CSizingControlBar loader m_wndLocationBar.LoadState(_T("Settings")); m_wndDetailBar.LoadState(_T("Settings")); if (!m_bActivated) { m_bActivated = true; // get the active child frame, and a flag whether it is maximized BOOL bMaximized = FALSE; CMDIChildWnd * oldActiveFrame = GetMDIFrame()->MDIGetActive(&bMaximized); if (oldActiveFrame == nullptr) // for the first frame, get the restored/maximized state from the registry bMaximized = GetOptionsMgr()->GetBool(OPT_ACTIVE_FRAME_MAX); if (bMaximized) nCmdShow = SW_SHOWMAXIMIZED; else nCmdShow = SW_SHOWNORMAL; } CMDIChildWnd::ActivateFrame(nCmdShow); }
/** * @brief Load line filters to the compare context. * Loads linefilters, converts them to UTF-8 and sets them for compare context. */ void CDirDoc::LoadLineFilterList() { ASSERT(m_pCtxt); BOOL bFilters = GetOptionsMgr()->GetBool(OPT_LINEFILTER_ENABLED); String filters = GetMainFrame()->m_pLineFilters->GetAsString(); if (!bFilters || filters.empty()) { delete m_pCtxt->m_pFilterList; m_pCtxt->m_pFilterList = NULL; return; } if (m_pCtxt->m_pFilterList) m_pCtxt->m_pFilterList->RemoveAllFilters(); else m_pCtxt->m_pFilterList = new FilterList(); char * regexp_str; FilterList::EncodingType type; regexp_str = UCS2UTF8_ConvertToUtf8(filters.c_str()); type = FilterList::ENC_UTF8; m_pCtxt->m_pFilterList->AddRegExp(regexp_str, type); UCS2UTF8_Dealloc(regexp_str); }
/** * @brief Initialise directory compare for given paths. * * Initialises directory compare with paths given and recursive choice. * Previous compare context is first free'd. * @param [in] paths Paths to compare * @param [in] bRecursive If TRUE subdirectories are included to compare. */ void CDirDoc::InitCompare(const PathContext & paths, BOOL bRecursive, CTempPathContext *pTempPathContext) { m_pDirView->DeleteAllDisplayItems(); // Anything that can go wrong here will yield an exception. // Default implementation of operator new() never returns NULL. delete m_pCtxt; if (m_pCompareStats == NULL) m_pCompareStats = new CompareStats(); m_pCtxt = new CDiffContext(paths.GetLeft().c_str(), paths.GetRight().c_str(), GetOptionsMgr()->GetInt(OPT_CMP_METHOD)); m_pCtxt->m_bRecursive = !!bRecursive; if (pTempPathContext) { ApplyLeftDisplayRoot(pTempPathContext->m_strLeftDisplayRoot); ApplyRightDisplayRoot(pTempPathContext->m_strRightDisplayRoot); pTempPathContext->m_pParent = m_pTempPathContext; m_pTempPathContext = pTempPathContext; m_pTempPathContext->m_strLeftRoot = m_pCtxt->GetNormalizedLeft(); m_pTempPathContext->m_strRightRoot = m_pCtxt->GetNormalizedRight(); } m_bRecursive = bRecursive; // All plugin management is done by our plugin manager m_pCtxt->m_piPluginInfos = &m_pluginman; }
/** * @brief Let user browse common color dialog, and select a color * @param [in] colorButton Button for which to change color. * @param [in] colorIndex Index to color table. */ void PropTextColors::BrowseColorAndSave(CColorButton & colorButton, int colorIndex) { // Ignore user if colors are slaved to system if (IsDlgButtonChecked(IDC_DEFAULT_STANDARD_COLORS) == BST_UNCHECKED) return; COLORREF currentColor = m_pTempColors->GetColor(colorIndex); CColorDialog dialog(currentColor); Options::CustomColors::Load(GetOptionsMgr(), m_cCustColors.data()); dialog.m_cc.lpCustColors = m_cCustColors.data(); if (dialog.DoModal() == IDOK) { currentColor = dialog.GetColor(); colorButton.SetColor(currentColor); m_pTempColors->SetColor(colorIndex, currentColor); } Options::CustomColors::Save(GetOptionsMgr(), m_cCustColors.data()); }
/** * @brief Split panes vertically */ void CMergeEditFrame::OnViewSplitVertically() { auto& wndSplitter = GetMergeEditSplitterWnd(0); bool bSplitVertically = (wndSplitter.GetColumnCount() != 1); bSplitVertically = !bSplitVertically; // toggle GetOptionsMgr()->SaveOption(OPT_SPLIT_HORIZONTALLY, !bSplitVertically); for (int iRow = 0; iRow < m_wndSplitter.GetRowCount(); ++iRow) GetMergeEditSplitterWnd(iRow).FlipSplit(); m_pwndDetailMergeEditSplitterView->m_wndSplitter.FlipSplit(); }
void PropMergeColors::SerializeColor(OPERATION op, CColorButton & btn, LPCTSTR optionName, COLORREF & color) { switch (op) { case SET_DEFAULTS: GetOptionsMgr()->GetDefault(optionName, color); btn.SetColor(color); return; case WRITE_OPTIONS: GetOptionsMgr()->SaveOption(optionName, (int)color); return; case READ_OPTIONS: color = GetOptionsMgr()->GetInt(optionName); // Set colors for buttons, do NOT invalidate btn.SetColor(color, FALSE); return; } }
void COpenView::OnSetfocusPathCombo(UINT id, NMHDR *pNMHDR, LRESULT *pResult) { if (!m_bAutoCompleteReady[id - IDC_PATH0_COMBO]) { int nSource = GetOptionsMgr()->GetInt(OPT_AUTO_COMPLETE_SOURCE); if (nSource > 0) m_ctlPath[id - IDC_PATH0_COMBO].SetAutoComplete(nSource); m_bAutoCompleteReady[id - IDC_PATH0_COMBO] = true; } *pResult = 0; }
/** * @brief Writes options values from UI to storage. * (Property sheet calls this after displaying all property pages) */ void PropTextColors::WriteOptions() { GetOptionsMgr()->SaveOption(OPT_CLR_DEFAULT_TEXT_COLORING, !m_bCustomColors); // User can only change colors via BrowseColorAndSave, // which writes to m_pTempColors // so user's latest choices are in m_pTempColors // (we don't have to read them from screen) // Also, CPropSyntaxColors writes m_pTempColors out, so we don't have to // We share m_pTempColors with CPropSyntaxColors }
/** * @brief Save plugins enabled setting when closing the dialog. */ void PluginsListDlg::OnBnClickedOk() { GetOptionsMgr()->SaveOption(OPT_PLUGINS_ENABLED, (IsDlgButtonChecked(IDC_PLUGINS_ENABLE) == 1)); for (int i = 0; i < m_list.GetItemCount(); ++i) { PluginInfo * plugin = CAllThreadsScripts::GetActiveSet()->GetPluginByName(NULL, String(m_list.GetItemText(i, 0))); plugin->m_disabled = !m_list.GetCheck(i); } CAllThreadsScripts::GetActiveSet()->SaveSettings(); OnOK(); }
/** * @brief Initialize the dialog. */ BOOL PluginsListDlg::OnInitDialog() { CTrDialog::OnInitDialog(); InitList(); AddPlugins(); m_list.SetItemState(0, LVIS_SELECTED, LVIS_SELECTED); CheckDlgButton(IDC_PLUGINS_ENABLE, GetOptionsMgr()->GetBool(OPT_PLUGINS_ENABLED) ? BST_CHECKED : BST_UNCHECKED); return FALSE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
/** * @brief Reads options values from storage to UI. */ void PropBackups::ReadOptions() { m_bCreateForFolderCmp = GetOptionsMgr()->GetBool(OPT_BACKUP_FOLDERCMP); m_bCreateForFileCmp = GetOptionsMgr()->GetBool(OPT_BACKUP_FILECMP); m_nBackupFolder = GetOptionsMgr()->GetInt(OPT_BACKUP_LOCATION); m_sGlobalFolder = GetOptionsMgr()->GetString(OPT_BACKUP_GLOBALFOLDER); m_bAppendBak = GetOptionsMgr()->GetBool(OPT_BACKUP_ADD_BAK); m_bAppendTime = GetOptionsMgr()->GetBool(OPT_BACKUP_ADD_TIME); }
BOOL CMergeEditFrame::DestroyWindow() { SavePosition(); // If we are active, save the restored/maximized state // If we are not, do nothing and let the active frame do the job. if (this->GetParentFrame()->GetActiveFrame() == (CFrameWnd*)this) { WINDOWPLACEMENT wp; wp.length = sizeof(WINDOWPLACEMENT); GetWindowPlacement(&wp); GetOptionsMgr()->SaveOption(OPT_ACTIVE_FRAME_MAX, (wp.showCmd == SW_MAXIMIZE)); } return CMDIChildWnd::DestroyWindow(); }
/** * @brief Wrap Merge7z::GuessFormat() to allow for some customizing: * - Check if 7-Zip integration is enabled. * - Check for filename extension mappings. */ Merge7z::Format *ArchiveGuessFormat(LPCTSTR path) { if (GetOptionsMgr()->GetInt(OPT_ARCHIVE_ENABLE) == 0) return NULL; if (PathIsDirectory(path)) return NULL; // Map extensions through ExternalArchiveFormat.ini static TCHAR null[] = _T(""); static const TCHAR section[] = _T("extensions"); LPCTSTR entry = PathFindExtension(path); TCHAR value[20]; static LPCTSTR filename = NULL; if (filename == NULL) { TCHAR cPath[INTERNET_MAX_PATH_LENGTH]; DWORD cchPath = SearchPath(NULL, _T("ExternalArchiveFormat.ini"), NULL, INTERNET_MAX_PATH_LENGTH, cPath, NULL); filename = cchPath && cchPath < INTERNET_MAX_PATH_LENGTH ? StrDup(cPath) : null; } if (*filename && GetPrivateProfileString(section, entry, null, value, 20, filename) && *value == '.') { // Remove end-of-line comments (in string returned from GetPrivateProfileString) // that is, remove semicolon & whatever follows it if (LPTSTR p = StrChr(value, ';')) { *p = '\0'; StrTrim(value, _T(" \t")); } path = value; } // PATCH [ 1229867 ] RFE [ 1205516 ], RFE [ 887948 ], and other issues // command line integration portion is not yet applied // so following code not yet valid, so temporarily commented out // Look for command line tool first /*Merge7z::Format *pFormat; if (CExternalArchiveFormat::GuessFormat(path, pFormat)) { return pFormat; }*/ // Default to Merge7z*.dll return Merge7z->GuessFormat(path); }
/** * @brief Initialize the dialog. */ BOOL PluginsListDlg::OnInitDialog() { theApp.TranslateDialog(m_hWnd); CDialog::OnInitDialog(); InitList(); AddPlugins(); BOOL pluginsEnabled = GetOptionsMgr()->GetBool(OPT_PLUGINS_ENABLED); if (pluginsEnabled) { CButton *btn = (CButton *)GetDlgItem(IDC_PLUGINS_ENABLE); btn->SetCheck(BST_CHECKED); } return FALSE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
/** * @brief Writes options values from UI to storage. */ void PropBackups::WriteOptions() { m_sGlobalFolder = strutils::trim_ws(m_sGlobalFolder); if (m_sGlobalFolder.length() > 3) m_sGlobalFolder = paths::AddTrailingSlash(m_sGlobalFolder); GetOptionsMgr()->SaveOption(OPT_BACKUP_FOLDERCMP, m_bCreateForFolderCmp); GetOptionsMgr()->SaveOption(OPT_BACKUP_FILECMP, m_bCreateForFileCmp); GetOptionsMgr()->SaveOption(OPT_BACKUP_LOCATION, m_nBackupFolder); GetOptionsMgr()->SaveOption(OPT_BACKUP_GLOBALFOLDER, m_sGlobalFolder); GetOptionsMgr()->SaveOption(OPT_BACKUP_ADD_BAK, m_bAppendBak); GetOptionsMgr()->SaveOption(OPT_BACKUP_ADD_TIME, m_bAppendTime); }
/** * @brief Obtain a merge doc to display a difference in files. * @param [out] pNew Set to TRUE if a new doc is created, * and FALSE if an existing one reused. * @return Pointer to CMergeDoc to use (new or existing). */ CMergeDoc * CDirDoc::GetMergeDocForDiff(BOOL * pNew) { CMergeDoc * pMergeDoc = 0; // policy -- use an existing merge doc if available const BOOL bMultiDocs = GetOptionsMgr()->GetBool(OPT_MULTIDOC_MERGEDOCS); if (!bMultiDocs && !m_MergeDocs.IsEmpty()) { *pNew = FALSE; pMergeDoc = m_MergeDocs.GetHead(); } else { // Create a new merge doc pMergeDoc = (CMergeDoc*)theApp.m_pDiffTemplate->OpenDocumentFile(NULL); AddMergeDoc(pMergeDoc); pMergeDoc->SetDirDoc(this); *pNew = TRUE; } return pMergeDoc; }
/** * @brief Save coordinates of the frame, splitters, and bars * * @note Do not save the maximized/restored state here. We are interested * in the state of the active frame, and maybe this frame is not active */ void CMergeEditFrame::SavePosition() { // save the bars layout // save docking positions and sizes CDockState m_pDockState; GetDockState(m_pDockState); m_pDockState.SaveState(_T("Settings")); // for the dimensions of the diff pane, use the CSizingControlBar save m_wndLocationBar.SaveState(_T("Settings")); m_wndDetailBar.SaveState(_T("Settings")); int iRow, iCol; m_wndSplitter.GetActivePane(&iRow, nullptr); if (iRow >= 0) { auto& splitterWnd = static_cast<CMergeEditSplitterView *>(m_wndSplitter.GetPane(iRow, 0))->m_wndSplitter; splitterWnd.GetActivePane(&iRow, &iCol); if (iRow >= 0 || iCol >= 0) GetOptionsMgr()->SaveOption(OPT_ACTIVE_PANE, max(iRow, iCol)); } }
/** * @brief Load files and initialize frame's compare result icon */ HRESULT CHexMergeDoc::OpenDocs(LPCTSTR pathLeft, LPCTSTR pathRight, BOOL bROLeft, BOOL bRORight) { CHexMergeFrame *pf = GetParentFrame(); ASSERT(pf); HRESULT hr; if (SUCCEEDED(hr = LoadOneFile(MERGE_VIEW_LEFT, pathLeft, bROLeft)) && SUCCEEDED(hr = LoadOneFile(MERGE_VIEW_RIGHT, pathRight, bRORight))) { UpdateDiffItem(0); // An extra ResizeWindow() on the left view aligns scroll ranges, and // also triggers initial diff coloring by invalidating the client area. m_pView[MERGE_VIEW_LEFT]->ResizeWindow(); if (GetOptionsMgr()->GetBool(OPT_SCROLL_TO_FIRST)) m_pView[MERGE_VIEW_LEFT]->SendMessage(WM_COMMAND, ID_FIRSTDIFF); } else { // Use verify macro to trap possible error in debug. VERIFY(pf->DestroyWindow()); } return hr; }
/** * @brief Writes options values from UI to storage. */ void PropBackups::WriteOptions() { m_sGlobalFolder.TrimLeft(); m_sGlobalFolder.TrimRight(); if (m_sGlobalFolder.GetLength() > 3&& m_sGlobalFolder[m_sGlobalFolder.GetLength() - 1] != '\\') { m_sGlobalFolder += "\\"; } GetOptionsMgr()->SaveOption(OPT_BACKUP_FOLDERCMP, m_bCreateForFolderCmp == TRUE); GetOptionsMgr()->SaveOption(OPT_BACKUP_FILECMP, m_bCreateForFileCmp == TRUE); GetOptionsMgr()->SaveOption(OPT_BACKUP_LOCATION, m_nBackupFolder); GetOptionsMgr()->SaveOption(OPT_BACKUP_GLOBALFOLDER, m_sGlobalFolder); GetOptionsMgr()->SaveOption(OPT_BACKUP_ADD_BAK, m_bAppendBak == TRUE); GetOptionsMgr()->SaveOption(OPT_BACKUP_ADD_TIME, m_bAppendTime == TRUE); }
/** * @brief Writes options values from UI to storage. */ void PropRegistry::WriteOptions() { GetOptionsMgr()->SaveOption(OPT_USE_RECYCLE_BIN, m_bUseRecycleBin == TRUE); String sExtEditor = string_trim_ws(m_strEditorPath); if (sExtEditor.empty()) sExtEditor = GetOptionsMgr()->GetDefault<String>(OPT_EXT_EDITOR_CMD); GetOptionsMgr()->SaveOption(OPT_EXT_EDITOR_CMD, sExtEditor); String sFilterPath = string_trim_ws(m_strUserFilterPath); GetOptionsMgr()->SaveOption(OPT_FILTER_USERPATH, sFilterPath); bool useSysTemp = m_tempFolderType == 0; GetOptionsMgr()->SaveOption(OPT_USE_SYSTEM_TEMP_PATH, useSysTemp); String tempFolder = string_trim_ws(m_tempFolder); GetOptionsMgr()->SaveOption(OPT_CUSTOM_TEMP_PATH, tempFolder); }
/** * @brief Writes options values from UI to storage. */ void PropShell::WriteOptions() { GetOptionsMgr()->SaveOption(OPT_DIRVIEW_ENABLE_SHELL_CONTEXT_MENU, m_bEnableShellContextMenu); SaveMergePath(); // saves context menu settings as well }
/** * @brief Reads options values from storage to UI. */ void PropShell::ReadOptions() { GetContextRegValues(); m_bEnableShellContextMenu = GetOptionsMgr()->GetBool(OPT_DIRVIEW_ENABLE_SHELL_CONTEXT_MENU); }