📄 eermodel.pas
字号:
unit EERModel;
//----------------------------------------------------------------------------------------------------------------------
//
// This file is part of fabFORCE DBDesigner4.
// Copyright (C) 2002, 2003 Michael G. Zinner, www.fabFORCE.net
//
// DBDesigner4 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.
//
// DBDesigner4 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.
//
// You should have received a copy of the GNU General Public License
// along with DBDesigner4; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
//----------------------------------------------------------------------------------------------------------------------
//
// Unit EERModel.pas
// -----------------
// Version 2.2, 01.08.2003, Mike
// Description
// Contains all classes for the EERModel
//
// Changes:
// Version 2.2, 01.08.2003, Mike
// New XML Parser
// Version 2.1, 03.05.2003, Mike
// Constraint object mode when user holds shift
// Apply datatype and Options to FK columns when Source Key was changed
// Version 2.0, 18.04.2003, Mike
// Changed all Records to TObjects.
// Version 1.9, 15.04.2003, Mike
// Included automatic fix of ENUM/SET datatype defs when loaded from model / inifile
// Version 1.8, 11.04.2003, Mike
// 1.6 was buggy again, now FK References fixed for MySQL4.0 INNODB,
// added FKPrefix, FKPostfix
// added TEER_Datatype.EditParamsAsString to support ENUM and SET datatypes
// Version 1.7, 08.04.2003, Mike
// Changed initial RefDef to NoAction for OnDelete/OnUpdate
// Version 1.6, 08.04.2003, Mike
// Fixed bug in TEERTable.GetSQLCreateCode, FK References were created
// using a wrong syntax
// Version 1.5, 04.04.2003, Mike / Shannon Weyrick
// Added TableNameInRefs param and functionality
// Get default settings for PositionGrid and TableNameInRefs from DMEER
// Version 1.4, 28.03.2003, Mike
// Added PositionGrid Parameters to model and implemtented functionality
// Store and Load PositionGrid Parameters
// Version 1.3, 25.03.2003, Mike
// Changes TEERImage.SetXML and TEERImage.GetXML to support new
// Encoding/Decoding functions in DMMain using a memory stream
// Version 1.2, 21.03.2003, Mike
// EERModel.LoadFromFile: When getting MaxID of the model,
// ColumnIDs and IndexIDs were ignored - fixed.
// Version 1.1, 20.03.2003, Mike
// added PrevTableName for DBSync (rename table cmds)
// Indices now store the IndexColumn parmeter length (for blob fields)
// Added AddToLog parameter for DeleteSelectedObjs and change call in
// EERModel LoadFromFile
// Version 1.0, 13.03.2003, Mike
// initial version, Mike
//
//----------------------------------------------------------------------------------------------------------------------
{$I DBDesigner4.inc}
interface
uses
SysUtils, Types, Classes, QGraphics, QControls, QForms, QDialogs,
QStdCtrls, QExtCtrls, QImgList, QMenus, QTypes, IniFiles, Math, StrUtils,
QPrinters, QClipbrd, QComCtrls, Qt,
{$IFDEF USE_IXMLDBMODELType}
XMLDoc,
EERModel_XML,
{$ENDIF}
Contnrs,
LibXmlParser;
type
TEERObject = (EERAllObjects, EERNote, EERRegion, EERRelation, EERTable, EERImage, EERStoredProc);
TEERObjectSet = set of TEERObject;
TEERObjectAlign = (EERObjAlignLeft, EERObjAlignRight, EERObjAlignTop, EERObjAlignBottom, EERObjAlignCenterH, EERObjAlignCenterV, EERObjAlignDistributeH, EERObjAlignDistributeV);
//-----------------------------------------------
TEERPluginData = class(TPersistent)
constructor Create(AOwner: TComponent); overload;
destructor Destroy; override;
public
Owner: TComponent;
PluginName: string; // Name of the Plugin which stored the Data
Obj_id: integer; // ID of the Object the Data is related to, <0 if non
Params: TStringList; // Stringlist which stores the values
Data: Pointer; // Additional binary data (NOTE: the data is
// not stored, for temporary use only)
end;
TEERLinkedModel = class(TPersistent)
constructor Create(AOwner: TComponent); overload;
public
Owner: TComponent;
IDLinkedModel: integer;
ModelName: string;
IDModel: integer;
IsStoredInDB: Boolean;
ModelFilename: string;
DriverName, DBConnName, HostCaption,
HostName, Database, User: string;
end;
// -----------------------------------------------
// Declaration of the MAIN-Class
TEERModel = class(TPanel)
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
//Load initial Datatypes from ini-file
procedure LoadDataTypesFromIniFile;
//Paint Model function
procedure PaintModel(theCanvas: TCanvas; theZoomfac: double = -1;
x: integer = 0; y: integer = 0; w: integer = 0; h: integer = 0;
Objs2Paint: TEERObjectSet = [EERAllObjects];
theDPI: integer = 72; doDrawText: Boolean = True);
procedure PaintModelToImage(ModelBmp: TBitmap; PaintSelectedOnly: Boolean = False);
procedure DrawRelIcon(theCanvas: TCanvas; theRect: TRect; theBmpNr: integer);
//Place new Objects
function NewTable(x, y: integer; LogTheAction: Boolean): Pointer;
function NewRelation(RelationKind: integer;
theSrcTable, theDestTable: Pointer; LogTheAction: Boolean; FKColumnName: string = ''): Pointer;
function NewNote(x, y: integer; LogTheAction: Boolean): Pointer;
function NewRegion(x, y, w, h: integer; LogTheAction: Boolean): Pointer;
procedure SendRegionsToBack;
function NewImage(x, y, w, h: integer; LogTheAction: Boolean): Pointer;
//Set, Get ModelName
procedure SetModelName(name: string);
function GetModelName: string;
//Set Model changed
procedure ModelHasChanged;
//Zoom Functions
procedure SetZoomFac(NewZoomFac: double; X: integer = -1; Y: integer = -1);
function GetZoomFac: double;
procedure ZoomIn(x, y: integer);
procedure ZoomOut(x, y: integer);
//Calculate a value by the Zoom Factor
function EvalZoomFac(thevalue: integer): integer;
function ReEvalZoomFac(thevalue: integer): integer;
//PositionMarker functions
procedure SetPositionMarker(nr: integer);
procedure GotoPositionMarker(nr: integer);
//Font functions
function GetFontHeight: integer;
function GetTextExtent(s: string): TSize;
//Load the reserved word list
procedure LoadReservedWordsFromIniFile;
//Check Functions
function CheckReservedWord(s: string): Boolean;
procedure CheckAllRelations;
//Load and store functions
procedure SaveToFile(fname: string; WriteSettings: Boolean = True;
OnlySelected: Boolean = False; UpdateModelFileName: Boolean = True);
procedure LoadFromFile(fname: string; ReadSettings: Boolean = True; SelectObjs: Boolean = False; MoveToSavedPosition: Boolean = True; AddDataToExistingModel: Boolean = True);
procedure LoadFromFile2(fname: string; ReadSettings: Boolean = True; SelectObjs: Boolean = False; MoveToSavedPosition: Boolean = True; AddDataToExistingModel: Boolean = True);
//Selection Functions
function GetSelectedObjsCount: integer;
function GetFirstSelectedObj: TObject;
procedure SelectAllObjs;
procedure DeSelectAllObjs(ExcludeObj: TObject);
procedure DeleteSelectedObjs(AddToLog: Boolean = True);
//Aligns Selected Objs
procedure AlignSelectedObjs(alignPos: TEERObjectAlign);
//Refresh Functions
procedure Refresh;
procedure RefreshFont;
procedure RefreshTblImgs;
//Action functions
procedure LogAction(ActionType, Obj_id: integer; Params: String);
procedure StartSubActionLog(ActionType: integer);
procedure LogSubAction(ActionSubType, Obj_id: integer; Params: String);
procedure EndSubAction;
procedure DeleteAction(theActionPointer: Pointer);
procedure DeleteOpenAction;
procedure UndoActions(TillAction: integer);
procedure RedoActions(TillAction: integer);
function GetActionName(ActionType: integer): string;
function GetSubActionOfObj(ActionIndex, Obj_id: integer): Pointer;
//Datatype functions
function GetDataTypeName(id: integer): string;
function GetDataTypeGroup(id: integer): integer;
function GetDataType(id: integer): Pointer;
function GetDataTypeByName(name: string): Pointer;
function GetDataTypeByNameSubst(DatatypeName: string; DatatypeSubstList: TStringList): Pointer;
//MouseOverObj functions
procedure SetMouseOverObj(Obj: TObject; SubObj: Pointer);
procedure ClearMouseOverObj;
function GetMouseOverObj: TObject;
function GetMouseOverSubObj: Pointer;
//Plugin functions
function GetPluginDataCount(PluginName: string): integer;
function GetPluginDataByIndex(PluginName: string; Index: integer): TEERPluginData;
function GetPluginDataByID(PluginName: string; ID: integer): TEERPluginData;
function AddPluginData(PluginName: string; ID: integer): TEERPluginData;
//EERObj List functions
function GetEERObjectCount(ObjType: TEERObjectSet): integer;
procedure GetEERObjectNameList(ObjType: TEERObjectSet; ObjectnamesList: TStringList; OnlySelected: Boolean=False);
procedure GetEERObjectList(ObjType: TEERObjectSet; ObjectList: TList; OnlySelected: Boolean=False);
procedure SortEERObjectListByObjName(ObjectList: TList);
procedure SortEERObjectListByOrderPos(ObjectList: TList);
//EERObj functions
function GetEERObjectByID(id: integer): Pointer;
function GetEERObjectByLinkedID(id: integer): Pointer;
function GetEERObjectByIndex(ObjType: TEERObject; Index: integer): Pointer;
function GetEERObjectByName(ObjType: TEERObject; Name: string): Pointer;
function GetEERObjectClassName(ObjType: TEERObject): string;
//EERTable functions
function GetEERTableByColumnID(id: integer): Pointer;
function GetEERIndexByID(id: integer): Pointer;
//sorts all tables in the given list by the FK Reference
//so the tables can be created / dropped in the correct order
procedure SortEERTableListByForeignKeyReferences(EERTableList: TList);
//StoredSQLCmd functions
function GetStoredSQLCmdIndex(SQLCmdType: integer; StoredPosition: string): integer;
procedure MoveSelectedEERObjects(x, y: integer);
function GetNextIDPlacedModel: integer;
function GetPlacedModelByID(id: integer): TEERLinkedModel;
protected
//Handle to Mouse Events
procedure DoMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure DoMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure DoMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure MouseEnter(AControl: TControl); override;
procedure MouseLeave(AControl: TControl); override;
//Load needed images
procedure AddImgToPopupImgList(fname: string);
procedure LoadModelBitmaps;
//CheckHelp Function
procedure CheckRelations(Tbl2Refresh: TList);
//Selection Rect functions
procedure DoSelectionRectPaint(Sender: TObject);
procedure SetSelectionRectPos(l, t, w, h: integer);
procedure GetSelectionRectPos(var selRect: TRect);
function GetSelectionRectVisible: Boolean;
procedure HideSelectionRect;
procedure SelectObjsInSelectionRect;
//Paint grid Box --> needs to be replaced
procedure DoGridPaintBoxPaint(Sender: TObject);
//Decode Datatypes ini-file data
procedure DecodeDataTypes(s: string; p: Pointer);
//Help function to move all selected objects
procedure InitialMove4AllSelectedObjs(Obj: TObject);
//Popup Menu functions
procedure CreatePopupMenus(AOwner: TComponent);
function GetGeneralObjPopupMenu(AOwner: TComponent; nr: integer): TPopupMenu;
function GetThePopupComponent(Sender: TObject): TComponent;
//Popup events
procedure PopupMenuSelectObj(Sender: TObject);
procedure PopupMenuEditObj(Sender: TObject);
procedure PopupMenuRefreshObj(Sender: TObject);
procedure PopupMenuDeleteObj(Sender: TObject);
procedure PopupMenuAlignObjs(Sender: TObject);
procedure PopupMenuCopyTableName(Sender: TObject);
procedure PopupMenuCopyTableFieldName(Sender: TObject);
procedure PopupMenuCopyTableFieldNameShow(Sender: TObject);
procedure PopupMenuCopyTableFields(Sender: TObject);
procedure PopupMenuCopyTableSQLCreate(Sender: TObject);
procedure PopupMenuCopyTableSQLDrop(Sender: TObject);
procedure PopupMenuCopyTableSQLInsert(Sender: TObject);
procedure PopupMenuSelectRegion(Sender: TObject);
procedure PopupMenuEditTable(Sender: TObject);
private
{ Private declarations }
ModelName: string;
//The current Zoom factor of the EER Model (start @ 100%)
ZoomFac: double;
//Vars for MouseAction
mouse_posx, mouse_posy, mouse_absx, mouse_absy: integer;
MouseIsDown: Boolean;
//Counter for new Tables (Table01)
NewTableCounter, NewRelCounter,
NewNoteCounter, NewRegionCounter,
NewImageCounter,
LastRegionColor: integer;
TblHeaderBmp, TblHeaderRightBmp,
TblHeaderLinkedBmp, TblHeaderRightLinkedBmp,
FieldBmp, FieldKeyBmp,
IndexBmp,
Field_FKBmp,
Index_FKBmp: TBitmap;
//Rel_Bmp: Array[0..11] of TBitmap;
PopUpMenuImgs: TImageList;
RelIconSize, RelIconDSize: integer;
//Selection PaintBox
SelectionRect: TPaintBox;
MouseOverObj: TObject;
MouseOverSubObj: Pointer;
DisableModelRefresh: Boolean;
//Reserved Words
ReservedWords: TStringList;
public
{ Public declarations }
//Name and comments
ModelComments: string;
//Model File Name
ModelFilename: string;
//Database type
DatabaseType: string;
//Model
EERModel_Width: integer;
EERModel_Height: integer;
//Table Prefixes
DefaultTablePrefix: integer;
TablePrefix: TStringList;
//Datatypes
DatatypeGroups: TObjectList;
Datatypes: TObjectList;
DefaultDataType: integer;
CommonDataType: TStringList;
//Default Database-Connections for the diff. functions
DefSyncDBConn,
DefSaveDBConn,
DefQueryDBConn: string;
//Flags
UseVersionHistroy,
AutoIncVersion,
IsChanged,
Need2RefreshNavImg,
LogActions: Boolean;
//Model Version Control
IDModel,
IDVersion: integer;
VersionStr: string;
//Temporary store the two tables for a relation
Rel_SrcTable, Rel_DestTable: TObject;
//Grid PaintBox
GridPaintBox: TPaintBox;
//Size of a Page which will be printed on the printer's canvas
ModelPrinter: string;
PageSize: TSize;
PageAspectRatio,
HPageCount,
VPageCount: double;
PageOrientation: TPrinterOrientation;
PageFormat: string;
SelectedPages: Array[0..200] of Boolean;
//DPI of the canvas to draw on
DPI: integer;
//Default Model font
DefModelFont: string;
//Indicates wether the Model is drawn to a special canvas
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -