aboutsummaryrefslogtreecommitdiff
path: root/CPP/7zip/UI/Far/OverwriteDialogFar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'CPP/7zip/UI/Far/OverwriteDialogFar.cpp')
-rw-r--r--CPP/7zip/UI/Far/OverwriteDialogFar.cpp145
1 files changed, 145 insertions, 0 deletions
diff --git a/CPP/7zip/UI/Far/OverwriteDialogFar.cpp b/CPP/7zip/UI/Far/OverwriteDialogFar.cpp
new file mode 100644
index 0000000..b8fc565
--- /dev/null
+++ b/CPP/7zip/UI/Far/OverwriteDialogFar.cpp
@@ -0,0 +1,145 @@
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
18using namespace NWindows;
19using namespace NFar;
20
21namespace NOverwriteDialog {
22
23struct CFileInfoStrings
24{
25 AString Size;
26 AString Time;
27};
28
29static 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 += ' ';
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[32];
50 ConvertUtcFileTimeToString(fileInfo.Time, timeString);
51 fileInfoStrings.Time = g_StartupInfo.GetMsgString(NMessageID::kOverwriteModifiedOn);
52 fileInfoStrings.Time += ' ';
53 fileInfoStrings.Time += timeString;
54 }
55}
56
57static 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
68NResult::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 AString pref1A (UnicodeStringToMultiByte(pref1, CP_OEMCP));
100 AString pref2A (UnicodeStringToMultiByte(pref2, CP_OEMCP));
101 AString name1A (UnicodeStringToMultiByte(name1, CP_OEMCP));
102 AString name2A (UnicodeStringToMultiByte(name2, CP_OEMCP));
103
104 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 = ARRAY_SIZE(initItems);
135 FarDialogItem aDialogItems[kNumDialogItems];
136 g_StartupInfo.InitDialogItems(initItems, aDialogItems, kNumDialogItems);
137 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}