mirror of
				https://gitlab.com/freepascal.org/lazarus/lazarus.git
				synced 2025-11-04 05:59:49 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			367 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			367 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
{ Copyright (C) 2005
 | 
						|
 | 
						|
 *****************************************************************************
 | 
						|
  See the file COPYING.modifiedLGPL.txt, included in this distribution,
 | 
						|
  for details about the license.
 | 
						|
 *****************************************************************************
 | 
						|
 | 
						|
  Author: Lagunov Aleksey
 | 
						|
 | 
						|
  Abstract:
 | 
						|
    Property Editors for TMaskEdit.EditMask of FCL and LCL.
 | 
						|
}
 | 
						|
 | 
						|
unit MaskPropEdit;
 | 
						|
 | 
						|
{$mode objfpc}{$H+}
 | 
						|
 | 
						|
interface
 | 
						|
 | 
						|
uses
 | 
						|
  Classes, SysUtils,
 | 
						|
  // LCL
 | 
						|
  Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, ButtonPanel, MaskEdit,
 | 
						|
  // LazUtils
 | 
						|
  LazUTF8, LazFileUtils,
 | 
						|
  // IdeIntf
 | 
						|
  LazIDEIntf, PropEdits, ComponentEditors, ObjInspStrConsts, IDEWindowIntf;
 | 
						|
 | 
						|
type
 | 
						|
 | 
						|
  { TMaskEditorForm }
 | 
						|
 | 
						|
  TMaskEditorForm = class(TForm)
 | 
						|
    ButtonPanel1: TButtonPanel;
 | 
						|
    LoadSampleMasksButton: TButton;
 | 
						|
    SaveLiteralCheckBox: TCheckBox;
 | 
						|
    InputMaskEdit: TEdit;
 | 
						|
    CharactersForBlanksEdit: TEdit;
 | 
						|
    InputMaskLabel: TLabel;
 | 
						|
    SampleMasksLabel: TLabel;
 | 
						|
    CharactersForBlanksLabel: TLabel;
 | 
						|
    TestInputLabel: TLabel;
 | 
						|
    SampleMasksListBox: TListBox;
 | 
						|
    TestMaskEdit: TMaskEdit;
 | 
						|
    OpenDialog1: TOpenDialog;
 | 
						|
    TestInputPanel: TPanel;
 | 
						|
    procedure FormClose(Sender: TObject; var {%H-}CloseAction: TCloseAction);
 | 
						|
    procedure LoadSampleMasksButtonClick(Sender: TObject);
 | 
						|
    procedure SampleMasksListBoxDrawItem(Control: TWinControl; Index: Integer;
 | 
						|
      ARect: TRect; {%H-}State: TOwnerDrawState);
 | 
						|
    procedure SaveLiteralCheckBoxClick(Sender: TObject);
 | 
						|
    procedure InputMaskEditChange(Sender: TObject);
 | 
						|
    procedure CharactersForBlankEditChange(Sender: TObject);
 | 
						|
    procedure SampleMasksListBoxClick(Sender: TObject);
 | 
						|
    procedure MaskEditorFormCreate(Sender: TObject);
 | 
						|
  private
 | 
						|
    function ConstructEditmask: String;
 | 
						|
    function GetEditMask: string;
 | 
						|
    procedure LoadDEMFile(AFileName: string);
 | 
						|
    procedure ReConstructEditmask;
 | 
						|
    procedure SetEditMask(AValue: string);
 | 
						|
    procedure UpdateTestEditor;
 | 
						|
  public
 | 
						|
    property EditMask: string read GetEditMask write SetEditMask;
 | 
						|
  end; 
 | 
						|
 | 
						|
  { TEditMaskProperty }
 | 
						|
 | 
						|
  TEditMaskProperty = class(TStringPropertyEditor)
 | 
						|
  public
 | 
						|
    function  GetAttributes: TPropertyAttributes; override;
 | 
						|
    procedure Edit; override;
 | 
						|
  end;
 | 
						|
 | 
						|
  { TMaskEditEditor }
 | 
						|
  TCustomMaskEditAccess = class(TCustomMaskEdit)
 | 
						|
  end; //Hack to get access to EditMask
 | 
						|
 | 
						|
  TMaskEditEditor = class(TDefaultComponentEditor)
 | 
						|
  public
 | 
						|
    procedure ExecuteVerb(Index: Integer); override;
 | 
						|
    function GetVerb(Index: Integer): string; override;
 | 
						|
    function GetVerbCount: Integer; override;
 | 
						|
    function MaskEdit: TCustomMaskEditAccess; virtual;
 | 
						|
  end;
 | 
						|
 | 
						|
implementation
 | 
						|
 | 
						|
{$R *.lfm}
 | 
						|
 | 
						|
procedure ParseMaskLine(Line: String; out Caption, Example, Mask: String);
 | 
						|
begin
 | 
						|
  // in delphi .dem files every mask line contains:
 | 
						|
  // mask name|mask example|mask
 | 
						|
 | 
						|
  // 1. Extract caption from Line
 | 
						|
  Caption := Copy(Line, 1, Pos(' | ', Line) - 1);
 | 
						|
  Delete(Line, 1, Length(Caption) + 3);
 | 
						|
 | 
						|
  // 2. Extract example from Line
 | 
						|
  Example := Copy(Line, 1, Pos(' | ', Line) - 1);
 | 
						|
  Delete(Line, 1, Length(Example) + 3);
 | 
						|
 | 
						|
  // 3. Copy what we have to Mask
 | 
						|
  Mask := Line;
 | 
						|
end;
 | 
						|
 | 
						|
function MaskDoFormatText(const EditMask: string; const Value: string; Blank: Char): String;
 | 
						|
var
 | 
						|
  P: Integer;
 | 
						|
  S: String;
 | 
						|
begin
 | 
						|
  // cheat maskutils while it has no its own MaskDoFormatText
 | 
						|
  S := EditMask;
 | 
						|
  P := LastDelimiter(';', S);
 | 
						|
  if P <> 0 then
 | 
						|
  begin
 | 
						|
    S[P + 1] := Blank;
 | 
						|
    dec(P);
 | 
						|
    while (P > 0) and (S[P] <> ';') do
 | 
						|
      dec(P);
 | 
						|
    if P <> 0 then
 | 
						|
     S[P + 1] := '0';
 | 
						|
  end;
 | 
						|
  try
 | 
						|
    Result := FormatMaskText(S, Value);
 | 
						|
  except
 | 
						|
    Result := Value;
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
{ TMaskEditorForm }
 | 
						|
 | 
						|
procedure TMaskEditorForm.MaskEditorFormCreate(Sender: TObject);
 | 
						|
var
 | 
						|
  aDemFile: string;
 | 
						|
begin
 | 
						|
  LoadSampleMasksButton.Caption := oisMasks;
 | 
						|
  SaveLiteralCheckBox.Caption := oisSaveLiteralCharacters;
 | 
						|
  InputMaskLabel.Caption := oisInputMask;
 | 
						|
  SampleMasksLabel.Caption := oisSampleMasks;
 | 
						|
  CharactersForBlanksLabel.Caption := oisCharactersForBlanks;
 | 
						|
  TestInputLabel.Caption := oisTestInput;
 | 
						|
 | 
						|
  if LazarusIDE<>nil then
 | 
						|
    aDemFile:=LazarusIDE.GetPrimaryConfigPath
 | 
						|
  else
 | 
						|
    aDemFile:=ExtractFileDir(ParamStrUTF8(0));
 | 
						|
  aDemFile:=CleanAndExpandDirectory(aDemFile)+'maskeditmasks.txt';
 | 
						|
  if FileExistsUTF8(aDemFile) then
 | 
						|
    LoadDEMFile(aDemFile);
 | 
						|
  IDEDialogLayoutList.ApplyLayout(Self);
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMaskEditorForm.FormClose(Sender: TObject; var CloseAction: TCloseAction);
 | 
						|
begin
 | 
						|
  IDEDialogLayoutList.SaveLayout(Self);
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMaskEditorForm.LoadSampleMasksButtonClick(Sender: TObject);
 | 
						|
begin
 | 
						|
  OpenDialog1.InitialDir:=ExtractFileDir(ParamStrUTF8(0));
 | 
						|
  if OpenDialog1.Execute then
 | 
						|
    LoadDEMFile(OpenDialog1.FileName);
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMaskEditorForm.SampleMasksListBoxDrawItem(Control: TWinControl;
 | 
						|
  Index: Integer; ARect: TRect; State: TOwnerDrawState);
 | 
						|
var
 | 
						|
  OldBrushStyle: TBrushStyle;
 | 
						|
  OldTextStyle: TTextStyle;
 | 
						|
  NewTextStyle: TTextStyle;
 | 
						|
  ListBox: TListBox absolute Control;
 | 
						|
  AMaskCaption, AMaskExample, AEditMask: String;
 | 
						|
  R1, R2: TRect;
 | 
						|
begin
 | 
						|
  ListBox.Canvas.FillRect(ARect);
 | 
						|
  if (Index >= 0) and (Index < ListBox.Items.Count) then
 | 
						|
  begin
 | 
						|
    OldBrushStyle := ListBox.Canvas.Brush.Style;
 | 
						|
    ListBox.Canvas.Brush.Style := bsClear;
 | 
						|
 | 
						|
    OldTextStyle := ListBox.Canvas.TextStyle;
 | 
						|
    NewTextStyle := OldTextStyle;
 | 
						|
    NewTextStyle.Layout := tlCenter;
 | 
						|
    ListBox.Canvas.TextStyle := NewTextStyle;
 | 
						|
 | 
						|
    ParseMaskLine(ListBox.Items[Index], AMaskCaption, AMaskExample, AEditMask);
 | 
						|
    AMaskExample := MaskDoFormatText(AEditMask, AMaskExample, ' ');
 | 
						|
 | 
						|
    R1 := ARect;
 | 
						|
    R2 := ARect;
 | 
						|
    R1.Right := (R1.Left + R1.Right) div 2;
 | 
						|
    R2.Left := R1.Right + 1;
 | 
						|
    ListBox.Canvas.TextRect(R1, R1.Left + 2, R1.Top, AMaskCaption);
 | 
						|
    ListBox.Canvas.TextRect(R2, R2.Left + 2, R2.Top, AMaskExample);
 | 
						|
    ListBox.Canvas.MoveTo(R2.Left - 1, R2.Top);
 | 
						|
    ListBox.Canvas.LineTo(R2.Left - 1, R2.Bottom);
 | 
						|
    ListBox.Canvas.Brush.Style := OldBrushStyle;
 | 
						|
    ListBox.Canvas.TextStyle := OldTextStyle;
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMaskEditorForm.SaveLiteralCheckBoxClick(Sender: TObject);
 | 
						|
 | 
						|
begin
 | 
						|
  ReconstructEditMask;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMaskEditorForm.InputMaskEditChange(Sender: TObject);
 | 
						|
begin
 | 
						|
  UpdateTestEditor;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMaskEditorForm.CharactersForBlankEditChange(Sender: TObject);
 | 
						|
var
 | 
						|
  S:string;
 | 
						|
  SL: Boolean;
 | 
						|
  BC: Char;
 | 
						|
begin
 | 
						|
  SplitEditMask(InputMaskEdit.Text, S, SL, BC);
 | 
						|
  if (CharactersForBlanksEdit.Text<>'') and (Length(S) > 0) then
 | 
						|
    begin
 | 
						|
      BC := CharactersForBlanksEdit.Text[1];
 | 
						|
      if SL then InputMaskEdit.Text:=S + MaskFieldSeparator + '1' + MaskFieldSeparator + BC
 | 
						|
        else InputMaskEdit.Text:=S + MaskFieldSeparator + MaskNoSave + MaskFieldSeparator + BC;
 | 
						|
    end
 | 
						|
    else
 | 
						|
      ReConstructEditMask
 | 
						|
end;
 | 
						|
 | 
						|
 | 
						|
Function TMaskEditorForm.ConstructEditmask : String;
 | 
						|
 | 
						|
Var
 | 
						|
  S : String;
 | 
						|
  B : Char;
 | 
						|
  L : Boolean;
 | 
						|
 | 
						|
begin
 | 
						|
  SplitEditMask(InputMaskEdit.Text,S,L,B);
 | 
						|
  If (CharactersForBlanksEdit.Text<>'') then
 | 
						|
    B:=CharactersForBlanksEdit.Text[1];
 | 
						|
  if (Length(S) = 0) then
 | 
						|
    Result := ''
 | 
						|
  else
 | 
						|
    Result:=Format('%s'+MaskFieldSeparator+'%d'+MaskFieldSeparator+'%s',[S,ord(SaveLiteralCheckBox.checked),B]);
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMaskEditorForm.ReConstructEditmask;
 | 
						|
 | 
						|
begin
 | 
						|
  InputMaskEdit.Text:=ConstructEditMask;
 | 
						|
  UpdateTestEditor;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMaskEditorForm.SampleMasksListBoxClick(Sender: TObject);
 | 
						|
var
 | 
						|
  AMaskCaption, AMaskExample, AEditMask: String;
 | 
						|
begin
 | 
						|
  if (SampleMasksListBox.Items.Count > 0) then
 | 
						|
  begin
 | 
						|
    TestMaskEdit.Text := '';
 | 
						|
    ParseMaskLine(SampleMasksListBox.Items[SampleMasksListBox.ItemIndex],
 | 
						|
      AMaskCaption, AMaskExample, AEditMask);
 | 
						|
    EditMask := AEditMask;
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
function TMaskEditorForm.GetEditMask: string;
 | 
						|
begin
 | 
						|
  Result:=ConstructEditMask;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMaskEditorForm.LoadDEMFile(AFileName: string);
 | 
						|
begin
 | 
						|
  SampleMasksListBox.Items.Clear;
 | 
						|
  SampleMasksListBox.Items.LoadFromFile(UTF8ToSys(AFileName));
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMaskEditorForm.SetEditMask(AValue: string);
 | 
						|
 | 
						|
Var
 | 
						|
  M : String;
 | 
						|
  B : Char;
 | 
						|
  S : Boolean;
 | 
						|
 | 
						|
begin
 | 
						|
  SplitEditMask(AValue,M,S,B);
 | 
						|
  InputMaskEdit.Text := AValue;
 | 
						|
  SaveLiteralCheckBox.Checked := S;
 | 
						|
  CharactersForBlanksEdit.Text := B;
 | 
						|
  UpdateTestEditor;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMaskEditorForm.UpdateTestEditor;
 | 
						|
begin
 | 
						|
  TestMaskEdit.EditMask:=InputMaskEdit.Text;
 | 
						|
end;
 | 
						|
 | 
						|
{ TEditMaskProperty }
 | 
						|
 | 
						|
function TEditMaskProperty.GetAttributes: TPropertyAttributes;
 | 
						|
begin
 | 
						|
  Result:= [paDialog, paMultiSelect, paRevertable];
 | 
						|
end;
 | 
						|
 | 
						|
procedure TEditMaskProperty.Edit;
 | 
						|
var
 | 
						|
  MaskEditorForm: TMaskEditorForm;
 | 
						|
begin
 | 
						|
  MaskEditorForm:=TMaskEditorForm.Create(Application);
 | 
						|
  try
 | 
						|
    MaskEditorForm.EditMask:=GetValue;
 | 
						|
    if MaskEditorForm.ShowModal = mrOk then
 | 
						|
      SetValue(MaskEditorForm.EditMask);
 | 
						|
  finally
 | 
						|
    MaskEditorForm.Free;
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
{ TMaskEditEditor }
 | 
						|
 | 
						|
procedure TMaskEditEditor.ExecuteVerb(Index: Integer);
 | 
						|
var
 | 
						|
  MaskEditorForm: TMaskEditorForm;
 | 
						|
begin
 | 
						|
  if Index = 0 then
 | 
						|
  begin
 | 
						|
    MaskEditorForm := TMaskEditorForm.Create(Application);
 | 
						|
    try
 | 
						|
      MaskEditorForm.EditMask := MaskEdit.EditMask;
 | 
						|
      if MaskEditorForm.ShowModal = mrOk then
 | 
						|
        MaskEdit.EditMask := MaskEditorForm.EditMask;
 | 
						|
    finally
 | 
						|
      MaskEditorForm.Free;
 | 
						|
    end;
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
function TMaskEditEditor.GetVerb(Index: Integer): string;
 | 
						|
begin
 | 
						|
  case Index of
 | 
						|
    0: Result := sccsMaskEditor;
 | 
						|
    else
 | 
						|
      Result := '';
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
function TMaskEditEditor.GetVerbCount: Integer;
 | 
						|
begin
 | 
						|
  Result := 1;
 | 
						|
end;
 | 
						|
 | 
						|
function TMaskEditEditor.MaskEdit: TCustomMaskEditAccess;
 | 
						|
begin
 | 
						|
  Result := TCustomMaskEditAccess(GetComponent)
 | 
						|
end;
 | 
						|
 | 
						|
initialization
 | 
						|
  RegisterPropertyEditor(TypeInfo(string), TCustomMaskEdit, 'EditMask',
 | 
						|
                         TEditMaskProperty);
 | 
						|
  RegisterComponentEditor(TMaskEdit, TMaskEditEditor);
 | 
						|
 | 
						|
end.
 | 
						|
 |