@@ -18,6 +18,7 @@ interface
1818
1919uses
2020 // Delphi
21+ Generics.Collections,
2122 ComCtrls, Controls, Classes, Windows, ExtCtrls, StdCtrls, ToolWin, Menus,
2223 // Project
2324 DB.USnippet, FrTitled, IntfFrameMgrs, IntfNotifier, UCommandBars,
@@ -26,29 +27,6 @@ interface
2627
2728type
2829
29- // !! HACK
30- // Horrible hack to expose CreateWnd for overiding TTreeView.CreateWnd for the
31- // existing TTreeView component of TOverviewFrame. The hack avoids having to
32- // remove the component and replacing it with a descendant class that is
33- // manually constructed at run time.
34- // This is here to enable the tree view to be recreated with correctly
35- // instantiated TViewItemTreeNode nodes after Windows recreates the tree
36- // behind the scenes after resuming from hibernation.
37- // I am deeply ashamed of this hack.
38- TTreeView = class (ComCtrls.TTreeView)
39- strict private
40- var
41- _HACK_fOnAfterCreateNilViews: TNotifyEvent;
42- protected
43- procedure CreateWnd ; override;
44- public
45- // / <summary>!! HACK. Event triggered after the inherited CreateWnd is
46- // / called. Only called if the tree view has nil references to IView
47- // / objects.</summary>
48- property _HACK_OnAfterCreateNilViews: TNotifyEvent
49- read _HACK_fOnAfterCreateNilViews write _HACK_fOnAfterCreateNilViews;
50- end ;
51-
5230 {
5331 TOverviewFrame:
5432 Titled frame that displays lists of snippets grouped in various ways and
@@ -111,6 +89,8 @@ TTVDraw = class(TSnippetsTVDraw)
11189 end ;
11290
11391 var
92+ fViewStore : TList<IView>; // Stores references to IView instances that
93+ // have weak references in tree nodes
11494 fTVDraw: TTVDraw; // Object that renders tree view nodes
11595 fNotifier: INotifier; // Notifies app of user initiated events
11696 fCanChange: Boolean; // Whether selected node allowed to change
@@ -237,10 +217,6 @@ TTVDraw = class(TSnippetsTVDraw)
237217 procedure RestoreTreeState ;
238218 { Restores last saved treeview expansion state from memory.
239219 }
240- // / <summary>!! HACK: Sets an event handler on the tree view to work
241- // / around a bug that can occur after resuming from hibernation.</summary>
242- // / <remarks>Method of IOverviewDisplayMgr.</remarks>
243- procedure _HACK_SetHibernateHandler (const AHandler: TNotifyEvent);
244220 { IPaneInfo }
245221 function IsInteractive : Boolean;
246222 { Checks if the pane is currently interactive with user.
@@ -311,6 +287,7 @@ constructor TOverviewFrame.Create(AOwner: TComponent);
311287 TabIdx: Integer; // loops through tabs
312288begin
313289 inherited ;
290+ fViewStore := TList<IView>.Create;
314291 // Create delegated (contained) command bar manager for toolbar and popup menu
315292 fCommandBars := TCommandBarMgr.Create(Self);
316293 fCommandBars.AddCommandBar(
@@ -346,6 +323,7 @@ destructor TOverviewFrame.Destroy;
346323 fSelectedItem := nil ;
347324 fSnippetList.Free; // does not free referenced snippets
348325 fCommandBars.Free;
326+ fViewStore.Free;
349327 inherited ;
350328end ;
351329
@@ -547,7 +525,7 @@ procedure TOverviewFrame.Redisplay;
547525 Exit;
548526 // Build new treeview using grouping determined by selected tab
549527 Builder := BuilderClasses[tcDisplayStyle.TabIndex].Create(
550- tvSnippets, fSnippetList
528+ tvSnippets, fSnippetList, fViewStore
551529 );
552530 Builder.Build;
553531 // Restore state of treeview based on last time it was displayed
@@ -982,12 +960,6 @@ procedure TOverviewFrame.UpdateTreeState(const State: TTreeNodeAction);
982960 end ;
983961end ;
984962
985- procedure TOverviewFrame._HACK_SetHibernateHandler (
986- const AHandler: TNotifyEvent);
987- begin
988- tvSnippets._HACK_OnAfterCreateNilViews := AHandler;
989- end ;
990-
991963{ TOverviewFrame.TTVDraw }
992964
993965function TOverviewFrame.TTVDraw .IsSectionHeadNode(
@@ -1026,24 +998,5 @@ function TOverviewFrame.TTVDraw.IsUserDefinedNode(
1026998 Result := False;
1027999end ;
10281000
1029- { TTreeView }
1030-
1031- procedure TTreeView.CreateWnd ;
1032- var
1033- HasNilViews: Boolean;
1034- Node: TTreeNode;
1035- begin
1036- inherited ;
1037- HasNilViews := False;
1038- for Node in Items do
1039- begin
1040- HasNilViews := not Assigned((Node as TViewItemTreeNode).ViewItem);
1041- if HasNilViews then
1042- Break;
1043- end ;
1044- if HasNilViews and Assigned(_HACK_fOnAfterCreateNilViews) then
1045- _HACK_fOnAfterCreateNilViews(Self);
1046- end ;
1047-
10481001end .
10491002
0 commit comments