{------------------------------------------------------------------------------} { Unit Name: SecurityForm Purpose : The user interface to change security levels for controls Author : Vesa Lappalainen Date : 09.10.1999 Changed : 30.06.2001 + edits visibility when column visibility clicked } {------------------------------------------------------------------------------} unit SecurityForm; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ToolWin, ComCtrls, ExtCtrls, Grids, security, Buttons, AppEvnts, kinicomp, StringGridIni, savepos, kComp, KParam, ActnList, menus; type TFormSecurity = class(TForm) PanelLists: TPanel; ToolBarButtons: TToolBar; ListBoxForms: TListBox; StringGridControls: TStringGridIni; CBQuickLevel: TCheckBoxIni; ButtonClose: TToolButton; ButtonEdit: TToolButton; ToolButton1: TToolButton; CBQuickVisibility: TCheckBoxIni; SavePos1: TSavePos; ParamTestLevel: TkParam; ActionList1: TActionList; ActionTestLevel: TAction; ButtonSaveAll: TToolButton; ToolButton3: TToolButton; ButtonFind: TToolButton; procedure ListBoxFormsClick(Sender: TObject); procedure StringGridControlsSetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String); procedure FormDestroy(Sender: TObject); procedure StringGridControlsDblClick(Sender: TObject); procedure ButtonCloseClick(Sender: TObject); procedure ButtonEditClick(Sender: TObject); procedure FormKeyPress(Sender: TObject; var Key: Char); procedure StringGridControlsSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); procedure ParamTestLevelAfterChange(Sender: TObject; var val: Double); procedure ActionTestLevelExecute(Sender: TObject); procedure ButtonSaveAllClick(Sender: TObject); procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure ButtonFindClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private FSec : TSecurityControl; fPointer:TForm; FOldItem : TkSecurity; FOldForm : TForm; FOldFormVis : boolean; FOldRow : integer; FOrigLevel : integer; procedure UpdateGrid; procedure EditLevel; procedure RetOld; procedure HandleRow(ARow: integer); procedure RetOldForm; procedure UpdateLevel; procedure FindCtrl(c: TComponent); public { Public declarations } constructor Create(AOwner:TComponent); override; procedure RepairForDestroy; end; implementation {$R *.DFM} { TFormSecurity } constructor TFormSecurity.Create(AOwner: TComponent); var p:TPanel; begin inherited; fPointer := TForm.Create(nil); fPointer.Top := 0; fPointer.Left := 0; fPointer.Visible := true; fPointer.Width := 15; fPointer.Height := 0; fPointer.BorderStyle := bsNone; fPointer.BorderIcons := []; fPointer.Caption := '->'; fPointer.FormStyle := fsStayOnTop; p := TPanel.Create(fPointer); p.Parent := fPointer; p.Align := alClient; p.Caption := '->'; p.Font.Size := 20; p.Color := clRed; p.Alignment := taRightJustify; p.BevelInner := bvNone; p.BevelOuter := bvNone; FSec := nil; if not ( AOwner is TSecurityControl ) then exit; Fsec := TSecurityControl(AOwner); FOrigLevel := FSec.UserSecurityLevel; FSec.AddToList(ListBoxForms.Items); if ( ListBoxForms.Items.Count > 0 ) then begin ListBoxForms.ItemIndex := 0; UpdateGrid; end; end; procedure TFormSecurity.ListBoxFormsClick(Sender: TObject); begin UpdateGrid; end; procedure TFormSecurity.RetOldForm(); begin if ( FOldForm = nil ) then exit; FOldForm.Visible := FOldFormVis; end; procedure TFormSecurity.UpdateGrid; var i:integer; f:TForm; begin if ( FSec = nil ) then exit; UpdateLevel; i := ListBoxForms.ItemIndex; if ( i < 0 ) then exit; RetOldForm(); f := FSec.UpdateGrid(StringGridControls,ListBoxForms.Items.Objects[i]); if ( f <> nil ) then begin FOldFormVis := f.Visible; f.Show; end; FOldForm := f; // Show; // SetFocus; BringToFront; FOldRow := -1; HandleRow(StringGridControls.Row); end; procedure TFormSecurity.StringGridControlsSetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String); begin FSec.UpdateValue(StringGridControls.Rows[ARow]); end; procedure TFormSecurity.FormDestroy(Sender: TObject); begin fPointer.Free; if ( FSec = nil ) then exit; FSec.UserSecurityLevel := FOrigLevel; RetOldForm(); RetOld(); // FSec.Save; end; procedure TFormSecurity.StringGridControlsDblClick(Sender: TObject); var r,c:Longint; pt:TPoint; begin pt := StringGridControls.ScreenToClient(Mouse.CursorPos); StringGridControls.MouseToCell(pt.x,pt.y,c,r); if ( c < 4) then begin EditLevel; exit; end; if ( FSec.EditVisibility(StringGridControls.Rows[StringGridControls.Row]) ) then UpdateGrid; end; procedure TFormSecurity.EditLevel; begin if ( FSec.EditLevel(StringGridControls.Rows[StringGridControls.Row]) ) then UpdateGrid; end; procedure TFormSecurity.ButtonCloseClick(Sender: TObject); begin Close; end; procedure TFormSecurity.ButtonEditClick(Sender: TObject); begin EditLevel; end; procedure TFormSecurity.FormKeyPress(Sender: TObject; var Key: Char); var mode:integer; begin mode := 0; if ( CBQuickLevel.Checked ) then mode := mode or 1; if ( CBQuickVisibility.Checked ) then mode := mode or 2; if ( mode = 0 ) then exit; if ( FSec.SetLevel(StringGridControls.Rows[StringGridControls.Row],Key,mode) ) then UpdateGrid; end; procedure TFormSecurity.RetOld; begin if ( FOldItem = nil ) then exit; FOldItem.SetItem(false,false); FOldItem.SetItem; end; procedure TFormSecurity.FindCtrl(c:TComponent); var i:integer; secitem:TkSecurity; begin for i:=1 to StringGridControls.RowCount-1 do begin secitem := TkSecurity(StringGridControls.Objects[0,i]); if ( secitem.ItemName = c.Name ) then begin StringGridControls.Row := i; HandleRow(i); exit; end; end; end; procedure TFormSecurity.HandleRow(ARow:integer); var secitem:TkSecurity; c : TControl; p : TPoint; begin if ( ARow = FOldRow ) then exit; FOldRow := ARow; RetOld(); FoldItem := nil; secitem := TkSecurity(StringGridControls.Objects[0,ARow]); if ( secitem = nil ) then exit; if not ( secitem.ItemToControl.Owner is TWinControl ) then exit; if not ( secitem.ItemToControl is TControl ) then exit; FOldItem := secItem; c := TControl(secitem.ItemToControl); p.x := 0; p.y := 0; p := c.ClientToScreen(p); if ( fPointer = nil ) then exit; fPointer.Left := p.x-fPointer.Width; fPointer.Top := p.y+c.Height div 2-fPointer.Height div 2; secItem.SetItem(true,true); c.Show; fPointer.Show; fPointer.BringToFront; BringToFront; end; procedure TFormSecurity.StringGridControlsSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin CanSelect := true; HandleRow(ARow); end; procedure TFormSecurity.UpdateLevel; begin if ( FSec = nil ) then exit; if ( ParamTestLevel.AsInteger < 0 ) then exit; FSec.UserSecurityLevel := (ParamTestLevel.AsInteger); end; procedure TFormSecurity.ParamTestLevelAfterChange(Sender: TObject; var val: Double); begin UpdateLevel; end; procedure TFormSecurity.ActionTestLevelExecute(Sender: TObject); begin ParamTestLevel.Ask; end; procedure TFormSecurity.ButtonSaveAllClick(Sender: TObject); begin FSec.Save; end; function FindMenu(f:TCustomForm):TComponent; var i:integer; begin for i:=0 to f.ComponentCount-1 do begin if ( f.Components[i] is TMainMenu ) then begin Result := f.Components[i]; exit; end; end; Result := nil; end; function ComponentInPoint(f:TCustomForm; pt : TPoint) : TComponent; var p : TPoint; c : TControl; begin p := f.ScreenToClient(pt); c := f.ControlAtPos(p,true,true); Result := c; if ( c = nil ) and ( p.y < 0 ) then begin Result := FindMenu(f); Exit; end; while ( c <> nil ) do begin if ( c.Name <> '' ) then Result := c; if not ( c is TWinControl ) then exit; p := c.ScreenToClient(pt); c := TWinControl(c).ControlAtPos(p,true,true); end; end; function FormInPoint(pt:TPoint):TCustomForm; var wc : TWinControl; handle:THandle; begin Result := nil; handle := WindowFromPoint(pt); wc := FindControl(handle); if not ( wc is TCustomForm ) then wc := GetParentForm(wc); if not ( wc is TCustomForm ) then exit; Result := TCustomForm(wc); end; procedure TFormSecurity.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var pt :TPoint; f:TCustomForm; i:integer; c:TComponent; begin ReleaseCapture; pt := ClientToScreen(Point(X,Y)); f := FormInPoint(pt); Show; if ( f = nil ) then exit; c := ComponentInPoint(f,pt); i := ListBoxForms.Items.IndexOf(f.Name); ListBoxForms.ItemIndex := i; UpdateGrid; if ( c = nil ) then exit; FindCtrl(c); end; procedure TFormSecurity.ButtonFindClick(Sender: TObject); begin SetCapture(self.Handle); Hide; if ( fPointer <> nil ) then fPointer.Hide; end; procedure TFormSecurity.FormClose(Sender: TObject; var Action: TCloseAction); begin FSec.FormClose; end; procedure TFormSecurity.RepairForDestroy; begin FSec := nil; end; end.