home *** CD-ROM | disk | FTP | other *** search
- {*
- *
- * Copyright (c) 1992 by Richard W. Hansen
- *
- * This source code will compile.
- * Unpacked source is available to registered users.
- *
- *}
- UNIT TvMenus;{$I TVDEFS.INC}INTERFACE USES TvConst,App,Drivers,Menus,Views,Objects;CONST Marker:String[10]='√';
- NoMarker:String[10]=' ';MarkerLen:Byte=1;TYPE PNewMenuBar=^TNewMenuBar;TNewMenuBar=Object(TMenuBar)
- Procedure HandleEvent(var E:TEvent);Virtual;Procedure ToggleMarker(Cmd:Word);Procedure SetMarker(Cmd:Word);
- Procedure ClearMarker(Cmd:Word);Function MarkerIsSet(Cmd:Word):Boolean;Procedure ResetMarkers(FirstCmd:Word;LastCmd:Word;
- NewCmd:Word);Function FindCmd(AMenu:PMenu;Cmd:Word):PMenuItem;end;Function NewMarkedItem(Name,Param:TMenuStr;KeyCode:Word;
- Command:Word;AHelpCtx:Word;Next:PMenuItem):PMenuItem;Function PopupMenu(PopMenu:PMenuBox):Word;
- Function MousePopupMenu(PopMenu:PMenuBox):Word;IMPLEMENTATION Function PopupMenu(PopMenu:PMenuBox):Word;var Command:Word;
- Event:TEvent;X:Integer;Y:Integer;begin X:=PopMenu^.Origin.X;if(X+PopMenu^.Size.X)>Desktop^.Size.X then
- X:=Desktop^.Size.X-PopMenu^.Size.X;Y:=PopMenu^.Origin.Y;if(Y+PopMenu^.Size.Y)>Desktop^.Size.Y then
- Y:=Desktop^.Size.Y-PopMenu^.Size.Y;if(X<0)then X:=0;if(Y<0)then Y:=0;PopMenu^.MoveTo(X,Y);
- PopupMenu:=Desktop^.ExecView(PopMenu);end;Function MousePopupMenu(PopMenu:PMenuBox):Word;var Command:Word;Event:TEvent;
- Pos:TPoint;begin Repeat Desktop^.GetEvent(Event);Until(Event.What=evMouseUp);Desktop^.MakeLocal(MouseWhere,Pos);
- if(Pos.X+PopMenu^.Size.X)>Desktop^.Size.X then Pos.X:=Desktop^.Size.X-PopMenu^.Size.X;
- if(Pos.Y+PopMenu^.Size.Y)>Desktop^.Size.Y then Pos.Y:=Desktop^.Size.Y-PopMenu^.Size.Y;if(Pos.X<0)then Pos.X:=0;
- if(Pos.Y<0)then Pos.Y:=0;PopMenu^.MoveTo(Pos.X,Pos.Y);MousePopupMenu:=Desktop^.ExecView(PopMenu);end;
- Function NewMarkedItem(Name,Param:TMenuStr;KeyCode:Word;Command:Word;AHelpCtx:Word;Next:PMenuItem):PMenuItem;var i:Byte;begin
- if(Copy(Name,1,MarkerLen)<>Marker)then Insert(NoMarker,Name,1);if(Name[MarkerLen+1]<>' ')then Insert(' ',Name,MarkerLen+1);
- NewMarkedItem:=NewItem(Name,Param,KeyCode,Command,AHelpCtx,Next);end;Procedure TNewMenuBar.HandleEvent(var E:TEvent);begin
- if(E.What=evCommand)then if(E.Command>=cmMarkStart)and(E.Command<=cmMarkEnd)then begin ToggleMarker(E.Command);end;
- TMenuBar.HandleEvent(E);end;Procedure TNewMenuBar.ToggleMarker(Cmd:Word);begin if MarkerIsSet(Cmd)then ClearMarker(Cmd)else
- SetMarker(Cmd);end;Procedure TNewMenuBar.SetMarker(Cmd:Word);var P:PMenuItem;i:Byte;begin P:=FindCmd(Menu,Cmd);if(P<>nil)then
- for i:=1 to MarkerLen do P^.Name^[i]:=Marker[i];end;Procedure TNewMenuBar.ClearMarker(Cmd:Word);var P:PMenuItem;i:Byte;begin
- P:=FindCmd(Menu,Cmd);if(P<>nil)then for i:=1 to MarkerLen do P^.Name^[i]:=NoMarker[i];end;
- Function TNewMenuBar.MarkerIsSet(Cmd:Word):Boolean;var P:PMenuItem;begin MarkerIsSet:=False;P:=FindCmd(Menu,Cmd);
- if(P<>nil)then MarkerIsSet:=(Copy(P^.Name^,1,MarkerLen)=Marker);end;Procedure TNewMenuBar.ResetMarkers(FirstCmd:Word;
- LastCmd:Word;NewCmd:Word);var P:PMenuItem;i:Byte;begin P:=FindCmd(Menu,FirstCmd);While(P<>nil)do begin
- if(P^.Command=NewCmd)then for i:=1 to MarkerLen do P^.Name^[i]:=Marker[i]
- else if(P^.Command>=FirstCmd)and(P^.Command<=LastCmd)then for i:=1 to MarkerLen do P^.Name^[i]:=NoMarker[i];P:=P^.Next;end;
- end;Function TNewMenuBar.FindCmd(AMenu:PMenu;Cmd:Word):PMenuItem;var P:PMenuItem;Item:PMenuItem;begin Item:=nil;
- P:=AMenu^.Items;while(P<>nil)and(Item=nil)do begin if(P^.Command=0)and(P^.Name<>nil)then Item:=FindCmd(P^.SubMenu,Cmd)
- else if(P^.Command=Cmd)and not P^.Disabled then Item:=P;P:=P^.Next;end;FindCmd:=Item;end;End.
-