educationlaz: implemented hiding menu items

git-svn-id: trunk@22241 -
This commit is contained in:
mattias 2009-10-20 12:51:23 +00:00
parent 1a06444518
commit 5ea22214c6
4 changed files with 90 additions and 13 deletions

View File

@ -38,7 +38,7 @@ type
TEduGeneralOptions = class(TEduOptionsNode) TEduGeneralOptions = class(TEduOptionsNode)
public public
constructor Create; constructor Create; override;
destructor Destroy; override; destructor Destroy; override;
function Load(Config: TConfigStorage): TModalResult; override; function Load(Config: TConfigStorage): TModalResult; override;
function Save(Config: TConfigStorage): TModalResult; override; function Save(Config: TConfigStorage): TModalResult; override;

View File

@ -45,6 +45,8 @@ type
function Load(Config: TConfigStorage): TModalResult; override; function Load(Config: TConfigStorage): TModalResult; override;
function Save(Config: TConfigStorage): TModalResult; override; function Save(Config: TConfigStorage): TModalResult; override;
function MenuItemToPath(Item: TIDEMenuItem): string; function MenuItemToPath(Item: TIDEMenuItem): string;
function FindItemWithPath(Path: string): TIDEMenuItem;
function KeepItemVisible(Item: TIDEMenuItem): boolean;
procedure Apply(Enable: boolean); override; procedure Apply(Enable: boolean); override;
property MenuHidden[MenuPath: string]: boolean read GetMenuHidden write SetMenuHidden; property MenuHidden[MenuPath: string]: boolean read GetMenuHidden write SetMenuHidden;
end; end;
@ -200,12 +202,33 @@ end;
procedure TEduMenuFrame.SaveMenuTree; procedure TEduMenuFrame.SaveMenuTree;
var var
TVNode: TTreeNode; TVNode: TTreeNode;
NewHide: Boolean;
OldHide: boolean;
Item: TIDEMenuItem;
Path: String;
OldHidden: TStringToStringTree;
begin begin
EduMenuOptions.ClearHMenuidden; OldHidden:=TStringToStringTree.Create(false);
TVNode:=MenusTreeView.Items.GetFirstNode; try
while TVNode<>nil do begin OldHidden.Assign(EduMenuOptions.fHidden);
EduMenuOptions.MenuHidden[TVNodeToIDEMenuPath(TVNode)]:=TVNode.StateIndex=HideImgID; EduMenuOptions.ClearHMenuidden;
TVNode:=TVNode.GetNext; TVNode:=MenusTreeView.Items.GetFirstNode;
while TVNode<>nil do begin
NewHide:=TVNode.StateIndex=HideImgID;
Path:=TVNodeToIDEMenuPath(TVNode);
OldHide:=OldHidden.Contains(Path);
EduMenuOptions.MenuHidden[Path]:=NewHide;
if NewHide<>OldHide then begin
Item:=EduMenuOptions.FindItemWithPath(Path);
if (Item<>nil) and (not EduMenuOptions.KeepItemVisible(Item)) then begin
Item.Visible:=not NewHide;
//debugln(['TEduMenuFrame.SaveMenuTree changed visibility: ',Item.GetPath,' visible=',Item.Visible,' Path=',Path,' OldHide=',OldHide,' NewHide=',NewHide]);
end;
end;
TVNode:=TVNode.GetNext;
end;
finally
OldHidden.Free;
end; end;
end; end;
@ -224,10 +247,8 @@ procedure TEduMenuFrame.UpdateTVNodeImage(TVNode: TTreeNode);
function ContainsHiddenNode(Node: TTreeNode): boolean; function ContainsHiddenNode(Node: TTreeNode): boolean;
begin begin
if (Node.StateIndex=HideImgID) and (Node<>TVNode) then begin if (Node.StateIndex=HideImgID) and (Node<>TVNode) then
debugln(['ContainsHiddenNode hidden Node=',Node.Text,' tvNode=',TVNode.Text]);
exit(true); exit(true);
end;
Node:=Node.GetFirstChild; Node:=Node.GetFirstChild;
while Node<>nil do begin while Node<>nil do begin
if ContainsHiddenNode(Node) then exit(true); if ContainsHiddenNode(Node) then exit(true);
@ -236,11 +257,8 @@ procedure TEduMenuFrame.UpdateTVNodeImage(TVNode: TTreeNode);
Result:=false; Result:=false;
end; end;
var
OldStateIndex: LongInt;
begin begin
if TVNode=nil then exit; if TVNode=nil then exit;
OldStateIndex:=TVNode.StateIndex;
if TVNode.StateIndex=HideImgID then if TVNode.StateIndex=HideImgID then
TVNode.StateIndex:=HideImgID TVNode.StateIndex:=HideImgID
else if ContainsHiddenNode(TVNode) then else if ContainsHiddenNode(TVNode) then
@ -380,10 +398,40 @@ begin
end; end;
end; end;
function TEduMenuOptions.FindItemWithPath(Path: string): TIDEMenuItem;
begin
Result:=IDEMenuRoots.FindByPath(Path,false);
end;
function TEduMenuOptions.KeepItemVisible(Item: TIDEMenuItem): boolean;
begin
if (Item=mnuEnvironment) or (Item.HasAsParent(mnuEnvironment)) then exit(true);
Result:=false;
end;
procedure TEduMenuOptions.Apply(Enable: boolean); procedure TEduMenuOptions.Apply(Enable: boolean);
procedure ApplyRecursive(Item: TIDEMenuItem);
var
Section: TIDEMenuSection;
i: Integer;
begin
if (not KeepItemVisible(Item)) and MenuHidden[MenuItemToPath(Item)] then
Item.Visible:=false;
// Note: do not show items. Some items should be hidden independent of education.
if Item is TIDEMenuSection then begin
Section:=TIDEMenuSection(Item);
for i:=0 to Section.Count-1 do
ApplyRecursive(Section[i]);
end;
end;
var
i: Integer;
begin begin
inherited Apply(Enable); inherited Apply(Enable);
// ToDo for i:=0 to IDEMenuRoots.Count-1 do
ApplyRecursive(IDEMenuRoots[i]);
end; end;
initialization initialization

View File

@ -90,6 +90,7 @@ type
function GetContainerSection: TIDEMenuSection; function GetContainerSection: TIDEMenuSection;
function GetContainerMenuItem: TMenuItem; function GetContainerMenuItem: TMenuItem;
function Size: integer; virtual; function Size: integer; virtual;
function HasAsParent(Item: TIDEMenuItem): boolean;
procedure WriteDebugReport(const Prefix: string; procedure WriteDebugReport(const Prefix: string;
MenuItemDebugReport: boolean); virtual; MenuItemDebugReport: boolean); virtual;
procedure ConsistencyCheck; virtual; procedure ConsistencyCheck; virtual;
@ -797,6 +798,18 @@ begin
Result:=FSize; Result:=FSize;
end; end;
function TIDEMenuItem.HasAsParent(Item: TIDEMenuItem): boolean;
var
CurItem: TIDEMenuSection;
begin
CurItem:=Section;
while CurItem<>nil do begin
if CurItem=Item then exit(true);
CurItem:=CurItem.Section;
end;
Result:=false;
end;
procedure TIDEMenuItem.WriteDebugReport(const Prefix: string; procedure TIDEMenuItem.WriteDebugReport(const Prefix: string;
MenuItemDebugReport: boolean); MenuItemDebugReport: boolean);
begin begin

View File

@ -192,6 +192,7 @@ type
constructor Create(const ACompareItems, ACompareNameWithItem: TListSortCompare); constructor Create(const ACompareItems, ACompareNameWithItem: TListSortCompare);
destructor Destroy; override; destructor Destroy; override;
procedure Clear; procedure Clear;
procedure Assign(Src: TStringToStringTree);
function Contains(const Name: string): Boolean; function Contains(const Name: string): Boolean;
procedure Delete(const Name: string); procedure Delete(const Name: string);
procedure Add(const Name, Value, Delimiter: string); procedure Add(const Name, Value, Delimiter: string);
@ -1428,6 +1429,21 @@ begin
FItems.Clear; FItems.Clear;
end; end;
procedure TStringToStringTree.Assign(Src: TStringToStringTree);
var
Node: TAvgLvlTreeNode;
Item: PStringToStringItem;
begin
Clear;
if Src=nil then exit;
Node:=Src.Tree.FindLowest;
while Node<>nil do begin
Item:=PStringToStringItem(Node.Data);
Values[Item^.Name]:=Item^.Value;
Node:=Src.Tree.FindSuccessor(Node);
end;
end;
function TStringToStringTree.Contains(const Name: string): Boolean; function TStringToStringTree.Contains(const Name: string): Boolean;
begin begin
Result:=FindNode(Name)<>nil; Result:=FindNode(Name)<>nil;