unit ModelsForm; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, JvToolEdit, Mask, Grids, JvStringGrid, JvSimpleXml, JvExGrids, JvExMask; type TfrmModels = class(TForm) btnOk: TBitBtn; bttCancel: TBitBtn; lblSelectModel: TLabel; cmbModels: TComboBox; grpProperties: TGroupBox; lblName: TLabel; edtName: TEdit; lblPrefix: TLabel; lblFormat: TLabel; lblPackageLocation: TLabel; lblIncFile: TLabel; edtPrefix: TEdit; edtFormat: TEdit; jfeIncFile: TJvFilenameEdit; jdePackages: TJvDirectoryEdit; stgTargets: TJvStringGrid; lblTargets: TLabel; lblAliases: TLabel; stgAliases: TJvStringGrid; btnAdd: TButton; btnDelete: TButton; lblClx: TLabel; edtClxFormat: TEdit; edtClxPrefix: TEdit; lblNoLibSuffix: TLabel; edtNLSFormat: TEdit; edtNLSPrefix: TEdit; stgClxRepl: TJvStringGrid; Label1: TLabel; lblDotNet: TLabel; edtDotNetFormat: TEdit; edtDotNetPrefix: TEdit; procedure stgTargetsGetCellAlignment(Sender: TJvStringGrid; AColumn, ARow: Integer; State: TGridDrawState; var CellAlignment: TAlignment); procedure stgTargetsExitCell(Sender: TJvStringGrid; AColumn, ARow: Integer; const EditText: String); procedure cmbModelsClick(Sender: TObject); procedure btnDeleteClick(Sender: TObject); procedure btnAddClick(Sender: TObject); procedure btnOkClick(Sender: TObject); procedure FormShow(Sender: TObject); private { Private declarations } xml : TJvSimpleXML; filename : string; FEditIndex: integer; procedure SaveModel; procedure LoadModel; procedure RefreshModelList; public { Public declarations } constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure LoadModels(XmlFileName : string; ConfigLoadedOk : Boolean); property EditIndex : integer read FEditIndex write FEditIndex; end; var frmModels: TfrmModels; implementation {$R *.dfm} { TfrmModels } procedure TfrmModels.LoadModels(XmlFileName : string; ConfigLoadedOk : Boolean); begin if ConfigLoadedOk then begin self.filename := XmlFileName; // read XML file xml.LoadFromFile(XmlFileName); RefreshModelList; end; btnDelete.Enabled := cmbModels.Items.Count > 1; end; constructor TfrmModels.Create(AOwner: TComponent); begin inherited; xml := TJvSimpleXml.Create(nil); FEditIndex := -1; with stgTargets do begin Cells[0, 0] := 'name'; Cells[1, 0] := 'dir'; Cells[2, 0] := 'pname'; Cells[3, 0] := 'pdir'; Cells[4, 0] := 'env'; Cells[5, 0] := 'ver'; Cells[6, 0] := 'PathSep'; Cells[7, 0] := 'IsClx'; Cells[8, 0] := 'IsBds'; Cells[9, 0] := 'IsDotNet'; ColWidths[0] := 40; ColWidths[1] := 30; ColWidths[2] := 40; ColWidths[3] := 35; ColWidths[4] := 25; ColWidths[5] := 25; ColWidths[6] := 45; ColWidths[7] := 30; ColWidths[8] := 30; ColWidths[9] := 45; end; with stgAliases do begin Cells[0, 0] := 'name'; Cells[1, 0] := 'value'; ColWidths[0] := 70; ColWidths[1] := 135; end; with stgClxRepl do begin Cells[0, 0] := 'original'; Cells[1, 0] := 'replacement'; ColWidths[0] := 90; ColWidths[1] := 90; end; end; procedure TfrmModels.stgTargetsGetCellAlignment(Sender: TJvStringGrid; AColumn, ARow: Integer; State: TGridDrawState; var CellAlignment: TAlignment); begin if ARow = 0 then CellAlignment := taCenter else CellAlignment := taLeftJustify; end; procedure TfrmModels.stgTargetsExitCell(Sender: TJvStringGrid; AColumn, ARow: Integer; const EditText: String); begin if AColumn = 0 then begin if (Sender.RowCount > 2) and (Sender.Cells[0, ARow] = '') and (ARow < Sender.RowCount-1) then Sender.RemoveRow(ARow); end; if (Sender.RowCount <=1) or (Sender.Cells[0, Sender.RowCount-1] <> '') then begin Sender.InsertRow(Sender.RowCount); Sender.FixedRows := 1; end; end; destructor TfrmModels.Destroy; begin xml.Free; inherited; end; procedure TfrmModels.cmbModelsClick(Sender: TObject); begin SaveModel; LoadModel; end; procedure TfrmModels.LoadModel; var model : TJvSimpleXmlElem; target : TJvSimpleXmlElem; alias : TJvSimpleXmlElem; replacement : TJvSimpleXmlElem; row : TStrings; i : integer; begin model := xml.root.Items.ItemNamed['Models'].Items[0]; for i := 0 to xml.root.Items.ItemNamed['Models'].Items.Count - 1 do begin if xml.root.Items.ItemNamed['Models'].Items[i].Properties.ItemNamed['Name'].value = cmbModels.Text then model := xml.root.Items.ItemNamed['Models'].Items[i]; end; // generic properties edtFormat.Text := model.Properties.ItemNamed['format'].value; edtName.Text := model.Properties.ItemNamed['name'].value; edtPrefix.Text := model.Properties.ItemNamed['prefix'].value; jdePackages.Text := model.Properties.ItemNamed['packages'].value; jfeIncFile.Text := model.Properties.ItemNamed['incfile'].value; edtClxFormat.Text := ''; edtClxPrefix.Text := ''; if Assigned(model.Properties.ItemNamed['clxformat']) then edtClxFormat.Text := model.Properties.ItemNamed['clxformat'].value; if Assigned(model.Properties.ItemNamed['clxprefix']) then edtClxPrefix.Text := model.Properties.ItemNamed['clxprefix'].value; edtNLSFormat.Text := ''; edtNLSPrefix.Text := ''; if Assigned(model.Properties.ItemNamed['nolibsuffixformat']) then edtNLSFormat.Text := model.Properties.ItemNamed['nolibsuffixformat'].value; if Assigned(model.Properties.ItemNamed['nolibsuffixprefix']) then edtNLSPrefix.Text := model.Properties.ItemNamed['nolibsuffixprefix'].value; edtDotNetFormat.Text := ''; edtDotNetPrefix.Text := ''; if Assigned(model.Properties.ItemNamed['dotnetformat']) then edtDotNetFormat.Text := model.Properties.ItemNamed['dotnetformat'].value; if Assigned(model.Properties.ItemNamed['dotnetprefix']) then edtDotNetPrefix.Text := model.Properties.ItemNamed['dotnetprefix'].value; // targets stgTargets.RowCount := 2; stgTargets.Rows[1].Text := ''; for i := 0 to model.Items.ItemNamed['targets'].Items.count - 1 do begin target := model.Items.ItemNamed['targets'].Items[i]; row := stgTargets.Rows[stgTargets.RowCount-1]; row[0] := target.properties.ItemNamed['name'].value; if Assigned(target.properties.ItemNamed['dir']) then row[1] := target.properties.ItemNamed['dir'].value; if Assigned(target.properties.ItemNamed['pname']) then row[2] := target.properties.ItemNamed['pname'].value; if Assigned(target.properties.ItemNamed['pdir']) then row[3] := target.properties.ItemNamed['pdir'].value; if Assigned(target.properties.ItemNamed['env']) then row[4] := target.properties.ItemNamed['env'].value; if Assigned(target.properties.ItemNamed['ver']) then row[5] := target.properties.ItemNamed['ver'].value; if Assigned(target.properties.ItemNamed['PathSep']) then row[6] := target.properties.ItemNamed['PathSep'].value; if Assigned(target.properties.ItemNamed['IsClx']) then row[7] := target.properties.ItemNamed['IsClx'].value; if Assigned(target.properties.ItemNamed['IsBds']) then row[8] := target.properties.ItemNamed['IsBds'].value; if Assigned(target.properties.ItemNamed['IsDotNet']) then row[9] := target.properties.ItemNamed['IsDotNet'].value; stgTargets.InsertRow(stgTargets.RowCount); end; // aliases stgAliases.RowCount := 2; stgAliases.Rows[1].Text := ''; for i := 0 to model.Items.ItemNamed['aliases'].Items.count - 1 do begin alias := model.Items.ItemNamed['aliases'].Items[i]; row := stgAliases.Rows[stgAliases.RowCount-1]; row[0] := alias.properties.ItemNamed['name'].value; row[1] := alias.properties.ItemNamed['value'].value; stgAliases.InsertRow(stgAliases.RowCount); end; // Clx Filename replacements, if any stgClxRepl.RowCount := 2; stgClxRepl.Rows[1].Text := ''; if Assigned(model.Items.ItemNamed['ClxReplacements']) then begin for i := 0 to model.Items.ItemNamed['ClxReplacements'].Items.count - 1 do begin replacement := model.Items.ItemNamed['ClxReplacements'].Items[i]; row := stgClxRepl.Rows[stgClxRepl.RowCount-1]; row[0] := replacement.properties.ItemNamed['original'].value; row[1] := replacement.properties.ItemNamed['replacement'].value; stgClxRepl.InsertRow(stgClxRepl.RowCount); end; end; end; procedure TfrmModels.SaveModel; var model : TJvSimpleXmlElem; target : TJvSimpleXmlElem; alias : TJvSimpleXmlElem; replacement : TJvSimpleXmlElem; row : TStrings; i : integer; begin if edtName.Text <> '' then begin model := xml.root.Items.ItemNamed['Models'].Items[0]; for i := 0 to xml.root.Items.ItemNamed['Models'].Items.Count - 1 do begin if xml.root.Items.ItemNamed['Models'].Items[i].Properties.ItemNamed['Name'].value = edtName.Text then model := xml.root.Items.ItemNamed['Models'].Items[i]; end; model.Clear; xml.Options := xml.Options + [sxoAutoCreate]; try // generic properties model.Properties.ItemNamed['format'].value := edtFormat.Text; model.Properties.ItemNamed['name'].value := edtName.Text; model.Properties.ItemNamed['prefix'].value := edtPrefix.Text; model.Properties.ItemNamed['packages'].value := jdePackages.Text; model.Properties.ItemNamed['incfile'].value := jfeIncFile.Text; if edtClxFormat.Text <> '' then model.Properties.ItemNamed['clxformat'].value := edtClxFormat.Text; if edtClxPrefix.Text <> '' then model.Properties.ItemNamed['clxprefix'].value := edtClxPrefix.Text; if edtNLSFormat.Text <> '' then model.Properties.ItemNamed['nolibsuffixformat'].value := edtNLSFormat.Text; if edtNLSPrefix.Text <> '' then model.Properties.ItemNamed['nolibsuffixprefix'].value := edtNLSPrefix.Text; if edtDotNetFormat.Text <> '' then model.Properties.ItemNamed['dotnetformat'].value := edtDotNetFormat.Text; if edtDotNetPrefix.Text <> '' then model.Properties.ItemNamed['dotnetprefix'].value := edtDotNetPrefix.Text; // targets model.Items.ItemNamed['targets'].Items.Clear; for i := 1 to stgTargets.RowCount-2 do begin target := model.Items.ItemNamed['targets'].Items.Add('target'); row := stgTargets.Rows[i]; target.properties.Add('name', row[0]); if row[1] <> '' then target.properties.Add('dir', row[1]); if row[2] <> '' then target.properties.Add('pname', row[2]); if row[3] <> '' then target.properties.Add('pdir', row[3]); if row[4] <> '' then target.properties.Add('env', row[4]); if row[5] <> '' then target.properties.Add('ver', row[5]); if row[6] <> '' then target.properties.Add('PathSep', row[6]); if row[7] <> '' then target.properties.Add('IsClx', row[7]); if row[8] <> '' then target.properties.Add('IsBds', row[8]); if row[9] <> '' then target.Properties.Add('IsDotNet', row[9]); end; // aliases model.Items.ItemNamed['aliases'].Items.Clear; for i := 1 to stgAliases.RowCount-2 do begin alias := model.Items.ItemNamed['aliases'].Items.Add('alias'); row := stgAliases.Rows[i]; alias.properties.Add('name', row[0]); alias.properties.Add('value', row[1]); end; // Clx filename replacements, if any if stgClxRepl.Cells[0, 1] <> '' then begin model.Items.ItemNamed['ClxReplacements'].Items.Clear; for i := 1 to stgClxRepl.RowCount-2 do begin replacement := model.Items.ItemNamed['ClxReplacements'].Items.Add('replacement'); row := stgClxRepl.Rows[i]; replacement.properties.Add('original', row[0]); replacement.properties.Add('replacement', row[1]); end; end; finally xml.Options := xml.Options - [sxoAutoCreate]; end; end; end; procedure TfrmModels.btnDeleteClick(Sender: TObject); begin if Application.MessageBox('Are you sure you want to delete this model?', 'Delete confirmation', MB_ICONQUESTION+MB_YESNO) = MRYES then begin xml.root.Items.ItemNamed['Models'].Items.Delete(cmbModels.Text); RefreshModelList; end; end; procedure TfrmModels.btnAddClick(Sender: TObject); var ModelName : string; Model : TJvSimpleXmlElem; begin ModelName := InputBox('Adding a model', 'Please indicate the name of the model to add', ''); if ModelName <> '' then begin model := xml.root.Items.ItemNamed['Models'].Items.Add('Model'); model.Properties.Add('Name', ModelName); model.Properties.Add('format', ''); model.Properties.Add('prefix', ''); model.Properties.Add('packages', ''); model.Properties.Add('incfile', ''); model.Items.Add('targets'); model.Items.Add('aliases'); RefreshModelList; end; end; procedure TfrmModels.btnOkClick(Sender: TObject); begin SaveModel; xml.SaveToFile(filename); ModalResult := mrOk; end; procedure TfrmModels.RefreshModelList; var models : TJvSimpleXMLElem; i : integer; savedIndex : integer; begin with xml do begin models := root.Items.ItemNamed['Models']; savedIndex := cmbModels.ItemIndex; cmbModels.Items.Clear; if Assigned(models) then begin for i := 0 to models.Items.Count - 1 do cmbModels.Items.Add(models.Items[i].Properties.ItemNamed['Name'].Value); end; cmbModels.ItemIndex := savedIndex; end; end; procedure TfrmModels.FormShow(Sender: TObject); begin cmbModels.ItemIndex := EditIndex; LoadModel; end; end.