source: filezilla/trunk/fuentes/src/interface/listingcomparison.cpp @ 130

Last change on this file since 130 was 130, checked in by jrpelegrina, 4 years ago

First release to xenial

File size: 6.7 KB
Line 
1#include <filezilla.h>
2#include "listingcomparison.h"
3#include "filter.h"
4#include "Options.h"
5#include "state.h"
6
7CComparableListing::CComparableListing(wxWindow* pParent)
8{
9        m_pComparisonManager = 0;
10        m_pParent = pParent;
11
12        // Init backgrounds for directory comparison
13        wxColour background = m_pParent->GetBackgroundColour();
14        if (background.Red() + background.Green() + background.Blue() >= 384)
15        {
16                // Light background
17                m_comparisonBackgrounds[0].SetBackgroundColour(wxColour(255, 128, 128));
18                m_comparisonBackgrounds[1].SetBackgroundColour(wxColour(255, 255, 128));
19                m_comparisonBackgrounds[2].SetBackgroundColour(wxColour(128, 255, 128));
20        }
21        else
22        {
23                // Light background
24                m_comparisonBackgrounds[0].SetBackgroundColour(wxColour(192, 64, 64));
25                m_comparisonBackgrounds[1].SetBackgroundColour(wxColour(192, 192, 64));
26                m_comparisonBackgrounds[2].SetBackgroundColour(wxColour(64, 192, 64));
27        }
28
29        m_pOther = 0;
30}
31
32bool CComparableListing::IsComparing() const
33{
34        if (!m_pComparisonManager)
35                return false;
36
37        return m_pComparisonManager->IsComparing();
38}
39
40void CComparableListing::ExitComparisonMode()
41{
42        if (!m_pComparisonManager)
43                return;
44
45        m_pComparisonManager->ExitComparisonMode();
46}
47
48void CComparableListing::RefreshComparison()
49{
50        if (!m_pComparisonManager)
51                return;
52
53        if (!IsComparing())
54                return;
55
56        if (!CanStartComparison() || !GetOther() || !GetOther()->CanStartComparison()) {
57                return;
58        }
59
60        m_pComparisonManager->CompareListings();
61}
62
63bool CComparisonManager::CompareListings()
64{
65        if (!m_pLeft || !m_pRight)
66                return false;
67
68        CFilterManager filters;
69        if (filters.HasActiveFilters() && !filters.HasSameLocalAndRemoteFilters()) {
70                m_pState->NotifyHandlers(STATECHANGE_COMPARISON);
71                wxMessageBoxEx(_("Cannot compare directories, different filters for local and remote directories are enabled"), _("Directory comparison failed"), wxICON_EXCLAMATION);
72                return false;
73        }
74
75        m_isComparing = true;
76        m_pLeft->m_pComparisonManager = this;
77        m_pRight->m_pComparisonManager = this;
78
79        m_pState->NotifyHandlers(STATECHANGE_COMPARISON);
80
81        wxString error;
82        if (!m_pLeft->CanStartComparison() || !m_pRight->CanStartComparison()) {
83                return true;
84        }
85
86        const int mode = COptions::Get()->GetOptionVal(OPTION_COMPARISONMODE);
87        duration const threshold = duration::from_minutes( COptions::Get()->GetOptionVal(OPTION_COMPARISON_THRESHOLD) );
88
89        m_pLeft->StartComparison();
90        m_pRight->StartComparison();
91
92        wxString localFile, remoteFile;
93        bool localDir = false;
94        bool remoteDir = false;
95        int64_t localSize, remoteSize;
96        CDateTime localDate, remoteDate;
97
98        const int dirSortMode = COptions::Get()->GetOptionVal(OPTION_FILELIST_DIRSORT);
99
100        const bool hide_identical = COptions::Get()->GetOptionVal(OPTION_COMPARE_HIDEIDENTICAL) != 0;
101
102        bool gotLocal = m_pLeft->GetNextFile(localFile, localDir, localSize, localDate);
103        bool gotRemote = m_pRight->GetNextFile(remoteFile, remoteDir, remoteSize, remoteDate);
104
105        while (gotLocal && gotRemote) {
106                int cmp = CompareFiles(dirSortMode, localFile, remoteFile, localDir, remoteDir);
107                if (!cmp) {
108                        if (!mode) {
109                                const CComparableListing::t_fileEntryFlags flag = (localDir || localSize == remoteSize) ? CComparableListing::normal : CComparableListing::different;
110
111                                if (!hide_identical || flag != CComparableListing::normal || localFile == _T("..")) {
112                                        m_pLeft->CompareAddFile(flag);
113                                        m_pRight->CompareAddFile(flag);
114                                }
115                        }
116                        else {
117                                if (!localDate.IsValid() || !remoteDate.IsValid()) {
118                                        if (!hide_identical || localDate.IsValid() || remoteDate.IsValid() || localFile == _T("..")) {
119                                                const CComparableListing::t_fileEntryFlags flag = CComparableListing::normal;
120                                                m_pLeft->CompareAddFile(flag);
121                                                m_pRight->CompareAddFile(flag);
122                                        }
123                                }
124                                else {
125                                        CComparableListing::t_fileEntryFlags localFlag, remoteFlag;
126
127                                        int dateCmp = localDate.Compare(remoteDate);
128                                        if (dateCmp < 0) {
129                                                localDate += threshold;
130                                        }
131                                        else if (dateCmp > 0 ) {
132                                                remoteDate += threshold;
133                                        }
134                                        int adjustedDateCmp = localDate.Compare(remoteDate);
135                                        if (dateCmp && dateCmp == -adjustedDateCmp) {
136                                                dateCmp = 0;
137                                        }
138
139                                        localFlag = CComparableListing::normal;
140                                        remoteFlag = CComparableListing::normal;
141                                        if (dateCmp < 0 ) {
142                                                remoteFlag = CComparableListing::newer;
143                                        }
144                                        else if (dateCmp > 0) {
145                                                localFlag = CComparableListing::newer;
146                                        }
147                                        if (!hide_identical || localFlag != CComparableListing::normal || remoteFlag != CComparableListing::normal || localFile == _T("..")) {
148                                                m_pLeft->CompareAddFile(localFlag);
149                                                m_pRight->CompareAddFile(remoteFlag);
150                                        }
151                                }
152                        }
153                        gotLocal = m_pLeft->GetNextFile(localFile, localDir, localSize, localDate);
154                        gotRemote = m_pRight->GetNextFile(remoteFile, remoteDir, remoteSize, remoteDate);
155                        continue;
156                }
157
158                if (cmp < 0) {
159                        m_pLeft->CompareAddFile(CComparableListing::lonely);
160                        m_pRight->CompareAddFile(CComparableListing::fill);
161                        gotLocal = m_pLeft->GetNextFile(localFile, localDir, localSize, localDate);
162                }
163                else {
164                        m_pLeft->CompareAddFile(CComparableListing::fill);
165                        m_pRight->CompareAddFile(CComparableListing::lonely);
166                        gotRemote = m_pRight->GetNextFile(remoteFile, remoteDir, remoteSize, remoteDate);
167                }
168        }
169        while (gotLocal) {
170                m_pLeft->CompareAddFile(CComparableListing::lonely);
171                m_pRight->CompareAddFile(CComparableListing::fill);
172                gotLocal = m_pLeft->GetNextFile(localFile, localDir, localSize, localDate);
173        }
174        while (gotRemote)
175        {
176                m_pLeft->CompareAddFile(CComparableListing::fill);
177                m_pRight->CompareAddFile(CComparableListing::lonely);
178                gotRemote = m_pRight->GetNextFile(remoteFile, remoteDir, remoteSize, remoteDate);
179        }
180
181        m_pRight->FinishComparison();
182        m_pLeft->FinishComparison();
183
184        return true;
185}
186
187int CComparisonManager::CompareFiles(const int dirSortMode, const wxString& local, const wxString& remote, bool localDir, bool remoteDir)
188{
189        switch (dirSortMode)
190        {
191        default:
192                if (localDir)
193                {
194                        if (!remoteDir)
195                                return -1;
196                }
197                else if (remoteDir)
198                        return 1;
199                break;
200        case 2:
201                // Inline
202                break;
203        }
204
205#ifdef __WXMSW__
206        return local.CmpNoCase(remote);
207#else
208        return local.Cmp(remote);
209#endif
210
211        return 0;
212}
213
214CComparisonManager::CComparisonManager(CState* pState)
215        : m_pState(pState)
216{
217}
218
219void CComparisonManager::SetListings(CComparableListing* pLeft, CComparableListing* pRight)
220{
221        wxASSERT((pLeft && pRight) || (!pLeft && !pRight));
222
223        if (IsComparing())
224                ExitComparisonMode();
225
226        if (m_pLeft)
227                m_pLeft->SetOther(0);
228        if (m_pRight)
229                m_pRight->SetOther(0);
230
231        m_pLeft = pLeft;
232        m_pRight = pRight;
233
234        if (m_pLeft)
235                m_pLeft->SetOther(m_pRight);
236        if (m_pRight)
237                m_pRight->SetOther(m_pLeft);
238}
239
240void CComparisonManager::ExitComparisonMode()
241{
242        if (!IsComparing())
243                return;
244
245        m_isComparing = false;
246        if (m_pLeft)
247                m_pLeft->OnExitComparisonMode();
248        if (m_pRight)
249                m_pRight->OnExitComparisonMode();
250
251        m_pState->NotifyHandlers(STATECHANGE_COMPARISON);
252}
Note: See TracBrowser for help on using the repository browser.