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 + ' '; 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.