Componentes.Terceros.jvcl/official/3.36/design/JvWizardEditorForm.pas
2009-02-27 12:23:32 +00:00

617 lines
18 KiB
ObjectPascal

{-----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: JvWizardEditorForm.PAS, released on 2002-01-29.
The Initial Developer of the Original Code is William Yu Wei.
Portions created by William Yu Wei are Copyright (C) 2002 William Yu Wei.
All Rights Reserved.
Contributor(s):
Peter Thörnqvist - converted to JVCL naming conventions on 2003-07-11
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.sourceforge.net
Known Issues:
-----------------------------------------------------------------------------}
// $Id: JvWizardEditorForm.pas 11065 2006-12-02 07:06:50Z marquardt $
{*****************************************************************************
Purpose: Jv Wizard Component Editor
History:
---------------------------------------------------------------------------
Date(mm/dd/yy) Comments
---------------------------------------------------------------------------
01/29/2002 Initial create
1) Move TJvWizardActivePageProperty, TJvWizardEditor
class from JvWizardReg to here
2) TJvWizardPageListProperty added
TJvWizardPageList dialog form added
******************************************************************************}
unit JvWizardEditorForm;
{$I jvcl.inc}
interface
uses
SysUtils, Classes,
Windows, Messages, Graphics, Controls, Forms, Dialogs,
ActnList, ImgList, ComCtrls, StdCtrls, ToolWin, Menus,
{$IFDEF COMPILER6_UP}
DesignIntf, DesignEditors,
DesignWindows,
{$ELSE}
DsgnIntf, DsgnWnds,
{$ENDIF COMPILER6_UP}
JvWizard;
type
TJvWizardActivePageProperty = class(TComponentProperty)
public
function GetAttributes: TPropertyAttributes; override;
procedure GetValues(Proc: TGetStrProc); override;
end;
// JvWizard Component Local Menu Editor
TJvWizardEditor = class(TComponentEditor)
protected
function GetWizard: TJvWizard; virtual;
procedure AddPage(Page: TJvWizardCustomPage);
procedure AddWelcomePage;
procedure AddInteriorPage;
procedure NextPage(Step: Integer);
property Wizard: TJvWizard read GetWizard;
public
procedure ExecuteVerb(Index: Integer); override;
function GetVerb(Index: Integer): string; override;
function GetVerbCount: Integer; override;
end;
TJvWizardPageListProperty = class(TPropertyEditor)
function GetAttributes: TPropertyAttributes; override;
function GetValue: string; override;
procedure Edit; override;
end;
TJvWizardPageListEditor = class(TDesignWindow)
tbrWizardPages: TToolBar;
lbxWizardPages: TListBox;
btnAddWelcomePage: TToolButton;
btnDeletePages: TToolButton;
ToolButton1: TToolButton;
imgWizardPages: TImageList;
actWizardPages: TActionList;
actAddWelcomePage: TAction;
actAddInteriorPage: TAction;
actDeletePages: TAction;
popWizard: TPopupMenu;
AddWelcomePage1: TMenuItem;
AddInteriorPage1: TMenuItem;
tbMoveUp: TToolButton;
tbMoveDown: TToolButton;
acMoveUp: TAction;
acMoveDown: TAction;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure actAddWelcomePageExecute(Sender: TObject);
procedure actAddInteriorPageExecute(Sender: TObject);
procedure actDeletePagesExecute(Sender: TObject);
procedure actDeletePagesUpdate(Sender: TObject);
procedure lbxWizardPagesClick(Sender: TObject);
procedure lbxWizardPagesMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure lbxWizardPagesDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure lbxWizardPagesDragDrop(Sender, Source: TObject; X, Y: Integer);
procedure actWizardPagesUpdate(Action: TBasicAction;
var Handled: Boolean);
procedure acMoveUpExecute(Sender: TObject);
procedure acMoveDownExecute(Sender: TObject);
private
FWizard: TJvWizard;
procedure SetWizard(const Value: TJvWizard);
procedure UpdatePageList(const CurrItemIndex: Integer);
procedure SelectWizardPage(const Index: Integer);
protected
procedure AddPage(Page: TJvWizardCustomPage);
procedure AddWelcomePage;
procedure AddInteriorPage;
property Wizard: TJvWizard read FWizard write SetWizard;
public
procedure Activated; override;
{$IFDEF COMPILER6_UP}
procedure ItemDeleted(const ADesigner: IDesigner; Item: TPersistent); override;
procedure DesignerClosed(const Designer: IDesigner; AGoingDormant: Boolean); override;
procedure ItemsModified(const Designer: IDesigner); override;
{$ELSE}
procedure ComponentDeleted(Component: IPersistent); override;
function UniqueName(Component: TComponent): string; override;
procedure FormClosed(AForm: TCustomForm); override;
procedure FormModified; override;
{$ENDIF COMPILER6_UP}
function GetEditState: TEditState; override;
end;
implementation
{$IFDEF USEJVCL}
uses
JvDsgnConsts;
{$ENDIF USEJVCL}
{$R *.dfm}
{$IFNDEF USEJVCL}
resourcestring
RsPageListEllipsis = 'Page List...';
RsNewWelcomePage = 'New Welcome Page';
RsNewInteriorPage = 'New Interior Page';
RsDeletePage = 'Delete Page';
RsNextPage = 'Next Page';
RsPreviousPage = 'Previous Page';
RsNone = '(none)';
{$ENDIF !USEJVCL}
procedure ShowWizardPageListEditor(Designer: IDesigner; AWizard: TJvWizard);
var
I: Integer;
AWizardPageListEditor: TJvWizardPageListEditor;
begin
// because the page list editor is not show modal, so
// we need to find it rather than create a new instance.
AWizardPageListEditor := nil;
for I := 0 to Screen.FormCount - 1 do
if Screen.Forms[I] is TJvWizardPageListEditor then
if TJvWizardPageListEditor(Screen.Forms[I]).Wizard = AWizard then
begin
AWizardPageListEditor := TJvWizardPageListEditor(Screen.Forms[I]);
Break;
end;
// Show the wizard editor
if Assigned(AWizardPageListEditor) then
begin
AWizardPageListEditor.Show;
if AWizardPageListEditor.WindowState = wsMinimized then
AWizardPageListEditor.WindowState := wsNormal;
end
else
begin
AWizardPageListEditor := TJvWizardPageListEditor.Create(Application);
try
{$IFDEF COMPILER6_UP}
AWizardPageListEditor.Designer := Designer;
{$ELSE}
AWizardPageListEditor.Designer := IFormDesigner(Designer);
{$ENDIF COMPILER6_UP}
AWizardPageListEditor.Wizard := AWizard;
AWizardPageListEditor.Show;
except
AWizardPageListEditor.Free;
raise;
end;
end;
end;
//=== { TJvWizardActivePageProperty } ========================================
function TJvWizardActivePageProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paValueList];
end;
procedure TJvWizardActivePageProperty.GetValues(Proc: TGetStrProc);
var
I: Integer;
Component: TComponent;
begin
for I := 0 to Designer.GetRoot.ComponentCount - 1 do
begin
Component := Designer.GetRoot.Components[I];
if (Component.Name <> '') and (Component is TJvWizardCustomPage) and
(TJvWizardCustomPage(Component).Wizard = GetComponent(0)) then
Proc(Component.Name);
end;
end;
//=== { TJvWizardEditor } ====================================================
procedure TJvWizardEditor.AddPage(Page: TJvWizardCustomPage);
begin
Page.Parent := Wizard;
Page.Wizard := Wizard;
Designer.SelectComponent(Page);
Wizard.ActivePage := Page;
Designer.Modified;
end;
procedure TJvWizardEditor.AddInteriorPage;
var
Page: TJvWizardInteriorPage;
begin
Page := TJvWizardInteriorPage.Create(Designer.GetRoot);
try
Page.Name := Designer.UniqueName(TJvWizardInteriorPage.ClassName);
AddPage(Page);
except
Page.Free;
raise;
end;
end;
procedure TJvWizardEditor.AddWelcomePage;
var
Page: TJvWizardWelcomePage;
begin
Page := TJvWizardWelcomePage.Create(Designer.GetRoot);
try
Page.Name := Designer.UniqueName(TJvWizardWelcomePage.ClassName);
AddPage(Page);
except
Page.Free;
raise;
end;
end;
procedure TJvWizardEditor.ExecuteVerb(Index: Integer);
begin
case Index of
0:
ShowWizardPageListEditor(Designer, GetWizard);
1:
AddWelcomePage;
2:
AddInteriorPage;
3:
NextPage(1);
4:
NextPage(-1);
5:
if Assigned(Wizard.ActivePage) then
begin
Designer.SelectComponent(Wizard);
Wizard.ActivePage.Free;
Designer.Modified;
end;
end;
end;
function TJvWizardEditor.GetWizard: TJvWizard;
begin
if Component is TJvWizard then
Result := TJvWizard(Component)
else
Result := TJvWizard(TJvWizardCustomPage(Component).Wizard);
end;
function TJvWizardEditor.GetVerb(Index: Integer): string;
begin
case Index of
0:
Result := RsPageListEllipsis;
1:
Result := RsNewWelcomePage;
2:
Result := RsNewInteriorPage;
3:
Result := RsNextPage;
4:
Result := RsPreviousPage;
5:
Result := RsDeletePage;
end;
end;
function TJvWizardEditor.GetVerbCount: Integer;
begin
Result := 6;
end;
procedure TJvWizardEditor.NextPage(Step: Integer);
var
Page: TJvWizardCustomPage;
begin
Page := Wizard.FindNextPage(Wizard.ActivePageIndex, Step, False);
if Assigned(Page) and (Page <> Wizard.ActivePage) then
begin
if Component is TJvWizardCustomPage then
Designer.SelectComponent(Page);
Wizard.ActivePage := Page;
Designer.Modified;
end;
end;
//=== { TJvWizardPageListEditor } ============================================
procedure TJvWizardPageListProperty.Edit;
begin
ShowWizardPageListEditor(Designer, TJvWizard(GetComponent(0)));
end;
function TJvWizardPageListProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog, paReadOnly];
end;
function TJvWizardPageListProperty.GetValue: string;
var
APageList: TList;
begin
APageList := TList(Pointer(GetOrdValue));
if not Assigned(APageList) or (APageList.Count <= 0) then
Result := RsNone
else
Result := Format('(%s)', [GetPropType^.Name]);
end;
//=== { TJvWizardPageList Dialog Form } ======================================
procedure TJvWizardPageListEditor.UpdatePageList(const CurrItemIndex: Integer);
var
I: Integer;
begin
if Assigned(FWizard) then
begin
lbxWizardPages.Items.BeginUpdate;
try
lbxWizardPages.Items.Clear;
for I := 0 to FWizard.PageCount - 1 do
lbxWizardPages.Items.Add(TJvWizardCustomPage(FWizard.Pages[I]).Name);
if (CurrItemIndex >= 0) and (CurrItemIndex < lbxWizardPages.Items.Count) then
lbxWizardPages.ItemIndex := CurrItemIndex
else
lbxWizardPages.ItemIndex := -1;
finally
lbxWizardPages.Items.EndUpdate;
end;
end;
end;
procedure TJvWizardPageListEditor.SelectWizardPage(const Index: Integer);
var
Page: TJvWizardCustomPage;
begin
if Assigned(FWizard) and Active then
begin
Page := nil;
if (Index >= 0) and (Index < FWizard.PageCount) then
Page := TJvWizardCustomPage(FWizard.Pages[Index]);
Designer.SelectComponent(Page);
Wizard.ActivePage := Page;
Designer.Modified;
end;
end;
procedure TJvWizardPageListEditor.Activated;
begin
if (lbxWizardPages.ItemIndex < 0) and (lbxWizardPages.Items.Count > 0) then
lbxWizardPages.ItemIndex := 0;
if Assigned(FWizard) and Assigned(FWizard.ActivePage) and
(FWizard.ActivePage.PageIndex <> lbxWizardPages.ItemIndex) then
lbxWizardPages.ItemIndex := FWizard.ActivePage.PageIndex;
SelectWizardPage(lbxWizardPages.ItemIndex);
end;
{$IFDEF COMPILER6_UP}
procedure TJvWizardPageListEditor.DesignerClosed(const Designer: IDesigner;
AGoingDormant: Boolean);
begin
if Designer = Self.Designer then
Close;
end;
procedure TJvWizardPageListEditor.ItemDeleted(const ADesigner: IDesigner;
Item: TPersistent);
begin
if Item = FWizard then
begin
FWizard := nil;
Close;
end;
end;
procedure TJvWizardPageListEditor.ItemsModified(const Designer: IDesigner);
begin
if not (csDestroying in ComponentState) then
UpdatePageList(lbxWizardPages.ItemIndex);
end;
{$ELSE}
function TJvWizardPageListEditor.UniqueName(Component: TComponent): string;
begin
Result := Designer.UniqueName(Component.ClassName);
end;
procedure TJvWizardPageListEditor.ComponentDeleted(Component: IPersistent);
begin
if ExtractPersistent(Component) = FWizard then
begin
FWizard := nil;
Close;
end;
end;
procedure TJvWizardPageListEditor.FormClosed(AForm: TCustomForm);
begin
if AForm = Designer.Form then
Close;
end;
procedure TJvWizardPageListEditor.FormModified;
begin
if not (csDestroying in ComponentState) then
UpdatePageList(lbxWizardPages.ItemIndex);
end;
{$ENDIF COMPILER6_UP}
function TJvWizardPageListEditor.GetEditState: TEditState;
begin
Result := [];
end;
procedure TJvWizardPageListEditor.SetWizard(const Value: TJvWizard);
begin
if FWizard <> Value then
begin
FWizard := Value;
UpdatePageList(0);
end;
end;
procedure TJvWizardPageListEditor.AddPage(Page: TJvWizardCustomPage);
begin
Page.Parent := Wizard;
Page.Wizard := Wizard;
Wizard.ActivePage := Page;
Designer.SelectComponent(Page);
//Designer.Modified; !!! otherwise for some reason, the last item of the
//list box will show twice when adding either welcome page or interior page.
lbxWizardPages.ItemIndex := lbxWizardPages.Items.Add(Page.Name);
end;
procedure TJvWizardPageListEditor.AddInteriorPage;
var
APage: TJvWizardCustomPage;
begin
APage := TJvWizardInteriorPage.Create(Designer.GetRoot);
try
APage.Name := UniqueName(APage);
AddPage(APage);
except
APage.Free;
raise;
end;
end;
procedure TJvWizardPageListEditor.AddWelcomePage;
var
APage: TJvWizardCustomPage;
begin
APage := TJvWizardWelcomePage.Create(Designer.GetRoot);
try
APage.Name := UniqueName(APage);
AddPage(APage);
except
APage.Free;
raise;
end;
end;
procedure TJvWizardPageListEditor.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
procedure TJvWizardPageListEditor.actAddWelcomePageExecute(Sender: TObject);
begin
AddWelcomePage;
end;
procedure TJvWizardPageListEditor.actAddInteriorPageExecute(Sender: TObject);
begin
AddInteriorPage;
end;
procedure TJvWizardPageListEditor.actDeletePagesExecute(Sender: TObject);
begin
if Assigned(Wizard.ActivePage) then
begin
if lbxWizardPages.ItemIndex >= 0 then
lbxWizardPages.Items.Delete(Wizard.ActivePage.PageIndex);
Designer.SelectComponent(Wizard);
Wizard.ActivePage.Free;
Designer.Modified;
end;
end;
procedure TJvWizardPageListEditor.actDeletePagesUpdate(Sender: TObject);
begin
(Sender as TAction).Enabled :=
(lbxWizardPages.Items.Count > 0) and (lbxWizardPages.ItemIndex >= 0);
end;
procedure TJvWizardPageListEditor.lbxWizardPagesClick(Sender: TObject);
begin
SelectWizardPage(lbxWizardPages.ItemIndex);
end;
procedure TJvWizardPageListEditor.lbxWizardPagesMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
lbxWizardPages.BeginDrag(False);
end;
procedure TJvWizardPageListEditor.lbxWizardPagesDragOver(Sender, Source: TObject;
X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
Accept :=
(Source is TListBox) and
(lbxWizardPages.ItemAtPos(Point(X, Y), True) <> -1) and
(lbxWizardPages.ItemAtPos(Point(X, Y), True) <> lbxWizardPages.ItemIndex);
end;
procedure TJvWizardPageListEditor.lbxWizardPagesDragDrop(Sender, Source: TObject;
X, Y: Integer);
var
OldIndex, NewIndex: Integer;
begin
OldIndex := lbxWizardPages.ItemIndex;
NewIndex := lbxWizardPages.ItemAtPos(Point(X,Y), True);
lbxWizardPages.Items.Move(OldIndex, NewIndex);
if Assigned(FWizard) then
begin
TJvWizardCustomPage(FWizard.Pages[OldIndex]).PageIndex := NewIndex;
lbxWizardPages.ItemIndex := NewIndex;
end;
end;
procedure TJvWizardPageListEditor.actWizardPagesUpdate(Action: TBasicAction;
var Handled: Boolean);
begin
acMoveUp.Enabled := lbxWizardPages.ItemIndex > 0;
acMoveDown.Enabled :=
(lbxWizardPages.ItemIndex <> -1) and
(lbxWizardPages.ItemIndex < lbxWizardPages.Items.Count - 1);
end;
procedure TJvWizardPageListEditor.acMoveUpExecute(Sender: TObject);
var
I: Integer;
begin
I := lbxWizardPages.ItemIndex;
lbxWizardPages.Items.Move(I, I-1);
if Assigned(FWizard) then
begin
TJvWizardCustomPage(FWizard.Pages[I]).PageIndex := I - 1;
lbxWizardPages.ItemIndex := I - 1;
end;
end;
procedure TJvWizardPageListEditor.acMoveDownExecute(Sender: TObject);
var
I: Integer;
begin
I := lbxWizardPages.ItemIndex;
lbxWizardPages.Items.Move(I, I+1);
if Assigned(FWizard) then
begin
TJvWizardCustomPage(FWizard.Pages[I]).PageIndex := I + 1;
lbxWizardPages.ItemIndex := I + 1;
end;
end;
end.