doublecmd/src/fattributesedit.pas
2011-02-10 05:27:42 +00:00

244 lines
6.4 KiB
ObjectPascal

{
Double Commander
-------------------------------------------------------------------------
Graphic control that allows choosing file attributes.
Copyright (C) 2010 Przemysław Nagay (cobines@gmail.com)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
}
unit fAttributesEdit;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, ExtCtrls, StdCtrls, Buttons;
type
{ TfrmAttributesEdit }
TfrmAttributesEdit = class(TForm)
btnOk: TBitBtn;
btnCancel: TBitBtn;
btnReset: TButton;
cbExecGroup: TCheckBox;
cbExecOther: TCheckBox;
cbExecOwner: TCheckBox;
cbReadGroup: TCheckBox;
cbReadOther: TCheckBox;
cbReadOwner: TCheckBox;
cbSgid: TCheckBox;
cbSticky: TCheckBox;
cbSuid: TCheckBox;
cbWriteGroup: TCheckBox;
cbWriteOther: TCheckBox;
cbWriteOwner: TCheckBox;
cbDirectory: TCheckBox;
cbSymlink: TCheckBox;
cbCompressed: TCheckBox;
cbEncrypted: TCheckBox;
cbTemporary: TCheckBox;
cbSparse: TCheckBox;
cbArchive: TCheckBox;
cbHidden: TCheckBox;
cbReadOnly: TCheckBox;
cbSystem: TCheckBox;
edtTextAttrs: TEdit;
gbWinGeneral: TGroupBox;
gbNtfsAttributes: TGroupBox;
lblAttrBitsStr: TLabel;
lblAttrGroupStr: TLabel;
lblAttrOtherStr: TLabel;
lblAttrOwnerStr: TLabel;
lblTextAttrs: TLabel;
lblExec: TLabel;
lblRead: TLabel;
lblWrite: TLabel;
pnlTextAttrs: TPanel;
pnlTopAttrs: TPanel;
pnlUnixAttrs: TPanel;
pnlWinAttrs: TPanel;
pnlButtons: TPanel;
procedure btnCancelClick(Sender: TObject);
procedure btnOkClick(Sender: TObject);
procedure btnResetClick(Sender: TObject);
procedure cbAttrCheckBoxChanged(Sender: TObject);
procedure cbAttrCheckBoxClicked(Sender: TObject);
private
FOnOk: TNotifyEvent;
FUpdatingControls: Boolean;
function GetAttrsAsText: String;
procedure UpdateText;
function GetCheckStr(CheckBox: TCheckBox; AttrStr: String): String;
public
constructor Create(TheOwner: TComponent); override;
procedure Reset;
property OnOk: TNotifyEvent read FOnOk write FOnOk;
property AttrsAsText: String read GetAttrsAsText;
end;
implementation
{$R *.lfm}
procedure TfrmAttributesEdit.btnOkClick(Sender: TObject);
begin
if Assigned(FOnOk) then
FOnOk(Self);
Close;
end;
procedure TfrmAttributesEdit.btnCancelClick(Sender: TObject);
begin
Close;
end;
procedure TfrmAttributesEdit.btnResetClick(Sender: TObject);
begin
Reset;
end;
procedure TfrmAttributesEdit.cbAttrCheckBoxChanged(Sender: TObject);
begin
// Note: OnChange may work incorrectly with tri-state checkboxes,
// so OnClick is also used.
UpdateText;
end;
procedure TfrmAttributesEdit.cbAttrCheckBoxClicked(Sender: TObject);
begin
UpdateText;
end;
constructor TfrmAttributesEdit.Create(TheOwner: TComponent);
begin
FOnOk := nil;
FUpdatingControls := False;
inherited Create(TheOwner);
{$IF DEFINED(MSWINDOWS)}
pnlWinAttrs.Visible := True;
{$ELSEIF DEFINED(UNIX)}
pnlUnixAttrs.Visible := True;
{$ENDIF}
end;
procedure TfrmAttributesEdit.Reset;
begin
FUpdatingControls := True;
cbDirectory.State := cbGrayed;
cbSymlink.State := cbGrayed;
cbReadOwner.State := cbGrayed;
cbWriteOwner.State := cbGrayed;
cbExecOwner.State := cbGrayed;
cbReadGroup.State := cbGrayed;
cbWriteGroup.State := cbGrayed;
cbExecGroup.State := cbGrayed;
cbReadOther.State := cbGrayed;
cbWriteOther.State := cbGrayed;
cbExecOther.State := cbGrayed;
cbSuid.State := cbGrayed;
cbSgid.State := cbGrayed;
cbSticky.State := cbGrayed;
cbArchive.State := cbGrayed;
cbReadOnly.State := cbGrayed;
cbHidden.State := cbGrayed;
cbSystem.State := cbGrayed;
cbCompressed.State := cbGrayed;
cbEncrypted.State := cbGrayed;
cbTemporary.State := cbGrayed;
cbSparse.State := cbGrayed;
edtTextAttrs.Text := '';
edtTextAttrs.Text := '';
FUpdatingControls := False;
end;
function TfrmAttributesEdit.GetAttrsAsText: String;
begin
Result := edtTextAttrs.Text;
end;
procedure TfrmAttributesEdit.UpdateText;
var
s: string = '';
begin
if not FUpdatingControls then
begin
FUpdatingControls := True;
s := s + GetCheckStr(cbDirectory, 'd');
s := s + GetCheckStr(cbSymlink, 'l');
if pnlUnixAttrs.Visible then
begin
s := s + GetCheckStr(cbReadOwner, 'ur');
s := s + GetCheckStr(cbWriteOwner, 'uw');
s := s + GetCheckStr(cbExecOwner, 'ux');
s := s + GetCheckStr(cbReadGroup, 'gr');
s := s + GetCheckStr(cbWriteGroup, 'gw');
s := s + GetCheckStr(cbExecGroup, 'gx');
s := s + GetCheckStr(cbReadOther, 'or');
s := s + GetCheckStr(cbWriteOther, 'ow');
s := s + GetCheckStr(cbExecOther, 'ox');
s := s + GetCheckStr(cbSuid, 'us');
s := s + GetCheckStr(cbSgid, 'gs');
s := s + GetCheckStr(cbSticky, 'sb');
end;
if pnlWinAttrs.Visible then
begin
s := s + GetCheckStr(cbArchive, 'a');
s := s + GetCheckStr(cbReadOnly, 'r');
s := s + GetCheckStr(cbHidden, 'h');
s := s + GetCheckStr(cbSystem, 's');
s := s + GetCheckStr(cbCompressed, 'c');
s := s + GetCheckStr(cbEncrypted, 'e');
s := s + GetCheckStr(cbTemporary, 't');
s := s + GetCheckStr(cbSparse, 's');
end;
edtTextAttrs.Text := s;
FUpdatingControls := False;
end;
end;
function TfrmAttributesEdit.GetCheckStr(CheckBox: TCheckBox; AttrStr: String): String;
begin
case CheckBox.State of
cbChecked:
Result := AttrStr + '+';
cbUnchecked:
Result := AttrStr + '-';
else
Result := '';
end;
end;
end.