OSDN Git Service

Merge pull request #23 from GreyMerlin/bugfix/3WayBinary
[winmerge-jp/winmerge-jp.git] / Src / MergeApp.cpp
1 #include "StdAfx.h"
2 #include "MergeApp.h"
3 #include "Merge.h"
4 #include "version.h"
5 #include "paths.h"
6 #include "Constants.h"
7 #include "unicoder.h"
8
9 // Get user language description of error, if available
10 String GetSysError(int nerr /* =-1 */)
11 {
12         if (nerr == -1)
13                 nerr = GetLastError();
14         LPVOID lpMsgBuf;
15         String str = _T("?");
16         if (FormatMessage( 
17                 FORMAT_MESSAGE_ALLOCATE_BUFFER | 
18                 FORMAT_MESSAGE_FROM_SYSTEM | 
19                 FORMAT_MESSAGE_IGNORE_INSERTS,
20                 NULL,
21                 nerr,
22                 0, // Default language
23                 (LPTSTR) &lpMsgBuf,
24                 0,
25                 NULL 
26                 ))
27         {
28                 str = (LPCTSTR)lpMsgBuf;
29                 // Free the buffer.
30                 LocalFree( lpMsgBuf );
31         }
32         return str;
33 }
34
35 /**
36  * @brief Get Options Manager.
37  * @return Pointer to OptionsMgr.
38  */
39 COptionsMgr * GetOptionsMgr()
40 {
41         CMergeApp *pApp = static_cast<CMergeApp *>(AfxGetApp());
42         return pApp->GetMergeOptionsMgr();
43 }
44
45 // Send message to log and debug window
46 void LogErrorString(const String& sz)
47 {
48         if (sz.empty()) return;
49         CString now = COleDateTime::GetCurrentTime().Format();
50         TRACE(_T("%s: %s\n"), (LPCTSTR)now, sz.c_str());
51 }
52
53 // Send message to log and debug window
54 void LogErrorStringUTF8(const std::string& sz)
55 {
56         if (sz.empty()) return;
57         String str = ucr::toTString(sz);
58         CString now = COleDateTime::GetCurrentTime().Format();
59         TRACE(_T("%s: %s\n"), (LPCTSTR)now, str.c_str());
60 }
61
62 /**
63  * @brief Load string resource and return as CString.
64  * @param [in] id Resource string ID.
65  * @return Resource string as CString.
66  */
67 String LoadResString(unsigned id)
68 {
69         return theApp.LoadString(id);
70 }
71
72 String tr(const std::string &str)
73 {
74         String translated_str;
75         theApp.TranslateString(str, translated_str);
76         return translated_str;
77 }
78
79 void AppErrorMessageBox(const String& msg)
80 {
81         AppMsgBox::error(msg);
82 }
83
84 namespace AppMsgBox
85 {
86
87 namespace detail
88 {
89         int convert_to_winflags(int flags)
90         {
91                 int newflags = 0;
92
93                 if ((flags & (YES | NO | CANCEL)) == (YES | NO | CANCEL)) newflags |= MB_YESNOCANCEL;
94                 else if ((flags & (YES | NO)) == (YES | NO)) newflags |= MB_YESNO;
95                 else if ((flags & (OK | CANCEL)) == (OK | CANCEL)) newflags |= MB_OKCANCEL;
96                 else if ((flags & OK) == OK) newflags |= MB_OK;
97         
98                 if (flags & YES_TO_ALL) newflags |= MB_YES_TO_ALL;
99                 if (flags & DONT_DISPLAY_AGAIN) newflags |= MB_DONT_DISPLAY_AGAIN;
100
101                 return newflags;
102         }
103
104         int convert_resp(int resp)
105         {
106                 switch (resp)
107                 {
108                 case IDOK:
109                         return OK;
110                 case IDCANCEL:
111                         return CANCEL;
112                 case IDNO:
113                         return NO;
114                 case IDYES:
115                         return YES;
116                 case IDYESTOALL:
117                         return YES_TO_ALL;
118                 default:
119                         return OK;
120                 }
121         }
122 }
123
124 int error(const String& msg, int type)
125 {
126         return detail::convert_resp(AfxMessageBox(msg.c_str(), detail::convert_to_winflags(type) | MB_ICONSTOP));
127 }
128
129 int warning(const String& msg, int type)
130 {
131         return detail::convert_resp(AfxMessageBox(msg.c_str(), detail::convert_to_winflags(type) | MB_ICONWARNING));
132 }
133
134 int information(const String& msg, int type)
135 {
136         return detail::convert_resp(AfxMessageBox(msg.c_str(), detail::convert_to_winflags(type) | MB_ICONINFORMATION));
137 }
138
139 }
140
141 AboutInfo::AboutInfo()
142 {
143         CVersionInfo verinfo;
144         version = strutils::format_string1(_("Version %1"), verinfo.GetProductVersion());
145         if (version.find(_T(" - ")) != String::npos)
146         {
147                 strutils::replace(version, _T(" - "), _T("\n"));
148                 version += _T(" ");
149         }
150         else
151         {
152                 version += _T("\n");
153         }
154 #ifdef _UNICODE
155         version += _T(" ");
156         version += _("Unicode");
157 #endif
158
159 #if defined _M_IX86
160         version += _T(" ");
161         version += _("x86");
162 #elif defined _M_IA64
163         version += _T(" IA64");
164 #elif defined _M_X64
165         version += _T(" ");
166         version += _("X64");
167 #endif
168
169 #if defined _DEBUG
170         version += _T(" (");
171         version += _("Debug");
172         version += _T(")");
173 #endif
174
175         copyright = _("WinMerge comes with ABSOLUTELY NO WARRANTY. This is free software and you are welcome to redistribute it under certain circumstances; see the GNU General Public License in the Help menu for details.");
176         copyright += _T("\n");
177         copyright += verinfo.GetLegalCopyright();
178         copyright += _T(" - All rights reserved.");
179
180         private_build = verinfo.GetPrivateBuild();
181         if (!private_build.empty())
182         {
183                 private_build = strutils::format_string1(_("Private Build: %1"), private_build);
184         }
185
186         website = WinMergeURL;
187
188         developers = _("Developers:\nDean Grimm, Christian List, Kimmo Varis, Jochen Tucht, Tim Gerundt, Takashi Sawanaki, Gal Hammer, Alexander Skinner");
189         strutils::replace(developers, _T(", "), _T("\n"));
190 }