OSDN Git Service

Fix issue #940: Replace slow (2)
[winmerge-jp/winmerge-jp.git] / Src / PropCompareFolder.cpp
1 /** 
2  * @file  PropCompareFolder.cpp
3  *
4  * @brief Implementation of PropCompareFolder propertysheet
5  */
6
7 #include "stdafx.h"
8 #include "PropCompareFolder.h"
9 #include "OptionsDef.h"
10 #include "OptionsMgr.h"
11 #include "OptionsPanel.h"
12
13 #ifdef _DEBUG
14 #define new DEBUG_NEW
15 #endif
16
17 static const int Mega = 1024 * 1024;
18
19 /** 
20  * @brief Constructor.
21  * @param [in] optionsMgr Pointer to COptionsMgr.
22  */
23 PropCompareFolder::PropCompareFolder(COptionsMgr *optionsMgr) 
24  : OptionsPanel(optionsMgr, PropCompareFolder::IDD)
25  , m_compareMethod(-1)
26  , m_bStopAfterFirst(false)
27  , m_bIgnoreSmallTimeDiff(false)
28  , m_bIncludeUniqFolders(false)
29  , m_bIncludeSubdirs(false)
30  , m_bExpandSubdirs(false)
31  , m_bIgnoreReparsePoints(false)
32  , m_nQuickCompareLimit(4 * Mega)
33  , m_nBinaryCompareLimit(64 * Mega)
34  , m_nCompareThreads(-1)
35 {
36 }
37
38 void PropCompareFolder::DoDataExchange(CDataExchange* pDX)
39 {
40         CPropertyPage::DoDataExchange(pDX);
41         //{{AFX_DATA_MAP(PropCompareFolder)
42         DDX_CBIndex(pDX, IDC_COMPAREMETHODCOMBO, m_compareMethod);
43         DDX_Check(pDX, IDC_COMPARE_STOPFIRST, m_bStopAfterFirst);
44         DDX_Check(pDX, IDC_IGNORE_SMALLTIMEDIFF, m_bIgnoreSmallTimeDiff);
45         DDX_Check(pDX, IDC_COMPARE_WALKSUBDIRS, m_bIncludeUniqFolders);
46         DDX_Check(pDX, IDC_RECURS_CHECK, m_bIncludeSubdirs);
47         DDX_Check(pDX, IDC_EXPAND_SUBDIRS, m_bExpandSubdirs);
48         DDX_Check(pDX, IDC_IGNORE_REPARSEPOINTS, m_bIgnoreReparsePoints);
49         DDX_Text(pDX, IDC_COMPARE_QUICKC_LIMIT, m_nQuickCompareLimit);
50         DDX_Text(pDX, IDC_COMPARE_BINARYC_LIMIT, m_nBinaryCompareLimit);
51         DDX_Text(pDX, IDC_COMPARE_THREAD_COUNT, m_nCompareThreads);
52         //}}AFX_DATA_MAP
53         UpdateControls();
54 }
55
56
57 BEGIN_MESSAGE_MAP(PropCompareFolder, OptionsPanel)
58         //{{AFX_MSG_MAP(PropCompareFolder)
59         ON_BN_CLICKED(IDC_COMPARE_DEFAULTS, OnDefaults)
60         //}}AFX_MSG_MAP
61         ON_CBN_SELCHANGE(IDC_COMPAREMETHODCOMBO, OnCbnSelchangeComparemethodcombo)
62         ON_BN_CLICKED(IDC_RECURS_CHECK, OnBnClickedRecursCheck)
63 END_MESSAGE_MAP()
64
65 /** 
66  * @brief Reads options values from storage to UI.
67  * Property sheet calls this before displaying GUI to load values
68  * into members.
69  */
70 void PropCompareFolder::ReadOptions()
71 {
72         m_compareMethod = GetOptionsMgr()->GetInt(OPT_CMP_METHOD);
73         m_bStopAfterFirst = GetOptionsMgr()->GetBool(OPT_CMP_STOP_AFTER_FIRST);
74         m_bIgnoreSmallTimeDiff = GetOptionsMgr()->GetBool(OPT_IGNORE_SMALL_FILETIME);
75         m_bIncludeUniqFolders = GetOptionsMgr()->GetBool(OPT_CMP_WALK_UNIQUE_DIRS);
76         m_bIncludeSubdirs = GetOptionsMgr()->GetBool(OPT_CMP_INCLUDE_SUBDIRS);
77         m_bExpandSubdirs = GetOptionsMgr()->GetBool(OPT_DIRVIEW_EXPAND_SUBDIRS);
78         m_bIgnoreReparsePoints = GetOptionsMgr()->GetBool(OPT_CMP_IGNORE_REPARSE_POINTS);
79         m_nQuickCompareLimit = GetOptionsMgr()->GetInt(OPT_CMP_QUICK_LIMIT) / Mega ;
80         m_nBinaryCompareLimit = GetOptionsMgr()->GetInt(OPT_CMP_BINARY_LIMIT) / Mega ;
81         m_nCompareThreads = GetOptionsMgr()->GetInt(OPT_CMP_COMPARE_THREADS);
82 }
83
84 /** 
85  * @brief Writes options values from UI to storage.
86  * Property sheet calls this after dialog is closed with OK button to
87  * store values in member variables.
88  */
89 void PropCompareFolder::WriteOptions()
90 {
91         GetOptionsMgr()->SaveOption(OPT_CMP_METHOD, (int)m_compareMethod);
92         GetOptionsMgr()->SaveOption(OPT_CMP_STOP_AFTER_FIRST, m_bStopAfterFirst);
93         GetOptionsMgr()->SaveOption(OPT_IGNORE_SMALL_FILETIME, m_bIgnoreSmallTimeDiff);
94         GetOptionsMgr()->SaveOption(OPT_CMP_WALK_UNIQUE_DIRS, m_bIncludeUniqFolders);
95         GetOptionsMgr()->SaveOption(OPT_CMP_INCLUDE_SUBDIRS, m_bIncludeSubdirs);
96         GetOptionsMgr()->SaveOption(OPT_DIRVIEW_EXPAND_SUBDIRS, m_bExpandSubdirs);
97         GetOptionsMgr()->SaveOption(OPT_CMP_IGNORE_REPARSE_POINTS, m_bIgnoreReparsePoints);
98
99         if (m_nQuickCompareLimit > 2000)
100                 m_nQuickCompareLimit = 2000;
101         GetOptionsMgr()->SaveOption(OPT_CMP_QUICK_LIMIT, m_nQuickCompareLimit * Mega);
102         if (m_nBinaryCompareLimit > 2000)
103                 m_nBinaryCompareLimit = 2000;
104         GetOptionsMgr()->SaveOption(OPT_CMP_BINARY_LIMIT, m_nBinaryCompareLimit * Mega);
105         GetOptionsMgr()->SaveOption(OPT_CMP_COMPARE_THREADS, m_nCompareThreads);
106 }
107
108 /** 
109  * @brief Called before propertysheet is drawn.
110  */
111 BOOL PropCompareFolder::OnInitDialog() 
112 {
113         OptionsPanel::OnInitDialog();
114         CComboBox * combo = (CComboBox*) GetDlgItem(IDC_COMPAREMETHODCOMBO);
115
116         String item = _("Full Contents");
117         combo->AddString(item.c_str());
118         item = _("Quick Contents");
119         combo->AddString(item.c_str());
120         item = _("Binary Contents");
121         combo->AddString(item.c_str());
122         item = _("Modified Date");
123         combo->AddString(item.c_str());
124         item = _("Modified Date and Size");
125         combo->AddString(item.c_str());
126         item = _("Size");
127         combo->AddString(item.c_str());
128         combo->SetCurSel(m_compareMethod);
129
130         return TRUE;  // return TRUE unless you set the focus to a control
131                       // EXCEPTION: OCX Property Pages should return FALSE
132 }
133
134 /** 
135  * @brief Sets options to defaults
136  */
137 void PropCompareFolder::OnDefaults()
138 {
139         m_compareMethod = GetOptionsMgr()->GetDefault<unsigned>(OPT_CMP_METHOD);
140         m_bStopAfterFirst = GetOptionsMgr()->GetDefault<bool>(OPT_CMP_STOP_AFTER_FIRST);
141         m_bIncludeUniqFolders = GetOptionsMgr()->GetDefault<bool>(OPT_CMP_WALK_UNIQUE_DIRS);
142         m_bIncludeSubdirs = GetOptionsMgr()->GetDefault<bool>(OPT_CMP_INCLUDE_SUBDIRS);
143         m_bExpandSubdirs = GetOptionsMgr()->GetDefault<bool>(OPT_DIRVIEW_EXPAND_SUBDIRS);
144         m_bIgnoreReparsePoints = GetOptionsMgr()->GetDefault<bool>(OPT_CMP_IGNORE_REPARSE_POINTS);
145         m_nQuickCompareLimit = GetOptionsMgr()->GetDefault<unsigned>(OPT_CMP_QUICK_LIMIT) / Mega;
146         m_nBinaryCompareLimit = GetOptionsMgr()->GetDefault<unsigned>(OPT_CMP_BINARY_LIMIT) / Mega;
147         m_nCompareThreads = GetOptionsMgr()->GetDefault<unsigned>(OPT_CMP_COMPARE_THREADS);
148         UpdateData(FALSE);
149 }
150
151 /** 
152  * @brief Called when compare method dropdown selection is changed.
153  * Enables / disables "Stop compare after first difference" checkbox.
154  * That checkbox is valid only for quick contents compare method.
155  */
156 void PropCompareFolder::OnCbnSelchangeComparemethodcombo()
157 {
158         UpdateControls();
159 }
160
161 void PropCompareFolder::OnBnClickedRecursCheck()
162 {
163         UpdateControls();
164 }
165
166 void PropCompareFolder::UpdateControls()
167 {
168         CComboBox * pCombo = (CComboBox*)GetDlgItem(IDC_COMPAREMETHODCOMBO);
169         EnableDlgItem(IDC_COMPARE_STOPFIRST, pCombo->GetCurSel() == 1);
170         EnableDlgItem(IDC_EXPAND_SUBDIRS, IsDlgButtonChecked(IDC_RECURS_CHECK) == 1);
171         EnableDlgItem(IDC_COMPARE_THREAD_COUNT, pCombo->GetCurSel() <= 1 ? true : false); // true: fullcontent, quickcontent
172 }