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