Files
lazarus-ccr/components/tvplanit/source/design/vpreg.pas

713 lines
22 KiB
ObjectPascal

{*********************************************************}
{* VPREG.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 ***** *}
{$I Vp.INC} { Compiler Version Defines }
{$R vpreg.res} { Palette Glyphs }
unit VpReg;
{Registration unit for the Visual PlanIt design-time interface}
interface
uses
{$IFDEF LCL}
LCLProc, LCLType, LCLIntf, LazFileUtils,
PropEdits, GraphPropEdits, LazarusPackageIntf, FieldsEditor, ComponentEditors,
{$ELSE}
Windows,
{$IFDEF VERSION6}
DesignIntf, DesignEditors, VCLEditors,
{$ELSE}
DsgnIntf,
{$ENDIF}
{$ENDIF}
Dialogs, Classes, Controls, TypInfo, Forms, SysUtils, ImgList,
VpDatePropEdit;
type
{ TVpCategoryInfoImageIndexProperty }
TVpCategoryInfoImageIndexProperty = class(TImageIndexPropertyEditor)
protected
function GetImageList: TCustomImageList; override; //overload; -- typo?
end;
{TDBStringProperty}
TDBStringProperty = class(TStringProperty)
public
function GetAttributes: TPropertyAttributes; override;
procedure GetValueList(List: TStrings); virtual;
procedure GetValues(Proc: TGetStrProc); override;
end;
{$IFDEF DELPHI}
{TAliasNameProperty}
TAliasNameProperty = class(TDBStringProperty)
public
procedure GetValueList(List: TStrings); override;
end;
{TDriverNameProperty}
TDriverNameProperty = class(TDBStringProperty)
public
procedure GetValueList(List: TStrings); override;
end;
{ TDataStoreProperty }
TDataStoreProperty = class(TComponentProperty)
private
FCheckProc: TGetStrProc;
procedure CheckComponent(const Value: string);
public
procedure GetValues(Proc: TGetStrProc); override;
end;
{$ENDIF}
TVpDateProperty = class (TFloatProperty)
public
procedure Edit; override;
function GetAttributes : TPropertyAttributes; override;
function GetValue : string; override;
procedure SetValue (const Value : string); override;
end;
TVpGeneralFileNameProperty = class (TStringProperty)
protected
function GetDefaultExt: String; virtual;
function GetFilter: String; virtual;
function GetInitialDir: String; virtual;
public
function GetAttributes: TPropertyAttributes; override;
function GetValue: string; override;
procedure Edit; override;
procedure SetValue(const NewValue: String); override;
end;
TVpLocalizeFileNameProperty = class (TVpGeneralFileNameProperty)
protected
function GetDefaultExt: String; override;
function GetFilter: String; override;
end;
TVpWavFilenameProperty = class(TVpGeneralFilenameProperty)
protected
function GetDefaultExt: String; override;
function GetFilter: String; override;
function GetInitialDir: String; override;
end;
{
public
function GetAttributes: TPropertyAttributes; override;
function GetValue: string; override;
procedure Edit; override;
procedure SetValue(const Value: string); override;
end;
}
TVpMediaFolderProperty = class(TStringProperty)
public
function GetAttributes: TPropertyAttributes; override;
function GetValue: string; override;
procedure Edit; override;
procedure SetValue(const Value: string); override;
end;
TVpAboutProperty = class(TStringProperty)
public
function GetAttributes: TPropertyAttributes;
override;
procedure Edit;
override;
end;
TVpFlexDSEditor = class(TComponentEditor)
procedure ExecuteVerb(Index: Integer); override;
function GetVerb(Index: Integer): string; override;
function GetVerbCount: Integer; override;
end;
procedure Register;
implementation
uses
{$IFDEF DELPHI}
DbTables, { VCL - BDE runtime unit }
VpWavPE, { Wav File Finder - Property Editor }
{$ENDIF}
VpMisc,
{ Component Units }
VpBase, { Base classes for Vp }
VpClock, { Clock Component }
VpDlg, { Dialog components ancestor }
VpLEDLabel, { LEDLabel Component }
VpCalendar, { Calendar Component }
VpNavBar, { Navigation Bar Component }
VpBaseDS, { Base DataStore Classes }
VpDayView, { Day View Component }
VpWeekView, { Week View Component }
VpMonthView, { Month View Component }
VpContactGrid, { ContactGrid Component }
VpTaskList, { Task List Component }
{$IFDEF DELPHI}
VpBDEDS, { DataStore Component }
VpDateEdit, { DateEdit Component }
{$ENDIF}
{$IFDEF LCL}
VpIniDS, { IniFile datastore }
VpXmlDS, { XML file datastore }
VpJSONDS, { JSON file datastore }
VpBufDS, { Datastore for TBufDataset }
VpFBDS, { Datastore for Firebird database }
VpSqlite3DS, { Datastore for sqlite3 }
// VpSdfDS { Datastore for TSdfDataset }
// VpDbfDS, { Datastore for dbase files }
{$ENDIF}
VpFlxDS, { Flexible DataStore }
VpContactEditDlg, { Contact Edit Dialog Component }
VpTaskEditDlg, { Task Edit Dialog Component }
VpEvntEditDlg, { Event Edit Dialog Component }
VpAlarmDlg, { Alarm Notification Dialog }
VpResEditDlg, { Resource Edit Dialog }
VpPrtPrv, { Print Preview Component }
VpPrtFmtCBox, { Print Format Combo Box Component }
VpPrtPrvDlg, { Print Preview Dialog }
VpPrtFmtDlg, { Print Format Dialog }
VpPrtFmtEd, { Print Format Property editor }
VpContactButtons, { - New contact grid button bar component }
{ Designtime Interfaces (Property and Component Editors) }
VpAbout, { About form for the About property editor }
VpNabEd, { component editor for the VpNavBar }
VpFlxDSEd1; { Field mapper component editor for the FlexDS }
(*****************************************************************************)
{ TVpCategoryInfoImageIndexProperty }
function TVpCategoryInfoImageIndexProperty.GetImageList: TCustomImageList;
var
P: TPersistent;
begin
P := GetComponent(0);
if P is TVpCategoryInfo then begin
if TVpCategoryInfo(P).Owner is TVpCustomDatastore then begin
P := TVpCategoryInfo(P).Owner;
Result := TVpCustomDataStore(P).Images;
exit;
end;
end;
Result := nil;
end;
(*****************************************************************************)
{ TDBStringProperty }
function TDBStringProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paValueList, paSortList, paMultiSelect];
end;
procedure TDBStringProperty.GetValueList(List: TStrings);
begin
Unused(List);
end;
procedure TDBStringProperty.GetValues(Proc: TGetStrProc);
var
I: Integer;
Values: TStringList;
begin
Values := TStringList.Create;
try
GetValueList(Values);
for I := 0 to Values.Count - 1 do Proc(Values[I]);
finally
Values.Free;
end;
end;
{$IFDEF DELPHI}
(*****************************************************************************)
{ TAliasNameProperty }
procedure TAliasNameProperty.GetValueList(List: TStrings);
begin
(GetComponent(0) as TVpBDEDataStore).Database.Session.GetAliasNames(List);
end;
(*****************************************************************************)
{ TDriverNameProperty }
procedure TDriverNameProperty.GetValueList(List: TStrings);
begin
(GetComponent(0) as TVpBDEDataStore).Database.Session.GetDriverNames(List);
end;
(*****************************************************************************)
{ TDataStoreProperty }
procedure TDataStoreProperty.CheckComponent(const Value: string);
var
J: Integer;
DataStore: TVpCustomDataStore;
begin
DataStore := TVpCustomDataStore(Designer.GetComponent(Value));
for J := 0 to PropCount - 1 do
if TVpDayView(GetComponent(J)).DataStore = DataStore then
Exit;
FCheckProc(Value);
end;
procedure TDataStoreProperty.GetValues(Proc: TGetStrProc);
begin
FCheckProc := Proc;
inherited GetValues(CheckComponent);
end;
{$ENDIF}
(*****************************************************************************)
{ TVpDateProperty }
procedure TVpDateProperty.Edit;
var
frmDatePropertyEditor: TfrmDatePropertyEditor;
begin
frmDatePropertyEditor := TfrmDatePropertyEditor.Create (Application);
try
frmDatePropertyEditor.VpCalendar1.Date := GetFloatValue;
if frmDatePropertyEditor.Execute then
SetFloatValue(Trunc(frmDatePropertyEditor.VpCalendar1.Date));
finally
frmDatePropertyEditor.Free;
end;
end;
function TVpDateProperty.GetAttributes : TPropertyAttributes;
begin
Result := [paDialog, paMultiSelect];
end;
function TVpDateProperty.GetValue : string;
begin
Result := FormatDateTime('ddddd', GetFloatValue);
end;
procedure TVpDateProperty.SetValue (const Value : string);
begin
SetFloatValue(StrToDate (Value));
end;
(*****************************************************************************)
{ TVpGeneralFileNameProperty }
function TVpGeneralFileNameProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog];
end;
procedure TVpGeneralFileNameProperty.Edit;
var
dlg: TOpenDialog;
begin
dlg := TOpenDialog.Create(Application);
try
dlg.DefaultExt := GetDefaultExt;
dlg.Filter := GetFilter;
dlg.FilterIndex := 1;
dlg.InitialDir := GetForcedPathDelims(GetInitialDir);
dlg.Options := [ofHideReadOnly];
dlg.Filename := GetValue;
if dlg.Execute then
SetValue(dlg.Filename);
finally
dlg.Free;
end;
end;
function TVpGeneralFilenameProperty.GetDefaultExt: String;
begin
Result := '*.*';
end;
function TVpGeneralFilenameProperty.GetFilter: String;
begin
Result := 'All files (*.*)|*.*';
end;
function TVpGeneralFilenameProperty.GetInitialDir: String;
var
filename: String;
begin
filename := GetValue;
if filename <> '' then
Result := ExtractFileDir(filename) else
Result := '';
end;
function TVpGeneralFileNameProperty.GetValue: string;
begin
Result := GetStrValue;
end;
procedure TVpGeneralFilenameProperty.SetValue(const NewValue: string);
begin
SetStrValue(NewValue);
end;
{ TVpLocalizeFilenameProperty }
function TVpLocalizeFilenameProperty.GetDefaultExt: String;
begin
Result := '*.xml';
end;
function TVpLocalizeFilenameProperty.GetFilter: String;
begin
Result := 'Localization files (*.xml)|*.xml|' + inherited;
end;
{ TVpWavFilenameProperty }
function TVpWavFilenameProperty.GetDefaultExt: String;
begin
Result := '*.wav';
end;
function TVpWavFilenameProperty.GetFilter: String;
begin
Result := 'Wav files (*.wav)|*.wav|All files (*.*)|*.*';
end;
function TVpWavFilenameProperty.GetInitialDir: String;
var
ds: TVpCustomDatastore;
begin
ds := GetComponent(0) as TVpCustomDatastore;
if Assigned(ds) then begin
if ds.DefaultEventSound = '' then
Result := ds.MediaFolder
else
Result := ExtractFilePath(ds.DefaultEventSound);
Result := GetForcedPathDelims(Result);
end else
Result := '';
end;
{ TVpMediaFolderProperty }
function TVpMediaFolderProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog];
end;
function TVpMediaFolderProperty.GetValue: string;
begin
Result := GetStrValue;
end;
procedure TVpMediaFolderProperty.SetValue(const Value: string);
begin
SetStrValue(Value);
end;
procedure TVpMediaFolderProperty.Edit;
var
dlg: TSelectDirectoryDialog;
ds: TVpCustomDatastore;
begin
ds := GetComponent(0) as TVpCustomDatastore;
if Assigned(ds) then
begin
dlg := TSelectDirectoryDialog.Create(nil);
try
dlg.Filter := 'Wav files (*.wav)|*.wav|All files (*.*)|*.*';
dlg.FilterIndex := 1;
dlg.DefaultExt := '*.wav';
if ds.MediaFolder <> '' then
dlg.InitialDir := ds.MediaFolder
else
dlg.InitialDir := ExtractFilePath(ds.DefaultEventSound);
if dlg.Execute then
ds.DefaultEventSound := dlg.FileName;
finally
dlg.Free;
end;
end
else
inherited;
end;
{ TVpAboutProperty }
function TVpAboutProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog, paReadOnly];
end;
procedure TVpAboutProperty.Edit;
begin
with TfrmAbout.Create(Application) do begin
try
ShowModal;
finally
Free;
end;
end;
end;
{ TVpFlexDSEditor }
{$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;
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;
{******************************************************************************}
{ Component registration }
{******************************************************************************}
procedure Register;
begin
{----------------------------------------------------------------------------}
{ register component editors }
{----------------------------------------------------------------------------}
RegisterComponentEditor(TVpNavBar, TVpNavBarEditor);
RegisterComponentEditor(TVpControlLink, TVpPrtFmtPropertyEditor);
RegisterComponentEditor(TVpFlexDataStore, TVpFlexDSEditor);
{----------------------------------------------------------------------------}
{ register property editors }
{----------------------------------------------------------------------------}
{ register the About Box property editor for the Version properties }
RegisterPropertyEditor(TypeInfo(string), TVpCollectionItem,
'Version', TVpAboutProperty);
RegisterPropertyEditor(TypeInfo(string), TVpComponent,
'Version', TVpAboutProperty);
RegisterPropertyEditor(TypeInfo(string), TVpNavBar,
'Version', TVpAboutProperty);
RegisterPropertyEditor(TypeInfo(string), TVpCalendar,
'Version', TVpAboutProperty);
RegisterPropertyEditor(TypeInfo(string), TVpLEDLabel,
'Version', TVpAboutProperty);
RegisterPropertyEditor(TypeInfo(string), TVpClock,
'Version', TVpAboutProperty);
RegisterPropertyEditor(TypeInfo(string), TVpResourceCombo,
'Version', TVpAboutProperty);
RegisterPropertyEditor(TypeInfo(string), TVpCustomControl,
'Version', TVpAboutProperty);
RegisterPropertyEditor(TypeInfo(string), TVpControlLink,
'Version', TVpAboutProperty);
{ Other property editors }
{$IFDEF DELPHI}
RegisterPropertyEditor(TypeInfo(string), TVpBDEDataStore,
'Version', TVpAboutProperty);
RegisterPropertyEditor(TypeInfo(string), TVpDateEdit,
'Version', TVpAboutProperty);
{$ENDIF}
RegisterPropertyEditor(TypeInfo(string), TVpFlexDataStore,
'Version', TVpAboutProperty);
RegisterPropertyEditor(TypeInfo(string), TVpBaseDialog,
'Version', TVpAboutProperty);
RegisterPropertyEditor(TypeInfo(string), TVpPrintFormatComboBox,
'Version', TVpAboutProperty);
{$IFDEF DELPHI}
{register the BDE Alias and Driver properties }
RegisterPropertyEditor(TypeInfo(string), TVpBDEDataStore,
'AliasName', TAliasNameProperty);
RegisterPropertyEditor(TypeInfo(string), TVpBDEDataStore,
'DriverName', TDriverNameProperty);
{register the DayView properties }
// LCL: Registering next property editor inhibits that the DataStore
// property combo of the DayView lists the available datastores.
RegisterPropertyEditor(TypeInfo(TVpCustomDataStore), TVpDayView,
'DataStore', TDataStoreProperty);
{register the property editor for the DataStore's DefaultAlarmWav }
// NO - not useful in design mode because there is not platform-independent way
// to play the sound }
RegisterPropertyEditor(TypeInfo(string), TVpCustomDataStore,
'DefaultEventSound', TWavFilenameProperty);
{$ENDIF}
RegisterPropertyEditor(TypeInfo(TImageIndex), TVpCategoryInfo,
'ImageIndex', TVpCategoryInfoImageIndexProperty);
RegisterPropertyEditor(TypeInfo(String), TVpCustomDatastore,
'DefaultEventSound', TVpWavFilenameProperty);
RegisterPropertyEditor(TypeInfo(String), TVpCustomDatastore,
'MediaFolder', TVpMediaFolderProperty);
RegisterPropertyEditor(TypeInfo(TDateTime), TVpPrintPreview,
'StartDate', TVpDateProperty);
RegisterPropertyEditor(TypeInfo(TDateTime), TVpPrintPreview,
'EndDate', TVpDateProperty);
RegisterPropertyEditor(TypeInfo(TDateTime), TVpPrintPreviewDialog,
'StartDate', TVpDateProperty);
RegisterPropertyEditor(TypeInfo(TDateTime), TVpPrintPreviewDialog,
'EndDate', TVpDateProperty);
RegisterPropertyEditor(TypeInfo(string), TVpControlLink,
'LocalizationFile', TVpLocalizeFileNameProperty);
{----------------------------------------------------------------------------}
{ register Visual PlanIt components with the IDE }
{----------------------------------------------------------------------------}
RegisterComponents('Visual PlanIt', [
TVpControlLink,
TVpDayView,
TVpWeekView,
TVpMonthView,
TVpTaskList,
TVpContactGrid,
TVpContactButtonBar,
TVpResourceCombo,
TVpPrintFormatComboBox,
TVpResourceEditDialog,
TVpEventEditDialog,
TVpContactEditDialog,
TVpTaskEditDialog,
TVpPrintFormatEditDialog,
TVpPrintPreviewDialog,
TVpPrintPreview,
TVpNotificationDialog,
TVpLEDLabel,
TVpClock,
TVpCalendar,
TVpNavBar,
TVpFlexDataStore,
{$IFDEF DELPHI}
TVpBDEDataStore, // BDE is not available in Lazarus
TVpDateEdit, // Does not work in Lazarus
{$ENDIF}
{$IFDEF LCL}
TVpIniDatastore,
TVpXmlDatastore,
TVpJSONDatastore,
TVpBufDSDatastore,
TVpSqlite3Datastore,
TVpFirebirdDatastore
//TVpSdfDatastore, // to do (maybe)...
//TVpDbfDatastore, // to do...
{$ENDIF}
]);
end;
end.