unit uDADataTableMasterLinkWizardForm_laz; {$IFDEF MSWINDOWS} {$I ..\DataAbstract.inc} {$ELSE} {$I ../DataAbstract.inc} {$ENDIF} interface uses LCLIntf,LResources,PropEdits, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, Buttons, uDADataTable, ExtCtrls; type { TDADataTableMasterLinkWizard } TDADataTableMasterLinkWizard = class(TForm) Bevel1: TBevel; Panel1: TPanel; Image1: TImage; Label1: TLabel; Label2: TLabel; pc_Pages: TPageControl; ts_Welcome: TTabSheet; Label3: TLabel; Label4: TLabel; Label24: TLabel; Label25: TLabel; Label26: TLabel; Label27: TLabel; Label28: TLabel; Label29: TLabel; ts_MasterSource: TTabSheet; Label8: TLabel; Label9: TLabel; Label10: TLabel; Label17: TLabel; lbl_Params1: TLabel; lbl_Params2: TLabel; lbl_Method1: TLabel; lbl_Method2: TLabel; lbl_Params3: TLabel; lbl_Where1: TLabel; lbl_Where2: TLabel; cb_DataSources: TComboBox; rb_Where: TRadioButton; rb_Params: TRadioButton; rb_Method: TRadioButton; ts_Fields: TTabSheet; labMasterFields: TLabel; labDetailFields: TLabel; Label13: TLabel; Label14: TLabel; Label18: TLabel; Label19: TLabel; lbMaster: TListBox; lbDetail: TListBox; eMasterFields: TEdit; eDetailFields: TEdit; bbAddFieldMapping: TBitBtn; BitBtn4: TBitBtn; ts_MethodCall: TTabSheet; labMasterFields2: TLabel; labDataReqParams: TLabel; Label7: TLabel; Label20: TLabel; Label21: TLabel; lbMaster2: TListBox; lbDataReqParams: TListBox; mMappings: TMemo; bbAddDataReqMapping: TBitBtn; bbClearDataReqMapping: TBitBtn; ts_Params: TTabSheet; Label11: TLabel; Label12: TLabel; Label15: TLabel; Label22: TLabel; Label23: TLabel; lbMaster3: TListBox; lbParams: TListBox; mParamsMappings: TMemo; bbAddParamMappingXXX: TBitBtn; bbClearParamMappingsXXX: TBitBtn; ts_Finish: TTabSheet; Label5: TLabel; Label6: TLabel; Panel2: TPanel; btn_Finish: TBitBtn; btn_Cancel: TBitBtn; btn_Next: TBitBtn; btn_Back: TBitBtn; Label16: TLabel; procedure bbAddFieldMappingClick(Sender: TObject); procedure bbAddDataReqMappingClick(Sender: TObject); procedure bbClearDataReqMappingClick(Sender: TObject); procedure BitBtn4Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure bbAddParamMappingXXXClick(Sender: TObject); procedure bbClearParamMappingsXXXClick(Sender: TObject); procedure cb_DataSourcesChange(Sender: TObject); procedure btn_FinishClick(Sender: TObject); procedure OnFieldMappingChange(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure btn_BackClick(Sender: TObject); procedure btn_NextClick(Sender: TObject); private fDataTable: TDADataTable; fMasterSource: TDADataSource; fDesigner: TPropertyEditorHook; fInEnterPage: boolean; fActiveControl: TWinControl; fValues: TStrings; fNextPage: integer; fPreviousPage: integer; procedure GetDataTables(const aName: ansistring); function GetActiveControl: TWinControl; procedure SetActiveControl(const Value: TWinControl); function GetNextPage: integer; function GetPreviousPage: integer; procedure Initialize; protected function CleanPascalString(const aString: string): string; procedure AfterEnterPage(aPage:TTabSheet; aMovingForward:boolean); procedure OnLeavePage(aPage:TTabSheet; aMovingForward:boolean); procedure OnEnterPage(aPage:TTabSheet; aMovingForward:boolean); public constructor Create(aOwner : TComponent); reintroduce; property Values:TStrings read fValues; function Execute:boolean; overload; class function Execute(aOwner: TComponent): boolean; overload; property ActiveControl: TWinControl read GetActiveControl write SetActiveControl; property NextPage: integer read GetNextPage write fNextPage; property PreviousPage: integer read GetPreviousPage write fPreviousPage; class function ExecuteWizard(aDataTable: TDADataTable; aDesigner: TPropertyEditorHook): boolean; end; var DADataTableMasterLinkWizard: TDADataTableMasterLinkWizard; implementation uses uROClasses, TypInfo, uDARemoteDataAdapter, uRODynamicRequest, uRODL; procedure TrimNamesAndValues(aSL: TStrings); var i: Integer; begin for i := 0 to aSL.Count - 1 do begin aSL[i] := Trim(aSL.Names[i]) + aSL.NameValueSeparator + Trim(aSL.Values[aSL.Names[i]]); end; end; { TDataTableMasterLink } class function TDADataTableMasterLinkWizard.ExecuteWizard(aDataTable: TDADataTable; aDesigner: TPropertyEditorHook): boolean; begin with TDADataTableMasterLinkWizard.Create(NIL) do try fDataTable := aDataTable; fDesigner := aDesigner; Initialize(); result := Execute(); finally Free; end; end; constructor TDADataTableMasterLinkWizard.Create(aOwner: TComponent); begin inherited; end; procedure TDADataTableMasterLinkWizard.Initialize; var i : integer; begin cb_DataSources.Items.Clear(); fDesigner.GetComponentNames(GetTypeData(TypeInfo(TDADataSource)), Self.GetDataTables); if assigned(fDataTable.MasterSource) then begin cb_DataSources.ItemIndex := cb_DataSources.Items.IndexOf(fDataTable.MasterSource.Name); //lMasterTable := fDataTable.MasterSource.DataTable; //Check(mast=NIL, 'MasterSource doesn''t point to a datatable'); end; cb_DataSourcesChange(nil); Caption := Format(Caption, [fDataTable.Name]); eMasterFields.Text := fDataTable.MasterFields; eDetailFields.Text := fDataTable.DetailFields; mMappings.Lines.Text := fDataTable.MasterRequestMappings.Text; mParamsMappings.Lines.Text := fDataTable.MasterParamsMappings.Text; for i := 0 to (fDataTable.FieldCount-1) do lbDetail.Items.Add(fDataTable.Fields[i].Name); for i := 0 to (fDataTable.Params.Count-1) do lbParams.Items.Add(fDataTable.Params[i].Name); case fDataTable.MasterMappingMode of mmParams: rb_Params.Checked := true; mmDataRequest: rb_Method.Checked := true; mmWhere: rb_Where.Checked := true; end; end; procedure TDADataTableMasterLinkWizard.GetDataTables(const aName: ansistring); var lDataSource: TDADataSource; begin lDataSource := fDesigner.GetComponent(aName) as TDADataSource; if assigned(lDataSource.DataTable) and (lDataSource.DataTable <> fDataTable) then cb_DataSources.Items.Add(aName); end; function TDADataTableMasterLinkWizard.CleanPascalString(const aString: string ): string; begin result := aString; result := StringReplace(result,'''','''''',[rfReplaceAll]); { replace quotes with double quotes } result := StringReplace(result,#13#10,'''#13#10''',[rfReplaceAll]); result := ''''+result+''''; end; procedure TDADataTableMasterLinkWizard.cb_DataSourcesChange(Sender: TObject); var lMasterTable: TDADataTable; lCall: TRODynamicRequest; i: integer; begin fMasterSource := fDesigner.GetComponent(cb_DataSources.Text) as TDADataSource; if assigned(fMasterSource) and assigned(fMasterSource.DataTable) then begin lMasterTable := fMasterSource.DataTable; rb_Params.Enabled := fDataTable.Params.Count > 0; lbl_Params1.Enabled := rb_Params.Enabled; lbl_Params2.Enabled := rb_Params.Enabled; rb_Method.Enabled := assigned(lMasterTable.RemoteDataAdapter) and assigned(fDataTable.RemoteDataAdapter) and (lMasterTable.RemoteDataAdapter <> fDataTable.RemoteDataAdapter); lbl_Method1.Enabled := rb_Method.Enabled; if (not rb_Params.Enabled and rb_Params.Checked) or (not rb_Method.Enabled and rb_Method.Checked) then rb_Where.Checked := true; lbMaster.Items.Clear(); lbMaster2.Items.Clear(); lbMaster3.Items.Clear(); for i := 0 to (lMasterTable.FieldCount-1) do begin lbMaster.Items.Add(lMasterTable.Fields[i].Name); lbMaster2.Items.Add(lMasterTable.Fields[i].Name); lbMaster3.Items.Add(lMasterTable.Fields[i].Name); end; if assigned(fDataTable.RemoteDataAdapter) then begin lCall := (fDataTable.RemoteDataAdapter as TDARemoteDataAdapter).GetDataCall; lbDataReqParams.Items.Clear(); for i := 0 to lCall.Params.Count-1 do if lCall.Params[i].Flag in [fIn, fInOut] then lbDataReqParams.Items.Add(lCall.Params[i].Name); end else begin lbDataReqParams.Enabled := false; end; if pc_Pages.ActivePage = ts_MasterSource then btn_Next.Enabled := (rb_Where.Enabled and rb_Where.Checked) or (rb_Params.Enabled and rb_Params.Checked) or (rb_Method.Enabled and rb_Method.Checked); end else begin if pc_Pages.ActivePage = ts_MasterSource then btn_Next.Enabled := false; end; end; procedure TDADataTableMasterLinkWizard.bbAddFieldMappingClick(Sender: TObject); var x : integer; begin if (lbMaster.SelCount=0) or (lbMaster.SelCount<>lbDetail.SelCount) then begin Beep; Exit; end; for x := 0 to (lbMaster.Items.Count-1) do if lbMaster.Selected[x] then begin if (eMasterFields.Text<>'') then eMasterFields.Text := eMasterFields.Text+';'; eMasterFields.Text := eMasterFields.Text+lbMaster.Items[x]; end; for x := 0 to (lbDetail.Items.Count-1) do if lbDetail.Selected[x] then begin if (eDetailFields.Text<>'') then eDetailFields.Text := eDetailFields.Text+';'; eDetailFields.Text := eDetailFields.Text+lbDetail.Items[x]; end; OnFieldMappingChange(nil); end; procedure TDADataTableMasterLinkWizard.bbAddDataReqMappingClick(Sender: TObject); var x, i : integer; s : TStringList; begin if (lbMaster2.SelCount=0) or (lbDataReqParams.SelCount<>lbMaster2.SelCount) then begin Beep; Exit; end; s := TStringList.Create; try for x := 0 to (lbDataReqParams.Items.Count-1) do if lbDataReqParams.Selected[x] then s.Add(lbDataReqParams.Items[x]+'='); i := 0; for x := 0 to (lbMaster2.Items.Count-1) do if lbMaster2.Selected[x] then begin s[i] := s[i]+lbMaster2.Items[x]; Inc(i); end; mMappings.Lines.AddStrings(s); finally s.Free; end; end; procedure TDADataTableMasterLinkWizard.bbClearDataReqMappingClick(Sender: TObject); begin mMappings.Lines.Clear end; procedure TDADataTableMasterLinkWizard.BitBtn4Click(Sender: TObject); begin eMasterFields.Text := ''; eDetailFields.Text := ''; OnFieldMappingChange(nil); end; procedure TDADataTableMasterLinkWizard.OnFieldMappingChange( Sender: TObject); begin if pc_Pages.ActivePage = ts_Fields then btn_Next.Enabled := (eMasterFields.Text <> '') and (eDetailFields.Text <> ''); end; procedure TDADataTableMasterLinkWizard.FormDestroy(Sender: TObject); begin FreeAndNil(fValues); end; procedure TDADataTableMasterLinkWizard.btn_BackClick(Sender: TObject); begin if pc_Pages.ActivePageIndex > 0 then begin fInEnterPage := true; try OnLeavePage(pc_Pages.Pages[pc_Pages.ActivePageIndex],false); OnEnterPage(pc_Pages.Pages[PreviousPage],false); finally fInEnterPage := false; end; pc_Pages.ActivePageIndex := PreviousPage; if Assigned(fActiveControl) then begin inherited ActiveControl := fActiveControl; fActiveControl := nil; end; end; fNextPage := -1; fPreviousPage := -1; AfterEnterPage(pc_Pages.ActivePage, false); end; procedure TDADataTableMasterLinkWizard.btn_NextClick(Sender: TObject); begin if pc_Pages.ActivePageIndex+1 < pc_Pages.PageCount then begin fInEnterPage := true; try OnLeavePage(pc_Pages.Pages[pc_Pages.ActivePageIndex],true); OnEnterPage(pc_Pages.Pages[NextPage],true); finally fInEnterPage := false; end; fPreviousPage := pc_Pages.ActivePageIndex; pc_Pages.ActivePageIndex := NextPage; if Assigned(fActiveControl) then begin inherited ActiveControl := fActiveControl; fActiveControl := nil; end; end; fNextPage := -1; AfterEnterPage(pc_Pages.ActivePage, true); end; function TDADataTableMasterLinkWizard.GetActiveControl: TWinControl; begin if Assigned(fActiveControl) then result := fActiveControl else result := inherited ActiveControl; end; procedure TDADataTableMasterLinkWizard.SetActiveControl(const Value: TWinControl ); begin if fInEnterPage then begin fActiveControl := Value; end else begin inherited ActiveControl := Value; fActiveControl := nil; end; end; function TDADataTableMasterLinkWizard.GetNextPage: integer; begin Result := fNextPage; if result = -1 then result := pc_Pages.ActivePageIndex+1; end; function TDADataTableMasterLinkWizard.GetPreviousPage: integer; begin Result := fPreviousPage; if result = -1 then result := pc_Pages.ActivePageIndex-1; end; procedure TDADataTableMasterLinkWizard.FormCreate(Sender: TObject); var i: integer; begin for i := 0 to ComponentCount-1 do begin if Components[i] is TTabSheet then TTabSheet(Components[i]).TabVisible := false; end; fValues := TStringList.Create(); Height := Height-16; pc_Pages.ActivePageIndex := 0; OnEnterPage(pc_Pages.Pages[0],true); fNextPage := -1; fPreviousPage := -1; end; procedure TDADataTableMasterLinkWizard.bbAddParamMappingXXXClick(Sender: TObject); var x, i : integer; s : TStringList; begin if (lbMaster3.SelCount=0) or (lbParams.SelCount<>lbMaster3.SelCount) then begin Beep; Exit; end; s := TStringList.Create; try for x := 0 to (lbParams.Items.Count-1) do if lbParams.Selected[x] then s.Add(lbParams.Items[x]+'='); i := 0; for x := 0 to (lbMaster3.Items.Count-1) do if lbMaster3.Selected[x] then begin s[i] := s[i]+lbMaster3.Items[x]; Inc(i); end; mParamsMappings.Lines.AddStrings(s); finally s.Free; end; end; procedure TDADataTableMasterLinkWizard.bbClearParamMappingsXXXClick(Sender: TObject); begin mParamsMappings.Lines.Clear end; procedure TDADataTableMasterLinkWizard.btn_FinishClick(Sender: TObject); begin fDataTable.MasterSource := fMasterSource; fDataTable.MasterFields := eMasterFields.Text; fDataTable.DetailFields := eDetailFields.Text; TrimNamesAndValues(mMappings.Lines); TrimNamesAndValues(mParamsMappings.Lines); fDataTable.MasterRequestMappings.Text := mMappings.Lines.Text; fDataTable.MasterParamsMappings.Text := mParamsMappings.Lines.Text; if rb_Where.Checked then fDataTable.MasterMappingMode := mmWhere else if rb_Params.Checked then fDataTable.MasterMappingMode := mmParams else if rb_Method.Checked then fDataTable.MasterMappingMode := mmDataRequest; end; procedure TDADataTableMasterLinkWizard.AfterEnterPage(aPage: TTabSheet; aMovingForward: boolean); begin if (aPage = ts_MasterSource) and aMovingForward then begin cb_DataSourcesChange(nil); end else if (aPage = ts_Fields) and aMovingForward then begin OnFieldMappingChange(nil); end; end; procedure TDADataTableMasterLinkWizard.OnLeavePage(aPage: TTabSheet; aMovingForward: boolean); begin if (aPage = ts_Fields) and aMovingForward then begin if rb_Where.Checked then NextPage := ts_Finish.PageIndex else if rb_Params.Checked then NextPage := ts_Params.PageIndex else if rb_Method.Checked then NextPage := ts_MethodCall.PageIndex; end else if (aPage = ts_Params) or (aPage = ts_MethodCall) then begin NextPage := ts_Finish.PageIndex; PreviousPage := ts_Fields.PageIndex; end; end; procedure TDADataTableMasterLinkWizard.OnEnterPage(aPage: TTabSheet; aMovingForward: boolean); begin {$IFDEF FPC} if aMovingForward then btn_Finish.Visible := false else // for prevent warnings {$ENDIF} btn_Finish.Visible := false; btn_Next.Visible := true; if aPage = ts_Welcome then begin btn_Back.Enabled := false; btn_Next.Enabled := true; ActiveControl := btn_Next; end else if aPage = ts_Finish then begin try btn_Finish.Visible := true; btn_Finish.Enabled := true; btn_Next.Visible := false; ActiveControl := btn_Finish; finally end; end else { default for custom added pages } begin btn_Back.Enabled := true; btn_Next.Enabled := true; end; end; function TDADataTableMasterLinkWizard.Execute: boolean; begin result := (ShowModal() = 1); // idOk=1 end; class function TDADataTableMasterLinkWizard.Execute(aOwner: TComponent ): boolean; begin with self.Create(aOwner) do try result := Execute(); finally Free(); end; end; initialization {$I uDADataTableMasterLinkWizardForm_laz.lrs} end.