Componentes.Terceros.DevExp.../internal/x.46/2/ExpressEditors Library 5/Sources/cxInplaceContainerReg.pas

332 lines
11 KiB
ObjectPascal

{********************************************************************}
{ }
{ Developer Express Visual Component Library }
{ Express Cross Platform Common Editing Library }
{ }
{ Copyright (c) 2000-2009 Developer Express Inc. }
{ ALL RIGHTS RESERVED }
{ }
{ The entire contents of this file is protected by U.S. and }
{ International Copyright Laws. Unauthorized reproduction, }
{ reverse-engineering, and distribution of all or any portion of }
{ the code contained in this file is strictly prohibited and may }
{ result in severe civil and criminal penalties and will be }
{ prosecuted to the maximum extent possible under the law. }
{ }
{ RESTRICTIONS }
{ }
{ THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES }
{ (DCU, OBJ, DLL, ETC.) ARE CONFIDENTIAL AND PROPRIETARY TRADE }
{ SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER IS }
{ LICENSED TO DISTRIBUTE THE COMMONEDITINGLIBRARY AND ALL }
{ ACCOMPANYING VCL CONTROLS AS PART OF AN EXECUTABLE PROGRAM }
{ ONLY. }
{ }
{ THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED }
{ FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE }
{ COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE }
{ AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT }
{ AND PERMISSION FROM DEVELOPER EXPRESS INC. }
{ }
{ CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON }
{ ADDITIONAL RESTRICTIONS. }
{ }
{********************************************************************}
unit cxInplaceContainerReg;
{$I cxVer.inc}
interface
uses
Classes, SysUtils,
{$IFDEF DELPHI6}
DesignIntf, DesignEditors,
{$ELSE}
DsgnWnds, DsgnIntf,
{$ENDIF}
cxClasses, cxPropEditors, cxEdit, cxDesignWindows, cxInplaceContainer;
type
TItemDataBindingAccess = class(TcxItemDataBinding);
{ TcxstPropEventsProperty }
TcxInplaceEditContainerPropertiesEventsProperty = class(TcxNestedEventProperty)
protected
function GetInstance: TPersistent; override;
end;
{ TcxInplaceEditContainerPropertiesProperty }
TcxInplaceEditContainerPropertiesProperty = class(TClassProperty)
protected
function HasSubProperties: Boolean;
public
function GetAttributes: TPropertyAttributes; override;
function GetValue: string; override;
procedure GetValues(Proc: TGetStrProc); override;
procedure SetValue(const Value: string); override;
end;
{ TcxValueTypeClassProperty }
TcxValueTypeClassProperty = class(TStringProperty)
public
function GetAttributes: TPropertyAttributes; override;
procedure GetValues(Proc: TGetStrProc); override;
procedure SetValue(const Value: string); override;
end;
{ TcxDesignSelectionHelper }
TcxDesignSelectionHelper = class(TcxCustomDesignSelectionHelper
{$IFDEF DELPHI6}, IUnknown, IDesignNotification{$ENDIF})
private
FDesignHelper: TcxDesignHelper;
protected
{$IFDEF DELPHI6}
// IUnknown
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
function QueryInterface(const IID: TGUID; out Obj): HResult; virtual; stdcall;
// IDesignNotification
procedure ItemDeleted(const ADesigner: IDesigner; AItem: TPersistent);
procedure ItemInserted(const ADesigner: IDesigner; AItem: TPersistent);
procedure ItemsModified(const ADesigner: IDesigner);
procedure SelectionChanged(const ADesigner: IDesigner; const ASelection: IDesignerSelections);
procedure DesignerOpened(const ADesigner: IDesigner; AResurrecting: Boolean);
procedure DesignerClosed(const ADesigner: IDesigner; AGoingDormant: Boolean);
{$ENDIF}
public
constructor Create(AControl: TcxEditingControl); override;
destructor Destroy; override;
function IsObjectSelected(AObject: TPersistent): Boolean; override;
procedure Select(AObject: TPersistent; AShift: TShiftState); override;
procedure SetSelection(AList: TList); override;
procedure UnselectObject(AObject: TPersistent); override;
end;
procedure Register;
implementation
uses
Windows;
{ TcxInplaceEditContainerPropertiesEventsProperty }
function TcxInplaceEditContainerPropertiesEventsProperty.GetInstance: TPersistent;
var
AIntf: IcxEditorPropertiesContainer;
begin
if Supports(GetComponent(0), IcxEditorPropertiesContainer, AIntf) then
Result := AIntf.GetProperties
else
Result := nil;
end;
{ TcxInplaceEditContainerPropertiesProperty }
function TcxInplaceEditContainerPropertiesProperty.HasSubProperties: Boolean;
var
I: Integer;
AIntf: IcxEditorPropertiesContainer;
begin
for I := 0 to PropCount - 1 do
begin
Result := Supports(GetComponent(I), IcxEditorPropertiesContainer, AIntf) and
(AIntf.GetProperties <> nil);
if not Result then Exit;
end;
Result := True;
end;
function TcxInplaceEditContainerPropertiesProperty.GetAttributes: TPropertyAttributes;
begin
Result := inherited GetAttributes;
if not HasSubProperties then
Exclude(Result, paSubProperties);
Result := Result - [paReadOnly] + [paValueList, paSortList, paRevertable] +
{$IFDEF DELPHI6}[paVolatileSubProperties] {$ELSE } [] {$ENDIF};
end;
function TcxInplaceEditContainerPropertiesProperty.GetValue: string;
begin
if HasSubProperties then
Result := GetRegisteredEditProperties.GetDescriptionByClass(
TcxCustomEditProperties(GetOrdValue).ClassType)
else
Result := '';
end;
procedure TcxInplaceEditContainerPropertiesProperty.GetValues(Proc: TGetStrProc);
var
I: Integer;
begin
for I := 0 to GetRegisteredEditProperties.Count - 1 do
Proc(GetRegisteredEditProperties.Descriptions[I]);
end;
procedure TcxInplaceEditContainerPropertiesProperty.SetValue(const Value: string);
var
APropertiesClass: TcxCustomEditPropertiesClass;
I: Integer;
AIntf: IcxEditorPropertiesContainer;
begin
{$IFNDEF DELPHI7}
ObjectInspectorCollapseProperty;
{$ENDIF}
APropertiesClass := TcxCustomEditPropertiesClass(
GetRegisteredEditProperties.FindByClassName(Value));
if APropertiesClass = nil then
APropertiesClass := TcxCustomEditPropertiesClass(
GetRegisteredEditProperties.FindByDescription(Value));
for I := 0 to PropCount - 1 do
if Supports(GetComponent(I), IcxEditorPropertiesContainer, AIntf) then
AIntf.SetPropertiesClass(APropertiesClass);
Modified;
end;
{ TcxValueTypeClassProperty }
function TcxValueTypeClassProperty.GetAttributes: TPropertyAttributes;
begin
Result := inherited GetAttributes - [paReadOnly] + [paValueList];
end;
procedure TcxValueTypeClassProperty.GetValues(Proc: TGetStrProc);
var
I: Integer;
begin
for I := 0 to cxieValueTypeClassRepository.Count - 1 do
Proc(cxieValueTypeClassRepository.Description[I]);
end;
procedure TcxValueTypeClassProperty.SetValue(const Value: string);
var
I: Integer;
begin
for I := 0 to PropCount - 1 do
TItemDataBindingAccess(GetComponent(I)).ValueType := Value;
end;
{ TcxDesignSelectionHelper }
constructor TcxDesignSelectionHelper.Create(AControl: TcxEditingControl);
begin
inherited Create(AControl);
FDesignHelper := TcxDesignHelper.Create(Control);
{$IFDEF DELPHI6}
RegisterDesignNotification(Self);
{$ENDIF}
end;
destructor TcxDesignSelectionHelper.Destroy;
begin
{$IFDEF DELPHI6}
UnregisterDesignNotification(Self);
{$ENDIF}
FDesignHelper.Free;
inherited Destroy;
end;
function TcxDesignSelectionHelper.IsObjectSelected(
AObject: TPersistent): Boolean;
begin
Result := FDesignHelper.IsObjectSelected(AObject);
end;
procedure TcxDesignSelectionHelper.Select(AObject: TPersistent;
AShift: TShiftState);
begin
if AShift * [ssCtrl, ssAlt] <> [] then Exit;
if AObject = nil then
FDesignHelper.SelectObject(Control)
else
if ssShift in AShift then
FDesignHelper.ChangeSelection(AObject)
else
FDesignHelper.SelectObject(AObject);
end;
procedure TcxDesignSelectionHelper.SetSelection(AList: TList);
begin
FDesignHelper.SetSelection(AList);
end;
procedure TcxDesignSelectionHelper.UnselectObject(AObject: TPersistent);
begin
FDesignHelper.UnselectObject(AObject);
end;
{$IFDEF DELPHI6}
function TcxDesignSelectionHelper._AddRef: Integer; stdcall;
begin
Result := -1;
end;
function TcxDesignSelectionHelper._Release: Integer; stdcall;
begin
Result := -1;
end;
function TcxDesignSelectionHelper.QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
begin
if GetInterface(IID, Obj) then Result := 0 else Result := cxE_NOINTERFACE;
end;
procedure TcxDesignSelectionHelper.ItemDeleted(const ADesigner: IDesigner;
AItem: TPersistent);
begin
end;
procedure TcxDesignSelectionHelper.ItemInserted(const ADesigner: IDesigner;
AItem: TPersistent);
begin
end;
procedure TcxDesignSelectionHelper.ItemsModified(const ADesigner: IDesigner);
begin
end;
procedure TcxDesignSelectionHelper.SelectionChanged(const ADesigner: IDesigner;
const ASelection: IDesignerSelections);
begin
Control.LayoutChanged;
Control.Invalidate;
end;
procedure TcxDesignSelectionHelper.DesignerOpened(const ADesigner: IDesigner;
AResurrecting: Boolean);
begin
end;
procedure TcxDesignSelectionHelper.DesignerClosed(const ADesigner: IDesigner;
AGoingDormant: Boolean);
begin
end;
{$ENDIF}
procedure Register;
begin
RegisterClasses([TcxCustomInplaceEditContainer]);
RegisterNoIcon([TcxCustomInplaceEditContainer]);
RegisterPropertyEditor(TypeInfo(TNotifyEvent), TcxCustomInplaceEditContainer, 'PropertiesEvents',
TcxInplaceEditContainerPropertiesEventsProperty);
RegisterPropertyEditor(TypeInfo(string), TcxCustomInplaceEditContainer,
'PropertiesClassName', nil);
RegisterPropertyEditor(TypeInfo(TcxCustomEditProperties), TcxCustomInplaceEditContainer,
'Properties', TcxInplaceEditContainerPropertiesProperty);
RegisterPropertyEditor(TypeInfo(string), TcxItemDataBinding,
'ValueType', TcxValueTypeClassProperty);
end;
initialization
{$IFDEF DELPHI6}
cxDesignSelectionHelperClass := TcxDesignSelectionHelper;
{$ENDIF}
end.