Skip to content

Commit 30bb18e

Browse files
committed
WIP (2)
1 parent 1d5ae45 commit 30bb18e

File tree

5 files changed

+80
-30
lines changed

5 files changed

+80
-30
lines changed

src/WinWebDiff/Resource.h

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,15 @@
3838
#define IDM_COMPARE_LASTDIFFERENCE 149
3939
#define IDM_COMPARE_NEXTCONFLICT 150
4040
#define IDM_COMPARE_PREVIOUSCONFLICT 151
41-
#define IDM_CLEAR_DISK_CACHE 161
42-
#define IDM_CLEAR_COOKIES 162
43-
#define IDM_CLEAR_BROWSING_HISTORY 163
44-
#define IDM_CLEAR_ALL_PROFILE 164
45-
#define IDI_WINWEBDIFF 170
46-
#define IDI_SMALL 171
47-
#define IDC_WINWEBDIFF 172
41+
#define IDM_SYNC_SCROLL 160
42+
#define IDM_SYNC_CLICK 161
43+
#define IDM_CLEAR_DISK_CACHE 171
44+
#define IDM_CLEAR_COOKIES 172
45+
#define IDM_CLEAR_BROWSING_HISTORY 173
46+
#define IDM_CLEAR_ALL_PROFILE 174
47+
#define IDI_WINWEBDIFF 180
48+
#define IDI_SMALL 181
49+
#define IDC_WINWEBDIFF 182
4850
#define IDC_MYICON 2
4951
#ifndef IDC_STATIC
5052
#define IDC_STATIC -1
@@ -55,7 +57,7 @@
5557
#ifndef APSTUDIO_READONLY_SYMBOLS
5658

5759
#define _APS_NO_MFC 130
58-
#define _APS_NEXT_RESOURCE_VALUE 180
60+
#define _APS_NEXT_RESOURCE_VALUE 190
5961
#define _APS_NEXT_COMMAND_VALUE 32771
6062
#define _APS_NEXT_CONTROL_VALUE 1000
6163
#define _APS_NEXT_SYMED_VALUE 111

src/WinWebDiff/WinWebDiff.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,8 @@ void UpdateMenuState(HWND hWnd)
367367
CheckMenuItem(hMenu, IDM_VIEW_SPLITHORIZONTALLY, m_pWebDiffWindow->GetHorizontalSplit() ? MF_CHECKED : MF_UNCHECKED);
368368
CheckMenuRadioItem(hMenu, IDM_VIEW_DIFF_ALGORITHM_MYERS, IDM_VIEW_DIFF_ALGORITHM_NONE,
369369
m_pWebDiffWindow->GetDiffOptions().diffAlgorithm + IDM_VIEW_DIFF_ALGORITHM_MYERS, MF_BYCOMMAND);
370+
CheckMenuItem(hMenu, IDM_SYNC_SCROLL, m_pWebDiffWindow->GetSyncEventFlag(IWebDiffWindow::EVENT_SCROLL) ? MF_CHECKED : MF_UNCHECKED);
371+
CheckMenuItem(hMenu, IDM_SYNC_CLICK, m_pWebDiffWindow->GetSyncEventFlag(IWebDiffWindow::EVENT_CLICK) ? MF_CHECKED : MF_UNCHECKED);
370372
}
371373

372374
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
@@ -583,6 +585,16 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
583585
case IDM_COMPARE_PREVIOUSCONFLICT:
584586
m_pWebDiffWindow->PrevConflict();
585587
break;
588+
case IDM_SYNC_SCROLL:
589+
m_pWebDiffWindow->SetSyncEventFlag(IWebDiffWindow::EVENT_SCROLL,
590+
!m_pWebDiffWindow->GetSyncEventFlag(IWebDiffWindow::EVENT_SCROLL));
591+
UpdateMenuState(m_hWnd);
592+
break;
593+
case IDM_SYNC_CLICK:
594+
m_pWebDiffWindow->SetSyncEventFlag(IWebDiffWindow::EVENT_CLICK,
595+
!m_pWebDiffWindow->GetSyncEventFlag(IWebDiffWindow::EVENT_CLICK));
596+
UpdateMenuState(m_hWnd);
597+
break;
586598
case IDM_CLEAR_DISK_CACHE:
587599
m_pWebDiffWindow->ClearBrowsingData(-1, IWebDiffWindow::BrowsingDataType::DISK_CACHE);
588600
break;

src/WinWebDiff/WinWebDiff.rc

364 Bytes
Binary file not shown.

src/WinWebDiffLib/WebDiffWindow.hpp

Lines changed: 50 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -141,16 +141,22 @@ class CWebDiffWindow : public IWebDiffWindow
141141
}
142142
else if (event == L"click")
143143
{
144-
const std::wstring& selector = doc[L"selector"].GetString();
145-
syncClick(ev.pane, selector);
144+
if (GetSyncEventFlag(EVENT_CLICK))
145+
{
146+
const std::wstring& selector = doc[L"selector"].GetString();
147+
syncClick(ev.pane, selector);
148+
}
146149
}
147150
else if (event == L"scroll")
148151
{
149-
const double left = doc[L"left"].GetDouble();
150-
const double top = doc[L"top"].GetDouble();
151-
const std::wstring& window = doc[L"window"].GetString();
152-
const std::wstring& selector = doc[L"selector"].GetString();
153-
syncScroll(ev.pane, window, selector, left, top);
152+
if (GetSyncEventFlag(EVENT_SCROLL))
153+
{
154+
const double left = doc[L"left"].GetDouble();
155+
const double top = doc[L"top"].GetDouble();
156+
const std::wstring& window = doc[L"window"].GetString();
157+
const std::wstring& selector = doc[L"selector"].GetString();
158+
syncScroll(ev.pane, window, selector, left, top);
159+
}
154160
}
155161
}
156162
for (const auto& listener : m_listeners)
@@ -468,6 +474,19 @@ class CWebDiffWindow : public IWebDiffWindow
468474
Recompare(nullptr);
469475
}
470476

477+
bool GetSyncEventFlag(EventType event) const
478+
{
479+
return (m_eventSyncFlags & event) != 0;
480+
}
481+
482+
void SetSyncEventFlag(EventType event, bool flag)
483+
{
484+
if (flag)
485+
m_eventSyncFlags = m_eventSyncFlags | static_cast<unsigned>(event);
486+
else
487+
m_eventSyncFlags = m_eventSyncFlags & ~static_cast<unsigned>(event);
488+
}
489+
471490
int GetDiffCount() const override
472491
{
473492
return static_cast<int>(m_diffInfos.size());
@@ -721,12 +740,12 @@ class CWebDiffWindow : public IWebDiffWindow
721740
const wchar_t* script =
722741
LR"(
723742
(function() {
724-
window.wdw = { };
743+
window.wdw = {};
725744
wdw.syncScroll = function(win, selector, left, top) {
726745
var el = document.querySelector(selector);
727746
if (el && wdw.getWindowLocation() === win) {
728-
var sleft = (el.scrollWidth - el.clientWidth) * left;
729-
var stop = (el.scrollHeight - el.clientHeight) * top;
747+
var sleft = Math.round((el.scrollWidth - el.clientWidth) * left);
748+
var stop = Math.round((el.scrollHeight - el.clientHeight) * top);
730749
clearTimeout(wdw.timeout);
731750
wdw.timeout = setTimeout(function() {
732751
el.scroll(sleft, stop);
@@ -844,19 +863,23 @@ LR"(
844863

845864
HRESULT syncClick(int srcPane, const std::wstring& selector)
846865
{
847-
std::wstring script =
848-
L"if (!('wdw' in window)) { console.log('none'); window.wdw = {}; }"
849-
L"var el = document.querySelector('" + selector + L"');"
850-
L"if (el) {"
851-
L" el.click();"
852-
L" setTimeout(function() {"
853-
L" }, 500);"
854-
L"}";
855-
for (int pane = 0; pane < m_nPanes; ++pane)
866+
uint64_t now = GetTickCount64();
867+
if (m_lastClickEvent.selector != selector || GetTickCount64() - m_lastClickEvent.time > 200)
856868
{
857-
if (pane == srcPane)
858-
continue;
859-
m_webWindow[pane].ExecuteScriptInAllFrames(script.c_str(), nullptr);
869+
m_lastClickEvent.selector = selector;
870+
m_lastClickEvent.time = now;
871+
std::wstring script =
872+
L"if (!('wdw' in window)) { console.log('none'); window.wdw = {}; }"
873+
L"var el = document.querySelector('" + selector + L"');"
874+
L"if (el) {"
875+
L" el.click();"
876+
L"}";
877+
for (int pane = 0; pane < m_nPanes; ++pane)
878+
{
879+
if (pane == srcPane)
880+
continue;
881+
m_webWindow[pane].ExecuteScriptInAllFrames(script.c_str(), nullptr);
882+
}
860883
}
861884
return S_OK;
862885
}
@@ -1476,6 +1499,11 @@ LR"(
14761499
DiffOptions m_diffOptions{};
14771500
bool m_bShowDifferences = true;
14781501
bool m_bShowWordDifferences = true;
1502+
unsigned m_eventSyncFlags = EVENT_SCROLL | EVENT_CLICK;
1503+
struct LastClickEvent {
1504+
std::wstring selector;
1505+
uint64_t time;
1506+
} m_lastClickEvent;
14791507
IWebDiffWindow::ColorSettings m_colorSettings = {
14801508
RGB(239, 203, 5), RGB(192, 192, 192), RGB(0, 0, 0),
14811509
RGB(239, 119, 116), RGB(240, 192, 192), RGB(0, 0, 0),

src/WinWebDiffLib/WinWebDiffLib.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ struct IWebDiffWindow
5555
SETTINGS = ( 1 << 13 ),
5656
ALL_PROFILE = ( 1 << 14 )
5757
};
58+
enum EventType
59+
{
60+
EVENT_NONE = 0,
61+
EVENT_SCROLL = ( 1 << 0 ),
62+
EVENT_CLICK = ( 1 << 1 ),
63+
};
5864
struct DiffOptions
5965
{
6066
enum DiffAlgorithm {
@@ -170,6 +176,8 @@ struct IWebDiffWindow
170176
virtual bool CanRedo() = 0;
171177
virtual const DiffOptions& GetDiffOptions() const = 0;
172178
virtual void SetDiffOptions(const DiffOptions& diffOptions) = 0;
179+
virtual bool GetSyncEventFlag(EventType event) const = 0;
180+
virtual void SetSyncEventFlag(EventType event, bool flag) = 0;
173181
};
174182

175183
extern "C"

0 commit comments

Comments
 (0)