1 // OverwriteDialogFar.cpp
2
3 #include "StdAfx.h"
4
5 #include <stdio.h>
6
7 #include "../../../Common/StringConvert.h"
8 #include "../../../Common/IntToString.h"
9
10 #include "../../../Windows/FileName.h"
11 #include "../../../Windows/PropVariantConv.h"
12
13 #include "FarUtils.h"
14 #include "Messages.h"
15
16 #include "OverwriteDialogFar.h"
17
18 using namespace NWindows;
19 using namespace NFar;
20
21 namespace NOverwriteDialog {
22
23 struct CFileInfoStrings
24 {
25 AString Size;
26 AString Time;
27 };
28
SetFileInfoStrings(const CFileInfo & fileInfo,CFileInfoStrings & fileInfoStrings)29 static void SetFileInfoStrings(const CFileInfo &fileInfo,
30 CFileInfoStrings &fileInfoStrings)
31 {
32 char buffer[256];
33
34 if (fileInfo.SizeIsDefined)
35 {
36 ConvertUInt64ToString(fileInfo.Size, buffer);
37 fileInfoStrings.Size = buffer;
38 fileInfoStrings.Size.Add_Space();
39 fileInfoStrings.Size += g_StartupInfo.GetMsgString(NMessageID::kOverwriteBytes);
40 }
41 else
42 {
43 fileInfoStrings.Size = "";
44 }
45
46 fileInfoStrings.Time.Empty();
47 if (fileInfo.TimeIsDefined)
48 {
49 char timeString[64];
50 ConvertUtcFileTimeToString(fileInfo.Time, timeString);
51 fileInfoStrings.Time = g_StartupInfo.GetMsgString(NMessageID::kOverwriteModifiedOn);
52 fileInfoStrings.Time.Add_Space();
53 fileInfoStrings.Time += timeString;
54 }
55 }
56
ReduceString2(UString & s,unsigned size)57 static void ReduceString2(UString &s, unsigned size)
58 {
59 if (!s.IsEmpty() && s.Back() == ' ')
60 {
61 // s += (wchar_t)(0x2423);
62 s.InsertAtFront(L'\"');
63 s += L'\"';
64 }
65 ReduceString(s, size);
66 }
67
Execute(const CFileInfo & oldFileInfo,const CFileInfo & newFileInfo)68 NResult::EEnum Execute(const CFileInfo &oldFileInfo, const CFileInfo &newFileInfo)
69 {
70 const int kYSize = 22;
71 const int kXSize = 76;
72
73 CFileInfoStrings oldFileInfoStrings;
74 CFileInfoStrings newFileInfoStrings;
75
76 SetFileInfoStrings(oldFileInfo, oldFileInfoStrings);
77 SetFileInfoStrings(newFileInfo, newFileInfoStrings);
78
79 const UString &oldName2 = oldFileInfo.Name;
80 const UString &newName2 = newFileInfo.Name;
81
82 int slashPos = oldName2.ReverseFind_PathSepar();
83 UString pref1 = oldName2.Left(slashPos + 1);
84 UString name1 = oldName2.Ptr(slashPos + 1);
85
86 slashPos = newName2.ReverseFind_PathSepar();
87 UString pref2 = newName2.Left(slashPos + 1);
88 UString name2 = newName2.Ptr(slashPos + 1);
89
90 const unsigned kNameOffset = 2;
91 {
92 const unsigned maxNameLen = kXSize - 9 - 2;
93 ReduceString(pref1, maxNameLen);
94 ReduceString(pref2, maxNameLen);
95 ReduceString2(name1, maxNameLen - kNameOffset);
96 ReduceString2(name2, maxNameLen - kNameOffset);
97 }
98
99 const AString pref1A (UnicodeStringToMultiByte(pref1, CP_OEMCP));
100 const AString pref2A (UnicodeStringToMultiByte(pref2, CP_OEMCP));
101 const AString name1A (UnicodeStringToMultiByte(name1, CP_OEMCP));
102 const AString name2A (UnicodeStringToMultiByte(name2, CP_OEMCP));
103
104 const struct CInitDialogItem initItems[]={
105 { DI_DOUBLEBOX, 3, 1, kXSize - 4, kYSize - 2, false, false, 0, false, NMessageID::kOverwriteTitle, NULL, NULL },
106 { DI_TEXT, 5, 2, 0, 0, false, false, 0, false, NMessageID::kOverwriteMessage1, NULL, NULL },
107
108 { DI_TEXT, 3, 3, 0, 0, false, false, DIF_BOXCOLOR|DIF_SEPARATOR, false, -1, "", NULL },
109
110 { DI_TEXT, 5, 4, 0, 0, false, false, 0, false, NMessageID::kOverwriteMessageWouldYouLike, NULL, NULL },
111
112 { DI_TEXT, 7, 6, 0, 0, false, false, 0, false, -1, pref1A, NULL },
113 { DI_TEXT, 7 + kNameOffset, 7, 0, 0, false, false, 0, false, -1, name1A, NULL },
114 { DI_TEXT, 7, 8, 0, 0, false, false, 0, false, -1, oldFileInfoStrings.Size, NULL },
115 { DI_TEXT, 7, 9, 0, 0, false, false, 0, false, -1, oldFileInfoStrings.Time, NULL },
116
117 { DI_TEXT, 5, 11, 0, 0, false, false, 0, false, NMessageID::kOverwriteMessageWithtTisOne, NULL, NULL },
118
119 { DI_TEXT, 7, 13, 0, 0, false, false, 0, false, -1, pref2A, NULL },
120 { DI_TEXT, 7 + kNameOffset, 14, 0, 0, false, false, 0, false, -1, name2A, NULL },
121 { DI_TEXT, 7, 15, 0, 0, false, false, 0, false, -1, newFileInfoStrings.Size, NULL },
122 { DI_TEXT, 7, 16, 0, 0, false, false, 0, false, -1, newFileInfoStrings.Time, NULL },
123
124 { DI_TEXT, 3, kYSize - 5, 0, 0, false, false, DIF_BOXCOLOR|DIF_SEPARATOR, false, -1, "", NULL },
125
126 { DI_BUTTON, 0, kYSize - 4, 0, 0, true, false, DIF_CENTERGROUP, true, NMessageID::kOverwriteYes, NULL, NULL },
127 { DI_BUTTON, 0, kYSize - 4, 0, 0, false, false, DIF_CENTERGROUP, false, NMessageID::kOverwriteYesToAll, NULL, NULL },
128 { DI_BUTTON, 0, kYSize - 4, 0, 0, false, false, DIF_CENTERGROUP, false, NMessageID::kOverwriteNo, NULL, NULL },
129 { DI_BUTTON, 0, kYSize - 4, 0, 0, false, false, DIF_CENTERGROUP, false, NMessageID::kOverwriteNoToAll, NULL, NULL },
130 { DI_BUTTON, 0, kYSize - 3, 0, 0, false, false, DIF_CENTERGROUP, false, NMessageID::kOverwriteAutoRename, NULL, NULL },
131 { DI_BUTTON, 0, kYSize - 3, 0, 0, false, false, DIF_CENTERGROUP, false, NMessageID::kOverwriteCancel, NULL, NULL }
132 };
133
134 const int kNumDialogItems = Z7_ARRAY_SIZE(initItems);
135 FarDialogItem aDialogItems[kNumDialogItems];
136 g_StartupInfo.InitDialogItems(initItems, aDialogItems, kNumDialogItems);
137 const int anAskCode = g_StartupInfo.ShowDialog(kXSize, kYSize,
138 NULL, aDialogItems, kNumDialogItems);
139 const int kButtonStartPos = kNumDialogItems - 6;
140 if (anAskCode >= kButtonStartPos && anAskCode < kNumDialogItems)
141 return NResult::EEnum(anAskCode - kButtonStartPos);
142 return NResult::kCancel;
143 }
144
145 }
146