{----------------------------------------------------------------------------- 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/MPL-1.1.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is: JvBaseDBLogonDialog.pas, released on 2006-07-21 The Initial Developer of the Original Code is Jens Fudickar All Rights Reserved. Contributor(s): You may retrieve the latest version of this file at the Project JEDI's JVCL home page, located at http://jvcl.sourceforge.net Known Issues: -----------------------------------------------------------------------------} // $Id: JvBaseDBLogonDialog.pas 11209 2007-03-13 22:57:45Z jfudickar $ unit JvBaseDBLogonDialog; {$I jvcl.inc} interface uses {$IFDEF UNITVERSIONING} JclUnitVersioning, {$ENDIF UNITVERSIONING} Classes, Forms, Controls, Menus, JvBaseDlg, JvAppStorage, JvDynControlEngine, JvDynControlEngineIntf, JvPropertyStore, JvBaseDBDialog, JvBaseDBPasswordDialog; type TJvLogonDialogFillListEvent = procedure(List: TStringList) of object; TJvLogonDialogEncryptDecryptEvent = procedure(var Password: string) of object; TJvLogonDialogBaseSessionEvent = function(Session: TComponent): Boolean of object; TJvDBLogonDialogActivePage = (ldapConnectList, ldapUserTree, ldapDatabaseTree, ldapGroupTree); TJvBaseDBLogonDialogOptions = class(TPersistent) private FAddConnectionsToDatabaseComboBox: Boolean; FAllowNullPasswords: Boolean; FAllowPasswordChange: Boolean; FDatabasenameCaseSensitive: Boolean; FPasswordChar: char; FPasswordDialogOptions: TJvBaseDBPasswordDialogOptions; FUsernameCaseSensitive: Boolean; FSaveLastConnect: Boolean; FSavePasswords: Boolean; FSetLastConnectToTop: Boolean; FShowColors: Boolean; FShowConnectGroup: Boolean; FShowConnectionsExport: Boolean; FShowSavePasswords: Boolean; FShowShortcuts: Boolean; public constructor Create; virtual; destructor Destroy; override; property AllowPasswordChange: Boolean read FAllowPasswordChange write FAllowPasswordChange; property PasswordDialogOptions: TJvBaseDBPasswordDialogOptions read FPasswordDialogOptions; published //1 Add each database from the connection list to the database combobox property AddConnectionsToDatabaseComboBox: Boolean read FAddConnectionsToDatabaseComboBox write FAddConnectionsToDatabaseComboBox default True; property AllowNullPasswords: Boolean read FAllowNullPasswords write FAllowNullPasswords default False; //1 Group the Databasename casesensitive in the Databasename tree list property DatabasenameCaseSensitive: Boolean read FDatabasenameCaseSensitive write FDatabasenameCaseSensitive default False; property PasswordChar: char read FPasswordChar write FPasswordChar default '*'; //1 Group the username casesensitive in the username tree list property UsernameCaseSensitive: Boolean read FUsernameCaseSensitive write FUsernameCaseSensitive default False; property SaveLastConnect: Boolean read FSaveLastConnect write FSaveLastConnect default True; property SavePasswords: Boolean read FSavePasswords write FSavePasswords default True; property SetLastConnectToTop: Boolean read FSetLastConnectToTop write FSetLastConnectToTop default True; // property ShowColors: Boolean read FShowColors write FShowColors default False; property ShowConnectGroup: Boolean read FShowConnectGroup write FShowConnectGroup default True; property ShowConnectionsExport: Boolean read FShowConnectionsExport write FShowConnectionsExport default True; property ShowSavePasswords: Boolean read FShowSavePasswords write FShowSavePasswords default False; property ShowShortcuts: Boolean read FShowShortcuts write FShowShortcuts default True; end; TJvBaseDBOracleLogonDialogOptions = class(TJvBaseDBLogonDialogOptions) private FShowConnectAs: Boolean; public constructor Create; override; published property ShowConnectAs: Boolean read FShowConnectAs write FShowConnectAs default True; end; TJvBaseDBLogonDialogOptionsClass = class of TJvBaseDBLogonDialogOptions; TJvBaseConnectionInfo = class(TJvCustomPropertyStore) private FDatabase: string; FGroup: string; FPassword: string; FSavePassword: Boolean; FShortCut: Integer; FUsername: string; function GetShortCutText: string; procedure SetGroup(const Value: string); procedure SetSavePassword(const Value: Boolean); procedure SetShortCutText(const Value: string); protected procedure SetDatabase(Value: string); procedure SetUsername(Value: string); public destructor Destroy; override; function ConnectString(ShowShortCut, ShowConnectGroup: Boolean): string; virtual; function UserDatabaseString: string; property SavePassword: Boolean read FSavePassword write SetSavePassword; property ShortCut: Integer read FShortCut write FShortCut; published property Database: string read FDatabase write SetDatabase; property Group: string read FGroup write SetGroup; property Password: string read FPassword write FPassword; property ShortCutText: string read GetShortCutText write SetShortCutText; property Username: string read FUsername write SetUsername; end; TJvBaseOracleConnectionInfo = class(TJvBaseConnectionInfo) private FConnectAs: string; procedure SetConnectAs(const Value: string); public constructor Create(AOwner: TComponent); override; function ConnectString(ShowShortCut, ShowConnectGroup: Boolean): string; override; published property ConnectAs: string read FConnectAs write SetConnectAs; end; TJvLogonDialogConnectionInfoEvent = procedure(ConnectionInfo: TJvBaseConnectionInfo) of object; TJvBaseConnectionListClass = class of TJvBaseConnectionList; TJvBaseConnectionList = class(TJvCustomPropertyListStore) private FActivePage: TJvDBLogonDialogActivePage; FGroupByDatabase: Boolean; FGroupByUser: Boolean; FLastConnect: TJvBaseConnectionInfo; FSavePasswords: Boolean; procedure SetLastConnect(const Value: TJvBaseConnectionInfo); procedure SetSavePasswords(const Value: Boolean); protected procedure CopyContents(iConnectionList: TJvBaseConnectionList; iClearBefore: Boolean); function CreateObject: TObject; override; function GetConnection(I: Longint): TJvBaseConnectionInfo; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure AddConnection(ConnectionInfo: TJvBaseConnectionInfo); function CreateConnection: TJvBaseConnectionInfo; function IndexOfNames(const Username, Database: string): Integer; property Connection[I: Longint]: TJvBaseConnectionInfo read GetConnection; published //1 Stores the data of the last connection property LastConnect: TJvBaseConnectionInfo read FLastConnect write SetLastConnect; property ActivePage: TJvDBLogonDialogActivePage read FActivePage write FActivePage; property GroupByDatabase: Boolean read FGroupByDatabase write FGroupByDatabase; property GroupByUser: Boolean read FGroupByUser write FGroupByUser; property SavePasswords: Boolean read FSavePasswords write SetSavePasswords; end; TJvBaseOracleConnectionList = class(TJvBaseConnectionList) protected function CreateObject: TObject; override; end; TJvBaseDBLogonDialog = class(TJvBaseDBDialog) private AddToListBtn: TWinControl; CancelBtn: TWinControl; ConnectBtn: TWinControl; AdditionalBtn: TWinControl; AdditionalPopupMenu: TPopupMenu; ConnectGroupComboBox: TWinControl; ConnectListListBox: TWinControl; DatabaseComboBox: TWinControl; DatabaseTreeView: TWinControl; FConnectionList: TJvBaseConnectionList; FGroupByDatabase: Boolean; fGroupByUser: Boolean; FOnDecryptPassword: TJvLogonDialogEncryptDecryptEvent; FOnEncryptPassword: TJvLogonDialogEncryptDecryptEvent; FOnFillDatabaseList: TJvLogonDialogFillListEvent; FOnFillShortcutList: TJvLogonDialogFillListEvent; FOnSessionConnect: TJvLogonDialogBaseSessionEvent; FOptions: TJvBaseDBLogonDialogOptions; GetFromListBtn: TWinControl; GroupByDatabaseCheckBox: TWinControl; GroupByUserCheckBox: TWinControl; GroupTreeView: TWinControl; IConnectGroupComboBoxData: IJvDynControlData; IConnectionListPageControlTab: IJvDynControlTabControl; IConnectListListBoxData: IJvDynControlData; IConnectListListBoxItems: IJvDynControlItems; IDatabaseComboBoxData: IJvDynControlData; IDatabaseTreeView: IJvDynControlTreeView; IGroupByDatabaseCheckBox: IJvDynControlCheckBox; IGroupByUserCheckBox: IJvDynControlCheckBox; IGroupTreeView: IJvDynControlTreeView; IPasswordEditData: IJvDynControlData; ISavePasswordsCheckBox: IJvDynControlCheckBox; IShortCutComboBoxData: IJvDynControlData; IUserNameEditData: IJvDynControlData; IUserTreeView: IJvDynControlTreeView; PasswordEdit: TWinControl; RemoveFromListBtn: TWinControl; SavePasswordsCheckBox: TWinControl; ShortCutComboBox: TWinControl; ConnectPanel: TWinControl; ShortCutPanel: TWinControl; UserNameEdit: TWinControl; UserTreeView: TWinControl; ConnectGroupPanel: TWinControl; FBeforeTransferConnectionInfoToSessionData: TJvLogonDialogConnectionInfoEvent; FAfterTransferSessionDataToConnectionInfo: TJvLogonDialogConnectionInfoEvent; procedure AddToListBtnClick(Sender: TObject); procedure CancelBtnClick(Sender: TObject); procedure AdditionalBtnClick(Sender: TObject); procedure ConnectBtnClick(Sender: TObject); procedure ConnectionListPageControlChange(Sender: TObject); procedure ConnectListListBoxClick(Sender: TObject); procedure ConnectListListBoxDblClick(Sender: TObject); procedure FillGroupTreeView; procedure CreateUserTreeView; procedure DatabaseComboBoxChange(Sender: TObject); function DecryptPassword(const Value: string): string; function EncryptPassword(const Value: string): string; procedure FillAllConnectionLists; procedure FillConnectGroupComboBox; procedure FillConnectionList; procedure FillDatabaseComboBox; procedure FillDatabaseTreeView; procedure FillShortCutList(Items: TStringList); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormShow(Sender: TObject); function GetActivePage: TJvDBLogonDialogActivePage; function GetCurrentDialogConnectionInfo: TJvBaseConnectionInfo; function GetDialogDatabase: string; function GetDialogPassword: string; function GetDialogUserName: string; procedure GetFromListBtnClick(Sender: TObject); procedure GroupByDatabaseCheckBoxClick(Sender: TObject); procedure GroupByUserCheckBoxClick(Sender: TObject); procedure LoadSettings; procedure PasswordDialog_BeforeTransferPasswordToSession(var Password: string); procedure PasswordDialog_AfterTransferPasswordFromSession(var Password: string); procedure PasswordEditChange(Sender: TObject); procedure RemoveFromListBtnClick(Sender: TObject); procedure SetActivePage(const Value: TJvDBLogonDialogActivePage); procedure SetButtonState; procedure SetConnectBtnEnabled; procedure SetConnectionToTop(Username, Database: string); procedure SetDialogDatabase(const Value: string); procedure SetDialogPassword(const Value: string); procedure SetDialogUserName(const Value: string); procedure SetOptions(const Value: TJvBaseDBLogonDialogOptions); procedure StoreSettings; protected procedure ActivateDatabaseControl; procedure ActivatePasswordControl; function CalculatePanelHeight(LastControl: TWinControl): Integer; function ChangePassword: Boolean; procedure ClearControlInterfaceObjects; virtual; procedure ClearFormControls; virtual; procedure ConnectSession; virtual; procedure ConnectToSession; procedure CreateAdditionalConnectDialogControls(AOwner: TComponent; AParentControl: TWinControl); virtual; procedure CreateFormControls(AForm: TForm); override; function CreatePasswordChangeDialog: TJvBaseDBPasswordDialog; virtual; procedure DoSessionConnect; procedure FillAdditionalPopupMenuEntries(APopupMenu: TPopupMenu); virtual; procedure FillDatabaseComboBoxDefaultValues(Items: TStrings); virtual; { Retrieve the class that holds the storage options and format settings. } class function GetDBLogonConnectionListClass: TJvBaseConnectionListClass; virtual; { Retrieve the class that holds the storage options and format settings. } class function GetDBLogonDialogOptionsClass: TJvBaseDBLogonDialogOptionsClass; virtual; function GetGroupByDatabase: Boolean; function GetGroupByUser: Boolean; procedure OnExportConnectionList(Sender: TObject); procedure OnImportConnectionList(Sender: TObject); procedure ResizeFormControls; virtual; function SavePasswords: Boolean; procedure SetAppStorage(Value: TJvCustomAppStorage); override; procedure SetAppStoragePath(Value: string); override; procedure SetGroupByDatabase(Value: Boolean); procedure SetGroupByUser(Value: Boolean); procedure SetSession(const Value: TComponent); override; procedure TransferConnectionInfoFromDialog(ConnectionInfo: TJvBaseConnectionInfo); virtual; procedure TransferConnectionInfoToDialog(ConnectionInfo: TJvBaseConnectionInfo); virtual; procedure TransferSessionDataFromDialog; procedure TransferSessionDataFromConnectionInfo(ConnectionInfo: TJvBaseConnectionInfo); virtual; procedure TransferSessionDataToDialog; procedure TransferSessionDataToConnectionInfo(ConnectionInfo: TJvBaseConnectionInfo); virtual; property ActivePage: TJvDBLogonDialogActivePage read GetActivePage write SetActivePage; property ConnectionList: TJvBaseConnectionList read FConnectionList; property CurrentDialogConnectionInfo: TJvBaseConnectionInfo read GetCurrentDialogConnectionInfo; property DialogDatabase: string read GetDialogDatabase write SetDialogDatabase; property DialogPassword: string read GetDialogPassword write SetDialogPassword; property DialogUserName: string read GetDialogUserName write SetDialogUserName; property GroupByDatabase: Boolean read GetGroupByDatabase write SetGroupByDatabase; property GroupByUser: Boolean read GetGroupByUser write SetGroupByUser; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property AppStorage; property AppStoragePath; property Options: TJvBaseDBLogonDialogOptions read FOptions write SetOptions; //1 This Event gives you the possibility to modify the connection data before it is transfered to the current session property BeforeTransferConnectionInfoToSessionData: TJvLogonDialogConnectionInfoEvent read FBeforeTransferConnectionInfoToSessionData write FBeforeTransferConnectionInfoToSessionData; //1 This events gives you the possibility to modify the connection data after receiving the data from the current session property AfterTransferSessionDataToConnectionInfo: TJvLogonDialogConnectionInfoEvent read FAfterTransferSessionDataToConnectionInfo write FAfterTransferSessionDataToConnectionInfo; property OnDecryptPassword: TJvLogonDialogEncryptDecryptEvent read FOnDecryptPassword write FOnDecryptPassword; property OnEncryptPassword: TJvLogonDialogEncryptDecryptEvent read FOnEncryptPassword write FOnEncryptPassword; //1 Event for filling the database list property OnFillDatabaseList: TJvLogonDialogFillListEvent read FOnFillDatabaseList write FOnFillDatabaseList; //1 Event for customizing the shortcut list property OnFillShortcutList: TJvLogonDialogFillListEvent read FOnFillShortcutList write FOnFillShortcutList; property OnSessionConnect: TJvLogonDialogBaseSessionEvent read FOnSessionConnect write FOnSessionConnect; end; TJvBaseDBOracleLogonDialog = class(TJvBaseDBLogonDialog) private ConnectAsComboBox: TWinControl; ConnectAsPanel: TWinControl; IConnectAsComboBoxData: IJvDynControlData; function GetDialogConnectAs: string; function GetOptions: TJvBaseDBOracleLogonDialogOptions; procedure SetDialogConnectAs(const Value: string); procedure SetOptions(const Value: TJvBaseDBOracleLogonDialogOptions); protected procedure ClearFormControls; override; procedure CreateAdditionalConnectDialogControls(AOwner: TComponent; AParentControl: TWinControl); override; procedure CreateFormControls(AForm: TForm); override; { Retrieve the class that holds the storage options and format settings. } class function GetDBLogonConnectionListClass: TJvBaseConnectionListClass; override; { Retrieve the class that holds the storage options and format settings. } class function GetDBLogonDialogOptionsClass: TJvBaseDBLogonDialogOptionsClass; override; procedure ResizeFormControls; override; procedure TransferConnectionInfoFromDialog(ConnectionInfo: TJvBaseConnectionInfo); override; procedure TransferConnectionInfoToDialog(ConnectionInfo: TJvBaseConnectionInfo); override; property DialogConnectAs: string read GetDialogConnectAs write SetDialogConnectAs; public procedure ClearControlInterfaceObjects; override; published property Options: TJvBaseDBOracleLogonDialogOptions read GetOptions write SetOptions; end; {$IFDEF UNITVERSIONING} const UnitVersioning: TUnitVersionInfo = ( RCSfile: '$URL: https://jvcl.svn.sourceforge.net/svnroot/jvcl/tags/JVCL3_32/run/JvBaseDBLogonDialog.pas $'; Revision: '$Revision: 11209 $'; Date: '$Date: 2007-03-13 23:57:45 +0100 (mar., 13 mars 2007) $'; LogPath: 'JVCL\run' ); {$ENDIF UNITVERSIONING} implementation uses Windows, SysUtils, {$IFDEF HAS_UNIT_TYPES} Types, {$ENDIF HAS_UNIT_TYPES} ExtCtrls, ComCtrls, StdCtrls, Dialogs, JvAppIniStorage, JvAppXMLStorage, JvDSADialogs, JvResources; //=== { TJvBaseDBLogonDialog } =============================================== constructor TJvBaseDBLogonDialog.Create(AOwner: TComponent); begin inherited Create(AOwner); FOptions := GetDBLogonDialogOptionsClass.Create; FConnectionList := GetDBLogonConnectionListClass.Create(Self); end; destructor TJvBaseDBLogonDialog.Destroy; begin FreeAndNil(FConnectionList); FreeAndNil(FOptions); inherited Destroy; end; procedure TJvBaseDBLogonDialog.ActivateDatabaseControl; begin if Assigned(DatabaseComboBox) and Assigned(DBDialog) then DBDialog.ActiveControl := DatabaseComboBox; end; procedure TJvBaseDBLogonDialog.ActivatePasswordControl; begin if Assigned(DatabaseComboBox) and Assigned(DBDialog) then DBDialog.ActiveControl := PasswordEdit; end; procedure TJvBaseDBLogonDialog.AddToListBtnClick(Sender: TObject); var ConnectionInfo: TJvBaseConnectionInfo; begin ConnectionInfo := ConnectionList.CreateConnection; TransferConnectionInfoFromDialog(ConnectionInfo); ConnectionList.AddConnection(ConnectionInfo); FillAllConnectionLists; end; function TJvBaseDBLogonDialog.CalculatePanelHeight(LastControl: TWinControl): Integer; begin if Assigned(LastControl) then Result := LastControl.Top + LastControl.Height + 2 else Result := 20; end; procedure TJvBaseDBLogonDialog.CancelBtnClick(Sender: TObject); begin DBDialog.ModalResult := mrCancel; end; procedure TJvBaseDBLogonDialog.AdditionalBtnClick(Sender: TObject); var P: TPoint; begin with AdditionalBtn do P := Parent.ClientToScreen(Point(Left + Width, Top)); AdditionalPopupMenu.Popup(P.X, P.Y); end; function TJvBaseDBLogonDialog.ChangePassword: Boolean; var PasswordDialog: TJvBaseDBPasswordDialog; begin Result := False; if not Options.AllowPasswordChange then Exit; PasswordDialog := TJvBaseDBPasswordDialog(CreatePasswordChangeDialog); if Assigned(PasswordDialog) then try PasswordDialog.Session := Session; PasswordDialog.AfterTransferPasswordFromSession := PasswordDialog_AfterTransferPasswordFromSession; PasswordDialog.BeforeTransferPasswordToSession := PasswordDialog_BeforeTransferPasswordToSession; PasswordDialog.Options := Options.PasswordDialogOptions; Result := PasswordDialog.Execute; finally PasswordDialog.Free; end; end; procedure TJvBaseDBLogonDialog.ClearFormControls; begin IUserNameEditData.ControlValue := ''; IPasswordEditData.ControlValue := ''; IDatabaseComboBoxData.ControlValue := ''; IConnectGroupComboBoxData.ControlValue := ''; IShortCutComboBoxData.ControlValue := ''; end; procedure TJvBaseDBLogonDialog.ClearControlInterfaceObjects; begin IConnectGroupComboBoxData := nil; IConnectionListPageControlTab := nil; IConnectListListBoxData := nil; IConnectListListBoxItems := nil; IDatabaseComboBoxData := nil; IDatabaseTreeView := nil; IGroupByDatabaseCheckBox := nil; IGroupByUserCheckBox := nil; IGroupTreeView := nil; IPasswordEditData := nil; ISavePasswordsCheckBox := nil; IShortCutComboBoxData := nil; IUserNameEditData := nil; IUserTreeView := nil; end; procedure TJvBaseDBLogonDialog.ConnectBtnClick(Sender: TObject); begin if not ConnectBtn.Enabled then Exit; ConnectToSession; end; procedure TJvBaseDBLogonDialog.ConnectionListPageControlChange(Sender: TObject); begin SetButtonState; end; procedure TJvBaseDBLogonDialog.ConnectListListBoxClick(Sender: TObject); begin SetButtonState; end; procedure TJvBaseDBLogonDialog.ConnectListListBoxDblClick(Sender: TObject); begin if Assigned(CurrentDialogConnectionInfo) then begin TransferConnectionInfoToDialog(CurrentDialogConnectionInfo); ConnectToSession; end; end; procedure TJvBaseDBLogonDialog.ConnectSession; begin end; procedure TJvBaseDBLogonDialog.ConnectToSession; begin SetConnectBtnEnabled; if ConnectBtn.Enabled then DoSessionConnect else if DialogPassword = '' then PasswordEdit.SetFocus; end; procedure TJvBaseDBLogonDialog.CreateAdditionalConnectDialogControls(AOwner: TComponent; AParentControl: TWinControl); begin end; procedure TJvBaseDBLogonDialog.CreateFormControls(AForm: TForm); var ButtonPanel, MainPanel, LeftPanel, ListPanel, ListBtnPanel, GroupListPanel: TWinControl; ConnectionListPageControl: TWinControl; Items: TStringList; ITabControl: IJvDynControlTabControl; IDynControl: IJvDynControl; IDynControlDblClick: IJvDynControlDblClick; IDynControlTreeView: IJvDynControlTreeView; IDynControlReadOnly: IJvDynControlReadOnly; IDynControlPageControl: IJvDynControlPageControl; IDynControlBevelBorder: IJvDynControlBevelBorder; IDynControlEdit: IJvDynControlEdit; LabelControl: TControl; IDynControlLabel: IJvDynControlLabel; ConnectListLabel: TWinControl; begin with AForm do begin Name := 'DBDialog'; Left := 472; Top := 229; BorderIcons := [biSystemMenu, biMinimize, biMaximize, biHelp]; BorderStyle := bsDialog; Caption := RsLogonToDatabase; ClientHeight := 387; ClientWidth := 590; Position := poScreenCenter; KeyPreview := True; OnClose := FormClose; OnKeyDown := FormKeyDown; OnShow := FormShow; end; ButtonPanel := DynControlEngine.CreatePanelControl(AForm, AForm, 'ButtonPanel', '', alBottom); ConnectBtn := DynControlEngine.CreateButton(AForm, ButtonPanel, 'ConnectBtn', RsBtnConnect, '', ConnectBtnClick, True, False); with ConnectBtn do begin Left := 60; Top := 11; Width := 90; Height := 25; end; CancelBtn := DynControlEngine.CreateButton(AForm, ButtonPanel, 'CancelBtn', RsButtonCancelCaption, '', CancelBtnClick, False, True); with CancelBtn do begin Left := 460; Top := 11; Width := 90; Height := 25; // Anchors := [akTop, akRight]; // Kind := bkCancel; end; AdditionalBtn := DynControlEngine.CreateButton(AForm, ButtonPanel, 'AdditionalBtn', RsBtnAdditional, '', AdditionalBtnClick, False, False); with AdditionalBtn do begin Left := 460; Top := 11; Width := 100; Height := 25; // Anchors := [akTop, akRight]; // Kind := bkCancel; end; AdditionalPopupMenu := TPopupMenu.Create(AForm); FillAdditionalPopupMenuEntries(AdditionalPopupMenu); AdditionalBtn.Visible := AdditionalPopupMenu.Items.Count > 0; MainPanel := DynControlEngine.CreatePanelControl(AForm, AForm, 'MainPanel', '', alClient); with MainPanel do begin TabOrder := 0; if Supports(MainPanel, IJvDynControlBevelBorder, IDynControlBevelBorder) then IDynControlBevelBorder.ControlSetBorderWidth(5); if Supports(MainPanel, IJvDynControlBevelBorder, IDynControlBevelBorder) then IDynControlBevelBorder.ControlSetBevelOuter(bvNone); end; ListPanel := DynControlEngine.CreatePanelControl(AForm, MainPanel, 'ListPanel', '', alClient); with ListPanel do begin Anchors := [akTop, akRight, akBottom]; if Supports(ListPanel, IJvDynControlBevelBorder, IDynControlBevelBorder) then IDynControlBevelBorder.ControlSetBevelOuter(bvNone); TabOrder := 1; end; ConnectListLabel := DynControlEngine.CreateStaticTextControl(AForm, ListPanel, 'ConnectListLabel', 'Connection List'); with ConnectListLabel do begin Align := alTop; Height := 18; end; ListBtnPanel := DynControlEngine.CreatePanelControl(AForm, MainPanel, 'ListBtnPanel', '', alLeft); with ListBtnPanel do begin Width := 32; end; AddToListBtn := DynControlEngine.CreateButton(AForm, ListBtnPanel, 'AddToListBtn', '>', RsBtnHintAddDefinitionToList, AddToListBtnClick, False, False); with AddToListBtn do begin Left := 4; Top := 45; Width := 23; Height := 22; // Glyph := // please assign // NumGlyphs := 2; end; GetFromListBtn := DynControlEngine.CreateButton(AForm, ListBtnPanel, 'GetFromListBtn', '<', RsBtnHintSelectDefinitionFromList, GetFromListBtnClick, False, False); with GetFromListBtn do begin Left := 4; Top := 85; Width := 23; Height := 22; // Glyph := // please assign // NumGlyphs := 2; end; RemoveFromListBtn := DynControlEngine.CreateButton(AForm, ListBtnPanel, 'RemoveFromListBtn', 'X', RsBtnHintDeleteDefinitionFromList, RemoveFromListBtnClick, False, False); with RemoveFromListBtn do begin Left := 4; Top := 125; Width := 23; Height := 22; // Glyph := // please assign end; Items := tStringList.Create; try Items.Add(RsPageDefaultList); Items.Add(RsPageByUser); Items.Add(RsPageByDatabase); Items.Add(RsPageByGroup); ConnectionListPageControl := DynControlEngine.CreatePageControlControl(AForm, ListPanel, 'ConnectionListPageControl', Items); finally Items.Free; end; with ConnectionListPageControl do begin Align := alClient; Supports(ConnectionListPageControl, IJvDynControlTabControl, IConnectionListPageControlTab); if Supports(ConnectionListPageControl, IJvDynControlTabControl, ITabControl) then begin ITabControl.ControlSetOnChangeTab(ConnectionListPageControlChange); ITabControl.ControlSetMultiLine(True); ITabControl.ControlTabIndex := 2; end; end; ConnectListListBox := DynControlEngine.CreateListBoxControl(AForm, AForm, 'ConnectListListBox', nil); with ConnectListListBox do begin Align := alClient; if Supports(ConnectionListPageControl, IJvDynControlPageControl, IDynControlPageControl) then Parent := IDynControlPageControl.ControlGetPage(RsPageDefaultList); Supports(ConnectListListBox, IJvDynControlItems, IConnectListListBoxItems); Supports(ConnectListListBox, IJvDynControlData, IConnectListListBoxData); if Supports(ConnectListListBox, IJvDynControl, IDynControl) then IDynControl.ControlSetOnClick(ConnectListListBoxClick); if Supports(ConnectListListBox, IJvDynControlDblClick, IDynControlDblClick) then IDynControlDblClick.ControlSetOnDblClick(ConnectListListBoxDblClick); end; UserTreeView := DynControlEngine.CreateTreeViewControl(AForm, AForm, 'UserTreeView'); with UserTreeView do begin Align := alClient; if Supports(ConnectionListPageControl, IJvDynControlPageControl, IDynControlPageControl) then Parent := IDynControlPageControl.ControlGetPage(RsPageByUser); if Supports(UserTreeView, IJvDynControl, IDynControl) then IDynControl.ControlSetOnClick(ConnectListListBoxClick); if Supports(UserTreeView, IJvDynControlDblClick, IDynControlDblClick) then IDynControlDblClick.ControlSetOnDblClick(ConnectListListBoxDblClick); if Supports(UserTreeView, IJvDynControlTreeView, IUserTreeView) then IUserTreeView.ControlSetSortType(stText); if Supports(UserTreeView, IJvDynControlReadOnly, IDynControlReadOnly) then IDynControlReadOnly.ControlSetReadOnly(True); end; DatabaseTreeView := DynControlEngine.CreateTreeViewControl(AForm, AForm, 'DatabaseTreeView'); with DatabaseTreeView do begin Align := alClient; if Supports(ConnectionListPageControl, IJvDynControlPageControl, IDynControlPageControl) then Parent := IDynControlPageControl.ControlGetPage(RsPageByDatabase); if Supports(DatabaseTreeView, IJvDynControl, IDynControl) then IDynControl.ControlSetOnClick(ConnectListListBoxClick); if Supports(DatabaseTreeView, IJvDynControlDblClick, IDynControlDblClick) then IDynControlDblClick.ControlSetOnDblClick(ConnectListListBoxDblClick); if Supports(DatabaseTreeView, IJvDynControlTreeView, IDatabaseTreeView) then IDatabaseTreeView.ControlSetSortType(stText); if Supports(DatabaseTreeView, IJvDynControlReadOnly, IDynControlReadOnly) then IDynControlReadOnly.ControlSetReadOnly(True); end; if Options.ShowConnectGroup then begin GroupTreeView := DynControlEngine.CreateTreeViewControl(AForm, AForm, 'GroupTreeView'); with GroupTreeView do begin Align := alClient; if Supports(ConnectionListPageControl, IJvDynControlPageControl, IDynControlPageControl) then Parent := IDynControlPageControl.ControlGetPage(RsPageByGroup); if Supports(GroupTreeView, IJvDynControl, IDynControl) then IDynControl.ControlSetOnClick(ConnectListListBoxClick); if Supports(GroupTreeView, IJvDynControlDblClick, IDynControlDblClick) then IDynControlDblClick.ControlSetOnDblClick(ConnectListListBoxDblClick); if Supports(GroupTreeView, IJvDynControlTreeView, IGroupTreeView) then IGroupTreeView.ControlSetSortType(stText); if Supports(GroupTreeView, IJvDynControlReadOnly, IDynControlReadOnly) then IDynControlReadOnly.ControlSetReadOnly(True); end; GroupListPanel := DynControlEngine.CreatePanelControl(AForm, AForm, 'GroupListPanel', '', alBottom); with GroupListPanel do begin if Supports(ConnectionListPageControl, IJvDynControlPageControl, IDynControlPageControl) then Parent := IDynControlPageControl.ControlGetPage(RsPageByGroup); Height := 25; Align := alBottom; if Supports(GroupListPanel, IJvDynControlBevelBorder, IDynControlBevelBorder) then IDynControlBevelBorder.ControlSetBevelOuter(bvNone); end; GroupByDatabaseCheckBox := DynControlEngine.CreateCheckboxControl(AForm, GroupListPanel, 'GroupByDatabaseCheckBox', RsCheckBoxGroupByDatabase); with GroupByDatabaseCheckBox do begin Left := 0; Top := 5; Width := 116; Height := 17; TabOrder := 0; if Supports(GroupByDatabaseCheckBox, IJvDynControl, IDynControl) then IDynControl.ControlSetOnClick(GroupByDatabaseCheckBoxClick); Supports(GroupByDatabaseCheckBox, IJvDynControlCheckBox, IGroupByDatabaseCheckBox); end; GroupByUserCheckBox := DynControlEngine.CreateCheckboxControl(AForm, GroupListPanel, 'GroupByUserCheckBox', RsCheckBoxGroupByUser); with GroupByUserCheckBox do begin Left := 125; Top := 5; Width := 97; Height := 17; if Supports(GroupByUserCheckBox, IJvDynControl, IDynControl) then IDynControl.ControlSetOnClick(GroupByUserCheckBoxClick); Supports(GroupByUserCheckBox, IJvDynControlCheckBox, IGroupByUserCheckBox); end; end; SavePasswordsCheckBox := DynControlEngine.CreateCheckboxControl(AForm, ListPanel, 'SavePasswordsCheckBox', RsCheckboxSavePasswords); with SavePasswordsCheckBox do begin // Checked := True; // State := cbChecked; // OnClick := SavePasswordsCheckBoxClick; Align := alBottom; end; Supports(SavePasswordsCheckBox, IJvDynControlCheckBox, ISavePasswordsCheckBox); SavePasswordsCheckBox.Visible := Options.ShowSavePasswords; LeftPanel := DynControlEngine.CreatePanelControl(AForm, MainPanel, 'LeftPanel', '', alLeft); with LeftPanel do begin Width := 216; if Supports(LeftPanel, IJvDynControlBevelBorder, IDynControlBevelBorder) then IDynControlBevelBorder.ControlSetBevelOuter(bvNone); TabOrder := 0; end; ConnectPanel := DynControlEngine.CreatePanelControl(AForm, LeftPanel, 'ConnectPanel', '', alTop); with ConnectPanel do begin Height := 126; end; LabelControl := DynControlEngine.CreateLabelControl(AForm, ConnectPanel, 'UserNameLabel', RsUsername, nil); with LabelControl do begin Align := alTop; end; UsernameEdit := DynControlEngine.CreateEditControl(AForm, ConnectPanel, 'UserNameEdit'); with UsernameEdit do begin Align := alTop; TabOrder := 0; Supports(UsernameEdit, IJvDynControlData, IUsernameEditData); IUsernameEditData.ControlSetOnChange(PasswordEditChange); IUsernameEditData.ControlValue := ''; end; if Supports(LabelControl, IJvDynControlLabel, IDynControlLabel) then IDynControlLabel.ControlSetFocusControl(UserNameEdit); LabelControl := DynControlEngine.CreateLabelControl(AForm, ConnectPanel, 'PasswordEditLabel', RsPassword, PasswordEdit); with LabelControl do begin Align := alTop; end; PasswordEdit := DynControlEngine.CreateEditControl(AForm, ConnectPanel, 'PasswordEdit'); with PasswordEdit do begin Align := alTop; TabOrder := 1; if Supports(PasswordEdit, IJvDynControlEdit, IDynControlEdit) then IDynControlEdit.ControlSetPasswordChar('*'); Supports(PasswordEdit, IJvDynControlData, IPasswordEditData); IPasswordEditData.ControlSetOnChange(PasswordEditChange); IPasswordEditData.ControlValue := ''; end; if Supports(LabelControl, IJvDynControlLabel, IDynControlLabel) then IDynControlLabel.ControlSetFocusControl(PasswordEdit); LabelControl := DynControlEngine.CreateLabelControl(AForm, ConnectPanel, 'DatabaseLabel', RsDatabase, nil); with LabelControl do begin Align := alTop; end; DatabaseComboBox := DynControlEngine.CreateComboBoxControl(AForm, ConnectPanel, 'DatabaseComboBox', nil); with DatabaseComboBox do begin Align := alTop; Top := LabelControl.Top + 1; TabOrder := 2; Supports(DatabaseComboBox, IJvDynControlData, IDatabaseComboBoxData); IDatabaseComboBoxData.ControlSetOnChange(DatabaseComboBoxChange); if Supports(DatabaseComboBox, IJvDynControl, IDynControl) then IDynControl.ControlSetOnClick(DatabaseComboBoxChange); IDatabaseComboBoxData.ControlValue := ''; end; if Supports(LabelControl, IJvDynControlLabel, IDynControlLabel) then IDynControlLabel.ControlSetFocusControl(DatabaseComboBox); ShortCutPanel := DynControlEngine.CreatePanelControl(AForm, LeftPanel, 'ShortCutPanel', '', alTop); with ShortCutPanel do begin Align := alTop; end; LabelControl := DynControlEngine.CreateLabelControl(AForm, ShortCutPanel, 'ShortCutLabel', RsShortcut, nil); with LabelControl do begin Align := alTop; end; Items := tStringList.Create; try FillShortCutList(Items); ShortCutComboBox := DynControlEngine.CreateComboBoxControl(AForm, ShortCutPanel, 'ShortCutComboBox', Items); Supports(ShortCutComboBox, IJvDynControlData, IShortCutComboBoxData); with ShortCutComboBox do begin Align := alTop; end; finally Items.Free; end; if Supports(LabelControl, IJvDynControlLabel, IDynControlLabel) then IDynControlLabel.ControlSetFocusControl(ShortCutComboBox); ShortCutPanel.Visible := Options.ShowShortcuts; ConnectGroupPanel := DynControlEngine.CreatePanelControl(AForm, LeftPanel, 'ConnectGroupPanel', '', alTop); with ConnectGroupPanel do begin Align := alTop; end; LabelControl := DynControlEngine.CreateLabelControl(AForm, ConnectGroupPanel, 'ConnectGroupLabel', 'Connect &Group', nil); with LabelControl do begin Align := alTop; end; Items := tStringList.Create; try ConnectGroupComboBox := DynControlEngine.CreateComboBoxControl(AForm, ConnectGroupPanel, 'ConnectGroupComboBox', Items); Supports(ConnectGroupComboBox, IJvDynControlData, IConnectGroupComboBoxData); with ConnectGroupComboBox do begin Align := alTop; end; finally Items.Free; end; if Supports(LabelControl, IJvDynControlLabel, IDynControlLabel) then IDynControlLabel.ControlSetFocusControl(ConnectGroupComboBox); ConnectGroupPanel.Visible := Options.ShowConnectGroup; CreateAdditionalConnectDialogControls(AForm, LeftPanel); end; function TJvBaseDBLogonDialog.CreatePasswordChangeDialog: TJvBaseDBPasswordDialog; begin Result := nil; end; procedure TJvBaseDBLogonDialog.FillGroupTreeView; var i, j, k, g: Integer; Items: TTreeNodes; Node: TTreeNode; Node2: TTreeNode; Found: Boolean; s: string; gr: string; GroupList: TStringList; Connection: TJvBaseConnectionInfo; begin if not Assigned(IGroupTreeView) then Exit; Items := IGroupTreeView.ControlItems; Items.Clear; for i := 0 to ConnectionList.Count - 1 do begin Connection := ConnectionList.Connection[i]; GroupList := TStringList.Create; try GroupList.CommaText := Connection.Group; if GroupList.CommaText = '' then GroupList.CommaText := RsGroupNameUndefined; for g := 0 to GroupList.Count - 1 do begin Gr := GroupList[g]; if gr = '' then continue; s := Connection.ConnectString(Options.ShowShortcuts, False); Found := False; for j := 0 to Items.Count - 1 do if Items[j].Level = 0 then begin Node := Items[j]; if Node.Text = Gr then if GroupByDatabase then begin for k := 0 to Node.Count - 1 do begin Node2 := Node.Item[k]; if Node2.Text = Connection.Database then begin Node := Items.AddChild(Node2, s); Node.Data := Connection; Found := True; break; end; end; if not Found then begin Node := Items.AddChild(Node, Connection.Database); Node := Items.AddChild(Node, s); Node.Data := Connection; Found := True; end; Break; end else if GroupByUser then begin for k := 0 to Node.Count - 1 do begin Node2 := Node.Item[k]; if Node2.Text = Connection.Username then begin Node := Items.AddChild(Node2, s); Node.Data := Connection; Found := True; break; end; end; if not Found then begin Node := Items.AddChild(Node, Connection.Username); Node := Items.AddChild(Node, s); //Node.SelectedIndex := i; Node.Data := Connection; Found := True; end; Break; end else begin Node := Items.AddChild(Node, s); Node.Data := Connection; Found := True; break; end; {*** IF Node.Text = UpperCase(Databases[i]) THEN ***} end; {*** IF Items[i].Level = 0 THEN ***} if not Found then begin Node := Items.AddChild(nil, Gr); if GroupByDataBase then Node := Items.AddChild(Node, Connection.Database) else if GroupByUser then Node := Items.AddChild(Node, Connection.Username); Node := Items.AddChild(Node, s); Node.Data := Connection; end; end; finally GroupList.Free; end; end; IGroupTreeView.ControlSortItems; end; procedure TJvBaseDBLogonDialog.CreateUserTreeView; var i, j: Integer; Node: TTreeNode; Found: Boolean; s: string; Connection: TJvBaseConnectionInfo; Items: TTreeNodes; begin Items := IUserTreeView.ControlItems; Items.Clear; for i := 0 to ConnectionList.Count - 1 do begin Connection := ConnectionList.Connection[i]; s := Connection.ConnectString(Options.ShowShortCuts, Options.ShowConnectGroup); Found := False; for j := 0 to Items.Count - 1 do if Items[j].Level = 0 then begin Node := Items[j]; if Node.Text = Connection.Username then begin Node := Items.AddChild(Node, s); Node.Data := Connection; Found := True; break; end; end; if not Found then begin Node := Items.AddChild(nil, Connection.Username); Node := Items.AddChild(Node, s); Node.Data := Connection; end; end; IUserTreeView.ControlSortItems; end; procedure TJvBaseDBLogonDialog.DatabaseComboBoxChange(Sender: TObject); begin SetConnectBtnEnabled; end; function TJvBaseDBLogonDialog.DecryptPassword(const Value: string): string; begin try Result := Value; if Assigned(FOnDecryptPassword) then FOnDecryptPassword(Result); except Result := ''; end; end; procedure TJvBaseDBLogonDialog.DoSessionConnect; begin if Options.SetLastConnectToTop then SetConnectionToTop(DialogUserName, DialogDatabase); TransferSessionDataFromDialog; if Assigned(OnSessionConnect) then OnSessionConnect(Session) else ConnectSession; if SessionIsConnected then DBDialog.ModalResult := mrok; end; function TJvBaseDBLogonDialog.EncryptPassword(const Value: string): string; begin try Result := Value; if Assigned(FOnEncryptPassword) then FOnEncryptPassword(Result); except Result := ''; end; end; procedure TJvBaseDBLogonDialog.FillAdditionalPopupMenuEntries(APopupMenu: TPopupMenu); var MenuItem: TMenuItem; begin if Options.ShowConnectionsExport then begin MenuItem := TMenuItem.Create(APopupMenu.Owner); MenuItem.Caption := RSExportConnectionList; MenuItem.OnClick := OnExportConnectionList; APopupMenu.Items.Add(MenuItem); MenuItem := TMenuItem.Create(APopupMenu.Owner); MenuItem.Caption := RSImportConnectionList; MenuItem.OnClick := OnImportConnectionList; APopupMenu.Items.Add(MenuItem); end; end; procedure TJvBaseDBLogonDialog.FillAllConnectionLists; begin FillConnectionList; FillDatabaseTreeView; FillGroupTreeView; FillConnectGroupComboBox; FillDatabaseComboBox; CreateUserTreeView; SetButtonState; end; procedure TJvBaseDBLogonDialog.FillConnectGroupComboBox; var i: Integer; Connection: TJvBaseConnectionInfo; Items: TStringList; IDynControlItems: IJvDynControlItems; begin if Supports(ConnectGroupComboBox, IJvDynControlItems, IDynControlItems) then begin Items := TStringList.Create; try Items.Sorted := True; for i := 0 to ConnectionList.Count - 1 do begin Connection := ConnectionList.Connection[i]; if Connection.Group <> '' then if Items.IndexOf(Connection.Group) < 0 then Items.Add(Connection.Group); end; IDynControlItems.ControlItems.Assign(Items); finally Items.Free; end; end; end; procedure TJvBaseDBLogonDialog.FillConnectionList; var i: Integer; Connection: TJvBaseConnectionInfo; Items: TStrings; begin if Assigned(IConnectListListBoxItems) then begin Items := IConnectListListBoxItems.ControlItems; Items.Clear; for i := 0 to ConnectionList.Count - 1 do begin Connection := ConnectionList.Connection[i]; Items.AddObject(Connection.ConnectString(Options.ShowShortCuts, Options.ShowConnectGroup), Connection); end; end; end; procedure TJvBaseDBLogonDialog.FillDatabaseComboBox; var i: Integer; Connection: TJvBaseConnectionInfo; Items: TStringList; IDynControlItems: IJvDynControlItems; begin if Supports(DatabaseComboBox, IJvDynControlItems, IDynControlItems) then begin Items := TStringList.Create; try Items.Sorted := True; FillDatabaseComboBoxDefaultValues (Items); if Assigned(FOnFillDatabaseList) then FOnFillDatabaseList(Items); if Options.AddConnectionsToDatabaseComboBox then for i := 0 to ConnectionList.Count - 1 do begin Connection := ConnectionList.Connection[i]; if Connection.Database <> '' then if Items.IndexOf(Connection.Database) < 0 then Items.Add(Connection.Database); end; IDynControlItems.ControlItems.Assign(Items); finally Items.Free; end; end; end; procedure TJvBaseDBLogonDialog.FillDatabaseComboBoxDefaultValues(Items: TStrings); begin end; procedure TJvBaseDBLogonDialog.FillDatabaseTreeView; var i, j: Integer; Node: TTreeNode; Found: Boolean; s: string; Connection: TJvBaseConnectionInfo; Items: TTreeNodes; begin Items := IDatabaseTreeView.ControlItems; Items.Clear; for i := 0 to ConnectionList.Count - 1 do begin Connection := ConnectionList.Connection[i]; s := Connection.ConnectString(Options.ShowShortCuts, Options.ShowConnectGroup); Found := False; for j := 0 to Items.Count - 1 do if Items[j].Level = 0 then begin Node := Items[j]; if Node.Text = Connection.Database then begin Node := Items.AddChild(Node, s); Node.Data := Connection; Found := True; break; end; end; if not Found then begin Node := Items.AddChild(nil, Connection.Database); Node := Items.AddChild(Node, s); Node.Data := Connection; end; end; IDatabaseTreeView.ControlSortItems; end; procedure TJvBaseDBLogonDialog.FillShortCutList(Items: TStringList); var I: Integer; begin Items.Add(''); for I := 1 to 10 do Items.Add(ShortCutToText(ShortCut($30 + Ord('0') + (I mod 10), [ssCtrl]))); for I := 1 to 10 do Items.Add(ShortCutToText(ShortCut($30 + Ord('0') + (I mod 10), [ssCtrl, ssShift]))); for I := 1 to 10 do Items.Add(ShortCutToText(ShortCut($30 + Ord('0') + (I mod 10), [ssAlt, ssShift]))); for I := 1 to 10 do Items.Add(ShortCutToText(ShortCut($30 + Ord('0') + (I mod 10), [ssAlt, ssCtrl]))); for I := 1 to 10 do Items.Add(ShortCutToText(ShortCut($30 + Ord('0') + (I mod 10), [ssAlt, ssCtrl, ssShift]))); end; procedure TJvBaseDBLogonDialog.FormClose(Sender: TObject; var Action:TCloseAction); begin if DBDialog.ModalResult = mrOk then begin if Options.SaveLastConnect then TransferConnectionInfoFromDialog(ConnectionList.LastConnect); StoreSettings; end; ClearControlInterfaceObjects; Action := caFree; end; procedure TJvBaseDBLogonDialog.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var i: Integer; Connection: TJvBaseConnectionInfo; sKey: Word; sShift: TShiftState; begin for i := 0 to ConnectionList.Count - 1 do begin ShortCutToKey(ConnectionList.Connection[i].Shortcut, sKey, sShift); if (sKey = Key) and (sShift = Shift) then begin Connection := ConnectionList.Connection[i]; TransferConnectionInfoToDialog(Connection); ConnectToSession; Exit; end; end; end; procedure TJvBaseDBLogonDialog.FormShow(Sender: TObject); begin LoadSettings; ResizeFormControls; ClearFormControls; FillAllConnectionLists; TransferSessionDataToDialog; if (DialogUserName = '') and Options.SaveLastConnect then TransferConnectionInfoToDialog(ConnectionList.LastConnect); end; function TJvBaseDBLogonDialog.GetActivePage: TJvDBLogonDialogActivePage; begin if IConnectionListPageControlTab.ControlTabIndex = 1 then Result := ldapUserTree else if IConnectionListPageControlTab.ControlTabIndex = 2 then Result := ldapDatabaseTree else if IConnectionListPageControlTab.ControlTabIndex = 3 then Result := ldapGroupTree else Result := ldapConnectList; end; function TJvBaseDBLogonDialog.GetCurrentDialogConnectionInfo: TJvBaseConnectionInfo; begin Result := nil; case ActivePage of ldapUserTree: if Assigned(IUserTreeView.ControlGetSelected) and (IUserTreeView.ControlGetSelected.Level > 0) then Result := IUserTreeView.ControlGetSelected.Data; ldapDatabaseTree: if Assigned(IDatabaseTreeView.ControlGetSelected) and (IDatabaseTreeView.ControlGetSelected.Level > 0) then Result := IDatabaseTreeView.ControlGetSelected.Data; ldapGroupTree: if Assigned(IGroupTreeView) and Assigned(IGroupTreeView.ControlGetSelected) and (IGroupTreeView.ControlGetSelected.Level > 0) then Result := IGroupTreeView.ControlGetSelected.Data; ldapConnectList: if (IConnectListListBoxItems.ControlItems.Count > 0) and (IConnectListListBoxData.ControlValue >= 0) and (IConnectListListBoxData.ControlValue <= IConnectListListBoxItems.ControlItems.Count - 1) then Result := TJvBaseConnectionInfo(IConnectListListBoxItems.ControlItems.Objects[IConnectListListBoxData.ControlValue]); end; end; class function TJvBaseDBLogonDialog.GetDBLogonConnectionListClass: TJvBaseConnectionListClass; begin Result := TJvBaseConnectionList; end; class function TJvBaseDBLogonDialog.GetDBLogonDialogOptionsClass: TJvBaseDBLogonDialogOptionsClass; begin Result := TJvBaseDBLogonDialogOptions; end; function TJvBaseDBLogonDialog.GetDialogDatabase: string; begin if Assigned(IDatabaseComboBoxData) then Result := IDatabaseComboBoxData.ControlValue else Result := ''; end; function TJvBaseDBLogonDialog.GetDialogPassword: string; begin if Assigned(IPasswordEditData) then Result := IPasswordEditData.ControlValue else Result := ''; end; function TJvBaseDBLogonDialog.GetDialogUserName: string; begin if Assigned(IUserNameEditData) then Result := IUserNameEditData.ControlValue else Result := ''; end; procedure TJvBaseDBLogonDialog.GetFromListBtnClick(Sender: TObject); begin TransferConnectionInfoToDialog(CurrentDialogConnectionInfo); end; function TJvBaseDBLogonDialog.GetGroupByDatabase: Boolean; begin Result := FGroupByDatabase; end; function TJvBaseDBLogonDialog.GetGroupByUser: Boolean; begin Result := fGroupByUser; end; procedure TJvBaseDBLogonDialog.GroupByDatabaseCheckBoxClick(Sender: TObject); begin if Assigned(IGroupByDatabaseCheckBox) then //GroupByDatabase := not GroupByDatabase; GroupByDatabase := IGroupByDatabaseCheckBox.ControlState = cbChecked; end; procedure TJvBaseDBLogonDialog.GroupByUserCheckBoxClick(Sender: TObject); begin if Assigned(IGroupByUserCheckBox) then //GroupByUser := not GroupByUser; GroupByUser := IGroupByUserCheckBox.ControlState = cbChecked; end; procedure TJvBaseDBLogonDialog.LoadSettings; begin ConnectionList.SavePasswords := SavePasswords; ConnectionList.LoadProperties; if Options.ShowSavePasswords then if ConnectionList.SavePasswords then ISavePasswordsCheckBox.ControlState := cbChecked else ISavePasswordsCheckBox.ControlState := cbUnChecked; if Assigned(IGroupByDatabaseCheckBox) then if ConnectionList.GroupByDatabase then IGroupByDatabaseCheckBox.ControlState := cbChecked else IGroupByDatabaseCheckBox.ControlState := cbUnChecked; if Assigned(IGroupByUserCheckBox) then if ConnectionList.GroupByUser then IGroupByUserCheckBox.ControlState := cbChecked else IGroupByUserCheckBox.ControlState := cbUnChecked; ActivePage := ConnectionList.ActivePage; end; procedure TJvBaseDBLogonDialog.OnExportConnectionList(Sender: TObject); var Savedialog: TSaveDialog; TmpAppStorage: TJvCustomAppMemoryFileStorage; FileName: string; Extention: string; TmpConnectionList: TJvBaseConnectionList; begin TmpAppStorage := nil; Savedialog := TSaveDialog.Create(Self); TmpConnectionList := GetDBLogonConnectionListClass.Create(Self); try TmpConnectionList.CopyContents(ConnectionList, True); with SaveDialog do begin Filter := RsConnectionListExportImportFilter; Name := 'SaveDialog'; DefaultExt := 'xml'; Options := [ofOverwritePrompt, ofHideReadOnly, ofPathMustExist, ofEnableSizing]; end; if Savedialog.Execute then begin FileName := SaveDialog.FileName; Extention := ExtractFileExt(Filename); if UpperCase(extention) = '.INI' then begin TmpAppStorage := TJvAppIniFileStorage.Create(Self); // TJvAppIniFileStorage(TmpAppStorage).Section := 'Export/Import'; end else begin TmpAppStorage := TJvAppXMLFileStorage.Create(Self); TJvAppXMLFileStorage(TMPAppStorage).StorageOptions.WhiteSpaceReplacement := '_'; end; TmpAppStorage.FileName := Filename; TmpAppStorage.Location := flCustom; TmpConnectionList.AppStorage := TmpAppStorage; TmpConnectionList.AppStoragePath := ConnectionList.AppStoragePath; TmpConnectionList.SavePasswords := False; TmpConnectionList.StoreProperties; TmpAppStorage.Flush; end; finally if Assigned(TmpAppStorage) then FreeAndNil(TmpAppStorage); FreeAndNil(SaveDialog); FreeAndNIl(TmpConnectionList); end; end; procedure TJvBaseDBLogonDialog.OnImportConnectionList(Sender: TObject); var OpenDialog: TOpenDialog; TmpAppStorage: TJvCustomAppMemoryFileStorage; FileName: string; Extention: string; TmpConnectionList: TJvBaseConnectionList; ClearBefore: Boolean; Buttons: array[0..2] of string; Results: array[0..2] of Integer; begin TmpAppStorage := nil; OpenDialog := TOpenDialog.Create(Self); TmpConnectionList := GetDBLogonConnectionListClass.Create(Self); try with OpenDialog do begin Filter := RsConnectionListExportImportFilter; Name := 'OpenDialog'; DefaultExt := 'xml'; Options := [ofHideReadOnly, ofExtensionDifferent, ofPathMustExist, ofFileMustExist, ofEnableSizing] end; if OpenDialog.Execute then begin FileName := OpenDialog.FileName; Extention := ExtractFileExt(Filename); if UpperCase(extention) = '.INI' then begin TmpAppStorage := TJvAppIniFileStorage.Create(Self); end else begin TmpAppStorage := TJvAppXMLFileStorage.Create(Self); TJvAppXMLFileStorage(TMPAppStorage).StorageOptions.WhiteSpaceReplacement := '_'; end; TmpAppStorage.FileName := Filename; TmpAppStorage.Location := flCustom; TmpConnectionList.AppStorage := TmpAppStorage; TmpConnectionList.AppStoragePath := ConnectionList.AppStoragePath; TmpConnectionList.LoadProperties; if TmpConnectionList.Count <= 0 then begin JVDsaDialogs.MessageDlg(RsNoConnectionEntriesFound, mtError, [mbok], 0, dckScreen, 0, mbDefault, mbDefault, mbDefault, DynControlEngine); exit; end; ClearBefore := True; if ConnectionList.Count > 0 then begin Buttons[0] := RsConnectionListImportAppend; Buttons[1] := RsConnectionListImportOverwrite; Buttons[2] := RsButtonCancelCaption; Results[0] := Integer(mrYes); Results[1] := Integer(mrNo); Results[2] := Integer(mrCancel); case JVDsaDialogs.MessageDlgEx(RsConnectionListImportAppendOverwriteExistingEntries, mtConfirmation, Buttons, Results, 0, dckScreen, 0, 0, 2, -1, DynControlEngine) of mrYes: ClearBefore := False; mrNo: ClearBefore := True; else Exit; end; end; ConnectionList.CopyContents(TmpConnectionList, ClearBefore); FillAllConnectionLists end; finally if Assigned(TmpAppStorage) then FreeAndNil(TmpAppStorage); FreeAndNil(OpenDialog); FreeAndNIl(TmpConnectionList); end; end; procedure TJvBaseDBLogonDialog.PasswordDialog_BeforeTransferPasswordToSession(var Password: string); var Connection: TJvBaseConnectionInfo; begin Connection := TJvBaseConnectionInfo.Create(nil); try Connection.Password := Password; if Assigned(BeforeTransferConnectionInfoToSessionData) then BeforeTransferConnectionInfoToSessionData(Connection); Password := Connection.Password; finally Connection.Free; end; end; procedure TJvBaseDBLogonDialog.PasswordDialog_AfterTransferPasswordFromSession(var Password: string); var Connection: TJvBaseConnectionInfo; begin Connection := TJvBaseConnectionInfo.Create(nil); try Connection.Password := Password; if Assigned(AfterTransferSessionDataToConnectionInfo) then AfterTransferSessionDataToConnectionInfo(Connection); Password := Connection.Password; finally Connection.Free; end; end; procedure TJvBaseDBLogonDialog.PasswordEditChange(Sender: TObject); begin SetConnectBtnEnabled; end; procedure TJvBaseDBLogonDialog.RemoveFromListBtnClick(Sender: TObject); var Index: Integer; Connection: TJvBaseConnectionInfo; begin Connection := CurrentDialogConnectionInfo; if Assigned(Connection) then begin Index := ConnectionList.Items.IndexOfObject(Connection); if (Index >= 0) and (Index < ConnectionList.Count) then begin ConnectionList.Items.delete(Index); FillAllConnectionLists; end; end; end; procedure TJvBaseDBLogonDialog.ResizeFormControls; begin ConnectPanel.Height := CalculatePanelHeight(DatabaseComboBox); ConnectGroupPanel.Height := CalculatePanelHeight(ConnectGroupComboBox); ShortCutPanel.Height := CalculatePanelHeight(ShortCutComboBox); CancelBtn.Left := DBDialog.ClientWidth - CancelBtn.Width - 5; ConnectBtn.Left := CancelBtn.Left - ConnectBtn.Width - 5; AdditionalBtn.Left := 5; end; function TJvBaseDBLogonDialog.SavePasswords: Boolean; begin if not Options.SavePasswords then Result := False else if Options.ShowSavePasswords then Result := ISavePasswordsCheckBox.ControlState = cbChecked else Result := True; end; procedure TJvBaseDBLogonDialog.SetActivePage(const Value: TJvDBLogonDialogActivePage); begin case Value of ldapUserTree: IConnectionListPageControlTab.ControlTabIndex := 1; ldapDatabaseTree: IConnectionListPageControlTab.ControlTabIndex := 2; ldapGroupTree: IConnectionListPageControlTab.ControlTabIndex := 3; else IConnectionListPageControlTab.ControlTabIndex := 0; end; end; procedure TJvBaseDBLogonDialog.SetAppStorage(Value: TJvCustomAppStorage); begin if Value <> AppStorage then ConnectionList.AppStorage := Value; inherited SetAppStorage(Value); end; procedure TJvBaseDBLogonDialog.SetAppStoragePath(Value: string); begin if Value <> AppStoragePath then ConnectionList.AppStoragePath := Value; inherited SetAppStoragePath(Value); end; procedure TJvBaseDBLogonDialog.SetButtonState; begin if not Assigned(DBDialog) then Exit; GetFromListBtn.Enabled := Assigned(CurrentDialogConnectionInfo); RemoveFromListBtn.Enabled := GetFromListBtn.Enabled; end; procedure TJvBaseDBLogonDialog.SetConnectBtnEnabled; begin if Options.AllowNullPasswords then ConnectBtn.Enabled := (DialogUserName <> '') and (DialogDatabase <> '') else ConnectBtn.Enabled := (DialogUserName <> '') and (DialogPassword <> '') and (DialogDatabase <> ''); AddToListBtn.Enabled := ConnectBtn.Enabled; end; procedure TJvBaseDBLogonDialog.SetConnectionToTop(Username, Database: string); var p: Integer; begin p := Connectionlist.IndexOfNames(Username, Database); if p >= 0 then ConnectionList.Items.Move(p, 0); end; procedure TJvBaseDBLogonDialog.SetDialogDatabase(const Value: string); begin if Assigned(IDatabaseComboBoxData) then IDatabaseComboBoxData.ControlValue := Value; end; procedure TJvBaseDBLogonDialog.SetDialogPassword(const Value: string); begin if Assigned(IPasswordEditData) then IPasswordEditData.ControlValue := Value; end; procedure TJvBaseDBLogonDialog.SetDialogUserName(const Value: string); begin if Assigned(IUserNameEditData) then IUserNameEditData.ControlValue := Value; end; procedure TJvBaseDBLogonDialog.SetGroupByDatabase(Value: Boolean); var Change: Boolean; begin Change := Value <> FGroupByDatabase; if Change then begin if Assigned(IGroupByDatabaseCheckBox) then if Value then IGroupByDatabaseCheckBox.ControlSetState(cbChecked) else IGroupByDatabaseCheckBox.ControlSetState(cbUnChecked); if Assigned(IGroupByUserCheckBox) then if Value and GroupByUser then IGroupByUserCheckBox.ControlSetState(cbUnChecked); end; FGroupByDatabase := Value; if Change then FillGroupTreeView; end; procedure TJvBaseDBLogonDialog.SetGroupByUser(Value: Boolean); var Change: Boolean; begin Change := Value <> fGroupByUser; if Change then begin if Assigned(IGroupByUserCheckBox) then if Value then IGroupByUserCheckBox.ControlSetState(cbChecked) else IGroupByUserCheckBox.ControlSetState(cbUnChecked); if Assigned(IGroupByDatabaseCheckBox) then if Value and GroupByDatabase then IGroupByDatabaseCheckBox.ControlSetState(cbUnChecked); end; fGroupByUser := Value; if Change then FillGroupTreeView; end; procedure TJvBaseDBLogonDialog.SetOptions(const Value: TJvBaseDBLogonDialogOptions); begin FOptions.Assign(Value); end; procedure TJvBaseDBLogonDialog.SetSession(const Value: TComponent); begin inherited SetSession(Value); TransferSessionDataToDialog; end; procedure TJvBaseDBLogonDialog.StoreSettings; begin ConnectionList.GroupByDatabase := Assigned(IGroupByDatabaseCheckBox) and (IGroupByDatabaseCheckBox.ControlState = cbChecked); ConnectionList.GroupByUser := Assigned(IGroupByUserCheckBox) and (IGroupByUserCheckBox.ControlState = cbChecked); ConnectionList.ActivePage := ActivePage; ConnectionList.SavePasswords := SavePasswords; ConnectionList.StoreProperties; end; procedure TJvBaseDBLogonDialog.TransferConnectionInfoFromDialog(ConnectionInfo: TJvBaseConnectionInfo); begin if Assigned(ConnectionInfo) and Assigned(DBDialog) then begin if Options.UsernameCaseSensitive then ConnectionInfo.Username := IUserNameEditData.ControlValue else ConnectionInfo.Username := UpperCase(IUserNameEditData.ControlValue); ConnectionInfo.Password := EncryptPassword(IPasswordEditData.ControlValue); if Options.DatabasenameCaseSensitive then ConnectionInfo.Database := IDatabaseComboBoxData.ControlValue else ConnectionInfo.Database := UpperCase(IDatabaseComboBoxData.ControlValue); if Options.ShowConnectGroup then ConnectionInfo.Group := IConnectGroupComboBoxData.ControlValue; if Options.ShowShortcuts then ConnectionInfo.ShortCutText := IShortCutComboBoxData.ControlValue; end; end; procedure TJvBaseDBLogonDialog.TransferConnectionInfoToDialog(ConnectionInfo: TJvBaseConnectionInfo); begin if Assigned(ConnectionInfo) and Assigned(DBDialog) then begin DialogUserName := ConnectionInfo.Username; if SavePasswords then DialogPassword := DecryptPassword(ConnectionInfo.Password); DialogDatabase := ConnectionInfo.Database; if Options.ShowConnectGroup and Assigned(IConnectGroupComboBoxData) then IConnectGroupComboBoxData.ControlValue := ConnectionInfo.Group; if Options.ShowShortcuts and Assigned(IShortCutComboBoxData) then IShortCutComboBoxData.ControlValue := ConnectionInfo.ShortCutText; if ConnectionInfo.Username = '' then UserNameEdit.SetFocus else if ConnectionInfo.Password = '' then PasswordEdit.SetFocus else if ConnectionInfo.Database = '' then DatabaseComboBox.SetFocus; end; end; procedure TJvBaseDBLogonDialog.TransferSessionDataFromDialog; var tmpConnectionInfo: TJvBaseConnectionInfo; begin if not Assigned(DBDialog) then Exit; tmpConnectionInfo := ConnectionList.CreateConnection; try TransferConnectionInfoFromDialog(tmpConnectionInfo); tmpConnectionInfo.Password := DecryptPassword(tmpConnectionInfo.Password); if Assigned(BeforeTransferConnectionInfoToSessionData) then BeforeTransferConnectionInfoToSessionData(tmpConnectionInfo); TransferSessionDataFromConnectionInfo(tmpConnectionInfo); finally tmpConnectionInfo.Free; end; end; procedure TJvBaseDBLogonDialog.TransferSessionDataFromConnectionInfo(ConnectionInfo: TJvBaseConnectionInfo); begin end; procedure TJvBaseDBLogonDialog.TransferSessionDataToDialog; var tmpConnectionInfo: TJvBaseConnectionInfo; begin if not Assigned(DBDialog) then Exit; tmpConnectionInfo := ConnectionList.CreateConnection; try TransferSessionDataToConnectionInfo(tmpConnectionInfo); tmpConnectionInfo.Password := EncryptPassword(tmpConnectionInfo.Password); if Assigned(AfterTransferSessionDataToConnectionInfo) then AfterTransferSessionDataToConnectionInfo(tmpConnectionInfo); TransferConnectionInfoToDialog(tmpConnectionInfo); finally tmpConnectionInfo.Free; end; end; procedure TJvBaseDBLogonDialog.TransferSessionDataToConnectionInfo(ConnectionInfo: TJvBaseConnectionInfo); begin end; //=== { TJvBaseDBLogonDialogOptions } ======================================== constructor TJvBaseDBLogonDialogOptions.Create; begin inherited Create; FShowShortcuts := True; FShowConnectionsExport := True; FSavePasswords := True; FShowColors := False; FAddConnectionsToDatabaseComboBox := True; FAllowNullPasswords := False; FSaveLastConnect := True; FSetLastConnectToTop := True; FShowConnectGroup := True; FShowSavePasswords := False; FUsernameCaseSensitive := False; FDatabasenameCaseSensitive := False; FPasswordChar := '*'; FAllowPasswordChange := False; FPasswordDialogOptions := TJvBaseDBPasswordDialogOptions.Create; end; destructor TJvBaseDBLogonDialogOptions.Destroy; begin FreeAndNil(FPasswordDialogOptions); inherited Destroy; end; //=== { TJvBaseDBOracleLogonDialogOptions } ================================== constructor TJvBaseDBOracleLogonDialogOptions.Create; begin inherited Create; FShowConnectAs := True; end; procedure TJvBaseDBOracleLogonDialog.ClearControlInterfaceObjects; begin inherited ClearControlInterfaceObjects; IConnectAsComboBoxData := nil; end; procedure TJvBaseDBOracleLogonDialog.ClearFormControls; begin inherited ClearFormControls; IConnectAsComboBoxData.ControlValue := 'NORMAL'; end; procedure TJvBaseDBOracleLogonDialog.CreateAdditionalConnectDialogControls(AOwner: TComponent; AParentControl: TWinControl); var Items: TStringList; LabelControl: TControl; IDynControlLabel: IJvDynControlLabel; begin ConnectAsPanel := DynControlEngine.CreatePanelControl(AOwner, AParentControl, 'ConnectAsPanel', '', alTop); with ConnectAsPanel do begin Align := alTop; end; LabelControl := DynControlEngine.CreateLabelControl(AOwner, ConnectAsPanel, 'ConnectAsLabel', RsConnectAs, nil); with LabelControl do begin Align := alTop; end; Items := tStringList.Create; try Items.Add('NORMAL'); Items.Add('SYSDBA'); Items.Add('SYSOPER'); ConnectAsComboBox := DynControlEngine.CreateComboBoxControl(AOwner, ConnectAsPanel, 'ConnectAsComboBox', Items); Supports(ConnectAsComboBox, IJvDynControlData, IConnectAsComboBoxData); with ConnectAsComboBox do begin Align := alTop; end; finally Items.Free; end; if Supports(LabelControl, IJvDynControlLabel, IDynControlLabel) then IDynControlLabel.ControlSetFocusControl(ConnectAsComboBox); ConnectAsPanel.Visible := Options.ShowConnectAs; end; procedure TJvBaseDBOracleLogonDialog.CreateFormControls(AForm: TForm); begin inherited CreateFormControls(AForm); end; class function TJvBaseDBOracleLogonDialog.GetDBLogonConnectionListClass: TJvBaseConnectionListClass; begin Result := TJvBaseOracleConnectionList; end; class function TJvBaseDBOracleLogonDialog.GetDBLogonDialogOptionsClass: TJvBaseDBLogonDialogOptionsClass; begin Result := TJvBaseDBOracleLogonDialogOptions; end; function TJvBaseDBOracleLogonDialog.GetDialogConnectAs: string; begin if Assigned(IConnectAsComboBoxData) then Result := UpperCase(IConnectAsComboBoxData.ControlValue) else Result := ''; end; function TJvBaseDBOracleLogonDialog.GetOptions: TJvBaseDBOracleLogonDialogOptions; begin Result := TJvBaseDBOracleLogonDialogOptions(inherited Options); end; procedure TJvBaseDBOracleLogonDialog.ResizeFormControls; begin inherited ResizeFormControls; ConnectAsPanel.Height := CalculatePanelHeight(ConnectAsComboBox); end; procedure TJvBaseDBOracleLogonDialog.SetDialogConnectAs(const Value: string); begin if Assigned(IConnectAsComboBoxData) then IConnectAsComboBoxData.ControlValue := Value; end; procedure TJvBaseDBOracleLogonDialog.SetOptions(const Value: TJvBaseDBOracleLogonDialogOptions); begin (inherited Options).Assign(Value); end; procedure TJvBaseDBOracleLogonDialog.TransferConnectionInfoFromDialog(ConnectionInfo: TJvBaseConnectionInfo); begin inherited TransferConnectionInfoFromDialog(ConnectionInfo); if Assigned(ConnectionInfo) then begin if Options.ShowConnectAs then TJvBaseOracleConnectionInfo(ConnectionInfo).ConnectAs := IConnectAsComboBoxData.ControlValue; end; end; procedure TJvBaseDBOracleLogonDialog.TransferConnectionInfoToDialog(ConnectionInfo: TJvBaseConnectionInfo); begin inherited TransferConnectionInfoToDialog(ConnectionInfo); if Assigned(ConnectionInfo) then begin if Options.ShowConnectAs then IConnectAsComboBoxData.ControlValue := TJvBaseOracleConnectionInfo(ConnectionInfo).ConnectAs; end; end; //=== { TJvBaseConnectionInfo } ============================================== destructor TJvBaseConnectionInfo.Destroy; begin inherited Destroy; end; function TJvBaseConnectionInfo.ConnectString(ShowShortCut, ShowConnectGroup: Boolean): string; begin if Password <> '' then Result := Username + '/*****@' + Database else Result := Username + '@' + Database; if ShowShortCut then if ShortCutText <> '' then Result := Result + ' (' + ShortCutText + ')'; if ShowConnectGroup then if Group <> '' then Result := Result + ' - ' + Group; end; function TJvBaseConnectionInfo.GetShortCutText: string; begin Result := ShortCutToText(ShortCut); end; procedure TJvBaseConnectionInfo.SetDatabase(Value: string); begin FDatabase := Trim(Value); end; procedure TJvBaseConnectionInfo.SetGroup(const Value: string); begin FGroup := Trim(Value); end; procedure TJvBaseConnectionInfo.SetSavePassword(const Value: Boolean); const cPassword = 'Password'; begin FSavePassword := Value; if Value then begin if IgnoreProperties.IndexOf(cPassword) >= 0 then IgnoreProperties.Delete(IgnoreProperties.IndexOf(cPassword)) end else if IgnoreProperties.IndexOf(cPassword) < 0 then IgnoreProperties.Add(cPassword); end; procedure TJvBaseConnectionInfo.SetShortCutText(const Value: string); begin try ShortCut := TextToShortCut(Value); except ShortCut := 0; end; end; procedure TJvBaseConnectionInfo.SetUsername(Value: string); begin fUserName := Trim(Value); end; function TJvBaseConnectionInfo.UserDatabaseString: string; begin Result := Username + '@' + Database; end; //=== { TJvBaseOracleConnectionInfo } ======================================== constructor TJvBaseOracleConnectionInfo.Create(AOwner: TComponent); begin inherited Create(AOwner); FConnectAs := 'NORMAL'; end; function TJvBaseOracleConnectionInfo.ConnectString(ShowShortCut, ShowConnectGroup: Boolean): string; begin if Password <> '' then Result := Username + '/*****@' + Database else Result := Username + '@' + Database; if ShowShortCut then if ShortCutText <> '' then Result := Result + ' (' + ShortCutText + ')'; if ConnectAs <> 'NORMAL' then Result := Result + ' [' + ConnectAs + ']'; if ShowConnectGroup then if Group <> '' then Result := Result + ' - ' + Group; end; procedure TJvBaseOracleConnectionInfo.SetConnectAs(const Value: string); begin FConnectAs := Trim(UpperCase(Value)); end; //=== { TJvBaseConnectionList } ============================================== constructor TJvBaseConnectionList.Create(AOwner: TComponent); begin inherited Create(AOwner); FLastConnect := TJvBaseConnectionInfo(CreateObject); ItemName := RsConnectionListItemName; end; destructor TJvBaseConnectionList.Destroy; begin FreeAndNil(FLastConnect); inherited Destroy; end; procedure TJvBaseConnectionList.AddConnection(ConnectionInfo: TJvBaseConnectionInfo); var p, p2, i: Integer; begin p := Items.IndexOf(ConnectionInfo.UserDatabaseString); while p <> -1 do begin Items.Delete(p); p := Items.IndexOf(ConnectionInfo.UserDatabaseString); end; p2 := Items.AddObject(ConnectionInfo.UserDatabaseString, ConnectionInfo); if ConnectionInfo.ShortCut > 0 then for i := 0 to Count - 1 do if i <> p2 then if Connection[i].ShortCut = ConnectionInfo.ShortCut then Connection[i].ShortCut := 0; Items.Move(p2, 0); end; procedure TJvBaseConnectionList.CopyContents(iConnectionList: TJvBaseConnectionList; iClearBefore: Boolean); var i: Integer; Connection: TJvBaseConnectionInfo; begin if iClearBefore then Clear; if not Assigned(iConnectionList) then Exit; for i := 0 to iConnectionList.Items.Count - 1 do begin Connection := CreateConnection; Connection.Assign(iConnectionList.Connection[i]); AddConnection(Connection); end; end; function TJvBaseConnectionList.CreateConnection: TJvBaseConnectionInfo; begin Result := TJvBaseConnectionInfo(CreateObject); end; function TJvBaseConnectionList.CreateObject: TObject; begin Result := TJvBaseConnectionInfo.Create(Self); end; function TJvBaseConnectionList.GetConnection(I: Longint): TJvBaseConnectionInfo; begin if (i >= 0) and (i < Count) then Result := TJvBaseConnectionInfo(Objects[i]) else Result := nil; end; function TJvBaseConnectionList.IndexOfNames(const Username, Database: string): Integer; var Connection: TJvBaseConnectionInfo; begin Connection := TJvBaseConnectionInfo.Create(nil); try Connection.Username := Username; Connection.Database := Database; Result := Items.IndexOf(Connection.UserDatabaseString); finally Connection.Free; end; end; procedure TJvBaseConnectionList.SetLastConnect(const Value: TJvBaseConnectionInfo); begin FLastConnect := Value; end; procedure TJvBaseConnectionList.SetSavePasswords(const Value: Boolean); var i: Integer; begin FSavePasswords := Value; for i := 0 to Count - 1 do Connection[i].SavePassword := Value; end; function TJvBaseOracleConnectionList.CreateObject: TObject; begin Result := TJvBaseOracleConnectionInfo.Create(Self); TJvBaseOracleConnectionInfo(Result).SavePassword := SavePasswords; end; {$IFDEF UNITVERSIONING} initialization RegisterUnitVersion(HInstance, UnitVersioning); finalization UnregisterUnitVersion(HInstance); {$ENDIF UNITVERSIONING} end.