From e9c10e67f80c01158deb886a1f1c4fb4b5194753 Mon Sep 17 00:00:00 2001 From: david Date: Fri, 17 Aug 2007 15:03:54 +0000 Subject: [PATCH] =?UTF-8?q?Importaci=C3=B3n=20inicial?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://192.168.0.254/svn/Componentes.Internos.GUISDK/trunk@4 e3f7d858-3362-1a4e-b49c-1b1bd96e4488 --- Build/Build.proj | 13 + Build/Build.properties | 9 + Build/GUISDK.proj | 58 ++++ Lib/D7/uCustomView.dfm | 7 + Packages/GUISDK_D10.bdsproj | 508 ++++++++++++++++++++++++++++++++++ Packages/GUISDK_D10.cfg | 41 +++ Packages/GUISDK_D10.dpk | 43 +++ Packages/GUISDK_D10.dproj | 135 +++++++++ Packages/GUISDK_D10.drc | 14 + Packages/GUISDK_D10.res | Bin 0 -> 5056 bytes Packages/GUISDK_D2007.dpk | 44 +++ Packages/GUISDK_D2007.res | Bin 0 -> 5056 bytes Packages/GUISDK_D7.cfg | 42 +++ Packages/GUISDK_D7.dof | 501 +++++++++++++++++++++++++++++++++ Packages/GUISDK_D7.dpk | 43 +++ Packages/GUISDK_D7.drc | 14 + Packages/GUISDK_D7.res | Bin 0 -> 1536 bytes Sources/uCustomEditor.dfm | 18 ++ Sources/uCustomEditor.pas | 319 +++++++++++++++++++++ Sources/uCustomView.dfm | 7 + Sources/uCustomView.pas | 244 ++++++++++++++++ Sources/uGUIBase.pas | 128 +++++++++ Sources/uGUIUtils.pas | 51 ++++ Templates/uEditorTemplate.ddp | Bin 0 -> 51 bytes Templates/uEditorTemplate.dfm | 16 ++ Templates/uEditorTemplate.pas | 28 ++ 26 files changed, 2283 insertions(+) create mode 100644 Build/Build.proj create mode 100644 Build/Build.properties create mode 100644 Build/GUISDK.proj create mode 100644 Lib/D7/uCustomView.dfm create mode 100644 Packages/GUISDK_D10.bdsproj create mode 100644 Packages/GUISDK_D10.cfg create mode 100644 Packages/GUISDK_D10.dpk create mode 100644 Packages/GUISDK_D10.dproj create mode 100644 Packages/GUISDK_D10.drc create mode 100644 Packages/GUISDK_D10.res create mode 100644 Packages/GUISDK_D2007.dpk create mode 100644 Packages/GUISDK_D2007.res create mode 100644 Packages/GUISDK_D7.cfg create mode 100644 Packages/GUISDK_D7.dof create mode 100644 Packages/GUISDK_D7.dpk create mode 100644 Packages/GUISDK_D7.drc create mode 100644 Packages/GUISDK_D7.res create mode 100644 Sources/uCustomEditor.dfm create mode 100644 Sources/uCustomEditor.pas create mode 100644 Sources/uCustomView.dfm create mode 100644 Sources/uCustomView.pas create mode 100644 Sources/uGUIBase.pas create mode 100644 Sources/uGUIUtils.pas create mode 100644 Templates/uEditorTemplate.ddp create mode 100644 Templates/uEditorTemplate.dfm create mode 100644 Templates/uEditorTemplate.pas diff --git a/Build/Build.proj b/Build/Build.proj new file mode 100644 index 0000000..d1cc295 --- /dev/null +++ b/Build/Build.proj @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/Build/Build.properties b/Build/Build.properties new file mode 100644 index 0000000..b71f699 --- /dev/null +++ b/Build/Build.properties @@ -0,0 +1,9 @@ + + + + $(MSBuildProjectDirectory)\.. + $(BaseFolder)\Sources + $(BaseFolder)\Packages + $(BaseFolder)\Lib\$(DelphiVersion) + + diff --git a/Build/GUISDK.proj b/Build/GUISDK.proj new file mode 100644 index 0000000..e320e97 --- /dev/null +++ b/Build/GUISDK.proj @@ -0,0 +1,58 @@ + + + + + + + + Release + AnyCPU + $(OutputFolder)\GUISDK_$(DelphiVersion).bpl + + + + + + + + + False + False + 0 + 0 + $(OutputFolder) + $(OutputFolder) + $(OutputFolder) + $(OutputFolder) + $(OutputFolder);$(SourceFolder) + $(OutputFolder) + $(OutputFolder) + $(OutputFolder) + False + RELEASE + + + + + + + +
CustomEditor
+
+ +
CustomView
+
+ + + + + + + + + + + +
+ +
\ No newline at end of file diff --git a/Lib/D7/uCustomView.dfm b/Lib/D7/uCustomView.dfm new file mode 100644 index 0000000..98f9074 --- /dev/null +++ b/Lib/D7/uCustomView.dfm @@ -0,0 +1,7 @@ +object CustomView: TCustomView + Left = 0 + Top = 0 + Width = 320 + Height = 240 + TabOrder = 0 +end diff --git a/Packages/GUISDK_D10.bdsproj b/Packages/GUISDK_D10.bdsproj new file mode 100644 index 0000000..30a2163 --- /dev/null +++ b/Packages/GUISDK_D10.bdsproj @@ -0,0 +1,508 @@ + + + + + + + + + + + + GUISDK_D10.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 3 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + GUI SDK para Delphi 10 + + + + ..\Lib\D10 + + + ..\Lib\D10;..\Source + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + True + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 3082 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + + + ExpressBars by Developer Express Inc. + ExpressCommonLibrary by Developer Express Inc. + ExpressBars DBNavigator by Developer Express Inc. + ExpressBars extended DB items by Developer Express Inc. + ExpressBars extended items by Developer Express Inc. + ExpressDocking Library by Developer Express Inc. + ExpressLayout Control by Developer Express Inc. + ExpressNavBar by Developer Express Inc. + ExpressGDI+ Library by Developer Express Inc. + ExpressPrinting System by Developer Express Inc. + ExpressSideBar by Developer Express Inc. + + + + diff --git a/Packages/GUISDK_D10.cfg b/Packages/GUISDK_D10.cfg new file mode 100644 index 0000000..ad1c7a2 --- /dev/null +++ b/Packages/GUISDK_D10.cfg @@ -0,0 +1,41 @@ +-$A8 +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-GD +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-N0"..\Lib\D10" +-LE"C:\Documents and Settings\David\Mis documentos\Borland Studio Projects\Bpl" +-LN"C:\Documents and Settings\David\Mis documentos\Borland Studio Projects\Bpl" +-Z +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/Packages/GUISDK_D10.dpk b/Packages/GUISDK_D10.dpk new file mode 100644 index 0000000..4988833 --- /dev/null +++ b/Packages/GUISDK_D10.dpk @@ -0,0 +1,43 @@ +package GUISDK_D10; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'GUI SDK para Delphi 10'} +{$IMPLICITBUILD OFF} + +requires + vcl, + rtl, + designide, + vclactnband, + vclx, + cfpack_d10, + ccpack10; + +contains + uCustomView in '..\Sources\uCustomView.pas' {CustomView: TFrame}, + uCustomEditor in '..\Sources\uCustomEditor.pas' {CustomEditor}, + uGUIBase in '..\Sources\uGUIBase.pas', + uGUIUtils in '..\Sources\uGUIUtils.pas'; + +end. diff --git a/Packages/GUISDK_D10.dproj b/Packages/GUISDK_D10.dproj new file mode 100644 index 0000000..32a6950 --- /dev/null +++ b/Packages/GUISDK_D10.dproj @@ -0,0 +1,135 @@ + + + {d159ebd0-959c-44de-808b-70cd0d38253d} + GUISDK_D10.dpk + Debug + AnyCPU + DCC32 + C:\Documents and Settings\All Users\Documentos\RAD Studio\5.0\Bpl\GUISDK_D10.bpl + + + 7.0 + False + False + 0 + 3 + ..\Lib\D10 + ..\Lib\D10 + ..\Lib\D10 + RELEASE + + + 7.0 + 3 + ..\Lib\D10 + ..\Lib\D10 + ..\Lib\D10 + DEBUG + + + Delphi.Personality + Package + + + False + True + False + + + GUI SDK para Delphi 10 + False + False + False + + + True + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 3082 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + + + + + + + + + + + + + + + + + + + + + + ExpressBars by Developer Express Inc. + ExpressCommonLibrary by Developer Express Inc. + ExpressBars DBNavigator by Developer Express Inc. + ExpressBars extended DB items by Developer Express Inc. + ExpressBars extended items by Developer Express Inc. + ExpressDocking Library by Developer Express Inc. + ExpressLayout Control by Developer Express Inc. + ExpressNavBar by Developer Express Inc. + ExpressGDI+ Library by Developer Express Inc. + ExpressPrinting System by Developer Express Inc. + ExpressSideBar by Developer Express Inc. + + + GUISDK_D10.dpk + + + + + + + MainSource + + +
CustomEditor
+
+ +
CustomView
+
+ + + + + + + + + + + +
+ +
\ No newline at end of file diff --git a/Packages/GUISDK_D10.drc b/Packages/GUISDK_D10.drc new file mode 100644 index 0000000..7642ac9 --- /dev/null +++ b/Packages/GUISDK_D10.drc @@ -0,0 +1,14 @@ +/* VER180 + Generated by the Borland Delphi Pascal Compiler + because -GD or --drc was supplied to the compiler. + + This file contains compiler-generated resources that + were bound to the executable. + If this file is empty, then no compiler-generated + resources were bound to the produced executable. +*/ + +STRINGTABLE +BEGIN +END + diff --git a/Packages/GUISDK_D10.res b/Packages/GUISDK_D10.res new file mode 100644 index 0000000000000000000000000000000000000000..86c94e6ada7b3c85f6761b1ee234a9f34ef3c861 GIT binary patch literal 5056 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 TCustomEditor) and not (csDesigning in ComponentState) then + begin + Include(FFormState, fsCreating); + try + if not InitInheritedComponent(Self, TCustomEditor) then + raise EResNotFound.CreateFmt('Error %s', [ClassName]); + finally + Exclude(FFormState, fsCreating); + end; + if OldCreateOrder then DoCreate; + end; + finally + GlobalNameSpace.EndWrite; + end; + + + +{ GlobalNameSpace.BeginWrite; + try + if (ClassType <> TCustomEditor) and + not (csDesigning in ComponentState) then + begin + if not InitInheritedComponent(Self, TCustomEditor) then + raise Exception.Create('Error'); + if OldCreateOrder and Assigned(OnCreate) then + OnCreate(Self); + end; + finally + GlobalNameSpace.EndWrite; + end;} +end; + +destructor TCustomEditor.Destroy; +var + i: Integer; +begin + for i := FViews.Count - 1 downto 0 do + FViews.Delete(i); + + FreeAndNIL(FViews); + + inherited Destroy; +end; + +function TCustomEditor.CreateView(const AViewClass : TCustomViewClass): + IInterface; +begin + Result := FViews[FViews.Add(AViewClass.Create(Self))]; +end; + +function TCustomEditor.FindView(const IID: TGUID): IInterface; +var + i: Integer; + aObj: ICustomView; +begin + aObj := NIL; + Result := NIL; + for i := 0 to (FViews.Count - 1) do + begin + FViews.Items[i].QueryInterface(IID, aObj); + if Assigned(aObj) then + begin + Result := aObj; + Break; + end; + end; +end; + +function TCustomEditor.GetInstance: TObject; +begin + Result := Self; +end; + +function TCustomEditor.GetInstanceID: Integer; +begin + Result := FInstanceID; +end; + +function TCustomEditor.GetModified: Boolean; +begin + Result := ControlIsModified(Self); + if Assigned(FOnGetModified) then + FOnGetModified(Self, Result); +end; + +function TCustomEditor.GetReadOnly: Boolean; +begin + Result := FReadOnly; +end; + +function TCustomEditor.GetValid: Boolean; +var + i: Integer; + aObj: ICustomView; +begin + aObj := NIL; + Result := True; + for i := 0 to (FViews.Count - 1) do + begin + FViews.Items[i].QueryInterface(IValidable, aObj); + if Assigned(aObj) then + Result := Result AND aObj.Valid; + if not Result then + Break; + end; +end; + +procedure TCustomEditor.SetInstanceID(Value: Integer); +begin + FInstanceID := Value; +end; + +procedure TCustomEditor.SetReadOnly(Value: Boolean); +begin + FReadOnly := Value; +end; + +procedure TCustomEditor.ShowEmbedded; +var + AMainForm: IHostForm; +begin + AMainForm := NIL; + if not Supports(Application.MainForm, IHostForm, AMainForm) then + AMainForm := FindHostForm; + + if not Assigned(AMainForm) then + raise Exception.Create('No se ha encontrado el formulario principal (ShowEmbedded)') + else + AMainForm.ShowEmbedded(Self) +end; + +procedure TCustomEditor.ShowEmbedded(const AParent : TWinControl); +begin + Parent := AParent; + Align := alClient; + BorderIcons := []; + BorderStyle := bsNone; + Show; + SetFocus; +end; + +function TCustomEditor.GetOnGetModified: TOnGetModifiedEvent; +begin + Result := FOnGetModified; +end; + +function TCustomEditor.GetOnViewModified: TOnViewModifiedEvent; +begin + Result := FOnViewModified; +end; + +procedure TCustomEditor.SetOnGetModified(const Value: TOnGetModifiedEvent); +begin + FOnGetModified := Value; +end; + +procedure TCustomEditor.SetOnViewModified(const Value: TOnViewModifiedEvent); +begin + FOnViewModified := Value; +end; + +function TCustomEditor.CloseQuery: Boolean; +var + i: Integer; + aIntf: IValidable; +begin + Result := inherited CloseQuery; + if Result then + for i := 0 to FViews.Count - 1 do + begin + FViews.Items[i].QueryInterface(IValidable, aIntf); + if Assigned(aIntf) then + begin + Result := (Result and aIntf.Valid); + if not Result then + break; + end; + end; +end; + +procedure TCustomEditor.SetModified(const Value: Boolean); +begin + if Value = False then + ResetModifiedControl(Self); + + if Assigned(FOnViewModified) then + FOnViewModified(Self); +end; + +function TCustomEditor.FindHostForm: IHostForm; +var + i : integer; + AMainForm : IHostForm; +begin + Result := NIL; + for i := 0 to Application.ComponentCount do + if Supports(Application.Components[i], IHostForm, AMainForm) then + begin + Result := AMainForm; + Break; + end; +end; + +{------------------------------------------------------------------------------- + Sobreescribo 'UpdateActions' por un fallo en Delphi que hace + consumir mucha CPU cuando se usan acciones con formularios metidos + uno dentro de otro. +-------------------------------------------------------------------------------} +procedure TCustomEditor.UpdateActions; +var + I: Integer; + + procedure TraverseClients(Container: TWinControl); + var + I: Integer; + Control: TControl; + begin + Application.ProcessMessages; // <--- Modificación + if Container.Showing then + for I := 0 to Container.ControlCount - 1 do + begin + Control := Container.Controls[I]; + if (csActionClient in Control.ControlStyle) and Control.Visible then + Control.InitiateAction; + + if Control is TWinControl then + TraverseClients(TWinControl(Control)); + end; + end; + +begin + if (csDesigning in ComponentState) or not Showing then Exit; + { Update form } + InitiateAction; + { Update main menu's top-most items } + if Menu <> nil then + for I := 0 to Menu.Items.Count - 1 do + with Menu.Items[I] do + if Visible then InitiateAction; + { Update any controls } + TraverseClients(Self); +end; + +end. diff --git a/Sources/uCustomView.dfm b/Sources/uCustomView.dfm new file mode 100644 index 0000000..98f9074 --- /dev/null +++ b/Sources/uCustomView.dfm @@ -0,0 +1,7 @@ +object CustomView: TCustomView + Left = 0 + Top = 0 + Width = 320 + Height = 240 + TabOrder = 0 +end diff --git a/Sources/uCustomView.pas b/Sources/uCustomView.pas new file mode 100644 index 0000000..5db151e --- /dev/null +++ b/Sources/uCustomView.pas @@ -0,0 +1,244 @@ +unit uCustomView; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, uGUIBase, DesignEditors; + +type + TCustomView = class(TFrame, ICustomView) + private + FOnGetModified: TOnGetModifiedEvent; + FOnViewModified: TOnViewModifiedEvent; + FReadOnly: Boolean; + FOnCreate: TNotifyEvent; + FOnDestroy: TNotifyEvent; + FOnHide: TNotifyEvent; + FOnShow: TNotifyEvent; + procedure ShowEmbedded; overload; + procedure CMShowingChanged(var Message: TMessage); message CM_SHOWINGCHANGED; + protected + FObserver: IObserver; + function GetOnGetModified: TOnGetModifiedEvent; + procedure SetOnGetModified(const Value : TOnGetModifiedEvent); + function GetOnViewModified: TOnViewModifiedEvent; + procedure SetOnViewModified(const Value : TOnViewModifiedEvent); + procedure SetModified(const Value : Boolean); virtual; + function GetModified: Boolean; virtual; + function GetReadOnly: Boolean; virtual; + function GetValid: Boolean; virtual; + procedure Release; + procedure SetReadOnly(Value: Boolean); virtual; + procedure DoCreate; virtual; + procedure DoDestroy; virtual; + procedure DoHide; dynamic; + procedure DoShow; dynamic; + public + constructor Create(AOwner: TComponent); override; + constructor CreateEmbedded(AOwner: TComponent; AParent: TWinControl); + destructor Destroy; override; + procedure ShowEmbedded(const AParent : TWinControl); overload; virtual; + property Modified: Boolean read GetModified write SetModified; + published + property OnGetModified: TOnGetModifiedEvent read GetOnGetModified write + SetOnGetModified; + property OnViewModified: TOnViewModifiedEvent read GetOnViewModified write + SetOnViewModified; + property ReadOnly: Boolean read GetReadOnly write SetReadOnly; + property Valid: Boolean read GetValid; + property OnCreate: TNotifyEvent read FOnCreate write FOnCreate; + property OnDestroy: TNotifyEvent read FOnDestroy write FOnDestroy; + property OnHide: TNotifyEvent read FOnHide write FOnHide; + property OnShow: TNotifyEvent read FOnShow write FOnShow; + end; + + TCustomViewClass = class of TCustomView; + + TCustomViewModule = class(TCustomModule) + public + function Nestable: Boolean; override; + end; + +procedure Register; + +implementation + +{$R *.dfm} + +{ TCustomView } + +uses + DesignIntf, uGUIUtils, RTLConsts; + +procedure Register; +begin + RegisterCustomModule(TCustomView, TCustomViewModule); +end; + +{ +********************************* TCustomView ********************************** +} +procedure TCustomView.CMShowingChanged(var Message: TMessage); +begin + inherited; + + if Showing then + begin + // Put your OnShow logic here. + // When this is called, the frame's window handle has already + // been created, as have the handles for the controls on the + // frame - so you can do most anything you need to do. + if Assigned(FOnShow) then + FOnShow(Self); + end + else + begin + // Put your OnHide logic here, but see the caveats below. + if Assigned(FOnHide) then + FOnHide(Self); + end; +end; + +constructor TCustomView.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FObserver := NIL; + DoCreate; +end; + +constructor TCustomView.CreateEmbedded(AOwner: TComponent; AParent: + TWinControl); +begin + Create(AOwner); + Parent := AParent; + Align := alClient; +end; + +destructor TCustomView.Destroy; +begin + DoDestroy; + inherited Destroy; +end; + +procedure TCustomView.DoCreate; +begin + if Assigned(FOnCreate) then + begin + try + FOnCreate(Self); + except + Application.HandleException(Self); + end; + end; +end; + +procedure TCustomView.DoDestroy; +begin + if Assigned(FOnDestroy) then + begin + try + FOnDestroy(Self); + except + Application.HandleException(Self); + end; + end; +end; + +procedure TCustomView.DoHide; +begin + if Assigned(FOnHide) then + begin + try + FOnHide(Self); + except + Application.HandleException(Self); + end; + end; +end; + +procedure TCustomView.DoShow; +begin + if Assigned(FOnShow) then + begin + try + FOnShow(Self); + except + Application.HandleException(Self); + end; + end; +end; + +function TCustomView.GetModified: Boolean; +begin + Result := ControlIsModified(Self); + if Assigned(FOnGetModified) then + FOnGetModified(Self, Result); +end; + +function TCustomView.GetOnGetModified: TOnGetModifiedEvent; +begin + Result := FOnGetModified; +end; + +function TCustomView.GetOnViewModified: TOnViewModifiedEvent; +begin + Result := FOnViewModified; +end; + +function TCustomView.GetReadOnly: Boolean; +begin + Result := FReadOnly; +end; + +function TCustomView.GetValid: Boolean; +begin + Result := True; +end; + +procedure TCustomView.Release; +begin + Free; +end; + +procedure TCustomView.SetModified(const Value: Boolean); +begin + if Assigned(FOnViewModified) then + FOnViewModified(Self); +end; + +procedure TCustomView.SetOnGetModified(const Value: TOnGetModifiedEvent); +begin + FOnGetModified := Value; +end; + +procedure TCustomView.SetOnViewModified(const Value: TOnViewModifiedEvent); +begin + FOnViewModified := Value; +end; + +procedure TCustomView.SetReadOnly(Value: Boolean); +begin + FReadOnly := Value; +end; + +procedure TCustomView.ShowEmbedded; +begin + Align := alClient; + Show; +end; + +procedure TCustomView.ShowEmbedded(const AParent : TWinControl); +begin + Parent := AParent; + ShowEmbedded; +end; + +{ TCustomViewModule } + +function TCustomViewModule.Nestable: Boolean; +begin + Result := True; +end; + +end. diff --git a/Sources/uGUIBase.pas b/Sources/uGUIBase.pas new file mode 100644 index 0000000..eb742d9 --- /dev/null +++ b/Sources/uGUIBase.pas @@ -0,0 +1,128 @@ +unit uGUIBase; + +interface + +uses + Forms, Controls, Contnrs, Classes; + +type + TOnGetModifiedEvent = procedure (Sender: TObject; var Modified: Boolean) of object; + TOnViewModifiedEvent = procedure (Sender: TObject) of object; + + IEmbeddedable = interface(IInterface) + ['{A1668B17-B355-4688-A78A-B30AE3C8C81E}'] + procedure Release; + procedure ShowEmbedded; overload; + procedure ShowEmbedded(const AParent : TWinControl); overload; + end; + + IModificable = interface(IEmbeddedable) + ['{7F75A327-4ACC-4E4A-8B3D-21C1241DAFBF}'] + function GetModified: Boolean; + procedure SetModified(const Value : Boolean); + property Modified: Boolean read GetModified write SetModified; + + function GetOnGetModified: TOnGetModifiedEvent; + procedure SetOnGetModified(const Value : TOnGetModifiedEvent); + property OnGetModified: TOnGetModifiedEvent read GetOnGetModified write + SetOnGetModified; + + function GetOnViewModified: TOnViewModifiedEvent; + procedure SetOnViewModified(const Value : TOnViewModifiedEvent); + property OnViewModified: TOnViewModifiedEvent read GetOnViewModified write + SetOnViewModified; + end; + + IReadOnly = interface(IModificable) + ['{2549ECF9-270F-4F3C-9852-E488C518F590}'] + function GetReadOnly: Boolean; + procedure SetReadOnly(Value: Boolean); + property ReadOnly: Boolean read GetReadOnly write SetReadOnly; + end; + + IValidable = interface(IReadOnly) + ['{A2562A5E-E3B2-4C1B-B8FE-13A410D8B3DB}'] + function GetValid: Boolean; + property Valid: Boolean read GetValid; + end; + + IInstanceAware = interface(IValidable) + ['{B6B2676A-1D8E-4597-ADDB-43734508E6F5}'] + function GetInstance: TObject; + function GetInstanceID: Integer; + procedure SetInstanceID(Value: Integer); + property InstanceID: Integer read GetInstanceID write SetInstanceID; + end; + + ICustomEditor = interface(IInstanceAware) + ['{07A3AB52-B2B0-4DE3-B470-379834BBE7DB}'] + end; + + ICustomView = interface(IValidable) + ['{98192DE2-19C5-4DA5-B4F4-F2B3782DB6E2}'] + function CanFocus: Boolean; + function Focused: Boolean; + procedure SetFocus; + procedure Update; + end; + + + IHostForm = interface(IInterface) + ['{2091401E-1F9C-4F05-8574-E9E0532780D1}'] + function GetWorkPanel: TWinControl; + property WorkPanel: TWinControl read GetWorkPanel; + procedure OnWorkPanelChanged(AEditor : ICustomEditor); + procedure ShowEmbedded(AEditor : ICustomEditor); + end; + + + IGUIManager = interface(IInterface) + ['{D0A5D2CC-36E1-4C61-8D3B-B6D00EBA3278}'] + function FindInstance(const IID: TGUID): ICustomEditor; + function GetActiveInstance: ICustomEditor; + function GetActiveInstanceIndex: Integer; + function GetInstance(Index : Integer): ICustomEditor; + function GetWorkPanel: TWinControl; + function RegisterInstance(AInstance : ICustomEditor): Boolean; + procedure ReleaseInstance(AnInstance : ICustomEditor); + procedure SetActiveInstance(Value: ICustomEditor); + procedure SetActiveInstanceIndex(Value: Integer); + procedure SetWorkPanel(const Value: TWinControl); + property ActiveInstance: ICustomEditor read GetActiveInstance write + SetActiveInstance; + property ActiveInstanceIndex: Integer read GetActiveInstanceIndex write + SetActiveInstanceIndex; + property Instances[Index : Integer]: ICustomEditor read GetInstance; + property WorkPanel: TWinControl read GetWorkPanel write SetWorkPanel; + end; + + IObservable = interface; + TObserverEvent = procedure (AObject : IObservable) of object; + IObserver = interface(IInterface) + ['{79175C66-8435-4F2F-A3E0-A53A24554A0E}'] + function GetOnNotifyObserver: TObserverEvent; + function GetOnObserverAttached: TObserverEvent; + function GetOnObserverDettached: TObserverEvent; + procedure NotifyObserver(const AObject: IObservable); + procedure ObserverAttached(AObject : IObservable); + procedure ObserverDettached(AObject : IObservable); + procedure SetOnNotifyObserver(AValue: TObserverEvent); + procedure SetOnObserverAttached(AValue: TObserverEvent); + procedure SetOnObserverDettached(AValue: TObserverEvent); + property OnNotifyObserver: TObserverEvent read GetOnNotifyObserver write + SetOnNotifyObserver; + property OnObserverAttached: TObserverEvent read GetOnObserverAttached + write SetOnObserverAttached; + property OnObserverDettached: TObserverEvent read GetOnObserverDettached + write SetOnObserverDettached; + end; + + IObservable = interface(IInterface) + ['{1FF0F081-CBBA-4728-8689-D6F506652E80}'] + procedure AddObserver(const AObserver: IObserver); + procedure RemoveObserver(const AObserver: IObserver); + end; + +implementation + +end. diff --git a/Sources/uGUIUtils.pas b/Sources/uGUIUtils.pas new file mode 100644 index 0000000..c952c9b --- /dev/null +++ b/Sources/uGUIUtils.pas @@ -0,0 +1,51 @@ +unit uGUIUtils; + +interface + +uses + Controls; + +function ControlIsModified(AControl : TWinControl) : Boolean; +procedure ResetModifiedControl(AControl : TWinControl); + +implementation + +uses + StdCtrls, uGUIBase, uCustomView; + +function ControlIsModified(AControl : TWinControl) : Boolean; +var + i : integer; +begin + Result := False; + + if AControl is TCustomEdit then + Result := Result OR (AControl as TCustomEdit).Modified + else + if not Result then + for i := 0 to AControl.ControlCount - 1 do + begin + if AControl.Controls[i] is TWinControl then + Result := ControlIsModified((AControl.Controls[i] as TWinControl)); + + if Result then + Exit; + end; +end; + + +procedure ResetModifiedControl(AControl : TWinControl); +var + i : integer; +begin + if AControl is TCustomEdit then + (AControl as TCustomEdit).Modified := False + else + for i := 0 to AControl.ControlCount - 1 do + begin + if AControl.Controls[i] is TWinControl then + ResetModifiedControl((AControl.Controls[i] as TWinControl)); + end; +end; + +end. diff --git a/Templates/uEditorTemplate.ddp b/Templates/uEditorTemplate.ddp new file mode 100644 index 0000000000000000000000000000000000000000..4370276c196a7fa73d6f8917622cba1c4e033dee GIT binary patch literal 51 zcmZRVaB=ks@bJ`g@pN<#a`e>;@DB=c^Y`)e=VxGe;K0Pl$;KI)SCUzhlbT}4#=r!G E07ZHWvj6}9 literal 0 HcmV?d00001 diff --git a/Templates/uEditorTemplate.dfm b/Templates/uEditorTemplate.dfm new file mode 100644 index 0000000..758d7ab --- /dev/null +++ b/Templates/uEditorTemplate.dfm @@ -0,0 +1,16 @@ +object Form1: TForm1 + Left = 910 + Top = 277 + Width = 245 + Height = 153 + Caption = 'Form1' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + PixelsPerInch = 96 + TextHeight = 13 +end diff --git a/Templates/uEditorTemplate.pas b/Templates/uEditorTemplate.pas new file mode 100644 index 0000000..5b14adf --- /dev/null +++ b/Templates/uEditorTemplate.pas @@ -0,0 +1,28 @@ +unit uEditorTemplate; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, + uCustomEditor; + +type + TForm1 = class(TCustomEditor) + private + { Private declarations } + protected + { Protected declarations } + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +{$R *.dfm} + + +end.