Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/elfmz/far2l.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelfmz <fenix1905@tut.by>2022-07-10 17:36:43 +0300
committerelfmz <fenix1905@tut.by>2022-07-10 19:42:01 +0300
commit23d2f58c03605ff711c021fe64550ac6f56d0d0a (patch)
tree9d2bfa7630e5f1065205681e6bc905c9650c4a62 /far2l/src/setattr.cpp
parentf12748d203c02b6207651657a9f3c248bc9def43 (diff)
Edit attributes dialog: add chattr/chflags stuff
Diffstat (limited to 'far2l/src/setattr.cpp')
-rw-r--r--far2l/src/setattr.cpp362
1 files changed, 170 insertions, 192 deletions
diff --git a/far2l/src/setattr.cpp b/far2l/src/setattr.cpp
index 7c18cac6..829de581 100644
--- a/far2l/src/setattr.cpp
+++ b/far2l/src/setattr.cpp
@@ -55,7 +55,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "wakeful.hpp"
#include "DlgGuid.hpp"
#include "execute.hpp"
-
+#include "FSFileFlags.h"
enum SETATTRDLG
{
@@ -67,12 +67,17 @@ enum SETATTRDLG
SA_EDIT_OWNER,
SA_TEXT_GROUP,
SA_EDIT_GROUP,
+
SA_SEPARATOR2,
+ SA_CHECKBOX_IMMUTABLE,
+#if defined(__APPLE__) || defined(__FreeBSD__)
+ SA_CHECKBOX_UNDELETABLE,
+ SA_CHECKBOX_HIDDEN,
+#endif
SA_TEXT_MODE_USER,
SA_TEXT_MODE_GROUP,
SA_TEXT_MODE_OTHER,
- SA_ATTR_FIRST,
- SA_CHECKBOX_USER_READ = SA_ATTR_FIRST,
+ SA_CHECKBOX_USER_READ,
SA_CHECKBOX_USER_WRITE,
SA_CHECKBOX_USER_EXECUTE,
SA_CHECKBOX_GROUP_READ,
@@ -80,8 +85,7 @@ enum SETATTRDLG
SA_CHECKBOX_GROUP_EXECUTE,
SA_CHECKBOX_OTHER_READ,
SA_CHECKBOX_OTHER_WRITE,
- SA_ATTR_LAST,
- SA_CHECKBOX_OTHER_EXECUTE = SA_ATTR_LAST,
+ SA_CHECKBOX_OTHER_EXECUTE,
SA_SEPARATOR3,
SA_TEXT_TITLEDATE,
SA_TEXT_LAST_ACCESS,
@@ -100,10 +104,47 @@ enum SETATTRDLG
SA_CHECKBOX_SUBFOLDERS,
SA_SEPARATOR5,
SA_BUTTON_SET,
- SA_BUTTON_SYSTEMDLG,
+ SA_BUTTON_BRIEFINFO,
SA_BUTTON_CANCEL
};
+static const struct MODEPAIR
+{
+ SETATTRDLG Item;
+ mode_t Mode;
+}
+AP[]=
+{
+ {SA_CHECKBOX_USER_READ, S_IRUSR },
+ {SA_CHECKBOX_USER_WRITE, S_IWUSR },
+ {SA_CHECKBOX_USER_EXECUTE, S_IXUSR },
+ {SA_CHECKBOX_GROUP_READ, S_IRGRP },
+ {SA_CHECKBOX_GROUP_WRITE, S_IWGRP },
+ {SA_CHECKBOX_GROUP_EXECUTE, S_IXGRP },
+ {SA_CHECKBOX_OTHER_READ, S_IROTH },
+ {SA_CHECKBOX_OTHER_WRITE, S_IWOTH },
+ {SA_CHECKBOX_OTHER_EXECUTE, S_IXOTH },
+};
+
+#define EDITABLE_MODES (S_IXOTH | S_IWOTH | S_IROTH | S_IXGRP | S_IWGRP | S_IRGRP | S_IXUSR | S_IWUSR | S_IRUSR)
+
+static const int PreserveOriginalIDs[] = {
+ SA_CHECKBOX_IMMUTABLE,
+#if defined(__APPLE__) || defined(__FreeBSD__)
+ SA_CHECKBOX_UNDELETABLE,
+ SA_CHECKBOX_HIDDEN,
+#endif
+ SA_CHECKBOX_USER_READ,
+ SA_CHECKBOX_USER_WRITE,
+ SA_CHECKBOX_USER_EXECUTE,
+ SA_CHECKBOX_GROUP_READ,
+ SA_CHECKBOX_GROUP_WRITE,
+ SA_CHECKBOX_GROUP_EXECUTE,
+ SA_CHECKBOX_OTHER_READ,
+ SA_CHECKBOX_OTHER_WRITE
+};
+
+
enum DIALOGMODE
{
MODE_FILE,
@@ -121,15 +162,24 @@ struct SetAttrDlgParam
FARString strGroup;
bool OwnerChanged, GroupChanged;
// значения CheckBox`ов на момент старта диалога
- int OriginalCBAttr[SA_ATTR_LAST-SA_ATTR_FIRST+1];
- int OriginalCBAttr2[SA_ATTR_LAST-SA_ATTR_FIRST+1];
- DWORD OriginalCBFlag[SA_ATTR_LAST-SA_ATTR_FIRST+1];
+ int OriginalCBAttr[ARRAYSIZE(PreserveOriginalIDs)];
+ int OriginalCBAttr2[ARRAYSIZE(PreserveOriginalIDs)];
+ DWORD OriginalCBFlag[ARRAYSIZE(PreserveOriginalIDs)];
FARCHECKEDSTATE OSubfoldersState;
bool OAccessTime, OModifyTime, OStatusChangeTime;
};
#define DM_SETATTR (DM_USER+1)
+static int DialogID2PreservedOriginalIndex(int id)
+{
+ for (size_t i = 0; i < ARRAYSIZE(PreserveOriginalIDs); ++i)
+ {
+ if (PreserveOriginalIDs[i] == id)
+ return i;
+ }
+ return -1;
+}
static void BlankEditIfChanged(HANDLE hDlg,int EditControl, FARString &Remembered, bool &Changed)
{
@@ -146,17 +196,18 @@ static void BlankEditIfChanged(HANDLE hDlg,int EditControl, FARString &Remembere
LONG_PTR WINAPI SetAttrDlgProc(HANDLE hDlg,int Msg,int Param1,LONG_PTR Param2)
{
SetAttrDlgParam *DlgParam=reinterpret_cast<SetAttrDlgParam*>(SendDlgMessage(hDlg,DM_GETDLGDATA,0,0));
+ int OrigIdx;
switch (Msg)
{
case DN_BTNCLICK:
-
- if ((Param1>=SA_ATTR_FIRST&&Param1<=SA_ATTR_LAST)||Param1==SA_CHECKBOX_SUBFOLDERS)
+ OrigIdx = DialogID2PreservedOriginalIndex(Param1);
+ if (OrigIdx != -1 || Param1 == SA_CHECKBOX_SUBFOLDERS)
{
- if(Param1!=SA_CHECKBOX_SUBFOLDERS)
+ if (OrigIdx != -1)
{
- DlgParam->OriginalCBAttr[Param1-SA_ATTR_FIRST]=static_cast<int>(Param2);
- DlgParam->OriginalCBAttr2[Param1-SA_ATTR_FIRST]=0;
+ DlgParam->OriginalCBAttr[OrigIdx] = static_cast<int>(Param2);
+ DlgParam->OriginalCBAttr2[OrigIdx] = 0;
}
int FocusPos=static_cast<int>(SendDlgMessage(hDlg,DM_GETFOCUS,0,0));
FARCHECKEDSTATE SubfoldersState=static_cast<FARCHECKEDSTATE>(SendDlgMessage(hDlg,DM_GETCHECK,SA_CHECKBOX_SUBFOLDERS,0));
@@ -175,12 +226,12 @@ LONG_PTR WINAPI SetAttrDlgProc(HANDLE hDlg,int Msg,int Param1,LONG_PTR Param2)
// установили?
if (SubfoldersState != BSTATE_UNCHECKED)
{
- for (int i=SA_ATTR_FIRST; i<=SA_ATTR_LAST; i++)
+ for (size_t i = 0; i < ARRAYSIZE(PreserveOriginalIDs); ++i)
{
- SendDlgMessage(hDlg,DM_SET3STATE,i,TRUE);
- if (DlgParam->OriginalCBAttr2[i-SA_ATTR_FIRST]==-1)
+ SendDlgMessage(hDlg, DM_SET3STATE, PreserveOriginalIDs[i], TRUE);
+ if (DlgParam->OriginalCBAttr2[i] == -1)
{
- SendDlgMessage(hDlg,DM_SETCHECK,i,BSTATE_3STATE);
+ SendDlgMessage(hDlg, DM_SETCHECK, PreserveOriginalIDs[i], BSTATE_3STATE);
}
}
@@ -190,10 +241,10 @@ LONG_PTR WINAPI SetAttrDlgProc(HANDLE hDlg,int Msg,int Param1,LONG_PTR Param2)
// сняли?
else
{
- for (int i=SA_ATTR_FIRST; i<=SA_ATTR_LAST; i++)
+ for (size_t i = 0; i < ARRAYSIZE(PreserveOriginalIDs); ++i)
{
- SendDlgMessage(hDlg,DM_SET3STATE,i,FALSE);
- SendDlgMessage(hDlg,DM_SETCHECK,i,DlgParam->OriginalCBAttr[i-SA_ATTR_FIRST]);
+ SendDlgMessage(hDlg, DM_SET3STATE, PreserveOriginalIDs[i], FALSE);
+ SendDlgMessage(hDlg, DM_SETCHECK, PreserveOriginalIDs[i], DlgParam->OriginalCBAttr[i]);
}
SendDlgMessage(hDlg, DM_SETTEXTPTR, SA_EDIT_OWNER,
reinterpret_cast<LONG_PTR>(DlgParam->strOwner.CPtr()));
@@ -234,12 +285,12 @@ LONG_PTR WINAPI SetAttrDlgProc(HANDLE hDlg,int Msg,int Param1,LONG_PTR Param2)
// установили?
if (SubfoldersState != BSTATE_UNCHECKED)
{
- for (int i=SA_ATTR_FIRST; i<= SA_ATTR_LAST; i++)
+ for (size_t i = 0; i < ARRAYSIZE(PreserveOriginalIDs); ++i)
{
- if (DlgParam->OriginalCBAttr2[i-SA_ATTR_FIRST]==-1)
+ if (DlgParam->OriginalCBAttr2[i] == -1)
{
- SendDlgMessage(hDlg,DM_SET3STATE,i,TRUE);
- SendDlgMessage(hDlg,DM_SETCHECK,i,BSTATE_3STATE);
+ SendDlgMessage(hDlg, DM_SET3STATE, PreserveOriginalIDs[i], TRUE);
+ SendDlgMessage(hDlg, DM_SETCHECK, PreserveOriginalIDs[i], BSTATE_3STATE);
}
}
SendDlgMessage(hDlg,DM_SETTEXTPTR,SA_EDIT_OWNER,reinterpret_cast<LONG_PTR>(L""));
@@ -248,10 +299,12 @@ LONG_PTR WINAPI SetAttrDlgProc(HANDLE hDlg,int Msg,int Param1,LONG_PTR Param2)
// сняли?
else
{
- for (int i=SA_ATTR_FIRST; i<= SA_ATTR_LAST; i++)
+ for (size_t i = 0; i < ARRAYSIZE(PreserveOriginalIDs); ++i)
{
- SendDlgMessage(hDlg,DM_SET3STATE,i,((DlgParam->OriginalCBFlag[i-SA_ATTR_FIRST]&DIF_3STATE)?TRUE:FALSE));
- SendDlgMessage(hDlg,DM_SETCHECK,i,DlgParam->OriginalCBAttr[i-SA_ATTR_FIRST]);
+ SendDlgMessage(hDlg, DM_SET3STATE, PreserveOriginalIDs[i],
+ ((DlgParam->OriginalCBFlag[i] & DIF_3STATE) ? TRUE : FALSE));
+ SendDlgMessage(hDlg, DM_SETCHECK, PreserveOriginalIDs[i],
+ DlgParam->OriginalCBAttr[i]);
}
SendDlgMessage(hDlg,DM_SETTEXTPTR,SA_EDIT_OWNER,reinterpret_cast<LONG_PTR>(DlgParam->strOwner.CPtr()));
SendDlgMessage(hDlg,DM_SETTEXTPTR,SA_EDIT_GROUP,reinterpret_cast<LONG_PTR>(DlgParam->strGroup.CPtr()));
@@ -520,9 +573,7 @@ void PR_ShellSetFileAttributesMsg()
ShellSetFileAttributesMsg(reinterpret_cast<const wchar_t*>(preRedrawItem.Param.Param1));
}
-
-
-static void SystemProperties(const FARString &strSelName)
+static void BriefInfo(const FARString &strSelName)
{
std::vector<std::wstring> lines;
@@ -536,7 +587,7 @@ static void SystemProperties(const FARString &strSelName)
if (lines.empty())
return;
- Messager m(Msg::SetAttrSystemDialog);
+ Messager m(Msg::SetAttrBriefInfo);
for (const auto &l : lines)
m.Add(l.c_str());
m.Add(Msg::HOk);
@@ -572,8 +623,21 @@ static bool ApplyFileOwnerGroupIfChanged(DialogItemEx &EditItem, int (*ESetFN)(L
return true;
}
+static void ApplyFSFileFlags(DialogItemEx *AttrDlg, const FARString &strSelName)
+{
+ FSFileFlags FFFlags(strSelName.GetMB());
+ FFFlags.SetImmutable(AttrDlg[SA_CHECKBOX_IMMUTABLE].Selected != 0);
+#if defined(__APPLE__) || defined(__FreeBSD__)
+ FFFlags.SetUndeletable(AttrDlg[SA_CHECKBOX_UNDELETABLE].Selected != 0);
+ FFFlags.SetHidden(AttrDlg[SA_CHECKBOX_HIDDEN].Selected != 0);
+#endif
+ FFFlags.Apply(strSelName.GetMB());
+}
+
bool ShellSetFileAttributes(Panel *SrcPanel,LPCWSTR Object)
{
+ std::vector<FARString> SelectedNames;
+
SudoClientRegion scr;
ChangePriority ChPriority(ChangePriority::NORMAL);
@@ -589,30 +653,38 @@ bool ShellSetFileAttributes(Panel *SrcPanel,LPCWSTR Object)
{DI_EDIT,18,5,short(DlgX-6),5,{},0,L""},
{DI_TEXT,5,6,17,6,{},0,Msg::SetAttrGroup},//L"Group:",
{DI_EDIT,18,6,short(DlgX-6),6,{},0,L""},
+
{DI_TEXT,3,7,0,7,{},DIF_SEPARATOR,L""},
- {DI_TEXT,5,8,0,8,{},0,Msg::SetAttrAccessUser},//L"User",
- {DI_TEXT,short(DlgX/3),8,0,8,{},0,Msg::SetAttrAccessGroup},//L"Group",
- {DI_TEXT,short(2*DlgX/3),8,0,8,{},0,Msg::SetAttrAccessOther},//L"Other",
- {DI_CHECKBOX,5,9,0,9,{},DIF_FOCUS|DIF_3STATE, Msg::SetAttrAccessUserRead},//L"Read",
- {DI_CHECKBOX,5,10,0,10,{},DIF_3STATE, Msg::SetAttrAccessUserWrite},//L"Write",
- {DI_CHECKBOX,5,11,0,11,{},DIF_3STATE, Msg::SetAttrAccessUserExecute},//L"Execute",
- {DI_CHECKBOX,short(DlgX/3),9,0,9,{},DIF_3STATE, Msg::SetAttrAccessGroupRead},//L"Read",
- {DI_CHECKBOX,short(DlgX/3),10,0,10,{},DIF_3STATE, Msg::SetAttrAccessGroupWrite},//L"Write",
- {DI_CHECKBOX,short(DlgX/3),11,0,11,{},DIF_3STATE, Msg::SetAttrAccessGroupExecute},//L"Execute",
- {DI_CHECKBOX,short(2*DlgX/3),9,0,9,{},DIF_3STATE, Msg::SetAttrAccessOtherRead},//L"Read",
- {DI_CHECKBOX,short(2*DlgX/3),10,0,10,{},DIF_3STATE, Msg::SetAttrAccessOtherWrite},//L"Write",
- {DI_CHECKBOX,short(2*DlgX/3),11,0,11,{},DIF_3STATE, Msg::SetAttrAccessOtherExecute},//L"Execute",
- {DI_TEXT,3,12,0,12,{},DIF_SEPARATOR,L""},
- {DI_TEXT,short(DlgX-29),13,0,13,{},0,L""},
- {DI_TEXT, 5,14,0,14,{},0, Msg::SetAttrAccessTime},//L"Last access time",
- {DI_FIXEDIT,short(DlgX-29),14,short(DlgX-19),14,{},DIF_MASKEDIT,L""},
- {DI_FIXEDIT,short(DlgX-17),14,short(DlgX-6),14,{},DIF_MASKEDIT,L""},
- {DI_TEXT, 5,15,0,15,{},0, Msg::SetAttrModificationTime},//L"Last modification time",
+ {DI_CHECKBOX,5,8,0,8,{},DIF_FOCUS|DIF_3STATE, Msg::SetAttrImmutable},
+#if defined(__APPLE__) || defined(__FreeBSD__)
+ {DI_CHECKBOX,short(DlgX/3),8,0,8,{},DIF_FOCUS|DIF_3STATE, Msg::SetAttrUndeletable},
+ {DI_CHECKBOX,short(2*DlgX/3),8,0,8,{},DIF_FOCUS|DIF_3STATE, Msg::SetAttrHidden},
+#endif
+
+ {DI_TEXT,5,9,0,9,{},0,Msg::SetAttrAccessUser},//L"User",
+ {DI_TEXT,short(DlgX/3),9,0,9,{},0,Msg::SetAttrAccessGroup},//L"Group",
+ {DI_TEXT,short(2*DlgX/3),9,0,9,{},0,Msg::SetAttrAccessOther},//L"Other",
+ {DI_CHECKBOX,5,10,0,10,{},DIF_FOCUS|DIF_3STATE, Msg::SetAttrAccessUserRead},//L"Read",
+ {DI_CHECKBOX,5,11,0,11,{},DIF_3STATE, Msg::SetAttrAccessUserWrite},//L"Write",
+ {DI_CHECKBOX,5,12,0,12,{},DIF_3STATE, Msg::SetAttrAccessUserExecute},//L"Execute",
+ {DI_CHECKBOX,short(DlgX/3),10,0,10,{},DIF_3STATE, Msg::SetAttrAccessGroupRead},//L"Read",
+ {DI_CHECKBOX,short(DlgX/3),11,0,11,{},DIF_3STATE, Msg::SetAttrAccessGroupWrite},//L"Write",
+ {DI_CHECKBOX,short(DlgX/3),12,0,12,{},DIF_3STATE, Msg::SetAttrAccessGroupExecute},//L"Execute",
+ {DI_CHECKBOX,short(2*DlgX/3),10,0,10,{},DIF_3STATE, Msg::SetAttrAccessOtherRead},//L"Read",
+ {DI_CHECKBOX,short(2*DlgX/3),11,0,11,{},DIF_3STATE, Msg::SetAttrAccessOtherWrite},//L"Write",
+ {DI_CHECKBOX,short(2*DlgX/3),12,0,12,{},DIF_3STATE, Msg::SetAttrAccessOtherExecute},//L"Execute",
+
+ {DI_TEXT,3,13,0,13,{},DIF_SEPARATOR,L""},
+ {DI_TEXT,short(DlgX-29),14,0,14,{},0,L""},
+ {DI_TEXT, 5,15,0,15,{},0, Msg::SetAttrAccessTime},//L"Last access time",
{DI_FIXEDIT,short(DlgX-29),15,short(DlgX-19),15,{},DIF_MASKEDIT,L""},
{DI_FIXEDIT,short(DlgX-17),15,short(DlgX-6),15,{},DIF_MASKEDIT,L""},
- {DI_TEXT, 5,16,0,16,{},0, Msg::SetAttrStatusChangeTime},//L"Last status change time",
- {DI_FIXEDIT,short(DlgX-29),16,short(DlgX-19),16,{},DIF_MASKEDIT|DIF_READONLY,L""},
- {DI_FIXEDIT,short(DlgX-17),16,short(DlgX-6),16,{},DIF_MASKEDIT|DIF_READONLY,L""},
+ {DI_TEXT, 5,16,0,16,{},0, Msg::SetAttrModificationTime},//L"Last modification time",
+ {DI_FIXEDIT,short(DlgX-29),16,short(DlgX-19),16,{},DIF_MASKEDIT,L""},
+ {DI_FIXEDIT,short(DlgX-17),16,short(DlgX-6),16,{},DIF_MASKEDIT,L""},
+ {DI_TEXT, 5,17,0,17,{},0, Msg::SetAttrStatusChangeTime},//L"Last status change time",
+ {DI_FIXEDIT,short(DlgX-29),17,short(DlgX-19),17,{},DIF_MASKEDIT|DIF_READONLY,L""},
+ {DI_FIXEDIT,short(DlgX-17),17,short(DlgX-6),17,{},DIF_MASKEDIT|DIF_READONLY,L""},
{DI_BUTTON,0,18,0,18,{},DIF_CENTERGROUP|DIF_BTNNOCLOSE,Msg::SetAttrOriginal},
{DI_BUTTON,0,18,0,18,{},DIF_CENTERGROUP|DIF_BTNNOCLOSE,Msg::SetAttrCurrent},
{DI_BUTTON,0,18,0,18,{},DIF_CENTERGROUP|DIF_BTNNOCLOSE,Msg::SetAttrBlank},
@@ -620,7 +692,7 @@ bool ShellSetFileAttributes(Panel *SrcPanel,LPCWSTR Object)
{DI_CHECKBOX,5,20,0,20,{},DIF_DISABLE|DIF_HIDDEN,Msg::SetAttrSubfolders},
{DI_TEXT,3,short(DlgY-4),0,short(DlgY-4),{},DIF_SEPARATOR,L""},
{DI_BUTTON,0,short(DlgY-3),0,short(DlgY-3),{},DIF_DEFAULT|DIF_CENTERGROUP,Msg::SetAttrSet},
- {DI_BUTTON,0,short(DlgY-3),0,short(DlgY-3),{},DIF_CENTERGROUP|DIF_DISABLE,Msg::SetAttrSystemDialog},
+ {DI_BUTTON,0,short(DlgY-3),0,short(DlgY-3),{},DIF_CENTERGROUP|DIF_DISABLE,Msg::SetAttrBriefInfo},
{DI_BUTTON,0,short(DlgY-3),0,short(DlgY-3),{},DIF_CENTERGROUP,Msg::Cancel}
};
MakeDialogItemsEx(AttrDlgData,AttrDlg);
@@ -634,7 +706,7 @@ bool ShellSetFileAttributes(Panel *SrcPanel,LPCWSTR Object)
if(SelCount==1)
{
- AttrDlg[SA_BUTTON_SYSTEMDLG].Flags&=~DIF_DISABLE;
+ AttrDlg[SA_BUTTON_BRIEFINFO].Flags&=~DIF_DISABLE;
}
if (SrcPanel && SrcPanel->GetMode()==PLUGIN_PANEL)
@@ -652,14 +724,11 @@ bool ShellSetFileAttributes(Panel *SrcPanel,LPCWSTR Object)
if (!(Info.Flags & OPIF_REALNAMES))
{
AttrDlg[SA_BUTTON_SET].Flags|=DIF_DISABLE;
- AttrDlg[SA_BUTTON_SYSTEMDLG].Flags|=DIF_DISABLE;
+ AttrDlg[SA_BUTTON_BRIEFINFO].Flags|=DIF_DISABLE;
DlgParam.Plugin=true;
}
}
- FarList NameList{};
- FARString *strLinks=nullptr;
-
{
DWORD FileAttr = INVALID_FILE_ATTRIBUTES, FileMode = 0;
FARString strSelName;
@@ -684,6 +753,7 @@ bool ShellSetFileAttributes(Panel *SrcPanel,LPCWSTR Object)
FileAttr=FindData.dwFileAttributes;
FileMode=FindData.dwUnixMode;
}
+
fprintf(stderr, "FileMode=%u\n", FileMode);
if (SelCount==1 && TestParentFolderName(strSelName))
@@ -719,26 +789,11 @@ bool ShellSetFileAttributes(Panel *SrcPanel,LPCWSTR Object)
AttrDlg[SA_FIXEDIT_LAST_MODIFICATION_TIME].strMask = AttrDlg[SA_FIXEDIT_LAST_CHANGE_TIME].strMask = strTMask;
bool FolderPresent=false,LinkPresent=false;
FARString strLinkName;
- static struct MODEPAIR
- {
- SETATTRDLG Item;
- DWORD Mode;
- }
- AP[]=
- {
- {SA_CHECKBOX_USER_READ, S_IRUSR },
- {SA_CHECKBOX_USER_WRITE, S_IWUSR },
- {SA_CHECKBOX_USER_EXECUTE, S_IXUSR },
- {SA_CHECKBOX_GROUP_READ, S_IRGRP },
- {SA_CHECKBOX_GROUP_WRITE, S_IWGRP },
- {SA_CHECKBOX_GROUP_EXECUTE, S_IXGRP },
- {SA_CHECKBOX_OTHER_READ, S_IROTH },
- {SA_CHECKBOX_OTHER_WRITE, S_IWOTH },
- {SA_CHECKBOX_OTHER_EXECUTE, S_IXOTH },
- };
if (SelCount==1)
{
+ FSFileFlags FFFlags(strSelName.GetMB());
+
if (FileAttr&FILE_ATTRIBUTE_DIRECTORY)
{
if (!DlgParam.Plugin)
@@ -769,118 +824,32 @@ bool ShellSetFileAttributes(Panel *SrcPanel,LPCWSTR Object)
ConvertDate(FindData.ftUnixStatusChangeTime,AttrDlg[SA_FIXEDIT_LAST_CHANGE_DATE].strData,
AttrDlg[SA_FIXEDIT_LAST_CHANGE_TIME].strData,12,FALSE,FALSE,2,TRUE);
}
-
- if (FileAttr!=INVALID_FILE_ATTRIBUTES)
- {
- for (size_t i=0; i<ARRAYSIZE(AP); i++)
- {
- AttrDlg[AP[i].Item].Selected = (FileMode&AP[i].Mode) ? BSTATE_CHECKED : BSTATE_UNCHECKED;
- }
- }
-
- for (size_t i=SA_ATTR_FIRST; i<= SA_ATTR_LAST; i++)
- {
- AttrDlg[i].Flags&=~DIF_3STATE;
- }
}
FolderPresent=TRUE;
}
- else
- {
- for (size_t i=SA_ATTR_FIRST; i<=SA_ATTR_LAST; i++)
- {
- AttrDlg[i].Flags&=~DIF_3STATE;
- }
- }
- /* обработка случая, если ЭТО SymLink
- if (FileAttr!=INVALID_FILE_ATTRIBUTES && FileAttr&FILE_ATTRIBUTE_REPARSE_POINT)
+ if ((FileAttr != INVALID_FILE_ATTRIBUTES) && ((FileAttr & FILE_ATTRIBUTE_DIRECTORY) == 0 || Opt.SetAttrFolderRules))
{
- DWORD ReparseTag=0;
- DWORD LenJunction=DlgParam.Plugin?0:GetReparsePointInfo(strSelName, strLinkName,&ReparseTag);
- AttrDlg[SA_DOUBLEBOX].Y2++;
-
- for (size_t i=SA_TEXT_SYMLINK; i<ARRAYSIZE(AttrDlgData); i++)
- {
- AttrDlg[i].Y1++;
-
- if (AttrDlg[i].Y2)
- {
- AttrDlg[i].Y2++;
- }
- }
-
- LinkPresent=true;
- NormalizeSymlinkName(strLinkName);
- int ID_Msg=Msg::SetAttrSymlink;
-
- if (ReparseTag==IO_REPARSE_TAG_MOUNT_POINT)
+ for (size_t i=0; i<ARRAYSIZE(AP); i++)
{
- if (IsLocalVolumeRootPath(strLinkName))
- {
- ID_Msg=Msg::SetAttrVolMount;
- }
- else
- {
- ID_Msg=Msg::SetAttrJunction;
- }
+ AttrDlg[AP[i].Item].Selected = (FileMode&AP[i].Mode) ? BSTATE_CHECKED : BSTATE_UNCHECKED;
}
+ AttrDlg[SA_CHECKBOX_IMMUTABLE].Selected = FFFlags.Immutable() ? BSTATE_CHECKED : BSTATE_UNCHECKED;
+#if defined(__APPLE__) || defined(__FreeBSD__)
+ AttrDlg[SA_CHECKBOX_UNDELETABLE].Selected = FFFlags.Undeletable() ? BSTATE_CHECKED : BSTATE_UNCHECKED;
+ AttrDlg[SA_CHECKBOX_HIDDEN].Selected = FFFlags.Hidden() ? BSTATE_CHECKED : BSTATE_UNCHECKED;
+#endif
+ }
- AttrDlg[SA_TEXT_SYMLINK].Flags&=~DIF_HIDDEN;
- AttrDlg[SA_TEXT_SYMLINK].strData=(ID_Msg);
- AttrDlg[SA_EDIT_SYMLINK].Flags&=~DIF_HIDDEN;
- AttrDlg[SA_EDIT_SYMLINK].strData=LenJunction?strLinkName.CPtr():Msg::SetAttrUnknownJunction;
- DlgParam.FileSystemFlags=0;
-
- if (apiGetVolumeInformation(strSelName,nullptr,0,nullptr,&DlgParam.FileSystemFlags,nullptr))
- {
- if (!(DlgParam.FileSystemFlags&FILE_FILE_COMPRESSION))
- {
- AttrDlg[SA_CHECKBOX_COMPRESSED].Flags|=DIF_DISABLE;
- }
-
- if (!(DlgParam.FileSystemFlags&FILE_SUPPORTS_ENCRYPTION))
- {
- AttrDlg[SA_CHECKBOX_ENCRYPTED].Flags|=DIF_DISABLE;
- }
-
- if (!(DlgParam.FileSystemFlags&FILE_SUPPORTS_SPARSE_FILES))
- {
- AttrDlg[SA_CHECKBOX_SPARSE].Flags|=DIF_DISABLE;
- }
- }
- }*/
-
- NameList.ItemsNumber=1;
- // обработка случая "несколько хардлинков"
- /*NameList.ItemsNumber=(FileAttr&FILE_ATTRIBUTE_DIRECTORY)?1:GetNumberOfLinks(strSelName);
-
- if (NameList.ItemsNumber>1)
+ for (auto i : PreserveOriginalIDs)
{
- AttrDlg[SA_TEXT_NAME].Flags|=DIF_HIDDEN;
- AttrDlg[SA_COMBO_HARDLINK].Flags&=~DIF_HIDDEN;
- NameList.Items=new FarListItem[NameList.ItemsNumber]();
- strLinks=new FARString [NameList.ItemsNumber];
- int Current=0;
- AttrDlg[SA_COMBO_HARDLINK].Flags|=DIF_DISABLE;
-
- FormatString strTmp;
- strTmp<<Msg::SetAttrHardLinks<<L" ("<<NameList.ItemsNumber<<L")";
- AttrDlg[SA_COMBO_HARDLINK].strData=strTmp;
- }*/
+ AttrDlg[i].Flags&=~DIF_3STATE;
+ }
AttrDlg[SA_TEXT_NAME].strData = strSelName;
TruncStr(AttrDlg[SA_TEXT_NAME].strData,DlgX-10);
- if (FileAttr!=INVALID_FILE_ATTRIBUTES)
- {
- for (size_t i=0; i<ARRAYSIZE(AP); i++)
- {
- AttrDlg[AP[i].Item].Selected = FileMode&AP[i].Mode ? BSTATE_CHECKED : BSTATE_UNCHECKED;
- }
- }
-
const SETATTRDLG Dates[]={SA_FIXEDIT_LAST_ACCESS_DATE, SA_FIXEDIT_LAST_MODIFICATION_DATE, SA_FIXEDIT_LAST_CHANGE_DATE};
const SETATTRDLG Times[]={SA_FIXEDIT_LAST_ACCESS_TIME, SA_FIXEDIT_LAST_MODIFICATION_TIME, SA_FIXEDIT_LAST_CHANGE_TIME};
const PFILETIME TimeValues[]={&FindData.ftUnixAccessTime, &FindData.ftUnixModificationTime, &FindData.ftUnixStatusChangeTime};
@@ -902,7 +871,7 @@ bool ShellSetFileAttributes(Panel *SrcPanel,LPCWSTR Object)
GetFileOwner(strComputerName,strSelName,AttrDlg[SA_EDIT_OWNER].strData);
GetFileGroup(strComputerName,strSelName,AttrDlg[SA_EDIT_GROUP].strData);
- }
+ }// end of if (SelCount==1)
else
{
for (size_t i=0; i<ARRAYSIZE(AP); i++)
@@ -919,7 +888,7 @@ bool ShellSetFileAttributes(Panel *SrcPanel,LPCWSTR Object)
AttrDlg[SA_BUTTON_ORIGINAL].Flags|=DIF_DISABLE;
AttrDlg[SA_TEXT_NAME].strData = Msg::SetAttrSelectedObjects;
- for (size_t i=SA_ATTR_FIRST; i<=SA_ATTR_LAST; i++)
+ for (auto i : PreserveOriginalIDs)
{
AttrDlg[i].Selected=BSTATE_UNCHECKED;
}
@@ -964,6 +933,15 @@ bool ShellSetFileAttributes(Panel *SrcPanel,LPCWSTR Object)
}
if(CheckOwner) CheckFileOwnerGroup(AttrDlg[SA_EDIT_OWNER], GetFileOwner, strComputerName, strSelName);
if(CheckGroup) CheckFileOwnerGroup(AttrDlg[SA_EDIT_GROUP], GetFileGroup, strComputerName, strSelName);
+ FSFileFlags FFFlags(strSelName.GetMB());
+ if (FFFlags.Immutable())
+ AttrDlg[SA_CHECKBOX_IMMUTABLE].Selected++;
+#if defined(__APPLE__) || defined(__FreeBSD__)
+ if (FFFlags.Undeletable())
+ AttrDlg[SA_CHECKBOX_UNDELETABLE].Selected++;
+ if (FFFlags.Hidden())
+ AttrDlg[SA_CHECKBOX_HIDDEN].Selected++;
+#endif
}
}
else
@@ -997,7 +975,7 @@ bool ShellSetFileAttributes(Panel *SrcPanel,LPCWSTR Object)
}
// выставим "неопределенку" или то, что нужно
- for (size_t i=SA_ATTR_FIRST; i<=SA_ATTR_LAST; i++)
+ for (auto i : PreserveOriginalIDs)
{
// снимаем 3-state, если "есть все или нет ничего"
// за исключением случая, если есть Фолдер среди объектов
@@ -1006,7 +984,9 @@ bool ShellSetFileAttributes(Panel *SrcPanel,LPCWSTR Object)
AttrDlg[i].Flags&=~DIF_3STATE;
}
- AttrDlg[i].Selected=(AttrDlg[i].Selected >= SelCount)?BST_CHECKED:(!AttrDlg[i].Selected?BSTATE_UNCHECKED:BSTATE_3STATE);
+ AttrDlg[i].Selected = (AttrDlg[i].Selected >= SelCount)
+ ? BST_CHECKED
+ : (!AttrDlg[i].Selected ? BSTATE_UNCHECKED : BSTATE_3STATE);
}
}
@@ -1021,7 +1001,7 @@ bool ShellSetFileAttributes(Panel *SrcPanel,LPCWSTR Object)
AttrDlg[SA_FIXEDIT_LAST_CHANGE_DATE].strData.Clear();
AttrDlg[SA_FIXEDIT_LAST_CHANGE_TIME].strData.Clear();
- for (size_t i=SA_ATTR_FIRST; i<= SA_ATTR_LAST; i++)
+ for (auto i : PreserveOriginalIDs)
{
AttrDlg[i].Selected=BSTATE_3STATE;
AttrDlg[i].Flags|=DIF_3STATE;
@@ -1029,11 +1009,11 @@ bool ShellSetFileAttributes(Panel *SrcPanel,LPCWSTR Object)
}
// запомним состояние переключателей.
- for (size_t i=SA_ATTR_FIRST; i<=SA_ATTR_LAST; i++)
+ for (size_t i = 0; i < ARRAYSIZE(PreserveOriginalIDs); ++i)
{
- DlgParam.OriginalCBAttr[i-SA_ATTR_FIRST]=AttrDlg[i].Selected;
- DlgParam.OriginalCBAttr2[i-SA_ATTR_FIRST]=-1;
- DlgParam.OriginalCBFlag[i-SA_ATTR_FIRST]=AttrDlg[i].Flags;
+ DlgParam.OriginalCBAttr[i] = AttrDlg[i].Selected;
+ DlgParam.OriginalCBAttr2[i] = -1;
+ DlgParam.OriginalCBFlag[i] = AttrDlg[i].Flags;
}
DlgParam.strOwner = AttrDlg[SA_EDIT_OWNER].strData;
@@ -1056,12 +1036,6 @@ bool ShellSetFileAttributes(Panel *SrcPanel,LPCWSTR Object)
Dlg.SetPosition(-1,-1,DlgX,DlgY);
Dlg.Process();
- if (NameList.Items)
- delete[] NameList.Items;
-
- if (strLinks)
- delete[] strLinks;
-
switch(Dlg.GetExitCode())
{
case SA_BUTTON_SET:
@@ -1111,13 +1085,15 @@ bool ShellSetFileAttributes(Panel *SrcPanel,LPCWSTR Object)
}
}
- if (FileMode != NewMode)
+ if ((FileMode & EDITABLE_MODES) != (NewMode & EDITABLE_MODES))
{
if (ESetFileMode(strSelName, NewMode, SkipMode)==SETATTR_RET_SKIPALL)
{
SkipMode=SETATTR_RET_SKIP;
}
}
+
+ ApplyFSFileFlags(AttrDlg, strSelName);
}
/* Multi *********************************************************** */
else
@@ -1284,13 +1260,15 @@ bool ShellSetFileAttributes(Panel *SrcPanel,LPCWSTR Object)
}
}
}
+ ApplyFSFileFlags(AttrDlg, strSelName);
+
} // END: while (SrcPanel->GetSelNameCompat(...))
}
}
break;
- case SA_BUTTON_SYSTEMDLG:
+ case SA_BUTTON_BRIEFINFO:
{
- SystemProperties(strSelName);
+ BriefInfo(strSelName);
}
break;
default: