Files
lazarus-ccr/components/tvplanit/source/vpflxdsed1.pas

701 lines
20 KiB
ObjectPascal
Raw Normal View History

{*********************************************************}
{* VPFLXDSED1.PAS 1.03 *}
{*********************************************************}
{* ***** BEGIN LICENSE BLOCK ***** *}
{* Version: MPL 1.1 *}
{* *}
{* The contents of this file are subject to the Mozilla Public License *}
{* Version 1.1 (the "License"); you may not use this file except in *}
{* compliance with the License. You may obtain a copy of the License at *}
{* http://www.mozilla.org/MPL/ *}
{* *}
{* Software distributed under the License is distributed on an "AS IS" basis, *}
{* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License *}
{* for the specific language governing rights and limitations under the *}
{* License. *}
{* *}
{* The Original Code is TurboPower Visual PlanIt *}
{* *}
{* The Initial Developer of the Original Code is TurboPower Software *}
{* *}
{* Portions created by TurboPower Software Inc. are Copyright (C) 2002 *}
{* TurboPower Software Inc. All Rights Reserved. *}
{* *}
{* Contributor(s): *}
{* *}
{* ***** END LICENSE BLOCK ***** *}
{.$DEFINE RUNTIMETEST}
{$I vp.inc}
unit VpFlxDsEd1;
{ Flexible DataStore ComponentEditor }
{ Introduced in version 1.01 }
interface
uses
SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
(*
{$IFNDEF RUNTIMETEST}
{$IFDEF LCL}
propedits, componenteditors, FormEditingIntf, lclintf, IDEIntf,
{$ELSE}
Windows, Messages,
{$IFDEF VERSION6} DesignIntf, DesignEditors, {$ELSE} DsgnIntf, {$ENDIF}, DBTables,
{$ENDIF}
{$ENDIF} {RUNTIMETEST}
*)
ExtCtrls, StdCtrls, Db, ComCtrls, Buttons,
VpFlxDS;
type
{ TfrmFieldMapper }
TfrmFieldMapper = class(TForm)
Bevel2: TBevel;
BtnCancel: TButton;
btnAddAll: TButton;
ButtonPanel: TPanel;
BtnOK: TButton;
PageControl1: TPageControl;
TabSheet1: TTabSheet;
lblDBFieldsAvail: TLabel;
lblFieldMappings: TLabel;
lblVPFieldsAvail: TLabel;
lblDataset: TLabel;
DatasetFieldLB: TListBox;
VPFieldLB: TListBox;
FieldMappingsLB: TListBox;
btnDeleteMapping: TButton;
DatasetCombo: TComboBox;
btnAddMapping: TBitBtn;
btnClearMappings: TButton;
procedure btnAddAllClick(Sender: TObject);
procedure btnAddMappingClick(Sender: TObject);
procedure btnClearMappingsClick(Sender: TObject);
procedure btnDeleteMappingClick(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure DatasetComboChange(Sender: TObject);
procedure DatasetFieldLBKeyPress(Sender: TObject; var Key: Char);
procedure DBFieldSelected(Sender: TObject);
procedure FieldMappingsLBClick(Sender: TObject);
procedure FieldMappingsLBKeyPress(Sender: TObject; var Key: Char);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
procedure VPFieldLBKeyPress(Sender: TObject; var Key: Char);
procedure VpFieldSelected(Sender: TObject);
private
DSResActive: Boolean;
DSEventActive: Boolean;
DSContactActive: Boolean;
DSTaskActive: Boolean;
function GetSelectedFieldMappings: TCollection;
procedure SyncObjects;
procedure OpenDatasets;
procedure PositionControls;
public
FlexDS: TVpFlexDataStore;
ResDS: TDataset;
EventsDS: TDataset;
ContactsDS: TDataset;
TasksDS: TDataset;
end;
(*
{$IFDEF RUNTIMETEST}
procedure RuntimeTest(FlexDS: TVpFlexDataStore);
{$ELSE}
TVpFlexDSEditor = class(TComponentEditor)
procedure ExecuteVerb(Index: Integer); override;
function GetVerb(Index: Integer): string; override;
function GetVerbCount: Integer; override;
end;
{$ENDIF}
*)
implementation
{$IFDEF LCL}
{$R *.lfm}
{$ELSE}
{$R *.dfm}
{$ENDIF}
uses
math,
vpConst, VpMisc;
(*
{$IFDEF RUNTIMETEST}
{ Runtime test }
procedure RuntimeTest(FlexDS: TVpFlexDataStore);
var
frmFieldMapper: TfrmFieldMapper;
begin
if FlexDS = nil then
Exit;
Application.CreateForm(TfrmFieldMapper, frmFieldMapper);
try
frmFieldMapper.FlexDS := FlexDS;
if FlexDS.ResourceDataSource <> nil then
frmFieldMapper.ResDS := FlexDS.ResourceDataSource.DataSet;
if FlexDS.EventsDataSource <> nil then
frmFieldMapper.EventsDS := FlexDS.EventsDataSource.DataSet;
if FlexDS.ContactsDataSource <> nil then
frmFieldMapper.ContactsDS := FlexDS.ContactsDataSource.DataSet;
if FlexDS.TasksDataSource <> nil then
frmFieldMapper.TasksDS := FlexDS.TasksDataSource.DataSet;
frmFieldMapper.ShowModal;
finally
frmFieldMapper.release;
end;
end;
{=====}
{$ELSE} {RUNTIMETEST}
{$IFDEF LCL}
procedure MapDatabaseFields(Designer: TComponentEditorDesigner;
FlexDS: TVpFlexDataStore);
{$ELSE}
{$IFDEF VERSION6}
procedure MapDatabaseFields(Designer: TComponentEditorDesigner;; // was: Designer : IDesigner;
FlexDS: TVpFlexDataStore);
{$ELSE}
procedure MapDatabaseFields(Designer: IFormDesigner;
FlexDS: TVpFlexDataStore);
{$ENDIF}{$ENDIF}
var
frmFieldMapper: TfrmFieldMapper;
savedResourceMappings: TCollection;
savedContactMappings: TCollection;
savedEventMappings: TCollection;
savedTaskMappings: TCollection;
begin
if FlexDS = nil then
Exit;
savedResourceMappings := TCollection.Create(TVpFieldMapping);
savedContactMappings := TCollection.Create(TVpFieldMapping);
savedEventMappings := TCollection.Create(TVpFieldMapping);
savedTaskMappings := TCollection.Create(TVpFieldMapping);
try
savedResourceMappings.Assign(FlexDS.ResourceMappings);
savedContactMappings.Assign(FlexDS.ContactMappings);
savedEventMappings.Assign(FlexDS.EventMappings);
savedTaskMappings.Assign(FlexDS.TaskMappings);
Application.CreateForm(TfrmFieldMapper, frmFieldMapper);
try
frmFieldMapper.FlexDS := FlexDS;
if FlexDS.ResourceDataSource <> nil then
frmFieldMapper.ResDS := FlexDS.ResourceDataSource.DataSet;
if FlexDS.EventsDataSource <> nil then
frmFieldMapper.EventsDS := FlexDS.EventsDataSource.DataSet;
if FlexDS.ContactsDataSource <> nil then
frmFieldMapper.ContactsDS := FlexDS.ContactsDataSource.DataSet;
if FlexDS.TasksDataSource <> nil then
frmFieldMapper.TasksDS := FlexDS.TasksDataSource.DataSet;
if frmFieldMapper.ShowModal <> mrOK then begin
FlexDS.ResourceMappings.Assign(savedResourceMappings);
FlexDS.ContactMappings.Assign(savedContactMappings);
FlexDS.EventMappings.Assign(savedEventMappings);
FlexDS.TaskMappings.Assign(savedTaskMappings);
end;
finally
frmFieldMapper.Release;
end;
Designer.Modified;
finally
savedResourceMappings.Free;
savedContactMappings.Free;
savedEventMappings.Free;
savedTaskMappings.Free;
end;
end;
{=====}
{*** TVpNavBarEditor ***}
procedure TVpFlexDSEditor.ExecuteVerb(Index: Integer);
begin
if Index = 0 then
MapDatabaseFields(Designer, (Component as TVpFlexDataStore));
end;
function TVpFlexDSEditor.GetVerb(Index: Integer): string;
begin
if Index = 0 then
Result := 'Map Database Fields...';
end;
function TVpFlexDSEditor.GetVerbCount: Integer;
begin
Result := 1;
end;
{$ENDIF} {RuntimeTest}
*)
procedure TfrmFieldMapper.FormShow(Sender: TObject);
begin
PositionControls;
DatasetCombo.Items.Clear;
DatasetCombo.Text := '';
try
OpenDatasets;
finally
{Load DatasetCombo}
if (ResDS <> nil) and (ResDS.Active) then
DatasetCombo.Items.Add(ResourceTableName)
else
FlexDS.ResourceMappings.Clear;
if (EventsDS <> nil) and (EventsDS.Active) then
DatasetCombo.Items.Add(EventsTableName)
else
FlexDS.EventMappings.Clear;
if (ContactsDS <> nil) and (ContactsDS.Active) then
DatasetCombo.Items.Add(ContactsTableName)
else
FlexDS.ContactMappings.Clear;
if (TasksDS <> nil) and (TasksDS.Active) then
DatasetCombo.Items.Add(TasksTableName)
else
FlexDS.TaskMappings.Clear;
end;
end;
{=====}
procedure TfrmFieldMapper.OpenDatasets;
var
ErrorStr: string;
begin
ErrorStr := '';
DSResActive := false;
DSEventActive := false;
{Open the Resources Dataset}
if ResDS <> nil then begin
DSResActive := ResDS.Active;
if not ResDS.Active then
try
ResDS.Open;
except
ErrorStr := ' Resources (Failed to open)'#13#10;
end;
end else
ErrorStr := ' Resources (Datasource not assigned)'#13#10;
{Open the Events Dataset}
if EventsDS <> nil then begin
DSEventActive := EventsDS.Active;
if not EventsDS.Active then
try
EventsDS.Open;
except
ErrorStr := ErrorStr + ' Events (Failed to open)'#13#10;
end;
end else
ErrorStr := ErrorStr + ' Events (Datasource not assigned)'#13#10;
{Open the Contacts Dataset}
if ContactsDS <> nil then begin
DSContactActive := ContactsDS.Active;
try
ContactsDS.Open;
except
ErrorStr := ErrorStr + ' Contacts (Failed to open)'#13#10;
end;
end else
ErrorStr := ErrorStr + ' Contacts (Datasource not assigned)'#13#10;
{Open the Tasks Dataset}
if TasksDS <> nil then begin
DSTaskActive := TasksDS.Active;
try
TasksDS.Open;
except
ErrorStr := ErrorStr + ' Tasks (Failed to open)'#13#10;
end;
end else
ErrorStr := ErrorStr + ' Tasks (Datasource not assigned)'#13#10;
{ let the user know if there was a prolen opening any of the datasets. }
if (ErrorStr <> '') then
Application.MessageBox(PChar('There was an error opening the following '
+ 'datasets'#13#10#10 + ErrorStr + #10
+ 'Field mapping for these tables will not be available until the '
+ 'errors are corrected. Any previously assigned mappings will be kept.'),
'Error Opening Dataset(s)', 0);
end;
{=====}
procedure TfrmFieldMapper.PositionControls;
var
w, h: Integer;
begin
btnAddMapping.AutoSize := true;
btnAddAll.AutoSize := true;
w := Max(btnAddMapping.Width, btnAddAll.Width);
h := btnAddMapping.Height;
btnAddMapping.AutoSize := false;
btnAddMapping.Height := w * 2 div 3; //h;
btnAddMapping.Width := w;
btnAddAll.AutoSize := false;
btnAddAll.Height := w * 2 div 3; //h;
btnAddAll.Width := w;
btnDeleteMapping.AutoSize := true;
btnClearMappings.AutoSize := true;
w := max(btnDeleteMapping.Width, btnClearMappings.Width);
h := btnDeleteMapping.Height;
btnDeleteMapping.AutoSize := false;
btnDeleteMapping.Height := h;
btnDeleteMapping.Width := w;
btnClearMappings.AutoSize := false;
btnClearMappings.Height := h;
btnClearMappings.Width := w;
AlignOKCancel(BtnOK, BtnCancel, ButtonPanel);
end;
procedure TfrmFieldMapper.DatasetComboChange(Sender: TObject);
begin
btnAddAll.Enabled := DatasetCombo.ItemIndex > -1;
SyncObjects;
end;
{=====}
procedure TfrmFieldMapper.SyncObjects;
var
I: integer;
FM: TVpFieldMapping;
MC: TCollection;
begin
MC := nil;
FieldMappingsLB.Items.Clear;
DatasetFieldLB.Items.Clear;
VpFieldLB.Clear;
if DatasetCombo.Text = ResourceTableName then begin
MC := FlexDS.ResourceMappings;
if not ResDS.Active then
ResDS.Open;
ResDS.FieldDefs.GetItemNames(DataSetFieldLB.Items);
VpFieldLB.Items.Add('ResourceID');
VpFieldLB.Items.Add('Description');
VpFieldLB.Items.Add('Notes');
VpFieldLB.Items.Add('ImageIndex');
VpFieldLB.Items.Add('ResourceActive');
VpFieldLB.Items.Add('UserField0');
VpFieldLB.Items.Add('UserField1');
VpFieldLB.Items.Add('UserField2');
VpFieldLB.Items.Add('UserField3');
VpFieldLB.Items.Add('UserField4');
VpFieldLB.Items.Add('UserField5');
VpFieldLB.Items.Add('UserField6');
VpFieldLB.Items.Add('UserField7');
VpFieldLB.Items.Add('UserField8');
VpFieldLB.Items.Add('UserField9');
end
else if DatasetCombo.Text = EventsTableName then begin
MC := FlexDS.EventMappings;
EventsDS.FieldDefs.GetItemNames(DataSetFieldLB.Items);
VpFieldLB.Items.Add('RecordID');
VpFieldLB.Items.Add('ResourceID');
VpFieldLB.Items.Add('StartTime');
VpFieldLB.Items.Add('EndTime');
VpFieldLB.Items.Add('Description');
VpFieldLB.Items.Add('Location');
VpFieldLB.Items.Add('Notes');
VpFieldLB.Items.Add('Category');
VpFieldLB.Items.Add('AllDayEvent');
VpFieldLB.Items.Add('DingPath');
VpFieldLB.Items.Add('AlarmSet');
VpFieldLB.Items.Add('AlarmAdvance');
VpFieldLB.Items.Add('AlarmAdvanceType');
VpFieldLB.Items.Add('SnoozeTime');
VpFieldLB.Items.Add('RepeatCode');
VpFieldLB.Items.Add('RepeatRangeEnd');
VpFieldLB.Items.Add('CustomInterval');
VpFieldLB.Items.Add('UserField0');
VpFieldLB.Items.Add('UserField1');
VpFieldLB.Items.Add('UserField2');
VpFieldLB.Items.Add('UserField3');
VpFieldLB.Items.Add('UserField4');
VpFieldLB.Items.Add('UserField5');
VpFieldLB.Items.Add('UserField6');
VpFieldLB.Items.Add('UserField7');
VpFieldLB.Items.Add('UserField8');
VpFieldLB.Items.Add('UserField9');
end
else if DatasetCombo.Text = ContactsTableName then begin
MC := FlexDS.ContactMappings;
ContactsDS.FieldDefs.GetItemNames(DataSetFieldLB.Items);
VpFieldLB.Items.Add('RecordID');
VpFieldLB.Items.Add('ResourceID');
VpFieldLB.Items.Add('FirstName');
VpFieldLB.Items.Add('LastName');
VpFieldLB.Items.Add('Birthdate');
VpFieldLB.Items.Add('Anniversary');
VpFieldLB.Items.Add('Title');
VpFieldLB.Items.Add('Company');
VpFieldLB.Items.Add('Job_Position');
VpFieldLB.Items.Add('Address');
VpFieldLB.Items.Add('City');
VpFieldLB.Items.Add('State');
VpFieldLB.Items.Add('Zip');
VpFieldLB.Items.Add('Country');
VpFieldLB.Items.Add('Notes');
VpFieldLB.Items.Add('Phone1');
VpFieldLB.Items.Add('Phone2');
VpFieldLB.Items.Add('Phone3');
VpFieldLB.Items.Add('Phone4');
VpFieldLB.Items.Add('Phone5');
VpFieldLB.Items.Add('PhoneType1');
VpFieldLB.Items.Add('PhoneType2');
VpFieldLB.Items.Add('PhoneType3');
VpFieldLB.Items.Add('PhoneType4');
VpFieldLB.Items.Add('PhoneType5');
VpFieldLB.Items.Add('Category');
VpFieldLB.Items.Add('EMail');
VpFieldLB.Items.Add('Custom1');
VpFieldLB.Items.Add('Custom2');
VpFieldLB.Items.Add('Custom3');
VpFieldLB.Items.Add('Custom4');
VpFieldLB.Items.Add('UserField0');
VpFieldLB.Items.Add('UserField1');
VpFieldLB.Items.Add('UserField2');
VpFieldLB.Items.Add('UserField3');
VpFieldLB.Items.Add('UserField4');
VpFieldLB.Items.Add('UserField5');
VpFieldLB.Items.Add('UserField6');
VpFieldLB.Items.Add('UserField7');
VpFieldLB.Items.Add('UserField8');
VpFieldLB.Items.Add('UserField9');
end
else if DatasetCombo.Text = TasksTableName then begin
MC := FlexDS.TaskMappings;
TasksDS.FieldDefs.GetItemNames(DataSetFieldLB.Items);
VpFieldLB.Items.Add('RecordID');
VpFieldLB.Items.Add('ResourceID');
VpFieldLB.Items.Add('Complete');
VpFieldLB.Items.Add('Description');
VpFieldLB.Items.Add('Details');
VpFieldLB.Items.Add('CreatedOn');
VpFieldLB.Items.Add('Priority');
VpFieldLB.Items.Add('Category');
VpFieldLB.Items.Add('CompletedOn');
VpFieldLB.Items.Add('DueDate');
VpFieldLB.Items.Add('UserField0');
VpFieldLB.Items.Add('UserField1');
VpFieldLB.Items.Add('UserField2');
VpFieldLB.Items.Add('UserField3');
VpFieldLB.Items.Add('UserField4');
VpFieldLB.Items.Add('UserField5');
VpFieldLB.Items.Add('UserField6');
VpFieldLB.Items.Add('UserField7');
VpFieldLB.Items.Add('UserField8');
VpFieldLB.Items.Add('UserField9');
end;
if MC <> nil then
for I := 0 to pred(MC.Count) do begin
FM := TVpFieldMapping(MC.Items[I]);
{Delete mapped selection from the DatabaseFields list}
if (DatasetFieldLB.Items.IndexOf(FM.DBField) > -1) then
DatasetFieldLB.Items.Delete(DatasetFieldLB.Items.IndexOf(FM.DBField));
{Delete mapped selection from the VPFields List}
if (VPFieldLB.Items.IndexOf(FM.VPField) > -1) then
VPFieldLB.Items.Delete(VPFieldLB.Items.IndexOf(FM.VPField));
{Add the field mapping to the Field Mappings Listbox}
FieldMappingsLB.Items.Add(FM.DBField + ' -> ' + FM.VPField);
end;
{enable/disable buttons}
btnDeleteMapping.Enabled := false;
btnClearMappings.Enabled := FieldMappingsLB.Items.Count > 0;
btnAddMapping.Enabled := false;
btnAddAll.Enabled := false;
VpFieldLB.ItemIndex := -1;
DatasetFieldLB.ItemIndex := -1;
end;
{=====}
procedure TfrmFieldMapper.DBFieldSelected(Sender: TObject);
begin
btnAddMapping.Enabled := (VpFieldLB.ItemIndex > -1);
end;
{=====}
procedure TfrmFieldMapper.DatasetFieldLBKeyPress(Sender: TObject;
var Key: Char);
begin
Unused(Key);
DbFieldSelected(sender);
end;
{=====}
procedure TfrmFieldMapper.VpFieldSelected(Sender: TObject);
begin
btnAddMapping.Enabled := (DatasetFieldLB.ItemIndex > -1);
end;
{=====}
procedure TfrmFieldMapper.VPFieldLBKeyPress(Sender: TObject;
var Key: Char);
begin
Unused(Key);
VpFieldSelected(Sender);
end;
{=====}
procedure TfrmFieldMapper.btnAddAllClick(Sender: TObject);
var
i, j: Integer;
MC: TCollection;
FM: TVpFieldMapping;
begin
MC := GetSelectedFieldMappings;
if MC = nil then
exit;
for i:= 0 to DatasetFieldLB.Items.Count-1 do begin
for j:=0 to VPFieldLB.Items.Count-1 do
if VPFieldLB.Items[j] = DatasetFieldLB.Items[i] then begin
FM := TVpFieldMapping(MC.Add);
FM.DBField := DatasetFieldLB.Items[i];
FM.VPField := VPFieldLB.Items[j];
break;
end;
end;
SyncObjects;
end;
procedure TfrmFieldMapper.btnAddMappingClick(Sender: TObject);
var
FM: TVpFieldMapping;
MC: TCollection;
begin
MC := GetSelectedFieldMappings;
if MC = nil then
exit;
FM := TVpFieldMapping(MC.Add);
FM.DBField := DatasetFieldLB.Items[DatasetFieldLB.ItemIndex];
FM.VPField := VPFieldLB.Items[VPFieldLB.ItemIndex];
SyncObjects;
end;
{=====}
procedure TfrmFieldMapper.Button5Click(Sender: TObject);
begin
// Help;
end;
{=====}
procedure TfrmFieldMapper.btnDeleteMappingClick(Sender: TObject);
var
MC: TCollection;
begin
if FieldMappingsLB.ItemIndex > -1 then begin
MC := GetSelectedFieldMappings;
if MC <> nil then begin
MC.Items[FieldMappingsLB.ItemIndex].Free;
SyncObjects;
end;
end;
end;
{=====}
procedure TfrmFieldMapper.btnClearMappingsClick(Sender: TObject);
var
MC: TCollection;
begin
MC := nil;
if FieldMappingsLB.Items.Count > 0 then begin
MC := GetSelectedFieldMappings;
if MC <> nil then begin
while (MC.Count > 0) do
MC.Items[0].Free;
SyncObjects;
end;
btnAddAll.Enabled := DatasetCombo.ItemIndex > -1;
end;
end;
{=====}
procedure TfrmFieldMapper.FieldMappingsLBClick(Sender: TObject);
begin
btnDeleteMapping.Enabled := FieldMappingsLB.ItemIndex > -1;
end;
{=====}
procedure TfrmFieldMapper.FieldMappingsLBKeyPress(Sender: TObject;
var Key: Char);
begin
Unused(Key);
FieldMappingsLBClick(Sender);
end;
{=====}
procedure TfrmFieldMapper.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Unused(Action);
{reset all datasets to their original active status}
if ResDS <> nil then
ResDS.Active := DSResActive;
if EventsDS <> nil then
EventsDS.Active := DSEventActive;
if ContactsDS <> nil then
ContactsDS.Active := DSContactActive;
if TasksDS <> nil then
TasksDS.Active := DSTaskActive;
end;
{=====}
function TfrmFieldMapper.GetSelectedFieldMappings: TCollection;
begin
if DataSetCombo.Text = ResourceTableName then
Result := FlexDS.ResourceMappings
else if DataSetCombo.Text = EventsTableName then
Result := FlexDS.EventMappings
else if DataSetCombo.Text = ContactsTableName then
Result := FlexDS.ContactMappings
else if DataSetCombo.Text = TasksTableName then
Result := FlexDS.TaskMappings
else
Result := nil;
end;
end.