</section>
<section>
+ <title>Auto-reload modified files<indexterm>
+ <primary>Auto-reload</primary>
+ </indexterm></title>
+
+ <para>Choose one of these options:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><guilabel>Disabled</guilabel> (default): Disables automatic reloading.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para><guilabel>Only on window activated</guilabel>: When the WinMerge window is activated,
+ if the file has been modified, it will reload the file.
+ However, a message box asking if you want to reload the file will be displayed at this time.
+ If you do not want to see this message box,
+ check "Don't ask this question again" and press the Yes button.</para>
+ </listitem>
+
+ <listitem>
+ <para><guilabel>Immediately</guilabel>: Reloads the file immediately when it has been modified.
+ However, a message box asking if you want to reload the file will be displayed at this time.
+ If you do not want to see this message box,
+ check "Don't ask this question again" and press the Yes button.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section>
<title>Language<indexterm>
<primary>Language</primary>
</indexterm></title>
<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY WinMergeVersion "2.16">
-<!ENTITY ManualRevision "1.7.5">
+<!ENTITY ManualRevision "1.7.6">
</section>
<section>
+ <title>変更されたファイルの自動再読み込み<indexterm>
+ <primary>自動再読み込み</primary>
+ </indexterm></title>
+
+ <para>次の中から一つ選択してください:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><guilabel>無効</guilabel> (default): 自動再読み込みを無効にします。
+ </para>
+ </listitem>
+
+ <listitem>
+ <para><guilabel>ウインドウがアクティブになった時のみ</guilabel>: WinMergeのウインドウがアクティブになった時、
+ もしファイルが変更されていれば、ファイルを再読み込みします。
+ ただし、この時ファイルを開きなおすか問い合わせるメッセージボックスが表示されます。
+ このメッセージボックスを表示したくない場合は、「再びこの質問をしない」をチェックし、
+ はいボタンを押下してください。</para>
+ </listitem>
+
+ <listitem>
+ <para><guilabel>即時</guilabel>: ファイルが変更されたとき再読み込みを即時に行います。
+ ただし、この時ファイルを開きなおすか問い合わせるメッセージボックスが表示されます。
+ このメッセージボックスを表示したくない場合は、「再びこの質問をしない」をチェックし、
+ はいボタンを押下してください。</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section>
<title>言語<indexterm>
<primary>Language</primary>
</indexterm></title>
<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY WinMergeVersion "2.16">
-<!ENTITY ManualRevision "1.7.5">
+<!ENTITY ManualRevision "1.7.6">
--- /dev/null
+/*
+ * @file DirWatcher.cpp
+ *
+ * @brief Implementation for DirWatcher
+ */
+
+#include "pch.h"
+#include "DirWatcher.h"
+#include <process.h>
+#include "paths.h"
+
+struct DirEventListener
+{
+ uintptr_t id = 0;
+ bool dir = false;
+ String path;
+ std::function<void(const String&, DirWatcher::ACTION)> callback;
+};
+
+struct DirWatchee
+{
+ String path;
+ HANDLE hDir = nullptr;
+ bool watchSubtree = false;
+ std::unique_ptr<OVERLAPPED> pOverlapped;
+ std::vector<BYTE> info;
+ std::vector<DirEventListener> listeners;
+};
+
+struct DirRequest
+{
+ enum REQTYPE { ADD, DEL, EXIT = -1 };
+ REQTYPE type = EXIT;
+ DirEventListener listener;
+};
+
+DirWatcher::DirWatcher()
+ : m_hEventReq(nullptr)
+ , m_hEventResp(nullptr)
+ , m_hThread(nullptr)
+ , m_resp(S_OK)
+ , m_pReq{ new DirRequest()}
+ , m_cs{}
+{
+ InitializeCriticalSection(&m_cs);
+ m_hEventReq = CreateEvent(nullptr, TRUE, FALSE, nullptr);
+ if (!m_hEventReq)
+ return;
+ m_hEventResp = CreateEvent(nullptr, TRUE, FALSE, nullptr);
+ if (!m_hEventResp)
+ {
+ CloseHandle(m_hEventReq);
+ return;
+ }
+}
+
+DirWatcher::~DirWatcher()
+{
+ Clear();
+ if (m_hThread)
+ {
+ exitThread();
+ }
+ if (m_hEventReq)
+ CloseHandle(m_hEventReq);
+ if (m_hEventResp)
+ CloseHandle(m_hEventResp);
+ m_hEventReq = nullptr;
+ m_hEventResp = nullptr;
+ m_hThread = nullptr;
+ DeleteCriticalSection(&m_cs);
+}
+
+bool DirWatcher::Add(uintptr_t id, bool dir, const String& path, std::function<void(const String&, ACTION)> callback)
+{
+ EnterCriticalSection(&m_cs);
+
+ if (!m_hThread)
+ startThread();
+
+ m_pReq->type = DirRequest::ADD;
+ m_pReq->listener = { id, dir, path, callback };
+ SetEvent(m_hEventReq);
+
+ WaitForSingleObject(m_hEventResp, INFINITE);
+ ResetEvent(m_hEventResp);
+ bool result = SUCCEEDED(m_resp);
+
+ LeaveCriticalSection(&m_cs);
+ return result;
+}
+
+bool DirWatcher::Remove(uintptr_t id)
+{
+ EnterCriticalSection(&m_cs);
+
+ bool result = false;
+ if (m_hThread)
+ {
+ m_pReq->type = DirRequest::DEL;
+ m_pReq->listener.id = id;
+ SetEvent(m_hEventReq);
+
+ WaitForSingleObject(m_hEventResp, INFINITE);
+ ResetEvent(m_hEventResp);
+ result = SUCCEEDED(m_resp);
+ }
+
+ LeaveCriticalSection(&m_cs);
+ return result;
+}
+
+bool DirWatcher::startThread()
+{
+ if (m_hThread)
+ return false;
+
+ unsigned dwThreadId = 0;
+ m_hThread = reinterpret_cast<HANDLE>(
+ _beginthreadex(nullptr, 0, DirWatcherThreadProcStatic,
+ this, 0, &dwThreadId));
+ return m_hThread != nullptr;
+}
+
+bool DirWatcher::exitThread()
+{
+ bool result = false;
+
+ EnterCriticalSection(&m_cs);
+
+ if (m_hThread)
+ {
+ m_pReq->type = DirRequest::EXIT;
+ SetEvent(m_hEventReq);
+
+ WaitForSingleObject(m_hEventResp, INFINITE);
+ ResetEvent(m_hEventResp);
+ result = SUCCEEDED(m_resp);
+
+ CloseHandle(m_hThread);
+ m_hThread = nullptr;
+ }
+
+ LeaveCriticalSection(&m_cs);
+
+ return result;
+}
+
+void DirWatcher::Clear()
+{
+ Remove(static_cast<uintptr_t>(-1));
+}
+
+unsigned DirWatcher::DirWatcherThreadProc()
+{
+ std::vector<DirWatchee> watchedDirs;
+
+ auto ReadDirAsync = [](DirWatchee& watchedDir) -> bool
+ {
+ DWORD dwBytesReturned = 0;
+ if (0 == ReadDirectoryChangesW(watchedDir.hDir, watchedDir.info.data(),
+ static_cast<DWORD>(watchedDir.info.size()), watchedDir.watchSubtree,
+ FILE_NOTIFY_CHANGE_FILE_NAME |
+ FILE_NOTIFY_CHANGE_LAST_WRITE |
+ FILE_NOTIFY_CHANGE_SIZE |
+ FILE_NOTIFY_CHANGE_ATTRIBUTES,
+ &dwBytesReturned, watchedDir.pOverlapped.get(), nullptr))
+ return false;
+ return true;
+ };
+
+ auto OpenDir = [&](bool dir, const String& path, DirWatchee& watchedDir) -> bool
+ {
+ String path2 = dir ? path : paths::GetParentPath(path);
+ HANDLE hDir = CreateFile(path2.c_str(), GENERIC_READ,
+ FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
+ nullptr, OPEN_EXISTING,
+ FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,
+ nullptr);
+ if (hDir != INVALID_HANDLE_VALUE)
+ {
+ HANDLE hEvent = CreateEvent(nullptr, TRUE, FALSE, nullptr);
+ if (hEvent)
+ {
+ watchedDir.info.resize(sizeof(FILE_NOTIFY_INFORMATION) + MAX_PATH * sizeof(TCHAR));
+ watchedDir.hDir = hDir;
+ watchedDir.path = path2;
+ watchedDir.watchSubtree = dir;
+ watchedDir.pOverlapped = std::make_unique<OVERLAPPED>();
+ watchedDir.pOverlapped->hEvent = hEvent;
+ if (ReadDirAsync(watchedDir))
+ return true;
+ CloseHandle(hEvent);
+ }
+ CloseHandle(hDir);
+ }
+ return false;
+ };
+
+ auto OnAdd = [&](DirRequest& req)
+ {
+ DirEventListener& listener = req.listener;
+ auto it = watchedDirs.begin();
+ String path2 = listener.dir ? listener.path : paths::GetParentPath(listener.path);
+ for (; it != watchedDirs.end(); ++it)
+ {
+ if (strutils::compare_nocase(it->path, path2) == 0 && it->watchSubtree == listener.dir)
+ break;
+ }
+ if (it == watchedDirs.end())
+ {
+ auto& watchedDir = watchedDirs.emplace_back();
+ if (OpenDir(listener.dir, listener.path, watchedDir))
+ {
+ watchedDir.listeners.push_back(listener);
+ }
+ else
+ {
+ watchedDirs.pop_back();
+ m_resp = HRESULT_FROM_WIN32(GetLastError());
+ }
+ }
+ else
+ {
+ it->listeners.push_back(listener);
+ }
+ };
+
+ auto OnDel = [&](uintptr_t id)
+ {
+ for (auto itWatchedDirs = watchedDirs.begin(); itWatchedDirs != watchedDirs.end(); )
+ {
+ for (auto itListeners = itWatchedDirs->listeners.begin(); itListeners != itWatchedDirs->listeners.end();)
+ {
+ if (id == static_cast<uintptr_t>(-1) || itListeners->id == id)
+ itListeners = itWatchedDirs->listeners.erase(itListeners);
+ else
+ ++itListeners;
+ }
+ if (itWatchedDirs->listeners.empty())
+ {
+ CloseHandle(itWatchedDirs->hDir);
+ CloseHandle(itWatchedDirs->pOverlapped->hEvent);
+ itWatchedDirs = watchedDirs.erase(itWatchedDirs);
+ }
+ else
+ {
+ ++itWatchedDirs;
+ }
+ }
+ };
+
+ auto OnEvent = [&](DirWatchee& watchedDir)
+ {
+ DWORD dwNumberOfBytesTransferred = 0;
+ if (0 != GetOverlappedResult(watchedDir.hDir, watchedDir.pOverlapped.get(), &dwNumberOfBytesTransferred, TRUE))
+ {
+ ReadDirAsync(watchedDir);
+
+ auto* pNotifyInfo = reinterpret_cast<FILE_NOTIFY_INFORMATION*>(watchedDir.info.data());
+ String relpath(pNotifyInfo->FileName, pNotifyInfo->FileNameLength/sizeof(TCHAR));
+ String path = paths::ConcatPath(watchedDir.path, relpath);
+ for (auto& listener : watchedDir.listeners)
+ {
+ if (listener.dir || strutils::compare_nocase(listener.path, path) == 0)
+ {
+ listener.callback(path, static_cast<ACTION>(pNotifyInfo->Action));
+ }
+ }
+ }
+ };
+
+ std::vector<HANDLE> handles;
+ handles.push_back(m_hEventReq);
+ bool fexit = false;
+
+ while (!fexit)
+ {
+ DWORD dwResult = WaitForMultipleObjects(static_cast<DWORD>(handles.size()), handles.data(), FALSE, INFINITE);
+ if (dwResult == WAIT_TIMEOUT || dwResult == WAIT_FAILED)
+ break;
+ unsigned n = dwResult - WAIT_OBJECT_0;
+ if (n == 0)
+ {
+ ResetEvent(handles[0]);
+
+ m_resp = S_OK;
+ DirRequest& req = *m_pReq.get();
+ if (req.type == DirRequest::ADD)
+ {
+ OnDel(req.listener.id);
+ OnAdd(req);
+ }
+ else if (req.type == DirRequest::DEL)
+ {
+ OnDel(req.listener.id);
+ }
+ else
+ {
+ fexit = true;
+ }
+
+ handles.clear();
+ handles.push_back(m_hEventReq);
+ for (auto& watchedDir : watchedDirs)
+ handles.push_back(watchedDir.pOverlapped->hEvent);
+
+ SetEvent(m_hEventResp);
+ }
+ else
+ {
+ DirWatchee& watchedDir = watchedDirs[n - 1];
+ OnEvent(watchedDir);
+ }
+ }
+ return 0;
+}
+
+unsigned __stdcall DirWatcher::DirWatcherThreadProcStatic(void *pvThis)
+{
+ return reinterpret_cast<DirWatcher *>(pvThis)->DirWatcherThreadProc();
+}
--- /dev/null
+/**
+ * @file DirWatcher.h
+ *
+ * @brief Declaration file for DirWatcher
+ */
+#pragma once
+
+#include "UnicodeString.h"
+#include <map>
+#include <vector>
+#include <functional>
+#include <Windows.h>
+
+struct DirRequest;
+
+class DirWatcher
+{
+public:
+ enum ACTION { ACTION_ADDED = 1, ACTION_REMOVED, ACTION_MODIFIED, ACTION_RENAMED_OLD_NAME, ACTION_RENAMED_NEW_NAME };
+ DirWatcher();
+ ~DirWatcher();
+ bool Add(uintptr_t id, bool dir, const String& path, std::function<void(const String&, ACTION)> callback);
+ bool Remove(uintptr_t id);
+ void Clear();
+private:
+ bool startThread();
+ bool exitThread();
+ unsigned DirWatcherThreadProc();
+ static unsigned __stdcall DirWatcherThreadProcStatic(void* pParam);
+ HANDLE m_hThread;
+ HANDLE m_hEventReq;
+ HANDLE m_hEventResp;
+ HRESULT m_resp;
+ std::unique_ptr<DirRequest> m_pReq;
+ CRITICAL_SECTION m_cs;
+};
+
*/
CHexMergeDoc::~CHexMergeDoc()
{
+ GetMainFrame()->UnwatchDocuments(this);
+
if (m_pDirDoc != nullptr)
m_pDirDoc->MergeDocClosing(this);
}
// Use verify macro to trap possible error in debug.
VERIFY(pf->DestroyWindow());
}
+
+ GetMainFrame()->WatchDocuments(this);
+
return bSucceeded;
}
CImgMergeFrame::~CImgMergeFrame()
{
+ GetMainFrame()->UnwatchDocuments(this);
+
if (m_pDirDoc != nullptr)
{
m_pDirDoc->MergeDocClosing(this);
if (GetOptionsMgr()->GetBool(OPT_SCROLL_TO_FIRST))
m_pImgMergeWindow->FirstDiff();
+ GetMainFrame()->WatchDocuments(this);
+
return true;
}
#include "WindowsManagerDialog.h"
#include "ClipboardHistory.h"
#include "locality.h"
+#include "DirWatcher.h"
using std::vector;
using boost::begin;
, m_bShowErrors(false)
, m_lfDiff(Options::Font::Load(GetOptionsMgr(), OPT_FONT_FILECMP))
, m_lfDir(Options::Font::Load(GetOptionsMgr(), OPT_FONT_DIRCMP))
+, m_pDirWatcher(new DirWatcher())
{
}
// and rescan using new options
pMergeDoc->RefreshOptions();
pMergeDoc->FlushAndRescan(true);
+ GetMainFrame()->WatchDocuments(pMergeDoc);
}
for (auto pWebPageDiffFrame : GetAllWebPageDiffFrames())
pWebPageDiffFrame->RefreshOptions();
LRESULT CMainFrame::OnUser1(WPARAM wParam, LPARAM lParam)
{
- if (IMergeDoc *pMergeDoc = GetActiveIMergeDoc())
+ IMergeDoc* pMergeDoc = (wParam == 0) ? GetActiveIMergeDoc() : reinterpret_cast<IMergeDoc*>(wParam);
+ if (pMergeDoc)
pMergeDoc->CheckFileChanged();
return 0;
}
__super::OnActivateApp(bActive, hTask);
#endif
- if (IMergeDoc *pMergeDoc = GetActiveIMergeDoc())
- PostMessage(WM_USER+1);
+ if (GetOptionsMgr()->GetInt(OPT_AUTO_RELOAD_MODIFIED_FILES) == AUTO_RELOAD_MODIFIED_FILES_ONWINDOWACTIVATED)
+ {
+ if (IMergeDoc* pMergeDoc = GetActiveIMergeDoc())
+ PostMessage(WM_USER + 1, reinterpret_cast<WPARAM>(pMergeDoc));
+ }
}
BOOL CMainFrame::CreateToolbar()
return pMergeDoc;
}
+void CMainFrame::WatchDocuments(IMergeDoc* pMergeDoc)
+{
+ const int reloadType = GetOptionsMgr()->GetInt(OPT_AUTO_RELOAD_MODIFIED_FILES);
+ const int nFiles = pMergeDoc->GetFileCount();
+ for (int pane = 0; pane < nFiles; ++pane)
+ {
+ const String path = pMergeDoc->GetPath(pane);
+ if (!path.empty())
+ {
+ if (reloadType == AUTO_RELOAD_MODIFIED_FILES_IMMEDIATELY)
+ {
+ m_pDirWatcher->Add(reinterpret_cast<uintptr_t>(pMergeDoc) + pane,
+ false,
+ pMergeDoc->GetPath(pane),
+ [this, pMergeDoc](const String& path, DirWatcher::ACTION action)
+ {
+ PostMessage(WM_USER + 1, reinterpret_cast<WPARAM>(pMergeDoc));
+ });
+ }
+ else
+ {
+ m_pDirWatcher->Remove(reinterpret_cast<uintptr_t>(pMergeDoc) + pane);
+ }
+ }
+ }
+}
+
+void CMainFrame::UnwatchDocuments(IMergeDoc* pMergeDoc)
+{
+ const int nFiles = pMergeDoc->GetFileCount();
+ for (int pane = 0; pane < nFiles; ++pane)
+ m_pDirWatcher->Remove(reinterpret_cast<uintptr_t>(pMergeDoc) + pane);
+}
+
void CMainFrame::UpdateDocTitle()
{
CDocManager* pDocManager = AfxGetApp()->m_pDocManager;
class CMainFrame;
class CImgMergeFrame;
class CWebPageDiffFrame;
+class DirWatcher;
typedef std::shared_ptr<TempFile> TempFilePtr;
DropHandler *GetDropHandler() const { return m_pDropHandler; }
const CTypedPtrArray<CPtrArray, CMDIChildWnd*>* GetChildArray() const { return &m_arrChild; }
IMergeDoc* GetActiveIMergeDoc();
+ DirWatcher* GetDirWatcher() { return m_pDirWatcher.get(); }
+ void WatchDocuments(IMergeDoc* pMergeDoc);
+ void UnwatchDocuments(IMergeDoc* pMergeDoc);
// Overrides
virtual void GetMessageString(UINT nID, CString& rMessage) const;
MENU_FOLDERCMP = 0x000004,
MENU_ALL = MENU_MAINFRM | MENU_FILECMP | MENU_FOLDERCMP
};
+ enum
+ {
+ AUTO_RELOAD_MODIFIED_FILES_DISABLED,
+ AUTO_RELOAD_MODIFIED_FILES_ONWINDOWACTIVATED,
+ AUTO_RELOAD_MODIFIED_FILES_IMMEDIATELY
+ };
/**
* A structure attaching a menu item, icon and menu types to apply to.
std::unique_ptr<BCMenu> m_pWebPageMenu;
std::vector<TempFilePtr> m_tempFiles; /**< List of possibly needed temp files. */
DropHandler *m_pDropHandler;
+ std::unique_ptr<DirWatcher> m_pDirWatcher;
// Generated message map functions
protected:
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,119,270,10\r
CONTROL "Close ""Select Files or Folders"" Dialog on clicking Compare button",IDC_CLOSE_WITH_OK,\r
"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,7,131,270,10\r
- LTEXT "Op&en-dialog Auto-Completion:",IDC_STATIC,7,145,270,10\r
- COMBOBOX IDC_AUTO_COMPLETE_SOURCE,7,159,270,41,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- LTEXT "Language:",IDC_STATIC,7,175,270,10\r
- COMBOBOX IDC_LANGUAGE_LIST,7,187,270,41,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
+ LTEXT "Op&en-dialog Auto-Completion:",IDC_STATIC,7,141,270,10\r
+ COMBOBOX IDC_AUTO_COMPLETE_SOURCE,7,152,270,41,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
+ LTEXT "Auto-&reload modified files:",IDC_STATIC,7,167,270,10\r
+ COMBOBOX IDC_AUTO_RELOAD_MODIFIED_FILES,7,178,270,10,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
+ LTEXT "Language:",IDC_STATIC,7,193,270,10\r
+ COMBOBOX IDC_LANGUAGE_LIST,7,204,270,41,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
END\r
\r
IDD_EDIT_FIND DIALOGEX 30, 73, 324, 96\r
0, 0, 100, 0,\r
0, 0, 100, 0,\r
0, 0, 100, 0,\r
+ 0, 0, 100, 0,\r
100, 0, 0, 0\r
END\r
\r
\r
STRINGTABLE\r
BEGIN\r
+ IDS_AUTO_RELOAD_MODIFIED_FILES_STR1 "Only on window activated"\r
+ IDS_AUTO_RELOAD_MODIFIED_FILES_STR2 "Immediately"\r
+END\r
+\r
+STRINGTABLE\r
+BEGIN\r
IDS_PLUGIN_ALL "Al&l"\r
IDS_PLUGIN_PROCESS_TYPE1 "Prettification"\r
IDS_PLUGIN_PROCESS_TYPE2 "Content Extraction"\r
</ClCompile>\r
<ClCompile Include="DirAdditionalPropertiesDlg.cpp" />\r
<ClCompile Include="DirSelectFilesDlg.cpp" />\r
+ <ClCompile Include="DirWatcher.cpp">\r
+ <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>\r
+ <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName)2.pch</PrecompiledHeaderOutputFile>\r
+ </ClCompile>\r
<ClCompile Include="InternalPlugins.cpp">\r
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>\r
<PrecompiledHeaderOutputFile>$(IntDir)$(TargetName)2.pch</PrecompiledHeaderOutputFile>\r
<ClInclude Include="Common\Bitmap.h" />\r
<ClInclude Include="charsets.h" />\r
<ClInclude Include="DirAdditionalPropertiesDlg.h" />\r
+ <ClInclude Include="DirWatcher.h" />\r
<ClInclude Include="DirItemIterator.h" />\r
<ClInclude Include="DirSelectFilesDlg.h" />\r
<ClInclude Include="HashCalc.h" />\r
<ClCompile Include="WebPageDiffBar.cpp">\r
<Filter>MFCGui\MDIChild\WebPageCompare\Source Files</Filter>\r
</ClCompile>\r
+ <ClCompile Include="DirWatcher.cpp">\r
+ <Filter>Source Files</Filter>\r
+ </ClCompile>\r
</ItemGroup>\r
<ItemGroup>\r
<ClInclude Include="charsets.h">\r
<ClInclude Include="WebPageDiffBar.h">\r
<Filter>MFCGui\MDIChild\WebPageCompare\Header Files</Filter>\r
</ClInclude>\r
+ <ClInclude Include="DirWatcher.h">\r
+ <Filter>Header Files</Filter>\r
+ </ClInclude>\r
</ItemGroup>\r
<ItemGroup>\r
<None Include="res\binarydiff.ico">\r
*/
CMergeDoc::~CMergeDoc()
{
+ GetMainFrame()->UnwatchDocuments(this);
+
if (m_pDirDoc != nullptr)
{
m_pDirDoc->MergeDocClosing(this);
if (m_pView[0][0] != nullptr)
m_pView[0][0]->RepaintLocationPane();
+ GetMainFrame()->WatchDocuments(this);
+
return true;
}
inline const String OPT_SPLIT_HORIZONTALLY {_T("Settings/SplitHorizontally"s)};
inline const String OPT_FILE_SIZE_THRESHOLD {_T("Settings/OPT_FILE_SIZE_THRESHOLD"s)};
+inline const String OPT_AUTO_RELOAD_MODIFIED_FILES {_T("Settings/AutoReloadModifiedFiles"s)};
+
// Color options
// The difference color
inline const String OPT_CLR_DIFF {_T("Settings/DifferenceColor"s)};
pOptions->InitOption(OPT_SPLIT_HORIZONTALLY, false);
pOptions->InitOption(OPT_RENDERING_MODE, -1, 0, 6);
pOptions->InitOption(OPT_FILE_SIZE_THRESHOLD, 64*1024*1024);
+ pOptions->InitOption(OPT_AUTO_RELOAD_MODIFIED_FILES, 1);
pOptions->InitOption(OPT_WORDDIFF_HIGHLIGHT, true);
pOptions->InitOption(OPT_BREAK_SEPARATORS, _T(".,:;?[](){}<=>`'!\"#$%&^~\\|@+-*/"));
, m_bPreserveFiletime(false)
, m_bShowSelectFolderOnStartup(false)
, m_bCloseWithOK(true)
+ , m_nFileReloadMode(0)
{
}
pWnd->SetCurSel(m_nSingleInstance);
+ pWnd = (CComboBox*)GetDlgItem(IDC_AUTO_RELOAD_MODIFIED_FILES);
+ ASSERT(pWnd != nullptr);
+
+ pWnd->AddString(_("Disabled").c_str());
+ pWnd->AddString(_("Only on window activated").c_str());
+ pWnd->AddString(_("Immediately").c_str());
+
+ pWnd->SetCurSel(m_nFileReloadMode);
+
m_ctlLangList.SetDroppedWidth(600);
m_ctlLangList.EnableWindow(FALSE);
m_asyncLanguagesLoader = Concurrent::CreateTask([hwnd = m_hWnd] {
DDX_Check(pDX, IDC_PRESERVE_FILETIME, m_bPreserveFiletime);
DDX_Check(pDX, IDC_STARTUP_FOLDER_SELECT, m_bShowSelectFolderOnStartup);
DDX_Check(pDX, IDC_CLOSE_WITH_OK, m_bCloseWithOK);
+ DDX_CBIndex(pDX, IDC_AUTO_RELOAD_MODIFIED_FILES, m_nFileReloadMode);
DDX_Control(pDX, IDC_LANGUAGE_LIST, m_ctlLangList);
//}}AFX_DATA_MAP
}
m_bPreserveFiletime = GetOptionsMgr()->GetBool(OPT_PRESERVE_FILETIMES);
m_bShowSelectFolderOnStartup = GetOptionsMgr()->GetBool(OPT_SHOW_SELECT_FILES_AT_STARTUP);
m_bCloseWithOK = GetOptionsMgr()->GetBool(OPT_CLOSE_WITH_OK);
+ m_nFileReloadMode = GetOptionsMgr()->GetInt(OPT_AUTO_RELOAD_MODIFIED_FILES);
}
/**
GetOptionsMgr()->SaveOption(OPT_PRESERVE_FILETIMES, m_bPreserveFiletime);
GetOptionsMgr()->SaveOption(OPT_SHOW_SELECT_FILES_AT_STARTUP, m_bShowSelectFolderOnStartup);
GetOptionsMgr()->SaveOption(OPT_CLOSE_WITH_OK, m_bCloseWithOK);
+ GetOptionsMgr()->SaveOption(OPT_AUTO_RELOAD_MODIFIED_FILES, m_nFileReloadMode);
int index = m_ctlLangList.GetCurSel();
if (index >= 0)
{
bool m_bScroll;
bool m_bScrollToFirstInlineDiff;
int m_nSingleInstance;
+ int m_nFileReloadMode;
bool m_bVerifyPaths;
int m_nCloseWindowWithEsc;
bool m_bAskMultiWindowClose;
CWebPageDiffFrame::~CWebPageDiffFrame()
{
+ GetMainFrame()->UnwatchDocuments(this);
+
if (m_pDirDoc != nullptr)
{
m_pDirDoc->MergeDocClosing(this);
GetParent()->ModifyStyleEx(WS_EX_CLIENTEDGE, 0, SWP_DRAWFRAME);
+ GetMainFrame()->WatchDocuments(this);
+
return true;
}
#define IDC_PATH0_READONLY 1606\r
#define IDC_PATH1_READONLY 1607\r
#define IDC_PATH2_READONLY 1608\r
+#define IDC_AUTO_RELOAD_MODIFIED_FILES 1609\r
#define IDC_MARKER0_COLOR_LABEL 1611\r
#define IDC_MARKER1_COLOR_LABEL 1612\r
#define IDC_MARKER2_COLOR_LABEL 1613\r
#define IDS_IGNSUB_STR5 44178\r
#define IDS_SINGLEINSTANCE_STR1 44179\r
#define IDS_SINGLEINSTANCE_STR2 44180\r
+#define IDS_AUTO_RELOAD_MODIFIED_FILES_STR1 44181\r
+#define IDS_AUTO_RELOAD_MODIFIED_FILES_STR2 44182\r
#define IDS_PLUGIN_ALL 44200\r
#define IDS_PLUGIN_PROCESS_TYPE1 44201\r
#define IDS_PLUGIN_PROCESS_TYPE2 44202\r
--- /dev/null
+#include "pch.h"
+#include <gtest/gtest.h>
+#include <vector>
+#include "UnicodeString.h"
+#include "DirWatcher.h"
+
+using std::vector;
+
+// TODO:
+// - add helper functions for checking the changes in registry
+
+namespace
+{
+ // The fixture for testing command line parsing.
+ class DirWatcherTest : public testing::Test
+ {
+ protected:
+ // You can remove any or all of the following functions if its body
+ // is empty.
+
+ DirWatcherTest()
+ {
+ // You can do set-up work for each test here.
+ }
+
+ virtual ~DirWatcherTest()
+ {
+ // You can do clean-up work that doesn't throw exceptions here.
+ }
+
+ // If the constructor and destructor are not enough for setting up
+ // and cleaning up each test, you can define the following methods:
+
+ virtual void SetUp()
+ {
+ // Code here will be called immediately after the constructor (right
+ // before each test).
+ }
+
+ virtual void TearDown()
+ {
+ // Code here will be called immediately after each test (right
+ // before the destructor).
+ }
+
+ // Objects declared here can be used by all tests in the test case for Foo.
+ };
+
+ TEST_F(DirWatcherTest, Add)
+ {
+ DirWatcher watcher;
+ int counter = 0;
+ bool completed = false;
+ auto func = [&](const String& path, DirWatcher::ACTION action) {
+ wprintf(L"path=%s action=%d\n", path.c_str(), action);
+ counter++;
+ if (counter >= 10)
+ completed = true;
+ };
+ EXPECT_TRUE(watcher.Add(1, true, L"..\\TestData\\DirWatcher\\", func));
+ EXPECT_TRUE(watcher.Add(2, true, L"..\\TestData\\DirWatcher\\", func));
+ EXPECT_TRUE(watcher.Add(3, false, L"..\\TestData\\DirWatcher\\test.txt", func));
+ EXPECT_TRUE(watcher.Add(4, false, L"..\\TestData\\DirWatcher\\test2.txt", func));
+
+ SetFileAttributes(L"..\\TestData\\DirWatcher\\test2.txt", FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_READONLY);
+ SetFileAttributes(L"..\\TestData\\DirWatcher\\test2.txt", FILE_ATTRIBUTE_NORMAL);
+ SetFileAttributes(L"..\\TestData\\DirWatcher\\Subdir1\\test.txt", FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_READONLY);
+ SetFileAttributes(L"..\\TestData\\DirWatcher\\Subdir1\\test.txt", FILE_ATTRIBUTE_NORMAL);
+
+ while (!completed)
+ Sleep(1);
+ }
+}
\ No newline at end of file
{ OPT_CUSTOM_TEMP_PATH, varprop::VT_STRING, {}, {L"", L"c:\\tmp"}},
{ OPT_SPLIT_HORIZONTALLY, varprop::VT_BOOL, {}, {}},
{ OPT_FILE_SIZE_THRESHOLD, varprop::VT_INT, {0xffff, 0x7fffffff}, {}},
+ { OPT_AUTO_RELOAD_MODIFIED_FILES, varprop::VT_INT, {0, 2}, {}},
//
{ OPT_DIRCLR_USE_COLORS, varprop::VT_BOOL, {}, {}},
{ OPT_COLOR_SCHEME, varprop::VT_STRING, {}, {L"", L"Default", L"Modern", L"Solarized Dark", L"Solarized Light"}},
<PrecompiledHeaderOutputFile>$(IntDir)$(TargetName)2.pch</PrecompiledHeaderOutputFile>
</ClCompile>
<ClCompile Include="..\..\..\Src\DirTravel.cpp" />
+ <ClCompile Include="..\..\..\Src\DirWatcher.cpp">
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
+ <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName)2.pch</PrecompiledHeaderOutputFile>
+ </ClCompile>
<ClCompile Include="..\..\..\Src\Environment.cpp">
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>$(IntDir)$(TargetName)2.pch</PrecompiledHeaderOutputFile>
</ClCompile>
+ <ClCompile Include="..\DirWatcher\DirWatcher_test.cpp" />
<ClCompile Include="..\PropertySystem\PropertySystem_test.cpp" />
<ClCompile Include="..\ShellFileOperations\ShellFileOperations_test.cpp">
<PrecompiledHeader>Use</PrecompiledHeader>
<ClInclude Include="..\..\..\Src\DiffItemList.h" />
<ClInclude Include="..\..\..\Src\DirItem.h" />
<ClInclude Include="..\..\..\Src\DirTravel.h" />
+ <ClInclude Include="..\..\..\Src\DirWatcher.h" />
<ClInclude Include="..\..\..\Src\Environment.h" />
<ClInclude Include="..\..\..\Src\Common\ExConverter.h" />
<ClInclude Include="..\..\..\Src\FileFilter.h" />
<ClCompile Include="..\..\..\Src\diffutils\src\context.c">
<Filter>Source Files</Filter>
</ClCompile>
+ <ClCompile Include="..\DirWatcher\DirWatcher_test.cpp">
+ <Filter>Tests</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\Src\DirWatcher.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\Src\CompareEngines\ByteComparator.h">
<ClInclude Include="..\..\..\Src\PropertySystem.h">
<Filter>Header Files</Filter>
</ClInclude>
+ <ClInclude Include="..\..\..\Src\DirWatcher.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
</ItemGroup>
</Project>
\ No newline at end of file
# Translations Status
-Status from **2022-12-21**:
+Status from **2022-12-25**:
## WinMerge
| Language | Total | Translated | Fuzzy | Untranslated | Complete | Last Update |
|:---------------------|------:|-----------:|------:|-------------:|---------:|:-----------:|
-| Arabic | 1237 | 897 | 0 | 340 | 72 % | 2019-12-30 |
-| Basque | 1237 | 639 | 0 | 598 | 51 % | 2013-02-03 |
-| Brazilian | 1237 | 1237 | 0 | 0 | 100 % | 2022-11-18 |
-| Bulgarian | 1237 | 1021 | 0 | 216 | 82 % | 2021-06-28 |
-| Catalan | 1237 | 1187 | 0 | 50 | 95 % | |
-| ChineseSimplified | 1237 | 1235 | 0 | 2 | 99 % | |
-| ChineseTraditional | 1237 | 1125 | 0 | 112 | 90 % | 2022-02-19 |
-| Corsican | 1237 | 1236 | 0 | 1 | 99 % | 2022-10-17 |
-| Croatian | 1237 | 631 | 1 | 605 | 51 % | 2009-02-13 |
-| Czech | 1237 | 606 | 0 | 631 | 48 % | |
-| Danish | 1237 | 640 | 0 | 597 | 51 % | 2013-01-13 |
-| Dutch | 1237 | 1197 | 0 | 40 | 96 % | 2018-09-06 |
-| English | 1237 | 1237 | 0 | 0 | 100 % | 2022-12-18 |
-| Finnish | 1237 | 1198 | 0 | 39 | 96 % | |
-| French | 1237 | 1236 | 0 | 1 | 99 % | 2022-10-26 |
-| Galician | 1237 | 1236 | 0 | 1 | 99 % | 2022-11-20 |
-| German | 1237 | 1237 | 0 | 0 | 100 % | 2022-12-18 |
-| Greek | 1237 | 605 | 0 | 632 | 48 % | |
-| Hungarian | 1237 | 1236 | 0 | 1 | 99 % | 2021-03-15 |
-| Italian | 1237 | 1106 | 0 | 131 | 89 % | 2022-06-01 |
-| Japanese | 1237 | 1237 | 0 | 0 | 100 % | 2022-09-14 |
-| Korean | 1237 | 1197 | 0 | 40 | 96 % | 2022-02-02 |
-| Lithuanian | 1237 | 1193 | 0 | 44 | 96 % | 2022-10-17 |
-| Norwegian | 1237 | 731 | 0 | 506 | 59 % | |
-| Persian | 1237 | 642 | 0 | 595 | 51 % | 2013-08-15 |
-| Polish | 1237 | 1216 | 0 | 21 | 98 % | 2022-11-10 |
-| Portuguese | 1237 | 1236 | 0 | 1 | 99 % | 2022-10-17 |
-| Romanian | 1237 | 561 | 44 | 632 | 48 % | |
-| Russian | 1237 | 1235 | 0 | 2 | 99 % | 2022-07-27 |
-| Serbian | 1237 | 633 | 0 | 604 | 51 % | |
-| Sinhala | 1237 | 564 | 58 | 615 | 50 % | 2010-12-12 |
-| Slovak | 1237 | 1197 | 0 | 40 | 96 % | 2022-02-17 |
-| Slovenian | 1237 | 1237 | 0 | 0 | 100 % | 2022-12-20 |
-| Spanish | 1237 | 1174 | 1 | 62 | 94 % | 2022-07-30 |
-| Swedish | 1237 | 1236 | 0 | 1 | 99 % | 2022-12-02 |
-| Turkish | 1237 | 1236 | 0 | 1 | 99 % | 2022-11-10 |
-| Ukrainian | 1237 | 637 | 0 | 600 | 51 % | 2009-06-13 |
+| Arabic | 1240 | 897 | 0 | 343 | 72 % | 2019-12-30 |
+| Basque | 1240 | 639 | 0 | 601 | 51 % | 2013-02-03 |
+| Brazilian | 1240 | 1237 | 0 | 3 | 99 % | 2022-11-18 |
+| Bulgarian | 1240 | 1021 | 0 | 219 | 82 % | 2021-06-28 |
+| Catalan | 1240 | 1187 | 0 | 53 | 95 % | |
+| ChineseSimplified | 1240 | 1235 | 0 | 5 | 99 % | |
+| ChineseTraditional | 1240 | 1125 | 0 | 115 | 90 % | 2022-02-19 |
+| Corsican | 1240 | 1237 | 0 | 3 | 99 % | 2022-12-24 |
+| Croatian | 1240 | 631 | 1 | 608 | 50 % | 2009-02-13 |
+| Czech | 1240 | 606 | 0 | 634 | 48 % | |
+| Danish | 1240 | 640 | 0 | 600 | 51 % | 2013-01-13 |
+| Dutch | 1240 | 1197 | 0 | 43 | 96 % | 2018-09-06 |
+| English | 1240 | 1240 | 0 | 0 | 100 % | 2022-12-25 |
+| Finnish | 1240 | 1198 | 0 | 42 | 96 % | |
+| French | 1240 | 1236 | 0 | 4 | 99 % | 2022-10-26 |
+| Galician | 1240 | 1236 | 0 | 4 | 99 % | 2022-11-20 |
+| German | 1240 | 1237 | 0 | 3 | 99 % | 2022-12-18 |
+| Greek | 1240 | 605 | 0 | 635 | 48 % | |
+| Hungarian | 1240 | 1236 | 0 | 4 | 99 % | 2021-03-15 |
+| Italian | 1240 | 1106 | 0 | 134 | 89 % | 2022-06-01 |
+| Japanese | 1240 | 1240 | 0 | 0 | 100 % | 2022-09-14 |
+| Korean | 1240 | 1197 | 0 | 43 | 96 % | 2022-02-02 |
+| Lithuanian | 1240 | 1194 | 0 | 46 | 96 % | 2022-12-20 |
+| Norwegian | 1240 | 731 | 0 | 509 | 58 % | |
+| Persian | 1240 | 642 | 0 | 598 | 51 % | 2013-08-15 |
+| Polish | 1240 | 1216 | 0 | 24 | 98 % | 2022-11-10 |
+| Portuguese | 1240 | 1236 | 0 | 4 | 99 % | 2022-10-17 |
+| Romanian | 1240 | 561 | 44 | 635 | 48 % | |
+| Russian | 1240 | 1235 | 0 | 5 | 99 % | 2022-07-27 |
+| Serbian | 1240 | 633 | 0 | 607 | 51 % | |
+| Sinhala | 1240 | 564 | 58 | 618 | 50 % | 2010-12-12 |
+| Slovak | 1240 | 1197 | 0 | 43 | 96 % | 2022-02-17 |
+| Slovenian | 1240 | 1237 | 0 | 3 | 99 % | 2022-12-20 |
+| Spanish | 1240 | 1174 | 1 | 65 | 94 % | 2022-07-30 |
+| Swedish | 1240 | 1236 | 0 | 4 | 99 % | 2022-12-02 |
+| Turkish | 1240 | 1236 | 0 | 4 | 99 % | 2022-11-10 |
+| Ukrainian | 1240 | 637 | 0 | 603 | 51 % | 2009-06-13 |
## ShellExtension
msgid "Op&en-dialog Auto-Completion:"
msgstr "فتح نافذة الإكمال التلقائي:"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
msgid "Language:"
msgstr "اللغة:"
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr ""
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr ""
msgid "Op&en-dialog Auto-Completion:"
msgstr "Ireki-elkarrizketa Berez-&Osaketa:"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
#, c-format
msgid "Language:"
msgstr ""
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr ""
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr ""
msgid "Op&en-dialog Auto-Completion:"
msgstr "Au&to-Conclusão do Diálogo-Abrir:"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
msgid "Language:"
msgstr "Idioma:"
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr "Permitir só uma instância a ser executada e esperar a instância encerrar"
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr "Tu&do"
msgid "Op&en-dialog Auto-Completion:"
msgstr "Автоматично &довършване в „Избиране на файлове или папки“:"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
msgid "Language:"
msgstr "Език:"
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr ""
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr ""
msgid "Op&en-dialog Auto-Completion:"
msgstr "Autocompletar al diàleg d'obrir:"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
#, c-format
msgid "Language:"
msgstr "Idioma:"
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr "Permet d'executar només una instància i espera que la instància acabi"
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr "Tot"
msgid "Op&en-dialog Auto-Completion:"
msgstr "“打开”对话框的自动完成(&E):"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
msgid "Language:"
msgstr "语言:"
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr "只允许运行一个实例并等待该实例结束"
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr "全部(&L)"
msgid "Op&en-dialog Auto-Completion:"
msgstr "「開啟」對話方塊之自動完成 (&E):"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
#, c-format
msgid "Language:"
msgstr "語言:"
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr ""
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr "全部 (&L)"
msgid "Op&en-dialog Auto-Completion:"
msgstr "&Empiimentu autumaticu di a finestra d’apertura :"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
msgid "Language:"
msgstr "Lingua :"
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr "Permette l’esecuzione d’una instanza unica di u prugramma è aspettà ch’ella si compii"
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr "T&utti"
msgid "Op&en-dialog Auto-Completion:"
msgstr "Otvori dijalog &samodovršenja"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
#, c-format
msgid "Language:"
msgstr ""
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr ""
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr ""
msgid "Op&en-dialog Auto-Completion:"
msgstr "Automatické &dokončování:"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
#, c-format
msgid "Language:"
msgstr ""
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr ""
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr ""
msgid "Op&en-dialog Auto-Completion:"
msgstr "Å&ben-dialog Auto-fuldførelse:"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
#, c-format
msgid "Language:"
msgstr ""
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr ""
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr ""
msgid "Op&en-dialog Auto-Completion:"
msgstr "Auto-aanvullen openen-venster:"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
msgid "Language:"
msgstr "Language:"
"Slechts één draaiende instantie toestaan en wachten totdat de instantie "
"beëindigd is"
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr "Alles"
msgstr ""
"Project-Id-Version: WinMerge\n"
"Report-Msgid-Bugs-To: https://bugs.winmerge.org/\n"
-"POT-Creation-Date: 2022-12-18 17:41+0000\n"
+"POT-Creation-Date: 2022-12-25 15:41+0000\n"
"PO-Revision-Date: \n"
"Last-Translator: \n"
"Language-Team: English <winmerge-translate@lists.sourceforge.net>\n"
msgid "Op&en-dialog Auto-Completion:"
msgstr ""
+msgid "Auto-&reload modified files:"
+msgstr ""
+
msgid "Language:"
msgstr ""
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr ""
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr ""
msgid "Op&en-dialog Auto-Completion:"
msgstr ""
+msgid "Auto-&reload modified files:"
+msgstr ""
+
msgid "Language:"
msgstr "Kieli:"
"Salli vain yhden instanssin suorittaminen ja odota, että instanssi "
"lopetetaan"
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr "K&aikki"
msgid "Op&en-dialog Auto-Completion:"
msgstr "Remplissage de la boîte de dialogue d'ouverture :"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
#, c-format
msgid "Language:"
msgstr "Langage :"
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr "Autoriser une seule instance à s'exécuter et attendre que l'instance se termine"
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr "Al&l"
msgid "Op&en-dialog Auto-Completion:"
msgstr "A&utocompletar diálogo de apertura:"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
#, c-format
msgid "Language:"
msgstr "Idioma:"
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr "Permitir só a execución dunha instancia e esperar a que a instancia remate"
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr "Todo&s"
msgid "Op&en-dialog Auto-Completion:"
msgstr "Öffnen-Dialog Auto&vervollständigung:"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
#, c-format
msgid "Language:"
msgstr "&Sprache:"
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr "Nur eine Instanz zulassen und warten, bis die Instanz beendet ist"
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr "A&lle"
msgid "Op&en-dialog Auto-Completion:"
msgstr "Αυτόματη συμπλήρωση διαλόγου αν&οίγματος"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
#, c-format
msgid "Language:"
msgstr ""
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr ""
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr ""
msgid "Op&en-dialog Auto-Completion:"
msgstr "Automatikus kiegészítés fájl megnyitásánál:"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
#, c-format
msgid "Language:"
msgstr "Nyelv:"
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr "Csak egy példány futhat és megvárja, amíg a példány leáll"
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr "Összes"
msgid "Op&en-dialog Auto-Completion:"
msgstr "Com&pletamento automatico selezione file:"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
msgid "Language:"
msgstr "Lingua:"
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr "Permetti l'esecuzione di un'unica istanza del programma e attendi che termini"
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr ""
msgid "Op&en-dialog Auto-Completion:"
msgstr "[開く] ダイアログのオートコンプリート(&E):"
+msgid "Auto-&reload modified files:"
+msgstr "変更されたファイルの自動再読み込み(&R):"
+
msgid "Language:"
msgstr "言語:"
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr "1 つのみインスタンスを起動し、既起動インスタンスの終了を待つ"
+msgid "Only on window activated"
+msgstr "ウインドウがアクティブになった時のみ"
+
+msgid "Immediately"
+msgstr "即時"
+
msgid "Al&l"
msgstr "すべて(&L)"
msgid "Op&en-dialog Auto-Completion:"
msgstr "열기 대화 상자 자동 완성(&E):"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
#, c-format
msgid "Language:"
msgstr "언어:"
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr "중복 실행 금지 및 기존 실행 종료 대기"
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr "전체(&L)"
msgid "Op&en-dialog Auto-Completion:"
msgstr "Lango „Atv&erti“ automatinis užpildymas:"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
msgid "Language:"
msgstr "Kalba:"
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr "Leisti vykdyti tik vieną programos egzempliorių ir sulaukti, kol jo vykdymas baigsis"
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr "Visi"
msgid "Op&en-dialog Auto-Completion:"
msgstr "Auto-fullførelse for Å&pne-dialog:"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
msgid "Language:"
msgstr ""
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr ""
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr ""
msgid "Op&en-dialog Auto-Completion:"
msgstr "&p بازکردن پنجره محاوره اتمام خودکار "
+msgid "Auto-&reload modified files:"
+msgstr ""
+
#, c-format
msgid "Language:"
msgstr ""
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr ""
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr ""
msgid "Op&en-dialog Auto-Completion:"
msgstr "Otwórz okno automatycznego uzu&pełniania:"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
msgid "Language:"
msgstr "Język:"
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr "Zezwól na uruchomienie tylko jednej instancji i poczekaj, aż zakończy pracę"
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr "Wszystkie"
msgid "Op&en-dialog Auto-Completion:"
msgstr "Abrir janela de auto-conclusão:"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
msgid "Language:"
msgstr "Idioma:"
msgstr ""
"Permitir apenas executar uma instância e esperar que a instância termine"
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr "Tu&do"
msgid "Op&en-dialog Auto-Completion:"
msgstr "Auto-completare în dialogul de deschidere:"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
#, c-format
msgid "Language:"
msgstr ""
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr ""
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr ""
msgid "Op&en-dialog Auto-Completion:"
msgstr "Автозавершение в диалоге открытия:"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
msgid "Language:"
msgstr "Язык:"
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr "Разрешить запуск только одной копии и дожидаться ее завершения"
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr "Все"
msgid "Op&en-dialog Auto-Completion:"
msgstr "Отвори дијалог самодовршења:"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
#, c-format
msgid "Language:"
msgstr ""
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr ""
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr ""
msgid "Op&en-dialog Auto-Completion:"
msgstr "Op&en-dialog Auto-Completion:"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
#, c-format
msgid "Language:"
msgstr ""
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr ""
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr ""
msgid "Op&en-dialog Auto-Completion:"
msgstr "Automatické dopĺňanie v dialógu &Otvoriť:"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
msgid "Language:"
msgstr "Jazyk:"
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr "Povolí spustenie iba jednej inštancie a počká, kým sa inštancia ukončí"
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr "Al&l"
msgid "Op&en-dialog Auto-Completion:"
msgstr "Odpri pogovorno okno &Samodejno dokončanje:"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
msgid "Language:"
msgstr "Jezik:"
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr "Dovoli zagon le enega primerka, in počakaj, da se primerek dokonča"
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr "V&se"
msgid "Op&en-dialog Auto-Completion:"
msgstr "A&uto-completar en diálogos de apertura:"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
msgid "Language:"
msgstr "Idioma:"
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr "Permitir únicamente una instancia en ejecución y esperar a que termine ejecución"
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr ""
msgid "Op&en-dialog Auto-Completion:"
msgstr "Automatisk komplettering för Öppna-dialog:"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
msgid "Language:"
msgstr "Språk:"
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr "Tillåt endast att en instans körs och vänta på den att avsluta"
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr "AI&I"
msgid "Op&en-dialog Auto-Completion:"
msgstr "Aç &penceresi otomatik olarak doldurulsun:"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
msgid "Language:"
msgstr "Dil:"
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr "Yalnız bir kopyanın çalışsın ve kopyanın sonlandırılması beklensin"
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr "&Tümü"
msgid "Op&en-dialog Auto-Completion:"
msgstr "Діалог Автоматичного доповнення:"
+msgid "Auto-&reload modified files:"
+msgstr ""
+
#, c-format
msgid "Language:"
msgstr ""
msgid "Allow only one instance to run and wait for the instance to terminate"
msgstr ""
+msgid "Only on window activated"
+msgstr ""
+
+msgid "Immediately"
+msgstr ""
+
msgid "Al&l"
msgstr ""