Componentes.Terceros.DevExp.../internal/x.44/1/ExpressWeb Framework/Sources/cxWebDataNavigator.pas
2009-06-29 12:09:02 +00:00

1040 lines
38 KiB
ObjectPascal

{*******************************************************************}
{ }
{ ExpressWeb Framework by Developer Express }
{ Visual Web Controls 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 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 cxWebDataNavigator;
{$I cxVer.inc}
interface
uses
Classes, TypInfo, Contnrs, SysUtils,
cxWebIntf, cxWebClasses, cxWebControls, cxWebTypes, cxWebMenus, cxWebImgList,
cxWebRender;
const
cxWebDataNavigatorBitmapHeight = 24;
cxWebDataNavigatorBitmapWidth = 24;
type
TcxWebDataNavigatorButtons = class;
TcxCustomWebDataNavigator = class;
TcxWebNavigatorButtonType = (nbFirst, nbPrevPage, nbPrev, nbPageSize, nbApplyPageSize,
nbNext, nbNextPage, nbLast, nbInsert, nbEdit, nbDelete, nbPost, nbCancel, nbRefresh, nbCustom);
TcxWebDataNavigatorButton = class(TCollectionItem)
private
FButtonType: TcxWebNavigatorButtonType;
FHint: string;
FImageIndex: Integer;
FVisible: Boolean;
FOnClick: TNotifyEvent;
function GetButtons: TcxWebDataNavigatorButtons;
function GetNavigator: TcxCustomWebDataNavigator;
procedure SetButtonType(Value: TcxWebNavigatorButtonType);
procedure SetHint(Value: string);
procedure SetImageIndex(Value: Integer);
procedure SetVisible(Value: Boolean);
protected
function GetDisplayName: string; override;
public
constructor Create(Collection: TCollection); override;
property Buttons: TcxWebDataNavigatorButtons read GetButtons;
property Navigator: TcxCustomWebDataNavigator read GetNavigator;
published
property ButtonType: TcxWebNavigatorButtonType read FButtonType write SetButtonType;
property Hint: string read FHint write SetHint;
property ImageIndex: Integer read FImageIndex write SetImageIndex default -1;
property Visible: Boolean read FVisible write SetVisible default True;
property OnClick: TNotifyEvent read FOnClick write FOnClick;
end;
TcxWebDataNavigatorButtons = class(TCollection)
private
FNavigator: TcxCustomWebDataNavigator;
FUpdateLock: Integer;
function GetItem(Index: Integer): TcxWebDataNavigatorButton;
procedure SetItem(Index: Integer; Value: TcxWebDataNavigatorButton);
protected
function GetOwner: TPersistent; override;
procedure Update(Item: TCollectionItem); override;
procedure CreateButton(AType: TcxWebNavigatorButtonType; AHint: string;
AImageIndex: Integer; AVisible: Boolean);
procedure BeginUpdateNavigator;
procedure EndUpdateNavigator;
procedure UpdateNavigatorContext; virtual;
procedure UpdateNavigatorWidth; virtual;
public
constructor Create(ANavigator: TcxCustomWebDataNavigator);
function Add: TcxWebDataNavigatorButton;
procedure CreateDefaultButtons; virtual;
property Navigator: TcxCustomWebDataNavigator read FNavigator;
property Items[Index: Integer]: TcxWebDataNavigatorButton read GetItem write SetItem; default;
end;
TcxWebNavigatorEvent = (neOnButtonClick, neOnChangePageSize);
TcxWebNavigatorEventsHelper = 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;
TcxChangePageSizeEvent = procedure (Sender: TObject; PageSize: Integer) of object;
TcxCustomWebDataNavigator = class(TcxWebControl)
private
FButtons: TcxWebDataNavigatorButtons;
FButtonWidth: Integer;
FImages: TcxWebImageList;
FPageSize: Integer;
FOnChangePageSize: TcxChangePageSizeEvent;
function GetButtonCount: Integer;
procedure SetButtons(Value: TcxWebDataNavigatorButtons);
procedure SetImages(Value: TcxWebImageList);
procedure SetPageSize(Value: Integer);
procedure WebClick(const AParameters: TcxActionParameters);
procedure WebChangePageSize(const AParameters: TcxActionParameters);
protected
procedure Loaded; override;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
{ Size Correction }
procedure CheckNewSize(var ALeft, ATop, ANewWidth, ANewHeight: Integer); override;
function GetMinHeight: Integer; override;
function GetMinWidth: Integer; override;
procedure UpdateButtonWidth(AWidth: Integer); virtual;
procedure UpdateWidth; virtual;
{ actions }
procedure RegisterActions; override;
{ events }
function GetWebEventsHelper: TcxWebNavigatorEventsHelper;
class function GetWebEventsHelperClass: TcxWebEventsHelperClass; override;
property WebEventsHelper: TcxWebNavigatorEventsHelper read GetWebEventsHelper;
{ values }
procedure DoSetValues; override;
procedure RegisterValues; override;
{ renderers }
procedure RegisterRenderers; override;
{ scripts }
procedure ScriptsSubscription; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property ButtonCount: Integer read GetButtonCount;
property ButtonWidth: Integer read FButtonWidth;
published
property Buttons: TcxWebDataNavigatorButtons read FButtons write SetButtons;
property Height;
property Images: TcxWebImageList read FImages write SetImages;
property PageSize: Integer read FPageSize write SetPageSize;
property PopupMenu;
property PopupShowingType;
property Styles;
property Width;
property OnChangePageSize: TcxChangePageSizeEvent read FOnChangePageSize write FOnChangePageSize;
end;
TcxNavigatorButtonStyle = class(TcxInternalWebStyle)
class function GetName: string; override;
class procedure WriteStyle(HTMLTextBuilder: TcxHTMLTextBuilder); override;
end;
TcxCustomWebDataNavigatorRenderer = class(TcxWebControlRenderer)
private
function GetWebDataNavigator: TcxCustomWebDataNavigator;
protected
procedure SetDefaultStyleProc(const Index: Integer; var AScript: string);
procedure SetHoverStyleProc(const Index: Integer; var AScript: string);
procedure WriteButtonEvents(const Index: Integer);
procedure WriteButtonAction(Index: Integer); virtual;
procedure WriteButtonHint(Index: Integer); virtual;
procedure WriteButton(Index: Integer); virtual;
procedure WriteEdit; virtual;
function GetDefaultStyleName: string;
property DefaultStyleName: string read GetDefaultStyleName;
public
procedure WriteHTML; override;
class procedure GetScriptFiles(AList: TStrings); override;
procedure WriteScripts; override;
class procedure WriteStyles(AHTMLTextBuilder: TcxHTMLTextBuilder); override;
property WebDataNavigator: TcxCustomWebDataNavigator read GetWebDataNavigator;
end;
TcxCustomWebDataNavigatorNS4Renderer = class(TcxCustomWebDataNavigatorRenderer)
protected
procedure WriteButtonAction(Index: Integer); override;
procedure WriteButton(Index: Integer); override;
procedure WriteEdit; override;
public
class function IsBrowserSupported(AWebBrowser: TcxWebBrowserClass): Boolean; override;
end;
TcxCustomWebDataNavigatorNS6Renderer = class(TcxCustomWebDataNavigatorRenderer)
protected
procedure WriteButtonAction(Index: Integer); override;
procedure WriteButton(Index: Integer); override;
public
class function IsBrowserSupported(AWebBrowser: TcxWebBrowserClass): Boolean; override;
end;
implementation
uses StrUtils,
{$IFDEF VCL}
Graphics,
{$ENDIF}
cxWebScriptFactory, cxWebConsts, cxWebUtils, cxWebColors, cxWebGraphics;
const
cxWebNavigatorImgs: array[TcxWebNavigatorButtonType] of string = (scxnbFirstImageName,
scxnbPriorPageImageName, scxnbPriorImageName, '', scxnbPgSizeImageName,
scxnbNextImageName, scxnbNextPageImageName, scxnbLastImageName, scxnbInsertImageName,
scxnbEditImageName, scxnbDeleteImageName, scxnbPostImageName, scxnbCancelImageName,
scxnbRefreshImageName, '');
{ TcxWebDataNavigatorButton }
constructor TcxWebDataNavigatorButton.Create(Collection: TCollection);
begin
inherited;
FButtonType := nbCustom;
FImageIndex := -1;
FVisible := True;
end;
function TcxWebDataNavigatorButton.GetDisplayName: string;
begin
Result := GetEnumName(TypeInfo(TcxWebNavigatorButtonType), Integer(ButtonType));
end;
function TcxWebDataNavigatorButton.GetButtons: TcxWebDataNavigatorButtons;
begin
Result := TcxWebDataNavigatorButtons(Collection);
end;
function TcxWebDataNavigatorButton.GetNavigator: TcxCustomWebDataNavigator;
begin
if Collection <> nil then
Result := TcxWebDataNavigatorButtons(Collection).Navigator
else Result := nil;
end;
procedure TcxWebDataNavigatorButton.SetButtonType(Value: TcxWebNavigatorButtonType);
begin
if FButtonType <> Value then
begin
FButtonType := Value;
Buttons.UpdateNavigatorContext;
end;
end;
procedure TcxWebDataNavigatorButton.SetHint(Value: string);
begin
if FHint <> Value then
begin
FHint := Value;
end;
end;
procedure TcxWebDataNavigatorButton.SetImageIndex(Value: Integer);
begin
if FImageIndex <> Value then
begin
FImageIndex := Value;
Buttons.UpdateNavigatorContext;
end;
end;
procedure TcxWebDataNavigatorButton.SetVisible(Value: Boolean);
begin
if FVisible <> Value then
begin
FVisible := Value;
Buttons.UpdateNavigatorWidth;
end;
end;
{ TcxWebDataNavigatorButtons }
constructor TcxWebDataNavigatorButtons.Create(ANavigator: TcxCustomWebDataNavigator);
begin
inherited Create(TcxWebDataNavigatorButton);
FUpdateLock := 0;
FNavigator := ANavigator;
CreateDefaultButtons;
end;
function TcxWebDataNavigatorButtons.Add: TcxWebDataNavigatorButton;
begin
Result := TcxWebDataNavigatorButton(inherited Add);
end;
function TcxWebDataNavigatorButtons.GetOwner: TPersistent;
begin
Result := Navigator;
end;
procedure TcxWebDataNavigatorButtons.Update(Item: TCollectionItem);
begin
inherited;
UpdateNavigatorWidth;
end;
procedure TcxWebDataNavigatorButtons.CreateButton(AType: TcxWebNavigatorButtonType; AHint: string;
AImageIndex: Integer; AVisible: Boolean);
begin
with Add do
begin
ButtonType := AType;
Hint := AHint;
ImageIndex := AImageIndex;
Visible := AVisible;
end;
end;
procedure TcxWebDataNavigatorButtons.CreateDefaultButtons;
begin
BeginUpdateNavigator;
try
Clear;
CreateButton(nbFirst, 'First record', -1, True);
CreateButton(nbPrevPage, 'Prior page', -1, True);
CreateButton(nbPrev, 'Prior record', -1, True);
CreateButton(nbPageSize, 'Page size', -1, True);
CreateButton(nbApplyPageSize, 'Apply page size', -1, True);
CreateButton(nbNext, 'Next record', -1, True);
CreateButton(nbNextPage, 'Next page', -1, True);
CreateButton(nbLast, 'Last record', -1, True);
CreateButton(nbInsert, 'Insert record', -1, True);
CreateButton(nbEdit, 'Edit record', -1, True);
CreateButton(nbDelete, 'Delete record', -1, True);
CreateButton(nbPost, 'Post changes', -1, True);
CreateButton(nbCancel, 'Cancel changes', -1, True);
CreateButton(nbRefresh, 'Refresh', -1, True);
finally
EndUpdateNavigator;
end;
end;
procedure TcxWebDataNavigatorButtons.BeginUpdateNavigator;
begin
Inc(FUpdateLock);
end;
procedure TcxWebDataNavigatorButtons.EndUpdateNavigator;
begin
Dec(FUpdateLock);
if FUpdateLock = 0 then UpdateNavigatorWidth;
end;
procedure TcxWebDataNavigatorButtons.UpdateNavigatorContext;
begin
if (FUpdateLock = 0) and (Navigator <> nil) then
Navigator.UpdateDesignerContext;
end;
procedure TcxWebDataNavigatorButtons.UpdateNavigatorWidth;
begin
if (FUpdateLock = 0) and (Navigator <> nil) then
Navigator.UpdateWidth;
end;
function TcxWebDataNavigatorButtons.GetItem(Index: Integer): TcxWebDataNavigatorButton;
begin
Result := TcxWebDataNavigatorButton(inherited Items[Index]);
end;
procedure TcxWebDataNavigatorButtons.SetItem(Index: Integer; Value: TcxWebDataNavigatorButton);
begin
Items[Index].Assign(Value);
end;
{ TcxWebNavigatorEventsHelper }
function TcxWebNavigatorEventsHelper.EventName(const AEvent: Integer): string;
const
cxHTMLEvent: array[TcxWebNavigatorEvent] of string = ('OnButtonClick',
'OnChangePageSize');
begin
Result := cxHTMLEvent[TcxWebNavigatorEvent(AEvent)];
end;
function TcxWebNavigatorEventsHelper.EventProcParams(const AEvent: Integer): string;
const
cxHTMLEventProcParams: array[TcxWebNavigatorEvent] of string = ('(Sender, Button)',
'(Sender, PageSize)');
begin
Result := cxHTMLEventProcParams[TcxWebNavigatorEvent(AEvent)];
end;
function TcxWebNavigatorEventsHelper.ScriptObject: string;
begin
Result := '_DataNavigator';
end;
function TcxWebNavigatorEventsHelper.EventTypeInfo: PTypeInfo;
begin
Result := TypeInfo(TcxWebNavigatorEvent);
end;
{ TcxCustomWebDataNavigator }
constructor TcxCustomWebDataNavigator.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FButtons := TcxWebDataNavigatorButtons.Create(Self);
Height := 24;
FPageSize := 5;
Width := 336;
Width := ButtonWidth * ButtonCount;
end;
destructor TcxCustomWebDataNavigator.Destroy;
begin
FButtons.Free;
inherited Destroy;
end;
function TcxCustomWebDataNavigator.GetButtonCount: Integer;
begin
if Buttons <> nil then
Result := Buttons.Count
else Result := 0;
end;
procedure TcxCustomWebDataNavigator.SetButtons(Value: TcxWebDataNavigatorButtons);
begin
Assign(Value);
end;
procedure TcxCustomWebDataNavigator.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 TcxCustomWebDataNavigator.SetPageSize(Value: Integer);
begin
if FPageSize <> Value then
begin
FPageSize := Value;
if not IsLoading and Assigned(FOnChangePageSize) then
FOnChangePageSize(Self, FPageSize);
end;
end;
procedure TcxCustomWebDataNavigator.WebClick(const AParameters: TcxActionParameters);
var
ButtonIndex: Integer;
begin
ButtonIndex := StrToInt(GetActionParameter(AParameters.ParamString, 0));
if Assigned(Buttons[ButtonIndex].OnClick) then
Buttons[ButtonIndex].OnClick(Self);
end;
procedure TcxCustomWebDataNavigator.WebChangePageSize(const AParameters: TcxActionParameters);
begin
PageSize := StrToInt(GetActionParameter(AParameters.ParamString, 0));
if Assigned(FOnChangePageSize) then FOnChangePageSize(Self, FPageSize);
end;
procedure TcxCustomWebDataNavigator.DoSetValues;
begin
FPageSize := StrToInt(WebValuesHelper.Values.Values[Name + 'PageSizeEdit']);
end;
procedure TcxCustomWebDataNavigator.RegisterValues;
begin
inherited;
WebValuesHelper.RegisterValue(Name + 'PageSizeEdit', IntToStr(PageSize));
end;
procedure TcxCustomWebDataNavigator.Loaded;
begin
inherited;
UpdateButtonWidth(Width);
end;
procedure TcxCustomWebDataNavigator.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (AComponent = Images) then
Images := nil;
end;
procedure TcxCustomWebDataNavigator.CheckNewSize(var ALeft, ATop, ANewWidth, ANewHeight: Integer);
var
I, NavigatorWidth: Integer;
begin
inherited CheckNewSize(ALeft, ATop, ANewWidth, ANewHeight);
UpdateButtonWidth(ANewWidth);
if not IsLoading and (ButtonCount > 0) then
begin
NavigatorWidth := 0;
for I := 0 to ButtonCount - 1 do
begin
if not Buttons[I].Visible then continue;
if Buttons[I].ButtonType = nbPageSize then
Inc(NavigatorWidth, ButtonWidth);
Inc(NavigatorWidth, ButtonWidth);
end;
if NavigatorWidth > 0 then ANewWidth := NavigatorWidth;
end;
end;
function TcxCustomWebDataNavigator.GetMinHeight: Integer;
begin
Result := cxWebDataNavigatorBitmapHeight + 2;
end;
function TcxCustomWebDataNavigator.GetMinWidth: Integer;
var
I, Count: Integer;
begin
if (ButtonCount <> 0) and not IsLoading then
begin
Count := 0;
for I := 0 to Buttons.Count - 1 do
begin
if not Buttons[I].Visible then continue;
if Buttons[I].ButtonType = nbPageSize then
Inc(Count);
Inc(Count);
end;
Result := (cxWebDataNavigatorBitmapWidth + 2) * Count;
end
else Result := 0;
end;
procedure TcxCustomWebDataNavigator.UpdateButtonWidth(AWidth: Integer);
var
I, Count: Integer;
begin
FButtonWidth := AWidth;
if ButtonCount <> 0 then
begin
Count := 0;
for I := 0 to Buttons.Count - 1 do
begin
if not Buttons[I].Visible then continue;
if Buttons[I].ButtonType = nbPageSize then
Inc(Count);
Inc(Count);
end;
if Count <> 0 then FButtonWidth := AWidth div Count;
end;
end;
procedure TcxCustomWebDataNavigator.UpdateWidth;
begin
if not IsLoading then
begin
AdjustBounds;
UpdateDesignerContext;
end;
end;
{ actions }
procedure TcxCustomWebDataNavigator.RegisterActions;
begin
WebActionsHelper.RegisterAction('', WebClick);
WebActionsHelper.RegisterAction('CLICK', WebClick);
WebActionsHelper.RegisterAction('CHANGEPAGESIZE', WebChangePageSize);
end;
{ Events }
function TcxCustomWebDataNavigator.GetWebEventsHelper: TcxWebNavigatorEventsHelper;
begin
Result := inherited GetWebEventsHelper as TcxWebNavigatorEventsHelper;
end;
class function TcxCustomWebDataNavigator.GetWebEventsHelperClass: TcxWebEventsHelperClass;
begin
Result := TcxWebNavigatorEventsHelper;
end;
{ renderers }
procedure TcxCustomWebDataNavigator.RegisterRenderers;
begin
WebRenderHelper.RegisterRenderer(TcxCustomWebDataNavigatorRenderer);
WebRenderHelper.RegisterRenderer(TcxCustomWebDataNavigatorNS4Renderer);
WebRenderHelper.RegisterRenderer(TcxCustomWebDataNavigatorNS6Renderer);
end;
{ scripts }
procedure TcxCustomWebDataNavigator.ScriptsSubscription;
begin
inherited;
WebScriptsHelper.ScriptSubscription(TcxWebPostBackScript);
end;
{ TcxNavigatorButtonStyle }
class function TcxNavigatorButtonStyle.GetName: string;
begin
Result := 'DNBtnStyle';
end;
class procedure TcxNavigatorButtonStyle.WriteStyle(HTMLTextBuilder: TcxHTMLTextBuilder);
begin
HTMLTextBuilder.WriteStyle(GetName);
HTMLTextBuilder.WriteStyleAttribute(saBorderWidth, 1, 'px');
HTMLTextBuilder.WriteStyleAttribute(saBorderStyle, 'solid');
HTMLTextBuilder.WriteStyleAttribute(saBorderTopColor, 'white');
HTMLTextBuilder.WriteStyleAttribute(saBorderLeftColor, 'white');
HTMLTextBuilder.WriteStyleAttribute(saBorderBottomColor, 'black');
HTMLTextBuilder.WriteStyleAttribute(saBorderRightColor, 'black');
HTMLTextBuilder.WriteStyleAttribute(saBackgroundColor, '#D4D0C8');
end;
{ TcxCustomWebDataNavigatorRenderer }
function TcxCustomWebDataNavigatorRenderer.GetWebDataNavigator: TcxCustomWebDataNavigator;
begin
Result := Component as TcxCustomWebDataNavigator;
end;
function TcxCustomWebDataNavigatorRenderer.GetDefaultStyleName: string;
begin
if WebDataNavigator.Styles.Default <> nil then
Result := WebDataNavigator.Styles.Default.FullName
else Result := TcxNavigatorButtonStyle.GetName;
end;
procedure TcxCustomWebDataNavigatorRenderer.SetDefaultStyleProc(const Index: Integer; var AScript: string);
begin
AScript := '__ChangeStyle(event, this);';
end;
procedure TcxCustomWebDataNavigatorRenderer.SetHoverStyleProc(const Index: Integer; var AScript: string);
begin
if WebDataNavigator.Styles.Hover <> nil then
AScript := Format('__ChangeStyle(event, this, ''%s'');', [WebDataNavigator.Styles.Hover.FullName])
else AScript := '';
end;
procedure TcxCustomWebDataNavigatorRenderer.WriteButtonEvents(const Index: Integer);
var
MouseOutString, MouseOverString: string;
begin
if WebDataNavigator.Styles.Hover <> nil then
begin
SetHoverStyleProc(Index, MouseOverString);
SetDefaultStyleProc(Index, MouseOutString);
HTMLTextBuilder.WriteEventAttribute(eOnMouseOver, MouseOverString);
HTMLTextBuilder.WriteEventAttribute(eOnMouseOut, MouseOutString);
end;
end;
const
NavigatorButtonIDs: array[TcxWebNavigatorButtonType] of string = // Do not localize
('_NBFirst_', '_NBPgUp_', '_NBPrev_', '', '_NBChPS_',
'_NBNext_', '_NBPgDn_', '_NBLast_', '_NBIns_', '_NBEdit_',
'_NBDel_', '_NBOk_', '_NBCancel_', '_NBRefresh_', '_NB_');
NavigatorButtonActionString: array[TcxWebNavigatorButtonType] of string = // Do not localize
('OnNBFirstClick(''%s'')', 'OnNBPriorPageClick(''%s'')', 'OnNBPriorClick(''%s'')', '',
'OnNBChangePageSizeClick(''%s'')', 'OnNBNextClick(''%s'')', 'OnNBNextPageClick(''%s'')',
'OnNBLastClick(''%s'')', 'OnNBInsertClick(''%s'')', 'OnNBEditClick(''%s'')',
'OnNBDeleteClick(''%s'')', 'OnNBPostClick(''%s'')', 'OnNBCancelClick(''%s'')',
'OnNBRefreshClick(''%s'')', '');
procedure TcxCustomWebDataNavigatorRenderer.WriteButtonAction(Index: Integer);
var
AType: TcxWebNavigatorButtonType;
begin
AType := WebDataNavigator.Buttons[Index].ButtonType;
if not Assigned(WebDataNavigator.Buttons[Index].OnClick) then
HTMLTextBuilder.WriteEventAttribute(eOnClick, Format(NavigatorButtonActionString[AType],
[WebDataNavigator.Name]))
else
HTMLTextBuilder.WriteEventAttribute(eOnClick, Format('__doPostBack(''%s'', ''%s:%d'');',
[WebDataNavigator.Name, 'CLICK', Index]));
end;
procedure TcxCustomWebDataNavigatorRenderer.WriteButtonHint(Index: Integer);
begin
if WebDataNavigator.ShowHint and (WebDataNavigator.Buttons[Index].Hint <> '') then
HTMLTextBuilder.WriteAttribute(aTitle, WebDataNavigator.Buttons[Index].Hint);
end;
procedure TcxCustomWebDataNavigatorRenderer.WriteButton(Index: Integer);
begin
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTd);
HTMLTextBuilder.WriteAttribute(aWidth, WebDataNavigator.ButtonWidth);
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagDiv);
HTMLTextBuilder.WriteAttribute(aClass, DefaultStyleName);
HTMLTextBuilder.WriteStyleAttribute(saOverflow, 'hidden');
HTMLTextBuilder.WriteStyleAttribute(saHeight, WebDataNavigator.Height - 1, 'px');
HTMLTextBuilder.WriteStyleAttribute(saWidth, WebDataNavigator.ButtonWidth, 'px');
WriteButtonEvents(Index);
WriteButtonAction(Index);
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTable);
HTMLTextBuilder.WriteAttribute(aHeight, '100%');
HTMLTextBuilder.WriteAttribute(aWidth, '100%');
HTMLTextBuilder.WriteAttribute(aBorder, 0);
HTMLTextBuilder.WriteAttribute(aCellspacing, 0);
HTMLTextBuilder.WriteAttribute(aCellpadding, 0);
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTd);
HTMLTextBuilder.WriteAttribute(aAlign, 'center');
HTMLTextBuilder.WriteAttribute(aValign, 'center');
if (WebDataNavigator.Images <> nil) and
(WebDataNavigator.Images.ValidIndex(WebDataNavigator.Buttons[Index].ImageIndex)) then
WebDataNavigator.Images.Images[WebDataNavigator.Buttons[Index].ImageIndex].WriteHTML(HTMLTextBuilder)
else if WebDataNavigator.Buttons[Index].ButtonType <> nbCustom then
begin
HTMLTextBuilder.WriteSingleTag(TcxHTMLTagImg);
HTMLTextBuilder.WriteAttribute(aSrc, QualifyImageFileName(cxWebNavigatorImgs[WebDataNavigator.Buttons[Index].ButtonType]));
HTMLTextBuilder.WriteAttribute(aBorder, 0);
WriteButtonHint(Index);
end;
HTMLTextBuilder.WriteAttribute(aId, WebDataNavigator.Name + NavigatorButtonIDs[WebDataNavigator.Buttons[Index].ButtonType]);
HTMLTextBuilder.WriteAttribute(aName, WebDataNavigator.Name + NavigatorButtonIDs[WebDataNavigator.Buttons[Index].ButtonType]);
HTMLTextBuilder.WriteAttribute(aAlign, 'absmiddle');
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTd);
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTable);
HTMLTextBuilder.WriteEndTag(TcxHTMLTagDiv);
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTd);
end;
procedure TcxCustomWebDataNavigatorRenderer.WriteEdit;
begin
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTd);
HTMLTextBuilder.WriteAttribute(aWidth, 2 * WebDataNavigator.ButtonWidth);
HTMLTextBuilder.WriteSingleTag(TcxHTMLTagInput);
HTMLTextBuilder.WriteAttribute(aName, WebDataNavigator.Name + 'PageSizeEdit');
HTMLTextBuilder.WriteAttribute(aId, WebDataNavigator.Name + 'PageSizeEdit');
HTMLTextBuilder.WriteAttribute(aType, 'text');
HTMLTextBuilder.WriteAttribute(aAlign, 'absmiddle');
HTMLTextBuilder.WriteAttribute(aValue, WebDataNavigator.PageSize);
HTMLTextBuilder.WriteStyleAttribute(saHeight, WebDataNavigator.Height, 'px');
HTMLTextBuilder.WriteStyleAttribute(saWidth, 2 * WebDataNavigator.ButtonWidth, 'px');
HTMLTextBuilder.WriteEventAttribute(eOnFocus, Format('OnNEFocus(''%s'')', [WebDataNavigator.Name]));
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTd);
end;
procedure TcxCustomWebDataNavigatorRenderer.WriteHTML;
var
I: Integer;
begin
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTable);
WriteID;
HTMLTextBuilder.WriteAttribute(aBorder, 0);
HTMLTextBuilder.WriteAttribute(aCellpadding, 0);
HTMLTextBuilder.WriteAttribute(aCellspacing, 0);
WriteHint;
WritePopupMenu;
WriteAttributes;
WritePosition;
WriteZIndex;
WriteStyleAttributes;
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTr);
HTMLTextBuilder.WriteAttribute(aHeight, WebDataNavigator.Height);
for I := 0 to WebDataNavigator.Buttons.Count - 1 do
begin
if WebDataNavigator.Buttons[I].Visible then
begin
if WebDataNavigator.Buttons[I].ButtonType = nbPageSize then WriteEdit
else WriteButton(I);
end;
end;
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTr);
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTable);
end;
procedure TcxCustomWebDataNavigatorRenderer.WriteScripts;
begin
WriteEventsScript;
HTMLTextBuilder.WriteText('_DataNavigator = CreateDataNavigator();');
HTMLTextBuilder.WriteText(Format(' _DataNavigator.Name = "%s";', [WebDataNavigator.Name]));
HTMLTextBuilder.WriteText(Format(' _DataNavigator.PageSize = %d;', [WebDataNavigator.PageSize]));
HTMLTextBuilder.WriteText(Format(' _DataNavigator.ProcessPageSizeSrc = "%s";', [QualifyImageFileName(cxWebNavigatorImgs[nbApplyPageSize])]));
HTMLTextBuilder.WriteText(Format(' _DataNavigator.ApplyPageSizeSrc = "%s";', [QualifyImageFileName(cxWebNavigatorImgs[nbPost])]));
WriteEvents;
if(Assigned(WebDataNavigator.OnChangePageSize)) then
HTMLTextBuilder.WriteText(' _DataNavigator.AssignOnChangePageSize = true;');
end;
class procedure TcxCustomWebDataNavigatorRenderer.WriteStyles(AHTMLTextBuilder: TcxHTMLTextBuilder);
begin
TcxNavigatorButtonStyle.WriteStyle(AHTMLTextBuilder);
end;
class procedure TcxCustomWebDataNavigatorRenderer.GetScriptFiles(AList: TStrings);
begin
AList.Add(scxCommonScriptName);
AList.Add(scxDataNavigatorScriptName);
end;
{ TcxCustomWebDataNavigatorNS4Renderer }
procedure TcxCustomWebDataNavigatorNS4Renderer.WriteButtonAction(Index: Integer);
var
AType: TcxWebNavigatorButtonType;
begin
AType := WebDataNavigator.Buttons[Index].ButtonType;
if not Assigned(WebDataNavigator.Buttons[Index].OnClick) then
HTMLTextBuilder.WriteAttribute(aHref, Format('javascript:' + NavigatorButtonActionString[AType],
[WebDataNavigator.Name]))
else
HTMLTextBuilder.WriteAttribute(aHref, Format('javascript:__doPostBack(''%s'', ''%s:%d'');',
[WebDataNavigator.Name, 'CLICK', Index]));
end;
procedure TcxCustomWebDataNavigatorNS4Renderer.WriteButton(Index: Integer);
begin
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTd);
HTMLTextBuilder.WriteAttribute(aWidth, WebDataNavigator.ButtonWidth);
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTable);
HTMLTextBuilder.WriteAttribute(aHeight, WebDataNavigator.Height);
HTMLTextBuilder.WriteAttribute(aWidth, WebDataNavigator.ButtonWidth);
HTMLTextBuilder.WriteAttribute(aBorder, 0);
HTMLTextBuilder.WriteAttribute(aCellspacing, 0);
HTMLTextBuilder.WriteAttribute(aCellpadding, 0);
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTr, True, False);
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTd, False, False);
HTMLTextBuilder.WriteAttribute(aHeight, 1);
HTMLTextBuilder.WriteAttribute(aWidth, 1);
HTMLTextBuilder.WriteAttribute(aBgcolor, 'white');
WriteInvisibleImage(1, 1);
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTd, False, False);
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTd, False, False);
HTMLTextBuilder.WriteAttribute(aHeight, 1);
HTMLTextBuilder.WriteAttribute(aBgcolor, 'white');
WriteInvisibleImage(1, 1);
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTd, False, False);
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTd, False, False);
HTMLTextBuilder.WriteAttribute(aHeight, 1);
HTMLTextBuilder.WriteAttribute(aWidth, 1);
HTMLTextBuilder.WriteAttribute(aBgcolor, 'black');
WriteInvisibleImage(1, 1);
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTd, False, False);
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTr, False, True);
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTr);
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTd, True, False);
HTMLTextBuilder.WriteAttribute(aWidth, 1);
HTMLTextBuilder.WriteAttribute(aBgcolor, 'white');
WriteInvisibleImage(1, 1);
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTd, False, True);
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTd);
HTMLTextBuilder.WriteAttribute(aHeight, WebDataNavigator.Height - 2);
HTMLTextBuilder.WriteAttribute(aWidth, 3000);
HTMLTextBuilder.WriteAttribute(aBgcolor, '#D4D0C8');
HTMLTextBuilder.WriteAttribute(aAlign, 'center');
HTMLTextBuilder.WriteAttribute(aValign, 'center');
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagA, True, False);
WriteButtonAction(Index);
if (WebDataNavigator.Images <> nil) and
(WebDataNavigator.Images.ValidIndex(WebDataNavigator.Buttons[Index].ImageIndex)) then
WebDataNavigator.Images.Images[WebDataNavigator.Buttons[Index].ImageIndex].WriteHTML(HTMLTextBuilder)
else if WebDataNavigator.Buttons[Index].ButtonType <> nbCustom then
begin
HTMLTextBuilder.WriteSingleTag(TcxHTMLTagImg, False, False);
HTMLTextBuilder.WriteAttribute(aSrc, QualifyImageFileName(cxWebNavigatorImgs[WebDataNavigator.Buttons[Index].ButtonType]));
HTMLTextBuilder.WriteAttribute(aBorder, 0);
WriteButtonHint(Index);
end;
// HTMLTextBuilder.WriteAttribute(aId, WebDataNavigator.Name + NavigatorButtonIDs[WebDataNavigator.Buttons[Index].ButtonType]);
HTMLTextBuilder.WriteAttribute(aName, WebDataNavigator.Name + NavigatorButtonIDs[WebDataNavigator.Buttons[Index].ButtonType]);
HTMLTextBuilder.WriteAttribute(aAlign, 'absmiddle');
HTMLTextBuilder.WriteEndTag(TcxHTMLTagA, False, True);
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTd);
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTd, True, False);
HTMLTextBuilder.WriteAttribute(aWidth, 1);
HTMLTextBuilder.WriteAttribute(aBgcolor, 'black');
WriteInvisibleImage(1, 1);
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTd, False, True);
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTr);
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTr, True, False);
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTd, False, False);
HTMLTextBuilder.WriteAttribute(aHeight, 1);
HTMLTextBuilder.WriteAttribute(aWidth, 1);
HTMLTextBuilder.WriteAttribute(aBgcolor, 'black');
WriteInvisibleImage(1, 1);
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTd, False, False);
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTd, False, False);
HTMLTextBuilder.WriteAttribute(aHeight, 1);
HTMLTextBuilder.WriteAttribute(aBgcolor, 'black');
WriteInvisibleImage(1, 1);
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTd, False, False);
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTd, False, False);
HTMLTextBuilder.WriteAttribute(aHeight, 1);
HTMLTextBuilder.WriteAttribute(aWidth, 1);
HTMLTextBuilder.WriteAttribute(aBgcolor, 'black');
WriteInvisibleImage(1, 1);
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTd, False, False);
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTr, False, True);
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTable);
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTd);
end;
procedure TcxCustomWebDataNavigatorNS4Renderer.WriteEdit;
begin
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTd);
HTMLTextBuilder.WriteAttribute(aWidth, 2 * WebDataNavigator.ButtonWidth);
HTMLTextBuilder.WriteSingleTag(TcxHTMLTagInput);
HTMLTextBuilder.WriteAttribute(aName, WebDataNavigator.Name + 'PageSizeEdit');
HTMLTextBuilder.WriteAttribute(aType, 'text');
HTMLTextBuilder.WriteAttribute(aDisabled);
HTMLTextBuilder.WriteAttribute(aSize, 2 * WebDataNavigator.ButtonWidth div 5);
HTMLTextBuilder.WriteAttribute(aAlign, 'absmiddle');
HTMLTextBuilder.WriteAttribute(aValue, WebDataNavigator.PageSize);
HTMLTextBuilder.WriteStyleAttribute(saFontSize, WebDataNavigator.Height - 2);
HTMLTextBuilder.WriteStyleAttribute(saWidth, 2 * WebDataNavigator.ButtonWidth, 'px');
HTMLTextBuilder.WriteStyleAttribute(saHeight, WebDataNavigator.Height, 'px');
HTMLTextBuilder.WriteEventAttribute(eOnFocus, Format('OnNEFocus(''%s'')', [WebDataNavigator.Name]));
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTd);
end;
class function TcxCustomWebDataNavigatorNS4Renderer.IsBrowserSupported(AWebBrowser: TcxWebBrowserClass): Boolean;
begin
Result := AWebBrowser = TcxWebBrowserNS4;
end;
{ TcxCustomWebDataNavigatorNS6Renderer }
procedure TcxCustomWebDataNavigatorNS6Renderer.WriteButtonAction(Index: Integer);
begin
if Assigned(WebDataNavigator.Buttons[Index].OnClick) then
HTMLTextBuilder.WriteEventAttribute(eOnClick, Format('__doPostBack(''%s'', ''%s:%d'');',
[WebDataNavigator.Name, 'CLICK', Index]));
end;
procedure TcxCustomWebDataNavigatorNS6Renderer.WriteButton(Index: Integer);
begin
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTd);
HTMLTextBuilder.WriteAttribute(aWidth, WebDataNavigator.ButtonWidth);
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagDiv);
HTMLTextBuilder.WriteAttribute(aClass, DefaultStyleName);
HTMLTextBuilder.WriteStyleAttribute(saHeight, WebDataNavigator.Height - 2, 'px');
HTMLTextBuilder.WriteStyleAttribute(saWidth, WebDataNavigator.ButtonWidth - 2, 'px');
WriteButtonEvents(Index);
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTable);
HTMLTextBuilder.WriteAttribute(aHeight, '100%');
HTMLTextBuilder.WriteAttribute(aWidth, '100%');
HTMLTextBuilder.WriteAttribute(aBorder, 0);
HTMLTextBuilder.WriteAttribute(aCellspacing, 0);
HTMLTextBuilder.WriteAttribute(aCellpadding, 0);
HTMLTextBuilder.WriteBeginTag(TcxHTMLTagTd);
HTMLTextBuilder.WriteAttribute(aAlign, 'center');
HTMLTextBuilder.WriteAttribute(aValign, 'center');
if (WebDataNavigator.Images <> nil) and
(WebDataNavigator.Images.ValidIndex(WebDataNavigator.Buttons[Index].ImageIndex)) then
WebDataNavigator.Images.Images[WebDataNavigator.Buttons[Index].ImageIndex].WriteHTML(HTMLTextBuilder)
else if WebDataNavigator.Buttons[Index].ButtonType <> nbCustom then
begin
HTMLTextBuilder.WriteSingleTag(TcxHTMLTagImg);
HTMLTextBuilder.WriteAttribute(aSrc, QualifyImageFileName(cxWebNavigatorImgs[WebDataNavigator.Buttons[Index].ButtonType]));
HTMLTextBuilder.WriteAttribute(aBorder, 0);
WriteButtonHint(Index);
end;
HTMLTextBuilder.WriteAttribute(aId, WebDataNavigator.Name + NavigatorButtonIDs[WebDataNavigator.Buttons[Index].ButtonType]);
HTMLTextBuilder.WriteAttribute(aName, WebDataNavigator.Name + NavigatorButtonIDs[WebDataNavigator.Buttons[Index].ButtonType]);
HTMLTextBuilder.WriteAttribute(aAlign, 'absmiddle');
WriteButtonAction(Index);
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTd);
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTable);
HTMLTextBuilder.WriteEndTag(TcxHTMLTagDiv);
HTMLTextBuilder.WriteEndTag(TcxHTMLTagTd);
end;
class function TcxCustomWebDataNavigatorNS6Renderer.IsBrowserSupported(AWebBrowser: TcxWebBrowserClass): Boolean;
begin
Result := AWebBrowser = TcxWebBrowserNS6;
end;
initialization
RegisterClasses([TcxWebDataNavigatorButton, TcxCustomWebDataNavigator]);
end.