Skip to content

Commit

Permalink
set attributes dialog: symlink editing (close elfmz#1690)
Browse files Browse the repository at this point in the history
  • Loading branch information
elfmz committed Jul 8, 2023
1 parent 5ee6a40 commit 65e1870
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 12 deletions.
11 changes: 11 additions & 0 deletions far2l/bootstrap/scripts/farlang.templ.m4
Original file line number Diff line number Diff line change
Expand Up @@ -15477,6 +15477,17 @@ SetAttrSymlink
"Посилання:"
"Спасылак:"

SetAttrSymlinkFailed
"Ошибка изменения символической ссылки"
"Error changing symbolic link"
upd:"Error changing symbolic link"
upd:"Error changing symbolic link"
upd:"Error changing symbolic link"
upd:"Error changing symbolic link"
upd:"Error changing symbolic link"
"Ошибка зміни символічних посилань"
"Шыбка змены сімвалічных спасылак"

SetAttrVolMount
"Том:"
"Volume:"
Expand Down
1 change: 1 addition & 0 deletions far2l/far2sdk/farplug-wide.h
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,7 @@ enum FarMessagesProc
DM_GETCOLOR,
DM_SETCOLOR,

DM_SETREADONLY,

DN_FIRST=0x1000,
DN_BTNCLICK,
Expand Down
26 changes: 24 additions & 2 deletions far2l/src/dialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5870,15 +5870,37 @@ LONG_PTR SendDlgMessageSynched(HANDLE hDlg, int Msg, int Param1, LONG_PTR Param2
CurItem->Flags&= ~(DIF_SETCOLOR | DIF_COLORMASK);
CurItem->Flags|= Param2 & (DIF_SETCOLOR | DIF_COLORMASK);

if (Dlg->DialogMode.Check(DMODE_SHOW)) //???
{
if (Dlg->DialogMode.Check(DMODE_SHOW)) { //???
Dlg->ShowDialog(Param1);
ScrBuf.Flush();
}

return TRUE;
}

case DM_SETREADONLY: {
if (Param2) {
CurItem->Flags|= DIF_READONLY;
} else {
CurItem->Flags&= ~DIF_READONLY;
}
if (FarIsEdit(Type)) {
DlgEdit *CurItemEdit = (DlgEdit *)CurItem->ObjPtr;
if (CurItemEdit) {
CurItemEdit->SetReadOnly(Param2 ? 1 : 0);
}
} else {
fprintf(stderr,
"%s: DM_SETREADONLY invoked for non-edit item %u\n",
__FUNCTION__, Param1);
}
if (Dlg->DialogMode.Check(DMODE_SHOW)) { //???
Dlg->ShowDialog(Param1);
ScrBuf.Flush();
}
return TRUE;
}

/*****************************************************************/
// получить позицию и размеры контрола
case DM_GETITEMPOSITION: // Param1=ID, Param2=*SMALL_RECT
Expand Down
41 changes: 31 additions & 10 deletions far2l/src/setattr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,7 @@ struct SetAttrDlgParam
FARCHECKEDSTATE OSubfoldersState;
bool OAccessTime, OModifyTime, OStatusChangeTime;
unsigned char SymLinkInfoCycle = 0;
FARString SymLink;
FARString SymlinkButtonTitles[3];
};

Expand Down Expand Up @@ -230,6 +231,11 @@ LONG_PTR WINAPI SetAttrDlgProc(HANDLE hDlg, int Msg, int Param1, LONG_PTR Param2

switch (Msg) {
case DN_BTNCLICK:
if (DlgParam->SymLinkInfoCycle == 0) {
DlgParam->SymLink = reinterpret_cast<LPCWSTR>
(SendDlgMessage(hDlg, DM_GETCONSTTEXTPTR, SA_EDIT_INFO, 0));
}

OrigIdx = DialogID2PreservedOriginalIndex(Param1);
if (OrigIdx != -1 || Param1 == SA_CHECKBOX_SUBFOLDERS) {
if (OrigIdx != -1) {
Expand Down Expand Up @@ -348,17 +354,20 @@ LONG_PTR WINAPI SetAttrDlgProc(HANDLE hDlg, int Msg, int Param1, LONG_PTR Param2
reinterpret_cast<LONG_PTR>(DlgParam->SymlinkButtonTitles[DlgParam->SymLinkInfoCycle].CPtr()));

switch (DlgParam->SymLinkInfoCycle++) {
case 0:
ConvertNameToReal(DlgParam->strSelName, strText);
break;
case 0: {
ConvertNameToReal(DlgParam->SymLink, strText);
SendDlgMessage(hDlg, DM_SETREADONLY, SA_EDIT_INFO, 1);
} break;

case 1:
ConvertNameToReal(DlgParam->strSelName, strText);
ConvertNameToReal(DlgParam->SymLink, strText);
strText = BriefInfo(strText);
SendDlgMessage(hDlg, DM_SETREADONLY, SA_EDIT_INFO, 1);
break;

default:
ReadSymlink(DlgParam->strSelName, strText);
strText = DlgParam->SymLink;
SendDlgMessage(hDlg, DM_SETREADONLY, SA_EDIT_INFO, 0);
DlgParam->SymLinkInfoCycle = 0;
}
SendDlgMessage(hDlg, DM_SETTEXTPTR, SA_EDIT_INFO, reinterpret_cast<LONG_PTR>(strText.CPtr()));
Expand Down Expand Up @@ -719,7 +728,7 @@ bool ShellSetFileAttributes(Panel *SrcPanel, LPCWSTR Object)
{DI_TEXT, -1, 3, 0, 3, {}, DIF_SHOWAMPERSAND, L""},
{DI_TEXT, 3, 4, 0, 4, {}, DIF_SEPARATOR, L""},
{DI_TEXT, 5, 5, 17, 5, {}, DIF_HIDDEN, Msg::SetAttrBriefInfo},
{DI_EDIT, 18, 5, short(DlgX - 6), 5, {}, DIF_SELECTONENTRY | DIF_FOCUS | DIF_READONLY | DIF_HIDDEN, L""},
{DI_EDIT, 18, 5, short(DlgX - 6), 5, {}, DIF_SELECTONENTRY | DIF_FOCUS | DIF_HIDDEN, L""}, //DIF_READONLY |
{DI_TEXT, 5, 6, 17, 6, {}, 0, Msg::SetAttrOwner},
//{DI_EDIT, 18, 6, short(DlgX - 6), 6, {}, 0, L""},
{DI_COMBOBOX, 18, 6, short(DlgX-6), 6, {}, DIF_DROPDOWNLIST|DIF_LISTNOAMPERSAND|DIF_LISTWRAPMODE,L""},
Expand Down Expand Up @@ -818,7 +827,7 @@ bool ShellSetFileAttributes(Panel *SrcPanel, LPCWSTR Object)
FileMode = FindData.dwUnixMode;
}

fprintf(stderr, "FileMode=%u\n", FileMode);
// fprintf(stderr, "FileMode=%u\n", FileMode);

if (SelCount == 1 && TestParentFolderName(strSelName))
return false;
Expand Down Expand Up @@ -869,14 +878,14 @@ bool ShellSetFileAttributes(Panel *SrcPanel, LPCWSTR Object)

AttrDlg[SA_TXTBTN_INFO].Type = DI_BUTTON;
AttrDlg[SA_TXTBTN_INFO].strData = DlgParam.SymlinkButtonTitles[2];
FARString strLinkDest;
ReadSymlink(strSelName, strLinkDest);
AttrDlg[SA_EDIT_INFO].strData = strLinkDest;
ReadSymlink(strSelName, DlgParam.SymLink);
AttrDlg[SA_EDIT_INFO].strData = DlgParam.SymLink;

} else {
AttrDlg[SA_EDIT_INFO].strData = BriefInfo(strSelName);
}


if (FileAttr & FILE_ATTRIBUTE_DIRECTORY) {
if (!DlgParam.Plugin) {
FileAttr = apiGetFileAttributes(strSelName);
Expand Down Expand Up @@ -1112,6 +1121,18 @@ bool ShellSetFileAttributes(Panel *SrcPanel, LPCWSTR Object)
ShellSetFileAttributesMsg(SelCount == 1 ? strSelName.CPtr() : nullptr);
int SkipMode = SETATTR_RET_UNKNOWN;

if (SelCount == 1 && (FileAttr & FILE_ATTRIBUTE_REPARSE_POINT) != 0) {
FARString OldSymLink;
ReadSymlink(strSelName, OldSymLink);
if (DlgParam.SymLink != OldSymLink) {
fprintf(stderr, "Symlink change: '%ls' -> '%ls'\n",
OldSymLink.CPtr(), DlgParam.SymLink.CPtr());
sdc_unlink(strSelName.GetMB().c_str());
int r = sdc_symlink(DlgParam.SymLink.GetMB().c_str(), strSelName.GetMB().c_str());
Message(MSG_WARNING | MSG_ERRORTYPE, 1,
Msg::Error, Msg::SetAttrSymlinkFailed, strSelName, Msg::Ok);
}
}
if (SelCount == 1 && !(FileAttr & FILE_ATTRIBUTE_DIRECTORY)) {
DWORD NewMode = 0;

Expand Down

0 comments on commit 65e1870

Please sign in to comment.