am2000mainmenu.pas
上传用户:powellwoo
上传日期:2007-01-07
资源大小:109k
文件大小:7k
源码类别:

Delphi控件源码

开发平台:

C++ Builder

  1. {*******************************************************}
  2. {                                                       }
  3. {       AnimatedMenus/2000                              }
  4. {       TMainMenu2000 Component Unit                    }
  5. {                                                       }
  6. {       Copyright (c) 1997-99 AnimatedMenus.com         }
  7. {       All rights reserved.                            }
  8. {                                                       }
  9. {*******************************************************}
  10. unit am2000mainmenu;
  11. {$I am2000.inc}
  12. interface
  13. uses
  14.   Windows, Messages, SysUtils, Classes, Graphics, Controls, StdCtrls, ExtCtrls,
  15.   Forms, Dialogs, Menus, Buttons, ComCtrls,
  16.   am2000options, am2000menuitem;
  17. type
  18.   // mainmenu manager
  19.   TCustomMainMenu2000 = class(TMainMenu)
  20.   private
  21.     FEMI2000           : TEditableMenuItem2000; // layer for comptibility with Delphi and your apps
  22.     FMergedMenus       : TList;
  23.     FMergedMenuItems   : TList;
  24.     ParentMenu         : TCustomMainMenu2000;
  25. {$IFNDEF Delphi4OrHigher}
  26.     FImages            : TImageList;
  27. {$ENDIF}
  28.     function GetMenuItem2000: TMenuItem2000;
  29.     function GetMergedMenuItem(const Index: Integer): TMenuItem;
  30.     function GetMergedMenuItemsCount: Integer;
  31.   protected
  32.     procedure Loaded; override;
  33. {$IFNDEF Delphi4OrHigher}
  34.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  35. {$ENDIF}
  36.   public
  37.     property Items2000 : TMenuItem2000
  38.       read GetMenuItem2000;
  39.     property MergedMenus : TList
  40.       read FMergedMenus;
  41. {$IFNDEF Delphi4OrHigher}
  42.     property Images : TImageList read FImages write FImages;
  43. {$ENDIF}
  44.     property MergedMenuItems [const Index: Integer] : TMenuItem read GetMergedMenuItem;
  45.     property MergedMenuItemsCount : Integer read GetMergedMenuItemsCount;
  46.     constructor Create(AOwner: TComponent); override;
  47.     destructor Destroy; override;
  48.     procedure Merge2(Menu: TMenu);
  49.     procedure Unmerge2(Menu: TMenu);
  50.     procedure RebuildMergedMenuItems;
  51.     function IsShortCut(var Msg: TWMKey): Boolean; 
  52. {$IFDEF Delphi4OrHigher}
  53.     override;
  54. {$ENDIF}
  55.   published
  56.     property Items       : TEditableMenuItem2000  read FEMI2000;
  57.   end;
  58. implementation
  59. uses
  60.   Consts,
  61.   am2000menubar, am2000const, am2000utils;
  62. type
  63.   // forgot about this
  64.   TFalseMenu = class(TComponent)
  65.   private
  66. {$IFDEF Delphi4OrHigher}  
  67.     FBiDiMode: TBiDiMode;
  68. {$ENDIF}
  69.     FItems: TMenuItem;
  70.   end;
  71. { TCustomMainMenu2000 }
  72. constructor TCustomMainMenu2000.Create(AOwner: TComponent);
  73. begin
  74.   inherited;
  75.   // we don't need TMenuItem so we just destoy it
  76.   // and create TMenuItem2000 instead of.
  77.   TFalseMenu(Self).FItems:= TMenuItem2000.Create(Self);
  78. {$IFDEF Delphi4OrHigher}
  79.   TFalseMenu(Self).FBiDiMode:= BiDiMode;
  80. {$ENDIF}
  81.   FEMI2000:= TEditableMenuItem2000.Create(Self);
  82.   FMergedMenus:=  TList.Create;
  83.   FMergedMenus.Add(Self);
  84.   FMergedMenuItems:= TList.Create;              
  85. end;
  86. destructor TCustomMainMenu2000.Destroy;
  87. begin
  88.   if (ParentMenu <> nil)
  89.   then ParentMenu.Unmerge2(Self);
  90.   FMergedMenus.Free;
  91.   FMergedMenuItems.Free;
  92.   if (csDesigning in ComponentState)
  93.   then SendMessage(GetMnuDsgnHandle, wm_Close, 0, 0);
  94.   inherited;
  95. end;
  96. procedure TCustomMainMenu2000.Loaded;
  97. begin
  98.   inherited;
  99.   // if this menu is the main menu for a mdi child form
  100.   // then scan the parent mdi form and merge with
  101.   // it's main menu
  102.   if (not (csDesigning in ComponentState))
  103.   and (TForm(Owner).Menu = Self)
  104.   and (TForm(Owner).FormStyle = fsMdiChild)
  105.   and (ActiveMenuBar <> nil)
  106.   and (ActiveMenuBar.Menu is TCustomMainMenu2000)
  107.   then begin
  108.     ParentMenu:= TCustomMainMenu2000(ActiveMenuBar.Menu);
  109.     ParentMenu.Merge2(Self);
  110.   end;
  111. end;
  112. function TCustomMainMenu2000.GetMenuItem2000: TMenuItem2000;
  113. begin
  114.   Result:= TMenuItem2000(inherited Items);
  115. end;
  116. procedure TCustomMainMenu2000.Merge2(Menu: TMenu);
  117. begin
  118.   FMergedMenus.Add(Menu);
  119.   RebuildMergedMenuItems;
  120.   if (ActiveMenuBar <> nil)
  121.   then ActiveMenuBar.UpdateMenuBar(True);
  122. end;
  123. procedure TCustomMainMenu2000.Unmerge2(Menu: TMenu);
  124. begin
  125.   FMergedMenus.Remove(Menu);
  126.   RebuildMergedMenuItems;
  127.   if (ActiveMenuBar <> nil)
  128.   then ActiveMenuBar.UpdateMenuBar(True);
  129. end;
  130. procedure TCustomMainMenu2000.RebuildMergedMenuItems;
  131. var
  132.   GroupIndex, MenuIndex, ItemIndex: Integer;
  133.   BreakGroupIndex: Boolean;
  134.   Menu: TMenu;
  135.   OwnerForm: TComponent;
  136. begin
  137.   FMergedMenuItems.Clear;
  138.   // place menu for active form at the end of the list
  139.   for MenuIndex:= 0 to FMergedMenus.Count -1 do
  140.     if FMergedMenus[MenuIndex] <> Self then begin
  141.       Menu:= TMenu(FMergedMenus[MenuIndex]);
  142.       OwnerForm:= Menu.Owner;
  143.       while (OwnerForm <> nil)
  144.       and (not (OwnerForm is TForm)) do
  145.         OwnerForm:= OwnerForm.Owner;
  146.       if (OwnerForm is TForm)
  147.       and (TForm(OwnerForm).Active)
  148.       and (TForm(OwnerForm).Menu = Menu)
  149.       then begin
  150.         FMergedMenus.Remove(Menu);
  151.         FMergedMenus.Add(Menu);
  152.         Break;
  153.       end;
  154.     end;
  155.   // rebuild menu items
  156.   for GroupIndex:= 0 to 255 do begin
  157.     MenuIndex:= FMergedMenus.Count -1;
  158.     BreakGroupIndex:= False;
  159.     while (MenuIndex >= 0) and (not BreakGroupIndex) do
  160.       with TMainMenu(FMergedMenus[MenuIndex]) do begin
  161.         for ItemIndex:= 0 to Items.Count -1 do
  162.           if Items[ItemIndex].GroupIndex = GroupIndex then begin
  163.             FMergedMenuItems.Add(Items[ItemIndex]);
  164.             BreakGroupIndex:= True;
  165.           end;
  166.         Dec(MenuIndex);
  167.       end;
  168.   end;
  169. end;
  170. function TCustomMainMenu2000.GetMergedMenuItem(const Index: Integer): TMenuItem;
  171. begin
  172.   Result:= nil;
  173.   if (FMergedMenuItems = nil) or (Index < 0)
  174.   then Exit;
  175.   if FMergedMenuItems.Count = 0
  176.   then RebuildMergedMenuItems;
  177.   if (Index < FMergedMenuItems.Count)
  178.   then Result:= TMenuItem(FMergedMenuItems[Index]);
  179. end;
  180. function TCustomMainMenu2000.GetMergedMenuItemsCount: Integer;
  181. begin
  182.   if FMergedMenuItems = nil
  183.   then
  184.     Result:= 0
  185.   else begin
  186.     if (FMergedMenuItems.Count = 0)
  187.     then RebuildMergedMenuItems;
  188.     Result:= FMergedMenuItems.Count;
  189.   end;
  190. end;
  191. {$IFNDEF Delphi4OrHigher}
  192. procedure TCustomMainMenu2000.Notification(AComponent: TComponent;
  193.   Operation: TOperation);
  194. begin
  195.   inherited;
  196.   if (Operation = opRemove)
  197.   and (Acomponent = FImages)
  198.   then FImages:= nil;
  199. end;
  200. {$ENDIF}
  201. function TCustomMainMenu2000.IsShortCut(var Msg: TWMKey): Boolean;
  202. begin
  203.   Result:= IsShortCutEx(Msg, Items2000, csDesigning in ComponentState);
  204. end;
  205. end.