VistA-cprs/CPRS-Chart/Templates/fTemplateFieldEditor.pas

1411 lines
37 KiB
Plaintext

unit fTemplateFieldEditor;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ORCtrls, StdCtrls, ExtCtrls, Menus, ComCtrls, uTemplateFields, ORFn,
ToolWin, MenuBar, ORClasses, ORDtTm;
type
TfrmTemplateFieldEditor = class(TForm)
pnlBottom: TPanel;
btnOK: TButton;
btnCancel: TButton;
pnlObjs: TPanel;
cbxObjs: TORComboBox;
lblObjs: TLabel;
splLeft: TSplitter;
pnlRight: TPanel;
pnlPreview: TPanel;
lblNotes: TLabel;
pnlObjInfo: TPanel;
lblName: TLabel;
lblS2: TLabel;
lblLM: TLabel;
edtName: TCaptionEdit;
splBottom: TSplitter;
lblS1: TLabel;
edtLMText: TCaptionEdit;
cbxType: TORComboBox;
lblType: TLabel;
reNotes: TRichEdit;
btnApply: TButton;
btnPreview: TButton;
mnuMain: TMainMenu;
mnuAction: TMenuItem;
mnuNew: TMenuItem;
mnuCopy: TMenuItem;
cbHide: TCheckBox;
pnlTop: TPanel;
MenuBar1: TMenuBar;
btnNew: TButton;
btnCopy: TButton;
mnuDelete: TMenuItem;
btnDelete: TButton;
mnuPreview: TMenuItem;
popText: TPopupMenu;
mnuBPUndo: TMenuItem;
N8: TMenuItem;
mnuBPCut: TMenuItem;
mnuBPCopy: TMenuItem;
mnuBPPaste: TMenuItem;
mnuBPSelectAll: TMenuItem;
N2: TMenuItem;
mnuBPCheckGrammar: TMenuItem;
mnuBPSpellCheck: TMenuItem;
lblTextLen: TLabel;
edtTextLen: TCaptionEdit;
udTextLen: TUpDown;
pnlSwap: TPanel;
edtDefault: TCaptionEdit;
pnlNum: TPanel;
edtURL: TCaptionEdit;
udDefNum: TUpDown;
edtDefNum: TCaptionEdit;
udMinVal: TUpDown;
edtMinVal: TCaptionEdit;
lblMin: TLabel;
udInc: TUpDown;
edtInc: TCaptionEdit;
lblInc: TLabel;
lblMaxVal: TLabel;
edtMaxVal: TCaptionEdit;
udMaxVal: TUpDown;
reItems: TRichEdit;
lblLength: TLabel;
edtLen: TCaptionEdit;
udLen: TUpDown;
cbxDefault: TORComboBox;
lblS3: TLabel;
gbIndent: TGroupBox;
lblIndent: TLabel;
edtIndent: TCaptionEdit;
udIndent: TUpDown;
udPad: TUpDown;
edtPad: TCaptionEdit;
lblPad: TLabel;
gbMisc: TGroupBox;
cbActive: TCheckBox;
cbRequired: TCheckBox;
cbSepLines: TCheckBox;
pnlDate: TPanel;
edtDateDef: TCaptionEdit;
cbxDateType: TORComboBox;
lblDateType: TLabel;
cbExclude: TCheckBox;
lblReq: TStaticText;
lblLine: TLabel;
lblCol: TLabel;
N14: TMenuItem;
mnuInsertTemplateField: TMenuItem;
procedure cbxObjsNeedData(Sender: TObject; const StartFrom: String;
Direction, InsertAt: Integer);
procedure FormCreate(Sender: TObject);
procedure cbxObjsChange(Sender: TObject);
procedure edtNameChange(Sender: TObject);
procedure cbxTypeChange(Sender: TObject);
procedure edtLenChange(Sender: TObject);
procedure edtDefaultChange(Sender: TObject);
procedure cbxDefaultChange(Sender: TObject);
procedure edtLMTextChange(Sender: TObject);
procedure cbActiveClick(Sender: TObject);
procedure mnuNewClick(Sender: TObject);
procedure btnOKClick(Sender: TObject);
procedure btnApplyClick(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure btnCancelClick(Sender: TObject);
procedure reItemsChange(Sender: TObject);
procedure cbHideClick(Sender: TObject);
procedure edtNameExit(Sender: TObject);
procedure mnuCopyClick(Sender: TObject);
procedure mnuDeleteClick(Sender: TObject);
procedure btnPreviewClick(Sender: TObject);
procedure mnuActionClick(Sender: TObject);
procedure cbRequiredClick(Sender: TObject);
procedure pnlObjsResize(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure cbxObjsSynonymCheck(Sender: TObject; const Text: String;
var IsSynonym: Boolean);
procedure popTextPopup(Sender: TObject);
procedure mnuBPUndoClick(Sender: TObject);
procedure mnuBPCutClick(Sender: TObject);
procedure mnuBPCopyClick(Sender: TObject);
procedure mnuBPPasteClick(Sender: TObject);
procedure mnuBPSelectAllClick(Sender: TObject);
procedure mnuBPCheckGrammarClick(Sender: TObject);
procedure mnuBPSpellCheckClick(Sender: TObject);
procedure cbSepLinesClick(Sender: TObject);
procedure edtpopControlEnter(Sender: TObject);
procedure cbxObjsKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure edtTextLenChange(Sender: TObject);
procedure edtDefNumChange(Sender: TObject);
procedure edtMinValChange(Sender: TObject);
procedure edtMaxValChange(Sender: TObject);
procedure edtIncChange(Sender: TObject);
procedure edtURLChange(Sender: TObject);
procedure edtPadChange(Sender: TObject);
procedure edtIndentChange(Sender: TObject);
procedure reNotesChange(Sender: TObject);
procedure cbxDateTypeChange(Sender: TObject);
procedure cbExcludeClick(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure reItemsResizeRequest(Sender: TObject; Rect: TRect);
procedure reItemsSelectionChange(Sender: TObject);
procedure mnuInsertTemplateFieldClick(Sender: TObject);
procedure ControlExit(Sender: TObject);
procedure reNotesKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
CopyFld, FFld: TTemplateField;
FUpdating: boolean;
FReloadChanges: boolean;
FChangesPending: boolean;
FDeleted: TORStringList;
FHideSynonyms: boolean;
FLastRect: TRect;
procedure UpdateControls;
procedure SyncItems(DoUpdate: boolean = TRUE);
function SaveChanges: boolean;
procedure ResetListEntry;
procedure VerifyName;
procedure EnableButtons;
procedure SetFld(const Value: TTemplateField);
procedure SetHideSynonyms(const Value: boolean);
function GetPopupControl: TCustomEdit;
public
{ Public declarations }
end;
function EditDialogFields: boolean;
implementation
uses rTemplates, fTemplateDialog, Clipbrd, uSpell, uConst,
fTemplateFields;
{$R *.DFM}
{ TfrmDlgObjEditor }
var
frmTemplateFields: TfrmTemplateFields = nil;
function EditDialogFields: boolean;
var
frmTemplateFieldEditor: TfrmTemplateFieldEditor;
begin
frmTemplateFieldEditor := TfrmTemplateFieldEditor.Create(Application);
try
frmTemplateFieldEditor.ShowModal;
Result := frmTemplateFieldEditor.FReloadChanges;
finally
frmTemplateFieldEditor.Free;
end;
end;
procedure TfrmTemplateFieldEditor.UpdateControls;
const
DefTxt = 'Default:';
var
ok, edt, txt, tmp: boolean;
Y, idx, Max: integer;
wpTxt: string;
procedure SetLbl(const Text: string);
var
lbl: TLabel;
begin
inc(idx);
case idx of
1: lbl := lblS1;
2: lbl := lblS2;
3: lbl := lblS3;
else
lbl := nil;
end;
if assigned(lbl) then
lbl.Caption := Text;
end;
procedure SetY(Control: TControl; const Text: string);
begin
if (Control.Visible) then
begin
Control.Top := Y;
inc(Y, Control.Height);
SetLbl(Text);
end;
end;
begin
if(not FUpdating) then
begin
FUpdating := TRUE;
try
Y := 0;
idx := 0;
ok := assigned(FFld);
if(ok) then
begin
edt := (FFld.FldType in EditLenTypes);
txt := (FFld.FldType in EditDfltTypes);
end
else
begin
edt := FALSE;
txt := FALSE;
end;
lblName.Enabled := ok;
edtName.Enabled := ok;
lblType.Enabled := ok;
cbxType.Enabled := ok;
lblLM.Enabled := ok;
edtLMText.Enabled := ok;
cbActive.Enabled := ok;
gbMisc.Enabled := ok;
lblNotes.Enabled := ok;
reNotes.Enabled := ok;
if(ok) then
begin
edtName.Text := FFld.FldName;
cbxType.ItemIndex := ord(FFld.FldType);
edtLMText.Text := FFld.LMText;
cbActive.Checked := FFld.Inactive;
reNotes.Lines.Text := FFld.Notes;
end
else
begin
edtName.Text := '';
cbxType.ItemIndex := -1;
edtLMText.Text := '';
cbActive.Checked := FALSE;
reNotes.Clear;
end;
tmp := ok and (not (FFld.FldType in NoRequired));
cbRequired.Enabled := tmp;
if tmp then
cbRequired.Checked := FFld.Required
else
cbRequired.Checked := FALSE;
pnlSwap.DisableAlign;
try
tmp := ok and (FFld.FldType in SepLinesTypes);
cbSepLines.Enabled := tmp;
if tmp then
cbSepLines.Checked := FFld.SepLines
else
cbSepLines.Checked := FALSE;
tmp := ok and (FFld.FldType in ExcludeText);
cbExclude.Enabled := tmp;
if tmp then
cbExclude.Checked := FFld.SepLines
else
cbExclude.Checked := FALSE;
lblLength.Enabled := edt;
if ok and (FFld.FldType = dftWP) then
begin
lblTextLen.Caption := 'Num Lines:';
udLen.Min := 5;
udLen.Max := 74;
udTextLen.Min := 2;
udTextLen.Max := MaxTFWPLines;
end
else
begin
udLen.Min := 1;
udLen.Max := 70;
udTextLen.Min := 0;
udTextLen.Max := 240;
lblTextLen.Caption := 'Text Len:';
end;
lblTextLen.Enabled := edt;
edtTextLen.Enabled := edt;
udTextLen.Enabled := edt;
edtLen.Enabled := edt;
udLen.Enabled := edt;
edtDefault.Visible := txt;
SetY(edtDefault, DefTxt);
Max := MaxTFEdtLen;
if(edt) then
begin
udLen.Associate := edtLen;
udLen.Position := FFld.MaxLen;
udTextLen.Associate := edtTextLen;
udTextLen.Position := FFld.TextLen;
if txt then
Max := FFld.MaxLen;
end
else
begin
udLen.Associate := nil;
edtLen.Text := '';
udTextLen.Associate := nil;
edtTextLen.Text := '';
end;
if txt then
begin
edtDefault.MaxLength := Max;
edtDefault.Text := copy(FFld.EditDefault, 1, Max);
end;
gbIndent.Enabled := ok;
lblIndent.Enabled := ok;
edtIndent.Enabled := ok;
udIndent.Enabled := ok;
if ok then
begin
udIndent.Associate := edtIndent;
udIndent.Position := FFld.Indent;
end
else
begin
udIndent.Associate := nil;
edtIndent.Text := '';
end;
tmp := ok and (not cbExclude.Checked);
lblPad.Enabled := tmp;
edtPad.Enabled := tmp;
udPad.Enabled := tmp;
if tmp then
begin
udPad.Associate := edtPad;
udPad.Position := FFld.Pad;
end
else
begin
udPad.Associate := nil;
edtPad.Text := '';
end;
tmp := ok and (FFld.FldType = dftNumber);
pnlNum.Visible := tmp;
SetY(pnlNum, DefTxt);
if tmp then
begin
udDefNum.Position := StrToIntDef(FFld.EditDefault, 0);
udMinVal.Position := FFld.MinVal;
udMaxVal.Position := FFld.MaxVal;
udInc.Position := FFld.Increment;
end;
tmp := ok and (FFld.FldType = dftDate);
pnlDate.Visible := tmp;
SetY(pnlDate, DefTxt);
if tmp then
begin
edtDateDef.Text := FFld.EditDefault;
cbxDateType.SelectByID(TemplateFieldDateCodes[FFld.DateType]);
end;
tmp := ok and (FFld.FldType in ItemDfltTypes);
cbxDefault.Visible := tmp;
SetY(cbxDefault, DefTxt);
tmp := ok and (FFld.FldType = dftHyperlink);
edtURL.Visible := tmp;
SetY(edtURL, 'Address:');
if tmp then
edtURL.Text := FFld.URL;
tmp := ok and (FFld.FldType in FldItemTypes);
reItems.Visible := tmp;
lblLine.Visible := tmp;
lblCol.Visible := tmp;
if tmp then
begin
if FFld.FldType = dftWP then
wpTxt := DefTxt
else
wpTxt := 'Items:';
end
else
wpTxt := '';
SetY(reItems, wpTxt);
if tmp then
reItems.Lines.Text := FFld.Items
else
reItems.Clear;
finally
pnlSwap.EnableAlign;
end;
SetLbl('');
SetLbl('');
SetLbl('');
SyncItems(FALSE);
FormResize(Self);
finally
FUpdating := FALSE;
end;
end;
end;
procedure TfrmTemplateFieldEditor.SyncItems(DoUpdate: boolean = TRUE);
var
i, idx, Siz, Max1, Max2: integer;
ChangeSizes: boolean;
begin
if DoUpdate and FUpdating then
exit;
Max1 := 0;
Max2 := 0;
ChangeSizes := FALSE;
FUpdating := TRUE;
try
cbxDefault.Items.Assign(reItems.Lines);
idx := -1;
if(assigned(FFld)) and reItems.Visible and cbxDefault.Visible then
begin
ChangeSizes := TRUE;
for i := 0 to reItems.Lines.Count-1 do
begin
Siz := length(StripEmbedded(reItems.Lines[i]));
if Max1 < Siz then
Max1 := Siz;
if(idx < 0) and (FFld.ItemDefault = reItems.Lines[i]) then
idx := i;
end;
Max2 := Max1;
if Max1 > MaxTFEdtLen then
Max1 := MaxTFEdtLen;
end;
cbxDefault.ItemIndex := idx;
finally
FUpdating := FALSE;
end;
if ChangeSizes and DoUpdate then
begin
udLen.Position := Max1;
if (not udTextLen.Enabled) or
((udTextLen.Position > 0) and (udTextLen.Position < Max2)) then
udTextLen.Position := Max2;
end;
end;
procedure TfrmTemplateFieldEditor.cbxObjsNeedData(Sender: TObject;
const StartFrom: String; Direction, InsertAt: Integer);
var
tmp: TORStringList;
i, idx: integer;
begin
tmp := TORStringList.Create;
try
tmp.Assign(SubSetOfTemplateFields(StartFrom, Direction));
for i := 0 to FDeleted.Count-1 do
begin
idx := tmp.IndexOfPiece(Piece(FDeleted[i],U,1), U, 1);
if(idx >= 0) then
tmp.delete(idx);
end;
ConvertCodes2Text(tmp, TRUE);
cbxObjs.ForDataUse(tmp);
finally
tmp.Free;
end;
end;
procedure TfrmTemplateFieldEditor.FormCreate(Sender: TObject);
var
i: integer;
Child: TControl;
Overage: integer;
begin
FDeleted := TORStringList.Create;
FHideSynonyms := TRUE;
cbxObjs.InitLongList('');
cbxObjs.ItemHeight := 15;
UpdateControls;
ResizeAnchoredFormToFont(self);
//ResizeAnchoredFormToFont does the pnlObjInfo panel wrong. So we fix it here.
gbMisc.Top := pnlObjInfo.ClientHeight - gbMisc.Height - 5;
gbIndent.Top := gbMisc.Top;
edtLMText.Top := gbMisc.Top - edtLMText.Height - 2;
lblLM.Top := edtLMText.Top + 5;
pnlSwap.Height := lblLM.Top - pnlSwap.Top;
Overage := edtName.Left + edtName.Width - pnlObjInfo.ClientWidth - 4;
for i := 0 to pnlObjInfo.ControlCount-1 do begin
Child := pnlObjInfo.Controls[i];
if (akRight in Child.Anchors) then begin
if (akLeft in Child.Anchors) then
Child.Width := Child.Width - Overage
else
Child.Left := Child.Left - Overage;
end;
end;
end;
procedure TfrmTemplateFieldEditor.cbxObjsChange(Sender: TObject);
begin
if(cbxObjs.ItemIEN <> 0) then
SetFld(GetTemplateField(cbxObjs.ItemID, TRUE))
else
SetFld(nil);
UpdateControls;
end;
procedure TfrmTemplateFieldEditor.edtNameChange(Sender: TObject);
var
ok: boolean;
begin
if(not FUpdating) and (assigned(FFld)) then
begin
if (not FFld.NameChanged) and (not FFld.NewField) then
begin
ok := InfoBox('*** WARNING ***' + CRLF + CRLF +
'This template field has been saved, and may have been used in one or more' + CRLF +
'boilerplates. Boilerplates can be found in templates, titles, reasons for request' + CRLF +
'and reminder dialogs. Renaming this template field will cause any boilerplates' + CRLF +
'that use it to no longer function correctly.' + CRLF + CRLF +
'Are you sure you want to rename the ' + FFld.FldName + ' template field?',
'Warning', MB_YESNO or MB_ICONWARNING) = IDYES;
if ok then
InfoBox('Template field will be renamed when OK or Apply is pressed.', 'Information', MB_OK or MB_ICONINFORMATION)
else
begin
FUpdating := TRUE;
try
edtName.Text := FFld.FldName;
finally
FUpdating := FALSE;
end;
end;
end
else
ok := TRUE;
if ok then
begin
FFld.FldName := edtName.Text;
edtName.Text := FFld.FldName;
FChangesPending := TRUE;
ResetListEntry;
end;
end;
end;
procedure TfrmTemplateFieldEditor.cbxTypeChange(Sender: TObject);
begin
if(not FUpdating) and (assigned(FFld)) then
begin
if(cbxType.ItemIndex < 0) then
begin
FUpdating := TRUE;
try
cbxType.ItemIndex := 0;
finally
FUpdating := FALSE;
end;
end;
FFld.FldType := TTemplateFieldType(cbxType.ItemIndex);
end;
EnableButtons;
UpdateControls;
end;
procedure TfrmTemplateFieldEditor.edtLenChange(Sender: TObject);
var
v: integer;
ok: boolean;
begin
EnsureText(edtLen, udLen);
if((not FUpdating) and (assigned(FFld)) and (FFld.FldType in (EditLenTypes))) then
begin
EnsureText(edtLen, udLen);
FFld.MaxLen := udLen.Position;
udLen.Position := FFld.MaxLen;
if edtDefault.Visible then
begin
edtDefault.MaxLength := FFld.MaxLen;
edtDefault.Text := copy(edtDefault.Text,1,FFld.MaxLen);
end;
case FFLd.FldType of
dftEditBox: ok := TRUE;
dftComboBox: ok := (udTextLen.Position > 0);
else ok := FALSE;
end;
if ok then
begin
v := udLen.Position;
if udTextLen.Position < v then
udTextLen.Position := v;
end;
end;
end;
procedure TfrmTemplateFieldEditor.edtDefaultChange(Sender: TObject);
begin
if((not FUpdating) and (assigned(FFld)) and (FFld.FldType in EditDfltType2)) then
begin
FFld.EditDefault := TEdit(Sender).Text;
TEdit(Sender).Text := FFld.EditDefault;
end;
end;
procedure TfrmTemplateFieldEditor.cbxDefaultChange(Sender: TObject);
begin
if((not FUpdating) and (assigned(FFld)) and (FFld.FldType in ItemDfltTypes)) then
begin
FFld.ItemDefault := cbxDefault.Text;
SyncItems;
end;
end;
procedure TfrmTemplateFieldEditor.edtLMTextChange(Sender: TObject);
begin
if((not FUpdating) and (assigned(FFld))) then
begin
FFld.LMText := edtLMText.Text;
edtLMText.Text := FFld.LMText;
end;
end;
procedure TfrmTemplateFieldEditor.cbActiveClick(Sender: TObject);
begin
if((not FUpdating) and (assigned(FFld))) then
begin
FFld.Inactive := cbActive.Checked;
cbActive.Checked := FFld.Inactive;
FChangesPending := TRUE;
//ResetListEntry;
end;
end;
procedure TfrmTemplateFieldEditor.mnuNewClick(Sender: TObject);
begin
SetFld(TTemplateField.Create(nil));
if(assigned(FFld)) then
begin
FChangesPending := TRUE;
if cbxObjs.ShortCount = 0 then
begin
cbxObjs.Items.Insert(0,LLS_LINE);
cbxObjs.Items.Insert(1,'');
end;
if(assigned(CopyFld)) then
FFld.Assign(CopyFld);
cbxObjs.Items.Insert(0,FFld.ID + U + FFld.FldName);
cbxObjs.SelectByID(FFld.ID);
cbxObjsChange(nil);
if(assigned(FFld)) then
edtName.SetFocus;
end
else
UpdateControls;
end;
procedure TfrmTemplateFieldEditor.btnOKClick(Sender: TObject);
begin
SaveChanges;
end;
procedure TfrmTemplateFieldEditor.btnApplyClick(Sender: TObject);
var
tmp: string;
begin
SaveChanges;
cbxObjs.Clear;
if assigned(FFld) then
tmp := FFld.FldName
else
tmp := '';
cbxObjs.InitLongList(tmp);
cbxObjs.ItemIndex := 0;
cbxObjsChange(cbxObjs);
end;
procedure TfrmTemplateFieldEditor.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
var
ans: word;
begin
if(AnyTemplateFieldsModified) then
begin
ans := InfoBox('Save Changes?', 'Confirmation', MB_YESNOCANCEL or MB_ICONQUESTION);
if(ans = IDCANCEL) then
CanClose := FALSE
else
if(ans = IDYES) then
CanClose := SaveChanges;
end;
end;
procedure TfrmTemplateFieldEditor.btnCancelClick(Sender: TObject);
var
i: integer;
begin
for i := 0 to FDeleted.Count-1 do
UnlockTemplateField(Piece(FDeleted[i],U,1));
FDeleted.Clear;
ClearModifiedTemplateFields;
end;
function TfrmTemplateFieldEditor.SaveChanges: boolean;
var
ans: word;
Errors: string;
i: integer;
begin
for i := 0 to FDeleted.Count-1 do
DeleteTemplateField(Piece(FDeleted[i],U,1));
FDeleted.Clear;
Result := TRUE;
Errors := SaveTemplateFieldErrors;
if(Errors <> '') then
begin
ans := InfoBox(Errors + CRLF + CRLF + 'Cancel changes to these Template Fields?',
'Confirmation', MB_YESNO or MB_ICONQUESTION);
if(ans = IDYES) then
ClearModifiedTemplateFields
else
Result := FALSE;
end;
if(FChangesPending) then
FReloadChanges := TRUE;
end;
procedure TfrmTemplateFieldEditor.reItemsChange(Sender: TObject);
begin
if((not FUpdating) and (assigned(FFld)) and (FFld.FldType in FldItemTypes)) then
begin
FFld.Items := reItems.Lines.Text;
SyncItems;
end;
end;
procedure TfrmTemplateFieldEditor.cbHideClick(Sender: TObject);
begin
SetHideSynonyms(cbHide.Checked);
end;
procedure TfrmTemplateFieldEditor.edtNameExit(Sender: TObject);
begin
if (ActiveControl <> btnCancel) and (ActiveControl <> btnDelete) then
VerifyName;
end;
procedure TfrmTemplateFieldEditor.VerifyName;
var
bad: boolean;
begin
if assigned(FFld) then
begin
if FDeleted.IndexOfPiece(FFld.FldName, U, 2) >= 0 then
begin
ShowMessage('Template field can not be named the same as a deleted' + CRLF +
'field until OK or Apply has been pressed.');
bad := TRUE;
end
else
bad := TemplateFieldNameProblem(FFld);
if bad then
edtName.SetFocus;
end;
end;
procedure TfrmTemplateFieldEditor.mnuCopyClick(Sender: TObject);
begin
if assigned(FFld) then
begin
CopyFld := FFld;
try
mnuNewClick(nil);
finally
CopyFld := nil;
end;
end;
end;
procedure TfrmTemplateFieldEditor.SetFld(const Value: TTemplateField);
begin
FFld := Value;
EnableButtons;
end;
procedure TfrmTemplateFieldEditor.mnuDeleteClick(Sender: TObject);
var
idx: integer;
ok: boolean;
Answer: word;
txt: string;
btns: TMsgDlgButtons;
begin
if assigned(FFld) then
begin
ok := (FFld.NewField);
if not ok then
begin
btns := [mbYes, mbNo];
if FFld.Inactive then
txt := ''
else
begin
txt := ' Rather than deleting, you may want' + CRLF +
'to inactivate this template field instead. You may inactivate this template by' + CRLF +
'pressing the Ignore button now.';
include(btns, mbIgnore);
end;
Answer := MessageDlg('*** WARNING ***' + CRLF + CRLF +
'This template field has been saved, and may have been used in one or more' + CRLF +
'boilerplates. Boilerplates can be found in templates, titles, reasons for request' + CRLF +
'and reminder dialogs. Deleting this template field will cause any boilerplates' + CRLF +
'that use it to no longer function correctly.' + txt + CRLF + CRLF +
'Are you sure you want to delete the ' + FFld.FldName + ' template field?',
mtWarning, btns, 0);
ok := (Answer = mrYes);
if(Answer = mrIgnore) then
cbActive.Checked := TRUE;
end;
if ok then
begin
if(FFld.NewField or FFld.CanModify) then
begin
if FFld.NewField then
begin
idx := cbxObjs.ItemIndex;
cbxObjs.ItemIndex := -1;
cbxObjs.Items.Delete(idx);
if cbxObjs.Items[0] = LLS_LINE then
begin
cbxObjs.Items.Delete(1);
cbxObjs.Items.Delete(0);
end;
end
else
begin
FDeleted.Add(FFld.ID + U + FFld.FldName);
cbxObjs.ItemIndex := -1;
end;
end;
FFld.Free;
SetFld(nil);
UpdateControls;
cbxObjs.InitLongList('');
FChangesPending := TRUE;
end;
end;
end;
procedure TfrmTemplateFieldEditor.ResetListEntry;
var
txt: string;
begin
if(assigned(FFld) and FFld.NewField and (cbxObjs.ItemIndex >= 0)) then
begin
txt := FFld.ID + U + FFld.FldName;
//if(FFld.Inactive) then
//txt := txt + ' <Inactive>';
cbxObjs.Items[cbxObjs.ItemIndex] := txt;
cbxObjs.ItemIndex := cbxObjs.ItemIndex;
end;
end;
procedure TfrmTemplateFieldEditor.btnPreviewClick(Sender: TObject);
var
TmpSL: TStringList;
begin
if(assigned(FFld)) then
begin
TmpSL := TStringList.Create;
try
TmpSL.Add(TemplateFieldBeginSignature + FFld.FldName + TemplateFieldEndSignature);
CheckBoilerplate4Fields(TmpSL, 'Preview Template Field: ' + FFld.FldName, TRUE);
finally
TmpSL.Free;
end;
end;
end;
procedure TfrmTemplateFieldEditor.EnableButtons;
begin
btnCopy.Enabled := assigned(FFld);
mnuCopy.Enabled := btnCopy.Enabled;
btnDelete.Enabled := btnCopy.Enabled; // (assigned(FFld) and FFld.NewField);
mnuDelete.Enabled := btnDelete.Enabled;
btnPreview.Enabled := assigned(FFld) and (FFld.FldType <> dftUnknown);
mnuPreview.Enabled := btnPreview.Enabled;
end;
procedure TfrmTemplateFieldEditor.mnuActionClick(Sender: TObject);
begin
EnableButtons;
end;
procedure TfrmTemplateFieldEditor.cbRequiredClick(Sender: TObject);
begin
if((not FUpdating) and (assigned(FFld))) then
begin
FFld.Required := cbRequired.Checked;
cbRequired.Checked := FFld.Required;
end;
end;
procedure TfrmTemplateFieldEditor.pnlObjsResize(Sender: TObject);
begin
btnPreview.Left := pnlRight.Left;
end;
procedure TfrmTemplateFieldEditor.FormDestroy(Sender: TObject);
begin
FDeleted.Free;
if(assigned(frmTemplateFields)) then begin
frmTemplateFields.FRee;
frmTemplateFields := nil;
end; {if}
end;
procedure TfrmTemplateFieldEditor.SetHideSynonyms(const Value: boolean);
begin
FHideSynonyms := Value;
cbxObjs.HideSynonyms := FALSE; // Refresh Display
cbxObjs.HideSynonyms := TRUE;
end;
procedure TfrmTemplateFieldEditor.cbxObjsSynonymCheck(Sender: TObject;
const Text: String; var IsSynonym: Boolean);
begin
if not FHideSynonyms then
IsSynonym := FALSE;
if(FDeleted.Count > 0) and (FDeleted.IndexOfPiece(Text,U,2) >= 0) then
IsSynonym := TRUE;
end;
procedure TfrmTemplateFieldEditor.popTextPopup(Sender: TObject);
var
HasText, CanEdit, isre: boolean;
ce: TCustomEdit;
ShowTempField: boolean;
begin
ce := GetPopupControl;
if assigned(ce) then
begin
isre := (ce is TRichEdit);
CanEdit := (not TORExposedCustomEdit(ce).ReadOnly);
mnuBPUndo.Enabled := (CanEdit and (ce.Perform(EM_CANUNDO, 0, 0) <> 0));
if isre then
HasText := (TRichEdit(ce).Lines.Count > 0)
else
HasText := (Text <> '');
mnuBPSelectAll.Enabled := HasText;
mnuBPCopy.Enabled := HasText and (ce.SelLength > 0);
mnuBPPaste.Enabled := (CanEdit and Clipboard.HasFormat(CF_TEXT));
mnuBPCut.Enabled := (CanEdit and HasText and (ce.SelLength > 0));
ShowTempField := FALSE;
if CanEdit then
if (not assigned(frmTemplateFields)) or
(assigned(frmTemplateFields) and not frmTemplateFields.Visible) then
if (ce = reItems) or
(ce = edtDefault) then
ShowTempField := TRUE;
mnuInsertTemplateField.Enabled := ShowTempField;
end
else
begin
isre := FALSE;
HasText := FALSE;
CanEdit := FALSE;
mnuBPPaste.Enabled := FALSE;
mnuBPCopy.Enabled := FALSE;
mnuBPCut.Enabled := FALSE;
mnuBPSelectAll.Enabled := FALSE;
mnuBPUndo.Enabled := FALSE;
mnuInsertTemplateField.Enabled := FALSE;
end;
mnuBPSpellCheck.Visible := isre;
mnuBPCheckGrammar.Visible := isre;
if isre and HasText and CanEdit then
begin
mnuBPSpellCheck.Enabled := SpellCheckAvailable;
mnuBPCheckGrammar.Enabled := SpellCheckAvailable;
end
else
begin
mnuBPSpellCheck.Enabled := FALSE;
mnuBPCheckGrammar.Enabled := FALSE;
end;
end;
function TfrmTemplateFieldEditor.GetPopupControl: TCustomEdit;
begin
if assigned(popText.PopupComponent) and (popText.PopupComponent is TCustomEdit) then
Result := TCustomEdit(popText.PopupComponent)
else
Result := nil;
end;
procedure TfrmTemplateFieldEditor.mnuBPUndoClick(Sender: TObject);
var
ce: TCustomEdit;
begin
ce := GetPopupControl;
if assigned(ce) then
ce.Perform(EM_UNDO, 0, 0);
end;
procedure TfrmTemplateFieldEditor.mnuBPCutClick(Sender: TObject);
var
ce: TCustomEdit;
begin
ce := GetPopupControl;
if assigned(ce) then
ce.CutToClipboard;
end;
procedure TfrmTemplateFieldEditor.mnuBPCopyClick(Sender: TObject);
var
ce: TCustomEdit;
begin
ce := GetPopupControl;
if assigned(ce) then
ce.CopyToClipboard;
end;
procedure TfrmTemplateFieldEditor.mnuBPPasteClick(Sender: TObject);
var
ce: TCustomEdit;
begin
ce := GetPopupControl;
if assigned(ce) then
ce.SelText := Clipboard.AsText;
end;
procedure TfrmTemplateFieldEditor.mnuBPSelectAllClick(Sender: TObject);
var
ce: TCustomEdit;
begin
ce := GetPopupControl;
if assigned(ce) then
ce.SelectAll;
end;
procedure TfrmTemplateFieldEditor.mnuBPCheckGrammarClick(Sender: TObject);
var
ce: TCustomEdit;
begin
ce := GetPopupControl;
if(assigned(ce) and (ce is TRichEdit)) then
GrammarCheckForControl(TRichEdit(ce));
end;
procedure TfrmTemplateFieldEditor.mnuBPSpellCheckClick(Sender: TObject);
var
ce: TCustomEdit;
begin
ce := GetPopupControl;
if(assigned(ce) and (ce is TRichEdit)) then
SpellCheckForControl(TRichEdit(ce));
end;
procedure TfrmTemplateFieldEditor.cbSepLinesClick(Sender: TObject);
begin
if((not FUpdating) and (assigned(FFld))) then
begin
FFld.SepLines := cbSepLines.Checked;
cbSepLines.Checked := FFld.SepLines;
end;
end;
procedure TfrmTemplateFieldEditor.edtpopControlEnter(Sender: TObject);
begin
popText.PopupComponent := TComponent(Sender);
if assigned(frmTemplateFields) then
begin
if ((Sender = reItems) or (Sender = edtDefault)) then
begin
frmTemplateFields.btnInsert.Enabled := TRUE;
if Sender = reItems then
frmTemplateFields.re := reItems
else
frmTemplateFields.re := edtDefault;
end
else
frmTemplateFields.btnInsert.Enabled := FALSE;
end;
end;
procedure TfrmTemplateFieldEditor.cbxObjsKeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
if(Key = VK_DELETE) and btnDelete.Enabled then
mnuDeleteClick(btnDelete);
end;
procedure TfrmTemplateFieldEditor.edtTextLenChange(Sender: TObject);
var
v: integer;
begin
EnsureText(edtTextLen, udTextLen);
if((not FUpdating) and (assigned(FFld)) and (FFld.FldType in EditLenTypes)) then
begin
FFld.TextLen := udTextLen.Position;
udTextLen.Position := FFld.TextLen;
if FFld.FldType = dftEditBox then
begin
v := udTextLen.Position;
if udLen.Position > v then
udLen.Position := v;
end;
end;
end;
procedure TfrmTemplateFieldEditor.edtDefNumChange(Sender: TObject);
var
v: integer;
begin
EnsureText(edtDefNum, udDefNum);
if((not FUpdating) and (assigned(FFld)) and (FFld.FldType = dftNumber)) then
begin
FFld.EditDefault := IntToStr(udDefNum.Position);
udDefNum.Position := StrToIntDef(FFld.EditDefault, 0);
v := udDefNum.Position;
if udMinVal.Position > v then
udMinVal.Position := v;
if udMaxVal.Position < v then
udMaxVal.Position := v;
end;
end;
procedure TfrmTemplateFieldEditor.edtMinValChange(Sender: TObject);
var
v: integer;
begin
EnsureText(edtMinVal, udMinVal);
if((not FUpdating) and (assigned(FFld)) and (FFld.FldType = dftNumber)) then
begin
FFld.MinVal := udMinVal.Position;
udMinVal.Position := FFld.MinVal;
v := udMinVal.Position;
if udDefNum.Position < v then
udDefNum.Position := v;
if udMaxVal.Position < v then
udMaxVal.Position := v;
end;
end;
procedure TfrmTemplateFieldEditor.edtMaxValChange(Sender: TObject);
var
v: integer;
begin
EnsureText(edtMaxVal, udMaxVal);
if((not FUpdating) and (assigned(FFld)) and (FFld.FldType = dftNumber)) then
begin
FFld.MaxVal := udMaxVal.Position;
udMaxVal.Position := FFld.MaxVal;
v := udMaxVal.Position;
if udDefNum.Position > v then
udDefNum.Position := v;
if udMinVal.Position > v then
udMinVal.Position := v;
end;
end;
procedure TfrmTemplateFieldEditor.edtIncChange(Sender: TObject);
begin
EnsureText(edtInc, udInc);
if((not FUpdating) and (assigned(FFld)) and (FFld.FldType = dftNumber)) then
begin
FFld.Increment := udInc.Position;
udInc.Position := FFld.Increment;
end;
end;
procedure TfrmTemplateFieldEditor.edtURLChange(Sender: TObject);
begin
if((not FUpdating) and (assigned(FFld)) and (FFld.FldType = dftHyperlink)) then
begin
FFld.URL := edtURL.Text;
edtURL.Text := FFld.URL;
end;
end;
procedure TfrmTemplateFieldEditor.edtPadChange(Sender: TObject);
begin
EnsureText(edtPad, udPad);
if((not FUpdating) and (assigned(FFld))) then
begin
FFld.Pad := udPad.Position;
udPad.Position := FFld.Pad;
end;
end;
procedure TfrmTemplateFieldEditor.edtIndentChange(Sender: TObject);
begin
EnsureText(edtIndent, udIndent);
if((not FUpdating) and (assigned(FFld))) then
begin
FFld.Indent := udIndent.Position;
udIndent.Position := FFld.Indent;
end;
end;
procedure TfrmTemplateFieldEditor.reNotesChange(Sender: TObject);
begin
if((not FUpdating) and (assigned(FFld)) and FFld.CanModify) then
FFld.Notes := reNotes.Lines.Text;
end;
procedure TfrmTemplateFieldEditor.cbxDateTypeChange(Sender: TObject);
begin
if((not FUpdating) and (assigned(FFld)) and (FFld.FldType = dftDate)) then
begin
if cbxDateType.ItemIndex >= 0 then
FFld.DateType := TTmplFldDateType(cbxDateType.ItemIndex + 1)
else
FFld.DateType := dtDate;
cbxDateType.SelectByID(TemplateFieldDateCodes[FFld.DateType]);
end;
end;
procedure TfrmTemplateFieldEditor.cbExcludeClick(Sender: TObject);
begin
if((not FUpdating) and (assigned(FFld))) then
begin
FFld.SepLines := cbExclude.Checked;
cbExclude.Checked := FFld.SepLines;
UpdateControls;
end;
end;
procedure TfrmTemplateFieldEditor.FormResize(Sender: TObject);
begin
LimitEditWidth(reItems, 240);
LimitEditWidth(reNotes, MAX_ENTRY_WIDTH);
end;
procedure TfrmTemplateFieldEditor.reItemsResizeRequest(Sender: TObject;
Rect: TRect);
var
R: TRect;
begin
R := TRichEdit(Sender).ClientRect;
if (FLastRect.Right <> R.Right) or
(FLastRect.Bottom <> R.Bottom) or
(FLastRect.Left <> R.Left) or
(FLastRect.Top <> R.Top) then
begin
FLastRect := R;
FormResize(Self);
end;
end;
procedure TfrmTemplateFieldEditor.reItemsSelectionChange(Sender: TObject);
var
p: TPoint;
begin
if lblLine.Visible then
begin
p := reItems.CaretPos;
lblLine.Caption := 'Line: ' + inttostr(p.y + 1);
lblCol.Caption := 'Col: ' + inttostr(p.x + 1);
end;
end;
procedure TfrmTemplateFieldEditor.mnuInsertTemplateFieldClick(Sender: TObject);
var
iCon: TCustomEdit;
ShowButton: boolean;
begin
iCon := GetPopupControl;
if iCon <> nil then
begin
if iCon.Name <> ActiveControl.Name then
begin
ActiveControl := iCon;
iCon.SelStart := iCon.SelLength;
end;
if (not assigned(frmTemplateFields)) then
begin
frmTemplateFields := TfrmTemplateFields.Create(Self);
frmTemplateFields.Font := Font;
end;
ShowButton := False;
if iCon = reItems then
begin
frmTemplateFields.re := reItems;
ShowButton := TRUE;
end
else if iCon = edtDefault then
begin
frmTemplateFields.re := edtDefault;
ShowButton := TRUE;
end;
frmTemplateFields.btnInsert.Enabled := ShowButton;
frmTemplateFields.Show;
end
end;
procedure TfrmTemplateFieldEditor.ControlExit(Sender: TObject);
begin
if assigned(frmTemplateFields) then
frmTemplateFields.btnInsert.Enabled := FALSE;
end;
procedure TfrmTemplateFieldEditor.reNotesKeyUp(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
if (Key = VK_TAB) then
begin
if ssShift in Shift then
begin
FindNextControl(Sender as TWinControl, False, True, False).SetFocus; //previous control
Key := 0;
end
else if ssCtrl in Shift then
begin
FindNextControl(Sender as TWinControl, True, True, False).SetFocus; //next control
Key := 0;
end;
end;
if (key = VK_ESCAPE) then begin
FindNextControl(Sender as TWinControl, False, True, False).SetFocus; //previous control
key := 0;
end;
end;
end.