home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / Pascal / Snippets / Billiards / simplewindow.p < prev   
Encoding:
Text File  |  1996-09-29  |  6.8 KB  |  328 lines  |  [TEXT/Rich]

  1. { simple window interface for Object Pascal }
  2. { written by Tim Budd, Oregon State University }
  3. { April 1990 }
  4.  
  5. unit SimpleWindow;
  6.  
  7. interface
  8.  
  9.     type
  10.         SimpleMenu = object
  11.                     { data fields }
  12.                 theMenuID: Integer;
  13.                 theMenuPtr: MenuHandle;
  14.                 link: SimpleMenu;
  15.                     { creation methods }
  16.                 procedure readFromResource (id: integer);
  17.                 procedure createNewMenu (title: Str255);
  18.                 procedure createAppleMenu (aboutTitle: Str255);
  19.                     { adding elements to menu }
  20.                 procedure addItem (title: Str255);
  21.                 procedure addSeparator;
  22.                     { action to take when selected }
  23.                     { must be overridden by user }
  24.                 procedure selectItem (itemNumber: integer);
  25.             end;
  26.  
  27.         SimpleWindow = object
  28.                     { data fields }
  29.                 theWindowPtr: windowPtr;
  30.                 name: STR255;
  31.                 windowRect: Rect;
  32.                 winType: integer;
  33.                 done: boolean;
  34.                 event: eventRecord;
  35.                     { creation methods }
  36.                 procedure setAttributes;
  37.                 procedure establish;
  38.                     { event handling }
  39.                 procedure eventLoop;
  40.                 procedure eventLoopTask;
  41.                 procedure endEventLoop;
  42.                     { window events - seldom overridden }
  43.                 procedure activate;
  44.                 procedure deactivate;
  45.                 procedure menu (which: LongInt);
  46.                 procedure menuChoice (theMenu, theItem: integer);
  47.                 procedure buttonDownEvent;
  48.                 procedure keyEvent;
  49.                 procedure handleDrag;
  50.                 procedure handleGrow;
  51.                 procedure doGoAway;
  52.                     { window events - often overridden }
  53.                 procedure buttonDown (x, y: integer);
  54.                 procedure keyPressed (c: char);
  55.                 procedure update;
  56.             end;
  57.     var
  58.         nextMenuID: Integer;
  59.         globalMenuList: SimpleMenu;
  60.  
  61.     procedure setNextMenuID (id: integer);
  62.     procedure globalInitializations;
  63.  
  64. implementation
  65.  
  66.     { the necessary Macintosh initializations }
  67.     procedure globalInitializations;
  68.     begin
  69.         initGraf(@ThePort);
  70.         InitFonts;
  71.         InitWindows;
  72.         FlushEvents(everyEvent, 0);
  73.         InitMenus;
  74.         DrawMenuBar;
  75.         TEInit;
  76.         InitDialogs(nil);
  77.         initCursor;
  78.         nextMenuID := 512;
  79.         globalMenuList := nil;
  80.     end;
  81.  
  82.     { set the attributes on the simple window }
  83.     procedure SimpleWindow.setAttributes;
  84.     begin
  85.         name := 'unknown window';
  86.         SetRect(windowRect, 50, 70, 350, 270);
  87.         winType := DocumentProc;
  88.         done := false;
  89.     end;
  90.  
  91.     { open (establish) a simple window }
  92.     procedure SimpleWindow.establish;
  93.         var
  94.             tempPort: Grafptr;
  95.     begin
  96.         GetPort(tempPort);
  97.         theWindowPtr := NewWindow(nil, windowRect, name, 
  98.             TRUE, winType, WindowPtr(-1), TRUE, LongInt(0));
  99.         SelectWindow(theWindowPtr);
  100.         ShowWindow(theWindowPtr);
  101.     end;
  102.  
  103.     { start up a main event loop }
  104.     procedure SimpleWindow.eventLoop;
  105.     begin
  106.         while not done do
  107.             self.eventLoopTask;
  108.     end;
  109.  
  110.     procedure SimpleWindow.eventLoopTask;
  111.         var
  112.             ignore: boolean;
  113.     begin
  114.         systemTask;
  115.         ignore := GetNextEvent(everyEvent, event);
  116.  
  117.         case event.what of
  118.  
  119.             mouseDown: 
  120.                 self.buttonDownEvent;
  121.  
  122.             keyDown: 
  123.                 self.keyEvent;
  124.  
  125.             activateEvt: 
  126.                 if BitAnd(event.modifiers, activeFlag) <> 0 then
  127.                     self.activate
  128.                 else
  129.                     self.deactivate;
  130.  
  131.             updateEvt: 
  132.                 self.update;
  133.  
  134.             otherwise
  135.                 ;
  136.         end;
  137.     end;
  138.  
  139.     procedure SimpleWindow.endEventLoop;
  140.     begin
  141.         done := true
  142.     end;
  143.  
  144.     procedure SimpleWindow.buttonDownEvent;
  145.         var
  146.             localPoint: Point;
  147.             wp: WindowPtr;
  148.     begin
  149.         case FindWindow(event.where, wp) of
  150.  
  151.             inSysWindow: 
  152.                 SystemClick(event, wp);
  153.  
  154.             inMenuBar: 
  155.                 self.menu(menuSelect(event.where));
  156.  
  157.             inGrow: 
  158.                 self.handleGrow;
  159.  
  160.             inDrag: 
  161.                 self.handleDrag;
  162.  
  163.             inContent: 
  164.                 if wp <> FrontWindow then
  165.                     SelectWindow(wp)
  166.                 else
  167.                     begin
  168.                         localPoint := event.where;
  169.                         GlobalToLocal(localPoint);
  170.                         self.buttonDown(localPoint.h, localPoint.v);
  171.                     end;
  172.  
  173.             inGoAway: 
  174.                 self.doGoAway;
  175.  
  176.         end;
  177.     end;
  178.  
  179.     procedure SimpleWindow.keyEvent;
  180.         var
  181.             chCode: integer;
  182.             ch: char;
  183.     begin
  184.         chCode := BitAnd(event.message, CharCodeMask);
  185.         ch := chr(chCode);
  186.         if BitAnd(event.modifiers, CmdKey) <> 0 then
  187.             begin
  188.                 if event.what <> AutoKey then
  189.                     self.menu(MenuKey(ch))
  190.             end
  191.         else
  192.             self.keyPressed(ch);
  193.     end;
  194.  
  195.     { handle a conventional key press - overridden in subclasses }
  196.     procedure SimpleWindow.keyPressed (c: char);
  197.     begin
  198.     end;
  199.  
  200.     { handle a window activation }
  201.     procedure SimpleWindow.activate;
  202.     begin
  203.         SetPort(self.theWindowPtr);
  204.     end;
  205.  
  206.     procedure SimpleWindow.deactivate;
  207.     begin
  208.         { subclasses may do something, we don't }
  209.     end;
  210.  
  211.     procedure SimpleWindow.menu (which: LongInt);
  212.         var
  213.             theMenu, theItem: integer;
  214.     begin
  215.         if which <> 0 then
  216.             self.menuChoice(HiWord(which), LoWord(which));
  217.     end;
  218.  
  219.     procedure SimpleWindow.handleDrag;
  220.     begin
  221.         dragWindow(theWindowPtr, event.where, ScreenBits.bounds);
  222.     end;
  223.  
  224.     procedure SimpleWindow.handleGrow;
  225.     begin
  226.         { assumption is that windows can't grow  }
  227.         { can be overridden in subclasses }
  228.     end;
  229.  
  230.     { handle a menu selection }
  231.     procedure SimpleWindow.menuChoice (theMenu, theItem: Integer);
  232.         var
  233.             menuPtr: SimpleMenu;
  234.     begin
  235.         menuPtr := globalMenuList;
  236.         while menuPtr <> nil do
  237.             if menuPtr.theMenuID = theMenu then
  238.                 begin
  239.                     menuPtr.selectItem(theItem);
  240.                     menuPtr := nil
  241.                 end
  242.             else
  243.                 menuPtr := menuPTr.link;
  244.     end;
  245.  
  246.     { handle a window update - usually modified in subclasses }
  247.     procedure SimpleWindow.update;
  248.     begin
  249.         SetPort(self.theWindowPtr);
  250.         ClipRect(self.theWindowPtr^.portRect);
  251.     end;
  252.  
  253.     { handle a button down event - usually overridden in subclasses}
  254.     procedure SimpleWindow.buttonDown (x, y: integer);
  255.     begin
  256.     end;
  257.  
  258.     { handle button press in go away box }
  259.     procedure SimpleWindow.doGoAway;
  260.     begin
  261.     end;
  262.  
  263.     { insert a menu into the menu bar }
  264.     procedure insertAndDraw (menu: SimpleMenu);
  265.     begin
  266.         InsertMenu(menu.theMenuPtr, 0);
  267.         DrawMenuBar;
  268.         menu.link := globalMenuList;
  269.         globalMenuList := menu;
  270.     end;
  271.  
  272.     { read a menu description from resource file }
  273.     procedure SimpleMenu.readFromResource (id: integer);
  274.     begin
  275.         theMenuPtr := GetMenu(id);
  276.         theMenuID := id;
  277.         insertAndDraw(self);
  278.     end;
  279.  
  280.     { create a new menu }
  281.     procedure SimpleMenu.createNewMenu (title: Str255);
  282.     begin
  283.         theMenuID := nextMenuID;
  284.         nextMenuID := nextMenuID + 1;
  285.         theMenuPtr := NewMenu(theMenuID, title);
  286.         InsertAndDraw(self);
  287.     end;
  288.  
  289.     { create the special Apple menu item }
  290.     procedure SimpleMenu.createAppleMenu (aboutTitle: Str255);
  291.         var
  292.             appleTitle: Str255;
  293.     begin
  294.         appleTitle := '@';
  295.         appleTitle[1] := CHR(AppleMark);
  296.         self.createNewMenu(appleTitle);
  297.         self.addItem(aboutTitle);
  298.         self.addSeparator;
  299.         AddResMenu(theMenuPtr, 'DRVR');
  300.     end;
  301.  
  302.     { add an item to a menu }
  303.     procedure SimpleMenu.addItem (title: Str255);
  304.     begin
  305.         AppendMenu(theMenuPtr, title);
  306.     end;
  307.  
  308.     { add a separator bar to a menu }
  309.     procedure SimpleMenu.addSeparator;
  310.     begin
  311.         self.addItem('(-----------------');
  312.     end;
  313.  
  314.     procedure SimpleMenu.selectItem (itemNumber: integer);
  315.         var
  316.             accName: Str255;
  317.             accNumber: Integer;
  318.     begin
  319.     { this is just to handle the Apple menu }
  320.     { should be overridden in all other subclasses }
  321.         if itemNumber > 1 then
  322.             begin
  323.                 GetItem(self.theMenuPtr, itemNumber, accName);
  324.                 accNumber := OpenDeskAcc(accName);
  325.             end;
  326.     end;
  327. end.
  328.