diff --git a/Lib/D11/GUISDK_D11.bpl b/Lib/D11/GUISDK_D11.bpl
new file mode 100644
index 0000000..5dad507
Binary files /dev/null and b/Lib/D11/GUISDK_D11.bpl differ
diff --git a/Lib/D11/GUISDK_D11.dcp b/Lib/D11/GUISDK_D11.dcp
new file mode 100644
index 0000000..2d9508c
Binary files /dev/null and b/Lib/D11/GUISDK_D11.dcp differ
diff --git a/Lib/D11/GUISDK_D11.dcu b/Lib/D11/GUISDK_D11.dcu
new file mode 100644
index 0000000..eedcdde
Binary files /dev/null and b/Lib/D11/GUISDK_D11.dcu differ
diff --git a/Lib/D11/uCustomEditor.dcu b/Lib/D11/uCustomEditor.dcu
new file mode 100644
index 0000000..4f11358
Binary files /dev/null and b/Lib/D11/uCustomEditor.dcu differ
diff --git a/Lib/D11/uCustomView.dcu b/Lib/D11/uCustomView.dcu
new file mode 100644
index 0000000..84f3567
Binary files /dev/null and b/Lib/D11/uCustomView.dcu differ
diff --git a/Lib/D11/uGUIBase.dcu b/Lib/D11/uGUIBase.dcu
new file mode 100644
index 0000000..767050b
Binary files /dev/null and b/Lib/D11/uGUIBase.dcu differ
diff --git a/Lib/D11/uGUIUtils.dcu b/Lib/D11/uGUIUtils.dcu
new file mode 100644
index 0000000..44ebbf7
Binary files /dev/null and b/Lib/D11/uGUIUtils.dcu differ
diff --git a/Packages/GUISDK_D11.dpk b/Packages/GUISDK_D11.dpk
new file mode 100644
index 0000000..3570d13
--- /dev/null
+++ b/Packages/GUISDK_D11.dpk
@@ -0,0 +1,45 @@
+package GUISDK_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO OFF}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS OFF}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO OFF}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'GUI SDK para Delphi 2007'}
+{$IMPLICITBUILD OFF}
+{$DEFINE RELEASE}
+
+requires
+ vcl,
+ rtl,
+ designide,
+ vclactnband,
+ vclx,
+ ccpackD11,
+ cfpack_D11,
+ xmlrtl;
+
+contains
+ uCustomView in '..\Source\uCustomView.pas',
+ uCustomEditor in '..\Source\uCustomEditor.pas',
+ uGUIBase in '..\Source\uGUIBase.pas',
+ uGUIUtils in '..\Source\uGUIUtils.pas';
+
+end.
diff --git a/Packages/GUISDK_D11.dproj b/Packages/GUISDK_D11.dproj
new file mode 100644
index 0000000..2a6150b
--- /dev/null
+++ b/Packages/GUISDK_D11.dproj
@@ -0,0 +1,670 @@
+
+
+
+ {53bef2d1-a6c9-410c-9888-9c249cea28a3}
+ GUISDK_D11.dpk
+ Release
+ AnyCPU
+ DCC32
+ ..\Lib\D11\GUISDK_D11.bpl
+
+
+ 7.0
+ False
+ False
+ 0
+ RELEASE
+ ..\Lib\D11
+ ..\Lib\D11
+ ..\Lib\D11
+ ..\Lib\D11
+ ..\Lib\D11
+ ..\Source
+ ..\Source
+ ..\Source
+ ..\Source
+
+
+ 7.0
+ ..\Lib\D11
+ ..\Lib\D11
+ ..\Lib\D11
+ ..\Lib\D11
+ ..\Lib\D11
+
+
+ Delphi.Personality
+ Package
+
+
+ False
+ True
+ False
+
+
+ GUI SDK para Delphi 2007
+ False
+ False
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 3082
+ 1252
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Microsoft Office XP Sample Automation Server Wrapper Components
+ CodeGear WebSnap Components
+ CodeGear SOAP Components
+ Microsoft Office 2000 Sample Automation Server Wrapper Components
+ CodeGear C++Builder Office 2000 Servers Package
+ CodeGear C++Builder Office XP Servers Package
+
+
+ GUISDK_D11.dpk
+
+
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Packages/GUISDK_D11.res b/Packages/GUISDK_D11.res
new file mode 100644
index 0000000..86c94e6
Binary files /dev/null and b/Packages/GUISDK_D11.res differ
diff --git a/Packages/GUISDK_D2007.dproj b/Packages/GUISDK_D2007.dproj
index 804715c..34e3c09 100644
--- a/Packages/GUISDK_D2007.dproj
+++ b/Packages/GUISDK_D2007.dproj
@@ -1,12 +1,11 @@
-
-
+
- {0e5b9f0d-99ce-4dbd-9ec4-3c0e377e9009}
+ {53bef2d1-a6c9-410c-9888-9c249cea28a3}
GUISDK_D2007.dpk
Debug
AnyCPU
DCC32
- ..\Lib\D2007\GUISDK_D2007.bpl
+ C:\Documents and Settings\All Users\Documentos\RAD Studio\5.0\Bpl\GUISDK_D2007.bpl
7.0
@@ -17,18 +16,51 @@
7.0
- DEBUG
- ..\Lib\D2007
- ..\Lib\D2007
- ..\Lib\D2007
- ..\Lib\D2007
- ..\Lib\D2007
+ DEBUG;DEBUG
Delphi.Personality
Package
-FalseTrueFalseGUI SDK para Delphi 2007FalseFalseFalseTrueFalse1000FalseFalseFalseFalseFalse308212521.0.0.01.0.0.0
+
+ False
+ True
+ False
+
+
+ GUI SDK para Delphi 2007
+ False
+ False
+ False
+
+
+ False
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 3082
+ 1252
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
@@ -41,64 +73,519 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Microsoft Office 2000 Sample Automation Server Wrapper Components
Microsoft Office XP Sample Automation Server Wrapper Components
- GUISDK_D2007.dpk
+ CodeGear WebSnap Components
+ CodeGear SOAP Components
+ Microsoft Office 2000 Sample Automation Server Wrapper Components
+ CodeGear C++Builder Office 2000 Servers Package
+ CodeGear C++Builder Office XP Servers Package
+
+
+ GUISDK_D2007.dpk
+
+
-
+
MainSource
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
\ No newline at end of file
+
+
+
+
diff --git a/Packages/GUISDK_D2007.res b/Packages/GUISDK_D2007.res
index 86c94e6..4f90713 100644
Binary files a/Packages/GUISDK_D2007.res and b/Packages/GUISDK_D2007.res differ
diff --git a/Source/uCustomEditor.dfm b/Source/uCustomEditor.dfm
new file mode 100644
index 0000000..46975d9
--- /dev/null
+++ b/Source/uCustomEditor.dfm
@@ -0,0 +1,18 @@
+object CustomEditor: TCustomEditor
+ Left = 486
+ Top = 435
+ Width = 518
+ Height = 324
+ Caption = 'CustomEditor'
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ OldCreateOrder = False
+ OnActivate = FormActivate
+ OnClose = FormClose
+ PixelsPerInch = 96
+ TextHeight = 13
+end
diff --git a/Source/uCustomEditor.pas b/Source/uCustomEditor.pas
new file mode 100644
index 0000000..19b793c
--- /dev/null
+++ b/Source/uCustomEditor.pas
@@ -0,0 +1,319 @@
+unit uCustomEditor;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, StdCtrls, uGUIBase, uCustomView;
+
+type
+ TCustomEditor = class(TForm, ICustomEditor)
+ private
+ FInstanceID: Integer;
+ FOnGetModified: TOnGetModifiedEvent;
+ FOnViewModified: TOnViewModifiedEvent;
+ FReadOnly: Boolean;
+ function FindHostForm : IHostForm;
+ procedure ShowEmbedded(const AParent : TWinControl); overload;
+ protected
+ FViews: TInterfaceList;
+ procedure UpdateActions; override;
+ function GetInstanceID: Integer;
+ function GetModified: Boolean; virtual;
+ procedure SetModified(const Value : Boolean); virtual;
+ function GetOnViewModified: TOnViewModifiedEvent;
+ procedure SetOnViewModified(const Value : TOnViewModifiedEvent);
+ function GetReadOnly: Boolean; virtual;
+ function GetValid: Boolean; virtual;
+ procedure SetInstanceID(Value: Integer);
+ procedure SetReadOnly(Value: Boolean); virtual;
+ function GetOnGetModified: TOnGetModifiedEvent;
+ procedure SetOnGetModified(const Value: TOnGetModifiedEvent);
+ public
+ constructor Create(AOwner: TComponent); overload; override;
+ destructor Destroy; override;
+ function CreateView(const AViewClass : TCustomViewClass): IInterface;
+ function FindView(const IID: TGUID): IInterface;
+ function GetInstance: TObject;
+ procedure ShowEmbedded; overload;
+ function CloseQuery: Boolean; override;
+ property Modified: Boolean read GetModified write SetModified;
+ published
+ property InstanceID: Integer read GetInstanceID write SetInstanceID;
+ property ReadOnly: Boolean read GetReadOnly write SetReadOnly;
+ property Valid: Boolean read GetValid;
+ property OnGetModified: TOnGetModifiedEvent read GetOnGetModified write
+ SetOnGetModified;
+ end;
+
+ TCustomEditorClass = class of TCustomEditor;
+
+procedure Register;
+
+implementation
+
+uses
+ CustFrms, uGUIUtils;
+
+procedure Register;
+begin
+ RegisterCustomFormClass(TCustomEditor);
+end;
+
+{
+******************************** TCustomEditor *********************************
+}
+
+constructor TCustomEditor.Create(AOwner: TComponent);
+begin
+// inherited CreateNew(AOwner);
+ // initialize custom fields, etc., here
+ FViews := TInterfaceList.Create;
+
+ GlobalNameSpace.BeginWrite;
+ try
+ CreateNew(AOwner);
+ if (ClassType <> 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/Source/uCustomView.dfm b/Source/uCustomView.dfm
new file mode 100644
index 0000000..98f9074
--- /dev/null
+++ b/Source/uCustomView.dfm
@@ -0,0 +1,7 @@
+object CustomView: TCustomView
+ Left = 0
+ Top = 0
+ Width = 320
+ Height = 240
+ TabOrder = 0
+end
diff --git a/Source/uCustomView.pas b/Source/uCustomView.pas
new file mode 100644
index 0000000..5db151e
--- /dev/null
+++ b/Source/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/Source/uGUIBase.pas b/Source/uGUIBase.pas
new file mode 100644
index 0000000..eb742d9
--- /dev/null
+++ b/Source/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/Source/uGUIUtils.pas b/Source/uGUIUtils.pas
new file mode 100644
index 0000000..c952c9b
--- /dev/null
+++ b/Source/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.