Merge branch 'drag-handler'
[TortoiseGit.git] / src / TortoiseIDiff / TortoiseIDiff.cpp
blob84dd8ca83d0f55857ccf3b776c599fa4f9134220
1 // TortoiseIDiff - an image diff viewer in TortoiseSVN and TortoiseGit
3 // Copyright (C) 2015 - TortoiseGit
4 // Copyright (C) 2006-2007, 2010-2014 - TortoiseSVN
6 // This program is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU General Public License
8 // as published by the Free Software Foundation; either version 2
9 // of the License, or (at your option) any later version.
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the Free Software Foundation,
18 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include "stdafx.h"
21 #include "MainWindow.h"
22 #include "CmdLineParser.h"
23 #include "registry.h"
24 #include "LangDll.h"
25 #include "TortoiseIDiff.h"
26 #include "TaskbarUUID.h"
27 #include <Shellapi.h>
29 #pragma comment(linker, "\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
31 // Global Variables:
32 HINSTANCE hInst; // current instance
33 HINSTANCE hResource; // the resource dll
34 HCURSOR curHand;
35 HCURSOR curHandDown;
37 int APIENTRY _tWinMain(HINSTANCE hInstance,
38 HINSTANCE /*hPrevInstance*/,
39 LPTSTR lpCmdLine,
40 int /*nCmdShow*/)
42 SetDllDirectory(L"");
43 SetTaskIDPerUUID();
44 CRegStdDWORD loc = CRegStdDWORD(_T("Software\\TortoiseGit\\LanguageID"), 1033);
45 long langId = loc;
46 CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
48 CLangDll langDLL;
49 hResource = langDLL.Init(_T("TortoiseIDiff"), langId);
50 if (hResource == NULL)
51 hResource = hInstance;
53 git_libgit2_init();
55 CCmdLineParser parser(lpCmdLine);
57 if (parser.HasKey(_T("?")) || parser.HasKey(_T("help")))
59 TCHAR buf[1024] = { 0 };
60 LoadString(hResource, IDS_COMMANDLINEHELP, buf, _countof(buf));
61 MessageBox(NULL, buf, _T("TortoiseIDiff"), MB_ICONINFORMATION);
62 langDLL.Close();
63 return 0;
67 MSG msg;
68 hInst = hInstance;
70 INITCOMMONCONTROLSEX used = {
71 sizeof(INITCOMMONCONTROLSEX),
72 ICC_STANDARD_CLASSES | ICC_BAR_CLASSES | ICC_WIN95_CLASSES
74 InitCommonControlsEx(&used);
76 // load the cursors we need
77 curHand = (HCURSOR)LoadImage(hInst, MAKEINTRESOURCE(IDC_PANCUR), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE);
78 curHandDown = (HCURSOR)LoadImage(hInst, MAKEINTRESOURCE(IDC_PANDOWNCUR), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE);
80 auto mainWindow = std::make_unique<CMainWindow>(hResource);
81 mainWindow->SetRegistryPath(_T("Software\\TortoiseGit\\TortoiseIDiffWindowPos"));
82 std::wstring leftfile = parser.HasVal(_T("left")) ? parser.GetVal(_T("left")) : _T("");
83 std::wstring rightfile = parser.HasVal(_T("right")) ? parser.GetVal(_T("right")) : _T("");
84 if ((leftfile.empty()) && (lpCmdLine[0] != 0))
86 int nArgs;
87 LPWSTR * szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
88 if (szArglist)
90 if (nArgs == 3)
92 // Four parameters:
93 // [0]: Program name
94 // [1]: left file
95 // [2]: right file
96 if (PathFileExists(szArglist[1]) && PathFileExists(szArglist[2]))
98 leftfile = szArglist[1];
99 rightfile = szArglist[2];
104 // Free memory allocated for CommandLineToArgvW arguments.
105 LocalFree(szArglist);
107 mainWindow->SetLeft(leftfile.c_str(), parser.HasVal(_T("lefttitle")) ? parser.GetVal(_T("lefttitle")) : _T(""));
108 mainWindow->SetRight(rightfile.c_str(), parser.HasVal(_T("righttitle")) ? parser.GetVal(_T("righttitle")) : _T(""));
109 if (parser.HasVal(L"base"))
110 mainWindow->SetSelectionImage(FileTypeBase, parser.GetVal(L"base"), parser.HasVal(L"basetitle") ? parser.GetVal(L"basetitle") : L"");
111 if (parser.HasVal(L"mine"))
112 mainWindow->SetSelectionImage(FileTypeMine, parser.GetVal(L"mine"), parser.HasVal(L"minetitle") ? parser.GetVal(L"minetitle") : L"");
113 if (parser.HasVal(L"theirs"))
114 mainWindow->SetSelectionImage(FileTypeTheirs, parser.GetVal(L"theirs"), parser.HasVal(L"theirstitle") ? parser.GetVal(L"theirstitle") : L"");
115 if (parser.HasVal(L"result"))
116 mainWindow->SetSelectionResult(parser.GetVal(L"result"));
117 mainWindow->resolveMsgWnd = parser.HasVal(L"resolvemsghwnd") ? (HWND)parser.GetLongLongVal(L"resolvemsghwnd") : 0;
118 mainWindow->resolveMsgWParam = parser.HasVal(L"resolvemsgwparam") ? (WPARAM)parser.GetLongLongVal(L"resolvemsgwparam") : 0;
119 mainWindow->resolveMsgLParam = parser.HasVal(L"resolvemsglparam") ? (LPARAM)parser.GetLongLongVal(L"resolvemsglparam") : 0;
120 if (mainWindow->RegisterAndCreateWindow())
122 HACCEL hAccelTable = LoadAccelerators(hResource, MAKEINTRESOURCE(IDR_TORTOISEIDIFF));
123 if (!parser.HasVal(L"left") && parser.HasVal(L"base") && !parser.HasVal(L"mine") && !parser.HasVal(L"theirs"))
125 PostMessage(*mainWindow, WM_COMMAND, ID_FILE_OPEN, 0);
127 if (parser.HasKey(_T("overlay")))
129 PostMessage(*mainWindow, WM_COMMAND, ID_VIEW_OVERLAPIMAGES, 0);
131 if (parser.HasKey(_T("fit")))
133 PostMessage(*mainWindow, WM_COMMAND, ID_VIEW_FITIMAGEHEIGHTS, 0);
134 PostMessage(*mainWindow, WM_COMMAND, ID_VIEW_FITIMAGEWIDTHS, 0);
136 if (parser.HasKey(_T("fitwidth")))
138 PostMessage(*mainWindow, WM_COMMAND, ID_VIEW_FITIMAGEWIDTHS, 0);
140 if (parser.HasKey(_T("fitheight")))
142 PostMessage(*mainWindow, WM_COMMAND, ID_VIEW_FITIMAGEHEIGHTS, 0);
144 if (parser.HasKey(_T("showinfo")))
146 PostMessage(*mainWindow, WM_COMMAND, ID_VIEW_IMAGEINFO, 0);
148 // Main message loop:
149 while (GetMessage(&msg, NULL, 0, 0))
151 if (!TranslateAccelerator(*mainWindow, hAccelTable, &msg))
153 TranslateMessage(&msg);
154 DispatchMessage(&msg);
157 return (int) msg.wParam;
159 langDLL.Close();
160 DestroyCursor(curHand);
161 DestroyCursor(curHandDown);
162 CoUninitialize();
163 git_libgit2_shutdown();
164 return 1;