You've already forked lazarus-ccr
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6969 8e941d3f-bd1b-0410-a28a-d453659cc2b4
934 lines
26 KiB
ObjectPascal
934 lines
26 KiB
ObjectPascal
unit JvOutlookBarForm;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls,
|
|
ActnList, Menus, LclVersion,
|
|
PropEdits, ComponentEditors,
|
|
JvOutlookBar;
|
|
|
|
type
|
|
|
|
{ TFrmOLBEditor }
|
|
|
|
TFrmOLBEditor = class(TForm)
|
|
AcNewPage: TAction;
|
|
AcNewButton: TAction;
|
|
AcDelete: TAction;
|
|
AcMoveUp: TAction;
|
|
AcMoveDown: TAction;
|
|
AcToolbar: TAction;
|
|
AcUpdate: TAction;
|
|
AcShowToolbarCaptions: TAction;
|
|
AlActions: TActionList;
|
|
MenuItem1: TMenuItem;
|
|
MenuItem2: TMenuItem;
|
|
MenuItem3: TMenuItem;
|
|
MenuItem4: TMenuItem;
|
|
MenuItem5: TMenuItem;
|
|
MenuItem6: TMenuItem;
|
|
MenuItem7: TMenuItem;
|
|
MenuItem8: TMenuItem;
|
|
MenuItem9: TMenuItem;
|
|
MnuNewPage: TMenuItem;
|
|
MnuNewButton: TMenuItem;
|
|
popNew: TPopupMenu;
|
|
popToolbar: TPopupMenu;
|
|
popForm: TPopupMenu;
|
|
StatusBar1: TStatusBar;
|
|
TbTop: TToolBar;
|
|
BtnNew: TToolButton;
|
|
BtnDel: TToolButton;
|
|
ToolButton1: TToolButton;
|
|
BtnUp: TToolButton;
|
|
BtnDown: TToolButton;
|
|
TvItems: TTreeView;
|
|
procedure AcDeleteExecute(Sender: TObject);
|
|
procedure AcMoveDownExecute(Sender: TObject);
|
|
procedure AcMoveUpExecute(Sender: TObject);
|
|
procedure AcNewButtonExecute(Sender: TObject);
|
|
procedure AcNewPageExecute(Sender: TObject);
|
|
procedure AcShowToolbarCaptionsExecute(Sender: TObject);
|
|
procedure AcToolbarExecute(Sender: TObject);
|
|
procedure AcUpdateExecute(Sender: TObject);
|
|
procedure AlActionsUpdate({%H-}AAction: TBasicAction; var {%H-}Handled: Boolean);
|
|
procedure FormActivate(Sender: TObject);
|
|
procedure FormClose(Sender: TObject; var {%H-}CloseAction: TCloseAction);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure FormDestroy(Sender: TObject);
|
|
procedure FormShow(Sender: TObject);
|
|
procedure TvItemsChange(Sender: TObject; Node: TTreeNode);
|
|
procedure TvItemsCollapsing(Sender: TObject; {%H-}Node: TTreeNode;
|
|
var {%H-}AllowCollapse: Boolean);
|
|
procedure TvItemsEdited(Sender: TObject; Node: TTreeNode; var S: string);
|
|
procedure TvItemsKeyPress(Sender: TObject; var {%H-}Key: char);
|
|
private
|
|
FUpdateSelectionCount: Integer;
|
|
FLargeToolBtnSize: Integer;
|
|
FSmallToolBtnSize: Integer;
|
|
procedure BeginUpdateSelection;
|
|
procedure EndUpdateSelection;
|
|
procedure BuildTreeData;
|
|
procedure DeleteItem(Item: TPersistent);
|
|
procedure ExchangeItems(Node1, Node2: TTreeNode);
|
|
// procedure OnComponentRenamed(AComponent: TComponent);
|
|
procedure OnGetSelection(const ASelection: TPersistentSelectionList);
|
|
procedure OnPersistentAdded(APersistent: TPersistent; Select: boolean);
|
|
procedure OnPersistentDeleting(APersistent: TPersistent);
|
|
procedure OnSetSelection(const ASelection: TPersistentSelectionList);
|
|
procedure SelectButtonInObjectInspector(AButton: TJvOutlookBarButton; ForceUpdate: Boolean);
|
|
procedure SelectPageInObjectInspector(APage: TJvOutlookBarPage; ForceUpdate: Boolean);
|
|
function ValidateTreeData: boolean;
|
|
|
|
protected
|
|
FOutlookBar: TJvCustomOutlookBar;
|
|
FDesigner: TComponentEditorDesigner;
|
|
function CheckValidButtonNode(Node: TTreeNode): boolean;
|
|
function CheckValidPageNode(Node: TTreeNode): boolean;
|
|
function FindNode(ACandidate: TPersistent; out ANode: TTreeNode): Boolean;
|
|
procedure Modified;
|
|
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
|
|
procedure SelectionChanged(AOrderChanged: Boolean = false);
|
|
{$IF LCL_FullVersion >= 1080000}
|
|
procedure DoAutoAdjustLayout(const AMode: TLayoutAdjustmentPolicy;
|
|
const AXProportion, AYProportion: Double); override;
|
|
{$ENDIF}
|
|
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
procedure RefreshNames;
|
|
procedure SetData(AOutlookBar: TJvCustomOutlookBar; ADesigner: TComponentEditorDesigner);
|
|
property Outlookbar: TJvCustomOutlookBar read FOutlookBar;
|
|
|
|
end;
|
|
|
|
var
|
|
FrmOLBEditor: TFrmOLBEditor;
|
|
|
|
implementation
|
|
|
|
{$R *.lfm}
|
|
|
|
uses
|
|
PropEditUtils, IDEWindowIntf, IDEImagesIntf, ObjInspStrConsts
|
|
{$IF LCL_FullVersion < 1080000}
|
|
, JvJVCLUtils
|
|
{$ENDIF}
|
|
;
|
|
|
|
type
|
|
THackOutlookBar = class(TJvCustomOutlookBar);
|
|
|
|
const
|
|
SDamagedTreeStructure = 'Dameged tree structure.';
|
|
|
|
LARGE_TOOLBUTTON_SIZE = 40;
|
|
SMALL_TOOLBUTTON_SIZE = 22;
|
|
|
|
|
|
{ TFrmOLBEditor }
|
|
|
|
constructor TFrmOLBEditor.Create(AOwner: TComponent);
|
|
begin
|
|
inherited;
|
|
|
|
AlActions.Images := IDEImages.Images_16;
|
|
{$IF LCL_FullVersion >= 1080000}
|
|
AcNewPage.ImageIndex := IDEImages.LoadImage('laz_add');
|
|
AcNewButton.ImageIndex := IDEImages.LoadImage('laz_add');
|
|
AcDelete.ImageIndex := IDEImages.LoadImage('laz_delete');
|
|
AcMoveDown.ImageIndex := IDEImages.LoadImage('arrow_down');
|
|
AcMoveUp.ImageIndex := IDEImages.LoadImage('arrow_up');
|
|
{$ELSE}
|
|
AcNewPage.ImageIndex := IDEImages.LoadImage(16, 'laz_add');
|
|
AcNewButton.ImageIndex := IDEImages.LoadImage(16, 'laz_add');
|
|
AcDelete.ImageIndex := IDEImages.LoadImage(16, 'laz_delete');
|
|
AcMoveDown.ImageIndex := IDEImages.LoadImage(16, 'arrow_down');
|
|
AcMoveUp.ImageIndex := IDEImages.LoadImage(16, 'arrow_up');
|
|
{$ENDIF}
|
|
|
|
TbTop.Images := AlActions.Images;
|
|
popNew.Images := AlActions.Images;
|
|
popForm.Images := AlActions.Images;
|
|
popToolbar.Images := AlActions.Images;
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.AcDeleteExecute(Sender: TObject);
|
|
var
|
|
s: String;
|
|
begin
|
|
if (FOutlookBar = nil) or (FDesigner = nil) or (TvItems.Selected = nil) then
|
|
exit;
|
|
|
|
s := TCollectionItem(TvItems.Selected.Data).DisplayName;
|
|
if MessageDlg(oisConfirmDelete, Format(oisDeleteItem, [s]),
|
|
mtConfirmation, [mbYes, mbNo], 0) <> mrYes
|
|
then
|
|
exit;
|
|
|
|
BeginUpdateSelection;
|
|
try
|
|
FDesigner.DeleteSelection;
|
|
finally
|
|
EndUpdateSelection;
|
|
end;
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.AcMoveDownExecute(Sender: TObject);
|
|
var
|
|
node: TTreeNode;
|
|
begin
|
|
if (FOutlookBar = nil) or (FDesigner = nil) or (TvItems.Selected = nil) then
|
|
exit;
|
|
|
|
ExchangeItems(TvItems.Selected, TvItems.Selected.GetNextSibling);
|
|
node := TvItems.Selected.GetNextSibling;
|
|
node.MoveTo(TvItems.Selected, naInsert);
|
|
node.Expand(True);
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.AcMoveUpExecute(Sender: TObject);
|
|
var
|
|
node: TTreeNode;
|
|
begin
|
|
node := TvItems.Selected;
|
|
if (FOutlookBar = nil) or (FDesigner = nil) or (node = nil) then
|
|
exit;
|
|
|
|
ExchangeItems(TvItems.Selected, node.getPrevSibling);
|
|
node.MoveTo(node.GetPrevSibling, naInsert);
|
|
node.Expand(True);
|
|
TvItems.Selected := node;
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.AcNewButtonExecute(Sender: TObject);
|
|
var
|
|
btn: TJvOutlookBarButton;
|
|
page: TJvOutlookBarPage;
|
|
N: TTreeNode;
|
|
begin
|
|
if (FOutlookBar = nil) or (FDesigner = nil) then
|
|
exit;
|
|
if FDesigner.PropertyEditorHook = nil then
|
|
exit;
|
|
|
|
N := TvItems.Selected;
|
|
if N.Parent <> nil then
|
|
N := N.Parent;
|
|
page := TJvOutlookBarPage(N.Data);
|
|
btn := page.Buttons.Add;
|
|
FDesigner.PropertyEditorHook.PersistentAdded(btn, True);
|
|
Modified;
|
|
|
|
if FindNode(btn, N) then TvItems.Selected := N;
|
|
//TvItems.Selected := TvItems.Items.AddChildObject(N, btn.Caption, btn);
|
|
//SelectionChanged;
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.AcNewPageExecute(Sender: TObject);
|
|
var
|
|
page: TJvOutlookBarPage;
|
|
node: TTreeNode;
|
|
begin
|
|
if (FOutlookBar = nil) or (FDesigner = nil) then
|
|
exit;
|
|
if FDesigner.PropertyEditorHook = nil then
|
|
exit;
|
|
|
|
page := THackOutlookBar(FOutlookBar).Pages.Add;
|
|
FDesigner.PropertyEditorHook.PersistentAdded(page,True);
|
|
Modified;
|
|
if FindNode(page, node) then TvItems.Selected := node;
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.AcShowToolbarCaptionsExecute(Sender: TObject);
|
|
begin
|
|
AcShowToolbarCaptions.Checked := not AcShowToolbarCaptions.Checked;
|
|
tbTop.ShowCaptions := AcShowToolbarCaptions.Checked;
|
|
if AcShowToolbarCaptions.Checked then begin
|
|
TbTop.ButtonHeight := FLargeToolBtnSize;
|
|
TbTop.ButtonWidth := FLargeToolBtnSize;
|
|
end else
|
|
begin
|
|
TbTop.ButtonHeight := FSmallToolBtnSize;
|
|
TbTop.ButtonWidth := FSmallToolBtnSize;
|
|
end;
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.AcToolbarExecute(Sender: TObject);
|
|
begin
|
|
AcToolBar.Checked := not acToolBar.Checked;
|
|
TbTop.Visible := AcToolBar.Checked;
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.AcUpdateExecute(Sender: TObject);
|
|
begin
|
|
BuildTreeData;
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.AlActionsUpdate(AAction: TBasicAction; var Handled: Boolean);
|
|
var
|
|
Sel: Boolean;
|
|
begin
|
|
Sel := TvItems.Selected <> nil;
|
|
AcNewButton.Enabled := Sel;
|
|
AcDelete.Enabled := Sel;
|
|
AcMoveUp.Enabled := Sel and (TvItems.Selected.getPrevSibling <> nil);
|
|
AcMoveDown.Enabled := Sel and (TvItems.Selected.getNextSibling <> nil);
|
|
AcUpdate.Enabled := Screen.ActiveForm = Self;
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.BeginUpdateSelection;
|
|
begin
|
|
Inc(FUpdateSelectionCount);
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.BuildTreeData;
|
|
var
|
|
i, j: Integer;
|
|
page: TJvOutlookBarPage;
|
|
pageNode: TTreeNode;
|
|
button: TJvOutlookBarButton;
|
|
olb: THackOutlookBar;
|
|
s: String;
|
|
begin
|
|
TvItems.OnDeletion := nil;
|
|
TvItems.Items.Clear;
|
|
// TvItems.OnDeletion := TvItemsDeletion;
|
|
|
|
if FOutlookbar = nil then
|
|
exit;
|
|
{if FDesigner = nil) then
|
|
exit; }
|
|
|
|
TvItems.BeginUpdate;
|
|
try
|
|
olb := THackOutlookbar(FOutlookbar);
|
|
for i := 0 to olb.Pages.Count-1 do begin
|
|
page := olb.Pages[i];
|
|
s := page.Caption;
|
|
if s = '' then s := page.DisplayName;
|
|
pageNode := TvItems.Items.AddObject(nil, s, page);
|
|
for j := 0 to page.Buttons.Count-1 do begin
|
|
button := page.Buttons[j];
|
|
s := button.Caption;
|
|
if s = '' then s := button.DisplayName;
|
|
TvItems.Items.AddChildObject(pageNode, s, button);
|
|
end;
|
|
pageNode.Expand(false);
|
|
end;
|
|
finally
|
|
TvItems.EndUpdate;
|
|
end;
|
|
end;
|
|
|
|
function TFrmOLBEditor.CheckValidButtonNode(Node: TTreeNode): boolean;
|
|
begin
|
|
Result := false;
|
|
if (FOutlookBar = nil) or (FDesigner = nil) then
|
|
exit;
|
|
{$B-}
|
|
Result := (Node <> nil) and
|
|
(Node.Data <> nil) and
|
|
(TObject(Node.Data) is TJvOutlookBarButton);
|
|
end;
|
|
|
|
function TFrmOLBEditor.CheckValidPageNode(Node: TTreeNode): boolean;
|
|
begin
|
|
Result := false;
|
|
if (FOutlookBar = nil) or (FDesigner = nil) then
|
|
exit;
|
|
{$B-}
|
|
Result := (Node <> nil) and
|
|
(Node.Data <> nil) and
|
|
(TObject(Node.Data) is TJvOutlookBarPage);
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.DeleteItem(Item: TPersistent);
|
|
var
|
|
N, N2: TTreeNode;
|
|
|
|
function FindNextNode(const Node: TTreeNode): TTreeNode;
|
|
begin
|
|
if Node = nil then
|
|
begin
|
|
Result := nil;
|
|
Exit;
|
|
end;
|
|
Result := Node.GetNextSibling;
|
|
if Result = nil then
|
|
Result := Node.GetPrevSibling;
|
|
if Result = nil then
|
|
Result := Node.Parent;
|
|
if Result = nil then
|
|
Result := TvItems.Items.GetFirstNode;
|
|
if Result = Node then
|
|
Result := nil;
|
|
end;
|
|
|
|
begin
|
|
N2 := TvItems.Selected;
|
|
N := TvItems.Items.GetFirstNode;
|
|
try
|
|
while Assigned(N) do
|
|
begin
|
|
if N = Item then
|
|
begin
|
|
N2 := FindNextNode(N);
|
|
N.Data := nil;
|
|
N.Delete;
|
|
Exit;
|
|
end;
|
|
N := N.GetNext;
|
|
N2 := N;
|
|
end;
|
|
finally
|
|
TvItems.Selected := N2;
|
|
end;
|
|
end;
|
|
|
|
{$IF LCL_FullVersion >= 1080000}
|
|
procedure TFrmOLBEditor.DoAutoAdjustLayout(const AMode: TLayoutAdjustmentPolicy;
|
|
const AXProportion, AYProportion: Double);
|
|
begin
|
|
inherited DoAutoAdjustLayout(AMode, AXProportion, AYProportion);
|
|
if AMode in [lapAutoAdjustWithoutHorizontalScrolling, lapAutoAdjustForDPI] then
|
|
begin
|
|
DisableAutoSizing;
|
|
try
|
|
FLargeToolBtnSize := round(LARGE_TOOLBUTTON_SIZE * AXProportion);
|
|
FSmallToolBtnSize := round(SMALL_TOOLBUTTON_SIZE * AXProportion);
|
|
finally
|
|
EnableAutoSizing;
|
|
end;
|
|
end;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
procedure TFrmOLBEditor.EndUpdateSelection;
|
|
begin
|
|
dec(FUpdateSelectionCount);
|
|
if FUpdateSelectionCount=0 then
|
|
SelectionChanged;
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.ExchangeItems(Node1, Node2: TTreeNode);
|
|
var
|
|
I: Integer;
|
|
//page1, page2: TJvOutlookBarPage;
|
|
//btn1, btn2: TJvOutlookBarButton;
|
|
begin
|
|
(*
|
|
if TObject(Node1.Data) is TJvOutlookBarButton then
|
|
begin
|
|
btn1 := TJvOutlookBarButton(Node1.Data);
|
|
btn2 := TJvOutlookBarButton(Node2.Data);
|
|
btn1.Collection.Exchange(btn1.Index, btn2.Index);
|
|
end else
|
|
if TObject(Node1.Data) is TJvOutlookBarPage then
|
|
begin
|
|
page1 := TJvOutlookBarPage(Node1.Data);
|
|
page2 := TJvOutlookBarPage(Node2.Data);
|
|
page1.Collection.Exchange(page1.Index, page2.Index);
|
|
end;
|
|
// FDesigner.Modified;
|
|
FDesigner.PropertyEditorHook.RefreshPropertyValues;
|
|
*)
|
|
|
|
if TObject(Node1.Data) is TJvOutlookBarButton then
|
|
begin
|
|
I := TJvOutlookBarButton(Node1.Data).Index;
|
|
TJvOutlookBarButton(Node1.Data).Index := TJvOutlookBarButton(Node2.Data).Index;
|
|
TJvOutlookBarButton(Node2.Data).Index := I;
|
|
end
|
|
else
|
|
if TObject(Node1.Data) is TJvOutlookBarPage then
|
|
begin
|
|
I := TJvOutlookBarPage(Node1.Data).Index;
|
|
TJvOutlookBarPage(Node1.Data).Index := TJvOutlookBarPage(Node2.Data).Index;
|
|
TJvOutlookBarPage(Node2.Data).Index := I;
|
|
end;
|
|
Modified;
|
|
end;
|
|
|
|
function TFrmOLBEditor.FindNode(ACandidate: TPersistent;
|
|
out ANode: TTreeNode): Boolean;
|
|
var
|
|
pageNode, btnNode: TTreeNode;
|
|
begin
|
|
pageNode := TvItems.Items.GetFirstNode;
|
|
while pageNode <> nil do begin
|
|
if (ACandidate is TJvOutlookBarPage) then begin
|
|
if TJvOutlookBarPage(pageNode.Data) = ACandidate then begin
|
|
ANode := pageNode;
|
|
Result := true;
|
|
exit;
|
|
end;
|
|
end else
|
|
if (ACandidate is TJvOutlookBarButton) then begin
|
|
btnNode := pageNode.GetFirstChild;
|
|
while btnnode <> nil do begin
|
|
if TJvOutlookBarButton(btnNode.Data) = ACandidate then begin
|
|
ANode := btnNode;
|
|
Result := true;
|
|
exit;
|
|
end;
|
|
btnNode := btnNode.GetNextSibling;
|
|
end;
|
|
end;
|
|
pageNode := pageNode.GetNextSibling;
|
|
end;
|
|
Result := false;
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.FormActivate(Sender: TObject);
|
|
begin
|
|
if (FOutlookBar = nil) or (FDesigner = nil) then
|
|
exit;
|
|
if not ValidateTreeData then
|
|
BuildTreeData;
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.FormClose(Sender: TObject;
|
|
var CloseAction: TCloseAction);
|
|
begin
|
|
IDEDialogLayoutList.SaveLayout(Self);
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.FormCreate(Sender: TObject);
|
|
begin
|
|
IDEDialogLayoutList.ApplyLayout(Self);
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.FormDestroy(Sender: TObject);
|
|
begin
|
|
if FOutlookBar <> nil then
|
|
FOutlookBar.RemoveFreeNotification(self);
|
|
|
|
if GlobalDesignHook = Nil then
|
|
Exit;
|
|
(*
|
|
if Assigned(FComponentEditor) and Assigned(LinkDataset)
|
|
and not (csDestroying in LinkDataset.ComponentState)
|
|
and (FieldsListBox.SelCount > 0) then
|
|
GlobalDesignHook.SelectOnlyThis(LinkDataset);
|
|
*)
|
|
GlobalDesignHook.RemoveAllHandlersForObject(Self);
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.FormShow(Sender: TObject);
|
|
begin
|
|
FLargeToolBtnSize := Scale96ToForm(LARGE_TOOLBUTTON_SIZE);
|
|
FSmallToolBtnSize := Scale96ToForm(SMALL_TOOLBUTTON_SIZE);
|
|
if AcShowToolbarCaptions.Checked then
|
|
TbTop.ButtonHeight := FLargeToolBtnSize
|
|
else
|
|
TbTop.ButtonHeight := FSmallToolBtnSize;
|
|
TbTop.ButtonWidth := TbTop.ButtonHeight;
|
|
|
|
if (FOutlookBar = nil) or (FDesigner = nil) then
|
|
exit;
|
|
|
|
BuildTreeData;
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.Modified;
|
|
begin
|
|
FDesigner.PropertyEditorHook.RefreshPropertyValues;
|
|
FDesigner.Modified;
|
|
if GlobalDesignHook <> nil then
|
|
GlobalDesignHook.Modified(self);
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.Notification(AComponent: TComponent;
|
|
Operation: TOperation);
|
|
begin
|
|
inherited;
|
|
if (AComponent = FOutlookBar) and (Operation = opRemove) then
|
|
begin
|
|
// The toolbar is currently released, whose content is displayed in the
|
|
// editor window. Need to clean up the content - otherwise the window will
|
|
// have references to the already removed toolbars, which will end in AVs ...
|
|
SetData(nil, nil);
|
|
end;
|
|
end;
|
|
(*
|
|
procedure TFrmOLBEditor.OnComponentRenamed(AComponent: TComponent);
|
|
var
|
|
page: TJvOutlookBarPage;
|
|
button: TJvOutlookBarButton;
|
|
i: integer;
|
|
begin
|
|
if AComponent is TJvOutlookBarPage then begin
|
|
page := TJvOutlookBarPage(AComponent);
|
|
if AComponent is TField then begin
|
|
Field := TField(AComponent);
|
|
if not Assigned( Field ) then Exit;
|
|
i := FieldsListBox.Items.IndexOfObject(Field);
|
|
if i >= 0 then
|
|
FieldsListBox.Items[i] := Field.FieldName;
|
|
end else
|
|
if AComponent is TDataset And (AComponent = LinkDataset) then
|
|
Caption := fesFeTitle + ' - ' + LinkDataset.Name;
|
|
end; *)
|
|
|
|
procedure TFrmOLBEditor.OnGetSelection(
|
|
const ASelection: TPersistentSelectionList);
|
|
var
|
|
pagenode, btnnode: TTreeNode;
|
|
begin
|
|
if not Assigned(ASelection) then
|
|
exit;
|
|
if ASelection.Count > 0 then
|
|
ASelection.Clear;
|
|
pageNode := TvItems.Items.GetFirstNode;
|
|
while pageNode <> nil do begin
|
|
if pageNode.Selected then
|
|
ASelection.Add(TPersistent(pageNode.Data));
|
|
btnNode := pageNode.GetFirstChild;
|
|
while btnNode <> nil do begin
|
|
if btnNode.selected then
|
|
ASelection.Add(TPersistent(btnNode.Data));
|
|
btnNode := btnNode.GetNextSibling;
|
|
end;
|
|
pageNode := pageNode.GetNextSibling;
|
|
end;
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.OnPersistentAdded(APersistent: TPersistent; Select: boolean);
|
|
var
|
|
olb: TJvCustomOutlookBar;
|
|
page: TJvOutlookBarPage;
|
|
button: TJvOutlookBarButton;
|
|
node: TTreeNode;
|
|
begin
|
|
if not Assigned(APersistent) then
|
|
exit;
|
|
|
|
if (APersistent is TJvOutlookBarPage) then begin
|
|
page := TJvOutlookBarPage(APersistent);
|
|
olb := page.GetOutlookBar;
|
|
if olb = FOutlookBar then begin
|
|
BuildTreeData;
|
|
if FindNode(page, node) then
|
|
TvItems.Selected := node;
|
|
end;
|
|
end else
|
|
if (APersistent is TJvOutlookBarButton) then begin
|
|
button := TJvOutlookBarButton(APersistent);
|
|
olb := button.GetOutlookBar;
|
|
if olb = FOutlookBar then begin
|
|
BuildTreeData;
|
|
if FindNode(button, node) then
|
|
TvItems.Selected := node;
|
|
end;
|
|
end;
|
|
|
|
{
|
|
if (APersistent is TJvOutlookBarPage) then begin
|
|
page := TJvOutlookBarPage(APersistent);
|
|
olb := THackOutlookbar((page.Collection).Owner);
|
|
if (olb = FOutlookBar) then begin
|
|
if not FindNode(page, node) then
|
|
node := TvItems.Items.AddObject(nil, page.Caption, page);
|
|
TvItems.Selected := node;
|
|
end;
|
|
end else
|
|
if (APersistent is TJvOutlookBarButton) then begin
|
|
button := TJvOutlookBarButton(APersistent);
|
|
page := TJvOutlookBarPage(button.Collection.Owner);
|
|
olb := THackOutlookBar(page.Collection.Owner);
|
|
if (olb = FOutlookBar) and FindNode(page, node) then begin
|
|
if not FindNode(button, node) then
|
|
node := TvItems.Items.AddChildObject(node, button.Caption, button);
|
|
TvItems.Selected := node;
|
|
end;
|
|
end;
|
|
}
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.OnPersistentDeleting(APersistent: TPersistent);
|
|
var
|
|
node: TTreeNode;
|
|
begin
|
|
if FindNode(APersistent, node) then
|
|
TvItems.Items.Delete(node);
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.OnSetSelection(
|
|
const ASelection: TPersistentSelectionList);
|
|
var
|
|
i: Integer;
|
|
node: TTreeNode;
|
|
begin
|
|
if Assigned(ASelection) then begin
|
|
//Unselect all
|
|
for i := 0 to TvItems.SelectionCount-1 do
|
|
TvItems.Items.GetSelections(I).Selected := false;
|
|
//select from list
|
|
for i := 0 to ASelection.Count - 1 do
|
|
if FindNode(ASelection.Items[i], node) then
|
|
node.Selected := true;
|
|
end;
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.RefreshNames;
|
|
var
|
|
pageNode, buttonNode: TTreeNode;
|
|
begin
|
|
if (FOutlookBar = nil) or (FDesigner = nil) then
|
|
exit;
|
|
|
|
pagenode := TvItems.Items.GetFirstNode;
|
|
while pagenode <> nil do
|
|
begin
|
|
if not CheckValidPageNode(pagenode) then
|
|
raise Exception.Create('TFrmOLBEditor.RefreshNames: '+ SDamagedTreeStructure);
|
|
pageNode.Text := TJvOutlookBarPage(pageNode.Data).Caption;
|
|
buttonNode := pageNode.GetFirstChild;
|
|
while buttonNode <> nil do
|
|
begin
|
|
if not CheckValidButtonNode(buttonNode) then
|
|
raise Exception.Create('TFrmOLBEditor.RefreshNames: '+ SDamagedTreeStructure);
|
|
buttonNode.Text := TJvOutlookBarButton(buttonNode.Data).Caption;
|
|
buttonNode := buttonNode.GetNextSibling;
|
|
end;
|
|
pageNode := pageNode.GetNextSibling;
|
|
end;
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.SelectionChanged(AOrderChanged: Boolean = false);
|
|
var
|
|
SelList: TPersistentSelectionList;
|
|
begin
|
|
if (FUpdateSelectionCount>0) or (GlobalDesignHook=nil) then
|
|
exit;
|
|
|
|
GlobalDesignHook.RemoveHandlerSetSelection(@OnSetSelection);
|
|
try
|
|
SelList := TPersistentSelectionList.Create;
|
|
SelList.ForceUpdate := AOrderChanged;
|
|
try
|
|
OnGetSelection(SelList);
|
|
FDesigner.PropertyEditorHook.SetSelection(SelList) ;
|
|
finally
|
|
SelList.Free;
|
|
end;
|
|
finally
|
|
GlobalDesignHook.AddHandlerSetSelection(@OnSetSelection);
|
|
end;
|
|
AlActions.UpdateAction(nil);
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.SelectPageInObjectInspector(APage: TJvOutlookbarPage;
|
|
ForceUpdate: Boolean);
|
|
var
|
|
NewSelection: TPersistentSelectionList;
|
|
begin
|
|
if (FOutlookBar = nil) or (GlobalDesignHook = nil) then
|
|
Exit;
|
|
|
|
// select in OI
|
|
NewSelection := TPersistentSelectionList.Create;
|
|
NewSelection.ForceUpdate := ForceUpdate;
|
|
try
|
|
NewSelection.Add(APage);
|
|
GlobalDesignHook.SetSelection(NewSelection);
|
|
GlobalDesignHook.LookupRoot := GetLookupRootForComponent(FOutlookBar);
|
|
finally
|
|
NewSelection.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.SelectButtonInObjectInspector(AButton: TJvOutlookBarButton;
|
|
ForceUpdate: Boolean);
|
|
var
|
|
NewSelection: TPersistentSelectionList;
|
|
begin
|
|
if (FOutlookBar = nil) or (GlobalDesignHook = nil) then
|
|
Exit;
|
|
|
|
// select in OI
|
|
NewSelection := TPersistentSelectionList.Create;
|
|
NewSelection.ForceUpdate := ForceUpdate;
|
|
try
|
|
NewSelection.Add(AButton);
|
|
GlobalDesignHook.SetSelection(NewSelection);
|
|
GlobalDesignHook.LookupRoot := GetLookupRootForComponent(FOutlookBar);
|
|
finally
|
|
NewSelection.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.SetData(AOutlookBar: TJvCustomOutlookBar;
|
|
ADesigner: TComponentEditorDesigner);
|
|
begin
|
|
if FOutlookBar <> nil then
|
|
FOutlookBar.RemoveFreeNotification(self);
|
|
|
|
FOutlookBar := AOutlookBar;
|
|
FDesigner := ADesigner;
|
|
|
|
if FOutlookBar <> nil then
|
|
FOutlookBar.FreeNotification(self);
|
|
|
|
if GlobalDesignHook <> nil then
|
|
begin
|
|
GlobalDesignHook.RemoveAllHandlersForObject(Self);
|
|
if FOutlookbar <> nil then
|
|
begin
|
|
GlobalDesignHook.AddHandlerPersistentAdded(@OnPersistentAdded);
|
|
GlobalDesignHook.AddHandlerPersistentDeleting(@OnPersistentDeleting);
|
|
GlobalDesignHook.AddHandlerGetSelection(@OnGetSelection);
|
|
GlobalDesignHook.AddHandlerSetSelection(@OnSetSelection);
|
|
end;
|
|
end;
|
|
|
|
BuildTreeData;
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.TvItemsChange(Sender: TObject; Node: TTreeNode);
|
|
var
|
|
Obj: TObject;
|
|
olb: THackOutlookBar;
|
|
page: TJvOutlookBarPage;
|
|
btn: TJvOutlookBarButton;
|
|
index: integer;
|
|
begin
|
|
if (FOutlookBar = nil) or (FDesigner = nil) then
|
|
exit;
|
|
|
|
olb := THackOutlookBar(FOutlookBar);
|
|
if Assigned(Node) then
|
|
begin
|
|
Obj := TObject(Node.Data);
|
|
if Obj = nil then
|
|
raise Exception.Create('TFrmOLBEditor.TvItemsChange: Incorrect data in the field.');
|
|
if Obj is TJvOutlookBarPage then
|
|
begin
|
|
if not(CheckValidPageNode(Node)) then
|
|
raise Exception.Create('TFrmOLBEditor.TvItemsChange: ' + SDamagedTreeStructure);
|
|
page := TJvOutlookBarPage(Obj);
|
|
SelectPageInObjectInspector(page, true);
|
|
index := olb.Pages.IndexOf(page);
|
|
if index = -1 then
|
|
raise Exception.Create('TFrmOLBEditor.TvItemsChange: ' + SDamagedTreeStructure);
|
|
olb.ActivePageIndex := index;
|
|
end else
|
|
if Obj is TJvOutlookBarButton then
|
|
begin
|
|
btn := TJvOutlookBarButton(Obj);
|
|
SelectButtonInObjectInspector(btn, true);
|
|
if not(CheckValidButtonNode(Node)) then
|
|
raise Exception.Create('TFrmOLBEditor.TvItemsChange: ' + SDamagedTreeStructure);
|
|
page := TJvOutlookBarPage(Node.Parent.Data);
|
|
index := olb.Pages.IndexOf(page);
|
|
if index = -1 then
|
|
raise Exception.Create('TFrmOLBEditor.TvItemsChange: ' + SDamagedTreeStructure);
|
|
olb.ActivePageIndex := index;
|
|
end;
|
|
end else
|
|
FDesigner.SelectOnlyThisComponent(FOutlookBar);
|
|
|
|
Modified;
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.TvItemsCollapsing(Sender: TObject; Node: TTreeNode;
|
|
var AllowCollapse: Boolean);
|
|
begin
|
|
//
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.TvItemsEdited(Sender: TObject; Node: TTreeNode; var S: string);
|
|
var
|
|
page: TJvOutlookBarPage;
|
|
btn: TJvOutlookBarButton;
|
|
begin
|
|
if (FOutlookBar = nil) or (FDesigner = nil) then
|
|
exit;
|
|
|
|
if Node.Data = nil then
|
|
raise Exception.Create('TfrmOLBEditor.TvItemsEdited: ' + SDamagedTreeStructure);
|
|
|
|
if TObject(Node.Data) is TJvOutlookBarPage then
|
|
begin
|
|
page := TJvOutlookBarPage(Node.Data);
|
|
page.Caption := S;
|
|
Modified;
|
|
end else
|
|
if TObject(Node.Data) is TJvOutlookBarButton then
|
|
begin
|
|
btn := TJvOutlookBarButton(Node.Data);
|
|
btn.Caption := S;
|
|
Modified;
|
|
end else
|
|
raise Exception.Create('TFrmOLBEditor.TvItemsEdited: ' + SDamagedTreeStructure);
|
|
end;
|
|
|
|
procedure TFrmOLBEditor.TvItemsKeyPress(Sender: TObject; var Key: char);
|
|
begin
|
|
//
|
|
end;
|
|
|
|
function TFrmOLBEditor.ValidateTreeData: boolean;
|
|
var
|
|
i, j: Integer;
|
|
pagesValid: Boolean;
|
|
btnsValid: Boolean;
|
|
pageNode: TTreeNode;
|
|
btnNode: TTreeNode;
|
|
olb: THackOutlookBar;
|
|
begin
|
|
Result := false;
|
|
if (FOutlookBar = nil) or (FDesigner = nil) then
|
|
exit;
|
|
|
|
olb := THackOutlookBar(FOutlookBar);
|
|
i := 0;
|
|
pagesValid := true;
|
|
pageNode := TvItems.Items.GetFirstNode;
|
|
|
|
while (i < olb.Pages.Count) and pagesValid do
|
|
begin
|
|
pagesValid := pagesValid and (pageNode <> nil);
|
|
if pagesValid then
|
|
pagesValid := pagesValid and (TObject(pageNode.Data) = olb.Pages[i]);
|
|
if pagesValid then
|
|
begin
|
|
j := 0;
|
|
btnsValid := true;
|
|
btnNode := pageNode.GetFirstChild;
|
|
while (j < olb.Pages[i].Buttons.Count) and btnsValid do
|
|
begin
|
|
btnsValid := btnsValid and (btnNode <> nil);
|
|
if btnsValid then
|
|
btnsValid := btnsValid and (TObject(btnNode.Data) = olb.Pages[i].Buttons[j]);
|
|
if btnsValid then
|
|
begin
|
|
inc(j);
|
|
btnNode := btnNode.GetNextSibling;
|
|
end;
|
|
end;
|
|
|
|
// Important! You need to make sure that there are no extra items in the tree!
|
|
btnsValid := btnsValid and (btnNode = nil);
|
|
end;
|
|
|
|
if pagesValid then
|
|
begin
|
|
inc(i);
|
|
pageNode := pageNode.GetNextSibling;
|
|
end;
|
|
end;
|
|
|
|
// Important! You need to make sure that there are no extra items in the tree!
|
|
pagesValid := pagesValid and (pageNode = nil);
|
|
Result := pagesValid;
|
|
end;
|
|
|
|
end.
|
|
|