OSDN Git Service

Add TortoiseUDiff Code
authorFrank Li <lznuaa@gmail.com>
Sat, 22 Nov 2008 07:59:38 +0000 (15:59 +0800)
committerFrank Li <lznuaa@gmail.com>
Sat, 22 Nov 2008 07:59:38 +0000 (15:59 +0800)
17 files changed:
TortoiseProc/Commands/ShowCompareCommand.cpp
TortoiseProc/LogDlg.cpp
TortoiseProc/TortoiseProc.vcproj
TortoiseUDiff/FindBar.cpp [new file with mode: 0644]
TortoiseUDiff/FindBar.h [new file with mode: 0644]
TortoiseUDiff/MainWindow.cpp [new file with mode: 0644]
TortoiseUDiff/MainWindow.h [new file with mode: 0644]
TortoiseUDiff/Readme.txt [new file with mode: 0644]
TortoiseUDiff/TortoiseUDiff.cpp [new file with mode: 0644]
TortoiseUDiff/TortoiseUDiff.h [new file with mode: 0644]
TortoiseUDiff/TortoiseUDiff.ico [new file with mode: 0644]
TortoiseUDiff/TortoiseUDiff.rc [new file with mode: 0644]
TortoiseUDiff/TortoiseUDiff.rc2 [new file with mode: 0644]
TortoiseUDiff/TortoiseUDiff.vcproj [new file with mode: 0644]
TortoiseUDiff/resource.h [new file with mode: 0644]
TortoiseUDiff/stdafx.cpp [new file with mode: 0644]
TortoiseUDiff/stdafx.h [new file with mode: 0644]

index 1c1e913..f850ce4 100644 (file)
 //\r
 #include "StdAfx.h"\r
 #include "ShowCompareCommand.h"\r
-#include "SVNDiff.h"\r
+//#include "SVNDiff.h"\r
 \r
 \r
 bool ShowCompareCommand::Execute()\r
 {\r
+#if 0\r
        bool            bRet = false;\r
        SVNDiff         diff(NULL, hwndExplorer);\r
 \r
@@ -53,4 +54,6 @@ bool ShowCompareCommand::Execute()
                bRet = diff.ShowCompare(url1, rev1, url2, rev2, pegrev, ignoreancestry, blame);\r
 \r
        return bRet;\r
+#endif \r
+       return 0;\r
 }\r
index b5678c3..553d5a9 100644 (file)
@@ -3789,7 +3789,7 @@ void CLogDlg::UpdateLogInfoLabel()
 \r
 void CLogDlg::ShowContextMenuForRevisions(CWnd* /*pWnd*/, CPoint point)\r
 {\r
-#if 0\r
+\r
        int selIndex = m_LogList.GetSelectionMark();\r
        if (selIndex < 0)\r
                return; // nothing selected, nothing to do with a context menu\r
@@ -3812,12 +3812,15 @@ void CLogDlg::ShowContextMenuForRevisions(CWnd* /*pWnd*/, CPoint point)
        m_bCancelled = FALSE;\r
 \r
        // calculate some information the context menu commands can use\r
-       CString pathURL = GetURLFromPath(m_path);\r
+//     CString pathURL = GetURLFromPath(m_path);\r
+\r
        POSITION pos = m_LogList.GetFirstSelectedItemPosition();\r
        int indexNext = m_LogList.GetNextSelectedItem(pos);\r
        if (indexNext < 0)\r
                return;\r
-       PLOGENTRYDATA pSelLogEntry = reinterpret_cast<PLOGENTRYDATA>(m_arShownList.GetAt(indexNext));\r
+\r
+       GitRev* pSelLogEntry = reinterpret_cast<GitRev*>(m_arShownList.GetAt(indexNext));\r
+#if 0\r
        GitRev revSelected = pSelLogEntry->Rev;\r
        GitRev revPrevious = git_revnum_t(revSelected)-1;\r
        if ((pSelLogEntry->pArChangedPaths)&&(pSelLogEntry->pArChangedPaths->GetCount() <= 2))\r
@@ -3860,14 +3863,22 @@ void CLogDlg::ShowContextMenuForRevisions(CWnd* /*pWnd*/, CPoint point)
                }\r
        }\r
 \r
+#endif\r
 \r
-\r
+       int FirstSelect=-1, LastSelect=-1;\r
+       pos = m_LogList.GetFirstSelectedItemPosition();\r
+       FirstSelect = m_LogList.GetNextSelectedItem(pos);\r
+       while(pos)\r
+       {\r
+               LastSelect = m_LogList.GetNextSelectedItem(pos);\r
+       }\r
        //entry is selected, now show the popup menu\r
        CIconMenu popup;\r
        if (popup.CreatePopupMenu())\r
        {\r
                if (m_LogList.GetSelectedCount() == 1)\r
                {\r
+#if 0\r
                        if (!m_path.IsDirectory())\r
                        {\r
                                if (m_hasWC)\r
@@ -3885,6 +3896,7 @@ void CLogDlg::ShowContextMenuForRevisions(CWnd* /*pWnd*/, CPoint point)
                                popup.AppendMenu(MF_SEPARATOR, NULL);\r
                        }\r
                        else\r
+#endif \r
                        {\r
                                if (m_hasWC)\r
                                {\r
@@ -3902,30 +3914,31 @@ void CLogDlg::ShowContextMenuForRevisions(CWnd* /*pWnd*/, CPoint point)
                                popup.AppendMenuIcon(ID_BLAMEWITHPREVIOUS, IDS_LOG_POPUP_BLAMEWITHPREVIOUS, IDI_BLAME);\r
                                popup.AppendMenu(MF_SEPARATOR, NULL);\r
                        }\r
-                       if (!m_ProjectProperties.sWebViewerRev.IsEmpty())\r
-                       {\r
-                               popup.AppendMenuIcon(ID_VIEWREV, IDS_LOG_POPUP_VIEWREV);\r
-                       }\r
-                       if (!m_ProjectProperties.sWebViewerPathRev.IsEmpty())\r
-                       {\r
-                               popup.AppendMenuIcon(ID_VIEWPATHREV, IDS_LOG_POPUP_VIEWPATHREV);\r
-                       }\r
-                       if ((!m_ProjectProperties.sWebViewerPathRev.IsEmpty())||\r
-                               (!m_ProjectProperties.sWebViewerRev.IsEmpty()))\r
-                       {\r
-                               popup.AppendMenu(MF_SEPARATOR, NULL);\r
-                       }\r
 \r
-                       popup.AppendMenuIcon(ID_REPOBROWSE, IDS_LOG_BROWSEREPO, IDI_REPOBROWSE);\r
-                       popup.AppendMenuIcon(ID_COPY, IDS_LOG_POPUP_COPY);\r
-                       if (m_hasWC)\r
-                               popup.AppendMenuIcon(ID_UPDATE, IDS_LOG_POPUP_UPDATE, IDI_UPDATE);\r
+//                     if (!m_ProjectProperties.sWebViewerRev.IsEmpty())\r
+//                     {\r
+//                             popup.AppendMenuIcon(ID_VIEWREV, IDS_LOG_POPUP_VIEWREV);\r
+//                     }\r
+//                     if (!m_ProjectProperties.sWebViewerPathRev.IsEmpty())\r
+//                     {\r
+//                             popup.AppendMenuIcon(ID_VIEWPATHREV, IDS_LOG_POPUP_VIEWPATHREV);\r
+//                     }\r
+//                     if ((!m_ProjectProperties.sWebViewerPathRev.IsEmpty())||\r
+//                             (!m_ProjectProperties.sWebViewerRev.IsEmpty()))\r
+//                     {\r
+//                             popup.AppendMenu(MF_SEPARATOR, NULL);\r
+//                     }\r
+\r
+//                     popup.AppendMenuIcon(ID_REPOBROWSE, IDS_LOG_BROWSEREPO, IDI_REPOBROWSE);\r
+//                     popup.AppendMenuIcon(ID_COPY, IDS_LOG_POPUP_COPY);\r
+//                     if (m_hasWC)\r
+//                             popup.AppendMenuIcon(ID_UPDATE, IDS_LOG_POPUP_UPDATE, IDI_UPDATE);\r
                        if (m_hasWC)\r
                                popup.AppendMenuIcon(ID_REVERTTOREV, IDS_LOG_POPUP_REVERTTOREV, IDI_REVERT);\r
                        if (m_hasWC)\r
                                popup.AppendMenuIcon(ID_REVERTREV, IDS_LOG_POPUP_REVERTREV, IDI_REVERT);\r
-                       if (m_hasWC)\r
-                               popup.AppendMenuIcon(ID_MERGEREV, IDS_LOG_POPUP_MERGEREV, IDI_MERGE);\r
+//                     if (m_hasWC)\r
+//                             popup.AppendMenuIcon(ID_MERGEREV, IDS_LOG_POPUP_MERGEREV, IDI_MERGE);\r
                        popup.AppendMenuIcon(ID_CHECKOUT, IDS_MENUCHECKOUT, IDI_CHECKOUT);\r
                        popup.AppendMenuIcon(ID_EXPORT, IDS_MENUEXPORT, IDI_EXPORT);\r
                        popup.AppendMenu(MF_SEPARATOR, NULL);\r
@@ -3946,24 +3959,25 @@ void CLogDlg::ShowContextMenuForRevisions(CWnd* /*pWnd*/, CPoint point)
                        if (m_hasWC)\r
                        {\r
                                popup.AppendMenuIcon(ID_REVERTREV, IDS_LOG_POPUP_REVERTREVS, IDI_REVERT);\r
-                               if (m_hasWC)\r
-                                       popup.AppendMenuIcon(ID_MERGEREV, IDS_LOG_POPUP_MERGEREVS, IDI_MERGE);\r
+//                             if (m_hasWC)\r
+//                                     popup.AppendMenuIcon(ID_MERGEREV, IDS_LOG_POPUP_MERGEREVS, IDI_MERGE);\r
                                bAddSeparator = true;\r
                        }\r
                        if (bAddSeparator)\r
                                popup.AppendMenu(MF_SEPARATOR, NULL);\r
                }\r
-\r
-               if ((selEntries.size() > 0)&&(bAllFromTheSameAuthor))\r
-               {\r
-                       popup.AppendMenuIcon(ID_EDITAUTHOR, IDS_LOG_POPUP_EDITAUTHOR);\r
-               }\r
-               if (m_LogList.GetSelectedCount() == 1)\r
-               {\r
-                       popup.AppendMenuIcon(ID_EDITLOG, IDS_LOG_POPUP_EDITLOG);\r
-                       popup.AppendMenuIcon(ID_REVPROPS, IDS_REPOBROWSE_SHOWREVPROP, IDI_PROPERTIES); // "Show Revision Properties"\r
-                       popup.AppendMenu(MF_SEPARATOR, NULL);\r
-               }\r
+#if 0\r
+//             if ((selEntries.size() > 0)&&(bAllFromTheSameAuthor))\r
+//             {\r
+//                     popup.AppendMenuIcon(ID_EDITAUTHOR, IDS_LOG_POPUP_EDITAUTHOR);\r
+//             }\r
+//             if (m_LogList.GetSelectedCount() == 1)\r
+//             {\r
+//                     popup.AppendMenuIcon(ID_EDITLOG, IDS_LOG_POPUP_EDITLOG);\r
+//                     popup.AppendMenuIcon(ID_REVPROPS, IDS_REPOBROWSE_SHOWREVPROP, IDI_PROPERTIES); // "Show Revision Properties"\r
+//                     popup.AppendMenu(MF_SEPARATOR, NULL);\r
+//             }\r
+#endif\r
                if (m_LogList.GetSelectedCount() != 0)\r
                {\r
                        popup.AppendMenuIcon(ID_COPYCLIPBOARD, IDS_LOG_POPUP_COPYTOCLIPBOARD);\r
@@ -3972,11 +3986,61 @@ void CLogDlg::ShowContextMenuForRevisions(CWnd* /*pWnd*/, CPoint point)
 \r
                int cmd = popup.TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_NONOTIFY, point.x, point.y, this, 0);\r
                DialogEnableWindow(IDOK, FALSE);\r
-               SetPromptApp(&theApp);\r
+//             SetPromptApp(&theApp);\r
                theApp.DoWaitCursor(1);\r
                bool bOpenWith = false;\r
+\r
                switch (cmd)\r
                {\r
+                       case ID_GNUDIFF1:\r
+                       {\r
+//                             if (PromptShown())\r
+//                             {\r
+//                                     GitDiff diff(this, this->m_hWnd, true);\r
+//                                     diff.SetHEADPeg(m_LogRevision);\r
+//                                     diff.ShowUnifiedDiff(m_path, revPrevious, m_path, revSelected);\r
+//                             }\r
+//                             else\r
+//                                     CAppUtils::StartShowUnifiedDiff(m_hWnd, m_path, revPrevious, m_path, revSelected, GitRev(), m_LogRevision);\r
+                       }\r
+                       break;\r
+\r
+                       case ID_GNUDIFF2:\r
+                       {\r
+//                             if (PromptShown())\r
+//                             {\r
+//                                     GitDiff diff(this, this->m_hWnd, true);\r
+//                                     diff.SetHEADPeg(m_LogRevision);\r
+//                                     diff.ShowUnifiedDiff(m_path, revSelected2, m_path, revSelected);\r
+//                             }\r
+//                             else\r
+//                                     CAppUtils::StartShowUnifiedDiff(m_hWnd, m_path, revSelected2, m_path, revSelected, GitRev(), m_LogRevision);\r
+                       }\r
+                       break;\r
+\r
+               case ID_COMPARETWO:\r
+                       {\r
+                               //GitRev * r1 = reinterpret_cast<GitRev*>((*m_arShownList)[FirstSelect]);\r
+                               //GitRev * r2 = reinterpret_cast<GitRev*>((*m_arShownList)[LastSelect]);\r
+                               //if (m_LogList.GetSelectedCount() > 2)\r
+                               //{\r
+                               //      r1 = revHighest;\r
+                               //      r2 = revLowest;\r
+                               //}\r
+                               //user clicked on the menu item "compare revisions"\r
+                               //if (PromptShown())\r
+                               //{\r
+                               //      GitDiff diff(this, m_hWnd, true);\r
+                               //      diff.SetAlternativeTool(!!(GetAsyncKeyState(VK_SHIFT) & 0x8000));\r
+                               //      diff.SetHEADPeg(m_LogRevision);\r
+                               //      diff.ShowCompare(CTGitPath(pathURL), r2, CTGitPath(pathURL), r1);\r
+                               //}\r
+                               //else\r
+                               //      CAppUtils::StartShowCompare(m_hWnd, CTGitPath(pathURL), r2, CTGitPath(pathURL), r1, GitRev(), m_LogRevision, !!(GetAsyncKeyState(VK_SHIFT) & 0x8000));\r
+                       }\r
+                       break;\r
+\r
+#if 0\r
                case ID_GNUDIFF1:\r
                        {\r
                                if (PromptShown())\r
@@ -3989,6 +4053,7 @@ void CLogDlg::ShowContextMenuForRevisions(CWnd* /*pWnd*/, CPoint point)
                                        CAppUtils::StartShowUnifiedDiff(m_hWnd, m_path, revPrevious, m_path, revSelected, GitRev(), m_LogRevision);\r
                        }\r
                        break;\r
+\r
                case ID_GNUDIFF2:\r
                        {\r
                                if (PromptShown())\r
@@ -4433,18 +4498,18 @@ void CLogDlg::ShowContextMenuForRevisions(CWnd* /*pWnd*/, CPoint point)
                                        ShellExecute(this->m_hWnd, _T("open"), url, NULL, NULL, SW_SHOWDEFAULT);                                        \r
                        }\r
                        break;\r
+#endif\r
                default:\r
                        break;\r
                } // switch (cmd)\r
                theApp.DoWaitCursor(-1);\r
                EnableOKButton();\r
        } // if (popup.CreatePopupMenu())\r
-#endif\r
 }\r
 \r
 void CLogDlg::ShowContextMenuForChangedpaths(CWnd* /*pWnd*/, CPoint point)\r
 {\r
-#if 0\r
+\r
        int selIndex = m_ChangedFileListCtrl.GetSelectionMark();\r
        if ((point.x == -1) && (point.y == -1))\r
        {\r
@@ -4464,8 +4529,10 @@ void CLogDlg::ShowContextMenuForChangedpaths(CWnd* /*pWnd*/, CPoint point)
        if (pos == NULL)\r
                return; // nothing is selected, get out of here\r
 \r
-       PLOGENTRYDATA pLogEntry = reinterpret_cast<PLOGENTRYDATA>(m_arShownList.GetAt(m_LogList.GetNextSelectedItem(pos)));\r
-       git_revnum_t rev1 = pLogEntry->Rev;\r
+       bool bOneRev = true;\r
+#if 0\r
+       GitRev * pLogEntry = reinterpret_cast<GitRev *>(m_arShownList.GetAt(m_LogList.GetNextSelectedItem(pos)));\r
+       git_revnum_t rev1 = pLogEntry;\r
        git_revnum_t rev2 = rev1;\r
        bool bOneRev = true;\r
        if (pos)\r
@@ -4544,7 +4611,7 @@ void CLogDlg::ShowContextMenuForChangedpaths(CWnd* /*pWnd*/, CPoint point)
                        }\r
                }\r
        }\r
-\r
+#endif\r
        //entry is selected, now show the popup menu\r
        CIconMenu popup;\r
        if (popup.CreatePopupMenu())\r
@@ -4552,7 +4619,7 @@ void CLogDlg::ShowContextMenuForChangedpaths(CWnd* /*pWnd*/, CPoint point)
                bool bEntryAdded = false;\r
                if (m_ChangedFileListCtrl.GetSelectedCount() == 1)\r
                {\r
-                       if ((!bOneRev)||(IsDiffPossible(changedlogpaths[0], rev1)))\r
+//                     if ((!bOneRev)||(IsDiffPossible(changedlogpaths[0], rev1)))\r
                        {\r
                                popup.AppendMenuIcon(ID_DIFF, IDS_LOG_POPUP_DIFF, IDI_DIFF);\r
                                popup.AppendMenuIcon(ID_BLAMEDIFF, IDS_LOG_POPUP_BLAMEDIFF, IDI_BLAME);\r
@@ -4560,7 +4627,7 @@ void CLogDlg::ShowContextMenuForChangedpaths(CWnd* /*pWnd*/, CPoint point)
                                popup.AppendMenuIcon(ID_GNUDIFF1, IDS_LOG_POPUP_GNUDIFF_CH, IDI_DIFF);\r
                                bEntryAdded = true;\r
                        }\r
-                       if (rev2 == rev1-1)\r
+//                     if (rev2 == rev1-1)\r
                        {\r
                                if (bEntryAdded)\r
                                        popup.AppendMenu(MF_SEPARATOR, NULL);\r
@@ -4597,6 +4664,7 @@ void CLogDlg::ShowContextMenuForChangedpaths(CWnd* /*pWnd*/, CPoint point)
                bool bOpenWith = false;\r
                bool bMergeLog = false;\r
                m_bCancelled = false;\r
+#if 0\r
                switch (cmd)\r
                {\r
                case ID_DIFF:\r
@@ -4968,8 +5036,8 @@ void CLogDlg::ShowContextMenuForChangedpaths(CWnd* /*pWnd*/, CPoint point)
                default:\r
                        break;\r
                } // switch (cmd)\r
-       } // if (popup.CreatePopupMenu())\r
 #endif\r
+       } // if (popup.CreatePopupMenu())\r
 }\r
 \r
 void CLogDlg::OnDtnDropdownDatefrom(NMHDR * /*pNMHDR*/, LRESULT *pResult)\r
index 0a497c5..35a6d43 100644 (file)
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\copy.ico"\r
+                               RelativePath=".\copy.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\copy.ico"\r
+                               RelativePath="..\Resources\copy.ico"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\explorer.ico"\r
+                               RelativePath=".\explorer.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\explorer.ico"\r
+                               RelativePath="..\Resources\explorer.ico"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\newfolder.ico"\r
+                               RelativePath="..\Resources\newfolder.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\newfolder.ico"\r
+                               RelativePath=".\newfolder.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\open.ico"\r
+                               RelativePath="..\Resources\open.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\open.ico"\r
+                               RelativePath=".\open.ico"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\refresh.ico"\r
+                               RelativePath=".\refresh.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\refresh.ico"\r
+                               RelativePath="..\Resources\refresh.ico"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\save.ico"\r
+                               RelativePath=".\save.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\save.ico"\r
+                               RelativePath="..\Resources\save.ico"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\up.ico"\r
+                               RelativePath="..\Resources\up.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\up.ico"\r
+                               RelativePath=".\up.ico"\r
                                >\r
                        </File>\r
                        <File\r
                                        >\r
                                </File>\r
                        </Filter>\r
+                       <Filter\r
+                               Name="Compare"\r
+                               >\r
+                               <File\r
+                                       RelativePath=".\Commands\ShowCompareCommand.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath=".\Commands\ShowCompareCommand.h"\r
+                                       >\r
+                               </File>\r
+                       </Filter>\r
                </Filter>\r
                <Filter\r
                        Name="Utility Dialogs"\r
diff --git a/TortoiseUDiff/FindBar.cpp b/TortoiseUDiff/FindBar.cpp
new file mode 100644 (file)
index 0000000..8b99248
--- /dev/null
@@ -0,0 +1,97 @@
+// TortoiseSVN - a Windows shell extension for easy version control\r
+\r
+// Copyright (C) 2003-2007 - Stefan Kueng\r
+\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+\r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+\r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software Foundation,\r
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
+//\r
+#include "StdAfx.h"\r
+#include "Resource.h"\r
+#include "FindBar.h"\r
+#include "Registry.h"\r
+#include <string>\r
+#include <Commdlg.h>\r
+\r
+using namespace std;\r
+\r
+CFindBar::CFindBar()\r
+{\r
+}\r
+\r
+CFindBar::~CFindBar(void)\r
+{\r
+       DestroyIcon(m_hIcon);\r
+}\r
+\r
+LRESULT CFindBar::DlgFunc(HWND /*hwndDlg*/, UINT uMsg, WPARAM wParam, LPARAM lParam)\r
+{\r
+       UNREFERENCED_PARAMETER(lParam);\r
+       switch (uMsg)\r
+       {\r
+       case WM_INITDIALOG:\r
+               {\r
+                       m_hIcon = (HICON)::LoadImage(hResource, MAKEINTRESOURCE(IDI_CANCELNORMAL), IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR);\r
+                       SendMessage(GetDlgItem(*this, IDC_FINDEXIT), BM_SETIMAGE, IMAGE_ICON, (LPARAM)m_hIcon);\r
+               }\r
+               return TRUE;\r
+       case WM_COMMAND:\r
+               return DoCommand(LOWORD(wParam), HIWORD(wParam));\r
+       default:\r
+               return FALSE;\r
+       }\r
+}\r
+\r
+LRESULT CFindBar::DoCommand(int id, int msg)\r
+{\r
+    bool bFindPrev = false;\r
+       switch (id)\r
+       {\r
+    case IDC_FINDPREV:\r
+        bFindPrev = true;\r
+    case IDC_FINDNEXT:\r
+        {\r
+                       DoFind(bFindPrev);\r
+        }\r
+        break;\r
+       case IDC_FINDEXIT:\r
+               {\r
+                       ::SendMessage(m_hParent, COMMITMONITOR_FINDEXIT, 0, 0);\r
+               }\r
+               break;\r
+       case IDC_FINDTEXT:\r
+               {\r
+                       if (msg == EN_CHANGE)\r
+                       {\r
+                               SendMessage(m_hParent, COMMITMONITOR_FINDRESET, 0, 0);\r
+                               DoFind(false);\r
+                       }\r
+               }\r
+               break;\r
+       }\r
+       return 1;\r
+}\r
+\r
+void CFindBar::DoFind(bool bFindPrev)\r
+{\r
+       int len = ::GetWindowTextLength(GetDlgItem(*this, IDC_FINDTEXT));\r
+       TCHAR * findtext = new TCHAR[len+1];\r
+       ::GetWindowText(GetDlgItem(*this, IDC_FINDTEXT), findtext, len+1);\r
+       wstring ft = wstring(findtext);\r
+       delete [] findtext;\r
+       bool bCaseSensitive = !!SendMessage(GetDlgItem(*this, IDC_MATCHCASECHECK), BM_GETCHECK, 0, NULL);\r
+       if (bFindPrev)\r
+               ::SendMessage(m_hParent, COMMITMONITOR_FINDMSGPREV, (WPARAM)bCaseSensitive, (LPARAM)ft.c_str());\r
+       else\r
+               ::SendMessage(m_hParent, COMMITMONITOR_FINDMSGNEXT, (WPARAM)bCaseSensitive, (LPARAM)ft.c_str());\r
+}
\ No newline at end of file
diff --git a/TortoiseUDiff/FindBar.h b/TortoiseUDiff/FindBar.h
new file mode 100644 (file)
index 0000000..7230ee8
--- /dev/null
@@ -0,0 +1,44 @@
+// TortoiseSVN - a Windows shell extension for easy version control\r
+\r
+// Copyright (C) 2007 - TortoiseSVN\r
+\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+\r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+\r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software Foundation,\r
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
+//\r
+#pragma once\r
+#include "basedialog.h"\r
+\r
+\r
+/**\r
+ * \ingroup TortoiseUDiff\r
+ * FindBar.\r
+ * A search bar similar to the one found in FireFox\r
+ */\r
+class CFindBar : public CDialog\r
+{\r
+public:\r
+       CFindBar();\r
+       ~CFindBar(void);\r
+\r
+    void                    SetParent(HWND hParent) {m_hParent = hParent;}\r
+protected:\r
+       LRESULT CALLBACK                DlgFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);\r
+       LRESULT                                 DoCommand(int id, int msg);\r
+\r
+       void                                    DoFind(bool bFindPrev);\r
+\r
+private:\r
+       HWND                                    m_hParent;\r
+       HICON                                   m_hIcon;\r
+};\r
diff --git a/TortoiseUDiff/MainWindow.cpp b/TortoiseUDiff/MainWindow.cpp
new file mode 100644 (file)
index 0000000..9b43c26
--- /dev/null
@@ -0,0 +1,471 @@
+// TortoiseSVN - a Windows shell extension for easy version control\r
+\r
+// Copyright (C) 2003-2008 - TortoiseSVN\r
+\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+\r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+\r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software Foundation,\r
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
+//\r
+#include "StdAfx.h"\r
+#include "MainWindow.h"\r
+#include "UnicodeUtils.h"\r
+\r
+CMainWindow::CMainWindow(HINSTANCE hInst, const WNDCLASSEX* wcx /* = NULL*/) \r
+       : CWindow(hInst, wcx)\r
+       , m_bShowFindBar(false)\r
+{\r
+       SetWindowTitle(_T("TortoiseUDiff"));\r
+}\r
+\r
+CMainWindow::~CMainWindow(void)\r
+{\r
+}\r
+\r
+bool CMainWindow::RegisterAndCreateWindow()\r
+{\r
+       WNDCLASSEX wcx; \r
+\r
+       // Fill in the window class structure with default parameters \r
+       wcx.cbSize = sizeof(WNDCLASSEX);\r
+       wcx.style = CS_HREDRAW | CS_VREDRAW;\r
+       wcx.lpfnWndProc = CWindow::stWinMsgHandler;\r
+       wcx.cbClsExtra = 0;\r
+       wcx.cbWndExtra = 0;\r
+       wcx.hInstance = hResource;\r
+       wcx.hCursor = NULL;\r
+       wcx.lpszClassName = ResString(hResource, IDS_APP_TITLE);\r
+       wcx.hIcon = LoadIcon(hResource, MAKEINTRESOURCE(IDI_TORTOISEUDIFF));\r
+       wcx.hbrBackground = (HBRUSH)(COLOR_3DFACE+1);\r
+       wcx.lpszMenuName = MAKEINTRESOURCE(IDC_TORTOISEUDIFF);\r
+       wcx.hIconSm     = LoadIcon(wcx.hInstance, MAKEINTRESOURCE(IDI_TORTOISEUDIFF));\r
+       if (RegisterWindow(&wcx))\r
+       {\r
+               if (Create(WS_CAPTION | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SIZEBOX | WS_SYSMENU | WS_CLIPCHILDREN, NULL))\r
+               {\r
+                       m_FindBar.SetParent(*this);\r
+                       m_FindBar.Create(hResource, IDD_FINDBAR, *this);\r
+                       ShowWindow(*this, SW_SHOW);\r
+                       UpdateWindow(*this);\r
+                       return true;\r
+               }\r
+       }\r
+       return false;\r
+}\r
+\r
+LRESULT CALLBACK CMainWindow::WinMsgHandler(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)\r
+{\r
+       switch (uMsg)\r
+       {\r
+       case WM_CREATE:\r
+               {\r
+                       m_hwnd = hwnd;\r
+                       Initialize();\r
+               }\r
+               break;\r
+       case WM_COMMAND:\r
+               {\r
+                       return DoCommand(LOWORD(wParam));\r
+               }\r
+               break;\r
+       case WM_MOUSEWHEEL:\r
+               {\r
+                       if (GET_KEYSTATE_WPARAM(wParam) == MK_SHIFT)\r
+                       {\r
+                               // scroll sideways\r
+                               SendEditor(SCI_LINESCROLL, -GET_WHEEL_DELTA_WPARAM(wParam)/40, 0);\r
+                       }\r
+                       else\r
+                               return DefWindowProc(hwnd, uMsg, wParam, lParam);\r
+               }\r
+               break;\r
+       case WM_SIZE:\r
+               {\r
+                       RECT rect;\r
+                       GetClientRect(*this, &rect);\r
+                       if (m_bShowFindBar)\r
+                       {\r
+                               ::SetWindowPos(m_hWndEdit, HWND_TOP, \r
+                                       rect.left, rect.top,\r
+                                       rect.right-rect.left, rect.bottom-rect.top-30,\r
+                                       SWP_SHOWWINDOW);\r
+                               ::SetWindowPos(m_FindBar, HWND_TOP,\r
+                                       rect.left, rect.bottom-30,\r
+                                       rect.right-rect.left, 30,\r
+                                       SWP_SHOWWINDOW);\r
+                       }\r
+                       else\r
+                       {\r
+                               ::SetWindowPos(m_hWndEdit, HWND_TOP, \r
+                                       rect.left, rect.top,\r
+                                       rect.right-rect.left, rect.bottom-rect.top,\r
+                                       SWP_SHOWWINDOW);\r
+                               ::ShowWindow(m_FindBar, SW_HIDE);\r
+                       }\r
+               }\r
+               break;\r
+       case WM_GETMINMAXINFO:\r
+               {\r
+                       MINMAXINFO * mmi = (MINMAXINFO*)lParam;\r
+                       mmi->ptMinTrackSize.x = 100;\r
+                       mmi->ptMinTrackSize.y = 100;\r
+                       return 0;\r
+               }\r
+               break;\r
+       case WM_DESTROY:\r
+               PostQuitMessage(0);\r
+               break;\r
+       case WM_CLOSE:\r
+               {\r
+                       CRegStdWORD w = CRegStdWORD(_T("Software\\TortoiseSVN\\UDiffViewerWidth"), (DWORD)CW_USEDEFAULT);\r
+                       CRegStdWORD h = CRegStdWORD(_T("Software\\TortoiseSVN\\UDiffViewerHeight"), (DWORD)CW_USEDEFAULT);\r
+                       CRegStdWORD p = CRegStdWORD(_T("Software\\TortoiseSVN\\UDiffViewerPos"), 0);\r
+\r
+                       RECT rect;\r
+                       ::GetWindowRect(*this, &rect);\r
+                       w = rect.right-rect.left;\r
+                       h = rect.bottom-rect.top;\r
+                       p = MAKELONG(rect.left, rect.top);\r
+               }\r
+               ::DestroyWindow(m_hwnd);\r
+               break;\r
+       case WM_SETFOCUS:\r
+               SetFocus(m_hWndEdit);\r
+               break;\r
+       case COMMITMONITOR_FINDMSGNEXT:\r
+               {\r
+                       SendEditor(SCI_CHARRIGHT);\r
+                       SendEditor(SCI_SEARCHANCHOR);\r
+                       m_bMatchCase = !!wParam;\r
+                       m_findtext = (LPCTSTR)lParam;\r
+                       SendEditor(SCI_SEARCHNEXT, m_bMatchCase ? SCFIND_MATCHCASE : 0, (LPARAM)CUnicodeUtils::StdGetUTF8(m_findtext).c_str());\r
+                       SendEditor(SCI_SCROLLCARET);\r
+               }\r
+               break;\r
+       case COMMITMONITOR_FINDMSGPREV:\r
+               {\r
+                       SendEditor(SCI_SEARCHANCHOR);\r
+                       m_bMatchCase = !!wParam;\r
+                       m_findtext = (LPCTSTR)lParam;\r
+                       SendEditor(SCI_SEARCHPREV, m_bMatchCase ? SCFIND_MATCHCASE : 0, (LPARAM)CUnicodeUtils::StdGetUTF8(m_findtext).c_str());\r
+                       SendEditor(SCI_SCROLLCARET);\r
+               }\r
+               break;\r
+       case COMMITMONITOR_FINDEXIT:\r
+               {\r
+                       RECT rect;\r
+                       GetClientRect(*this, &rect);\r
+                       m_bShowFindBar = false;\r
+                       ::ShowWindow(m_FindBar, SW_HIDE);\r
+                       ::SetWindowPos(m_hWndEdit, HWND_TOP, \r
+                               rect.left, rect.top,\r
+                               rect.right-rect.left, rect.bottom-rect.top,\r
+                               SWP_SHOWWINDOW);\r
+               }\r
+               break;\r
+       case COMMITMONITOR_FINDRESET:\r
+               SendEditor(SCI_SETSELECTIONSTART, 0);\r
+               SendEditor(SCI_SETSELECTIONEND, 0);\r
+               SendEditor(SCI_SEARCHANCHOR);\r
+               break;\r
+       default:\r
+               return DefWindowProc(hwnd, uMsg, wParam, lParam);\r
+       }\r
+\r
+       return 0;\r
+};\r
+\r
+LRESULT CMainWindow::DoCommand(int id)\r
+{\r
+       switch (id) \r
+       {\r
+       case ID_FILE_EXIT:\r
+               ::PostQuitMessage(0);\r
+               return 0;\r
+       case IDM_SHOWFINDBAR:\r
+               {\r
+                       m_bShowFindBar = true;\r
+                       ::ShowWindow(m_FindBar, SW_SHOW);\r
+                       RECT rect;\r
+                       GetClientRect(*this, &rect);\r
+                       ::SetWindowPos(m_hWndEdit, HWND_TOP, \r
+                               rect.left, rect.top,\r
+                               rect.right-rect.left, rect.bottom-rect.top-30,\r
+                               SWP_SHOWWINDOW);\r
+                       ::SetWindowPos(m_FindBar, HWND_TOP,\r
+                               rect.left, rect.bottom-30,\r
+                               rect.right-rect.left, 30,\r
+                               SWP_SHOWWINDOW);\r
+                       ::SetFocus(m_FindBar);\r
+                       SendEditor(SCI_SETSELECTIONSTART, 0);\r
+                       SendEditor(SCI_SETSELECTIONEND, 0);\r
+                       SendEditor(SCI_SEARCHANCHOR);\r
+               }\r
+               break;\r
+       case IDM_FINDNEXT:\r
+               SendEditor(SCI_CHARRIGHT);\r
+               SendEditor(SCI_SEARCHANCHOR);\r
+               SendEditor(SCI_SEARCHNEXT, m_bMatchCase ? SCFIND_MATCHCASE : 0, (LPARAM)CUnicodeUtils::StdGetUTF8(m_findtext).c_str());\r
+               SendEditor(SCI_SCROLLCARET);\r
+               break;\r
+       case IDM_FINDPREV:\r
+               SendEditor(SCI_SEARCHANCHOR);\r
+               SendEditor(SCI_SEARCHPREV, m_bMatchCase ? SCFIND_MATCHCASE : 0, (LPARAM)CUnicodeUtils::StdGetUTF8(m_findtext).c_str());\r
+               SendEditor(SCI_SCROLLCARET);\r
+               break;\r
+       case IDM_FINDEXIT:\r
+               {\r
+                       if (IsWindowVisible(m_FindBar))\r
+                       {\r
+                               RECT rect;\r
+                               GetClientRect(*this, &rect);\r
+                               m_bShowFindBar = false;\r
+                               ::ShowWindow(m_FindBar, SW_HIDE);\r
+                               ::SetWindowPos(m_hWndEdit, HWND_TOP, \r
+                                       rect.left, rect.top,\r
+                                       rect.right-rect.left, rect.bottom-rect.top,\r
+                                       SWP_SHOWWINDOW);\r
+                       }\r
+                       else\r
+                               PostQuitMessage(0);\r
+               }\r
+               break;\r
+       default:\r
+               break;\r
+       };\r
+       return 1;\r
+}\r
+\r
+\r
+LRESULT CMainWindow::SendEditor(UINT Msg, WPARAM wParam, LPARAM lParam)\r
+{\r
+       if (m_directFunction)\r
+       {\r
+               return ((SciFnDirect) m_directFunction)(m_directPointer, Msg, wParam, lParam);\r
+       }\r
+       return ::SendMessage(m_hWndEdit, Msg, wParam, lParam);  \r
+}\r
+\r
+bool CMainWindow::Initialize()\r
+{\r
+       CRegStdWORD pos(_T("Software\\TortoiseSVN\\UDiffViewerPos"), 0);\r
+       CRegStdWORD width(_T("Software\\TortoiseSVN\\UDiffViewerWidth"), (DWORD)640);\r
+       CRegStdWORD height(_T("Software\\TortoiseSVN\\UDiffViewerHeight"), (DWORD)480);\r
+       if (DWORD(pos) && DWORD(width) && DWORD(height))\r
+       {\r
+               RECT rc;\r
+               rc.left = LOWORD(DWORD(pos));\r
+               rc.top = HIWORD(DWORD(pos));\r
+               rc.right = rc.left + DWORD(width);\r
+               rc.bottom = rc.top + DWORD(height);\r
+               HMONITOR hMon = MonitorFromRect(&rc, MONITOR_DEFAULTTONULL);\r
+               if (hMon)\r
+               {\r
+                       // only restore the window position if the monitor is valid\r
+                       MoveWindow(*this, LOWORD(DWORD(pos)), HIWORD(DWORD(pos)),\r
+                               DWORD(width), DWORD(height), FALSE);\r
+               }\r
+       }\r
+\r
+       m_hWndEdit = ::CreateWindow(\r
+               _T("Scintilla"),\r
+               _T("Source"),\r
+               WS_CHILD | WS_VSCROLL | WS_HSCROLL | WS_CLIPCHILDREN,\r
+               CW_USEDEFAULT, CW_USEDEFAULT,\r
+               CW_USEDEFAULT, CW_USEDEFAULT,\r
+               *this,\r
+               0,\r
+               hResource,\r
+               0);\r
+       if (m_hWndEdit == NULL)\r
+               return false;\r
+\r
+       RECT rect;\r
+       GetClientRect(*this, &rect);\r
+       ::SetWindowPos(m_hWndEdit, HWND_TOP, \r
+               rect.left, rect.top,\r
+               rect.right-rect.left, rect.bottom-rect.top,\r
+               SWP_SHOWWINDOW);\r
+\r
+       m_directFunction = SendMessage(m_hWndEdit, SCI_GETDIRECTFUNCTION, 0, 0);\r
+       m_directPointer = SendMessage(m_hWndEdit, SCI_GETDIRECTPOINTER, 0, 0);\r
+\r
+       // Set up the global default style. These attributes are used wherever no explicit choices are made.\r
+       SetAStyle(STYLE_DEFAULT, ::GetSysColor(COLOR_WINDOWTEXT), ::GetSysColor(COLOR_WINDOW),\r
+               // Reusing TortoiseBlame's setting which already have an user friendly\r
+               // pane in TortoiseSVN's Settings dialog, while there is no such\r
+               // pane for TortoiseUDiff.\r
+               CRegStdWORD(_T("Software\\TortoiseSVN\\BlameFontSize"), 10),\r
+               WideToMultibyte(CRegStdString(_T("Software\\TortoiseSVN\\BlameFontName"), _T("Courier New"))).c_str());\r
+       SendEditor(SCI_SETTABWIDTH, 4);\r
+       SendEditor(SCI_SETREADONLY, TRUE);\r
+       LRESULT pix = SendEditor(SCI_TEXTWIDTH, STYLE_LINENUMBER, (LPARAM)"_99999");\r
+       SendEditor(SCI_SETMARGINWIDTHN, 0, pix);\r
+       SendEditor(SCI_SETMARGINWIDTHN, 1);\r
+       SendEditor(SCI_SETMARGINWIDTHN, 2);\r
+       //Set the default windows colors for edit controls\r
+       SendEditor(SCI_STYLESETFORE, STYLE_DEFAULT, ::GetSysColor(COLOR_WINDOWTEXT));\r
+       SendEditor(SCI_STYLESETBACK, STYLE_DEFAULT, ::GetSysColor(COLOR_WINDOW));\r
+       SendEditor(SCI_SETSELFORE, TRUE, ::GetSysColor(COLOR_HIGHLIGHTTEXT));\r
+       SendEditor(SCI_SETSELBACK, TRUE, ::GetSysColor(COLOR_HIGHLIGHT));\r
+       SendEditor(SCI_SETCARETFORE, ::GetSysColor(COLOR_WINDOWTEXT));\r
+\r
+       return true;\r
+}\r
+\r
+bool CMainWindow::LoadFile(LPCTSTR filename)\r
+{\r
+       SendEditor(SCI_SETREADONLY, FALSE);\r
+       SendEditor(SCI_CLEARALL);\r
+       SendEditor(EM_EMPTYUNDOBUFFER);\r
+       SendEditor(SCI_SETSAVEPOINT);\r
+       SendEditor(SCI_CANCEL);\r
+       SendEditor(SCI_SETUNDOCOLLECTION, 0);\r
+\r
+       FILE *fp = NULL;\r
+       _tfopen_s(&fp, filename, _T("rb"));\r
+       if (fp) \r
+       {\r
+               //SetTitle();\r
+               char data[4096];\r
+               int lenFile = fread(data, 1, sizeof(data), fp);\r
+               bool bUTF8 = IsUTF8(data, lenFile);\r
+               while (lenFile > 0) \r
+               {\r
+                       SendEditor(SCI_ADDTEXT, lenFile,\r
+                               reinterpret_cast<LPARAM>(static_cast<char *>(data)));\r
+                       lenFile = fread(data, 1, sizeof(data), fp);\r
+               }\r
+               fclose(fp);\r
+               SendEditor(SCI_SETCODEPAGE, bUTF8 ? SC_CP_UTF8 : GetACP());\r
+       }\r
+       else \r
+       {\r
+               return false;\r
+       }\r
+\r
+       SendEditor(SCI_SETUNDOCOLLECTION, 1);\r
+       ::SetFocus(m_hWndEdit);\r
+       SendEditor(EM_EMPTYUNDOBUFFER);\r
+       SendEditor(SCI_SETSAVEPOINT);\r
+       SendEditor(SCI_GOTOPOS, 0);\r
+       SendEditor(SCI_SETREADONLY, TRUE);\r
+\r
+       SendEditor(SCI_CLEARDOCUMENTSTYLE, 0, 0);\r
+       SendEditor(SCI_SETSTYLEBITS, 5, 0);\r
+\r
+       //SetAStyle(SCE_DIFF_DEFAULT, RGB(0, 0, 0));\r
+       SetAStyle(SCE_DIFF_COMMAND, RGB(0x0A, 0x24, 0x36));\r
+       SetAStyle(SCE_DIFF_POSITION, RGB(0xFF, 0, 0));\r
+       SetAStyle(SCE_DIFF_HEADER, RGB(0x80, 0, 0), RGB(0xFF, 0xFF, 0x80));\r
+       SetAStyle(SCE_DIFF_COMMENT, RGB(0, 0x80, 0));\r
+       SendEditor(SCI_STYLESETBOLD, SCE_DIFF_COMMENT, TRUE);\r
+       SetAStyle(SCE_DIFF_DELETED, ::GetSysColor(COLOR_WINDOWTEXT), RGB(0xFF, 0x80, 0x80));\r
+       SetAStyle(SCE_DIFF_ADDED, ::GetSysColor(COLOR_WINDOWTEXT), RGB(0x80, 0xFF, 0x80));\r
+\r
+       SendEditor(SCI_SETLEXER, SCLEX_DIFF);\r
+       SendEditor(SCI_SETKEYWORDS, 0, (LPARAM)"revision");\r
+       SendEditor(SCI_COLOURISE, 0, -1);\r
+       ::ShowWindow(m_hWndEdit, SW_SHOW);\r
+       return true;\r
+}\r
+\r
+void CMainWindow::SetTitle(LPCTSTR title)\r
+{\r
+       int len = _tcslen(title);\r
+       TCHAR * pBuf = new TCHAR[len+40];\r
+       _stprintf_s(pBuf, len+40, _T("%s - TortoiseUDiff"), title);\r
+       SetWindowTitle(std::wstring(pBuf));\r
+       delete [] pBuf;\r
+}\r
+\r
+void CMainWindow::SetAStyle(int style, COLORREF fore, COLORREF back, int size, const char *face) \r
+{\r
+       SendEditor(SCI_STYLESETFORE, style, fore);\r
+       SendEditor(SCI_STYLESETBACK, style, back);\r
+       if (size >= 1)\r
+               SendEditor(SCI_STYLESETSIZE, style, size);\r
+       if (face) \r
+               SendEditor(SCI_STYLESETFONT, style, reinterpret_cast<LPARAM>(face));\r
+}\r
+\r
+bool CMainWindow::IsUTF8(LPVOID pBuffer, int cb)\r
+{\r
+       if (cb < 2)\r
+               return true;\r
+       UINT16 * pVal = (UINT16 *)pBuffer;\r
+       UINT8 * pVal2 = (UINT8 *)(pVal+1);\r
+       // scan the whole buffer for a 0x0000 sequence\r
+       // if found, we assume a binary file\r
+       for (int i=0; i<(cb-2); i=i+2)\r
+       {\r
+               if (0x0000 == *pVal++)\r
+                       return false;\r
+       }\r
+       pVal = (UINT16 *)pBuffer;\r
+       if (*pVal == 0xFEFF)\r
+               return false;\r
+       if (cb < 3)\r
+               return false;\r
+       if (*pVal == 0xBBEF)\r
+       {\r
+               if (*pVal2 == 0xBF)\r
+                       return true;\r
+       }\r
+       // check for illegal UTF8 chars\r
+       pVal2 = (UINT8 *)pBuffer;\r
+       for (int i=0; i<cb; ++i)\r
+       {\r
+               if ((*pVal2 == 0xC0)||(*pVal2 == 0xC1)||(*pVal2 >= 0xF5))\r
+                       return false;\r
+               pVal2++;\r
+       }\r
+       pVal2 = (UINT8 *)pBuffer;\r
+       bool bUTF8 = false;\r
+       for (int i=0; i<(cb-3); ++i)\r
+       {\r
+               if ((*pVal2 & 0xE0)==0xC0)\r
+               {\r
+                       pVal2++;i++;\r
+                       if ((*pVal2 & 0xC0)!=0x80)\r
+                               return false;\r
+                       bUTF8 = true;\r
+               }\r
+               if ((*pVal2 & 0xF0)==0xE0)\r
+               {\r
+                       pVal2++;i++;\r
+                       if ((*pVal2 & 0xC0)!=0x80)\r
+                               return false;\r
+                       pVal2++;i++;\r
+                       if ((*pVal2 & 0xC0)!=0x80)\r
+                               return false;\r
+                       bUTF8 = true;\r
+               }\r
+               if ((*pVal2 & 0xF8)==0xF0)\r
+               {\r
+                       pVal2++;i++;\r
+                       if ((*pVal2 & 0xC0)!=0x80)\r
+                               return false;\r
+                       pVal2++;i++;\r
+                       if ((*pVal2 & 0xC0)!=0x80)\r
+                               return false;\r
+                       pVal2++;i++;\r
+                       if ((*pVal2 & 0xC0)!=0x80)\r
+                               return false;\r
+                       bUTF8 = true;\r
+               }\r
+               pVal2++;\r
+       }\r
+       if (bUTF8)\r
+               return true;\r
+       return false;\r
+}\r
diff --git a/TortoiseUDiff/MainWindow.h b/TortoiseUDiff/MainWindow.h
new file mode 100644 (file)
index 0000000..820ae09
--- /dev/null
@@ -0,0 +1,75 @@
+// TortoiseSVN - a Windows shell extension for easy version control\r
+\r
+// Copyright (C) 2007 - TortoiseUDiff\r
+\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+\r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+\r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software Foundation,\r
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
+//\r
+#pragma once\r
+#include "BaseWindow.h"\r
+#include "SciLexer.h"\r
+#include "Scintilla.h"\r
+#include "Registry.h"\r
+#include "resource.h"\r
+#include "FindBar.h"\r
+#include <string>\r
+#include <stdio.h>\r
+\r
+using namespace std;\r
+\r
+/**\r
+ * \ingroup TortoiseUDiff\r
+ * Main window of TortoiseUDiff. Handles the child windows (Scintilla control,\r
+ * CFindBar, ...).\r
+ */\r
+class CMainWindow : public CWindow\r
+{\r
+public:\r
+       CMainWindow(HINSTANCE hInst, const WNDCLASSEX* wcx = NULL);\r
+       ~CMainWindow(void);\r
+\r
+       /**\r
+       * Registers the window class and creates the window.\r
+       */\r
+       bool                            RegisterAndCreateWindow();\r
+\r
+       LRESULT                         SendEditor(UINT Msg, WPARAM wParam = 0, LPARAM lParam = 0);\r
+       HWND                            GetHWNDEdit() { return m_hWndEdit; }\r
+       bool                            LoadFile(LPCTSTR filename);\r
+       void                            SetTitle(LPCTSTR title);\r
+\r
+protected:\r
+       /// the message handler for this window\r
+       LRESULT CALLBACK        WinMsgHandler(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);\r
+       /// Handles all the WM_COMMAND window messages (e.g. menu commands)\r
+       LRESULT                         DoCommand(int id);\r
+\r
+       bool                            Initialize();\r
+\r
+private:\r
+       void                            SetAStyle(int style, COLORREF fore, COLORREF back=::GetSysColor(COLOR_WINDOW), \r
+               int size=-1, const char *face=0);\r
+       bool                IsUTF8(LPVOID pBuffer, int cb);\r
+\r
+private:\r
+       LRESULT                         m_directFunction;\r
+       LRESULT                         m_directPointer;\r
+\r
+       HWND                            m_hWndEdit;\r
+\r
+       CFindBar            m_FindBar;\r
+       bool                            m_bShowFindBar;\r
+       bool                            m_bMatchCase;\r
+       wstring                         m_findtext;\r
+};\r
diff --git a/TortoiseUDiff/Readme.txt b/TortoiseUDiff/Readme.txt
new file mode 100644 (file)
index 0000000..d2cc96b
--- /dev/null
@@ -0,0 +1,7 @@
+TortoiseUDiff : a unified diff viewer for TortoiseSVN\r
+\r
+This unified diff viewer is basically a simple wrapper around the\r
+Scintilla edit control with the udiff lexer.\r
+\r
+This is a by-product of the CommitMonitor, released under GPL for\r
+TortoiseSVN.
\ No newline at end of file
diff --git a/TortoiseUDiff/TortoiseUDiff.cpp b/TortoiseUDiff/TortoiseUDiff.cpp
new file mode 100644 (file)
index 0000000..8c8ddb0
--- /dev/null
@@ -0,0 +1,92 @@
+// TortoiseSVN - a Windows shell extension for easy version control\r
+\r
+// Copyright (C) 2003-2008 - Stefan Kueng\r
+\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+\r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+\r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software Foundation,\r
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
+//\r
+#include "stdafx.h"\r
+#include "TortoiseUDiff.h"\r
+#include "MainWindow.h"\r
+#include "CmdLineParser.h"\r
+\r
+#include <commctrl.h>\r
+#pragma comment(lib, "comctl32.lib")\r
+\r
+\r
+#pragma comment(linker, "\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")\r
+\r
+\r
+int APIENTRY _tWinMain(HINSTANCE hInstance,\r
+                     HINSTANCE hPrevInstance,\r
+                     LPTSTR    lpCmdLine,\r
+                     int       nCmdShow)\r
+{\r
+       UNREFERENCED_PARAMETER(hPrevInstance);\r
+       UNREFERENCED_PARAMETER(nCmdShow);\r
+\r
+       MSG msg;\r
+       HACCEL hAccelTable;\r
+\r
+       CCmdLineParser parser(lpCmdLine);\r
+\r
+       if (parser.HasKey(_T("?")) || parser.HasKey(_T("help")) || !parser.HasKey(_T("patchfile")))\r
+       {\r
+               TCHAR buf[1024];\r
+               LoadString(hInstance, IDS_COMMANDLINEHELP, buf, sizeof(buf)/sizeof(TCHAR));\r
+               MessageBox(NULL, buf, _T("TortoiseUDiff"), MB_ICONINFORMATION);\r
+               return 0;\r
+       }\r
+\r
+       INITCOMMONCONTROLSEX used = {\r
+               sizeof(INITCOMMONCONTROLSEX),\r
+               ICC_STANDARD_CLASSES | ICC_BAR_CLASSES\r
+       };\r
+       InitCommonControlsEx(&used);\r
+\r
+\r
+       if (::LoadLibrary(_T("SciLexer.DLL")) == NULL)\r
+               return FALSE;\r
+       \r
+       CMainWindow mainWindow(hInstance);\r
+       if (parser.HasVal(_T("title")))\r
+               mainWindow.SetTitle(parser.GetVal(_T("title")));\r
+       else\r
+               mainWindow.SetTitle(parser.GetVal(_T("patchfile")));\r
+       if (mainWindow.RegisterAndCreateWindow())\r
+       {\r
+               if (mainWindow.LoadFile(parser.GetVal(_T("patchfile"))))\r
+               {\r
+                       ::ShowWindow(mainWindow.GetHWNDEdit(), SW_SHOW);\r
+                       ::SetFocus(mainWindow.GetHWNDEdit());\r
+\r
+                       hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TORTOISEUDIFF));\r
+\r
+                       // Main message loop:\r
+                       while (GetMessage(&msg, NULL, 0, 0))\r
+                       {\r
+                               if (!TranslateAccelerator(mainWindow, hAccelTable, &msg))\r
+                               {\r
+                                       TranslateMessage(&msg);\r
+                                       DispatchMessage(&msg);\r
+                               }\r
+                       }\r
+                       return (int) msg.wParam;\r
+               }\r
+       }\r
+       return 0;\r
+}\r
+\r
+\r
+\r
diff --git a/TortoiseUDiff/TortoiseUDiff.h b/TortoiseUDiff/TortoiseUDiff.h
new file mode 100644 (file)
index 0000000..afedd2e
--- /dev/null
@@ -0,0 +1,21 @@
+// TortoiseSVN - a Windows shell extension for easy version control\r
+\r
+// Copyright (C) 2003-2007 - Stefan Kueng\r
+\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+\r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+\r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software Foundation,\r
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
+//\r
+#pragma once\r
+\r
+#include "resource.h"\r
diff --git a/TortoiseUDiff/TortoiseUDiff.ico b/TortoiseUDiff/TortoiseUDiff.ico
new file mode 100644 (file)
index 0000000..46606ed
Binary files /dev/null and b/TortoiseUDiff/TortoiseUDiff.ico differ
diff --git a/TortoiseUDiff/TortoiseUDiff.rc b/TortoiseUDiff/TortoiseUDiff.rc
new file mode 100644 (file)
index 0000000..7b8b7d1
--- /dev/null
@@ -0,0 +1,173 @@
+// Microsoft Visual C++ generated resource script.\r
+//\r
+#include "resource.h"\r
+\r
+#define APSTUDIO_READONLY_SYMBOLS\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Generated from the TEXTINCLUDE 2 resource.\r
+//\r
+#define APSTUDIO_HIDDEN_SYMBOLS\r
+#include "windows.h"\r
+#ifndef APSTUDIO_INVOKED\r
+#include "TortoiseUDiff.rc2"\r
+#endif\r
+#undef APSTUDIO_HIDDEN_SYMBOLS\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+#undef APSTUDIO_READONLY_SYMBOLS\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// Neutral resources\r
+\r
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU)\r
+#ifdef _WIN32\r
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL\r
+#pragma code_page(1252)\r
+#endif //_WIN32\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Icon\r
+//\r
+\r
+// Icon with lowest ID value placed first to ensure application icon\r
+// remains consistent on all systems.\r
+IDI_CANCELNORMAL        ICON                    "..\\Resources\\cancel-normal.ico"\r
+#endif    // Neutral resources\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// English (U.S.) resources\r
+\r
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r
+#ifdef _WIN32\r
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\r
+#pragma code_page(1252)\r
+#endif //_WIN32\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Icon\r
+//\r
+\r
+// Icon with lowest ID value placed first to ensure application icon\r
+// remains consistent on all systems.\r
+IDI_TORTOISEUDIFF       ICON                    "TortoiseUDiff.ico"\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Accelerator\r
+//\r
+\r
+IDC_TORTOISEUDIFF ACCELERATORS \r
+BEGIN\r
+    VK_ESCAPE,      IDM_FINDEXIT,           VIRTKEY, NOINVERT\r
+    VK_F3,          IDM_FINDNEXT,           VIRTKEY, NOINVERT\r
+    VK_F3,          IDM_FINDPREV,           VIRTKEY, SHIFT, NOINVERT\r
+    "F",            IDM_SHOWFINDBAR,        VIRTKEY, CONTROL, NOINVERT\r
+    "W",            ID_FILE_EXIT,           VIRTKEY, CONTROL, NOINVERT\r
+END\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Menu\r
+//\r
+\r
+IDC_TORTOISEUDIFF MENU \r
+BEGIN\r
+    POPUP "&File"\r
+    BEGIN\r
+        MENUITEM "&Exit",                       ID_FILE_EXIT\r
+    END\r
+END\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Dialog\r
+//\r
+\r
+IDD_FINDBAR DIALOGEX 0, 0, 246, 21\r
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_SYSMENU\r
+FONT 8, "MS Shell Dlg", 400, 0, 0x1\r
+BEGIN\r
+    PUSHBUTTON      "",IDC_FINDEXIT,0,3,15,14,BS_ICON | NOT WS_TABSTOP,WS_EX_TRANSPARENT\r
+    LTEXT           "Find:",IDC_STATIC,19,5,17,8\r
+    EDITTEXT        IDC_FINDTEXT,40,2,55,14,ES_AUTOHSCROLL\r
+    PUSHBUTTON      "< &Previous",IDC_FINDPREV,100,2,58,14\r
+    PUSHBUTTON      "&Next >",IDC_FINDNEXT,160,2,58,14\r
+    CONTROL         "Mat&ch case",IDC_MATCHCASECHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,222,4,52,10\r
+END\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// String Table\r
+//\r
+\r
+STRINGTABLE \r
+BEGIN\r
+    IDS_APP_TITLE           "TortoiseUDiff"\r
+    IDS_COMMANDLINEHELP     "TortoiseUDiff: the unified diff viewer for TortoiseSVN\n\nAvailable command line parameters are:\n/patchfile:""path to unified diff file""\n/title:""title to show for the viewer"""\r
+    IDC_TORTOISEUDIFF       "TORTOISEUDIFF"\r
+END\r
+\r
+#endif    // English (U.S.) resources\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// German (Switzerland) resources\r
+\r
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DES)\r
+#ifdef _WIN32\r
+LANGUAGE LANG_GERMAN, SUBLANG_GERMAN_SWISS\r
+#pragma code_page(1252)\r
+#endif //_WIN32\r
+\r
+#ifdef APSTUDIO_INVOKED\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// TEXTINCLUDE\r
+//\r
+\r
+1 TEXTINCLUDE \r
+BEGIN\r
+    "resource.h\0"\r
+END\r
+\r
+2 TEXTINCLUDE \r
+BEGIN\r
+    "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"\r
+    "#include ""windows.h""\r\n"\r
+    "#ifndef APSTUDIO_INVOKED\r\n"\r
+    "#include ""TortoiseUDiff.rc2""\r\n"\r
+    "#endif\r\n"\r
+    "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n\0"\r
+END\r
+\r
+3 TEXTINCLUDE \r
+BEGIN\r
+    "\r\0"\r
+END\r
+\r
+#endif    // APSTUDIO_INVOKED\r
+\r
+#endif    // German (Switzerland) resources\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+\r
+\r
+#ifndef APSTUDIO_INVOKED\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Generated from the TEXTINCLUDE 3 resource.\r
+//\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+#endif    // not APSTUDIO_INVOKED\r
+\r
diff --git a/TortoiseUDiff/TortoiseUDiff.rc2 b/TortoiseUDiff/TortoiseUDiff.rc2
new file mode 100644 (file)
index 0000000..d845b12
--- /dev/null
@@ -0,0 +1,50 @@
+//\r
+// TortoiseUDiff.RC2 - resources Microsoft Visual C++ does not edit directly\r
+//\r
+\r
+#ifdef APSTUDIO_INVOKED\r
+#error this file is not editable by Microsoft Visual C++\r
+#endif //APSTUDIO_INVOKED\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// Add manually edited resources here...\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Version\r
+//\r
+#include "..\version.h"\r
+VS_VERSION_INFO VERSIONINFO\r
+ FILEVERSION FILEVER\r
+ PRODUCTVERSION PRODUCTVER\r
+ FILEFLAGSMASK 0x3fL\r
+#ifdef _DEBUG\r
+ FILEFLAGS 0x1L\r
+#else\r
+ FILEFLAGS 0x0L\r
+#endif\r
+ FILEOS 0x4L\r
+ FILETYPE VFT_APP\r
+ FILESUBTYPE 0x0L\r
+BEGIN\r
+    BLOCK "StringFileInfo"\r
+    BEGIN\r
+        BLOCK "040004e4"\r
+        BEGIN\r
+            VALUE "CompanyName", "http://tortoisesvn.net\0"\r
+            VALUE "FileDescription", "TortoiseUDiff\0"\r
+            VALUE "FileVersion", STRFILEVER\r
+            VALUE "InternalName", "TortoiseUDiff.exe\0"\r
+            VALUE "LegalCopyright", "Copyright (C) 2007-2008 - TortoiseSVN\0"\r
+            VALUE "OriginalFilename", "TortoiseUDiff.exe\0"\r
+            VALUE "ProductName", "TortoiseUDiff\0"\r
+            VALUE "ProductVersion", STRPRODUCTVER\r
+        END\r
+    END\r
+    BLOCK "VarFileInfo"\r
+    BEGIN\r
+        VALUE "Translation", 0x400, 1252\r
+    END\r
+END\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
diff --git a/TortoiseUDiff/TortoiseUDiff.vcproj b/TortoiseUDiff/TortoiseUDiff.vcproj
new file mode 100644 (file)
index 0000000..1cb4b64
--- /dev/null
@@ -0,0 +1,467 @@
+<?xml version="1.0" encoding="Windows-1252"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9.00"\r
+       Name="TortoiseUDiff"\r
+       ProjectGUID="{BC5A5F3B-E41A-4C56-B16F-263D2C6D6475}"\r
+       RootNamespace="TortoiseUDiff"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="131072"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+               <Platform\r
+                       Name="x64"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="..\..\bin\Debug\bin"\r
+                       IntermediateDirectory="..\..\obj\TortoiseUDiff\Debug"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\ext\scintilla\include;..\Utils;..\Utils\MiscUI"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="2"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="4"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               LinkIncremental="2"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="..\..\bin\Debug64\bin"\r
+                       IntermediateDirectory="..\..\obj\TortoiseUDiff\Debug64"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\ext\scintilla\include;..\Utils;..\Utils\MiscUI"\r
+                               PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="2"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               LinkIncremental="2"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="..\..\bin\Release\bin"\r
+                       IntermediateDirectory="..\..\obj\TortoiseUDiff\Release"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="..\..\ext\scintilla\include;..\Utils;..\Utils\MiscUI"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="2"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               LinkIncremental="1"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               OptimizeForWindows98="0"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       OutputDirectory="..\..\bin\Release64\bin"\r
+                       IntermediateDirectory="..\..\obj\TortoiseUDiff\Release64"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalIncludeDirectories="..\..\ext\scintilla\include;..\Utils;..\Utils\MiscUI"\r
+                               PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="2"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               LinkIncremental="1"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               OptimizeForWindows98="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\Utils\MiscUI\BaseDialog.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\Utils\MiscUI\BaseWindow.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\Utils\CmdLineParser.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\FindBar.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\MainWindow.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\Utils\Registry.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\stdafx.cpp"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               UsePrecompiledHeader="1"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|x64"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               UsePrecompiledHeader="1"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               UsePrecompiledHeader="1"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|x64"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               UsePrecompiledHeader="1"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\TortoiseUDiff.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\Utils\UnicodeUtils.cpp"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\Utils\MiscUI\BaseDialog.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\Utils\MiscUI\BaseWindow.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\Utils\CmdLineParser.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\FindBar.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\MainWindow.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\Utils\registry.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\Resource.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\stdafx.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\TortoiseUDiff.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\Utils\UnicodeUtils.h"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\Resources\cancel-normal.ico"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\TortoiseUDiff.ico"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\TortoiseUDiff.rc"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/TortoiseUDiff/resource.h b/TortoiseUDiff/resource.h
new file mode 100644 (file)
index 0000000..b8979f7
--- /dev/null
@@ -0,0 +1,38 @@
+//{{NO_DEPENDENCIES}}\r
+// Microsoft Visual C++ generated include file.\r
+// Used by TortoiseUDiff.rc\r
+//\r
+#define IDD_TORTOISEUDIFF_DIALOG        102\r
+#define IDS_APP_TITLE                   103\r
+#define IDM_ABOUT                       104\r
+#define IDS_COMMANDLINEHELP             104\r
+#define IDI_TORTOISEUDIFF               107\r
+#define IDC_TORTOISEUDIFF               109\r
+#define IDR_MAINFRAME                   128\r
+#define IDB_CANCELNORMAL                130\r
+#define IDI_ICON1                       132\r
+#define IDI_CANCELNORMAL                132\r
+#define IDD_FINDBAR                     144\r
+#define IDC_FINDNEXT                    1014\r
+#define IDC_FINDTEXT                    1019\r
+#define IDC_FINDPREV                    1020\r
+#define IDC_MATCHCASECHECK              1021\r
+#define IDC_FINDEXIT                    1022\r
+#define ID_FILE_EXIT                    32771\r
+#define IDM_SHOWFINDBAR                 32787\r
+#define IDM_FINDNEXT                    32789\r
+#define IDM_FINDPREV                    32790\r
+#define IDM_FINDEXIT                    32793\r
+#define IDC_STATIC                      -1\r
+\r
+// Next default values for new objects\r
+// \r
+#ifdef APSTUDIO_INVOKED\r
+#ifndef APSTUDIO_READONLY_SYMBOLS\r
+#define _APS_NO_MFC                     1\r
+#define _APS_NEXT_RESOURCE_VALUE        133\r
+#define _APS_NEXT_COMMAND_VALUE         32773\r
+#define _APS_NEXT_CONTROL_VALUE         1000\r
+#define _APS_NEXT_SYMED_VALUE           110\r
+#endif\r
+#endif\r
diff --git a/TortoiseUDiff/stdafx.cpp b/TortoiseUDiff/stdafx.cpp
new file mode 100644 (file)
index 0000000..85c3d25
--- /dev/null
@@ -0,0 +1,5 @@
+// stdafx.cpp : source file that includes just the standard includes\r
+// TortoiseUDiff.pch will be the pre-compiled header\r
+// stdafx.obj will contain the pre-compiled type information\r
+\r
+#include "stdafx.h"\r
diff --git a/TortoiseUDiff/stdafx.h b/TortoiseUDiff/stdafx.h
new file mode 100644 (file)
index 0000000..73823ba
--- /dev/null
@@ -0,0 +1,40 @@
+// stdafx.h : include file for standard system include files,\r
+// or project specific include files that are used frequently, but\r
+// are changed infrequently\r
+//\r
+\r
+#pragma once\r
+\r
+// Modify the following defines if you have to target a platform prior to the ones specified below.\r
+// Refer to MSDN for the latest info on corresponding values for different platforms.\r
+#ifndef WINVER                         // Allow use of features specific to Windows XP or later.\r
+#define WINVER 0x0501          // Change this to the appropriate value to target other versions of Windows.\r
+#endif\r
+\r
+#ifndef _WIN32_WINNT           // Allow use of features specific to Windows XP or later.                   \r
+#define _WIN32_WINNT 0x0501    // Change this to the appropriate value to target other versions of Windows.\r
+#endif                                         \r
+\r
+#ifndef _WIN32_WINDOWS         // Allow use of features specific to Windows 98 or later.\r
+#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.\r
+#endif\r
+\r
+#ifndef _WIN32_IE                      // Allow use of features specific to IE 6.0 or later.\r
+#define _WIN32_IE 0x0600       // Change this to the appropriate value to target other versions of IE.\r
+#endif\r
+\r
+#define WIN32_LEAN_AND_MEAN            // Exclude rarely-used stuff from Windows headers\r
+// Windows Header Files:\r
+#include <windows.h>\r
+\r
+// C RunTime Header Files\r
+#include <stdlib.h>\r
+#include <malloc.h>\r
+#include <memory.h>\r
+#include <tchar.h>\r
+\r
+\r
+#define COMMITMONITOR_FINDMSGPREV       (WM_APP+1)\r
+#define COMMITMONITOR_FINDMSGNEXT       (WM_APP+2)\r
+#define COMMITMONITOR_FINDEXIT          (WM_APP+3)\r
+#define COMMITMONITOR_FINDRESET                        (WM_APP+4)\r