mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-21 08:39:40 +02:00
Designer: make Tab Order dialog work as modeless dialog.
git-svn-id: trunk@30325 -
This commit is contained in:
parent
1f812b5dd7
commit
eb5924a313
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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';
|
||||
|
@ -2025,8 +2025,8 @@ begin
|
||||
'0','120','+230','-120','',alNone,false,@OnGetLayout);
|
||||
|
||||
EnvironmentOptions.ObjectInspectorOptions.AssignTo(ObjectInspector1);
|
||||
|
||||
ShowAnchorDesigner:=@mnuViewAnchorEditorClicked;
|
||||
ShowTabOrderEditor:=@mnuViewTabOrderEditorClicked;
|
||||
end;
|
||||
|
||||
procedure TMainIDE.SetupFormEditor;
|
||||
|
Loading…
Reference in New Issue
Block a user