xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Far/OverwriteDialogFar.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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