lazarus/tools/lazdatadesktop/frmmain.pp

1907 lines
48 KiB
ObjectPascal

{
***************************************************************************
* *
* This source is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This code is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* General Public License for more details. *
* *
* A copy of the GNU General Public License is available on the World *
* Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also *
* obtain it by writing to the Free Software Foundation, *
* Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1335, USA. *
* *
***************************************************************************
}
unit frmmain;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, fpdatadict,
// LCL
Forms, Controls, Dialogs, Menus, ActnList, StdActns, ComCtrls, ExtCtrls,
IniPropStorage, LCLType, LCLProc,
// LazUtils
FileUtil, LazFileUtils, LazUTF8, Translations,
// LazDataDesktop
dmImages, dicteditor, fraconnection, ddfiles, lazdatadeskstr;
type
TEngineMenuItem = Class(TMenuItem)
public
FEngineName : String;
end;
TNewConnectionMenuItem = Class(TEngineMenuItem);
TImportMenuItem = Class(TEngineMenuItem);
TRecentImportMenuItem = Class(TMenuItem)
Public
FRecentConnection : TRecentConnection;
end;
{ TMainForm }
TMainForm = class(TForm)
AClose: TAction;
ACloseAll: TAction;
ACopyConnection: TAction;
ACreateCode: TAction;
AAddSequence: TAction;
AAddForeignKey: TAction;
AAddDomain: TAction;
ADeleteRecentDataDict: TAction;
AOpenRecentDatadict: TAction;
AOpenConnection: TAction;
ANewIndex: TAction;
ADeleteConnection: TAction;
ANewConnection: TAction;
ASaveAs: TAction;
AGenerateSQL: TAction;
ADeleteObject: TAction;
ANewField: TAction;
ANewTable: TAction;
AOpen: TAction;
AExit: TAction;
ANew: TAction;
ASave: TAction;
ALMain: TActionList;
ACopy: TEditCopy;
ACut: TEditCut;
APaste: TEditPaste;
LVConnections: TListView;
LVDicts: TListView;
MenuItem10: TMenuItem;
PMIDeleteDataDictA: TMenuItem;
PMINewDataDictA: TMenuItem;
MenuItem2: TMenuItem;
MenuItem3: TMenuItem;
MenuItem4: TMenuItem;
MenuItem5: TMenuItem;
MenuItem6: TMenuItem;
MenuItem7: TMenuItem;
MenuItem8: TMenuItem;
PMIOpenDataDictA: TMenuItem;
MIListView: TMenuItem;
MView: TMenuItem;
MICreateCode: TMenuItem;
PCItems: TPageControl;
PMIDeleteConnectionA: TMenuItem;
PMINewConnection: TMenuItem;
PMINewConnectionA: TMenuItem;
PMINewDataDict: TMenuItem;
PMIOpenConnectionA: TMenuItem;
PMIOpenDataDict: TMenuItem;
MIDeleteRecentConnection: TMenuItem;
MIOpenRecentConnection: TMenuItem;
PMIDeleteConnection: TMenuItem;
PMIOpenConnection: TMenuItem;
MINewConnection: TMenuItem;
MIConnection: TMenuItem;
MISaveAs: TMenuItem;
MIGenerateSQL: TMenuItem;
MIDDSep3: TMenuItem;
MIDeleteTable: TMenuItem;
MIDDSep2: TMenuItem;
MINewField: TMenuItem;
MIDDSep: TMenuItem;
MINewTable: TMenuItem;
MICloseAll: TMenuItem;
MIClose: TMenuItem;
MICloseSep: TMenuItem;
MIPaste: TMenuItem;
MICut: TMenuItem;
MIImport: TMenuItem;
MIDataDict: TMenuItem;
PMRecentConnections: TPopupMenu;
PMDataDict: TPopupMenu;
PMAll: TPopupMenu;
PStatus: TPanel;
PStatusText: TPanel;
PBSTatus: TProgressBar;
PSMain: TIniPropStorage;
MainMenu1: TMainMenu;
MenuItem1: TMenuItem;
MIExit: TMenuItem;
MISep: TMenuItem;
MISave: TMenuItem;
MIOpen: TMenuItem;
MFIle: TMenuItem;
ODDD: TOpenDialog;
PCRecent: TPageControl;
SDDD: TSaveDialog;
SRecent: TSplitter;
ToolButton10: TToolButton;
ToolButton9: TToolButton;
TSAll: TTabSheet;
TBAddIndex: TToolButton;
TBCreateCode: TToolButton;
TBAddSequence: TToolButton;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
ToolButton6: TToolButton;
ToolButton7: TToolButton;
ToolButton8: TToolButton;
TVAll: TTreeView;
TSConnections: TTabSheet;
ToolButton1: TToolButton;
TBNewTable: TToolButton;
TBNewField: TToolButton;
ToolButton2: TToolButton;
TBDeleteTable: TToolButton;
ToolButton3: TToolButton;
TBGenerateSQL: TToolButton;
TSRecent: TTabSheet;
TBMain: TToolBar;
TBSave: TToolButton;
TBOPen: TToolButton;
TBNew: TToolButton;
procedure AAddDomainExecute(Sender: TObject);
procedure AAddDomainUpdate(Sender: TObject);
procedure AAddForeignKeyExecute(Sender: TObject);
procedure AAddForeignKeyUpdate(Sender: TObject);
procedure AAddSequenceExecute(Sender: TObject);
procedure AAddSequenceUpdate(Sender: TObject);
procedure ACloseAllExecute(Sender: TObject);
procedure ACloseExecute(Sender: TObject);
procedure ACreateCodeExecute(Sender: TObject);
procedure ACreateCodeUpdate(Sender: TObject);
procedure ADeleteConnectionExecute(Sender: TObject);
procedure ADeleteObjectExecute(Sender: TObject);
procedure ADeleteObjectUpdate(Sender: TObject);
procedure ADeleteRecentDataDictExecute(Sender: TObject);
procedure AExitExecute(Sender: TObject);
procedure AGenerateSQLExecute(Sender: TObject);
procedure AllowSQL(Sender: TObject);
procedure ANewConnectionExecute(Sender: TObject);
procedure ANewExecute(Sender: TObject);
procedure ANewFieldExecute(Sender: TObject);
procedure ANewFieldUpdate(Sender: TObject);
procedure ANewIndexExecute(Sender: TObject);
procedure ANewIndexUpdate(Sender: TObject);
procedure ANewTableExecute(Sender: TObject);
procedure HaveDataDict(Sender: TObject);
procedure AOpenExecute(Sender: TObject);
procedure ASaveExecute(Sender: TObject);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure HaveConnection(Sender: TObject);
procedure HaveDDEditor(Sender: TObject);
procedure HaveRecentConnection(Sender: TObject);
procedure HaveRecentDataDict(Sender: TObject);
procedure HaveTabs(Sender: TObject);
procedure HaveTab(Sender: TObject);
procedure HaveTables(Sender: TObject);
procedure MIListViewClick(Sender: TObject);
procedure OpenRecentConnection(Sender: TObject);
procedure LVConnectionsKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure OpenRecentDatadict(Sender: TObject);
procedure LVDictsKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure MIDataDictClick(Sender: TObject);
procedure DoCloseTabClick(Sender: TObject);
procedure PMAllPopup(Sender: TObject);
procedure SaveAsExecute(Sender: TObject);
procedure TVAllDblClick(Sender: TObject);
private
FTreeIntf : Boolean;
FNRecentConnections : TTreeNode;
FNRecentDictionaries : TTreeNode;
FRecentDicts : TRecentDataDicts;
FRecentConnections : TRecentConnections;
PCDD : TPageControl;
procedure AddRecentConnectionList(RC: TRecentConnection; AssumeNew: Boolean);
procedure AddRecentConnectionTree(RC: TRecentConnection; AssumeNew: Boolean);
procedure CheckParams;
function CloseConnectionEditor(aTab: TConnectionEditor): TModalResult;
function CloseCurrentConnection: TModalResult;
function CloseCurrentTab(AddCancelClose: Boolean = False): TModalResult;
function CloseDataEditor(DD: TDataDictEditor; AddCancelClose: Boolean): TModalResult;
function CloseTab(aTab : TTabsheet; AddCancelClose: Boolean = False): TModalResult;
procedure DeleteRecentConnection;
procedure DeleteRecentDataDict;
procedure DoShowNewConnectionTypes(ParentMenu: TMenuItem);
procedure DoTestConnection(Sender: TObject; const ADriver: String; Params: TStrings);
function GetConnectionName(out AName: String): Boolean;
function GetCurrentConnection: TConnectionEditor;
function GetCurrentEditor: TDataDictEditor;
function GetSelectedRecentConnection: TRecentConnection;
function GetSelectedRecentDataDict: TRecentDataDict;
procedure NewConnection(EngineName : String);
procedure NewConnection;
procedure OpenConnection(RC: TRecentConnection);
procedure RegisterDDEngines;
Function SelectEngineType(out EngineName : String) : Boolean;
procedure SetupIntf;
procedure ShowImportRecentconnections;
procedure ShowNewConnectionTypes;
procedure ShowRecentConnections;
Procedure ShowRecentDictionaries;
Procedure ShowDDImports;
Procedure StartStatus;
Procedure StopStatus;
procedure ShowStatus(Const Msg : String);
procedure RegisterConnectionCallBacks;
procedure GetDBFDir(Sender : TObject; Var ADir : String);
procedure GetSQLConnectionDlg(Sender : TObject; Var AConnection : String);
Procedure AddRecentDictList(DF : TRecentDataDict; AssumeNew : Boolean);
Procedure AddRecentDictTree(DF : TRecentDataDict; AssumeNew : Boolean);
Function FindLi(LV : TListView;RI : TRecentItem) : TListItem;
function FindTN(AParent: TTreeNode; RI: TRecentItem): TTreeNode;
procedure ImportClick(Sender : TObject);
procedure RecentImportClick(Sender : TObject);
procedure NewConnectionClick(Sender : TObject);
procedure DoImport(Const EngineName : String);
procedure DoImport(Const EngineName,ConnectionString : String);
Procedure DoDDEProgress(Sender : TObject; Const Msg : String);
public
procedure OpenDataDict(DDF : TRecentDataDict);
procedure OpenFile(AFileName : String);
procedure RaiseEditor(DDE: TDataDictEditor);
Procedure SaveCurrentEditor;
Procedure SaveCurrentEditorAs;
Function CloseAllEditors : Boolean;
Function CloseCurrentEditor (AddCancelClose : Boolean = False) : TModalResult;
Function NewDataDict : TFPDataDictionary;
Function NewDataEditor : TDataDictEditor;
function NewConnectionEditor(AName : String): TConnectionEditor;
procedure DeleteCurrentObject;
procedure DoNewGlobalObject(AObjectType: TEditObjectType);
procedure DoNewTableObject(AObjectType: TEditObjectType);
procedure ShowGenerateSQL;
Property CurrentEditor : TDataDictEditor Read GetCurrentEditor;
Property CurrentConnection : TConnectionEditor Read GetCurrentConnection;
Property SelectedRecentConnection : TRecentConnection Read GetSelectedRecentConnection;
Property SelectedRecentDataDict : TRecentDataDict Read GetSelectedRecentDataDict;
end;
var
MainForm: TMainForm;
implementation
{$R *.lfm}
uses
frmselectconnectiontype, reglddfeatures,
frmimportdd,frmgeneratesql,fpddsqldb,frmSQLConnect;
{ ---------------------------------------------------------------------
TMainform events
---------------------------------------------------------------------}
procedure TMainForm.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
FRecentDicts.Save;
FRecentConnections.Save;
CloseAction:=caFree;
end;
procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: boolean);
begin
CanClose:=True;
If PCDD.PageCount>2 then
begin
PCDD.ActivePageIndex:=PCDD.PageCount-1;
While Canclose and (CurrentEditor<>Nil) do
CanClose:=CloseCurrentEditor(True)<>mrCancel;
end;
end;
procedure TMainForm.FormCreate(Sender: TObject);
Var
FN : String;
begin
//
Caption := sld_Lazarusdatabasedesktop;
//
MFile.Caption:= sld_Menufile;
MenuItem2.Caption:= sld_Menuedit;
MIDataDict.Caption:= sld_Menudictionary;
MIConnection.Caption:= sld_Menuconnections;
MView.Caption:= sld_View;
MIImport.Caption:= sld_Menudictionaryimport;
MICloseSep.Caption:= sld_Separator;
MISep.Caption:= sld_Separator;
MIDDSep.Caption:= sld_Separator;
MIDDSep2.Caption:= sld_Separator;
MIDDSep3.Caption:= sld_Separator;
MINewConnection.Caption:= sld_Actionnewconnection;
PMINewConnection.Caption:= sld_Actionnewconnection;
//
ASave.Caption:= sld_Actionsave;
ASave.Hint:= sld_ActionsaveH;
ANew.Caption:= sld_Actionnew;
ANew.Hint:= sld_ActionnewH;
AExit.Caption:= sld_Actionexit;
AExit.Hint:= sld_ActionexitH;
AOpen.Caption:= sld_Actionopen;
AOpen.Hint:= sld_ActionopenH;
AClose.Caption:= sld_Actionclose;
AClose.Hint:= sld_ActioncloseH;
ACloseAll.Caption:= sld_Actioncloseall;
ACloseAll.Hint:= sld_ActioncloseallH;
ASaveAs.Caption:= sld_Actionsaveas;
ASaveAs.Hint:= sld_ActionsaveasH;
AOpenRecentDatadict.Caption:= sld_Actionopenrecentdatadict;
AOpenRecentDatadict.Hint:= sld_ActionopenrecentdatadictH;
ADeleteRecentDataDict.Caption:= sld_Actiondeleterecentdatadict;
//
ACut.Caption:= sld_Actioncut;
ACut.Hint:= sld_ActioncutH;
ACopy.Caption:= sld_Actioncopy;
ACopy.Hint:= sld_ActioncopyH;
APaste.Caption:= sld_Actionpaste;
APaste.Hint:= sld_ActionpasteH;
//
ANewTable.Caption:= sld_Actionnewtable;
ANewTable.Hint:= sld_ActionnewtableH;
ANewField.Caption:= sld_Actionnewfield;
ANewField.Hint:= sld_ActionnewfieldH;
ADeleteObject.Caption:= sld_Actiondeleteobject;
ADeleteObject.Hint:= sld_ActiondeleteobjectH;
AGenerateSQL.Caption:= sld_Actiongeneratesql;
AGenerateSQL.Hint:= sld_ActiongeneratesqlH;
ANewIndex.Caption:= sld_Actionnewindex;
ANewIndex.Hint:= sld_ActionnewindexH;
ACreateCode.Caption:= sld_Actioncreatecode;
ACreateCode.Hint:= sld_ActioncreatecodeH;
AAddForeignKey.Caption:= sld_Actionaddforeignkey;
AAddForeignKey.Hint:= sld_ActionaddforeignkeyH;
AAddDomain.Caption:= sld_Actionadddomain;
AAddDomain.Hint:= sld_ActionadddomainH;
AAddSequence.Caption:= sld_Actionaddsequence;
AAddSequence.Hint:= sld_ActionaddsequenceH;
//
ANewConnection.Caption:= sld_Actionnewconnection;
ANewConnection.Hint := sld_startnewconnection;
ADeleteConnection.Caption:= sld_Actiondeleteconnection;
ACopyConnection.Caption:= sld_Actioncopyconnection;
AOpenConnection.Caption:= sld_Actionopenconnection;
AOpenConnection.Hint:= sld_ActionopenconnectionH;
//
//
TSRecent.Caption:= sld_Dictionaries;
TSConnections.Caption:= sld_Connections;
TSAll.Caption:= sld_ConnectionsDictionaries;
LVDicts.Column[0].Caption:= sld_Recentlv1;
LVDicts.Column[1].Caption:= sld_Recentlv2;
LVDicts.Column[2].Caption:= sld_Recentlv3;
LVConnections.Column[0].Caption:= sld_Connectionlv1;
LVConnections.Column[1].Caption:= sld_Connectionlv2;
LVConnections.Column[2].Caption:= sld_Connectionlv3;
LVConnections.Column[3].Caption:= sld_Connectionlv4;
//
ODDD.Title:= sld_opendatadictionarytitle;
ODDD.Filter:= sld_opendatadictionaryfilter;
SDDD.Title:= sld_savefileastitle;
SDDD.Filter:= sld_savefileasfilter;
//
MIListView.Caption:=sld_LegacyView;
//
//
// Register DD engines.
RegisterDDEngines;
RegisterExportFormats;
// Register standard export formats.
FRecentDicts:=TRecentDataDicts.Create(TRecentDataDict);
FRecentConnections:=TRecentConnections.Create(TRecentConnection);
FN:=SysToUTF8(GetAppConfigDir(False));
ForceDirectoriesUTF8(FN);
FN:=SysToUTF8(GetAppConfigFile(False));
PSMain.IniFileName:=ChangeFileExt(FN,'.ini');
FTreeIntf:=PSMain.ReadBoolean('TreeInterface',True);
if FTreeIntf then
PCRecent.Width:=PSMain.ReadInteger('TreeWidth',PCRecent.Width);
// We need these 2 in all cases
FNRecentConnections:=TVAll.Items.AddChild(Nil,sld_Connections);
FNRecentConnections.ImageIndex:=iiConnections;
FNRecentConnections.SelectedIndex:=iiConnections;
FNRecentDictionaries:=TVAll.Items.AddChild(Nil,sld_Dictionaries);
FNRecentDictionaries.ImageIndex:=iiDataDict;
FNRecentDictionaries.SelectedIndex:=iiDataDict;
SetupIntf;
FRecentDicts.LoadFromFile(UTF8ToSys(FN),'RecentDicts');
FRecentConnections.LoadFromFile(UTF8ToSys(FN),'RecentConnections');
ShowRecentDictionaries;
ShowRecentConnections;
ShowDDImports;
ShowNewConnectionTypes;
LVDicts.Columns[0].Width:=120;
LVDicts.Columns[1].Width:=380;
LVDicts.Columns[2].Width:=150;
LVConnections.Column[0].Width:=120;
LVConnections.Column[1].Width:=120;
LVConnections.Column[2].Width:=150;
LVConnections.Column[3].Width:=260;
RegisterConnectionCallBacks;
end;
procedure TMainForm.SetupIntf;
begin
TSAll.TabVisible:=FTreeIntf;
TSRecent.TabVisible:=Not FTreeIntf;
TSConnections.TabVisible:=Not FTreeIntf;
if FTreeIntf then
begin
PCDD:=PCItems;
PCRecent.Align:=alLeft;
//PCRecent.Width:=300;
SRecent.Align:=alLeft;
SRecent.Visible:=True;
PCItems.Visible:=True;
PCItems.Align:=alClient;
end
else
begin
PCItems.Align:=alRight;
PCItems.Visible:=False;
SRecent.Align:=alRight;
SRecent.Visible:=False;
PCRecent.Align:=alClient;
PCDD:=PCRecent;
end;
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
FreeAndNil(FRecentConnections);
FreeAndNil(FRecentDicts);
PSMain.WriteBoolean('TreeInterface',FTreeIntf);
if FTreeIntf then
PSMain.WriteInteger('TreeWidth',PCRecent.Width);
end;
procedure TMainForm.FormShow(Sender: TObject);
begin
CheckParams;
if (FRecentConnections.Count=0) and (FRecentDicts.Count=0) then
case QuestionDlg(sld_FirstStart,sql_NoConnectionsFound,mtInformation,[
mrOK,sld_startnewdict,
mrYes,sld_startnewconnection,
mrCancel,sld_startempty
],0) of
mrYes : NewConnection;
mrOK : NewDataDict;
end
end;
procedure TMainForm.CheckParams;
Var
S : String;
D : TRecentDatadict;
C : TRecentConnection;
begin
With Application do
If HasOption('d','dictionary') then
begin
S:=GetOptionValue('d','dictionary');
D:=FRecentDicts.FindFromName(S);
If (D<>Nil) then
OpenDataDict(D)
else
ShowMessage(Format(SUnknownDictionary,[S]));
end
else If HasOption('f','filename') then
begin
S:=GetOptionValue('f','filename');
If FileExistsUTF8(S) then
OpenFile(S);
end
else If HasOption('c','connection') then
begin
S:=GetOptionValue('c','connection');
C:=FRecentConnections.FindFromName(S);
If (C<>Nil) then
OpenConnection(C)
else
ShowMessage(Format(SUnknownConnection,[S]));
end;
end;
procedure TMainForm.HaveConnection(Sender: TObject);
begin
(Sender as TAction).Enabled:=True
end;
{ ---------------------------------------------------------------------
Main form auxiliary methods
---------------------------------------------------------------------}
procedure TMainForm.RegisterDDEngines;
begin
RegisterEngines;
end;
procedure TMainForm.RegisterConnectionCallBacks;
Var
L : TStringList;
Procedure MaybeRegisterConnectionStringCallback(RC : String;CallBack : TGetConnectionEvent);
begin
If L.IndexOf(Rc)<>-1 then
RegisterConnectionStringCallback(RC,Callback);
end;
begin
L:=TStringList.Create;
try
GetDictionaryEngineList(L);
MaybeRegisterConnectionStringCallback('TDBFDDEngine',@GetDBFDir);
MaybeRegisterConnectionStringCallback('TSQLDBMySql40DDEngine',@GetSQLConnectionDlg);
MaybeRegisterConnectionStringCallback('TSQLDBMySql41DDEngine',@GetSQLConnectionDlg);
MaybeRegisterConnectionStringCallback('TSQLDBMySql5DDEngine',@GetSQLConnectionDlg);
MaybeRegisterConnectionStringCallback('TSQLDBMySql51DDEngine',@GetSQLConnectionDlg);
MaybeRegisterConnectionStringCallback('TSQLDBMySql55DDEngine',@GetSQLConnectionDlg);
MaybeRegisterConnectionStringCallback('TSQLDBMySql56DDEngine',@GetSQLConnectionDlg);
MaybeRegisterConnectionStringCallback('TSQLDBMySql57DDEngine',@GetSQLConnectionDlg);
MaybeRegisterConnectionStringCallback('TSQLDBODBCDDEngine',@GetSQLConnectionDlg);
MaybeRegisterConnectionStringCallback('TSQLDBPOSTGRESQLDDEngine',@GetSQLConnectionDlg);
MaybeRegisterConnectionStringCallback('TSQLDBFBDDEngine',@GetSQLConnectionDlg);
MaybeRegisterConnectionStringCallback('TSQLDBSQLite3DDEngine',@GetSQLConnectionDlg);
MaybeRegisterConnectionStringCallback('TSQLDBMSSQLDDEngine',@GetSQLConnectionDlg);
finally
L.free;
end;
end;
procedure TMainForm.RaiseEditor(DDE: TDataDictEditor);
begin
PCDD.ActivePage:=DDE;
end;
function TMainForm.GetCurrentEditor: TDataDictEditor;
Var
TS : TTabSheet;
begin
TS:=PCDD.ActivePage;
if TS is TDataDictEditor then
Result:=TDataDictEditor(TS)
else
Result:=Nil;
end;
function TMainForm.GetSelectedRecentConnection: TRecentConnection;
Var
TN : TTreeNode;
LI : TListItem;
begin
Result:=Nil;
if FTreeIntf then
begin
TN:=TVAll.Selected;
if Assigned(TN) AND Assigned(TN.Data) AND TObject(TN.Data).InheritsFrom(TRecentConnection) then
Result:=TRecentConnection(TN.Data);
end
else
begin
LI:=LVConnections.Selected;
if (LI<>Nil) and (LI.Data<>Nil) then
Result:=TRecentConnection(LI.Data)
end;
end;
function TMainForm.GetSelectedRecentDataDict: TRecentDataDict;
Var
TN : TTreeNode;
LI : TListItem;
begin
Result:=Nil;
if FTreeIntf then
begin
TN:=TVAll.Selected;
if Assigned(TN) AND Assigned(TN.Data) AND TObject(TN.Data).InheritsFrom(TRecentDataDict) then
Result:=TRecentDataDict(TN.Data);
end
else
begin
LI:=LVDicts.Selected;
if (LI<>Nil) AND (LI.Data<>Nil) then
Result:=TRecentDataDict(LI.Data);
end;
end;
function TMainForm.GetCurrentConnection: TConnectionEditor;
Var
TS : TTabSheet;
begin
TS:=PCDD.ActivePage;
if TS is TConnectionEditor then
Result:=TConnectionEditor(TS)
else
Result:=Nil;
end;
procedure TMainForm.ShowRecentDictionaries;
Var
DF : TRecentDataDict;
I : Integer;
begin
LVDicts.Items.Clear;
For I:=0 to FRecentDicts.Count-1 do
begin
DF:=FRecentDicts[i];
AddRecentDictList(DF,True);
AddRecentDictTree(DF,True);
end;
FNRecentDictionaries.Expand(False);
end;
procedure TMainForm.ShowRecentConnections;
Var
RC : TRecentConnection;
I : Integer;
begin
LVConnections.Items.Clear;
FNRecentConnections.DeleteChildren;
For I:=0 to FRecentConnections.Count-1 do
begin
RC:=FRecentConnections[i];
AddRecentConnectionList(RC,True);
AddRecentConnectionTree(RC,True);
end;
FNRecentConnections.Expand(False);
end;
procedure TMainForm.ShowDDImports;
Var
MI : TImportMenuItem;
L : TStringList;
dd,dt : string;
i : integer;
cap : TFPDDEngineCapabilities;
begin
MIImport.Clear;
L:=TStringList.Create;
Try
L.Sorted:=True;
GetDictionaryEngineList(L);
For i:=0 to L.Count-1 do
begin
GetDictionaryEngineInfo(L[i],dd,dt,cap);
if ecImport in cap then
begin
MI:=TImportMenuItem.Create(Self);
MI.Caption:=dt;
MI.FEngineName:=L[i];
MI.OnClick:=@ImportClick;
MIImport.Add(MI);
// make sure it gets loaded
PSMain.StoredValue[L[i]]:='';
end;
end;
ShowImportRecentconnections;
Finally
L.Free;
end;
MIImport.Enabled:=(MIImport.Count>0);
end;
procedure TMainForm.ShowImportRecentconnections;
Var
MR : TMenuItem;
MI : TRecentImportMenuItem;
L : TStringList;
dd,dt : string;
i : integer;
cap : TFPDDEngineCapabilities;
RC: TRecentConnection;
begin
If (FRecentConnections.Count>0) then
begin
MR:=TMenuItem.Create(Self);
MR.Caption:=sld_Fromconnection;
MIimport.Insert(0,MR);
L:=TStringList.Create;
Try
For I:=0 to FRecentConnections.Count-1 do
L.AddObject(FRecentConnections[i].Name,FRecentConnections[i]);
L.Sort;
For I:=0 to L.Count-1 do
begin
RC:=L.Objects[i] as TRecentConnection;
GetDictionaryEngineInfo(RC.EngineName,dd,dt,cap);
if (ecImport in cap) then
begin
MI:=TRecentImportMenuItem.Create(Self);
MI.Caption:=L[i];
MI.FRecentConnection:=RC;
MI.OnClick:=@RecentImportClick;
MR.Add(MI);
end;
end;
Finally
L.Free;
end;
end;
MIImport.Enabled:=(MIImport.Count>0);
end;
procedure TMainForm.ShowNewConnectionTypes;
begin
DoShowNewConnectionTypes(MINewConnection);
DoShowNewConnectionTypes(PMINewConnection);
end;
procedure TMainForm.DoShowNewConnectionTypes(ParentMenu : TMenuItem);
Var
MI : TNewConnectionMenuItem;
L : TStringList;
dd,dt : string;
i : integer;
cap : TFPDDEngineCapabilities;
begin
ParentMenu.Clear;
L:=TStringList.Create;
Try
L.Sorted:=True;
GetDictionaryEngineList(L);
For i:=0 to L.Count-1 do
begin
GetDictionaryEngineInfo(L[i],dd,dt,cap);
MI:=TNewConnectionMenuItem.Create(Self);
MI.Caption:=dt;
MI.FEngineName:=L[i];
MI.OnClick:=@NewConnectionClick;
ParentMenu.Add(MI);
// make sure it gets loaded
PSMain.StoredValue[L[i]]:='';
end;
Finally
L.Free;
end;
MIImport.Enabled:=(MIImport.Count>0);
end;
procedure TMainForm.DoTestConnection(Sender: TObject;Const ADriver : String; Params: TStrings);
Var
DDE : TFPDDEngine;
begin
DDE:=CreateDictionaryEngine(ADriver,Self);
try
DDE.Connect(Params.CommaText);
finally
DDE.Free;
end;
end;
procedure TMainForm.StartStatus;
begin
PBStatus.Position:=0;
PSTatusText.Caption:='';
PStatus.Visible:=True;
Application.ProcessMessages;
end;
procedure TMainForm.StopStatus;
begin
PStatus.Visible:=False;
PBStatus.Position:=0;
PSTatusText.Caption:='';
Application.ProcessMessages;
end;
procedure TMainForm.ShowStatus(const Msg: String);
begin
PStatusText.Caption:=Msg;
With PBStatus do
begin
If Position>=Max then
Position:=0;
PBStatus.StepIt;
end;
Application.ProcessMessages;
end;
procedure TMainForm.DoDDEProgress(Sender: TObject; const Msg: String);
begin
ShowStatus(Msg);
end;
procedure TMainForm.ImportClick(Sender : TObject);
begin
DoImport((Sender as TEngineMenuItem).FEngineName);
end;
procedure TMainForm.RecentImportClick(Sender : TObject);
Var
RC : TRecentConnection;
begin
RC:=(Sender as TRecentImportMenuItem).FRecentConnection;
DoImport(RC.EngineName,RC.ConnectionString);
end;
procedure TMainForm.NewConnectionClick(Sender : TObject);
begin
NewConnection((Sender as TEngineMenuItem).FEngineName);
end;
procedure TMainForm.GetSQLConnectionDlg(Sender: TObject; var AConnection: String
);
Var
Last : String;
begin
Last:=PSmain.StoredValue[Sender.ClassName];
With (Sender as TSQLDBDDEngine) do
AConnection:=GetSQLDBConnectString(HostSupported,Last,ClassName,@DoTestConnection);
If (AConnection<>'') then
PSmain.StoredValue[Sender.ClassName]:=AConnection;
end;
procedure TMainForm.GetDBFDir(Sender: TObject; var ADir: String);
Var
IDir : String;
begin
IDir:=PSmain.StoredValue[Sender.ClassName];
if (IDir='') then
IDir:=ExtractFilePath(ParamStrUTF8(0));
if SelectDirectory(SSelectDBFDir,IDir,ADir) then
PSMain.StoredValue[Sender.ClassName]:=ADir
end;
{ ---------------------------------------------------------------------
Action Execute/Update handlers
---------------------------------------------------------------------}
procedure TMainForm.AExitExecute(Sender: TObject);
begin
Close;
end;
procedure TMainForm.AGenerateSQLExecute(Sender: TObject);
begin
ShowGenerateSQL;
end;
procedure TMainForm.AllowSQL(Sender: TObject);
Var
B : Boolean;
begin
B:=Assigned(CurrentEditor) and (CurrentEditor.DataDictionary.Tables.Count>0);
If not B then
B:=Assigned(CurrentConnection) and CurrentConnection.Frame.CanCreateSQL;
(Sender as TAction).Enabled:=B;
end;
procedure TMainForm.ANewConnectionExecute(Sender: TObject);
begin
NewConnection;
end;
procedure TMainForm.ACloseExecute(Sender: TObject);
begin
CloseCurrentTab;
end;
procedure TMainForm.ACreateCodeExecute(Sender: TObject);
begin
If Assigned(CurrentEditor) then
begin
If Assigned(CurrentEditor.CurrentTable) then
CurrentEditor.CreateCode
end
else if Assigned(CurrentConnection) then
begin
CurrentConnection.Frame.CreateCode;
end;
end;
procedure TMainForm.ACreateCodeUpdate(Sender: TObject);
Var
B : Boolean;
begin
B:=Assigned(CurrentEditor);
If B then
B:=Assigned(CurrentEditor.CurrentTable)
else
begin
B:=Assigned(CurrentConnection);
If B then
B:=CurrentConnection.Frame.CanCreateCode;
end;
(Sender as TAction).Enabled:=B;
end;
procedure TMainForm.ADeleteConnectionExecute(Sender: TObject);
begin
DeleteRecentConnection;
end;
procedure TMainForm.DeleteRecentConnection;
Var
R : TRecentConnection;
begin
R:=SelectedRecentConnection;
If Assigned(R) then
begin
FRecentConnections.Delete(R.Index);
FindLI(LVConnections,R).Free;
FindTN(FNRecentConnections,R).Free;
end;
end;
procedure TMainForm.ADeleteObjectExecute(Sender: TObject);
begin
DeleteCurrentObject;
end;
procedure TMainForm.ADeleteObjectUpdate(Sender: TObject);
begin
(Sender as TAction).Enabled:=Assigned(CurrentEditor) and
Assigned(CurrentEditor.CurrentObject);
end;
procedure TMainForm.ADeleteRecentDataDictExecute(Sender: TObject);
begin
DeleteRecentDataDict;
end;
procedure TMainForm.ACloseAllExecute(Sender: TObject);
begin
CloseAllEditors;
end;
procedure TMainForm.AAddSequenceUpdate(Sender: TObject);
begin
{$ifdef onlyoldobjects}
(Sender as TAction).Enabled:=False;
{$else}
(Sender as TAction).Enabled:=(CurrentEditor<>Nil);
{$endif}
end;
procedure TMainForm.AAddDomainUpdate(Sender: TObject);
begin
{$ifdef onlyoldobjects}
(Sender as TAction).Enabled:=False;
{$else}
(Sender as TAction).Enabled:=(CurrentEditor<>Nil);
{$endif}
end;
procedure TMainForm.AAddForeignKeyUpdate(Sender: TObject);
begin
{$ifdef onlyoldobjects}
(Sender as TAction).Enabled:=False
{$else}
(Sender as TAction).Enabled:=(CurrentEditor<>Nil) and (CurrentEditor.CurrentTable<>Nil);
{$endif}
end;
procedure TMainForm.AAddDomainExecute(Sender: TObject);
begin
DoNewGlobalObject(eotDomain);
end;
procedure TMainForm.AAddForeignKeyExecute(Sender: TObject);
begin
DoNewTableObject(eotForeignKey);
end;
procedure TMainForm.AAddSequenceExecute(Sender: TObject);
begin
DoNewGlobalObject(eotSequence)
end;
procedure TMainForm.ANewExecute(Sender: TObject);
begin
NewDataDict;
end;
procedure TMainForm.ANewFieldExecute(Sender: TObject);
begin
DoNewTableObject(eotField);
end;
procedure TMainForm.ANewFieldUpdate(Sender: TObject);
begin
(Sender as TAction).Enabled:=(CurrentEditor<>nil)
and (CurrentEditor.CurrentTable<>Nil);
end;
procedure TMainForm.ANewIndexExecute(Sender: TObject);
begin
DoNewTableObject(eotIndex);
end;
procedure TMainForm.ANewIndexUpdate(Sender: TObject);
begin
{$ifdef onlyoldobjects}
(Sender as TAction).Enabled:=False
{$else}
(Sender as TAction).Enabled:=(CurrentEditor<>nil)
and (CurrentEditor.CurrentTable<>Nil);
{$endif onlyoldobjects}
end;
procedure TMainForm.ANewTableExecute(Sender: TObject);
begin
DoNewGlobalObject(eotTable)
end;
procedure TMainForm.HaveDataDict(Sender: TObject);
begin
(Sender as TAction).Enabled:=(CurrentEditor<>Nil);
end;
procedure TMainForm.AOpenExecute(Sender: TObject);
begin
With ODDD do
If Execute then
OpenFile(FileName);
end;
procedure TMainForm.ASaveExecute(Sender: TObject);
begin
SaveCurrentEditor;
end;
procedure TMainForm.HaveDDEditor(Sender: TObject);
begin
(Sender as TAction).Enabled:=(CurrentEditor<>Nil);
end;
procedure TMainForm.HaveRecentConnection(Sender: TObject);
begin
(Sender as Taction).Enabled:=Assigned(SelectedRecentConnection);
end;
procedure TMainForm.HaveRecentDataDict(Sender: TObject);
begin
(Sender as Taction).Enabled:=Assigned(SelectedRecentDataDict);
end;
procedure TMainForm.HaveTabs(Sender: TObject);
begin
(Sender as TAction).Enabled:=(CurrentEditor<>Nil) or (CurrentConnection<>Nil);
end;
procedure TMainForm.HaveTab(Sender: TObject);
begin
if FTreeIntf then
(Sender as TAction).Enabled:=(PCDD.PageCount>0)
else
(Sender as TAction).Enabled:=(PCDD.PageCount>2);
end;
procedure TMainForm.HaveTables(Sender: TObject);
begin
(Sender as TAction).Enabled:=Assigned(CurrentEditor)
and (CurrentEditor.DataDictionary.Tables.Count>0);
end;
procedure TMainForm.MIListViewClick(Sender: TObject);
begin
FTreeIntf:=Not MIListView.Checked;
SetupIntf;
end;
procedure TMainForm.OpenRecentConnection(Sender: TObject);
begin
If (LVConnections.Selected<>Nil)
and (LVConnections.Selected.Data<>Nil) then
OpenConnection(TRecentConnection(LVConnections.Selected.Data));
end;
procedure TMainForm.LVConnectionsKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=VK_DELETE then
DeleteRecentConnection;
end;
procedure TMainForm.SaveAsExecute(Sender: TObject);
begin
SaveCurrentEditorAs;
end;
procedure TMainForm.TVAllDblClick(Sender: TObject);
Var
TN : TTreeNode;
begin
TN:=TVAll.Selected;
if Assigned(TN) and Assigned(Tn) then
if TObject(TN.Data).InheritsFrom(TRecentConnection) then
OpenConnection(TRecentConnection(TN.Data))
else if TObject(TN.Data).InheritsFrom(TRecentDatadict) then
OpenDataDict(TRecentDatadict(TN.Data))
end;
{ ---------------------------------------------------------------------
File menu commands
---------------------------------------------------------------------}
procedure TMainForm.OpenDataDict(DDF : TRecentDataDict);
begin
If (DDF<>Nil) then
If (DDF.UserData<>Nil) then
RaiseEditor(DDF.UserData as TDataDictEditor)
else
OpenFile(DDF.FileName);
end;
procedure TMainForm.OpenFile(AFileName: String);
Var
DDE : TDataDictEditor;
DDF : TRecentDataDict;
B : Boolean;
begin
DDE:=NewDataEditor;
StartStatus;
Try
DDE.LoadFromFile(AFileName);
Finally
StopStatus;
end;
DDF:=FRecentDicts.FindFromFileName(AFileName);
B:=(DDF=Nil);
If B then
begin
DDF:=FRecentDicts.AddDataDict(AFileName);
DDF.Name:=DDE.DataDictionary.Name;
end;
DDF.Use;
DDF.UserData:=DDE;
AddRecentDictList(DDF,B);
AddRecentDictTree(DDF,B);
end;
procedure TMainForm.SaveCurrentEditor;
begin
If Assigned(CurrentEditor) then
With CurrentEditor.DataDictionary do
if (FileName='') Then
SaveCurrentEditorAs
else
begin
StartStatus;
Try
CurrentEditor.SaveToFile(FileName);
Finally
StopStatus;
end;
end;
end;
procedure TMainForm.SaveCurrentEditorAs;
Var
DDF : TRecentDataDict;
begin
If Assigned(CurrentEditor) then
With CurrentEditor,SDDD do
begin
If DataDictionary.FileName<>'' then
FileName:=DataDictionary.FileName;
If Execute then
begin
StartStatus;
Try
SaveToFile(FileName);
Finally
StopStatus;
end;
DDF:=FRecentDicts.FindFromUserData(CurrentEditor);
If (DDF<>Nil) then
DDF.UserData:=Nil;
DDF:=FRecentDicts.AddDataDict(FileName);
DDF.Name:=CurrentEditor.DataDictionary.Name;
DDF.UserData:=CurrentEditor;
DDF.Use;
AddRecentDictList(DDF,True);
AddRecentDictTree(DDF,True);
end;
end;
end;
function TMainForm.CloseAllEditors: Boolean;
begin
Result:=True;
PCDD.ActivePageIndex:=PCDD.PageCount-1;
While Result and ((CurrentEditor<>Nil) or (CurrentConnection<>Nil)) do
Result:=CloseCurrentTab(True)<>mrCancel;
end;
function TMainForm.CloseCurrentTab(AddCancelClose: Boolean): TModalResult;
begin
Result:=CloseTab(PCItems.ActivePage,AddCancelClose);
end;
function TMainForm.CloseTab(aTab : TTabsheet; AddCancelClose: Boolean = False): TModalResult;
begin
If (aTab is TDataDictEditor) then
Result:=CloseDataEditor(aTab as TDataDictEditor,AddCancelClose)
else if (aTab is TConnectionEditor) then
Result:=CloseConnectionEditor(aTab as TConnectionEditor)
else
Result:=mrOK;
end;
function TMainForm.CloseConnectionEditor(aTab : TConnectionEditor): TModalResult;
begin
aTab.Frame.DisConnect;
Application.ReleaseComponent(aTab);
aTab.Free;
Result:=mrOK;
end;
function TMainForm.CloseCurrentConnection: TModalResult;
begin
if CurrentConnection<>Nil then
Result:=CloseConnectionEditor(CurrentConnection)
else
Result:=mrOK;
end;
function TMainForm.CloseCurrentEditor(AddCancelClose: Boolean): TModalResult;
begin
Result:=CloseDataEditor(CurrentEditor,AddCancelClose);
end;
function TMainForm.CloseDataEditor(DD : TDataDictEditor;AddCancelClose: Boolean): TModalResult;
Var
Msg : String;
DDF : TRecentDataDict;
begin
Result:=mrYes;
If (DD=Nil) then
Exit;
If DD.Modified then
begin
Msg:=Format(SDDModified,[DD.DataDictionary.Name]);
if AddCancelClose then
Result:=QuestionDLg(SConfirmClose,Msg,mtConfirmation,
[mrYes,SSaveData,mrNo,SDontSave,mrCancel,SDontClose],0)
else
Result:=QuestionDLg(SConfirmClose,Msg,mtConfirmation,
[mrYes,SSaveData,mrNo,SDontSave],0);
If Result=mrYes then
SaveCurrentEditor;
end;
if (Result<>mrCancel) then
begin
DDF:=FRecentDicts.FindFromUserData(DD);
If (DDF<>Nil) then
DDF.UserData:=Nil;
DD.Free;
end;
end;
{ ---------------------------------------------------------------------
Data dictionary Editor Auxiliary routines
---------------------------------------------------------------------}
function TMainForm.NewDataDict: TFPDataDictionary;
Var
DD : TDataDictEditor;
begin
DD:=NewDataEditor;
Result:=DD.DataDictionary;
end;
function TMainForm.NewDataEditor: TDataDictEditor;
begin
Result:=TDataDictEditor.Create(Self);
Result.PageControl:=PCDD;
Result.Parent:=PCDD;
Result.ImageIndex:=iiConnection;
PCDD.ActivePage:=Result;
Result.DataDictionary.OnProgress:=@DoDDEprogress;
end;
{ ---------------------------------------------------------------------
Data dictionary commands
---------------------------------------------------------------------}
procedure TMainForm.ShowGenerateSQL;
Var
TN : String;
begin
if Assigned(CurrentConnection) then
CurrentConnection.Frame.CreateSQL
else
begin
If CurrentEditor.CurrentTable<>Nil then
TN:=CurrentEditor.CurrentTable.TableName;
TGenerateSQLForm.GenerateSQLDialog(CurrentEditor.DataDictionary.Tables,TN,True);
end
end;
procedure TMainForm.DeleteCurrentObject;
Var
DD : TDataDictEditor;
begin
DD:=CurrentEditor;
If Assigned(DD) then
DD.DeleteCurrentObject;
end;
procedure TMainForm.DoNewGlobalObject(AObjectType : TEditObjectType);
Var
ACaption,ALabel, AObjectName : String;
begin
AObjectName:='';
Case AObjectType of
eotTable :
begin
ACaption:=SNewTable;
ALabel:=SNewTableName
end;
eotSequence:
begin
ACaption:=SNewSequence;
ALabel:=SNewSequenceName
end;
eotDomain :
begin
ACaption:=SNewDomain;
ALabel:=SNewDomainName
end
end;
If InputQuery(ACaption,ALabel,AObjectName) then
If (AObjectName<>'') then
CurrentEditor.NewGlobalObject(AObjectName,AObjectType);
end;
procedure TMainForm.DoNewTableObject(AObjectType : TEditObjectType);
Var
ACaption,ALabel, AObjectName : String;
TD : TDDTableDef;
begin
TD:=CurrentEditor.CurrentTable;
If (TD=Nil) then
Exit;
AObjectName:='';
Case AObjectType of
eotField :
begin
ACaption:=SNewField;
ALabel:=SNewFieldName
end;
eotIndex:
begin
ACaption:=SNewIndex;
ALabel:=SNewIndexName
end;
eotForeignKey :
begin
ACaption:=SNewForeignKey;
ALabel:=SNewForeignKeyName
end
end;
If InputQuery(Format(ACaption,[TD.TableName]),ALabel,AObjectName) then
If (AObjectName<>'') then
CurrentEditor.NewTableObject(AObjectName,TD,AObjectType);
end;
procedure TMainForm.DoImport(const EngineName: String);
begin
DoImport(EngineName,'');
end;
procedure TMainForm.DoImport(const EngineName, ConnectionString: String);
Function UseNewDataDict : Boolean;
begin
Result:=(mrNo=QuestionDLG(SImportDictInto,SWhichCurrentDictToUse,mtInformation,[mrYes,SUseCurrentDict,mrNo,SUseNewDict],0))
end;
Var
DDE : TFPDDengine;
CDE : TDatadictEditor;
CS,CN : String;
L : TStringList;
B : Boolean;
begin
DDE:=CreateDictionaryEngine(EngineName,self);
Try
CS:=ConnectionString;
If (CS='') then
begin
CS:=DDE.GetConnectString;
If (CS<>'') then
if MessageDLg(SCreateConnection,mtConfirmation,[mbYes,mbNo],0)=mrYes then
GetConnectionName(CN);
end;
If (CS='') then
exit;
DDE.Connect(CS);
try
L:=TStringlist.Create;
try
L.Sorted:=True;
if GetTableList(DDE,L,B) then
begin
CDE:=CurrentEditor;
If (CDE=Nil) or UseNewDataDict then
CDE:=NewDataEditor;
Try
StartStatus;
try
DDE.OnProgress:=@DoDDEProgress;
If DDE.ImportTables(CDE.DataDictionary.Tables,L,B)>0 then
CDE.Modified:=True;
finally
StopStatus;
end;
Finally
CDE.ShowDictionary;
end;
end;
finally
L.Free;
end;
finally
DDE.Disconnect;
end;
Finally
DDE.Free
end;
end;
{ ---------------------------------------------------------------------
Recent dictionaries tab/handling
---------------------------------------------------------------------}
procedure TMainForm.OpenRecentDatadict(Sender: TObject);
begin
If (LVDicts.Selected<>Nil)
and (LVDicts.Selected.Data<>Nil) then
OpenDataDict(TRecentDataDict(LVDicts.Selected.Data));
end;
procedure TMainForm.LVDictsKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=VK_DELETE then
DeleteRecentDataDict;
end;
procedure TMainForm.DeleteRecentDataDict;
Var
D: TRecentDatadict;
begin
D:=SelectedRecentDataDict;
If Assigned(D) then
begin
FRecentDicts.Delete(D.Index);
FindLI(LVDicts,D).Free;
FindTN(FNRecentDictionaries,D).Free;
end;
end;
procedure TMainForm.MIDataDictClick(Sender: TObject);
begin
MIDataDict.Items[0].Clear;
ShowImportRecentconnections;
ShowDDImports;
end;
procedure TMainForm.DoCloseTabClick(Sender: TObject);
begin
CloseTab(Sender as TTabSheet,True);
end;
procedure TMainForm.PMAllPopup(Sender: TObject);
Type
TOption = (oConnection,oDataDict);
TOptions = Set of TOption;
Var
TN : TTreeNode;
S : TOptions;
begin
TN:=TVAll.Selected;
S:=[];
if Assigned(TN) and Assigned(TN.Data) then
if TObject(TN.Data).InheritsFrom(TRecentConnection) then
S:=[oConnection]
else if TObject(TN.Data).InheritsFrom(TRecentDatadict) then
S:=[oDataDict];
PMINewConnectionA.Visible:=True;
PMIOpenConnectionA.Visible:=oConnection in S;
PMIDeleteConnectionA.Visible:=oConnection in S;
PMINewDataDictA.Visible:=True;
PMIOpenDataDictA.Visible:=oDataDict in S;
PMIDeleteDataDictA.Visible:=oDataDict in S;
end;
function TMainForm.FindLi(LV: TListView; RI: TRecentItem): TListItem;
Var
LI : TListItem;
I : Integer;
begin
I:=LV.Items.Count-1;
Result:=Nil;
While (Result=Nil) and (I>=0) do
begin
LI:=LV.Items[i];
If (LI.Data=Pointer(RI)) then
Result:=Li;
Dec(I);
end;
end;
function TMainForm.FindTN(AParent: TTreeNode; RI: TRecentItem): TTreeNode;
begin
Result:=APArent.GetFirstChild;
While (Result<>Nil) and (Result.Data<>Pointer(RI)) do
Result:=Result.GetNextSibling;
end;
procedure TMainForm.AddRecentDictList(DF: TRecentDataDict; AssumeNew: Boolean);
Var
LI : TListItem;
begin
If AssumeNew then
LI:=LVDicts.Items.Add
else
begin
LI:=FindLi(LVDicts,DF);
If (Li=Nil) then
LI:=LVDicts.Items.Add
else
LI.SubItems.Clear
end;
LI.Caption:=DF.Name;
LI.SubItems.Add(DF.FileName);
LI.SubItems.Add(DateTimeToStr(DF.LastUse));
LI.Data:=DF;
end;
procedure TMainForm.AddRecentDictTree(DF: TRecentDataDict; AssumeNew: Boolean);
Var
TN : TTreeNode;
begin
TN:=Nil;
If Not AssumeNew then
TN:=FindTN(FNRecentDictionaries,DF);
If (TN=Nil) then
TN:=TVAll.Items.AddChild(FNRecentDictionaries,DF.Name);
TN.DeleteChildren;
TVAll.Items.AddChild(TN,sld_Recentlv2+': '+DF.Filename);
TVAll.Items.AddChild(TN,sld_Recentlv3+': '+DateTimeToStr(DF.LastUse));
TN.Data:=DF;
TN.ImageIndex:=iiDataDict;
TN.SelectedIndex:=iiDataDict;
end;
{ ---------------------------------------------------------------------
Connection handling
---------------------------------------------------------------------}
procedure TMainForm.AddRecentConnectionList(RC: TRecentConnection;
AssumeNew: Boolean);
Var
LI : TListItem;
begin
If AssumeNew then
LI:=LVConnections.Items.Add
else
begin
LI:=FindLI(LVConnections,RC);
If (Li=Nil) then
LI:=LVConnections.Items.Add
else
LI.SubItems.Clear
end;
LI.Caption:=RC.Name;
LI.SubItems.Add(RC.EngineName);
LI.SubItems.Add(DateTimeToStr(RC.LastUse));
LI.SubItems.Add(RC.ConnectionString);
LI.Data:=RC;
end;
procedure TMainForm.AddRecentConnectionTree(RC: TRecentConnection; AssumeNew: Boolean);
Var
TN : TTreeNode;
begin
If Not AssumeNew then
TN:=FindTN(FNRecentConnections,RC)
else
TN:=Nil;
if TN=Nil then
TN:=TVAll.Items.AddChild(FNRecentConnections,RC.Name);
TN.DeleteChildren;
TVAll.Items.AddChild(TN,sld_Connectionlv2+': '+RC.EngineName);
TVAll.Items.AddChild(TN,sld_Connectionlv3+': '+DateTimeToStr(RC.LastUse));
TVAll.Items.AddChild(TN,sld_Connectionlv2+': '+RC.ConnectionString);
TN.Data:=RC;
TN.ImageIndex:=iiConnection;
TN.SelectedIndex:=iiConnection;
end;
function TMainForm.GetConnectionName(out AName: String): Boolean;
Var
OK : Boolean;
RC : TRecentConnection;
begin
Result:=False;
RC:=Nil;
Repeat
AName:='';
InputQuery(SNewConnection,SConnectionDescription,AName);
RC:=FRecentConnections.FindFromName(AName);
If (RC<>Nil) then
case MessageDlg(Format(SConnectionNameExists,[AName]),mtInformation,[mbYes,mbNo,mbCancel],0) of
mrYes : OK:=true;
mrNo : OK:=False;
mrCancel : Exit;
else
OK:=False;
end
else
OK:=True;
Until OK;
If (RC=Nil) then
RC:=FRecentConnections.AddConnection(AName);
Result:=True;
end;
procedure TMainForm.OpenConnection(RC : TRecentConnection);
Var
DDE : TFPDDengine;
CDE : TConnectionEditor;
begin
RC.Use;
DDE:=CreateDictionaryEngine(RC.EngineName,Self);
CDE:=NewConnectionEditor(RC.Name);
CDE.Frame.Engine:=DDE;
CDE.Frame.Connect(RC.ConnectionString);
end;
procedure TMainForm.NewConnection(EngineName : String);
Var
DDE : TFPDDengine;
CDE : TConnectionEditor;
CS,AName : String;
RC : TRecentConnection;
begin
DDE:=CreateDictionaryEngine(EngineName,Self);
CS:=DDE.GetConnectString;
If (CS='') then
exit;
If not GetConnectionName(AName) then
Exit;
RC:=FRecentConnections.FindFromName(AName);
RC.ConnectionString:=CS;
RC.EngineName:=EngineName;
RC.Use;
CDE:=NewConnectionEditor(Aname);
CDE.Frame.Engine:=DDE;
CDE.Frame.Connect(CS);
ShowRecentConnections;
end;
function TMainForm.NewConnectionEditor(AName: String): TConnectionEditor;
begin
Result:=TConnectioneditor.Create(Self);
Result.PageControl:=PCDD;
Result.Parent:=PCDD;
Result.Frame.Description:=AName;
Result.ImageIndex:=iiConnection;
Result.Caption:=aName;
PCDD.ActivePage:=Result;
end;
procedure TMainForm.NewConnection;
Var
ET : String;
begin
If SelectEngineType(ET) then
NewConnection(ET);
end;
function TMainForm.SelectEngineType(out EngineName: String): Boolean;
begin
With TSelectConnectionTypeForm.Create(Self) do
try
Result:=(ShowModal=mrOK);
If Result then
EngineName:=SelectedConnection;
finally
Free;
end;
end;
procedure TranslateStrs;
const
ext = '.%s.po';
var
LangID1, basedir, olddir: String;
LangID: TLanguageID;
begin
olddir := GetCurrentDir;
//
SetCurrentDir(ExtractFilePath(Application.Exename));
basedir := AppendPathDelim('..') + AppendPathDelim('..');
//
LangID1 := Application.GetOptionValue('language');
if Trim(LangId1) = '' then
begin
LangID := GetLanguageID;
LangID1 := LangID.LanguageID;
end
else
LangID := GetLanguageIDFromLocaleName(LangID1);
TranslateUnitResourceStrings('sdb_consts',basedir+
'components/dbexport/languages/sdb_consts'+ext, LangID1,LangID.LanguageCode);
TranslateUnitResourceStrings('ldd_consts',basedir+
'components/datadict/languages/ldd_consts'+ext, LangID1,LangID.LanguageCode);
TranslateUnitResourceStrings('lclstrconsts',basedir+
'lcl/languages/lclstrconsts'+ext, LangID1,LangID.LanguageCode);
TranslateUnitResourceStrings('lazdatadeskstr',basedir+
'tools/lazdatadesktop/languages/lazdatadesktop'+ext, LangID1,LangID.LanguageCode);
//
SetCurrentDir(olddir);
end;
initialization
TranslateStrs;
end.