macro_file fAttrs; // управление атрибутами файла в текущем окне // без параметров выводит диалог // с параметрами молча делает заказанное // есть подсказка // 2015.09.24, nvv, finished // 2015.09.08, nvv, started #include Dialog.sh // header file that contains the def for DlgExecute #include StdDlgs.sh #define nMacroName "fAttrs" #define nCheckRob_Ctrl 1001 #define nCheckHid_Ctrl 1002 #define nCheckSys_Ctrl 1003 #define nCheckArc_Ctrl 1004 #define nBtn_Ok_Ctrl 1061 // кнопка "старт" (пуск) #define nBtn_About_Ctrl 1062 // микро подсказка "о макросе" void fAttrs { int fAtr = Cur_File_Attr; // Attributes: int nAtr = fAtr; int fRon = fAtr & 0x01; // 0x01 ReadOnly int fHid = fAtr & 0x02; // 0x02 Hidden int fSys = fAtr & 0x04; // 0x04 System int fArc = fAtr & 0x20; // 0x20 Archive int fDir = fAtr & 0x10; // 0x10 Directory int fVol = fAtr & 0x08; // 0x08 Volume ID int sDlg; str Parm = caps( mparm_str ); char nSet; if ( fVol ) { MsgDlg("!Note - it's a VOLUME\\n" + "NO attributes to change with." , nMacroName + ': Note!', "", 1 ); return(); } if ( fDir ) { if ( id_std_Yes != VerifyDlg ( "? It's a DIRECTORY\\n" + "Do you want to change its attributes?" , nMacroName + ': CONFIRM', '', id_std_Yes, 0 ) ) { return(); } } if ( svl( Parm ) ) { // заказаны явные дейстия, отработаем... int nRon = xpos( "R", Parm, 1 ); // 0x01 Read Only int nHid = xpos( "H", Parm, 1 ); // 0x02 Hidden int nSys = xpos( "S", Parm, 1 ); // 0x04 System file int nArc = xpos( "A", Parm, 1 ); // 0x20 Archive // int fRon = fAtr & 0x01; // 0x01 Read Only if ( nRon ) { if ( str_char( Parm, nRon + 1 ) == "+" ) { nAtr |= 0x01; // установим этот атрибут Parm = str_ins( " ", str_del( Parm, nRon + 1, 1 ), nRon + 1 ); } else if ( str_char( Parm, nRon + 1 ) == "-" ) { nAtr &= ( 0xFF ^ 0x01 ); // скинем этот атрибут Parm = str_ins( " ", str_del( Parm, nRon + 1, 1 ), nRon + 1 ); } else { nAtr ^= 0x01; // обратим этот атрибут } Parm = str_ins( " ", str_del( Parm, nRon, 1 ), nRon ); // уберём из строки параметров учтённое } // int fHid = fAtr & 0x02; // 0x02 Hidden if ( nHid ) { if ( str_char( Parm, nHid + 1 ) == "+" ) { nAtr |= 0x02; Parm = str_ins( " ", str_del( Parm, nHid + 1, 1 ), nHid + 1 ); } else if ( str_char( Parm, nHid + 1 ) == "-" ) { nAtr &= ( 0xFF ^ 0x02 ); Parm = str_ins( " ", str_del( Parm, nHid + 1, 1 ), nHid + 1 ); } else { nAtr ^= 0x02; } Parm = str_ins( " ", str_del( Parm, nHid, 1 ), nHid ); } // int fSys = fAtr & 0x04; // 0x04 System file if ( nSys ) { if ( str_char( Parm, nSys + 1 ) == "+" ) { nAtr |= 0x04; Parm = str_ins( " ", str_del( Parm, nSys + 1, 1 ), nSys + 1 ); } else if ( str_char( Parm, nSys + 1 ) == "-" ) { nAtr &= ( 0xFF ^ 0x04 ); Parm = str_ins( " ", str_del( Parm, nSys + 1, 1 ), nSys + 1 ); } else { nAtr ^= 0x04; } Parm = str_ins( " ", str_del( Parm, nSys, 1 ), nSys ); } // int fArc = fAtr & 0x20; // 0x20 Archive if ( nArc ) { if ( str_char( Parm, nArc + 1 ) == "+" ) { nAtr |= 0x20; Parm = str_ins( " ", str_del( Parm, nArc + 1, 1 ), nArc + 1 ); } else if ( str_char( Parm, nArc + 1 ) == "-" ) { nAtr &= ( 0xFF ^ 0x20 ); Parm = str_ins( " ", str_del( Parm, nArc + 1, 1 ), nArc + 1 ); } else { nAtr ^= 0x20; } Parm = str_ins( " ", str_del( Parm, nArc, 1 ), nArc ); } if ( remove_space( Parm ) == "" ) { Cur_File_Attr = nAtr; // сожмём то, что осталось. Пусто - Ок } else { // НЕ пусто - товарищь НЕ понимает... RM( "fAttrs_About" ); // ! в параметрах вызова есть лишнее-с } } else { DlgCreate( sDlg ); DlgAddCtrl( sDlg, Dlg_Checkbox, "Read Only ", 1, 1, 30, 1, nCheckRob_Ctrl, 0, "" ); DlgAddCtrl( sDlg, Dlg_Checkbox, "Hidden ", 1, 2, 30, 1, nCheckHid_Ctrl, 0, "" ); DlgAddCtrl( sDlg, Dlg_Checkbox, "System file", 1, 3, 30, 1, nCheckSys_Ctrl, 0, "" ); DlgAddCtrl( sDlg, Dlg_Checkbox, "Archive ", 1, 4, 30, 1, nCheckArc_Ctrl, 0, "" ); DlgAddCtrl( sDlg, Dlg_PushButton, "OK", 5, 5, 9, 1, nBtn_Ok_Ctrl, dlgf_DefButton, "" ); DlgAddCtrl( sDlg, Dlg_PushButton, "&?", Dlg_PosOffset + 12, Dlg_PosOffset, 9, dlg_Units | 11 , nBtn_About_Ctrl, 0, "/M=fAttrs_About" ); DlgSetInt ( sDlg, nCheckRob_Ctrl, fRon ); // так было... DlgSetInt ( sDlg, nCheckHid_Ctrl, fHid ); DlgSetInt ( sDlg, nCheckSys_Ctrl, fSys ); DlgSetInt ( sDlg, nCheckArc_Ctrl, fArc ); if ( Return_Int = DlgExecute( sDlg, nCheckRob_Ctrl, "Attributes to reset", "", "", 0 ) ) { // спросим... fRon = DlgGetInt ( sDlg, nCheckRob_Ctrl ); // так стало... fHid = ( DlgGetInt ( sDlg, nCheckHid_Ctrl ) << 1 ); fSys = ( DlgGetInt ( sDlg, nCheckSys_Ctrl ) << 2 ); fArc = ( DlgGetInt ( sDlg, nCheckArc_Ctrl ) << 5 ); nAtr = fRon + fHid + fSys + fArc + fDir + fVol; // соберём атрибуты в кучу if ( nAtr != fAtr ) Cur_File_Attr = nAtr; // если изменилось - отработаем } DlgKill( sDlg ); } } void fAttrs_About { // микро подсказка (краткая справка) MsgDlg( "'" + nMacroName + "' is a tool to handle\\n" + "current file attributes.\\n\\n" + "Parameters:\\n" + "none == to call a dialog\\n" + "'R' - ReadOnly (rOn)\\n" + "'H' - Hidden (Hid)\\n" + "'S' - System (Sys)\\n" + "'A' - Archive (Arc)\\n" + "(!) any case\\n\\n" + "Modifiers:\\n" + "'+' - set\\n" + "'-' - clear\\n" + "none - switch\\n" + "spaces ' ' - ignored\\n\\n" + "Example:\\n" + "'R-h s+' == clear rOn, switch Hid, set Sys" , 'About ' + nMacroName + '...', "", 1 ); } |