Designer: make Tab Order dialog work as modeless dialog.

git-svn-id: trunk@30325 -
This commit is contained in:
juha 2011-04-16 17:15:35 +00:00
parent 1f812b5dd7
commit eb5924a313
4 changed files with 97 additions and 159 deletions

View File

@ -1,15 +1,15 @@
object TabOrderDialog: TTabOrderDialog
Left = 381
Height = 387
Top = 167
Left = 349
Height = 374
Top = 112
Width = 310
ActiveControl = ItemTreeview
BorderStyle = bsSizeToolWin
Caption = 'TabOrderDialog'
ClientHeight = 387
ClientHeight = 374
ClientWidth = 310
OnClose = TabOrderDialogCLOSE
OnCreate = TabOrderDialogCREATE
OnShow = FormShow
Position = poScreenCenter
LCLVersion = '0.9.31'
object ArrowUp: TSpeedButton
@ -39,9 +39,8 @@ object TabOrderDialog: TTabOrderDialog
object ItemTreeview: TTreeView
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = Owner
AnchorSideBottom.Control = ShowOldValuesCheckbox
Left = 6
Height = 313
Height = 357
Top = 6
Width = 267
Anchors = [akTop, akLeft, akRight, akBottom]
@ -53,41 +52,4 @@ object TabOrderDialog: TTabOrderDialog
TabOrder = 0
Options = [tvoAutoItemHeight, tvoKeepCollapsedNodes, tvoReadOnly, tvoRightClickSelect, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips]
end
object ShowOldValuesCheckbox: TCheckBox
AnchorSideLeft.Control = Owner
AnchorSideBottom.Control = BtnPanel
Left = 6
Height = 18
Top = 325
Width = 166
Anchors = [akLeft, akBottom]
BorderSpacing.Around = 6
Caption = 'ShowOldValuesCheckbox'
OnClick = ShowOldValuesCheckboxCLICK
TabOrder = 1
end
object BtnPanel: TButtonPanel
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Owner
AnchorSideBottom.Side = asrBottom
Left = 6
Height = 32
Top = 349
Width = 298
Anchors = [akRight, akBottom]
OKButton.Name = 'OKButton'
OKButton.Caption = '&OK'
HelpButton.Name = 'HelpButton'
HelpButton.Caption = '&Help'
HelpButton.Enabled = False
CloseButton.Name = 'CloseButton'
CloseButton.Caption = '&Close'
CloseButton.Enabled = False
CancelButton.Name = 'CancelButton'
CancelButton.Caption = 'Cancel'
TabOrder = 2
ShowButtons = [pbOK, pbCancel]
ShowBevel = False
end
end

View File

@ -32,8 +32,8 @@ unit TabOrderDlg;
interface
uses
Classes, SysUtils, LCLProc, Forms, Controls, Graphics, Dialogs,
Buttons, ComCtrls, StdCtrls, Arrow, LazarusIDEStrConsts, ButtonPanel;
Classes, SysUtils, LCLProc, Forms, Controls, Graphics, Dialogs, Buttons,
ComCtrls, StdCtrls, Arrow, LazarusIDEStrConsts, ButtonPanel, PropEdits;
type
@ -42,168 +42,109 @@ type
TTabOrderDialog = class(TForm)
ArrowDown: TSpeedButton;
ArrowUp: TSpeedButton;
BtnPanel: TButtonPanel;
ShowOldValuesCheckbox: TCheckBox;
ItemTreeview: TTreeView;
procedure DownSpeedbuttonCLICK(Sender: TObject);
procedure OkButtonCLICK(Sender: TObject);
procedure ShowOldValuesCheckboxCLICK(Sender: TObject);
procedure TabOrderDialogCLOSE(Sender: TObject;
var CloseAction: TCloseAction);
procedure TabOrderDialogCREATE(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure UpSpeedbuttonCLICK(Sender: TObject);
procedure DownSpeedbuttonCLICK(Sender: TObject);
private
FLookupRoot: TComponent;
procedure SetLookupRoot(const AValue: TComponent);
procedure CommitNodes(ANode: TTreeNode; var TabChanged: boolean);
procedure CreateNodes(ParentControl: TWinControl; ParentNode: TTreeNode);
public
FUpdating: Boolean;
function SwapNodes(ANode1, ANode2: TTreeNode): boolean;
procedure FillTree;
procedure ClearTree;
public
property LookupRoot: TComponent Read FLookupRoot Write SetLookupRoot;
procedure CreateNodes(ParentControl: TWinControl; ParentNode: TTreeNode);
procedure Refresh(Force: boolean);
procedure OnRefreshPropertyValues;
end;
//function ShowTabOrderDialog(LookupRoot: TComponent): TModalresult;
{ TTabOrderPropEditor }
TTabOrderPropEditor = class(TIntegerPropertyEditor)
public
function OrdValueToVisualValue(OrdValue: longint): string; override;
procedure SetValue(const NewValue: ansistring); override;
procedure Edit; override;
end;
var
TabOrderDialog: TTabOrderDialog;
ShowTabOrderEditor: TNotifyEvent;
implementation
{$R *.lfm}
{
function ShowTabOrderDialog(LookupRoot: TComponent): TModalresult;
var
TabOrderDialog: TTabOrderDialog;
begin
TabOrderDialog := TTabOrderDialog.Create(nil);
TabOrderDialog.LookupRoot := LookupRoot;
Result := TabOrderDialog.ShowModal;
TabOrderDialog.Free;
end;
}
{ TTabOrderDialog }
procedure TTabOrderDialog.TabOrderDialogCREATE(Sender: TObject);
begin
ShowOldValuesCheckbox.Caption := lisShowOldTabOrder;
BtnPanel.OKButton.OnClick := @OkButtonCLICK;
GlobalDesignHook.AddHandlerRefreshPropertyValues(@OnRefreshPropertyValues);
ArrowDown.LoadGlyphFromLazarusResource('arrow_down');
ArrowUp.LoadGlyphFromLazarusResource('arrow_up');
end;
procedure TTabOrderDialog.FormShow(Sender: TObject);
begin
Refresh(true);
end;
procedure TTabOrderDialog.UpSpeedbuttonCLICK(Sender: TObject);
var
CurItem: TTreeNode;
CurItem, NewItem: TTreeNode;
begin
CurItem:=ItemTreeview.Selected;
if (CurItem=nil) or (CurItem.GetPrevSibling=nil) then exit;
CurItem.MoveTo(CurItem.GetPrevSibling,naInsert);
NewItem := CurItem.GetPrevSibling;
SwapNodes(NewItem, CurItem);
ItemTreeview.Selected:=CurItem;
end;
procedure TTabOrderDialog.TabOrderDialogCLOSE(Sender: TObject;
var CloseAction: TCloseAction);
begin
FLookupRoot:=nil;
end;
procedure TTabOrderDialog.ShowOldValuesCheckboxCLICK(Sender: TObject);
var
i: integer;
begin
for i := 0 to Pred(ItemTreeView.Items.Count) do
if Assigned(ItemTreeView.Items[i].Data) then
if ShowOldValuesCheckbox.Checked then
ItemTreeView.Items[i].Text :=
TWinControl(ItemTreeView.Items[i].Data).Name +
' (' + IntToStr(TWinControl(ItemTreeView.Items[i].Data).TabOrder) + ')'
else
ItemTreeView.Items[i].Text := TWinControl(ItemTreeView.Items[i].Data).Name;
end;
procedure TTabOrderDialog.DownSpeedbuttonCLICK(Sender: TObject);
var
CurItem: TTreeNode;
CurItem, NewItem: TTreeNode;
begin
CurItem:=ItemTreeview.Selected;
if (CurItem=nil) or (CurItem.GetNextSibling=nil) then exit;
CurItem.MoveTo(CurItem.GetNextSibling,naInsertBehind);
NewItem := CurItem.GetNextSibling;
SwapNodes(CurItem, NewItem);
ItemTreeview.Selected:=CurItem;
end;
procedure TTabOrderDialog.OkButtonCLICK(Sender: TObject);
function TTabOrderDialog.SwapNodes(ANode1, ANode2: TTreeNode): boolean;
var
TabChanged: Boolean;
Ctrl1, Ctrl2: TWinControl;
TabOrd: TTabOrder;
begin
TabChanged:=false;
CommitNodes(ItemTreeview.Items.GetFirstNode,TabChanged);
if TabChanged then
ModalResult:=mrOk
else
ModalResult:=mrCancel;
end;
procedure TTabOrderDialog.SetLookupRoot(const AValue: TComponent);
begin
if FLookupRoot=AValue then exit;
FLookupRoot:=AValue;
if FLookupRoot<>nil then begin
Caption:=lisTabOrderOf + ' ' + FLookupRoot.Name;
end;
FillTree;
end;
procedure TTabOrderDialog.CommitNodes(ANode: TTreeNode;
var TabChanged: boolean);
var
AControl: TWinControl;
CurTabOrder: Integer;
begin
CurTabOrder := 0;
while ANode <> nil do
begin
AControl := TWinControl(ANode.Data);
if AControl.TabOrder <> CurTabOrder then
TabChanged := True;
AControl.TabOrder := TTabOrder(CurTabOrder);
//DebugLn('TTabOrderDialog.CommitNodes A ',AControl.Name,' ',
// IntToStr(AControl.TabOrder),' ',IntToStr(CurTabOrder));
inc(CurTabOrder);
CommitNodes(ANode.GetFirstChild, TabChanged);
ANode := ANode.GetNextSibling;
end;
ANode2.MoveTo(ANode1,naInsert); // Move Node2 in front of Node1.
Ctrl1 := TWinControl(ANode1.Data);
Ctrl2 := TWinControl(ANode2.Data);
TabOrd := Ctrl1.TabOrder; // Swap TabOrder values.
Ctrl1.TabOrder := Ctrl2.TabOrder;
Ctrl2.TabOrder := TabOrd;
ANode1.Text := Ctrl1.Name + ' (' + IntToStr(Ctrl1.TabOrder) + ')';
ANode2.Text := Ctrl2.Name + ' (' + IntToStr(Ctrl2.TabOrder) + ')';
end;
procedure TTabOrderDialog.FillTree;
var
AControl: TWinControl;
LookupRoot: TPersistent;
begin
ItemTreeview.BeginUpdate;
try
ClearTree;
if (FLookupRoot = nil) or (not (FLookupRoot is TWinControl)) then
exit;
AControl := TWinControl(FLookupRoot);
CreateNodes(AControl, nil);
ItemTreeview.Items.Clear;
LookupRoot := GlobalDesignHook.LookupRoot;
if Assigned(LookupRoot) and (LookupRoot is TWinControl) then begin
CreateNodes(TWinControl(LookupRoot), nil);
Caption:=lisTabOrderOf + ' ' + TWinControl(LookupRoot).Name;
end;
finally
ItemTreeview.EndUpdate;
end;
end;
procedure TTabOrderDialog.ClearTree;
begin
ItemTreeview.Items.Clear;
end;
procedure TTabOrderDialog.CreateNodes(ParentControl: TWinControl;
ParentNode: TTreeNode);
procedure TTabOrderDialog.CreateNodes(ParentControl: TWinControl; ParentNode: TTreeNode);
var
i: integer;
AControl: TControl;
CurTab: integer;
i, CurTab: integer;
FirstSibling: TTreeNode;
NodeBehind: TTreeNode;
NewNode: TTreeNode;
@ -226,9 +167,7 @@ begin
NodeBehind := FirstSibling;
while (NodeBehind <> nil) and (TWinControl(NodeBehind.Data).TabOrder <= CurTab) do
NodeBehind := NodeBehind.GetNextSibling;
NodeText := AWinControl.Name;
if ShowOldValuesCheckbox.Checked then
NodeText := NodeText + ' (' + IntToStr(AWinControl.TabOrder) + ')';
NodeText := AWinControl.Name + ' (' + IntToStr(AWinControl.TabOrder) + ')';
if NodeBehind <> nil then
NewNode := ItemTreeview.Items.InsertObject(NodeBehind, NodeText, AControl)
else
@ -241,4 +180,42 @@ begin
ItemTreeview.EndUpdate;
end;
procedure TTabOrderDialog.Refresh(Force: boolean);
begin
if Force or IsVisible and not FUpdating then
begin
FUpdating:=true;
try
FillTree;
finally
FUpdating:=false;
end;
end;
end;
procedure TTabOrderDialog.OnRefreshPropertyValues;
begin
Refresh(false);
end;
{ TTabOrderPropEditor }
function TTabOrderPropEditor.OrdValueToVisualValue(OrdValue: longint): string;
begin
Result:=inherited OrdValueToVisualValue(OrdValue);
end;
procedure TTabOrderPropEditor.SetValue(const NewValue: ansistring);
begin
inherited SetValue(NewValue);
end;
procedure TTabOrderPropEditor.Edit;
begin
ShowTabOrderEditor(Self);
end;
initialization
RegisterPropertyEditor(TypeInfo(Integer), TControl, 'TabOrder', TTabOrderPropEditor);
end.

View File

@ -4403,7 +4403,6 @@ resourcestring
lisPODoNotSaveAnySessionInfo = 'Do not save any session info';
lisPOSaveSessionInformationIn = 'Save session information in';
lisMVSaveMessagesToFileTxt = 'Save messages to file (*.txt)';
lisShowOldTabOrder = 'Show old tab order';
lisTabOrderOf = 'Tab Order of';
lisAnchorEnabledHint = 'Enabled = Include %s in Anchors';

View File

@ -2025,8 +2025,8 @@ begin
'0','120','+230','-120','',alNone,false,@OnGetLayout);
EnvironmentOptions.ObjectInspectorOptions.AssignTo(ObjectInspector1);
ShowAnchorDesigner:=@mnuViewAnchorEditorClicked;
ShowTabOrderEditor:=@mnuViewTabOrderEditorClicked;
end;
procedure TMainIDE.SetupFormEditor;