Rights.cpp 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #include "Rights.h"
  5. #include <Common.h>
  6. #include <VCLCommon.h>
  7. //---------------------------------------------------------------------------
  8. #pragma package(smart_init)
  9. #pragma resource "*.dfm"
  10. //---------------------------------------------------------------------------
  11. __fastcall TRightsFrame::TRightsFrame(TComponent* Owner)
  12. : TFrame(Owner)
  13. {
  14. FOnChange = NULL;
  15. FAllowAddXToDirectories = true;
  16. }
  17. //---------------------------------------------------------------------------
  18. __fastcall TRightsFrame::~TRightsFrame()
  19. {
  20. }
  21. //---------------------------------------------------------------------------
  22. void __fastcall TRightsFrame::SetStates(TRightsFlag Flag, TRightState value)
  23. {
  24. assert(((value == rsNo) || (value == rsYes) || (value == rsUndef)));
  25. TCheckBox *CheckBox = Checks[(TRightsFlag)Flag];
  26. switch (value) {
  27. case rsNo: CheckBox->State = cbUnchecked; break;
  28. case rsYes: CheckBox->State = cbChecked; break;
  29. case rsUndef: CheckBox->State = cbGrayed; break;
  30. }
  31. }
  32. //---------------------------------------------------------------------------
  33. TRightState __fastcall TRightsFrame::GetStates(TRightsFlag Flag)
  34. {
  35. switch (Checks[(TRightsFlag)Flag]->State) {
  36. case cbUnchecked: return rsNo;
  37. case cbChecked: return rsYes;
  38. case cbGrayed:
  39. default: return rsUndef;
  40. }
  41. }
  42. //---------------------------------------------------------------------------
  43. void __fastcall TRightsFrame::SetRights(TRights value)
  44. {
  45. AllowUndef = true; // temporarily
  46. for (int Flag = 0; Flag < RightsFlagCount; Flag++)
  47. {
  48. States[(TRightsFlag)Flag] = value.RightUndef[(TRightsFlag)Flag];
  49. }
  50. AllowUndef = value.AllowUndef;
  51. UpdateControls();
  52. }
  53. //---------------------------------------------------------------------------
  54. TRights __fastcall TRightsFrame::GetRights()
  55. {
  56. TRights Result;
  57. Result.AllowUndef = AllowUndef;
  58. for (int Flag = 0; Flag < RightsFlagCount; Flag++)
  59. {
  60. Result.RightUndef[(TRightsFlag)Flag] = States[(TRightsFlag)Flag];
  61. }
  62. return Result;
  63. }
  64. //---------------------------------------------------------------------------
  65. void __fastcall TRightsFrame::SetAllowUndef(bool value)
  66. {
  67. for (int Index = 0; Index < CheckCount; Index++)
  68. {
  69. Checks[(TRightsFlag)Index]->AllowGrayed = value;
  70. }
  71. }
  72. //---------------------------------------------------------------------------
  73. bool __fastcall TRightsFrame::GetAllowUndef()
  74. {
  75. bool Result = false, First = true;
  76. for (int Index = 0; Index < CheckCount; Index++)
  77. {
  78. TCheckBox *Check = Checks[(TRightsFlag)Index];
  79. if (First)
  80. {
  81. Result = Check->AllowGrayed;
  82. First = false;
  83. }
  84. else if (Result != Check->AllowGrayed)
  85. {
  86. assert(false);
  87. }
  88. }
  89. return Result;
  90. }
  91. //---------------------------------------------------------------------------
  92. TCheckBox * __fastcall TRightsFrame::GetChecks(TRightsFlag Flag)
  93. {
  94. assert((Flag >= 0) && (Flag < RightsFlagCount));
  95. for (int Index = 0; Index < ControlCount; Index++)
  96. {
  97. if (Controls[Index]->InheritsFrom(__classid(TCheckBox)) &&
  98. ((Controls[Index]->Tag - 1) == Flag))
  99. {
  100. return ((TCheckBox *)Controls[Index]);
  101. }
  102. }
  103. assert(false);
  104. return NULL;
  105. }
  106. //---------------------------------------------------------------------------
  107. int __fastcall TRightsFrame::GetCheckCount()
  108. {
  109. return RightsFlagCount;
  110. }
  111. //---------------------------------------------------------------------------
  112. void __fastcall TRightsFrame::SetAddXToDirectories(bool value)
  113. {
  114. DirectoriesXCheck->Checked = value;
  115. }
  116. //---------------------------------------------------------------------------
  117. bool __fastcall TRightsFrame::GetAddXToDirectories()
  118. {
  119. return DirectoriesXCheck->Checked;
  120. }
  121. //---------------------------------------------------------------------------
  122. void __fastcall TRightsFrame::ControlChange(TObject * /*Sender*/)
  123. {
  124. UpdateControls();
  125. }
  126. //---------------------------------------------------------------------------
  127. void __fastcall TRightsFrame::UpdateControls()
  128. {
  129. TRights R = Rights;
  130. DirectoriesXCheck->Visible = AllowAddXToDirectories;
  131. EnableControl(DirectoriesXCheck,
  132. Enabled && !((R.NumberSet & raExecute) == raExecute));
  133. if (!OctalEdit->Focused())
  134. {
  135. OctalEdit->Text = R.IsUndef ? AnsiString() : R.Octal;
  136. OctalEdit->Modified = false;
  137. }
  138. DoChange();
  139. }
  140. //---------------------------------------------------------------------------
  141. void __fastcall TRightsFrame::CycleRights(int Group)
  142. {
  143. TRightState State;
  144. bool Same = true;
  145. for (int Flag = 0; Flag < 3; Flag++)
  146. {
  147. TRightState CState = States[(TRightsFlag)(Flag + ((Group - 1) * 3))];
  148. if (Flag == 0) State = CState;
  149. else
  150. if (State != CState) Same = False;
  151. }
  152. if (!Same)
  153. {
  154. State = rsYes;
  155. }
  156. else
  157. {
  158. switch (State) {
  159. case rsYes: State = rsNo; break;
  160. case rsNo: if (AllowUndef) State = rsUndef; else State = rsYes; break;
  161. case rsUndef: State = rsYes; break;
  162. }
  163. }
  164. for (int Flag = 0; Flag < 3; Flag++)
  165. {
  166. States[(TRightsFlag)(Flag + ((Group - 1) * 3))] = State;
  167. }
  168. UpdateControls();
  169. }
  170. //---------------------------------------------------------------------------
  171. void __fastcall TRightsFrame::RightsButtonsClick(TObject *Sender)
  172. {
  173. CycleRights(((TComponent*)Sender)->Tag);
  174. }
  175. //---------------------------------------------------------------------------
  176. void __fastcall TRightsFrame::SetAllowAddXToDirectories(bool value)
  177. {
  178. if (FAllowAddXToDirectories != value)
  179. {
  180. FAllowAddXToDirectories = value;
  181. UpdateControls();
  182. }
  183. }
  184. //---------------------------------------------------------------------------
  185. void __fastcall TRightsFrame::DoChange()
  186. {
  187. if (FOnChange)
  188. {
  189. FOnChange(this);
  190. }
  191. }
  192. //---------------------------------------------------------------------------
  193. void __fastcall TRightsFrame::SetEnabled(bool Value)
  194. {
  195. TFrame::SetEnabled(Value);
  196. UpdateControls();
  197. }
  198. //---------------------------------------------------------------------------
  199. void __fastcall TRightsFrame::UpdateByOctal()
  200. {
  201. if (!OctalEdit->Text.IsEmpty())
  202. {
  203. TRights R = Rights;
  204. R.Octal = OctalEdit->Text;
  205. Rights = R;
  206. }
  207. UpdateControls();
  208. OctalEdit->Modified = false;
  209. }
  210. //---------------------------------------------------------------------------
  211. void __fastcall TRightsFrame::OctalEditExit(TObject * /*Sender*/)
  212. {
  213. if (OctalEdit->Modified)
  214. {
  215. try
  216. {
  217. UpdateByOctal();
  218. }
  219. catch(...)
  220. {
  221. OctalEdit->SelectAll();
  222. OctalEdit->SetFocus();
  223. throw;
  224. }
  225. }
  226. }
  227. //---------------------------------------------------------------------------
  228. void __fastcall TRightsFrame::OctalEditChange(TObject * /*Sender*/)
  229. {
  230. if (OctalEdit->Modified && OctalEdit->Text.Length() == 3)
  231. {
  232. try
  233. {
  234. UpdateByOctal();
  235. }
  236. catch(...)
  237. {
  238. OctalEdit->Modified = true;
  239. }
  240. }
  241. }
  242. //---------------------------------------------------------------------------
  243. void __fastcall TRightsFrame::RightsActionsExecute(TBasicAction * Action,
  244. bool & Handled)
  245. {
  246. TRights R = Rights;
  247. R.Number = raNo;
  248. Handled = true;
  249. if (Action == NoRightsAction)
  250. {
  251. R = raNo;
  252. }
  253. else if (Action == DefaultRightsAction)
  254. {
  255. R = raDefault;
  256. }
  257. else if (Action == AllRightsAction)
  258. {
  259. R = raAll;
  260. }
  261. else if (Action == LeaveRightsAsIsAction)
  262. {
  263. R.AllUndef();
  264. }
  265. else
  266. {
  267. Handled = false;
  268. }
  269. Rights = R;
  270. }
  271. //---------------------------------------------------------------------------
  272. void __fastcall TRightsFrame::RightsActionsUpdate(TBasicAction *Action,
  273. bool &Handled)
  274. {
  275. TRights R = Rights;
  276. Handled = true;
  277. if (Action == NoRightsAction)
  278. {
  279. NoRightsAction->Checked = !R.IsUndef && (R.NumberSet == raNo);
  280. }
  281. else if (Action == DefaultRightsAction)
  282. {
  283. DefaultRightsAction->Checked = !R.IsUndef && (R.NumberSet == raDefault);
  284. }
  285. else if (Action == AllRightsAction)
  286. {
  287. AllRightsAction->Checked = !R.IsUndef && (R.NumberSet == raAll);
  288. }
  289. else if (Action == LeaveRightsAsIsAction)
  290. {
  291. LeaveRightsAsIsAction->Enabled = R.AllowUndef;
  292. LeaveRightsAsIsAction->Checked = (R.NumberSet == raNo) && (R.NumberUnset == raNo);
  293. }
  294. else
  295. {
  296. Handled = false;
  297. }
  298. }
  299. //---------------------------------------------------------------------------