git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.DevExpressVCL@29 05c56307-c608-d34a-929d-697000501d7a
1348 lines
42 KiB
ObjectPascal
1348 lines
42 KiB
ObjectPascal
{*******************************************************************}
|
|
{ }
|
|
{ ExpressWeb Framework by Developer Express }
|
|
{ Visual Web Controls Library }
|
|
{ }
|
|
{ Copyright (c) 2000-2008 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 EXPRESSWEB FRAMEWORK AND ALL }
|
|
{ ACCOMPANYING VCL CLASSES AS PART OF AN EXECUTABLE WEB }
|
|
{ APPLICATION 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 cxWebTV;
|
|
|
|
{$I cxVer.inc}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, TypInfo,
|
|
cxWebRender, cxWebClasses, cxWebControls, cxWebImgList,
|
|
cxWebMenus, cxWebTypes, cxWebIntf;
|
|
|
|
type
|
|
TcxWebTreeView = class;
|
|
|
|
TcxWebTreeItem = class(TPersistent)
|
|
private
|
|
FData: Pointer;
|
|
FExpanded: Boolean;
|
|
FHint: string;
|
|
FImageIndex: Integer;
|
|
FList: TList;
|
|
FName: string;
|
|
FOwner: TcxWebTreeView;
|
|
FParent: TcxWebTreeItem;
|
|
FText: string;
|
|
FURL: TcxURL;
|
|
|
|
function GetCount: Integer;
|
|
function GetHasChildren: Boolean;
|
|
function GetIndex: Integer;
|
|
function GetItem(Index: Integer): TcxWebTreeItem;
|
|
function GetLevel: Integer;
|
|
function GetText: string;
|
|
procedure SetExpanded(Value: Boolean);
|
|
procedure SetName(const Value: string);
|
|
procedure SetText(const Value: string);
|
|
procedure SetURL(Value: TcxURL);
|
|
|
|
function DoCanExpand(Expand: Boolean): Boolean;
|
|
procedure DoExpand(Expand: Boolean);
|
|
procedure ExpandItem(Expand: Boolean; Recurse: Boolean);
|
|
function GenerateName(Unique: Boolean): string;
|
|
protected
|
|
procedure ApplySorting(SortChildren: Boolean); virtual;
|
|
procedure ReadData(Stream: TStream);
|
|
procedure WriteData(Stream: TStream);
|
|
public
|
|
constructor Create(AOwner: TcxWebTreeView);
|
|
destructor Destroy; override;
|
|
|
|
function AddChild: TcxWebTreeItem;
|
|
procedure Collapse(ARecurse: Boolean);
|
|
procedure DeleteChildren;
|
|
procedure Expand(ARecurse: Boolean);
|
|
function IndexOf(Value: TcxWebTreeItem): Integer;
|
|
function InsertChild(BeforeItem: TcxWebTreeItem): TcxWebTreeItem;
|
|
|
|
property Count: Integer read GetCount;
|
|
property Data: Pointer read FData write FData;
|
|
property HasChildren: Boolean read GetHasChildren;
|
|
property Index: Integer read GetIndex;
|
|
property Items[Index: Integer]: TcxWebTreeItem read GetItem; default;
|
|
property Level: Integer read GetLevel;
|
|
property Owner: TcxWebTreeView read FOwner;
|
|
property Parent: TcxWebTreeItem read FParent;
|
|
published
|
|
property Expanded: Boolean read FExpanded write SetExpanded;
|
|
property Hint: string read FHint write FHint;
|
|
property ImageIndex: Integer read FImageIndex write FImageIndex;
|
|
property Name: string read FName write SetName;
|
|
property Text: string read GetText write SetText;
|
|
property URL: TcxURL read FURL write SetURL;
|
|
end;
|
|
|
|
|
|
TcxWebTVCollapsingEvent = procedure(Sender: TObject; Item: TcxWebTreeItem;
|
|
var AllowCollapse: Boolean) of object;
|
|
TcxWebTVExpandingEvent = procedure(Sender: TObject; Item: TcxWebTreeItem;
|
|
var AllowExpansion: Boolean) of object;
|
|
TcxWebTVItemEvent = procedure(Sender: TObject; Item: TcxWebTreeItem) of object;
|
|
|
|
|
|
TcxWebTreeViewEvent = (teOnTreeItemClick, teOnTreeItemCollapse, teOnTreeItemExpand);
|
|
|
|
TcxWebTreeViewEventsHelper = class(TcxWebScriptEventsHelper)
|
|
protected
|
|
function EventName(const AEvent: Integer): string; override;
|
|
function EventProcParams(const AEvent: Integer): string; override;
|
|
function ScriptObject: string; override;
|
|
public
|
|
function EventTypeInfo: PTypeInfo; override;
|
|
end;
|
|
|
|
TcxWebTreeView = class(TcxWebControl)
|
|
private
|
|
FAutoSort: Boolean;
|
|
FExpandedImageIndex: Integer;
|
|
FCollapsedImageIndex: Integer;
|
|
FForcePostBack: Boolean;
|
|
FImages: TcxWebImageList;
|
|
FIndent: Integer;
|
|
FItems: TcxWebTreeItem;
|
|
FShowButtons: Boolean;
|
|
FShowImages: Boolean;
|
|
FVertIndent: Integer;
|
|
FOnClick: TcxWebTVItemEvent;
|
|
FOnCollapsed: TcxWebTVItemEvent;
|
|
FOnCollapsing: TcxWebTVCollapsingEvent;
|
|
FOnExpanded: TcxWebTVItemEvent;
|
|
FOnExpanding: TcxWebTVExpandingEvent;
|
|
|
|
function GetForcePostBack: Boolean;
|
|
procedure SetImages(Value: TcxWebImageList);
|
|
procedure SetAutoSort(Value: Boolean);
|
|
function IsValidIndex(AIndex: Integer): Boolean;
|
|
protected
|
|
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
|
|
procedure DefineProperties(Filer: TFiler); override;
|
|
procedure ReadItems(Stream: TStream);
|
|
procedure WriteItems(Stream: TStream);
|
|
|
|
function CanCollapse(AItem: TcxWebTreeItem): Boolean; dynamic;
|
|
function CanExpand(AItem: TcxWebTreeItem): Boolean; dynamic;
|
|
procedure Click(AItem: TcxWebTreeItem); dynamic;
|
|
procedure Collapse(AItem: TcxWebTreeItem); dynamic;
|
|
procedure Expand(AItem: TcxWebTreeItem); dynamic;
|
|
procedure DoClick(const Parameters: TcxActionParameters);
|
|
procedure DoToggle(const Parameters: TcxActionParameters);
|
|
procedure ValidateItemName(const Value: string);
|
|
{ actions }
|
|
procedure RegisterActions; override;
|
|
{ events }
|
|
function GetWebEventsHelper: TcxWebTreeViewEventsHelper;
|
|
class function GetWebEventsHelperClass: TcxWebEventsHelperClass; override;
|
|
property WebEventsHelper: TcxWebTreeViewEventsHelper read GetWebEventsHelper;
|
|
{ renderers}
|
|
procedure RegisterRenderers; override;
|
|
{ scripts }
|
|
procedure ScriptsSubscription; override;
|
|
{ values }
|
|
procedure DoSetValues; override;
|
|
procedure RegisterValues; override;
|
|
procedure RestoreState(const AState: string);
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
|
|
function AddItem: TcxWebTreeItem;
|
|
procedure AssignItems(Source: TcxWebTreeView);
|
|
procedure Clear;
|
|
procedure FullCollapse;
|
|
procedure FullExpand;
|
|
function ItemByName(const AName: string): TcxWebTreeItem;
|
|
procedure Sort;
|
|
|
|
property Items: TcxWebTreeItem read FItems;
|
|
published
|
|
property AutoSort: Boolean read FAutoSort write SetAutoSort default False;
|
|
property CollapsedImageIndex: Integer read FCollapsedImageIndex write FCollapsedImageIndex
|
|
default -1;
|
|
property ExpandedImageIndex: Integer read FExpandedImageIndex write FExpandedImageIndex
|
|
default -1;
|
|
property ForcePostBack: Boolean read GetForcePostBack write FForcePostBack
|
|
default False;
|
|
property Height;
|
|
property Images: TcxWebImageList read FImages write SetImages;
|
|
property Indent: Integer read FIndent write FIndent default 20;
|
|
property PopupMenu;
|
|
property PopupShowingType;
|
|
property ShowButtons: Boolean read FShowButtons write FShowButtons
|
|
default True;
|
|
property ShowImages: Boolean read FShowImages write FShowImages
|
|
default True;
|
|
property Styles;
|
|
property VertIndent: Integer read FVertIndent write FVertIndent default 0;
|
|
property Width;
|
|
|
|
property OnClick: TcxWebTVItemEvent read FOnClick write FOnClick;
|
|
property OnCollapsed: TcxWebTVItemEvent read FOnCollapsed write FOnCollapsed;
|
|
property OnCollapsing: TcxWebTVCollapsingEvent read FOnCollapsing write FOnCollapsing;
|
|
property OnExpanded: TcxWebTVItemEvent read FOnExpanded write FOnExpanded;
|
|
property OnExpanding: TcxWebTVExpandingEvent read FOnExpanding write FOnExpanding;
|
|
end;
|
|
|
|
TcxWebTreeViewRenderer = class(TcxWebControlRenderer)
|
|
private
|
|
function GetWebTreeView: TcxWebTreeView;
|
|
function GetExpandImageHint: string;
|
|
function GetExpandImagePath: string;
|
|
function GetCollapseImageHint: string;
|
|
function GetCollapseImagePath: string;
|
|
protected
|
|
procedure SetDefaultStyleProc(const Style: TcxWebStyleItem; var AScript: string);
|
|
procedure SetHoverStyleProc(const Style: TcxWebStyleItem; var AScript: string);
|
|
procedure WriteNodeEvents(const Style: TcxWebStyleItem);
|
|
|
|
procedure WriteBlockStyle(AItem: TcxWebTreeItem); virtual;
|
|
procedure WriteItem(AItem: TcxWebTreeItem); virtual;
|
|
procedure WriteItems(AItem: TcxWebTreeItem); virtual;
|
|
public
|
|
class procedure GetScriptFiles(AList: TStrings); override;
|
|
procedure WriteHiddenFormElements; override;
|
|
procedure WriteHTML; override;
|
|
procedure WriteScripts; override;
|
|
|
|
property WebTreeView: TcxWebTreeView read GetWebTreeView;
|
|
end;
|
|
|
|
TcxWebTreeViewNS4Renderer = class(TcxWebTreeViewRenderer)
|
|
protected
|
|
procedure WriteItem(AItem: TcxWebTreeItem); override;
|
|
procedure WriteItems(AItem: TcxWebTreeItem); override;
|
|
public
|
|
class function IsBrowserSupported(AWebBrowser: TcxWebBrowserClass): Boolean; override;
|
|
class procedure GetScriptFiles(AList: TStrings); override;
|
|
procedure WriteHiddenFormElements; override;
|
|
procedure WriteHTML; override;
|
|
procedure WriteScripts; override;
|
|
end;
|
|
|
|
TcxWebTreeViewNS6Renderer = class(TcxWebTreeViewRenderer)
|
|
protected
|
|
procedure WriteItem(AItem: TcxWebTreeItem); override;
|
|
public
|
|
class function IsBrowserSupported(AWebBrowser: TcxWebBrowserClass): Boolean; override;
|
|
procedure WriteHTML; override;
|
|
end;
|
|
|
|
TcxWebTreeViewOperaRenderer = class(TcxWebTreeViewNS4Renderer)
|
|
public
|
|
class function IsBrowserSupported(AWebBrowser: TcxWebBrowserClass): Boolean; override;
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses
|
|
RTLConsts,
|
|
cxWebConsts, cxWebScriptFactory, cxWebColors, cxWebGraphics, cxWebUtils;
|
|
|
|
type
|
|
PcxWebTreeItemInfo = ^TcxWebTreeItemInfo;
|
|
TcxWebTreeItemInfo = packed record
|
|
Count: Integer;
|
|
Data: Pointer;
|
|
Expanded: Boolean;
|
|
ImageIndex: Integer;
|
|
end;
|
|
|
|
{ TcxWebTreeItem }
|
|
|
|
constructor TcxWebTreeItem.Create(AOwner: TcxWebTreeView);
|
|
begin
|
|
FOwner := AOwner;
|
|
FURL := TcxURL.Create(FOwner);
|
|
FImageIndex := -1;
|
|
end;
|
|
|
|
destructor TcxWebTreeItem.Destroy;
|
|
begin
|
|
DeleteChildren;
|
|
if Parent <> nil then
|
|
if Parent.FList <> nil then
|
|
begin
|
|
Parent.FList.Remove(Self);
|
|
if Parent.Count = 0 then
|
|
begin
|
|
Parent.FList.Free;
|
|
Parent.FList := nil;
|
|
Parent.FExpanded := False;
|
|
end;
|
|
end;
|
|
FURL.Free;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
function TcxWebTreeItem.DoCanExpand(Expand: Boolean): Boolean;
|
|
begin
|
|
Result := False;
|
|
if HasChildren then
|
|
if Expand then
|
|
Result := Owner.CanExpand(Self)
|
|
else
|
|
Result := Owner.CanCollapse(Self);
|
|
end;
|
|
|
|
procedure TcxWebTreeItem.DoExpand(Expand: Boolean);
|
|
begin
|
|
if HasChildren then
|
|
if Expand then
|
|
Owner.Expand(Self)
|
|
else
|
|
Owner.Collapse(Self);
|
|
end;
|
|
|
|
procedure TcxWebTreeItem.ExpandItem(Expand: Boolean; Recurse: Boolean);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if DoCanExpand(Expand) then
|
|
begin
|
|
DoExpand(Expand);
|
|
FExpanded := Expand;
|
|
end;
|
|
if Recurse then
|
|
for I := 0 to Count - 1 do
|
|
Items[I].ExpandItem(Expand, True);
|
|
Owner.UpdateDesignerContext;
|
|
end;
|
|
|
|
function TcxWebTreeItem.GenerateName(Unique: Boolean): string;
|
|
var
|
|
NewName: string;
|
|
I: Integer;
|
|
begin
|
|
if (Level > 0) and (Parent <> nil) then
|
|
NewName := Parent.GenerateName(False)
|
|
else
|
|
NewName := Owner.Name + 'Item';
|
|
I := Index;
|
|
repeat
|
|
Inc(I);
|
|
Result := NewName + '_' + IntToStr(I);
|
|
until ((not Unique) or (Owner.ItemByName(Result) = nil));
|
|
end;
|
|
|
|
function TcxWebTreeItem.AddChild: TcxWebTreeItem;
|
|
begin
|
|
Result := InsertChild(nil);
|
|
end;
|
|
|
|
procedure TcxWebTreeItem.Expand(ARecurse: Boolean);
|
|
begin
|
|
ExpandItem(True, ARecurse);
|
|
end;
|
|
|
|
procedure TcxWebTreeItem.Collapse(ARecurse: Boolean);
|
|
begin
|
|
ExpandItem(False, ARecurse);
|
|
end;
|
|
|
|
function TcxWebTreeItem.InsertChild(BeforeItem: TcxWebTreeItem) : TcxWebTreeItem;
|
|
begin
|
|
Result := TcxWebTreeItem.Create(FOwner);;
|
|
Result.FParent := Self;
|
|
if FList = nil then
|
|
begin
|
|
FList := TList.Create;
|
|
FList.Add(Result);
|
|
end
|
|
else
|
|
if BeforeItem = nil then
|
|
FList.Add(Result)
|
|
else
|
|
FList.Insert(BeforeItem.Index, Result);
|
|
Result.Name := Result.GenerateName(True);
|
|
if Owner.AutoSort then ApplySorting(False);
|
|
Owner.UpdateDesignerContext;
|
|
end;
|
|
|
|
procedure TcxWebTreeItem.DeleteChildren;
|
|
begin
|
|
while Count > 0 do
|
|
Items[Count - 1].Free;
|
|
end;
|
|
|
|
function CompareItems(Item1, Item2: Pointer): Integer;
|
|
begin
|
|
Result := CompareText(TcxWebTreeItem(Item1).Text, TcxWebTreeItem(Item2).Text);
|
|
end;
|
|
|
|
procedure TcxWebTreeItem.ApplySorting(SortChildren: Boolean);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if Owner.IsLoading then exit;
|
|
|
|
if (FList <> nil) then
|
|
begin
|
|
FList.Sort(@CompareItems);
|
|
if SortChildren then
|
|
for I := 0 to Count - 1 do
|
|
Items[I].ApplySorting(True);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxWebTreeItem.ReadData(Stream: TStream);
|
|
var
|
|
ItemSize, I, L, ItemCount: Integer;
|
|
Info: PcxWebTreeItemInfo;
|
|
S: string;
|
|
begin
|
|
Stream.ReadBuffer(ItemSize, SizeOf(ItemSize));
|
|
GetMem(Info, ItemSize);
|
|
try
|
|
Stream.ReadBuffer(Info^, ItemSize);
|
|
ItemCount := Info^.Count;
|
|
FData := Info^.Data;
|
|
FExpanded := Info^.Expanded;
|
|
FImageIndex := Info^.ImageIndex;
|
|
|
|
Stream.ReadBuffer(L, SizeOf(L));
|
|
SetLength(FHint, L);
|
|
Stream.ReadBuffer(FHint[1], L);
|
|
|
|
Stream.ReadBuffer(L, SizeOf(L));
|
|
SetLength(FName, L);
|
|
Stream.ReadBuffer(FName[1], L);
|
|
|
|
Stream.ReadBuffer(L, SizeOf(L));
|
|
SetLength(FText, L);
|
|
Stream.ReadBuffer(FText[1], L);
|
|
|
|
Stream.ReadBuffer(L, SizeOf(L));
|
|
SetLength(S, L);
|
|
Stream.ReadBuffer(S[1], L);
|
|
FURL.Href := S;
|
|
|
|
Stream.ReadBuffer(L, SizeOf(L));
|
|
SetLength(S, L);
|
|
Stream.ReadBuffer(S[1], L);
|
|
FURL.Target := S;
|
|
finally
|
|
FreeMem(Info, ItemSize);
|
|
end;
|
|
for I := 0 to ItemCount - 1 do
|
|
with AddChild do ReadData(Stream);
|
|
end;
|
|
|
|
procedure TcxWebTreeItem.WriteData(Stream: TStream);
|
|
var
|
|
ItemSize, I, L: Integer;
|
|
Info: PcxWebTreeItemInfo;
|
|
S: string;
|
|
begin
|
|
ItemSize := SizeOf(TcxWebTreeItemInfo);
|
|
GetMem(Info, ItemSize);
|
|
try
|
|
Info^.Count := Count;
|
|
Info^.Data := Data;
|
|
Info^.Expanded := Expanded;
|
|
Info^.ImageIndex := ImageIndex;
|
|
Stream.WriteBuffer(ItemSize, SizeOf(ItemSize));
|
|
Stream.WriteBuffer(Info^, ItemSize);
|
|
|
|
L := Length(FHint);
|
|
Stream.WriteBuffer(L, SizeOf(L));
|
|
Stream.WriteBuffer(FHint[1], L);
|
|
|
|
L := Length(FName);
|
|
Stream.WriteBuffer(L, SizeOf(L));
|
|
Stream.WriteBuffer(FName[1], L);
|
|
|
|
L := Length(FText);
|
|
Stream.WriteBuffer(L, SizeOf(L));
|
|
Stream.WriteBuffer(FText[1], L);
|
|
|
|
S := FURL.Href;
|
|
L := Length(S);
|
|
Stream.WriteBuffer(L, SizeOf(L));
|
|
Stream.WriteBuffer(S[1], L);
|
|
|
|
S := FURL.Target;
|
|
L := Length(S);
|
|
Stream.WriteBuffer(L, SizeOf(L));
|
|
Stream.WriteBuffer(S[1], L);
|
|
finally
|
|
FreeMem(Info, ItemSize);
|
|
end;
|
|
for I := 0 to Count - 1 do
|
|
Items[I].WriteData(Stream);
|
|
end;
|
|
|
|
function TcxWebTreeItem.IndexOf(Value: TcxWebTreeItem): Integer;
|
|
begin
|
|
Result := -1;
|
|
if Count > 0 then
|
|
Result := FList.IndexOf(Value);
|
|
end;
|
|
|
|
procedure TcxWebTreeItem.SetExpanded(Value: Boolean);
|
|
begin
|
|
if Value then Expand(False)
|
|
else Collapse(False);
|
|
Owner.UpdateDesignerContext;
|
|
end;
|
|
|
|
function TcxWebTreeItem.GetHasChildren: Boolean;
|
|
begin
|
|
Result := Count > 0;
|
|
end;
|
|
|
|
procedure TcxWebTreeItem.SetName(const Value: string);
|
|
begin
|
|
if Value = FName then Exit;
|
|
if not IsValidIdent(Value) then
|
|
raise EComponentError.CreateResFmt(@SInvalidName, [Value]);
|
|
if Owner <> nil then
|
|
Owner.ValidateItemName(Value);
|
|
FName := Value;
|
|
if Owner.AutoSort then Parent.ApplySorting(False);
|
|
Owner.UpdateDesignerContext;
|
|
end;
|
|
|
|
procedure TcxWebTreeItem.SetText(const Value: string);
|
|
begin
|
|
if FText <> Value then
|
|
begin
|
|
FText := Value;
|
|
if Owner.AutoSort then Parent.ApplySorting(False);
|
|
Owner.UpdateDesignerContext;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxWebTreeItem.SetURL(Value: TcxURL);
|
|
begin
|
|
FURL.Assign(Value);
|
|
end;
|
|
|
|
function TcxWebTreeItem.GetCount: Integer;
|
|
begin
|
|
if FList = nil then
|
|
Result := 0
|
|
else
|
|
Result := FList.Count;
|
|
end;
|
|
|
|
function TcxWebTreeItem.GetIndex: Integer;
|
|
begin
|
|
if Parent = nil then
|
|
Result := 0
|
|
else
|
|
Result := Parent.IndexOf(Self);
|
|
end;
|
|
|
|
function TcxWebTreeItem.GetItem(Index: Integer): TcxWebTreeItem;
|
|
begin
|
|
Result := nil;
|
|
if (Index > -1) and (Index < Count) then
|
|
Result := FList.List^[Index];
|
|
end;
|
|
|
|
function TcxWebTreeItem.GetLevel: Integer;
|
|
begin
|
|
if Parent = nil then
|
|
Result := -1
|
|
else
|
|
Result := Parent.Level + 1;
|
|
end;
|
|
|
|
function TcxWebTreeItem.GetText: string;
|
|
begin
|
|
if FText = '' then
|
|
Result := Name
|
|
else
|
|
Result := FText;
|
|
end;
|
|
|
|
{ TcxWebTreeViewEventsHelper }
|
|
|
|
function TcxWebTreeViewEventsHelper.EventName(const AEvent: Integer): string;
|
|
const
|
|
cxHTMLEvent: array[TcxWebTreeViewEvent] of string = ('OnTreeItemClick',
|
|
'OnTreeItemCollapse', 'OnTreeItemExpand');
|
|
begin
|
|
Result := cxHTMLEvent[TcxWebTreeViewEvent(AEvent)];
|
|
end;
|
|
|
|
function TcxWebTreeViewEventsHelper.EventProcParams(const AEvent: Integer): string;
|
|
begin
|
|
Result := '(Sender, ItemName)';
|
|
end;
|
|
|
|
function TcxWebTreeViewEventsHelper.ScriptObject: string;
|
|
begin
|
|
Result := '_TreeView';
|
|
end;
|
|
|
|
function TcxWebTreeViewEventsHelper.EventTypeInfo: PTypeInfo;
|
|
begin
|
|
Result := TypeInfo(TcxWebTreeViewEvent);
|
|
end;
|
|
|
|
{ TcxWebTreeView }
|
|
|
|
constructor TcxWebTreeView.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
FItems := TcxWebTreeItem.Create(Self);
|
|
FItems.FExpanded := True;
|
|
FCollapsedImageIndex := -1;
|
|
FExpandedImageIndex := -1;
|
|
FShowButtons := True;
|
|
FShowImages := True;
|
|
FForcePostBack := False;
|
|
FIndent := 20;
|
|
FVertIndent := 0;
|
|
|
|
Height := 100;
|
|
Width := 100;
|
|
end;
|
|
|
|
destructor TcxWebTreeView.Destroy;
|
|
begin
|
|
FItems.Free;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
function TcxWebTreeView.ItemByName(const AName: string): TcxWebTreeItem;
|
|
|
|
function FindItem(AItem: TcxWebTreeItem; const AName: string): TcxWebTreeItem;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := nil;
|
|
if AItem <> nil then
|
|
if CompareText(AItem.Name, AName) = 0 then
|
|
Result := AItem
|
|
else
|
|
for I := 0 to AItem.Count - 1 do
|
|
begin
|
|
Result := FindItem(AItem.Items[I], AName);
|
|
if Result <> nil then
|
|
Break;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
Result := FindItem(Items, AName);
|
|
end;
|
|
|
|
procedure TcxWebTreeView.Sort;
|
|
begin
|
|
FItems.ApplySorting(True);
|
|
UpdateDesignerContext;
|
|
end;
|
|
|
|
procedure TcxWebTreeView.ValidateItemName(const Value: string);
|
|
begin
|
|
if ItemByName(Value) <> nil then
|
|
raise EComponentError.CreateResFmt(@SDuplicateName, [Value]);
|
|
end;
|
|
|
|
procedure TcxWebTreeView.Expand(AItem: TcxWebTreeItem);
|
|
begin
|
|
if Assigned(FOnExpanded) then FOnExpanded(Self, AItem);
|
|
end;
|
|
|
|
function TcxWebTreeView.CanExpand(AItem: TcxWebTreeItem): Boolean;
|
|
begin
|
|
Result := True;
|
|
if Assigned(FOnExpanding) then FOnExpanding(Self, AItem, Result);
|
|
end;
|
|
|
|
procedure TcxWebTreeView.Click(AItem: TcxWebTreeItem);
|
|
begin
|
|
if Assigned(FOnClick) and (AItem <> nil) then
|
|
FOnClick(Self, AItem);
|
|
end;
|
|
|
|
procedure TcxWebTreeView.Collapse(AItem: TcxWebTreeItem);
|
|
begin
|
|
if Assigned(FOnCollapsed) then FOnCollapsed(Self, AItem);
|
|
end;
|
|
|
|
function TcxWebTreeView.CanCollapse(AItem: TcxWebTreeItem): Boolean;
|
|
begin
|
|
Result := True;
|
|
if Assigned(FOnCollapsing) then FOnCollapsing(Self, AItem, Result);
|
|
end;
|
|
|
|
procedure TcxWebTreeView.DefineProperties(Filer: TFiler);
|
|
begin
|
|
inherited DefineProperties(Filer);
|
|
Filer.DefineBinaryProperty('Items', ReadItems, WriteItems, Items.Count > 0);
|
|
end;
|
|
|
|
procedure TcxWebTreeView.ReadItems(Stream: TStream);
|
|
begin
|
|
Items.DeleteChildren;
|
|
Items.ReadData(Stream);
|
|
end;
|
|
|
|
procedure TcxWebTreeView.WriteItems(Stream: TStream);
|
|
begin
|
|
Items.WriteData(Stream);
|
|
end;
|
|
|
|
procedure TcxWebTreeView.ScriptsSubscription;
|
|
begin
|
|
inherited;
|
|
WebScriptsHelper.ScriptSubscription(TcxWebPostBackScript);
|
|
WebScriptsHelper.ScriptSubscription(TcxWebChangeStyleScript);
|
|
end;
|
|
|
|
procedure TcxWebTreeView.Notification(AComponent: TComponent;
|
|
Operation: TOperation);
|
|
begin
|
|
inherited Notification(AComponent, Operation);
|
|
if (Operation = opRemove) and (AComponent = Images) then
|
|
Images := nil;
|
|
end;
|
|
|
|
procedure TcxWebTreeView.RegisterActions;
|
|
begin
|
|
WebActionsHelper.RegisterAction('TOGGLE', DoToggle);
|
|
WebActionsHelper.RegisterAction('CLICK', DoClick);
|
|
end;
|
|
|
|
function TcxWebTreeView.GetWebEventsHelper: TcxWebTreeViewEventsHelper;
|
|
begin
|
|
Result := inherited GetWebEventsHelper as TcxWebTreeViewEventsHelper;
|
|
end;
|
|
|
|
class function TcxWebTreeView.GetWebEventsHelperClass: TcxWebEventsHelperClass;
|
|
begin
|
|
Result := TcxWebTreeViewEventsHelper;
|
|
end;
|
|
|
|
procedure TcxWebTreeView.RegisterRenderers;
|
|
begin
|
|
WebRenderHelper.RegisterRenderer(TcxWebTreeViewRenderer);
|
|
WebRenderHelper.RegisterRenderer(TcxWebTreeViewNS4Renderer);
|
|
WebRenderHelper.RegisterRenderer(TcxWebTreeViewNS6Renderer);
|
|
WebRenderHelper.RegisterRenderer(TcxWebTreeViewOperaRenderer);
|
|
end;
|
|
|
|
procedure TcxWebTreeView.RegisterValues;
|
|
begin
|
|
WebValuesHelper.RegisterValue(Name + '_EXPANDSTATE', '');
|
|
end;
|
|
|
|
procedure TcxWebTreeView.RestoreState(const AState: string);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
with TStringList.Create do
|
|
try
|
|
CommaText := AState;
|
|
for I := 0 to Count - 2 do
|
|
try
|
|
ItemByName(Names[I]).Expanded := Boolean(StrToInt(Values[Names[I]]));
|
|
except
|
|
end;
|
|
finally
|
|
Free;
|
|
end;
|
|
end;
|
|
|
|
function TcxWebTreeView.AddItem: TcxWebTreeItem;
|
|
begin
|
|
Result := Items.AddChild;
|
|
end;
|
|
|
|
procedure TcxWebTreeView.AssignItems(Source: TcxWebTreeView);
|
|
var
|
|
MemStream: TMemoryStream;
|
|
begin
|
|
if Source = nil then
|
|
Clear
|
|
else
|
|
begin
|
|
MemStream := TMemoryStream.Create;
|
|
try
|
|
TcxWebTreeView(Source).WriteItems(MemStream);
|
|
MemStream.Position := 0;
|
|
ReadItems(MemStream);
|
|
UpdateDesignerContext;
|
|
finally
|
|
MemStream.Free;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxWebTreeView.Clear;
|
|
begin
|
|
Items.DeleteChildren;
|
|
end;
|
|
|
|
procedure TcxWebTreeView.FullCollapse;
|
|
begin
|
|
Items.Collapse(True);
|
|
end;
|
|
|
|
procedure TcxWebTreeView.FullExpand;
|
|
begin
|
|
Items.Expand(True);
|
|
end;
|
|
|
|
procedure TcxWebTreeView.DoClick(const Parameters: TcxActionParameters);
|
|
var
|
|
Item: TcxWebTreeItem;
|
|
begin
|
|
Item := ItemByName(Parameters.ParamString);
|
|
Click(Item);
|
|
end;
|
|
|
|
procedure TcxWebTreeView.DoToggle(const Parameters: TcxActionParameters);
|
|
var
|
|
Item: TcxWebTreeItem;
|
|
begin
|
|
Item := ItemByName(Parameters.ParamString);
|
|
if Item <> nil then
|
|
if Item.Expanded then
|
|
Item.Collapse(False)
|
|
else
|
|
Item.Expand(False);
|
|
end;
|
|
|
|
procedure TcxWebTreeView.DoSetValues;
|
|
begin
|
|
RestoreState(WebValuesHelper.Values.Values[Name + '_EXPANDSTATE']);
|
|
end;
|
|
|
|
function TcxWebTreeView.GetForcePostBack: Boolean;
|
|
begin
|
|
Result := FForcePostBack or
|
|
Assigned(FOnCollapsed) or Assigned(FOnCollapsing) or
|
|
Assigned(FOnExpanded) or Assigned(FOnExpanding);
|
|
end;
|
|
|
|
procedure TcxWebTreeView.SetImages(Value: TcxWebImageList);
|
|
begin
|
|
if FImages <> Value then
|
|
begin
|
|
if Assigned(FImages) then
|
|
begin
|
|
FImages.RemoveFreeNotification(Self);
|
|
FImages.UnregisterClient(Self);
|
|
end;
|
|
FImages := Value;
|
|
if Assigned(FImages) then
|
|
begin
|
|
FImages.RegisterClient(Self);
|
|
FImages.FreeNotification(Self);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxWebTreeView.SetAutoSort(Value: Boolean);
|
|
begin
|
|
if FAutoSort <> Value then
|
|
begin
|
|
FAutoSort := Value;
|
|
if Value then FItems.ApplySorting(True);
|
|
end;
|
|
end;
|
|
|
|
function TcxWebTreeView.IsValidIndex(AIndex: Integer): Boolean;
|
|
begin
|
|
Result := (FImages <> nil) and (AIndex > -1) and (AIndex < FImages.Images.Count);
|
|
end;
|
|
|
|
{ TcxWebTreeViewRenderer }
|
|
|
|
function TcxWebTreeViewRenderer.GetWebTreeView: TcxWebTreeView;
|
|
begin
|
|
Result := Component as TcxWebTreeView;
|
|
end;
|
|
|
|
function TcxWebTreeViewRenderer.GetExpandImageHint: string;
|
|
var
|
|
ImgIndex: Integer;
|
|
begin
|
|
ImgIndex := WebTreeView.ExpandedImageIndex;
|
|
if WebTreeView.IsValidIndex(ImgIndex) then
|
|
Result := WebTreeView.FImages.Images[ImgIndex].Hint
|
|
else Result := 'Collapse';
|
|
end;
|
|
|
|
function TcxWebTreeViewRenderer.GetExpandImagePath: string;
|
|
var
|
|
ImgIndex: Integer;
|
|
begin
|
|
ImgIndex := WebTreeView.ExpandedImageIndex;
|
|
if WebTreeView.IsValidIndex(ImgIndex) then
|
|
Result := WebTreeView.FImages.Images[ImgIndex].FullFilePath
|
|
else Result := QualifyImageFileName(scxtvExpandImageName);
|
|
end;
|
|
|
|
function TcxWebTreeViewRenderer.GetCollapseImageHint: string;
|
|
var
|
|
ImgIndex: Integer;
|
|
begin
|
|
ImgIndex := WebTreeView.CollapsedImageIndex;
|
|
if WebTreeView.IsValidIndex(ImgIndex) then
|
|
Result := WebTreeView.FImages.Images[ImgIndex].Hint
|
|
else Result := 'Expand';
|
|
end;
|
|
|
|
function TcxWebTreeViewRenderer.GetCollapseImagePath: string;
|
|
var
|
|
ImgIndex: Integer;
|
|
begin
|
|
ImgIndex := WebTreeView.CollapsedImageIndex;
|
|
if WebTreeView.IsValidIndex(ImgIndex) then
|
|
Result := WebTreeView.FImages.Images[ImgIndex].FullFilePath
|
|
else Result := QualifyImageFileName(scxtvCollapseImageName);
|
|
end;
|
|
|
|
procedure TcxWebTreeViewRenderer.SetDefaultStyleProc(const Style: TcxWebStyleItem; var AScript: string);
|
|
begin
|
|
AScript := '__ChangeStyle(event, this);';
|
|
end;
|
|
|
|
procedure TcxWebTreeViewRenderer.SetHoverStyleProc(const Style: TcxWebStyleItem; var AScript: string);
|
|
begin
|
|
if Style <> nil then
|
|
AScript := Format('__ChangeStyle(event, this, ''%s'');', [Style.FullName])
|
|
else AScript := '';
|
|
end;
|
|
|
|
procedure TcxWebTreeViewRenderer.WriteNodeEvents(const Style: TcxWebStyleItem);
|
|
var
|
|
MouseOutString, MouseOverString: string;
|
|
begin
|
|
if Style <> nil then
|
|
begin
|
|
SetHoverStyleProc(Style, MouseOverString);
|
|
SetDefaultStyleProc(Style, MouseOutString);
|
|
|
|
HTMLTextBuilder.WriteEventAttribute(eOnMouseOver, MouseOverString);
|
|
HTMLTextBuilder.WriteEventAttribute(eOnMouseOut, MouseOutString);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxWebTreeViewRenderer.WriteBlockStyle(AItem: TcxWebTreeItem);
|
|
begin
|
|
if AItem.HasChildren and not AItem.Expanded then
|
|
HTMLTextBuilder.WriteStyleAttribute(saDisplay, 'none');
|
|
if AItem.Level >= 0 then
|
|
HTMLTextBuilder.WriteStyleAttribute(saMarginLeft, AItem.Owner.Indent);
|
|
end;
|
|
|
|
procedure TcxWebTreeViewRenderer.WriteItem(AItem: TcxWebTreeItem);
|
|
var
|
|
LeftMargin: Integer;
|
|
ImagePath: string;
|
|
begin
|
|
LeftMargin := WebTreeView.Indent;
|
|
if WebTreeView.ShowButtons and AItem.HasChildren then
|
|
LeftMargin := WebTreeView.Indent - 13;
|
|
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagDiv, True, False);
|
|
HTMLTextBuilder.WriteAttribute(aId, AItem.Name);
|
|
HTMLTextBuilder.WriteStyleAttribute(saMarginLeft, LeftMargin);
|
|
HTMLTextBuilder.WriteStyleAttribute(saMarginTop, WebTreeView.VertIndent);
|
|
|
|
if WebTreeView.ShowButtons and AItem.HasChildren then
|
|
begin
|
|
if AItem.Expanded then
|
|
ImagePath := GetExpandImagePath
|
|
else ImagePath := GetCollapseImagePath;
|
|
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagA, False, False);
|
|
HTMLTextBuilder.WriteSingleTag(TcxHTMLTagImg, False, False);
|
|
HTMLTextBuilder.WriteAttribute(aId, AItem.Name + '_Img');
|
|
HTMLTextBuilder.WriteAttribute(aSrc, ImagePath);
|
|
HTMLTextBuilder.WriteAttribute(aBorder, 0);
|
|
HTMLTextBuilder.WriteAttribute(aHspace, 0);
|
|
HTMLTextBuilder.WriteAttribute(aVspace, 0);
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagA, False, False);
|
|
end;
|
|
if WebTreeView.ShowImages and WebTreeView.IsValidIndex(AItem.ImageIndex) then
|
|
WebTreeView.Images.Images[AItem.ImageIndex].WriteHTML(HTMLTextBuilder);
|
|
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagA, False, False);
|
|
AItem.URL.Write(HTMLTextBuilder);
|
|
HTMLTextBuilder.WriteStyleAttribute(saCursor, 'hand');
|
|
HTMLTextBuilder.WriteAttribute(aTitle, AItem.Hint);
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagSpan, False, False);
|
|
WriteDefaultStyle;
|
|
WriteNodeEvents(WebTreeView.Styles.Hover);
|
|
HTMLTextBuilder.WriteStyleAttribute(saBorderWidth, '0px');
|
|
HTMLTextBuilder.WriteText(AItem.Text, False, False);
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagSpan, False, False);
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagA, False, False);
|
|
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagDiv, False, True);
|
|
end;
|
|
|
|
procedure TcxWebTreeViewRenderer.WriteItems(AItem: TcxWebTreeItem);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
WriteItem(AItem);
|
|
if AItem.HasChildren and (not WebTreeView.IsDesigning or AItem.Expanded) then
|
|
begin
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagDiv);
|
|
HTMLTextBuilder.WriteAttribute(aId, 'Sub_' + AItem.Name);
|
|
WriteBlockStyle(AItem);
|
|
for I := 0 to AItem.Count - 1 do
|
|
WriteItems(AItem.Items[I]);
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagDiv);
|
|
end;
|
|
end;
|
|
|
|
class procedure TcxWebTreeViewRenderer.GetScriptFiles(AList: TStrings);
|
|
begin
|
|
AList.Add(scxCommonScriptName);
|
|
AList.Add(scxTreeViewScriptName);
|
|
end;
|
|
|
|
procedure TcxWebTreeViewRenderer.WriteHiddenFormElements;
|
|
begin
|
|
WriteHiddenField(WebTreeView.Name + '_EXPANDSTATE', '');
|
|
end;
|
|
|
|
procedure TcxWebTreeViewRenderer.WriteHTML;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTable);
|
|
HTMLTextBuilder.WriteAttribute(aBorder, 0);
|
|
HTMLTextBuilder.WriteAttribute(aCellpadding, 0);
|
|
HTMLTextBuilder.WriteAttribute(aCellspacing, 0);
|
|
WriteID;
|
|
WritePopupMenu;
|
|
WriteAttributes;
|
|
WritePosition;
|
|
WriteZIndex;
|
|
WriteStyleAttributes;
|
|
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTr);
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTd);
|
|
HTMLTextBuilder.WriteAttribute(aAlign, 'left');
|
|
HTMLTextBuilder.WriteAttribute(aValign, 'top');
|
|
HTMLTextBuilder.WriteAttribute(aHeight, WebTreeView.Height);
|
|
HTMLTextBuilder.WriteAttribute(aWidth, WebTreeView.Width);
|
|
if WebTreeView.Styles.Default <> nil then
|
|
WriteDefaultStyle
|
|
else
|
|
begin
|
|
HTMLTextBuilder.WriteStyleAttribute(saBorderColor, 'black');
|
|
HTMLTextBuilder.WriteStyleAttribute(saBorderStyle, 'solid');
|
|
HTMLTextBuilder.WriteStyleAttribute(saBorderWidth, '1px');
|
|
end;
|
|
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagDiv);
|
|
HTMLTextBuilder.WriteEventAttribute(eOnClick, Format('TreeNodeClick(''%s'', event, %s)',
|
|
[WebTreeView.Name, cxWebUtils.BoolToStr(Assigned(WebTreeView.OnClick))]));
|
|
for I := 0 to WebTreeView.Items.Count - 1 do
|
|
WriteItems(WebTreeView.Items[I]);
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagDiv);
|
|
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTd);
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTr);
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTable);
|
|
end;
|
|
|
|
procedure TcxWebTreeViewRenderer.WriteScripts;
|
|
begin
|
|
WriteEventsScript;
|
|
HTMLTextBuilder.WriteText('_TreeView = CreateTreeView();');
|
|
HTMLTextBuilder.WriteText(Format(' _TreeView.Name="%s";', [WebTreeView.Name]));
|
|
if WebTreeView.ForcePostBack then
|
|
HTMLTextBuilder.WriteText(' _TreeView.ForcePostBack = true;');
|
|
if WebTreeView.ShowButtons then
|
|
begin
|
|
HTMLTextBuilder.WriteText(Format(' _TreeView.ColImg="%s";', [GetCollapseImagePath]));
|
|
HTMLTextBuilder.WriteText(Format(' _TreeView.ExpImg="%s";', [GetExpandImagePath]));
|
|
HTMLTextBuilder.WriteText(Format(' _TreeView.ColTitle="%s";', [GetCollapseImageHint]));
|
|
HTMLTextBuilder.WriteText(Format(' _TreeView.ExpTitle="%s";', [GetExpandImageHint]));
|
|
end;
|
|
WriteEvents;
|
|
end;
|
|
|
|
{ TcxWebTreeViewNS4Renderer }
|
|
|
|
procedure TcxWebTreeViewNS4Renderer.WriteItem(AItem: TcxWebTreeItem);
|
|
var
|
|
LeftMargin: Integer;
|
|
ImagePath: string;
|
|
begin
|
|
LeftMargin := WebTreeView.Indent;
|
|
if WebTreeView.ShowButtons and AItem.HasChildren then
|
|
LeftMargin := WebTreeView.Indent - 13;
|
|
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagDiv, True, False);
|
|
HTMLTextBuilder.WriteStyleAttribute(saMarginLeft, LeftMargin);
|
|
HTMLTextBuilder.WriteStyleAttribute(saMarginTop, WebTreeView.VertIndent);
|
|
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTable, False, False);
|
|
HTMLTextBuilder.WriteAttribute(aBorder, 0);
|
|
HTMLTextBuilder.WriteAttribute(aCellpadding, 0);
|
|
HTMLTextBuilder.WriteAttribute(aCellspacing, 0);
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTr, False, False);
|
|
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTd, False, False);
|
|
if WebTreeView.ShowButtons and AItem.HasChildren then
|
|
begin
|
|
if AItem.Expanded then
|
|
ImagePath := GetExpandImagePath
|
|
else ImagePath := GetCollapseImagePath;
|
|
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagA, False, False);
|
|
HTMLTextBuilder.WriteAttribute(aHref, Format('javascript:__doPostBack(''%s'', ''TOGGLE:%s'');',
|
|
[WebTreeView.Name, AItem.Name]));
|
|
HTMLTextBuilder.WriteSingleTag(TcxHTMLTagImg, False, False);
|
|
HTMLTextBuilder.WriteAttribute(aId, AItem.Name + '_Img');
|
|
HTMLTextBuilder.WriteAttribute(aSrc, ImagePath);
|
|
HTMLTextBuilder.WriteAttribute(aBorder, 0);
|
|
HTMLTextBuilder.WriteAttribute(aHspace, 0);
|
|
HTMLTextBuilder.WriteAttribute(aVspace, 0);
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagA, False, False);
|
|
end;
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTd, False, False);
|
|
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTd, False, False);
|
|
if WebTreeView.ShowImages and WebTreeView.IsValidIndex(AItem.ImageIndex) then
|
|
WebTreeView.Images.Images[AItem.ImageIndex].WriteHTML(HTMLTextBuilder);
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTd, False, False);
|
|
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTd, False, False);
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagA, False, False);
|
|
if AItem.URL.Href <> '' then
|
|
AItem.URL.Write(HTMLTextBuilder)
|
|
else HTMLTextBuilder.WriteAttribute(aHref, Format('javascript:__doPostBack(''%s'', ''CLICK:%s'')',
|
|
[WebTreeView.Name, AItem.Name]));
|
|
HTMLTextBuilder.WriteAttribute(aTitle, AItem.Hint);
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagSpan, False, False);
|
|
WriteDefaultStyle;
|
|
WriteNodeEvents(WebTreeView.Styles.Hover);
|
|
HTMLTextBuilder.WriteStyleAttribute(saBorderWidth, '0px');
|
|
HTMLTextBuilder.WriteText(AItem.Text, False, False);
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagSpan, False, False);
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagA, False, False);
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTd, False, False);
|
|
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTr, False, False);
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTable, False, False);
|
|
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagDiv, False, True);
|
|
end;
|
|
|
|
procedure TcxWebTreeViewNS4Renderer.WriteItems(AItem: TcxWebTreeItem);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
WriteItem(AItem);
|
|
if AItem.HasChildren then
|
|
begin
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagDiv);
|
|
WriteBlockStyle(AItem);
|
|
for I := 0 to AItem.Count - 1 do
|
|
WriteItems(AItem.Items[I]);
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagDiv);
|
|
end;
|
|
end;
|
|
|
|
class function TcxWebTreeViewNS4Renderer.IsBrowserSupported(AWebBrowser: TcxWebBrowserClass): Boolean;
|
|
begin
|
|
Result := AWebBrowser = TcxWebBrowserNS4;
|
|
end;
|
|
|
|
class procedure TcxWebTreeViewNS4Renderer.GetScriptFiles(AList: TStrings);
|
|
begin
|
|
AList.Add(scxCommonScriptName);
|
|
AList.Add(scxTreeViewScriptName);
|
|
end;
|
|
|
|
procedure TcxWebTreeViewNS4Renderer.WriteHiddenFormElements;
|
|
begin
|
|
end;
|
|
|
|
procedure TcxWebTreeViewNS4Renderer.WriteHTML;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTable);
|
|
HTMLTextBuilder.WriteAttribute(aBorder, 0);
|
|
HTMLTextBuilder.WriteAttribute(aCellpadding, 0);
|
|
HTMLTextBuilder.WriteAttribute(aCellspacing, 0);
|
|
WriteID;
|
|
WritePopupMenu;
|
|
WriteAttributes;
|
|
WriteStyleAttributes;
|
|
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTr);
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTd);
|
|
HTMLTextBuilder.WriteAttribute(aAlign, 'left');
|
|
HTMLTextBuilder.WriteAttribute(aValign, 'top');
|
|
HTMLTextBuilder.WriteAttribute(aHeight, WebTreeView.Height);
|
|
HTMLTextBuilder.WriteAttribute(aWidth, WebTreeView.Width);
|
|
if WebTreeView.Styles.Default <> nil then
|
|
WriteDefaultStyle
|
|
else
|
|
begin
|
|
HTMLTextBuilder.WriteStyleAttribute(saBorderColor, 'black');
|
|
HTMLTextBuilder.WriteStyleAttribute(saBorderStyle, 'solid');
|
|
HTMLTextBuilder.WriteStyleAttribute(saBorderWidth, '1px');
|
|
end;
|
|
|
|
for I := 0 to WebTreeView.Items.Count - 1 do
|
|
WriteItems(WebTreeView.Items[I]);
|
|
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTd);
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTr);
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTable);
|
|
end;
|
|
|
|
procedure TcxWebTreeViewNS4Renderer.WriteScripts;
|
|
begin
|
|
end;
|
|
|
|
{ TcxWebTreeViewNS6Renderer }
|
|
class function TcxWebTreeViewNS6Renderer.IsBrowserSupported(AWebBrowser: TcxWebBrowserClass): Boolean;
|
|
begin
|
|
Result := AWebBrowser = TcxWebBrowserNS6;
|
|
end;
|
|
|
|
procedure TcxWebTreeViewNS6Renderer.WriteItem(AItem: TcxWebTreeItem);
|
|
var
|
|
LeftMargin: Integer;
|
|
ImagePath: string;
|
|
begin
|
|
LeftMargin := WebTreeView.Indent;
|
|
if WebTreeView.ShowButtons and AItem.HasChildren then
|
|
LeftMargin := WebTreeView.Indent - 13;
|
|
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagDiv, True, False);
|
|
HTMLTextBuilder.WriteAttribute(aId, AItem.Name);
|
|
HTMLTextBuilder.WriteStyleAttribute(saMarginLeft, LeftMargin);
|
|
HTMLTextBuilder.WriteStyleAttribute(saMarginTop, WebTreeView.VertIndent);
|
|
|
|
if WebTreeView.ShowButtons and AItem.HasChildren then
|
|
begin
|
|
if AItem.Expanded then
|
|
ImagePath := GetExpandImagePath
|
|
else ImagePath := GetCollapseImagePath;
|
|
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagA, False, False);
|
|
HTMLTextBuilder.WriteAttribute(aHref, Format('javascript:TreeNodeToggle(''%s'', ''%s'')',
|
|
[WebTreeView.Name, AItem.Name]));
|
|
HTMLTextBuilder.WriteSingleTag(TcxHTMLTagImg, False, False);
|
|
HTMLTextBuilder.WriteAttribute(aId, AItem.Name + '_Img');
|
|
HTMLTextBuilder.WriteAttribute(aSrc, ImagePath);
|
|
HTMLTextBuilder.WriteAttribute(aBorder, 0);
|
|
HTMLTextBuilder.WriteAttribute(aHspace, 0);
|
|
HTMLTextBuilder.WriteAttribute(aVspace, 0);
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagA, False, False);
|
|
end;
|
|
if WebTreeView.ShowImages and WebTreeView.IsValidIndex(AItem.ImageIndex) then
|
|
WebTreeView.Images.Images[AItem.ImageIndex].WriteHTML(HTMLTextBuilder);
|
|
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagA, False, False);
|
|
AItem.URL.Write(HTMLTextBuilder);
|
|
HTMLTextBuilder.WriteStyleAttribute(saCursor, 'hand');
|
|
HTMLTextBuilder.WriteAttribute(aTitle, AItem.Hint);
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagSpan, False, False);
|
|
WriteDefaultStyle;
|
|
WriteNodeEvents(WebTreeView.Styles.Hover);
|
|
HTMLTextBuilder.WriteEventAttribute(eOnClick, Format('TreeNodeClick(''%s'', event, %s)',
|
|
[WebTreeView.Name, cxWebUtils.BoolToStr(Assigned(WebTreeView.OnClick))]));
|
|
HTMLTextBuilder.WriteStyleAttribute(saBorderWidth, '0px');
|
|
HTMLTextBuilder.WriteText(AItem.Text, False, False);
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagSpan, False, False);
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagA, False, False);
|
|
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagDiv, False, True);
|
|
end;
|
|
|
|
procedure TcxWebTreeViewNS6Renderer.WriteHTML;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTable);
|
|
HTMLTextBuilder.WriteAttribute(aBorder, 0);
|
|
HTMLTextBuilder.WriteAttribute(aCellpadding, 0);
|
|
HTMLTextBuilder.WriteAttribute(aCellspacing, 0);
|
|
WriteID;
|
|
WritePopupMenu;
|
|
WriteAttributes;
|
|
WritePosition;
|
|
WriteZIndex;
|
|
WriteStyleAttributes;
|
|
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTr);
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTd);
|
|
HTMLTextBuilder.WriteAttribute(aAlign, 'left');
|
|
HTMLTextBuilder.WriteAttribute(aValign, 'top');
|
|
HTMLTextBuilder.WriteAttribute(aHeight, WebTreeView.Height);
|
|
HTMLTextBuilder.WriteAttribute(aWidth, WebTreeView.Width);
|
|
if WebTreeView.Styles.Default <> nil then
|
|
WriteDefaultStyle
|
|
else
|
|
begin
|
|
HTMLTextBuilder.WriteStyleAttribute(saBorderColor, 'black');
|
|
HTMLTextBuilder.WriteStyleAttribute(saBorderStyle, 'solid');
|
|
HTMLTextBuilder.WriteStyleAttribute(saBorderWidth, '1px');
|
|
end;
|
|
|
|
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagDiv);
|
|
for I := 0 to WebTreeView.Items.Count - 1 do
|
|
WriteItems(WebTreeView.Items[I]);
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagDiv);
|
|
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTd);
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTr);
|
|
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTable);
|
|
end;
|
|
|
|
{ TcxWebTreeViewOperaRenderer }
|
|
|
|
class function TcxWebTreeViewOperaRenderer.IsBrowserSupported(
|
|
AWebBrowser: TcxWebBrowserClass): Boolean;
|
|
begin
|
|
Result := AWebBrowser = TcxWebBrowserOpera;
|
|
end;
|
|
|
|
initialization
|
|
RegisterClasses([TcxWebTreeItem, TcxWebTreeView]);
|
|
|
|
end.
|