1 // OverwriteDialog.cpp
2 
3 #include "StdAfx.h"
4 
5 #include "../../../Common/StringConvert.h"
6 
7 #include "../../../Windows/PropVariantConv.h"
8 #include "../../../Windows/ResourceString.h"
9 
10 #include "../../../Windows/Control/Static.h"
11 
12 #include "FormatUtils.h"
13 #include "LangUtils.h"
14 #include "OverwriteDialog.h"
15 
16 #include "PropertyNameRes.h"
17 
18 using namespace NWindows;
19 
20 #ifdef LANG
21 static const UInt32 kLangIDs[] =
22 {
23   IDT_OVERWRITE_HEADER,
24   IDT_OVERWRITE_QUESTION_BEGIN,
25   IDT_OVERWRITE_QUESTION_END,
26   IDB_YES_TO_ALL,
27   IDB_NO_TO_ALL,
28   IDB_AUTO_RENAME
29 };
30 #endif
31 
32 static const unsigned kCurrentFileNameSizeLimit = 82;
33 static const unsigned kCurrentFileNameSizeLimit2 = 30;
34 
ReduceString(UString & s)35 void COverwriteDialog::ReduceString(UString &s)
36 {
37   unsigned size = _isBig ? kCurrentFileNameSizeLimit : kCurrentFileNameSizeLimit2;
38   if (s.Len() > size)
39   {
40     s.Delete(size / 2, s.Len() - size);
41     s.Insert(size / 2, L" ... ");
42   }
43 }
44 
SetFileInfoControl(int textID,int iconID,const NOverwriteDialog::CFileInfo & fileInfo)45 void COverwriteDialog::SetFileInfoControl(int textID, int iconID,
46     const NOverwriteDialog::CFileInfo &fileInfo)
47 {
48   UString sizeString;
49   if (fileInfo.SizeIsDefined)
50     sizeString = MyFormatNew(IDS_FILE_SIZE, NumberToString(fileInfo.Size));
51 
52   const UString &fileName = fileInfo.Name;
53   int slashPos = fileName.ReverseFind(WCHAR_PATH_SEPARATOR);
54   UString s1 = fileName.Left(slashPos + 1);
55   UString s2 = fileName.Ptr(slashPos + 1);
56 
57   ReduceString(s1);
58   ReduceString(s2);
59 
60   UString s = s1;
61   s += L'\n';
62   s += s2;
63   s += L'\n';
64   s += sizeString;
65   s += L'\n';
66 
67   if (fileInfo.TimeIsDefined)
68   {
69     FILETIME localFileTime;
70     if (!FileTimeToLocalFileTime(&fileInfo.Time, &localFileTime))
71       throw 4190402;
72     s += LangString(IDS_PROP_MTIME);
73     s += L": ";
74     wchar_t t[32];
75     ConvertFileTimeToString(localFileTime, t);
76     s += t;
77   }
78 
79   NControl::CDialogChildControl control;
80   control.Init(*this, textID);
81   control.SetText(s);
82 
83   SHFILEINFO shellFileInfo;
84   if (::SHGetFileInfo(
85       GetSystemString(fileInfo.Name), FILE_ATTRIBUTE_NORMAL, &shellFileInfo,
86       sizeof(shellFileInfo), SHGFI_ICON | SHGFI_USEFILEATTRIBUTES | SHGFI_LARGEICON))
87   {
88     NControl::CStatic staticContol;
89     staticContol.Attach(GetItem(iconID));
90     staticContol.SetIcon(shellFileInfo.hIcon);
91   }
92 }
93 
OnInit()94 bool COverwriteDialog::OnInit()
95 {
96   #ifdef LANG
97   LangSetWindowText(*this, IDD_OVERWRITE);
98   LangSetDlgItems(*this, kLangIDs, ARRAY_SIZE(kLangIDs));
99   #endif
100   SetFileInfoControl(IDT_OVERWRITE_OLD_FILE_SIZE_TIME, IDI_OVERWRITE_OLD_FILE, OldFileInfo);
101   SetFileInfoControl(IDT_OVERWRITE_NEW_FILE_SIZE_TIME, IDI_OVERWRITE_NEW_FILE, NewFileInfo);
102   NormalizePosition();
103   return CModalDialog::OnInit();
104 }
105 
OnButtonClicked(int buttonID,HWND buttonHWND)106 bool COverwriteDialog::OnButtonClicked(int buttonID, HWND buttonHWND)
107 {
108   switch (buttonID)
109   {
110     case IDYES:
111     case IDNO:
112     case IDB_YES_TO_ALL:
113     case IDB_NO_TO_ALL:
114     case IDB_AUTO_RENAME:
115       End(buttonID);
116       return true;
117   }
118   return CModalDialog::OnButtonClicked(buttonID, buttonHWND);
119 }
120